diff --git a/Cargo.lock b/Cargo.lock index 22baf22eabb371a4888ea82fb8ee2cd59c96b036..12be06045ed3b85f1254f2b62848cfe73b9db560 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2121,6 +2121,8 @@ version = "0.1.0" dependencies = [ "jsrust_shared", "mozglue-static", + "wasmparser 0.48.2", + "wat", ] [[package]] @@ -2133,7 +2135,6 @@ dependencies = [ "mozglue-static", "mozilla-central-workspace-hack", "smoosh", - "wasm-rust", ] [[package]] @@ -4828,14 +4829,6 @@ dependencies = [ "urlencoding", ] -[[package]] -name = "wasm-rust" -version = "0.1.0" -dependencies = [ - "wasmparser 0.48.2", - "wat", -] - [[package]] name = "wasmparser" version = "0.48.2" diff --git a/accessible/base/nsCoreUtils.cpp b/accessible/base/nsCoreUtils.cpp index 0824a31a645c02f8880fb1a906c3d7ac5a100e69..bf109562c53714da87eda32e370024207d28a830 100644 --- a/accessible/base/nsCoreUtils.cpp +++ b/accessible/base/nsCoreUtils.cpp @@ -435,12 +435,12 @@ XULTreeElement* nsCoreUtils::GetTree(nsIContent* aContent) { } already_AddRefed<nsTreeColumn> nsCoreUtils::GetFirstSensibleColumn( - XULTreeElement* aTree) { + XULTreeElement* aTree, FlushType aFlushType) { if (!aTree) { return nullptr; } - RefPtr<nsTreeColumns> cols = aTree->GetColumns(); + RefPtr<nsTreeColumns> cols = aTree->GetColumns(aFlushType); if (!cols) { return nullptr; } diff --git a/accessible/base/nsCoreUtils.h b/accessible/base/nsCoreUtils.h index b0afa2c4c7d32139247badcb59d359c9c0ac68ff..48f8f4aef3afe5a9c5ae40fac72ac83ef5b8d3ac 100644 --- a/accessible/base/nsCoreUtils.h +++ b/accessible/base/nsCoreUtils.h @@ -11,6 +11,7 @@ #include "nsIAccessibleEvent.h" #include "nsIContent.h" #include "mozilla/dom/Document.h" // for GetPresShell() +#include "mozilla/FlushType.h" #include "nsPoint.h" #include "nsTArray.h" @@ -253,7 +254,8 @@ class nsCoreUtils { * Return first sensible column for the given tree box object. */ static already_AddRefed<nsTreeColumn> GetFirstSensibleColumn( - mozilla::dom::XULTreeElement* aTree); + mozilla::dom::XULTreeElement* aTree, + mozilla::FlushType = mozilla::FlushType::Frames); /** * Return sensible columns count for the given tree box object. diff --git a/accessible/mac/mozAccessible.mm b/accessible/mac/mozAccessible.mm index 8ff219496b14acab66e81495052bdb28aef219f2..b3f5a66c6fa696a59139a2f3214f7dbd0c832d80 100644 --- a/accessible/mac/mozAccessible.mm +++ b/accessible/mac/mozAccessible.mm @@ -649,7 +649,8 @@ static const uint64_t kCacheInitialized = ((uint64_t)0x1) << 63; GetNativeFromGeckoAccessible(proxy->OuterDocOfRemoteBrowser()->RootAccessible())); } - LayoutDeviceIntPoint p = LayoutDeviceIntPoint(geckoRect.X(), geckoRect.Y()); + LayoutDeviceIntPoint p = LayoutDeviceIntPoint(geckoRect.X() + (geckoRect.Width() / 2), + geckoRect.Y() + (geckoRect.Height() / 2)); nsIWidget* widget = [objOrView widget]; // XXX: NSRightMouseDown is depreciated in 10.12, should be // changed to NSEventTypeRightMouseDown after refactoring. diff --git a/accessible/xul/XULTreeAccessible.cpp b/accessible/xul/XULTreeAccessible.cpp index 2d2efdd71dba3f47d78cc0fbd8f95e92a80cd594..da748f68cb46c1a4f7de30554934fa7eb5c93ef7 100644 --- a/accessible/xul/XULTreeAccessible.cpp +++ b/accessible/xul/XULTreeAccessible.cpp @@ -904,7 +904,7 @@ XULTreeItemAccessible::XULTreeItemAccessible( : XULTreeItemAccessibleBase(aContent, aDoc, aParent, aTree, aTreeView, aRow) { mStateFlags |= eNoKidsFromDOM; - mColumn = nsCoreUtils::GetFirstSensibleColumn(mTree); + mColumn = nsCoreUtils::GetFirstSensibleColumn(mTree, FlushType::None); GetCellName(mColumn, mCachedName); } diff --git a/browser/base/content/tabbrowser-tabs.js b/browser/base/content/tabbrowser-tabs.js index 755624e6147f7a17c169afb7dec77c218cc36912..77526839f22ee41fa0147f30c9bdd91b4dd694db 100644 --- a/browser/base/content/tabbrowser-tabs.js +++ b/browser/base/content/tabbrowser-tabs.js @@ -67,6 +67,11 @@ var tab = this.allTabs[0]; tab.label = this.emptyTabTitle; + this.newTabButton.setAttribute( + "aria-label", + GetDynamicShortcutTooltipText("tabs-newtab-button") + ); + window.addEventListener("resize", this); this.boundObserve = (...args) => this.observe(...args); diff --git a/browser/components/aboutlogins/AboutLoginsChild.jsm b/browser/components/aboutlogins/AboutLoginsChild.jsm index 39e9a9bd166f7bd89a24de4699dd9fcfa53636f7..a4cd976dd5a29c47f9426e682b56cf3f3bed4299 100644 --- a/browser/components/aboutlogins/AboutLoginsChild.jsm +++ b/browser/components/aboutlogins/AboutLoginsChild.jsm @@ -137,7 +137,7 @@ class AboutLoginsChild extends JSWindowActorChild { break; } case "AboutLoginsRecordTelemetryEvent": { - let { method, object, extra = {} } = event.detail; + let { method, object, extra = {}, value = null } = event.detail; if (method == "open_management") { let { docShell } = this.browsingContext; @@ -163,7 +163,7 @@ class AboutLoginsChild extends JSWindowActorChild { TELEMETRY_EVENT_CATEGORY, method, object, - null, + value, extra ); } catch (ex) { @@ -198,7 +198,26 @@ class AboutLoginsChild extends JSWindowActorChild { switch (message.name) { case "AboutLogins:MasterPasswordResponse": if (masterPasswordPromise) { - masterPasswordPromise.resolve(message.data); + masterPasswordPromise.resolve(message.data.result); + try { + let { + method, + object, + extra = {}, + value = null, + } = message.data.telemetryEvent; + Services.telemetry.recordEvent( + TELEMETRY_EVENT_CATEGORY, + method, + object, + value, + extra + ); + } catch (ex) { + Cu.reportError( + "AboutLoginsChild: error recording telemetry event: " + ex.message + ); + } } break; case "AboutLogins:Setup": diff --git a/browser/components/aboutlogins/AboutLoginsParent.jsm b/browser/components/aboutlogins/AboutLoginsParent.jsm index f3c0ab344c5e47959bcf746e6aaff78ae866f3f0..21210ad79c05b7036f76e62821e53199ccc24692 100644 --- a/browser/components/aboutlogins/AboutLoginsParent.jsm +++ b/browser/components/aboutlogins/AboutLoginsParent.jsm @@ -323,51 +323,74 @@ class AboutLoginsParent extends JSWindowActorParent { ); } - if (Date.now() < AboutLogins._authExpirationTime) { - this.sendAsyncMessage("AboutLogins:MasterPasswordResponse", true); - return; - } + let loggedIn = false; + let telemetryEvent; - // This does no harm if master password isn't set. - let tokendb = Cc["@mozilla.org/security/pk11tokendb;1"].createInstance( - Ci.nsIPK11TokenDB - ); - let token = tokendb.getInternalKeyToken(); + try { + // This does no harm if master password isn't set. + let tokendb = Cc[ + "@mozilla.org/security/pk11tokendb;1" + ].createInstance(Ci.nsIPK11TokenDB); + let token = tokendb.getInternalKeyToken(); + + if (Date.now() < AboutLogins._authExpirationTime) { + loggedIn = true; + telemetryEvent = { + object: token.hasPassword ? "master_password" : "os_auth", + method: "reauthenticate", + value: "success_no_prompt", + }; + return; + } - let loggedIn = false; - // Use the OS auth dialog if there is no master password - if (!token.hasPassword && !OS_AUTH_ENABLED) { - loggedIn = true; - } else if (!token.hasPassword && OS_AUTH_ENABLED) { - if (AppConstants.platform == "macosx") { - // OS Auth dialogs on macOS must only provide the "reason" that the prompt - // is being displayed. - messageId += "-macosx"; + // Use the OS auth dialog if there is no master password + if (!token.hasPassword && !OS_AUTH_ENABLED) { + loggedIn = true; + telemetryEvent = { + object: "os_auth", + method: "reauthenticate", + value: "success_disabled", + }; + return; } - let [messageText, captionText] = await AboutLoginsL10n.formatMessages( - [ + if (!token.hasPassword && OS_AUTH_ENABLED) { + if (AppConstants.platform == "macosx") { + // OS Auth dialogs on macOS must only provide the "reason" that the prompt + // is being displayed. + messageId += "-macosx"; + } + let [ + messageText, + captionText, + ] = await AboutLoginsL10n.formatMessages([ { id: messageId, }, { id: "about-logins-os-auth-dialog-caption", }, - ] - ); - loggedIn = await OSKeyStore.ensureLoggedIn( - messageText.value, - captionText.value, - ownerGlobal, - false - ); - } else { + ]); + let result = await OSKeyStore.ensureLoggedIn( + messageText.value, + captionText.value, + ownerGlobal, + false + ); + loggedIn = result.authenticated; + telemetryEvent = { + object: "os_auth", + method: "reauthenticate", + value: result.auth_details, + }; + return; + } // Force a log-out of the Master Password. token.checkPassword(""); // If a master password prompt is already open, just exit early and return false. // The user can re-trigger it after responding to the already open dialog. if (Services.logins.uiBusy) { - this.sendAsyncMessage("AboutLogins:MasterPasswordResponse", false); + loggedIn = false; return; } @@ -381,13 +404,21 @@ class AboutLoginsParent extends JSWindowActorParent { // User is also logged out of Software Security Device. } loggedIn = token.isLoggedIn(); + telemetryEvent = { + object: "master_password", + method: "reauthenticate", + value: loggedIn ? "success" : "fail", + }; + } finally { + if (loggedIn) { + const AUTH_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes + AboutLogins._authExpirationTime = Date.now() + AUTH_TIMEOUT_MS; + } + this.sendAsyncMessage("AboutLogins:MasterPasswordResponse", { + result: loggedIn, + telemetryEvent, + }); } - - if (loggedIn) { - const AUTH_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes - AboutLogins._authExpirationTime = Date.now() + AUTH_TIMEOUT_MS; - } - this.sendAsyncMessage("AboutLogins:MasterPasswordResponse", loggedIn); break; } case "AboutLogins:Subscribe": { diff --git a/browser/components/aboutlogins/content/components/login-item.css b/browser/components/aboutlogins/content/components/login-item.css index 054e526fd3535e140e43fe8b330700145b8b2798..73202aadb3d7df7633d4de350389ccdf7d19e9f9 100644 --- a/browser/components/aboutlogins/content/components/login-item.css +++ b/browser/components/aboutlogins/content/components/login-item.css @@ -222,7 +222,6 @@ input[type="url"][readOnly]:hover:active { .meta-info { font-size: smaller; - font-weight: 300; color: var(--in-content-deemphasized-text); margin-top: 0; margin-bottom: 8px; @@ -338,6 +337,7 @@ input[name="password"] { .alert-link:visited, .alert-link { font-weight: 600; + overflow-wrap: anywhere; } .breach-alert > .alert-link:visited, diff --git a/browser/components/aboutlogins/content/components/login-item.js b/browser/components/aboutlogins/content/components/login-item.js index 8a16be4deb67a971979488f2ea088f2c66794321..e083430c23202aa6777eedb70b2d974339e5ee6e 100644 --- a/browser/components/aboutlogins/content/components/login-item.js +++ b/browser/components/aboutlogins/content/components/login-item.js @@ -96,7 +96,7 @@ export default class LoginItem extends HTMLElement { this.render(); - this._breachAlertLink.addEventListener("click", this); + this._breachAlertLearnMoreLink.addEventListener("click", this); this._cancelButton.addEventListener("click", this); this._copyPasswordButton.addEventListener("click", this); this._copyUsernameButton.addEventListener("click", this); @@ -110,6 +110,7 @@ export default class LoginItem extends HTMLElement { this._originInput.addEventListener("auxclick", this); this._originDisplayInput.addEventListener("click", this); this._revealCheckbox.addEventListener("click", this); + this._vulnerableAlertLearnMoreLink.addEventListener("click", this); window.addEventListener("AboutLoginsInitialLoginSelected", this); window.addEventListener("AboutLoginsLoadInitialFavicon", this); window.addEventListener("AboutLoginsLoginSelected", this); @@ -492,14 +493,17 @@ export default class LoginItem extends HTMLElement { if (classList.contains("origin-input")) { this._handleOriginClick(); } - if (classList.contains("alert-link")) { + if (classList.contains("alert-learn-more-link")) { if (event.currentTarget.closest(".breach-alert")) { this._recordTelemetryEvent({ object: "existing_login", method: "learn_more_breach", }); } else if (event.currentTarget.closest(".vulnerable-alert")) { - // TODO: Add telemetry event + this._recordTelemetryEvent({ + object: "existing_login", + method: "learn_more_vuln", + }); } } break; diff --git a/browser/components/aboutlogins/content/components/login-list.js b/browser/components/aboutlogins/content/components/login-list.js index 6f816814e0fa0b44b32df7e214b5319e85708f4b..f63cec354b3e0239c4599253a5439d79504bdbd0 100644 --- a/browser/components/aboutlogins/content/components/login-list.js +++ b/browser/components/aboutlogins/content/components/login-list.js @@ -147,6 +147,22 @@ export default class LoginList extends HTMLElement { this._list.setAttribute("aria-activedescendant", visibleListItem.id); } } + + if ( + this._sortSelect.namedItem("alerts").hidden && + ((this._breachesByLoginGUID && + this._loginGuidsSortedOrder.some(loginGuid => + this._breachesByLoginGUID.has(loginGuid) + )) || + (this._vulnerableLoginsByLoginGUID && + this._loginGuidsSortedOrder.some(loginGuid => + this._vulnerableLoginsByLoginGUID.has(loginGuid) + ))) + ) { + // Make available the "alerts" option but don't change the + // selected sort so the user's current task isn't interrupted. + this._sortSelect.namedItem("alerts").hidden = false; + } } handleEvent(event) { diff --git a/browser/components/aboutlogins/tests/browser/browser_aaa_eventTelemetry_run_first.js b/browser/components/aboutlogins/tests/browser/browser_aaa_eventTelemetry_run_first.js index 0d90adb4f2eb932fa9e87ea883a83cbd7b288f2a..ae13ab2e7ae0cdad63d35426370466c4aabb97a2 100644 --- a/browser/components/aboutlogins/tests/browser/browser_aaa_eventTelemetry_run_first.js +++ b/browser/components/aboutlogins/tests/browser/browser_aaa_eventTelemetry_run_first.js @@ -63,6 +63,29 @@ add_task(async function test_telemetry_events() { }); await LoginTestUtils.telemetry.waitForEventCount(2); + // Need to change the learn-more to a local address for testing. + const FAKE_LEARN_MORE_URL = "https://learn-more.example.com/"; + let promiseNewTab = BrowserTestUtils.waitForNewTab( + gBrowser, + FAKE_LEARN_MORE_URL + ); + await SpecialPowers.spawn( + gBrowser.selectedBrowser, + [FAKE_LEARN_MORE_URL], + async function(fakeLearnMoreUrl) { + let loginItem = content.document.querySelector("login-item"); + let learnMoreLink = loginItem.shadowRoot.querySelector( + ".alert-learn-more-link" + ); + learnMoreLink.href = fakeLearnMoreUrl; + learnMoreLink.click(); + } + ); + let newTab = await promiseNewTab; + ok(true, "New tab opened to " + FAKE_LEARN_MORE_URL); + BrowserTestUtils.removeTab(newTab); + await LoginTestUtils.telemetry.waitForEventCount(3); + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function() { let loginItem = content.document.querySelector("login-item"); let copyButton = loginItem.shadowRoot.querySelector( @@ -70,7 +93,7 @@ add_task(async function test_telemetry_events() { ); copyButton.click(); }); - await LoginTestUtils.telemetry.waitForEventCount(3); + await LoginTestUtils.telemetry.waitForEventCount(4); if (OSKeyStoreTestUtils.canTestOSKeyStoreLogin()) { let reauthObserved = OSKeyStoreTestUtils.waitForOSKeyStoreLogin(true); @@ -82,13 +105,16 @@ add_task(async function test_telemetry_events() { copyButton.click(); }); await reauthObserved; - await LoginTestUtils.telemetry.waitForEventCount(4); + // When reauth is observed an extra telemetry event will be recorded + // for the reauth, hence the event count increasing by 2 here, and later + // in the test as well. + await LoginTestUtils.telemetry.waitForEventCount(6); } let nextTelemetryEventCount = OSKeyStoreTestUtils.canTestOSKeyStoreLogin() - ? 5 - : 4; + ? 7 + : 5; - let promiseNewTab = BrowserTestUtils.waitForNewTab( + promiseNewTab = BrowserTestUtils.waitForNewTab( gBrowser, TEST_LOGIN3.origin + "/" ); @@ -97,7 +123,7 @@ add_task(async function test_telemetry_events() { let originInput = loginItem.shadowRoot.querySelector(".origin-input"); originInput.click(); }); - let newTab = await promiseNewTab; + newTab = await promiseNewTab; ok(true, "New tab opened to " + TEST_LOGIN3.origin); BrowserTestUtils.removeTab(newTab); await LoginTestUtils.telemetry.waitForEventCount(nextTelemetryEventCount++); @@ -107,6 +133,7 @@ add_task(async function test_telemetry_events() { let reauthObserved = forceAuthTimeoutAndWaitForOSKeyStoreLogin({ loginResult: true, }); + nextTelemetryEventCount++; // An extra event is observed for the reauth event. await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function() { let loginItem = content.document.querySelector("login-item"); let revealCheckbox = loginItem.shadowRoot.querySelector( @@ -127,15 +154,14 @@ add_task(async function test_telemetry_events() { }); await LoginTestUtils.telemetry.waitForEventCount(nextTelemetryEventCount++); - reauthObserved = forceAuthTimeoutAndWaitForOSKeyStoreLogin({ - loginResult: true, - }); + // Don't force the auth timeout here to check that `auth_skipped: true` is set as + // in `extra`. + nextTelemetryEventCount++; // An extra event is observed for the reauth event. await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function() { let loginItem = content.document.querySelector("login-item"); let editButton = loginItem.shadowRoot.querySelector(".edit-button"); editButton.click(); }); - await reauthObserved; await LoginTestUtils.telemetry.waitForEventCount(nextTelemetryEventCount++); await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function() { @@ -237,11 +263,22 @@ add_task(async function test_telemetry_events() { let expectedEvents = [ [true, "pwmgr", "open_management", "direct"], [true, "pwmgr", "select", "existing_login", null, { breached: "true" }], + [ + true, + "pwmgr", + "learn_more_breach", + "existing_login", + null, + { breached: "true" }, + ], [true, "pwmgr", "copy", "username", null, { breached: "true" }], + [testOSAuth, "pwmgr", "reauthenticate", "os_auth", "success"], [testOSAuth, "pwmgr", "copy", "password", null, { breached: "true" }], [true, "pwmgr", "open_site", "existing_login", null, { breached: "true" }], + [testOSAuth, "pwmgr", "reauthenticate", "os_auth", "success"], [testOSAuth, "pwmgr", "show", "password", null, { breached: "true" }], [testOSAuth, "pwmgr", "hide", "password", null, { breached: "true" }], + [testOSAuth, "pwmgr", "reauthenticate", "os_auth", "success_no_prompt"], [testOSAuth, "pwmgr", "edit", "existing_login", null, { breached: "true" }], [testOSAuth, "pwmgr", "save", "existing_login", null, { breached: "true" }], [true, "pwmgr", "delete", "existing_login", null, { breached: "true" }], diff --git a/browser/components/aboutlogins/tests/browser/browser_vulnerableLoginAddedInSecondaryWindow.js b/browser/components/aboutlogins/tests/browser/browser_vulnerableLoginAddedInSecondaryWindow.js index c312e44a52b12f8d9d3e11ee5ee601a85da5b2e8..27877f87c47bfb80590398c7ec5eb8344946e32d 100644 --- a/browser/components/aboutlogins/tests/browser/browser_vulnerableLoginAddedInSecondaryWindow.js +++ b/browser/components/aboutlogins/tests/browser/browser_vulnerableLoginAddedInSecondaryWindow.js @@ -21,6 +21,15 @@ add_task(async function setup() { TEST_LOGIN2 = await addLogin(TEST_LOGIN2); TEST_LOGIN3 = await addLogin(TEST_LOGIN3); + let breaches = await LoginBreaches.getPotentialBreachesByLoginGUID([ + TEST_LOGIN3, + ]); + ok(breaches.size, "TEST_LOGIN3 should be marked as breached"); + + // Remove the breached login so the 'alerts' option + // is hidden when opening about:logins. + Services.logins.removeLogin(TEST_LOGIN3); + await BrowserTestUtils.openNewForegroundTab({ gBrowser, url: "about:logins", @@ -41,6 +50,14 @@ add_task(async function setup() { add_task(async function test_new_login_marked_vulnerable_in_both_windows() { const ORIGIN_FOR_NEW_VULNERABLE_LOGIN = "https://vulnerable"; + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async () => { + let loginList = Cu.waiveXrays(content.document.querySelector("login-list")); + ok( + loginList.shadowRoot.querySelector("#login-sort").namedItem("alerts") + .hidden, + "The 'alerts' option should be hidden before adding a vulnerable login to the list" + ); + }); await SpecialPowers.spawn( tabInSecondWindow.linkedBrowser, @@ -51,8 +68,14 @@ add_task(async function test_new_login_marked_vulnerable_in_both_windows() { await ContentTaskUtils.waitForCondition( () => loginList.shadowRoot.querySelectorAll(".login-list-item[data-guid]") - .length == 3, - "waiting for all three initials logins to get added to login-list" + .length == 2, + "waiting for all two initials logins to get added to login-list" + ); + + let loginSort = loginList.shadowRoot.querySelector("#login-sort"); + ok( + loginSort.namedItem("alerts").hidden, + "The 'alerts' option should be hidden when there are no breached or vulnerable logins in the list" ); let createButton = loginList.shadowRoot.querySelector( @@ -83,7 +106,7 @@ add_task(async function test_new_login_marked_vulnerable_in_both_windows() { await ContentTaskUtils.waitForCondition( () => loginList.shadowRoot.querySelectorAll(".login-list-item[data-guid]") - .length == 4, + .length == 3, "waiting for new login to get added to login-list" ); @@ -101,25 +124,43 @@ add_task(async function test_new_login_marked_vulnerable_in_both_windows() { "vulnerable alert on login-item should be visible" ); - is( - Cu.waiveXrays(loginList)._sortSelect.value, - "alerts", - "The login list should be sorted by Alerts" - ); - let loginListItems = loginList.shadowRoot.querySelectorAll( - ".login-list-item[data-guid]" + ok( + !loginSort.namedItem("alerts").hidden, + "The 'alerts' option should be visible after adding a vulnerable login to the list" ); - for (let i = 1; i < loginListItems.length; i++) { - if (loginListItems[i].matches(".vulnerable, .breached")) { - ok( - loginListItems[i - 1].matches(".vulnerable, .breached"), - `The previous login-list-item must be vulnerable or breached if the current one is (second window, i=${i})` - ); - } - } } ); + tabInSecondWindow.linkedBrowser.reload(); + await BrowserTestUtils.browserLoaded( + tabInSecondWindow.linkedBrowser, + false, + "about:logins" + ); + + await SpecialPowers.spawn(tabInSecondWindow.linkedBrowser, [], async () => { + let loginList = content.document.querySelector("login-list"); + let loginSort = loginList.shadowRoot.querySelector("#login-sort"); + + await ContentTaskUtils.waitForCondition( + () => loginSort.value == "alerts", + "waiting for sort to get updated to 'alerts'" + ); + + is(loginSort.value, "alerts", "The login list should be sorted by Alerts"); + let loginListItems = loginList.shadowRoot.querySelectorAll( + ".login-list-item[data-guid]" + ); + for (let i = 1; i < loginListItems.length; i++) { + if (loginListItems[i].matches(".vulnerable, .breached")) { + ok( + loginListItems[i - 1].matches(".vulnerable, .breached"), + `The previous login-list-item must be vulnerable or breached if the current one is (second window, i=${i})` + ); + } + } + }); + await SpecialPowers.spawn( gBrowser.selectedBrowser, [ORIGIN_FOR_NEW_VULNERABLE_LOGIN], @@ -141,17 +182,36 @@ add_task(async function test_new_login_marked_vulnerable_in_both_windows() { "vulnerable login list item should be marked as such" ); - let loginListItems = loginList.shadowRoot.querySelectorAll( - ".login-list-item[data-guid]" + ok( + !loginList.shadowRoot.querySelector("#login-sort").namedItem("alerts") + .hidden, + "The 'alerts' option should be visible after adding a vulnerable login to the list" ); - for (let i = 1; i < loginListItems.length; i++) { - if (loginListItems[i].matches(".vulnerable, .breached")) { - ok( - loginListItems[i - 1].matches(".vulnerable, .breached"), - `The previous login-list-item must be vulnerable or breached if the current one is (first window, i=${i})` - ); - } - } } ); + gBrowser.selectedBrowser.reload(); + await BrowserTestUtils.browserLoaded( + gBrowser.selectedBrowser, + false, + "about:logins" + ); + + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async () => { + let loginList = Cu.waiveXrays(content.document.querySelector("login-list")); + await ContentTaskUtils.waitForCondition( + () => loginList.shadowRoot.querySelector("#login-sort").value == "alerts", + "waiting for sort to get updated to 'alerts'" + ); + let loginListItems = loginList.shadowRoot.querySelectorAll( + ".login-list-item[data-guid]" + ); + for (let i = 1; i < loginListItems.length; i++) { + if (loginListItems[i].matches(".vulnerable, .breached")) { + ok( + loginListItems[i - 1].matches(".vulnerable, .breached"), + `The previous login-list-item must be vulnerable or breached if the current one is (first window, i=${i})` + ); + } + } + }); }); diff --git a/browser/components/newtab/aboutwelcome/AboutWelcomeChild.jsm b/browser/components/newtab/aboutwelcome/AboutWelcomeChild.jsm index a69573b8869cb4fe6a5a54f68f2ecbd5d0c4b99c..452479ca8ea2f9a74eda30beab1af2c46291244b 100644 --- a/browser/components/newtab/aboutwelcome/AboutWelcomeChild.jsm +++ b/browser/components/newtab/aboutwelcome/AboutWelcomeChild.jsm @@ -25,6 +25,30 @@ XPCOMUtils.defineLazyGetter(this, "log", () => { class AboutWelcomeChild extends JSWindowActorChild { actorCreated() { this.exportFunctions(); + this.initWebProgressListener(); + } + + initWebProgressListener() { + const webProgress = this.manager.browsingContext.top.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebProgress); + + const listener = { + QueryInterface: ChromeUtils.generateQI([ + Ci.nsIWebProgressListener, + Ci.nsISupportsWeakReference, + ]), + }; + + listener.onLocationChange = (aWebProgress, aRequest, aLocation, aFlags) => { + log.debug(`onLocationChange handled: ${aWebProgress.DOMWindow}`); + this.AWSendToParent("LOCATION_CHANGED"); + }; + + webProgress.addProgressListener( + listener, + Ci.nsIWebProgress.NOTIFY_LOCATION + ); } /** diff --git a/browser/components/newtab/aboutwelcome/AboutWelcomeParent.jsm b/browser/components/newtab/aboutwelcome/AboutWelcomeParent.jsm index 3e10cd1cef217fbd2ab667a09648bd99bb9b9436..403222f812f52dae514a5169ac3595d49fe15ad7 100644 --- a/browser/components/newtab/aboutwelcome/AboutWelcomeParent.jsm +++ b/browser/components/newtab/aboutwelcome/AboutWelcomeParent.jsm @@ -42,7 +42,13 @@ const AWTerminate = { class AboutWelcomeObserver { constructor() { + Services.obs.addObserver(this, "quit-application"); + this.win = Services.focus.activeWindow; + if (!this.win) { + return; + } + this.terminateReason = AWTerminate.UNKNOWN; this.onWindowClose = () => { @@ -55,8 +61,6 @@ class AboutWelcomeObserver { this.win.addEventListener("TabClose", this.onTabClose, { once: true }); this.win.addEventListener("unload", this.onWindowClose, { once: true }); - this.win.gBrowser.addTabsProgressListener(this); - Services.obs.addObserver(this, "quit-application"); } observe(aSubject, aTopic, aData) { @@ -67,10 +71,6 @@ class AboutWelcomeObserver { } } - onLocationChange() { - this.terminateReason = AWTerminate.ADDRESS_BAR_NAVIGATED; - } - // Added for testing get AWTerminate() { return AWTerminate; @@ -78,10 +78,13 @@ class AboutWelcomeObserver { stop() { log.debug(`Terminate reason is ${this.terminateReason}`); + Services.obs.removeObserver(this, "quit-application"); + if (!this.win) { + return; + } this.win.removeEventListener("TabClose", this.onTabClose); this.win.removeEventListener("unload", this.onWindowClose); - this.win.gBrowser.removeTabsProgressListener(this); - Services.obs.removeObserver(this, "quit-application"); + this.win = null; } } @@ -141,6 +144,10 @@ class AboutWelcomeParent extends JSWindowActorParent { case "AWPage:TELEMETRY_EVENT": Telemetry.sendTelemetry(data); break; + case "AWPage:LOCATION_CHANGED": + this.AboutWelcomeObserver.terminateReason = + AWTerminate.ADDRESS_BAR_NAVIGATED; + break; default: log.debug(`Unexpected event ${type} was not handled.`); } diff --git a/browser/components/newtab/aboutwelcome/content/aboutwelcome.css b/browser/components/newtab/aboutwelcome/content/aboutwelcome.css index 7f903d6d0d4699794a07d6ee9b17f8e9b0a8d0c1..dd8176e33ac01bc7547f4730779313a78795c8ff 100644 --- a/browser/components/newtab/aboutwelcome/content/aboutwelcome.css +++ b/browser/components/newtab/aboutwelcome/content/aboutwelcome.css @@ -173,10 +173,10 @@ body { border-radius: 4px; box-shadow: var(--newtab-card-shadow); font-size: 13px; - padding: 20px 40px 60px; } + padding: 20px 20px 60px; } @media (max-width: 866px) { .welcomeCard { - padding: 20px 40px; } } + padding: 20px; } } @media (min-width: 1122px) { .welcomeCard { font-size: 15px; } } @@ -223,7 +223,7 @@ body { .onboardingMessageImage { height: 112px; - width: 140px; + width: 180px; background-size: auto 140px; background-position: center center; background-repeat: no-repeat; @@ -233,10 +233,6 @@ body { height: 75px; min-width: 80px; background-size: 140px; } } - @media (min-width: 1122px) { - .onboardingMessageImage { - width: 140px; - background-size: auto 140px; } } .start-button { border: 0; diff --git a/browser/components/newtab/content-src/aboutwelcome/aboutwelcome.scss b/browser/components/newtab/content-src/aboutwelcome/aboutwelcome.scss index 34ca78c144c2d241a77d2c0851773388c1ca7f67..56579062b0ab58e9bb1c9f771e290f558e13a787 100644 --- a/browser/components/newtab/content-src/aboutwelcome/aboutwelcome.scss +++ b/browser/components/newtab/content-src/aboutwelcome/aboutwelcome.scss @@ -8,7 +8,6 @@ $break-point-medium: 610px; $break-point-large: 866px; $break-point-widest: 1122px; -$onboarding-card-image-width: 140px; html { height: 100%; @@ -131,10 +130,10 @@ body { border-radius: 4px; box-shadow: var(--newtab-card-shadow); font-size: 13px; - padding: 20px 40px 60px; + padding: 20px 20px 60px; @media (max-width: $break-point-large) { - padding: 20px 40px; + padding: 20px; } @media (min-width: $break-point-widest) { @@ -196,8 +195,8 @@ body { .onboardingMessageImage { height: 112px; - width: $onboarding-card-image-width; - background-size: auto $onboarding-card-image-width; + width: 180px; + background-size: auto 140px; background-position: center center; background-repeat: no-repeat; display: inline-block; @@ -205,12 +204,7 @@ body { @media (max-width: $break-point-large) { height: 75px; min-width: 80px; - background-size: $onboarding-card-image-width; - } - - @media (min-width: $break-point-widest) { - width: $onboarding-card-image-width; - background-size: auto $onboarding-card-image-width; + background-size: 140px; } } diff --git a/browser/components/newtab/content-src/asrouter/templates/OnboardingMessage/_OnboardingMessage.scss b/browser/components/newtab/content-src/asrouter/templates/OnboardingMessage/_OnboardingMessage.scss index 1fe0ef7472fe8470a9c49b3a1524a2e32fb5efa2..fa88c8ebdb7bb1cc2072fe59031213ad1fb8decf 100644 --- a/browser/components/newtab/content-src/asrouter/templates/OnboardingMessage/_OnboardingMessage.scss +++ b/browser/components/newtab/content-src/asrouter/templates/OnboardingMessage/_OnboardingMessage.scss @@ -117,7 +117,7 @@ // Also used for Trailhead .onboardingMessageImage { height: 112px; - width: 120px; + width: 180px; background-size: auto 140px; background-position: center center; background-repeat: no-repeat; @@ -129,9 +129,4 @@ min-width: 80px; background-size: 140px; } - - @media (min-width: $break-point-widest) { - width: 230px; - background-size: auto 140px; - } } diff --git a/browser/components/newtab/content-src/asrouter/templates/Trailhead/_Trailhead.scss b/browser/components/newtab/content-src/asrouter/templates/Trailhead/_Trailhead.scss index fc4bdd4ccda7d0742eb0e947174d252733097ffe..56d0e8d26ed18eab5aa9a1caa23d13b4300454ed 100644 --- a/browser/components/newtab/content-src/asrouter/templates/Trailhead/_Trailhead.scss +++ b/browser/components/newtab/content-src/asrouter/templates/Trailhead/_Trailhead.scss @@ -266,10 +266,10 @@ box-shadow: var(--newtab-card-shadow); font-size: 13px; - padding: 20px 40px 60px; + padding: 20px 20px 60px; @media (max-width: 865px) { - padding: 20px 40px; + padding: 20px; } @media (min-width: $break-point-widest) { diff --git a/browser/components/newtab/content-src/lib/selectLayoutRender.js b/browser/components/newtab/content-src/lib/selectLayoutRender.js index c28e7be383fde341ce06834af989e09fd2a9acbb..0d348358b2a99e3e8cd0f8713870695f2e9f403a 100644 --- a/browser/components/newtab/content-src/lib/selectLayoutRender.js +++ b/browser/components/newtab/content-src/lib/selectLayoutRender.js @@ -57,6 +57,7 @@ export const selectLayoutRender = ({ "SectionTitle", "Navigation", "CardGrid", + "CollectionCardGrid", "Hero", "HorizontalRule", "List", diff --git a/browser/components/newtab/css/activity-stream-linux.css b/browser/components/newtab/css/activity-stream-linux.css index 26787e5131ffdd9a190c9b5b70672f108814e9ac..e4384f5b3221d81417252db1d155724c8bb826a0 100644 --- a/browser/components/newtab/css/activity-stream-linux.css +++ b/browser/components/newtab/css/activity-stream-linux.css @@ -3996,7 +3996,7 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme { .onboardingMessageImage { height: 112px; - width: 120px; + width: 180px; background-size: auto 140px; background-position: center center; background-repeat: no-repeat; @@ -4006,10 +4006,6 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme { height: 75px; min-width: 80px; background-size: 140px; } } - @media (min-width: 1122px) { - .onboardingMessageImage { - width: 230px; - background-size: auto 140px; } } .EOYSnippetForm { margin: 10px 0 8px; @@ -4301,10 +4297,10 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme { border-radius: 4px; box-shadow: var(--newtab-card-shadow); font-size: 13px; - padding: 20px 40px 60px; } + padding: 20px 20px 60px; } @media (max-width: 865px) { .trailheadCard { - padding: 20px 40px; } } + padding: 20px; } } @media (min-width: 1122px) { .trailheadCard { font-size: 15px; } } diff --git a/browser/components/newtab/css/activity-stream-mac.css b/browser/components/newtab/css/activity-stream-mac.css index c9c2b9fec6fe504795a411282da6a884fa982d48..903c03697c0806643c6490d6df01565f2c6d2385 100644 --- a/browser/components/newtab/css/activity-stream-mac.css +++ b/browser/components/newtab/css/activity-stream-mac.css @@ -3999,7 +3999,7 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme { .onboardingMessageImage { height: 112px; - width: 120px; + width: 180px; background-size: auto 140px; background-position: center center; background-repeat: no-repeat; @@ -4009,10 +4009,6 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme { height: 75px; min-width: 80px; background-size: 140px; } } - @media (min-width: 1122px) { - .onboardingMessageImage { - width: 230px; - background-size: auto 140px; } } .EOYSnippetForm { margin: 10px 0 8px; @@ -4304,10 +4300,10 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme { border-radius: 4px; box-shadow: var(--newtab-card-shadow); font-size: 13px; - padding: 20px 40px 60px; } + padding: 20px 20px 60px; } @media (max-width: 865px) { .trailheadCard { - padding: 20px 40px; } } + padding: 20px; } } @media (min-width: 1122px) { .trailheadCard { font-size: 15px; } } diff --git a/browser/components/newtab/css/activity-stream-windows.css b/browser/components/newtab/css/activity-stream-windows.css index 4fd63f1a37aa192cb7eadcc8e11e47424a1f3717..2f5284e7f4b0dd24c2818d19edd023a8a0f2ac0f 100644 --- a/browser/components/newtab/css/activity-stream-windows.css +++ b/browser/components/newtab/css/activity-stream-windows.css @@ -3996,7 +3996,7 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme { .onboardingMessageImage { height: 112px; - width: 120px; + width: 180px; background-size: auto 140px; background-position: center center; background-repeat: no-repeat; @@ -4006,10 +4006,6 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme { height: 75px; min-width: 80px; background-size: 140px; } } - @media (min-width: 1122px) { - .onboardingMessageImage { - width: 230px; - background-size: auto 140px; } } .EOYSnippetForm { margin: 10px 0 8px; @@ -4301,10 +4297,10 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme { border-radius: 4px; box-shadow: var(--newtab-card-shadow); font-size: 13px; - padding: 20px 40px 60px; } + padding: 20px 20px 60px; } @media (max-width: 865px) { .trailheadCard { - padding: 20px 40px; } } + padding: 20px; } } @media (min-width: 1122px) { .trailheadCard { font-size: 15px; } } diff --git a/browser/components/newtab/data/content/activity-stream.bundle.js b/browser/components/newtab/data/content/activity-stream.bundle.js index 55019ae36cedf72a4a5755b4203bc4388171b00c..fdc6270ba16fa009253f54a240a23d7c3422b8af 100644 --- a/browser/components/newtab/data/content/activity-stream.bundle.js +++ b/browser/components/newtab/data/content/activity-stream.bundle.js @@ -10432,7 +10432,7 @@ const selectLayoutRender = ({ } const positions = {}; - const DS_COMPONENTS = ["Message", "TextPromo", "SectionTitle", "Navigation", "CardGrid", "Hero", "HorizontalRule", "List"]; + const DS_COMPONENTS = ["Message", "TextPromo", "SectionTitle", "Navigation", "CardGrid", "CollectionCardGrid", "Hero", "HorizontalRule", "List"]; const filterArray = []; if (!prefs["feeds.topsites"]) { diff --git a/browser/components/newtab/lib/ASRouterTriggerListeners.jsm b/browser/components/newtab/lib/ASRouterTriggerListeners.jsm index 81a8b97e45561269c4a0551c84b1e194c5528c5f..9a4256c6e9311ea2f31175619aa2979ec03ac97d 100644 --- a/browser/components/newtab/lib/ASRouterTriggerListeners.jsm +++ b/browser/components/newtab/lib/ASRouterTriggerListeners.jsm @@ -396,8 +396,8 @@ this.ASRouterTriggerListeners = new Map([ ], /** - * Add an observer notification to notify the trigger handler whenever the user saves a new login - * via the login capture doorhanger. + * Add an observer notification to notify the trigger handler whenever the user + * saves or updates a login via the login capture doorhanger. */ [ "newSavedLogin", @@ -412,6 +412,7 @@ this.ASRouterTriggerListeners = new Map([ init(triggerHandler) { if (!this._initialized) { Services.obs.addObserver(this, "LoginStats:NewSavedPassword"); + Services.obs.addObserver(this, "LoginStats:LoginUpdateSaved"); this._initialized = true; } this._triggerHandler = triggerHandler; @@ -420,6 +421,7 @@ this.ASRouterTriggerListeners = new Map([ uninit() { if (this._initialized) { Services.obs.removeObserver(this, "LoginStats:NewSavedPassword"); + Services.obs.removeObserver(this, "LoginStats:LoginUpdateSaved"); this._initialized = false; this._triggerHandler = null; @@ -433,7 +435,26 @@ this.ASRouterTriggerListeners = new Map([ // to enable Sync during the sign up process is a bad UX. return; } - this._triggerHandler(aSubject, { id: "newSavedLogin" }); + + switch (aTopic) { + case "LoginStats:NewSavedPassword": { + this._triggerHandler(aSubject, { + id: "newSavedLogin", + context: { type: "save" }, + }); + break; + } + case "LoginStats:LoginUpdateSaved": { + this._triggerHandler(aSubject, { + id: "newSavedLogin", + context: { type: "update" }, + }); + break; + } + default: { + throw new Error(`Unexpected observer notification: ${aTopic}`); + } + } }, }, ], diff --git a/browser/components/newtab/lib/CFRMessageProvider.jsm b/browser/components/newtab/lib/CFRMessageProvider.jsm index fbce85c2cfaa4b78d350b2d6da9bc81d34bef57e..9908bf15f3e755d1672d9ed0009d86daa709aac8 100644 --- a/browser/components/newtab/lib/CFRMessageProvider.jsm +++ b/browser/components/newtab/lib/CFRMessageProvider.jsm @@ -547,9 +547,9 @@ const CFR_MESSAGES = [ frequency: { lifetime: 3, }, - targeting: "usesFirefoxSync == false", + targeting: + "(!type || type == 'save') && isFxAEnabled == true && usesFirefoxSync == false", template: "cfr_doorhanger", - last_modified: 1565907636313, content: { layout: "icon_and_message", text: { @@ -616,6 +616,80 @@ const CFR_MESSAGES = [ id: "newSavedLogin", }, }, + { + id: "UPDATE_LOGIN", + frequency: { + lifetime: 3, + }, + targeting: + "type == 'update' && isFxAEnabled == true && usesFirefoxSync == false", + template: "cfr_doorhanger", + content: { + layout: "icon_and_message", + text: { + string_id: "cfr-doorhanger-sync-logins-body", + }, + icon: "chrome://browser/content/aboutlogins/icons/intro-illustration.svg", + icon_class: "cfr-doorhanger-large-icon", + buttons: { + secondary: [ + { + label: { + string_id: "cfr-doorhanger-extension-cancel-button", + }, + action: { + type: "CANCEL", + }, + }, + { + label: { + string_id: "cfr-doorhanger-extension-never-show-recommendation", + }, + }, + { + label: { + string_id: "cfr-doorhanger-extension-manage-settings-button", + }, + action: { + type: "OPEN_PREFERENCES_PAGE", + data: { + category: "general-cfrfeatures", + }, + }, + }, + ], + primary: { + label: { + string_id: "cfr-doorhanger-sync-logins-ok-button", + }, + action: { + type: "OPEN_PREFERENCES_PAGE", + data: { + category: "sync", + entrypoint: "cfr-update-login", + }, + }, + }, + }, + bucket_id: "CFR_UPDATE_LOGIN", + heading_text: { + string_id: "cfr-doorhanger-sync-logins-header", + }, + info_icon: { + label: { + string_id: "cfr-doorhanger-extension-sumo-link", + }, + sumo_path: "extensionrecommendations", + }, + notification_text: { + string_id: "cfr-doorhanger-feature-notification", + }, + category: "cfrFeatures", + }, + trigger: { + id: "newSavedLogin", + }, + }, { id: "SOCIAL_TRACKING_PROTECTION", template: "cfr_doorhanger", diff --git a/browser/components/newtab/lib/DiscoveryStreamFeed.jsm b/browser/components/newtab/lib/DiscoveryStreamFeed.jsm index 19f736f7bfb6577904bece23cf1e24f57e36569f..71d3fb4dc913635fce39bda9ca2fa3b2c3d272e5 100644 --- a/browser/components/newtab/lib/DiscoveryStreamFeed.jsm +++ b/browser/components/newtab/lib/DiscoveryStreamFeed.jsm @@ -1924,7 +1924,7 @@ getHardcodedLayout = isBasicLayout => ({ }, { name: "More Recommendations ›", - url: "https://getpocket.com/explore/trending?src=fx_new_tab", + url: "https://getpocket.com/explore?src=fx_new_tab&cdn=0", }, ], }, diff --git a/browser/components/newtab/package-lock.json b/browser/components/newtab/package-lock.json index f320722871c62f638692be8e9091f4b67e3a5650..ec2279f025725136e9ad567c7c79946f30a739f7 100644 --- a/browser/components/newtab/package-lock.json +++ b/browser/components/newtab/package-lock.json @@ -7900,9 +7900,9 @@ } }, "react": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", - "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -7910,14 +7910,25 @@ } }, "react-dom": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", - "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", + "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.18.0" + "scheduler": "^0.19.1" + }, + "dependencies": { + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } } }, "react-is": { @@ -8946,6 +8957,7 @@ "version": "0.18.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", + "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" diff --git a/browser/components/newtab/package.json b/browser/components/newtab/package.json index 0f050776a6dcab0feebdf079d198955e65f9e313..14ce0d8fad46250495445cf798b9597b195bb8d4 100644 --- a/browser/components/newtab/package.json +++ b/browser/components/newtab/package.json @@ -9,8 +9,8 @@ "dependencies": { "fluent": "0.13.0", "fluent-react": "0.9.0", - "react": "16.12.0", - "react-dom": "16.12.0", + "react": "16.13.1", + "react-dom": "16.13.1", "react-redux": "7.2.0", "react-transition-group": "4.3.0", "redux": "4.0.5", diff --git a/browser/components/newtab/test/browser/browser_aboutwelcome_observer.js b/browser/components/newtab/test/browser/browser_aboutwelcome_observer.js index d68e50795190f7c54be696d4a156a89c31791c59..0da72c730085bf8cd561d3f5c8b92b39b60863e8 100644 --- a/browser/components/newtab/test/browser/browser_aboutwelcome_observer.js +++ b/browser/components/newtab/test/browser/browser_aboutwelcome_observer.js @@ -16,8 +16,7 @@ async function openAboutWelcomeTab() { await setAboutWelcomePref(true); let tab = await BrowserTestUtils.openNewForegroundTab( gBrowser, - "about:welcome", - false + "about:welcome" ); registerCleanupFunction(() => { BrowserTestUtils.removeTab(tab); @@ -54,10 +53,15 @@ add_task(async function test_About_Welcome_Tab_Close() { */ add_task(async function test_About_Welcome_Location_Change() { await openAboutWelcomeTab(); + let windowGlobalParent = + gBrowser.selectedBrowser.browsingContext.currentWindowGlobal; - let AWP = new AboutWelcomeParent(); - Assert.ok(AWP.AboutWelcomeObserver, "AboutWelcomeObserver is not null"); + let aboutWelcomeActor = await windowGlobalParent.getActor("AboutWelcome"); + Assert.ok( + aboutWelcomeActor.AboutWelcomeObserver, + "AboutWelcomeObserver is not null" + ); await BrowserTestUtils.loadURI( gBrowser.selectedBrowser, "http://example.com/#foo" @@ -68,8 +72,8 @@ add_task(async function test_About_Welcome_Location_Change() { ); Assert.equal( - AWP.AboutWelcomeObserver.terminateReason, - AWP.AboutWelcomeObserver.AWTerminate.ADDRESS_BAR_NAVIGATED, + aboutWelcomeActor.AboutWelcomeObserver.terminateReason, + aboutWelcomeActor.AboutWelcomeObserver.AWTerminate.ADDRESS_BAR_NAVIGATED, "Terminated due to location uri changed" ); }); diff --git a/browser/components/newtab/test/browser/browser_asrouter_trigger_listeners.js b/browser/components/newtab/test/browser/browser_asrouter_trigger_listeners.js index c4e5eec46d7db83caa05e0c0197e176cdc61c317..3a8b839819dda229977d7f360fae81d2528cecd5 100644 --- a/browser/components/newtab/test/browser/browser_asrouter_trigger_listeners.js +++ b/browser/components/newtab/test/browser/browser_asrouter_trigger_listeners.js @@ -162,12 +162,18 @@ add_task(async function check_openURL_listener() { await Promise.all(windows.map(win => BrowserTestUtils.closeWindow(win))); }); -add_task(async function check_newSavedLogin_listener() { +add_task(async function check_newSavedLogin_save_listener() { const TEST_URL = "https://example.com/browser/browser/components/newtab/test/browser/red_page.html"; - let loginsSaved = 0; - const triggerHandler = () => loginsSaved++; + let triggerTypesHandled = { + save: 0, + update: 0, + }; + const triggerHandler = (sub, { id, context }) => { + is(id, "newSavedLogin", "Check trigger id"); + triggerTypesHandled[context.type]++; + }; const newSavedLoginListener = ASRouterTriggerListeners.get("newSavedLogin"); // Previously initialized by the Router @@ -181,13 +187,15 @@ add_task(async function check_newSavedLogin_listener() { async function triggerNewSavedPassword(browser) { Services.obs.notifyObservers(browser, "LoginStats:NewSavedPassword"); await BrowserTestUtils.waitForCondition( - () => loginsSaved !== 0, + () => triggerTypesHandled.save !== 0, "Wait for the observer notification to run" ); - is(loginsSaved, 1, "should receive observer notification"); + is(triggerTypesHandled.save, 1, "should receive observer notification"); } ); + is(triggerTypesHandled.update, 0, "shouldn't have handled other trigger"); + // Uninitialise listener newSavedLoginListener.uninit(); @@ -196,7 +204,62 @@ add_task(async function check_newSavedLogin_listener() { async function triggerNewSavedPasswordAfterUninit(browser) { Services.obs.notifyObservers(browser, "LoginStats:NewSavedPassword"); await new Promise(resolve => executeSoon(resolve)); - is(loginsSaved, 1, "shouldn't receive obs. notification after uninit"); + is( + triggerTypesHandled.save, + 1, + "shouldn't receive obs. notification after uninit" + ); + } + ); +}); + +add_task(async function check_newSavedLogin_update_listener() { + const TEST_URL = + "https://example.com/browser/browser/components/newtab/test/browser/red_page.html"; + + let triggerTypesHandled = { + save: 0, + update: 0, + }; + const triggerHandler = (sub, { id, context }) => { + is(id, "newSavedLogin", "Check trigger id"); + triggerTypesHandled[context.type]++; + }; + const newSavedLoginListener = ASRouterTriggerListeners.get("newSavedLogin"); + + // Previously initialized by the Router + newSavedLoginListener.uninit(); + + // Initialise listener + await newSavedLoginListener.init(triggerHandler); + + await BrowserTestUtils.withNewTab( + TEST_URL, + async function triggerLoginUpdateSaved(browser) { + Services.obs.notifyObservers(browser, "LoginStats:LoginUpdateSaved"); + await BrowserTestUtils.waitForCondition( + () => triggerTypesHandled.update !== 0, + "Wait for the observer notification to run" + ); + is(triggerTypesHandled.update, 1, "should receive observer notification"); + } + ); + + is(triggerTypesHandled.save, 0, "shouldn't have handled other trigger"); + + // Uninitialise listener + newSavedLoginListener.uninit(); + + await BrowserTestUtils.withNewTab( + TEST_URL, + async function triggerLoginUpdateSavedAfterUninit(browser) { + Services.obs.notifyObservers(browser, "LoginStats:LoginUpdateSaved"); + await new Promise(resolve => executeSoon(resolve)); + is( + triggerTypesHandled.update, + 1, + "shouldn't receive obs. notification after uninit" + ); } ); }); diff --git a/browser/components/newtab/test/unit/asrouter/CFRMessageProvider.test.js b/browser/components/newtab/test/unit/asrouter/CFRMessageProvider.test.js index 6411278a221c0d80aeded566acf227314d64af34..0393bdd0a0a93b1c76b99a66d78d685ca1e9b539 100644 --- a/browser/components/newtab/test/unit/asrouter/CFRMessageProvider.test.js +++ b/browser/components/newtab/test/unit/asrouter/CFRMessageProvider.test.js @@ -12,7 +12,7 @@ const REGULAR_IDS = [ describe("CFRMessageProvider", () => { it("should have a total of 10 messages", () => { - assert.lengthOf(messages, 10); + assert.lengthOf(messages, 11); }); it("should have one message each for the three regular addons", () => { for (const id of REGULAR_IDS) { diff --git a/browser/components/newtab/vendor/react-dev.js b/browser/components/newtab/vendor/react-dev.js index 75d9af66896807d535cd65925855ed5cfe1c5534..6d64de13504724ce63e9ebd682b27c74dd0f0be8 100644 --- a/browser/components/newtab/vendor/react-dev.js +++ b/browser/components/newtab/vendor/react-dev.js @@ -1,4 +1,4 @@ -/** @license React v16.12.0 +/** @license React v16.13.1 * react.development.js * * Copyright (c) Facebook, Inc. and its affiliates. @@ -10,3784 +10,3309 @@ 'use strict'; (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global.React = factory()); -}(this, (function () { 'use strict'; - -// TODO: this is special because it gets imported during build. - -var ReactVersion = '16.12.0'; - -// The Symbol used to tag the ReactElement-like types. If there is no native Symbol -// nor polyfill, then a plain number is used for performance. -var hasSymbol = typeof Symbol === 'function' && Symbol.for; -var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; -var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; -var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; -var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; -var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; -var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; -var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary -// (unstable) APIs that have been removed. Can we remove the symbols? - - -var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; -var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; -var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; -var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8; -var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; -var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; -var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5; -var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6; -var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7; -var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; -var FAUX_ITERATOR_SYMBOL = '@@iterator'; -function getIteratorFn(maybeIterable) { - if (maybeIterable === null || typeof maybeIterable !== 'object') { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.React = {})); +}(this, (function (exports) { 'use strict'; + + var ReactVersion = '16.13.1'; + + // The Symbol used to tag the ReactElement-like types. If there is no native Symbol + // nor polyfill, then a plain number is used for performance. + var hasSymbol = typeof Symbol === 'function' && Symbol.for; + var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; + var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; + var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; + var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; + var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; + var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; + var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary + var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; + var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; + var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; + var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8; + var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; + var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; + var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9; + var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5; + var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6; + var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7; + var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = '@@iterator'; + function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== 'object') { + return null; + } + + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + + if (typeof maybeIterator === 'function') { + return maybeIterator; + } + return null; } - var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; - - if (typeof maybeIterator === 'function') { - return maybeIterator; - } - - return null; -} - -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - - -/* eslint-disable no-unused-vars */ -var getOwnPropertySymbols = Object.getOwnPropertySymbols; -var hasOwnProperty = Object.prototype.hasOwnProperty; -var propIsEnumerable = Object.prototype.propertyIsEnumerable; - -function toObject(val) { - if (val === null || val === undefined) { - throw new TypeError('Object.assign cannot be called with null or undefined'); - } - - return Object(val); -} - -function shouldUseNative() { - try { - if (!Object.assign) { - return false; - } - - // Detect buggy property enumeration order in older V8 versions. - - // https://bugs.chromium.org/p/v8/issues/detail?id=4118 - var test1 = new String('abc'); // eslint-disable-line no-new-wrappers - test1[5] = 'de'; - if (Object.getOwnPropertyNames(test1)[0] === '5') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test2 = {}; - for (var i = 0; i < 10; i++) { - test2['_' + String.fromCharCode(i)] = i; - } - var order2 = Object.getOwnPropertyNames(test2).map(function (n) { - return test2[n]; - }); - if (order2.join('') !== '0123456789') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test3 = {}; - 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { - test3[letter] = letter; - }); - if (Object.keys(Object.assign({}, test3)).join('') !== - 'abcdefghijklmnopqrst') { - return false; - } - - return true; - } catch (err) { - // We don't expect any of the above to throw, but better to be safe. - return false; - } -} - -var objectAssign = shouldUseNative() ? Object.assign : function (target, source) { - var from; - var to = toObject(target); - var symbols; - - for (var s = 1; s < arguments.length; s++) { - from = Object(arguments[s]); - - for (var key in from) { - if (hasOwnProperty.call(from, key)) { - to[key] = from[key]; - } - } - - if (getOwnPropertySymbols) { - symbols = getOwnPropertySymbols(from); - for (var i = 0; i < symbols.length; i++) { - if (propIsEnumerable.call(from, symbols[i])) { - to[symbols[i]] = from[symbols[i]]; - } - } - } - } - - return to; -}; - -// Do not require this module directly! Use normal `invariant` calls with -// template literal strings. The messages will be replaced with error codes -// during build. - -/** - * Use invariant() to assert state which your program assumes to be true. - * - * Provide sprintf-style format (only %s is supported) and arguments - * to provide information about what broke and what you were - * expecting. - * - * The invariant message will be stripped in production, but the invariant - * will remain to ensure logic does not differ in production. - */ - -/** - * Forked from fbjs/warning: - * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js - * - * Only change is we use console.warn instead of console.error, - * and do nothing when 'console' is not supported. - * This really simplifies the code. - * --- - * Similar to invariant but only logs a warning if the condition is not met. - * This can be used to log issues in development environments in critical - * paths. Removing the logging code for production environments will keep the - * same logic and follow the same code paths. - */ -var lowPriorityWarningWithoutStack = function () {}; - -{ - var printWarning = function (format) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } + /* + object-assign + (c) Sindre Sorhus + @license MIT + */ + /* eslint-disable no-unused-vars */ + var getOwnPropertySymbols = Object.getOwnPropertySymbols; + var hasOwnProperty = Object.prototype.hasOwnProperty; + var propIsEnumerable = Object.prototype.propertyIsEnumerable; + + function toObject(val) { + if (val === null || val === undefined) { + throw new TypeError('Object.assign cannot be called with null or undefined'); + } + + return Object(val); + } + + function shouldUseNative() { + try { + if (!Object.assign) { + return false; + } + + // Detect buggy property enumeration order in older V8 versions. + + // https://bugs.chromium.org/p/v8/issues/detail?id=4118 + var test1 = new String('abc'); // eslint-disable-line no-new-wrappers + test1[5] = 'de'; + if (Object.getOwnPropertyNames(test1)[0] === '5') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test2 = {}; + for (var i = 0; i < 10; i++) { + test2['_' + String.fromCharCode(i)] = i; + } + var order2 = Object.getOwnPropertyNames(test2).map(function (n) { + return test2[n]; + }); + if (order2.join('') !== '0123456789') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test3 = {}; + 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { + test3[letter] = letter; + }); + if (Object.keys(Object.assign({}, test3)).join('') !== + 'abcdefghijklmnopqrst') { + return false; + } + + return true; + } catch (err) { + // We don't expect any of the above to throw, but better to be safe. + return false; + } + } + + var objectAssign = shouldUseNative() ? Object.assign : function (target, source) { + var from; + var to = toObject(target); + var symbols; + + for (var s = 1; s < arguments.length; s++) { + from = Object(arguments[s]); + + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } + + if (getOwnPropertySymbols) { + symbols = getOwnPropertySymbols(from); + for (var i = 0; i < symbols.length; i++) { + if (propIsEnumerable.call(from, symbols[i])) { + to[symbols[i]] = from[symbols[i]]; + } + } + } + } + + return to; + }; - var argIndex = 0; - var message = 'Warning: ' + format.replace(/%s/g, function () { - return args[argIndex++]; - }); + /** + * Keeps track of the current dispatcher. + */ + var ReactCurrentDispatcher = { + /** + * @internal + * @type {ReactComponent} + */ + current: null + }; - if (typeof console !== 'undefined') { - console.warn(message); - } + /** + * Keeps track of the current batch's configuration such as how long an update + * should suspend for if it needs to. + */ + var ReactCurrentBatchConfig = { + suspense: null + }; - try { - // --- Welcome to debugging React --- - // This error was thrown as a convenience so that you can use this stack - // to find the callsite that caused this warning to fire. - throw new Error(message); - } catch (x) {} + /** + * Keeps track of the current owner. + * + * The current owner is the component who should own any components that are + * currently being constructed. + */ + var ReactCurrentOwner = { + /** + * @internal + * @type {ReactComponent} + */ + current: null }; - lowPriorityWarningWithoutStack = function (condition, format) { - if (format === undefined) { - throw new Error('`lowPriorityWarningWithoutStack(condition, format, ...args)` requires a warning ' + 'message argument'); - } + var BEFORE_SLASH_RE = /^(.*)[\\\/]/; + function describeComponentFrame (name, source, ownerName) { + var sourceInfo = ''; + + if (source) { + var path = source.fileName; + var fileName = path.replace(BEFORE_SLASH_RE, ''); - if (!condition) { - for (var _len2 = arguments.length, args = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) { - args[_key2 - 2] = arguments[_key2]; + { + // In DEV, include code for a common special case: + // prefer "folder/index.js" instead of just "index.js". + if (/^index\./.test(fileName)) { + var match = path.match(BEFORE_SLASH_RE); + + if (match) { + var pathBeforeSlash = match[1]; + + if (pathBeforeSlash) { + var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, ''); + fileName = folderName + '/' + fileName; + } + } + } } - printWarning.apply(void 0, [format].concat(args)); + sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')'; + } else if (ownerName) { + sourceInfo = ' (created by ' + ownerName + ')'; } - }; -} -var lowPriorityWarningWithoutStack$1 = lowPriorityWarningWithoutStack; + return '\n in ' + (name || 'Unknown') + sourceInfo; + } -/** - * Similar to invariant but only logs a warning if the condition is not met. - * This can be used to log issues in development environments in critical - * paths. Removing the logging code for production environments will keep the - * same logic and follow the same code paths. - */ -var warningWithoutStack = function () {}; + var Resolved = 1; + function refineResolvedLazyComponent(lazyComponent) { + return lazyComponent._status === Resolved ? lazyComponent._result : null; + } -{ - warningWithoutStack = function (condition, format) { - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; - } + function getWrappedName(outerType, innerType, wrapperName) { + var functionName = innerType.displayName || innerType.name || ''; + return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); + } - if (format === undefined) { - throw new Error('`warningWithoutStack(condition, format, ...args)` requires a warning ' + 'message argument'); + function getComponentName(type) { + if (type == null) { + // Host root, text node or just invalid type. + return null; } - if (args.length > 8) { - // Check before the condition to catch violations early. - throw new Error('warningWithoutStack() currently supports at most 8 arguments.'); + { + if (typeof type.tag === 'number') { + error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); + } } - if (condition) { - return; + if (typeof type === 'function') { + return type.displayName || type.name || null; } - if (typeof console !== 'undefined') { - var argsWithFormat = args.map(function (item) { - return '' + item; - }); - argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it - // breaks IE9: https://github.com/facebook/react/issues/13610 - - Function.prototype.apply.call(console.error, console, argsWithFormat); + if (typeof type === 'string') { + return type; } - try { - // --- Welcome to debugging React --- - // This error was thrown as a convenience so that you can use this stack - // to find the callsite that caused this warning to fire. - var argIndex = 0; - var message = 'Warning: ' + format.replace(/%s/g, function () { - return args[argIndex++]; - }); - throw new Error(message); - } catch (x) {} - }; -} - -var warningWithoutStack$1 = warningWithoutStack; - -var didWarnStateUpdateForUnmountedComponent = {}; - -function warnNoop(publicInstance, callerName) { - { - var _constructor = publicInstance.constructor; - var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass'; - var warningKey = componentName + "." + callerName; + switch (type) { + case REACT_FRAGMENT_TYPE: + return 'Fragment'; - if (didWarnStateUpdateForUnmountedComponent[warningKey]) { - return; - } + case REACT_PORTAL_TYPE: + return 'Portal'; - warningWithoutStack$1(false, "Can't call %s on a component that is not yet mounted. " + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName); - didWarnStateUpdateForUnmountedComponent[warningKey] = true; - } -} -/** - * This is the abstract API for an update queue. - */ + case REACT_PROFILER_TYPE: + return "Profiler"; + case REACT_STRICT_MODE_TYPE: + return 'StrictMode'; -var ReactNoopUpdateQueue = { - /** - * Checks whether or not this composite component is mounted. - * @param {ReactClass} publicInstance The instance we want to test. - * @return {boolean} True if mounted, false otherwise. - * @protected - * @final - */ - isMounted: function (publicInstance) { - return false; - }, + case REACT_SUSPENSE_TYPE: + return 'Suspense'; - /** - * Forces an update. This should only be invoked when it is known with - * certainty that we are **not** in a DOM transaction. - * - * You may want to call this when you know that some deeper aspect of the - * component's state has changed but `setState` was not called. - * - * This will not invoke `shouldComponentUpdate`, but it will invoke - * `componentWillUpdate` and `componentDidUpdate`. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @param {?function} callback Called after component is updated. - * @param {?string} callerName name of the calling function in the public API. - * @internal - */ - enqueueForceUpdate: function (publicInstance, callback, callerName) { - warnNoop(publicInstance, 'forceUpdate'); - }, + case REACT_SUSPENSE_LIST_TYPE: + return 'SuspenseList'; + } - /** - * Replaces all of the state. Always use this or `setState` to mutate state. - * You should treat `this.state` as immutable. - * - * There is no guarantee that `this.state` will be immediately updated, so - * accessing `this.state` after calling this method may return the old value. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @param {object} completeState Next state. - * @param {?function} callback Called after component is updated. - * @param {?string} callerName name of the calling function in the public API. - * @internal - */ - enqueueReplaceState: function (publicInstance, completeState, callback, callerName) { - warnNoop(publicInstance, 'replaceState'); - }, + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + return 'Context.Consumer'; - /** - * Sets a subset of the state. This only exists because _pendingState is - * internal. This provides a merging strategy that is not available to deep - * properties which is confusing. TODO: Expose pendingState or don't use it - * during the merge. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @param {object} partialState Next partial state to be merged with state. - * @param {?function} callback Called after component is updated. - * @param {?string} Name of the calling function in the public API. - * @internal - */ - enqueueSetState: function (publicInstance, partialState, callback, callerName) { - warnNoop(publicInstance, 'setState'); - } -}; + case REACT_PROVIDER_TYPE: + return 'Context.Provider'; -var emptyObject = {}; + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, 'ForwardRef'); -{ - Object.freeze(emptyObject); -} -/** - * Base class helpers for the updating state of a component. - */ + case REACT_MEMO_TYPE: + return getComponentName(type.type); + case REACT_BLOCK_TYPE: + return getComponentName(type.render); -function Component(props, context, updater) { - this.props = props; - this.context = context; // If a component has string refs, we will assign a different object later. + case REACT_LAZY_TYPE: + { + var thenable = type; + var resolvedThenable = refineResolvedLazyComponent(thenable); - this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the - // renderer. + if (resolvedThenable) { + return getComponentName(resolvedThenable); + } - this.updater = updater || ReactNoopUpdateQueue; -} + break; + } + } + } -Component.prototype.isReactComponent = {}; -/** - * Sets a subset of the state. Always use this to mutate - * state. You should treat `this.state` as immutable. - * - * There is no guarantee that `this.state` will be immediately updated, so - * accessing `this.state` after calling this method may return the old value. - * - * There is no guarantee that calls to `setState` will run synchronously, - * as they may eventually be batched together. You can provide an optional - * callback that will be executed when the call to setState is actually - * completed. - * - * When a function is provided to setState, it will be called at some point in - * the future (not synchronously). It will be called with the up to date - * component arguments (state, props, context). These values can be different - * from this.* because your function may be called after receiveProps but before - * shouldComponentUpdate, and this new state, props, and context will not yet be - * assigned to this. - * - * @param {object|function} partialState Next partial state or function to - * produce next partial state to be merged with current state. - * @param {?function} callback Called after state is updated. - * @final - * @protected - */ + return null; + } -Component.prototype.setState = function (partialState, callback) { - if (!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)) { + var ReactDebugCurrentFrame = {}; + var currentlyValidatingElement = null; + function setCurrentlyValidatingElement(element) { { - throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables."); + currentlyValidatingElement = element; } } - this.updater.enqueueSetState(this, partialState, callback, 'setState'); -}; -/** - * Forces an update. This should only be invoked when it is known with - * certainty that we are **not** in a DOM transaction. - * - * You may want to call this when you know that some deeper aspect of the - * component's state has changed but `setState` was not called. - * - * This will not invoke `shouldComponentUpdate`, but it will invoke - * `componentWillUpdate` and `componentDidUpdate`. - * - * @param {?function} callback Called after update is complete. - * @final - * @protected - */ + { + // Stack implementation injected by the current renderer. + ReactDebugCurrentFrame.getCurrentStack = null; + ReactDebugCurrentFrame.getStackAddendum = function () { + var stack = ''; // Add an extra top frame while an element is being validated -Component.prototype.forceUpdate = function (callback) { - this.updater.enqueueForceUpdate(this, callback, 'forceUpdate'); -}; -/** - * Deprecated APIs. These APIs used to exist on classic React classes but since - * we would like to deprecate them, we're not going to move them over to this - * modern base class. Instead, we define a getter that warns if it's accessed. - */ + if (currentlyValidatingElement) { + var name = getComponentName(currentlyValidatingElement.type); + var owner = currentlyValidatingElement._owner; + stack += describeComponentFrame(name, currentlyValidatingElement._source, owner && getComponentName(owner.type)); + } // Delegate to the injected renderer-specific implementation -{ - var deprecatedAPIs = { - isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'], - replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'] - }; + var impl = ReactDebugCurrentFrame.getCurrentStack; - var defineDeprecationWarning = function (methodName, info) { - Object.defineProperty(Component.prototype, methodName, { - get: function () { - lowPriorityWarningWithoutStack$1(false, '%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]); - return undefined; + if (impl) { + stack += impl() || ''; } - }); - }; - for (var fnName in deprecatedAPIs) { - if (deprecatedAPIs.hasOwnProperty(fnName)) { - defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); - } + return stack; + }; } -} - -function ComponentDummy() {} - -ComponentDummy.prototype = Component.prototype; -/** - * Convenience component with default shallow equality check for sCU. - */ - -function PureComponent(props, context, updater) { - this.props = props; - this.context = context; // If a component has string refs, we will assign a different object later. - - this.refs = emptyObject; - this.updater = updater || ReactNoopUpdateQueue; -} - -var pureComponentPrototype = PureComponent.prototype = new ComponentDummy(); -pureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods. -objectAssign(pureComponentPrototype, Component.prototype); - -pureComponentPrototype.isPureReactComponent = true; + /** + * Used by act() to track whether you're inside an act() scope. + */ + var IsSomeRendererActing = { + current: false + }; -// an immutable object with a single mutable value -function createRef() { - var refObject = { - current: null + var ReactSharedInternals = { + ReactCurrentDispatcher: ReactCurrentDispatcher, + ReactCurrentBatchConfig: ReactCurrentBatchConfig, + ReactCurrentOwner: ReactCurrentOwner, + IsSomeRendererActing: IsSomeRendererActing, + // Used by renderers to avoid bundling object-assign twice in UMD bundles: + assign: objectAssign }; { - Object.seal(refObject); + objectAssign(ReactSharedInternals, { + // These should not be included in production. + ReactDebugCurrentFrame: ReactDebugCurrentFrame, + // Shim for React DOM 16.0.0 which still destructured (but not used) this. + // TODO: remove in React 17.0. + ReactComponentTreeHook: {} + }); } - return refObject; -} - -/** - * Keeps track of the current dispatcher. - */ -var ReactCurrentDispatcher = { - /** - * @internal - * @type {ReactComponent} - */ - current: null -}; - -/** - * Keeps track of the current batch's configuration such as how long an update - * should suspend for if it needs to. - */ -var ReactCurrentBatchConfig = { - suspense: null -}; + // by calls to these methods by a Babel plugin. + // + // In PROD (or in packages without access to React internals), + // they are left as they are instead. -/** - * Keeps track of the current owner. - * - * The current owner is the component who should own any components that are - * currently being constructed. - */ -var ReactCurrentOwner = { - /** - * @internal - * @type {ReactComponent} - */ - current: null -}; + function warn(format) { + { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } -var BEFORE_SLASH_RE = /^(.*)[\\\/]/; -var describeComponentFrame = function (name, source, ownerName) { - var sourceInfo = ''; + printWarning('warn', format, args); + } + } + function error(format) { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } - if (source) { - var path = source.fileName; - var fileName = path.replace(BEFORE_SLASH_RE, ''); + printWarning('error', format, args); + } + } + function printWarning(level, format, args) { + // When changing this logic, you might want to also + // update consoleWithStackDev.www.js as well. { - // In DEV, include code for a common special case: - // prefer "folder/index.js" instead of just "index.js". - if (/^index\./.test(fileName)) { - var match = path.match(BEFORE_SLASH_RE); + var hasExistingStack = args.length > 0 && typeof args[args.length - 1] === 'string' && args[args.length - 1].indexOf('\n in') === 0; - if (match) { - var pathBeforeSlash = match[1]; + if (!hasExistingStack) { + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame.getStackAddendum(); - if (pathBeforeSlash) { - var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, ''); - fileName = folderName + '/' + fileName; - } + if (stack !== '') { + format += '%s'; + args = args.concat([stack]); } } - } - sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')'; - } else if (ownerName) { - sourceInfo = ' (created by ' + ownerName + ')'; + var argsWithFormat = args.map(function (item) { + return '' + item; + }); // Careful: RN currently depends on this prefix + + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it + // breaks IE9: https://github.com/facebook/react/issues/13610 + // eslint-disable-next-line react-internal/no-production-logging + + Function.prototype.apply.call(console[level], console, argsWithFormat); + + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + var argIndex = 0; + var message = 'Warning: ' + format.replace(/%s/g, function () { + return args[argIndex++]; + }); + throw new Error(message); + } catch (x) {} + } } - return '\n in ' + (name || 'Unknown') + sourceInfo; -}; + var didWarnStateUpdateForUnmountedComponent = {}; -var Resolved = 1; + function warnNoop(publicInstance, callerName) { + { + var _constructor = publicInstance.constructor; + var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass'; + var warningKey = componentName + "." + callerName; -function refineResolvedLazyComponent(lazyComponent) { - return lazyComponent._status === Resolved ? lazyComponent._result : null; -} + if (didWarnStateUpdateForUnmountedComponent[warningKey]) { + return; + } -function getWrappedName(outerType, innerType, wrapperName) { - var functionName = innerType.displayName || innerType.name || ''; - return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); -} + error("Can't call %s on a component that is not yet mounted. " + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName); -function getComponentName(type) { - if (type == null) { - // Host root, text node or just invalid type. - return null; + didWarnStateUpdateForUnmountedComponent[warningKey] = true; + } } + /** + * This is the abstract API for an update queue. + */ - { - if (typeof type.tag === 'number') { - warningWithoutStack$1(false, 'Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); + + var ReactNoopUpdateQueue = { + /** + * Checks whether or not this composite component is mounted. + * @param {ReactClass} publicInstance The instance we want to test. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function (publicInstance) { + return false; + }, + + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueForceUpdate: function (publicInstance, callback, callerName) { + warnNoop(publicInstance, 'forceUpdate'); + }, + + /** + * Replaces all of the state. Always use this or `setState` to mutate state. + * You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} completeState Next state. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueReplaceState: function (publicInstance, completeState, callback, callerName) { + warnNoop(publicInstance, 'replaceState'); + }, + + /** + * Sets a subset of the state. This only exists because _pendingState is + * internal. This provides a merging strategy that is not available to deep + * properties which is confusing. TODO: Expose pendingState or don't use it + * during the merge. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialState Next partial state to be merged with state. + * @param {?function} callback Called after component is updated. + * @param {?string} Name of the calling function in the public API. + * @internal + */ + enqueueSetState: function (publicInstance, partialState, callback, callerName) { + warnNoop(publicInstance, 'setState'); } - } + }; - if (typeof type === 'function') { - return type.displayName || type.name || null; - } + var emptyObject = {}; - if (typeof type === 'string') { - return type; + { + Object.freeze(emptyObject); } + /** + * Base class helpers for the updating state of a component. + */ - switch (type) { - case REACT_FRAGMENT_TYPE: - return 'Fragment'; - case REACT_PORTAL_TYPE: - return 'Portal'; + function Component(props, context, updater) { + this.props = props; + this.context = context; // If a component has string refs, we will assign a different object later. - case REACT_PROFILER_TYPE: - return "Profiler"; + this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the + // renderer. - case REACT_STRICT_MODE_TYPE: - return 'StrictMode'; + this.updater = updater || ReactNoopUpdateQueue; + } - case REACT_SUSPENSE_TYPE: - return 'Suspense'; + Component.prototype.isReactComponent = {}; + /** + * Sets a subset of the state. Always use this to mutate + * state. You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * There is no guarantee that calls to `setState` will run synchronously, + * as they may eventually be batched together. You can provide an optional + * callback that will be executed when the call to setState is actually + * completed. + * + * When a function is provided to setState, it will be called at some point in + * the future (not synchronously). It will be called with the up to date + * component arguments (state, props, context). These values can be different + * from this.* because your function may be called after receiveProps but before + * shouldComponentUpdate, and this new state, props, and context will not yet be + * assigned to this. + * + * @param {object|function} partialState Next partial state or function to + * produce next partial state to be merged with current state. + * @param {?function} callback Called after state is updated. + * @final + * @protected + */ - case REACT_SUSPENSE_LIST_TYPE: - return 'SuspenseList'; - } + Component.prototype.setState = function (partialState, callback) { + if (!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)) { + { + throw Error( "setState(...): takes an object of state variables to update or a function which returns an object of state variables." ); + } + } - if (typeof type === 'object') { - switch (type.$$typeof) { - case REACT_CONTEXT_TYPE: - return 'Context.Consumer'; + this.updater.enqueueSetState(this, partialState, callback, 'setState'); + }; + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {?function} callback Called after update is complete. + * @final + * @protected + */ - case REACT_PROVIDER_TYPE: - return 'Context.Provider'; - case REACT_FORWARD_REF_TYPE: - return getWrappedName(type, type.render, 'ForwardRef'); + Component.prototype.forceUpdate = function (callback) { + this.updater.enqueueForceUpdate(this, callback, 'forceUpdate'); + }; + /** + * Deprecated APIs. These APIs used to exist on classic React classes but since + * we would like to deprecate them, we're not going to move them over to this + * modern base class. Instead, we define a getter that warns if it's accessed. + */ - case REACT_MEMO_TYPE: - return getComponentName(type.type); - case REACT_LAZY_TYPE: - { - var thenable = type; - var resolvedThenable = refineResolvedLazyComponent(thenable); + { + var deprecatedAPIs = { + isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'], + replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'] + }; - if (resolvedThenable) { - return getComponentName(resolvedThenable); - } + var defineDeprecationWarning = function (methodName, info) { + Object.defineProperty(Component.prototype, methodName, { + get: function () { + warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]); - break; + return undefined; } + }); + }; + + for (var fnName in deprecatedAPIs) { + if (deprecatedAPIs.hasOwnProperty(fnName)) { + defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); + } } } - return null; -} + function ComponentDummy() {} -var ReactDebugCurrentFrame = {}; -var currentlyValidatingElement = null; -function setCurrentlyValidatingElement(element) { - { - currentlyValidatingElement = element; - } -} + ComponentDummy.prototype = Component.prototype; + /** + * Convenience component with default shallow equality check for sCU. + */ + + function PureComponent(props, context, updater) { + this.props = props; + this.context = context; // If a component has string refs, we will assign a different object later. -{ - // Stack implementation injected by the current renderer. - ReactDebugCurrentFrame.getCurrentStack = null; + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; + } - ReactDebugCurrentFrame.getStackAddendum = function () { - var stack = ''; // Add an extra top frame while an element is being validated + var pureComponentPrototype = PureComponent.prototype = new ComponentDummy(); + pureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods. - if (currentlyValidatingElement) { - var name = getComponentName(currentlyValidatingElement.type); - var owner = currentlyValidatingElement._owner; - stack += describeComponentFrame(name, currentlyValidatingElement._source, owner && getComponentName(owner.type)); - } // Delegate to the injected renderer-specific implementation + objectAssign(pureComponentPrototype, Component.prototype); + pureComponentPrototype.isPureReactComponent = true; - var impl = ReactDebugCurrentFrame.getCurrentStack; + // an immutable object with a single mutable value + function createRef() { + var refObject = { + current: null + }; - if (impl) { - stack += impl() || ''; + { + Object.seal(refObject); } - return stack; - }; -} + return refObject; + } -/** - * Used by act() to track whether you're inside an act() scope. - */ -var IsSomeRendererActing = { - current: false -}; - -var ReactSharedInternals = { - ReactCurrentDispatcher: ReactCurrentDispatcher, - ReactCurrentBatchConfig: ReactCurrentBatchConfig, - ReactCurrentOwner: ReactCurrentOwner, - IsSomeRendererActing: IsSomeRendererActing, - // Used by renderers to avoid bundling object-assign twice in UMD bundles: - assign: objectAssign -}; - -{ - objectAssign(ReactSharedInternals, { - // These should not be included in production. - ReactDebugCurrentFrame: ReactDebugCurrentFrame, - // Shim for React DOM 16.0.0 which still destructured (but not used) this. - // TODO: remove in React 17.0. - ReactComponentTreeHook: {} - }); -} + var hasOwnProperty$1 = Object.prototype.hasOwnProperty; + var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true + }; + var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs; -/** - * Similar to invariant but only logs a warning if the condition is not met. - * This can be used to log issues in development environments in critical - * paths. Removing the logging code for production environments will keep the - * same logic and follow the same code paths. - */ + { + didWarnAboutStringRefs = {}; + } -var warning = warningWithoutStack$1; + function hasValidRef(config) { + { + if (hasOwnProperty$1.call(config, 'ref')) { + var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; -{ - warning = function (condition, format) { - if (condition) { - return; + if (getter && getter.isReactWarning) { + return false; + } + } } - var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; - var stack = ReactDebugCurrentFrame.getStackAddendum(); // eslint-disable-next-line react-internal/warning-and-invariant-args + return config.ref !== undefined; + } + + function hasValidKey(config) { + { + if (hasOwnProperty$1.call(config, 'key')) { + var getter = Object.getOwnPropertyDescriptor(config, 'key').get; - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; + if (getter && getter.isReactWarning) { + return false; + } + } } - warningWithoutStack$1.apply(void 0, [false, format + '%s'].concat(args, [stack])); - }; -} + return config.key !== undefined; + } + + function defineKeyPropWarningGetter(props, displayName) { + var warnAboutAccessingKey = function () { + { + if (!specialPropKeyWarningShown) { + specialPropKeyWarningShown = true; -var warning$1 = warning; + error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName); + } + } + }; -var hasOwnProperty$1 = Object.prototype.hasOwnProperty; -var RESERVED_PROPS = { - key: true, - ref: true, - __self: true, - __source: true -}; -var specialPropKeyWarningShown; -var specialPropRefWarningShown; + warnAboutAccessingKey.isReactWarning = true; + Object.defineProperty(props, 'key', { + get: warnAboutAccessingKey, + configurable: true + }); + } -function hasValidRef(config) { - { - if (hasOwnProperty$1.call(config, 'ref')) { - var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; + function defineRefPropWarningGetter(props, displayName) { + var warnAboutAccessingRef = function () { + { + if (!specialPropRefWarningShown) { + specialPropRefWarningShown = true; - if (getter && getter.isReactWarning) { - return false; + error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName); + } } - } + }; + + warnAboutAccessingRef.isReactWarning = true; + Object.defineProperty(props, 'ref', { + get: warnAboutAccessingRef, + configurable: true + }); } - return config.ref !== undefined; -} + function warnIfStringRefCannotBeAutoConverted(config) { + { + if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) { + var componentName = getComponentName(ReactCurrentOwner.current.type); -function hasValidKey(config) { - { - if (hasOwnProperty$1.call(config, 'key')) { - var getter = Object.getOwnPropertyDescriptor(config, 'key').get; + if (!didWarnAboutStringRefs[componentName]) { + error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref', getComponentName(ReactCurrentOwner.current.type), config.ref); - if (getter && getter.isReactWarning) { - return false; + didWarnAboutStringRefs[componentName] = true; + } } } } + /** + * Factory method to create a new React element. This no longer adheres to + * the class pattern, so do not use new to call it. Also, instanceof check + * will not work. Instead test $$typeof field against Symbol.for('react.element') to check + * if something is a React Element. + * + * @param {*} type + * @param {*} props + * @param {*} key + * @param {string|object} ref + * @param {*} owner + * @param {*} self A *temporary* helper to detect places where `this` is + * different from the `owner` when React.createElement is called, so that we + * can warn. We want to get rid of owner and replace string `ref`s with arrow + * functions, and as long as `this` and owner are the same, there will be no + * change in behavior. + * @param {*} source An annotation object (added by a transpiler or otherwise) + * indicating filename, line number, and/or other information. + * @internal + */ - return config.key !== undefined; -} - -function defineKeyPropWarningGetter(props, displayName) { - var warnAboutAccessingKey = function () { - if (!specialPropKeyWarningShown) { - specialPropKeyWarningShown = true; - warningWithoutStack$1(false, '%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName); - } - }; - warnAboutAccessingKey.isReactWarning = true; - Object.defineProperty(props, 'key', { - get: warnAboutAccessingKey, - configurable: true - }); -} + var ReactElement = function (type, key, ref, self, source, owner, props) { + var element = { + // This tag allows us to uniquely identify this as a React Element + $$typeof: REACT_ELEMENT_TYPE, + // Built-in properties that belong on the element + type: type, + key: key, + ref: ref, + props: props, + // Record the component responsible for creating this element. + _owner: owner + }; -function defineRefPropWarningGetter(props, displayName) { - var warnAboutAccessingRef = function () { - if (!specialPropRefWarningShown) { - specialPropRefWarningShown = true; - warningWithoutStack$1(false, '%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName); + { + // The validation flag is currently mutative. We put it on + // an external backing store so that we can freeze the whole object. + // This can be replaced with a WeakMap once they are implemented in + // commonly used development environments. + element._store = {}; // To make comparing ReactElements easier for testing purposes, we make + // the validation flag non-enumerable (where possible, which should + // include every environment we run tests in), so the test framework + // ignores it. + + Object.defineProperty(element._store, 'validated', { + configurable: false, + enumerable: false, + writable: true, + value: false + }); // self and source are DEV only properties. + + Object.defineProperty(element, '_self', { + configurable: false, + enumerable: false, + writable: false, + value: self + }); // Two elements created in two different places should be considered + // equal for testing purposes and therefore we hide it from enumeration. + + Object.defineProperty(element, '_source', { + configurable: false, + enumerable: false, + writable: false, + value: source + }); + + if (Object.freeze) { + Object.freeze(element.props); + Object.freeze(element); + } } + + return element; }; + /** + * Create and return a new ReactElement of the given type. + * See https://reactjs.org/docs/react-api.html#createelement + */ - warnAboutAccessingRef.isReactWarning = true; - Object.defineProperty(props, 'ref', { - get: warnAboutAccessingRef, - configurable: true - }); -} -/** - * Factory method to create a new React element. This no longer adheres to - * the class pattern, so do not use new to call it. Also, instanceof check - * will not work. Instead test $$typeof field against Symbol.for('react.element') to check - * if something is a React Element. - * - * @param {*} type - * @param {*} props - * @param {*} key - * @param {string|object} ref - * @param {*} owner - * @param {*} self A *temporary* helper to detect places where `this` is - * different from the `owner` when React.createElement is called, so that we - * can warn. We want to get rid of owner and replace string `ref`s with arrow - * functions, and as long as `this` and owner are the same, there will be no - * change in behavior. - * @param {*} source An annotation object (added by a transpiler or otherwise) - * indicating filename, line number, and/or other information. - * @internal - */ + function createElement(type, config, children) { + var propName; // Reserved names are extracted + var props = {}; + var key = null; + var ref = null; + var self = null; + var source = null; -var ReactElement = function (type, key, ref, self, source, owner, props) { - var element = { - // This tag allows us to uniquely identify this as a React Element - $$typeof: REACT_ELEMENT_TYPE, - // Built-in properties that belong on the element - type: type, - key: key, - ref: ref, - props: props, - // Record the component responsible for creating this element. - _owner: owner - }; + if (config != null) { + if (hasValidRef(config)) { + ref = config.ref; - { - // The validation flag is currently mutative. We put it on - // an external backing store so that we can freeze the whole object. - // This can be replaced with a WeakMap once they are implemented in - // commonly used development environments. - element._store = {}; // To make comparing ReactElements easier for testing purposes, we make - // the validation flag non-enumerable (where possible, which should - // include every environment we run tests in), so the test framework - // ignores it. - - Object.defineProperty(element._store, 'validated', { - configurable: false, - enumerable: false, - writable: true, - value: false - }); // self and source are DEV only properties. - - Object.defineProperty(element, '_self', { - configurable: false, - enumerable: false, - writable: false, - value: self - }); // Two elements created in two different places should be considered - // equal for testing purposes and therefore we hide it from enumeration. - - Object.defineProperty(element, '_source', { - configurable: false, - enumerable: false, - writable: false, - value: source - }); + { + warnIfStringRefCannotBeAutoConverted(config); + } + } - if (Object.freeze) { - Object.freeze(element.props); - Object.freeze(element); - } - } + if (hasValidKey(config)) { + key = '' + config.key; + } - return element; -}; -/** - * https://github.com/reactjs/rfcs/pull/107 - * @param {*} type - * @param {object} props - * @param {string} key - */ + self = config.__self === undefined ? null : config.__self; + source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object + for (propName in config) { + if (hasOwnProperty$1.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } + } // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. -/** - * https://github.com/reactjs/rfcs/pull/107 - * @param {*} type - * @param {object} props - * @param {string} key - */ + var childrenLength = arguments.length - 2; -function jsxDEV(type, config, maybeKey, source, self) { - var propName; // Reserved names are extracted + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); - var props = {}; - var key = null; - var ref = null; // Currently, key can be spread in as a prop. This causes a potential - // issue if key is also explicitly declared (ie. <div {...props} key="Hi" /> - // or <div key="Hi" {...props} /> ). We want to deprecate key spread, - // but as an intermediary step, we will use jsxDEV for everything except - // <div {...props} key="Hi" />, because we aren't currently able to tell if - // key is explicitly declared to be undefined or not. + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } - if (maybeKey !== undefined) { - key = '' + maybeKey; - } + { + if (Object.freeze) { + Object.freeze(childArray); + } + } - if (hasValidKey(config)) { - key = '' + config.key; - } + props.children = childArray; + } // Resolve default props - if (hasValidRef(config)) { - ref = config.ref; - } // Remaining properties are added to a new props object + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; - for (propName in config) { - if (hasOwnProperty$1.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { - props[propName] = config[propName]; + for (propName in defaultProps) { + if (props[propName] === undefined) { + props[propName] = defaultProps[propName]; + } + } } - } // Resolve default props + { + if (key || ref) { + var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; - if (type && type.defaultProps) { - var defaultProps = type.defaultProps; + if (key) { + defineKeyPropWarningGetter(props, displayName); + } - for (propName in defaultProps) { - if (props[propName] === undefined) { - props[propName] = defaultProps[propName]; + if (ref) { + defineRefPropWarningGetter(props, displayName); + } } } - } - if (key || ref) { - var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; + return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); + } + function cloneAndReplaceKey(oldElement, newKey) { + var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); + return newElement; + } + /** + * Clone and return a new ReactElement using element as the starting point. + * See https://reactjs.org/docs/react-api.html#cloneelement + */ - if (key) { - defineKeyPropWarningGetter(props, displayName); + function cloneElement(element, config, children) { + if (!!(element === null || element === undefined)) { + { + throw Error( "React.cloneElement(...): The argument must be a React element, but you passed " + element + "." ); + } } - if (ref) { - defineRefPropWarningGetter(props, displayName); - } - } + var propName; // Original props are copied - return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); -} -/** - * Create and return a new ReactElement of the given type. - * See https://reactjs.org/docs/react-api.html#createelement - */ + var props = objectAssign({}, element.props); // Reserved names are extracted -function createElement(type, config, children) { - var propName; // Reserved names are extracted - var props = {}; - var key = null; - var ref = null; - var self = null; - var source = null; + var key = element.key; + var ref = element.ref; // Self is preserved since the owner is preserved. - if (config != null) { - if (hasValidRef(config)) { - ref = config.ref; - } + var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a + // transpiler, and the original source is probably a better indicator of the + // true owner. - if (hasValidKey(config)) { - key = '' + config.key; - } + var source = element._source; // Owner will be preserved, unless ref is overridden - self = config.__self === undefined ? null : config.__self; - source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object + var owner = element._owner; - for (propName in config) { - if (hasOwnProperty$1.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { - props[propName] = config[propName]; + if (config != null) { + if (hasValidRef(config)) { + // Silently steal the ref from the parent. + ref = config.ref; + owner = ReactCurrentOwner.current; } - } - } // Children can be more than one argument, and those are transferred onto - // the newly allocated props object. + if (hasValidKey(config)) { + key = '' + config.key; + } // Remaining properties override existing props - var childrenLength = arguments.length - 2; - if (childrenLength === 1) { - props.children = children; - } else if (childrenLength > 1) { - var childArray = Array(childrenLength); + var defaultProps; - for (var i = 0; i < childrenLength; i++) { - childArray[i] = arguments[i + 2]; - } + if (element.type && element.type.defaultProps) { + defaultProps = element.type.defaultProps; + } - { - if (Object.freeze) { - Object.freeze(childArray); + for (propName in config) { + if (hasOwnProperty$1.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + if (config[propName] === undefined && defaultProps !== undefined) { + // Resolve default props + props[propName] = defaultProps[propName]; + } else { + props[propName] = config[propName]; + } + } } - } + } // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. - props.children = childArray; - } // Resolve default props + var childrenLength = arguments.length - 2; - if (type && type.defaultProps) { - var defaultProps = type.defaultProps; + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); - for (propName in defaultProps) { - if (props[propName] === undefined) { - props[propName] = defaultProps[propName]; + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; } + + props.children = childArray; } + + return ReactElement(element.type, key, ref, self, source, owner, props); } + /** + * Verifies the object is a ReactElement. + * See https://reactjs.org/docs/react-api.html#isvalidelement + * @param {?object} object + * @return {boolean} True if `object` is a ReactElement. + * @final + */ - { - if (key || ref) { - var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; + function isValidElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; + } - if (key) { - defineKeyPropWarningGetter(props, displayName); - } + var SEPARATOR = '.'; + var SUBSEPARATOR = ':'; + /** + * Escape and wrap key so it is safe to use as a reactid + * + * @param {string} key to be escaped. + * @return {string} the escaped key. + */ - if (ref) { - defineRefPropWarningGetter(props, displayName); - } - } + function escape(key) { + var escapeRegex = /[=:]/g; + var escaperLookup = { + '=': '=0', + ':': '=2' + }; + var escapedString = ('' + key).replace(escapeRegex, function (match) { + return escaperLookup[match]; + }); + return '$' + escapedString; } - - return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); -} -/** - * Return a function that produces ReactElements of a given type. - * See https://reactjs.org/docs/react-api.html#createfactory - */ + /** + * TODO: Test that a single child and an array with one item have the same key + * pattern. + */ -function cloneAndReplaceKey(oldElement, newKey) { - var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); - return newElement; -} -/** - * Clone and return a new ReactElement using element as the starting point. - * See https://reactjs.org/docs/react-api.html#cloneelement - */ + var didWarnAboutMaps = false; + var userProvidedKeyEscapeRegex = /\/+/g; -function cloneElement(element, config, children) { - if (!!(element === null || element === undefined)) { - { - throw Error("React.cloneElement(...): The argument must be a React element, but you passed " + element + "."); - } + function escapeUserProvidedKey(text) { + return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/'); } - var propName; // Original props are copied - - var props = objectAssign({}, element.props); // Reserved names are extracted + var POOL_SIZE = 10; + var traverseContextPool = []; + function getPooledTraverseContext(mapResult, keyPrefix, mapFunction, mapContext) { + if (traverseContextPool.length) { + var traverseContext = traverseContextPool.pop(); + traverseContext.result = mapResult; + traverseContext.keyPrefix = keyPrefix; + traverseContext.func = mapFunction; + traverseContext.context = mapContext; + traverseContext.count = 0; + return traverseContext; + } else { + return { + result: mapResult, + keyPrefix: keyPrefix, + func: mapFunction, + context: mapContext, + count: 0 + }; + } + } - var key = element.key; - var ref = element.ref; // Self is preserved since the owner is preserved. + function releaseTraverseContext(traverseContext) { + traverseContext.result = null; + traverseContext.keyPrefix = null; + traverseContext.func = null; + traverseContext.context = null; + traverseContext.count = 0; - var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a - // transpiler, and the original source is probably a better indicator of the - // true owner. + if (traverseContextPool.length < POOL_SIZE) { + traverseContextPool.push(traverseContext); + } + } + /** + * @param {?*} children Children tree container. + * @param {!string} nameSoFar Name of the key path so far. + * @param {!function} callback Callback to invoke with each child found. + * @param {?*} traverseContext Used to pass information throughout the traversal + * process. + * @return {!number} The number of children in this subtree. + */ - var source = element._source; // Owner will be preserved, unless ref is overridden - var owner = element._owner; + function traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) { + var type = typeof children; - if (config != null) { - if (hasValidRef(config)) { - // Silently steal the ref from the parent. - ref = config.ref; - owner = ReactCurrentOwner.current; + if (type === 'undefined' || type === 'boolean') { + // All of the above are perceived as null. + children = null; } - if (hasValidKey(config)) { - key = '' + config.key; - } // Remaining properties override existing props + var invokeCallback = false; + if (children === null) { + invokeCallback = true; + } else { + switch (type) { + case 'string': + case 'number': + invokeCallback = true; + break; - var defaultProps; - - if (element.type && element.type.defaultProps) { - defaultProps = element.type.defaultProps; - } + case 'object': + switch (children.$$typeof) { + case REACT_ELEMENT_TYPE: + case REACT_PORTAL_TYPE: + invokeCallback = true; + } - for (propName in config) { - if (hasOwnProperty$1.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { - if (config[propName] === undefined && defaultProps !== undefined) { - // Resolve default props - props[propName] = defaultProps[propName]; - } else { - props[propName] = config[propName]; - } } } - } // Children can be more than one argument, and those are transferred onto - // the newly allocated props object. + if (invokeCallback) { + callback(traverseContext, children, // If it's the only child, treat the name as if it was wrapped in an array + // so that it's consistent if the number of children grows. + nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar); + return 1; + } - var childrenLength = arguments.length - 2; - - if (childrenLength === 1) { - props.children = children; - } else if (childrenLength > 1) { - var childArray = Array(childrenLength); + var child; + var nextName; + var subtreeCount = 0; // Count of children found in the current subtree. - for (var i = 0; i < childrenLength; i++) { - childArray[i] = arguments[i + 2]; - } + var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR; - props.children = childArray; - } + if (Array.isArray(children)) { + for (var i = 0; i < children.length; i++) { + child = children[i]; + nextName = nextNamePrefix + getComponentKey(child, i); + subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); + } + } else { + var iteratorFn = getIteratorFn(children); - return ReactElement(element.type, key, ref, self, source, owner, props); -} -/** - * Verifies the object is a ReactElement. - * See https://reactjs.org/docs/react-api.html#isvalidelement - * @param {?object} object - * @return {boolean} True if `object` is a ReactElement. - * @final - */ + if (typeof iteratorFn === 'function') { -function isValidElement(object) { - return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; -} + { + // Warn about using Maps as children + if (iteratorFn === children.entries) { + if (!didWarnAboutMaps) { + warn('Using Maps as children is deprecated and will be removed in ' + 'a future major release. Consider converting children to ' + 'an array of keyed ReactElements instead.'); + } -var SEPARATOR = '.'; -var SUBSEPARATOR = ':'; -/** - * Escape and wrap key so it is safe to use as a reactid - * - * @param {string} key to be escaped. - * @return {string} the escaped key. - */ + didWarnAboutMaps = true; + } + } -function escape(key) { - var escapeRegex = /[=:]/g; - var escaperLookup = { - '=': '=0', - ':': '=2' - }; - var escapedString = ('' + key).replace(escapeRegex, function (match) { - return escaperLookup[match]; - }); - return '$' + escapedString; -} -/** - * TODO: Test that a single child and an array with one item have the same key - * pattern. - */ + var iterator = iteratorFn.call(children); + var step; + var ii = 0; + while (!(step = iterator.next()).done) { + child = step.value; + nextName = nextNamePrefix + getComponentKey(child, ii++); + subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); + } + } else if (type === 'object') { + var addendum = ''; -var didWarnAboutMaps = false; -var userProvidedKeyEscapeRegex = /\/+/g; + { + addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + ReactDebugCurrentFrame.getStackAddendum(); + } -function escapeUserProvidedKey(text) { - return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/'); -} + var childrenString = '' + children; -var POOL_SIZE = 10; -var traverseContextPool = []; + { + { + throw Error( "Objects are not valid as a React child (found: " + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + ")." + addendum ); + } + } + } + } -function getPooledTraverseContext(mapResult, keyPrefix, mapFunction, mapContext) { - if (traverseContextPool.length) { - var traverseContext = traverseContextPool.pop(); - traverseContext.result = mapResult; - traverseContext.keyPrefix = keyPrefix; - traverseContext.func = mapFunction; - traverseContext.context = mapContext; - traverseContext.count = 0; - return traverseContext; - } else { - return { - result: mapResult, - keyPrefix: keyPrefix, - func: mapFunction, - context: mapContext, - count: 0 - }; + return subtreeCount; } -} - -function releaseTraverseContext(traverseContext) { - traverseContext.result = null; - traverseContext.keyPrefix = null; - traverseContext.func = null; - traverseContext.context = null; - traverseContext.count = 0; - - if (traverseContextPool.length < POOL_SIZE) { - traverseContextPool.push(traverseContext); - } -} -/** - * @param {?*} children Children tree container. - * @param {!string} nameSoFar Name of the key path so far. - * @param {!function} callback Callback to invoke with each child found. - * @param {?*} traverseContext Used to pass information throughout the traversal - * process. - * @return {!number} The number of children in this subtree. - */ + /** + * Traverses children that are typically specified as `props.children`, but + * might also be specified through attributes: + * + * - `traverseAllChildren(this.props.children, ...)` + * - `traverseAllChildren(this.props.leftPanelChildren, ...)` + * + * The `traverseContext` is an optional argument that is passed through the + * entire traversal. It can be used to store accumulations or anything else that + * the callback might find relevant. + * + * @param {?*} children Children tree object. + * @param {!function} callback To invoke upon traversing each child. + * @param {?*} traverseContext Context for traversal. + * @return {!number} The number of children in this subtree. + */ -function traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) { - var type = typeof children; + function traverseAllChildren(children, callback, traverseContext) { + if (children == null) { + return 0; + } - if (type === 'undefined' || type === 'boolean') { - // All of the above are perceived as null. - children = null; + return traverseAllChildrenImpl(children, '', callback, traverseContext); } + /** + * Generate a key string that identifies a component within a set. + * + * @param {*} component A component that could contain a manual key. + * @param {number} index Index that is used if a manual key is not provided. + * @return {string} + */ - var invokeCallback = false; - if (children === null) { - invokeCallback = true; - } else { - switch (type) { - case 'string': - case 'number': - invokeCallback = true; - break; + function getComponentKey(component, index) { + // Do some typechecking here since we call this blindly. We want to ensure + // that we don't block potential future ES APIs. + if (typeof component === 'object' && component !== null && component.key != null) { + // Explicit key + return escape(component.key); + } // Implicit key determined by the index in the set - case 'object': - switch (children.$$typeof) { - case REACT_ELEMENT_TYPE: - case REACT_PORTAL_TYPE: - invokeCallback = true; - } - } + return index.toString(36); } - if (invokeCallback) { - callback(traverseContext, children, // If it's the only child, treat the name as if it was wrapped in an array - // so that it's consistent if the number of children grows. - nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar); - return 1; + function forEachSingleChild(bookKeeping, child, name) { + var func = bookKeeping.func, + context = bookKeeping.context; + func.call(context, child, bookKeeping.count++); } + /** + * Iterates through children that are typically specified as `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenforeach + * + * The provided forEachFunc(child, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} forEachFunc + * @param {*} forEachContext Context for forEachContext. + */ - var child; - var nextName; - var subtreeCount = 0; // Count of children found in the current subtree. - - var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR; - if (Array.isArray(children)) { - for (var i = 0; i < children.length; i++) { - child = children[i]; - nextName = nextNamePrefix + getComponentKey(child, i); - subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); + function forEachChildren(children, forEachFunc, forEachContext) { + if (children == null) { + return children; } - } else { - var iteratorFn = getIteratorFn(children); - if (typeof iteratorFn === 'function') { - { - // Warn about using Maps as children - if (iteratorFn === children.entries) { - !didWarnAboutMaps ? warning$1(false, 'Using Maps as children is unsupported and will likely yield ' + 'unexpected results. Convert it to a sequence/iterable of keyed ' + 'ReactElements instead.') : void 0; - didWarnAboutMaps = true; - } - } - - var iterator = iteratorFn.call(children); - var step; - var ii = 0; + var traverseContext = getPooledTraverseContext(null, null, forEachFunc, forEachContext); + traverseAllChildren(children, forEachSingleChild, traverseContext); + releaseTraverseContext(traverseContext); + } - while (!(step = iterator.next()).done) { - child = step.value; - nextName = nextNamePrefix + getComponentKey(child, ii++); - subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); - } - } else if (type === 'object') { - var addendum = ''; + function mapSingleChildIntoContext(bookKeeping, child, childKey) { + var result = bookKeeping.result, + keyPrefix = bookKeeping.keyPrefix, + func = bookKeeping.func, + context = bookKeeping.context; + var mappedChild = func.call(context, child, bookKeeping.count++); - { - addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + ReactDebugCurrentFrame.getStackAddendum(); + if (Array.isArray(mappedChild)) { + mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, function (c) { + return c; + }); + } else if (mappedChild != null) { + if (isValidElement(mappedChild)) { + mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as + // traverseAllChildren used to do for objects as children + keyPrefix + (mappedChild.key && (!child || child.key !== mappedChild.key) ? escapeUserProvidedKey(mappedChild.key) + '/' : '') + childKey); } - var childrenString = '' + children; - - { - { - throw Error("Objects are not valid as a React child (found: " + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + ")." + addendum); - } - } + result.push(mappedChild); } } - return subtreeCount; -} -/** - * Traverses children that are typically specified as `props.children`, but - * might also be specified through attributes: - * - * - `traverseAllChildren(this.props.children, ...)` - * - `traverseAllChildren(this.props.leftPanelChildren, ...)` - * - * The `traverseContext` is an optional argument that is passed through the - * entire traversal. It can be used to store accumulations or anything else that - * the callback might find relevant. - * - * @param {?*} children Children tree object. - * @param {!function} callback To invoke upon traversing each child. - * @param {?*} traverseContext Context for traversal. - * @return {!number} The number of children in this subtree. - */ + function mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) { + var escapedPrefix = ''; + if (prefix != null) { + escapedPrefix = escapeUserProvidedKey(prefix) + '/'; + } -function traverseAllChildren(children, callback, traverseContext) { - if (children == null) { - return 0; + var traverseContext = getPooledTraverseContext(array, escapedPrefix, func, context); + traverseAllChildren(children, mapSingleChildIntoContext, traverseContext); + releaseTraverseContext(traverseContext); } + /** + * Maps children that are typically specified as `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenmap + * + * The provided mapFunction(child, key, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} func The map function. + * @param {*} context Context for mapFunction. + * @return {object} Object containing the ordered map of results. + */ - return traverseAllChildrenImpl(children, '', callback, traverseContext); -} -/** - * Generate a key string that identifies a component within a set. - * - * @param {*} component A component that could contain a manual key. - * @param {number} index Index that is used if a manual key is not provided. - * @return {string} - */ - - -function getComponentKey(component, index) { - // Do some typechecking here since we call this blindly. We want to ensure - // that we don't block potential future ES APIs. - if (typeof component === 'object' && component !== null && component.key != null) { - // Explicit key - return escape(component.key); - } // Implicit key determined by the index in the set - - - return index.toString(36); -} - -function forEachSingleChild(bookKeeping, child, name) { - var func = bookKeeping.func, - context = bookKeeping.context; - func.call(context, child, bookKeeping.count++); -} -/** - * Iterates through children that are typically specified as `props.children`. - * - * See https://reactjs.org/docs/react-api.html#reactchildrenforeach - * - * The provided forEachFunc(child, index) will be called for each - * leaf child. - * - * @param {?*} children Children tree container. - * @param {function(*, int)} forEachFunc - * @param {*} forEachContext Context for forEachContext. - */ + function mapChildren(children, func, context) { + if (children == null) { + return children; + } -function forEachChildren(children, forEachFunc, forEachContext) { - if (children == null) { - return children; + var result = []; + mapIntoWithKeyPrefixInternal(children, result, null, func, context); + return result; } + /** + * Count the number of children that are typically specified as + * `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrencount + * + * @param {?*} children Children tree container. + * @return {number} The number of children. + */ - var traverseContext = getPooledTraverseContext(null, null, forEachFunc, forEachContext); - traverseAllChildren(children, forEachSingleChild, traverseContext); - releaseTraverseContext(traverseContext); -} - -function mapSingleChildIntoContext(bookKeeping, child, childKey) { - var result = bookKeeping.result, - keyPrefix = bookKeeping.keyPrefix, - func = bookKeeping.func, - context = bookKeeping.context; - var mappedChild = func.call(context, child, bookKeeping.count++); - if (Array.isArray(mappedChild)) { - mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, function (c) { - return c; - }); - } else if (mappedChild != null) { - if (isValidElement(mappedChild)) { - mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as - // traverseAllChildren used to do for objects as children - keyPrefix + (mappedChild.key && (!child || child.key !== mappedChild.key) ? escapeUserProvidedKey(mappedChild.key) + '/' : '') + childKey); - } - - result.push(mappedChild); + function countChildren(children) { + return traverseAllChildren(children, function () { + return null; + }, null); } -} + /** + * Flatten a children object (typically specified as `props.children`) and + * return an array with appropriately re-keyed children. + * + * See https://reactjs.org/docs/react-api.html#reactchildrentoarray + */ -function mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) { - var escapedPrefix = ''; - if (prefix != null) { - escapedPrefix = escapeUserProvidedKey(prefix) + '/'; + function toArray(children) { + var result = []; + mapIntoWithKeyPrefixInternal(children, result, null, function (child) { + return child; + }); + return result; } + /** + * Returns the first child in a collection of children and verifies that there + * is only one child in the collection. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenonly + * + * The current implementation of this function assumes that a single child gets + * passed without a wrapper, but the purpose of this helper function is to + * abstract away the particular structure of children. + * + * @param {?object} children Child collection structure. + * @return {ReactElement} The first and only `ReactElement` contained in the + * structure. + */ - var traverseContext = getPooledTraverseContext(array, escapedPrefix, func, context); - traverseAllChildren(children, mapSingleChildIntoContext, traverseContext); - releaseTraverseContext(traverseContext); -} -/** - * Maps children that are typically specified as `props.children`. - * - * See https://reactjs.org/docs/react-api.html#reactchildrenmap - * - * The provided mapFunction(child, key, index) will be called for each - * leaf child. - * - * @param {?*} children Children tree container. - * @param {function(*, int)} func The map function. - * @param {*} context Context for mapFunction. - * @return {object} Object containing the ordered map of results. - */ + function onlyChild(children) { + if (!isValidElement(children)) { + { + throw Error( "React.Children.only expected to receive a single React element child." ); + } + } -function mapChildren(children, func, context) { - if (children == null) { return children; } - var result = []; - mapIntoWithKeyPrefixInternal(children, result, null, func, context); - return result; -} -/** - * Count the number of children that are typically specified as - * `props.children`. - * - * See https://reactjs.org/docs/react-api.html#reactchildrencount - * - * @param {?*} children Children tree container. - * @return {number} The number of children. - */ + function createContext(defaultValue, calculateChangedBits) { + if (calculateChangedBits === undefined) { + calculateChangedBits = null; + } else { + { + if (calculateChangedBits !== null && typeof calculateChangedBits !== 'function') { + error('createContext: Expected the optional second argument to be a ' + 'function. Instead received: %s', calculateChangedBits); + } + } + } + var context = { + $$typeof: REACT_CONTEXT_TYPE, + _calculateChangedBits: calculateChangedBits, + // As a workaround to support multiple concurrent renderers, we categorize + // some renderers as primary and others as secondary. We only expect + // there to be two concurrent renderers at most: React Native (primary) and + // Fabric (secondary); React DOM (primary) and React ART (secondary). + // Secondary renderers store their context values on separate fields. + _currentValue: defaultValue, + _currentValue2: defaultValue, + // Used to track how many concurrent renderers this context currently + // supports within in a single renderer. Such as parallel server rendering. + _threadCount: 0, + // These are circular + Provider: null, + Consumer: null + }; + context.Provider = { + $$typeof: REACT_PROVIDER_TYPE, + _context: context + }; + var hasWarnedAboutUsingNestedContextConsumers = false; + var hasWarnedAboutUsingConsumerProvider = false; -function countChildren(children) { - return traverseAllChildren(children, function () { - return null; - }, null); -} -/** - * Flatten a children object (typically specified as `props.children`) and - * return an array with appropriately re-keyed children. - * - * See https://reactjs.org/docs/react-api.html#reactchildrentoarray - */ + { + // A separate object, but proxies back to the original context object for + // backwards compatibility. It has a different $$typeof, so we can properly + // warn for the incorrect usage of Context as a Consumer. + var Consumer = { + $$typeof: REACT_CONTEXT_TYPE, + _context: context, + _calculateChangedBits: context._calculateChangedBits + }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here + + Object.defineProperties(Consumer, { + Provider: { + get: function () { + if (!hasWarnedAboutUsingConsumerProvider) { + hasWarnedAboutUsingConsumerProvider = true; + + error('Rendering <Context.Consumer.Provider> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Provider> instead?'); + } + + return context.Provider; + }, + set: function (_Provider) { + context.Provider = _Provider; + } + }, + _currentValue: { + get: function () { + return context._currentValue; + }, + set: function (_currentValue) { + context._currentValue = _currentValue; + } + }, + _currentValue2: { + get: function () { + return context._currentValue2; + }, + set: function (_currentValue2) { + context._currentValue2 = _currentValue2; + } + }, + _threadCount: { + get: function () { + return context._threadCount; + }, + set: function (_threadCount) { + context._threadCount = _threadCount; + } + }, + Consumer: { + get: function () { + if (!hasWarnedAboutUsingNestedContextConsumers) { + hasWarnedAboutUsingNestedContextConsumers = true; + error('Rendering <Context.Consumer.Consumer> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?'); + } -function toArray(children) { - var result = []; - mapIntoWithKeyPrefixInternal(children, result, null, function (child) { - return child; - }); - return result; -} -/** - * Returns the first child in a collection of children and verifies that there - * is only one child in the collection. - * - * See https://reactjs.org/docs/react-api.html#reactchildrenonly - * - * The current implementation of this function assumes that a single child gets - * passed without a wrapper, but the purpose of this helper function is to - * abstract away the particular structure of children. - * - * @param {?object} children Child collection structure. - * @return {ReactElement} The first and only `ReactElement` contained in the - * structure. - */ + return context.Consumer; + } + } + }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty + context.Consumer = Consumer; + } -function onlyChild(children) { - if (!isValidElement(children)) { { - throw Error("React.Children.only expected to receive a single React element child."); + context._currentRenderer = null; + context._currentRenderer2 = null; } + + return context; } - return children; -} + function lazy(ctor) { + var lazyType = { + $$typeof: REACT_LAZY_TYPE, + _ctor: ctor, + // React uses these fields to store the result. + _status: -1, + _result: null + }; -function createContext(defaultValue, calculateChangedBits) { - if (calculateChangedBits === undefined) { - calculateChangedBits = null; - } else { { - !(calculateChangedBits === null || typeof calculateChangedBits === 'function') ? warningWithoutStack$1(false, 'createContext: Expected the optional second argument to be a ' + 'function. Instead received: %s', calculateChangedBits) : void 0; - } - } - - var context = { - $$typeof: REACT_CONTEXT_TYPE, - _calculateChangedBits: calculateChangedBits, - // As a workaround to support multiple concurrent renderers, we categorize - // some renderers as primary and others as secondary. We only expect - // there to be two concurrent renderers at most: React Native (primary) and - // Fabric (secondary); React DOM (primary) and React ART (secondary). - // Secondary renderers store their context values on separate fields. - _currentValue: defaultValue, - _currentValue2: defaultValue, - // Used to track how many concurrent renderers this context currently - // supports within in a single renderer. Such as parallel server rendering. - _threadCount: 0, - // These are circular - Provider: null, - Consumer: null - }; - context.Provider = { - $$typeof: REACT_PROVIDER_TYPE, - _context: context - }; - var hasWarnedAboutUsingNestedContextConsumers = false; - var hasWarnedAboutUsingConsumerProvider = false; - - { - // A separate object, but proxies back to the original context object for - // backwards compatibility. It has a different $$typeof, so we can properly - // warn for the incorrect usage of Context as a Consumer. - var Consumer = { - $$typeof: REACT_CONTEXT_TYPE, - _context: context, - _calculateChangedBits: context._calculateChangedBits - }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here - - Object.defineProperties(Consumer, { - Provider: { - get: function () { - if (!hasWarnedAboutUsingConsumerProvider) { - hasWarnedAboutUsingConsumerProvider = true; - warning$1(false, 'Rendering <Context.Consumer.Provider> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Provider> instead?'); + // In production, this would just set it on the object. + var defaultProps; + var propTypes; + Object.defineProperties(lazyType, { + defaultProps: { + configurable: true, + get: function () { + return defaultProps; + }, + set: function (newDefaultProps) { + error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); + + defaultProps = newDefaultProps; // Match production behavior more closely: + + Object.defineProperty(lazyType, 'defaultProps', { + enumerable: true + }); } - - return context.Provider; - }, - set: function (_Provider) { - context.Provider = _Provider; - } - }, - _currentValue: { - get: function () { - return context._currentValue; - }, - set: function (_currentValue) { - context._currentValue = _currentValue; - } - }, - _currentValue2: { - get: function () { - return context._currentValue2; - }, - set: function (_currentValue2) { - context._currentValue2 = _currentValue2; - } - }, - _threadCount: { - get: function () { - return context._threadCount; }, - set: function (_threadCount) { - context._threadCount = _threadCount; - } - }, - Consumer: { - get: function () { - if (!hasWarnedAboutUsingNestedContextConsumers) { - hasWarnedAboutUsingNestedContextConsumers = true; - warning$1(false, 'Rendering <Context.Consumer.Consumer> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?'); + propTypes: { + configurable: true, + get: function () { + return propTypes; + }, + set: function (newPropTypes) { + error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); + + propTypes = newPropTypes; // Match production behavior more closely: + + Object.defineProperty(lazyType, 'propTypes', { + enumerable: true + }); } - - return context.Consumer; } - } - }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty - - context.Consumer = Consumer; - } + }); + } - { - context._currentRenderer = null; - context._currentRenderer2 = null; + return lazyType; } - return context; -} - -function lazy(ctor) { - var lazyType = { - $$typeof: REACT_LAZY_TYPE, - _ctor: ctor, - // React uses these fields to store the result. - _status: -1, - _result: null - }; - - { - // In production, this would just set it on the object. - var defaultProps; - var propTypes; - Object.defineProperties(lazyType, { - defaultProps: { - configurable: true, - get: function () { - return defaultProps; - }, - set: function (newDefaultProps) { - warning$1(false, 'React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); - defaultProps = newDefaultProps; // Match production behavior more closely: - - Object.defineProperty(lazyType, 'defaultProps', { - enumerable: true - }); + function forwardRef(render) { + { + if (render != null && render.$$typeof === REACT_MEMO_TYPE) { + error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).'); + } else if (typeof render !== 'function') { + error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render); + } else { + if (render.length !== 0 && render.length !== 2) { + error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.'); } - }, - propTypes: { - configurable: true, - get: function () { - return propTypes; - }, - set: function (newPropTypes) { - warning$1(false, 'React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); - propTypes = newPropTypes; // Match production behavior more closely: + } - Object.defineProperty(lazyType, 'propTypes', { - enumerable: true - }); + if (render != null) { + if (render.defaultProps != null || render.propTypes != null) { + error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?'); } } - }); - } - - return lazyType; -} - -function forwardRef(render) { - { - if (render != null && render.$$typeof === REACT_MEMO_TYPE) { - warningWithoutStack$1(false, 'forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).'); - } else if (typeof render !== 'function') { - warningWithoutStack$1(false, 'forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render); - } else { - !( // Do not warn for 0 arguments because it could be due to usage of the 'arguments' object - render.length === 0 || render.length === 2) ? warningWithoutStack$1(false, 'forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.') : void 0; } - if (render != null) { - !(render.defaultProps == null && render.propTypes == null) ? warningWithoutStack$1(false, 'forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?') : void 0; - } + return { + $$typeof: REACT_FORWARD_REF_TYPE, + render: render + }; } - return { - $$typeof: REACT_FORWARD_REF_TYPE, - render: render - }; -} - -function isValidElementType(type) { - return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill. - type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE); -} - -function memo(type, compare) { - { - if (!isValidElementType(type)) { - warningWithoutStack$1(false, 'memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type); - } + function isValidElementType(type) { + return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill. + type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE); } - return { - $$typeof: REACT_MEMO_TYPE, - type: type, - compare: compare === undefined ? null : compare - }; -} - -function resolveDispatcher() { - var dispatcher = ReactCurrentDispatcher.current; - - if (!(dispatcher !== null)) { + function memo(type, compare) { { - throw Error("Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem."); + if (!isValidElementType(type)) { + error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type); + } } - } - - return dispatcher; -} -function useContext(Context, unstable_observedBits) { - var dispatcher = resolveDispatcher(); - - { - !(unstable_observedBits === undefined) ? warning$1(false, 'useContext() second argument is reserved for future ' + 'use in React. Passing it is not supported. ' + 'You passed: %s.%s', unstable_observedBits, typeof unstable_observedBits === 'number' && Array.isArray(arguments[2]) ? '\n\nDid you call array.map(useContext)? ' + 'Calling Hooks inside a loop is not supported. ' + 'Learn more at https://fb.me/rules-of-hooks' : '') : void 0; // TODO: add a more generic warning for invalid values. - - if (Context._context !== undefined) { - var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs - // and nobody should be using this in existing code. - - if (realContext.Consumer === Context) { - warning$1(false, 'Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?'); - } else if (realContext.Provider === Context) { - warning$1(false, 'Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?'); - } - } - } - - return dispatcher.useContext(Context, unstable_observedBits); -} -function useState(initialState) { - var dispatcher = resolveDispatcher(); - return dispatcher.useState(initialState); -} -function useReducer(reducer, initialArg, init) { - var dispatcher = resolveDispatcher(); - return dispatcher.useReducer(reducer, initialArg, init); -} -function useRef(initialValue) { - var dispatcher = resolveDispatcher(); - return dispatcher.useRef(initialValue); -} -function useEffect(create, inputs) { - var dispatcher = resolveDispatcher(); - return dispatcher.useEffect(create, inputs); -} -function useLayoutEffect(create, inputs) { - var dispatcher = resolveDispatcher(); - return dispatcher.useLayoutEffect(create, inputs); -} -function useCallback(callback, inputs) { - var dispatcher = resolveDispatcher(); - return dispatcher.useCallback(callback, inputs); -} -function useMemo(create, inputs) { - var dispatcher = resolveDispatcher(); - return dispatcher.useMemo(create, inputs); -} -function useImperativeHandle(ref, create, inputs) { - var dispatcher = resolveDispatcher(); - return dispatcher.useImperativeHandle(ref, create, inputs); -} -function useDebugValue(value, formatterFn) { - { - var dispatcher = resolveDispatcher(); - return dispatcher.useDebugValue(value, formatterFn); - } -} -var emptyObject$1 = {}; -function useResponder(responder, listenerProps) { - var dispatcher = resolveDispatcher(); - - { - if (responder == null || responder.$$typeof !== REACT_RESPONDER_TYPE) { - warning$1(false, 'useResponder: invalid first argument. Expected an event responder, but instead got %s', responder); - return; - } + return { + $$typeof: REACT_MEMO_TYPE, + type: type, + compare: compare === undefined ? null : compare + }; } - return dispatcher.useResponder(responder, listenerProps || emptyObject$1); -} -function useTransition(config) { - var dispatcher = resolveDispatcher(); - return dispatcher.useTransition(config); -} -function useDeferredValue(value, config) { - var dispatcher = resolveDispatcher(); - return dispatcher.useDeferredValue(value, config); -} + function resolveDispatcher() { + var dispatcher = ReactCurrentDispatcher.current; -function withSuspenseConfig(scope, config) { - var previousConfig = ReactCurrentBatchConfig.suspense; - ReactCurrentBatchConfig.suspense = config === undefined ? null : config; + if (!(dispatcher !== null)) { + { + throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem." ); + } + } - try { - scope(); - } finally { - ReactCurrentBatchConfig.suspense = previousConfig; + return dispatcher; } -} - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - - -var ReactPropTypesSecret$1 = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; - -var ReactPropTypesSecret_1 = ReactPropTypesSecret$1; - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - -var printWarning$1 = function() {}; - -{ - var ReactPropTypesSecret = ReactPropTypesSecret_1; - var loggedTypeFailures = {}; - var has = Function.call.bind(Object.prototype.hasOwnProperty); + function useContext(Context, unstable_observedBits) { + var dispatcher = resolveDispatcher(); - printWarning$1 = function(text) { - var message = 'Warning: ' + text; - if (typeof console !== 'undefined') { - console.error(message); - } - try { - // --- Welcome to debugging React --- - // This error was thrown as a convenience so that you can use this stack - // to find the callsite that caused this warning to fire. - throw new Error(message); - } catch (x) {} - }; -} + { + if (unstable_observedBits !== undefined) { + error('useContext() second argument is reserved for future ' + 'use in React. Passing it is not supported. ' + 'You passed: %s.%s', unstable_observedBits, typeof unstable_observedBits === 'number' && Array.isArray(arguments[2]) ? '\n\nDid you call array.map(useContext)? ' + 'Calling Hooks inside a loop is not supported. ' + 'Learn more at https://fb.me/rules-of-hooks' : ''); + } // TODO: add a more generic warning for invalid values. -/** - * Assert that the values match with the type specs. - * Error messages are memorized and will only be shown once. - * - * @param {object} typeSpecs Map of name to a ReactPropType - * @param {object} values Runtime values that need to be type-checked - * @param {string} location e.g. "prop", "context", "child context" - * @param {string} componentName Name of the component for error messages. - * @param {?Function} getStack Returns the component stack. - * @private - */ -function checkPropTypes(typeSpecs, values, location, componentName, getStack) { - { - for (var typeSpecName in typeSpecs) { - if (has(typeSpecs, typeSpecName)) { - var error; - // Prop type validation may throw. In case they do, we don't want to - // fail the render phase where it didn't fail before. So we log it. - // After these have been cleaned up, we'll let them throw. - try { - // This is intentionally an invariant that gets caught. It's the same - // behavior as without this statement except with a better message. - if (typeof typeSpecs[typeSpecName] !== 'function') { - var err = Error( - (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + - 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' - ); - err.name = 'Invariant Violation'; - throw err; - } - error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret); - } catch (ex) { - error = ex; - } - if (error && !(error instanceof Error)) { - printWarning$1( - (componentName || 'React class') + ': type specification of ' + - location + ' `' + typeSpecName + '` is invalid; the type checker ' + - 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' + - 'You may have forgotten to pass an argument to the type checker ' + - 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + - 'shape all require an argument).' - ); - } - if (error instanceof Error && !(error.message in loggedTypeFailures)) { - // Only monitor this failure once because there tends to be a lot of the - // same error. - loggedTypeFailures[error.message] = true; - var stack = getStack ? getStack() : ''; + if (Context._context !== undefined) { + var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs + // and nobody should be using this in existing code. - printWarning$1( - 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '') - ); + if (realContext.Consumer === Context) { + error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?'); + } else if (realContext.Provider === Context) { + error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?'); } } } - } -} -/** - * Resets warning cache when testing. - * - * @private - */ -checkPropTypes.resetWarningCache = function() { - { - loggedTypeFailures = {}; + return dispatcher.useContext(Context, unstable_observedBits); } -}; - -var checkPropTypes_1 = checkPropTypes; - -/** - * ReactElementValidator provides a wrapper around a element factory - * which validates the props passed to the element. This is intended to be - * used only in DEV and could be replaced by a static type checker for languages - * that support it. - */ -var propTypesMisspellWarningShown; - -{ - propTypesMisspellWarningShown = false; -} - -var hasOwnProperty$2 = Object.prototype.hasOwnProperty; - -function getDeclarationErrorAddendum() { - if (ReactCurrentOwner.current) { - var name = getComponentName(ReactCurrentOwner.current.type); - - if (name) { - return '\n\nCheck the render method of `' + name + '`.'; - } + function useState(initialState) { + var dispatcher = resolveDispatcher(); + return dispatcher.useState(initialState); } - - return ''; -} - -function getSourceInfoErrorAddendum(source) { - if (source !== undefined) { - var fileName = source.fileName.replace(/^.*[\\\/]/, ''); - var lineNumber = source.lineNumber; - return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; + function useReducer(reducer, initialArg, init) { + var dispatcher = resolveDispatcher(); + return dispatcher.useReducer(reducer, initialArg, init); } - - return ''; -} - -function getSourceInfoErrorAddendumForProps(elementProps) { - if (elementProps !== null && elementProps !== undefined) { - return getSourceInfoErrorAddendum(elementProps.__source); + function useRef(initialValue) { + var dispatcher = resolveDispatcher(); + return dispatcher.useRef(initialValue); } - - return ''; -} -/** - * Warn if there's no key explicitly set on dynamic arrays of children or - * object keys are not valid. This allows us to keep track of children between - * updates. - */ - - -var ownerHasKeyUseWarning = {}; - -function getCurrentComponentErrorInfo(parentType) { - var info = getDeclarationErrorAddendum(); - - if (!info) { - var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; - - if (parentName) { - info = "\n\nCheck the top-level render call using <" + parentName + ">."; + function useEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useEffect(create, deps); + } + function useLayoutEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useLayoutEffect(create, deps); + } + function useCallback(callback, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useCallback(callback, deps); + } + function useMemo(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useMemo(create, deps); + } + function useImperativeHandle(ref, create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useImperativeHandle(ref, create, deps); + } + function useDebugValue(value, formatterFn) { + { + var dispatcher = resolveDispatcher(); + return dispatcher.useDebugValue(value, formatterFn); } } - return info; -} -/** - * Warn if the element doesn't have an explicit key assigned to it. - * This element is in an array. The array could grow and shrink or be - * reordered. All children that haven't already been validated are required to - * have a "key" property assigned to it. Error statuses are cached so a warning - * will only be shown once. - * - * @internal - * @param {ReactElement} element Element that requires a key. - * @param {*} parentType element's parent's type. - */ + /** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; -function validateExplicitKey(element, parentType) { - if (!element._store || element._store.validated || element.key != null) { - return; - } + var ReactPropTypesSecret_1 = ReactPropTypesSecret; - element._store.validated = true; - var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); + var printWarning$1 = function() {}; - if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { - return; + { + var ReactPropTypesSecret$1 = ReactPropTypesSecret_1; + var loggedTypeFailures = {}; + var has = Function.call.bind(Object.prototype.hasOwnProperty); + + printWarning$1 = function(text) { + var message = 'Warning: ' + text; + if (typeof console !== 'undefined') { + console.error(message); + } + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) {} + }; } - ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a - // property, it may be the creator of the child that's responsible for - // assigning it a key. + /** + * Assert that the values match with the type specs. + * Error messages are memorized and will only be shown once. + * + * @param {object} typeSpecs Map of name to a ReactPropType + * @param {object} values Runtime values that need to be type-checked + * @param {string} location e.g. "prop", "context", "child context" + * @param {string} componentName Name of the component for error messages. + * @param {?Function} getStack Returns the component stack. + * @private + */ + function checkPropTypes(typeSpecs, values, location, componentName, getStack) { + { + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error; + // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + var err = Error( + (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + ); + err.name = 'Invariant Violation'; + throw err; + } + error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret$1); + } catch (ex) { + error = ex; + } + if (error && !(error instanceof Error)) { + printWarning$1( + (componentName || 'React class') + ': type specification of ' + + location + ' `' + typeSpecName + '` is invalid; the type checker ' + + 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' + + 'You may have forgotten to pass an argument to the type checker ' + + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + + 'shape all require an argument).' + ); + } + if (error instanceof Error && !(error.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error.message] = true; - var childOwner = ''; + var stack = getStack ? getStack() : ''; - if (element && element._owner && element._owner !== ReactCurrentOwner.current) { - // Give the component that originally created this child. - childOwner = " It was passed a child from " + getComponentName(element._owner.type) + "."; + printWarning$1( + 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '') + ); + } + } + } + } } - setCurrentlyValidatingElement(element); - - { - warning$1(false, 'Each child in a list should have a unique "key" prop.' + '%s%s See https://fb.me/react-warning-keys for more information.', currentComponentErrorInfo, childOwner); - } + /** + * Resets warning cache when testing. + * + * @private + */ + checkPropTypes.resetWarningCache = function() { + { + loggedTypeFailures = {}; + } + }; - setCurrentlyValidatingElement(null); -} -/** - * Ensure that every element either is passed in a static location, in an - * array with an explicit keys property defined, or in an object literal - * with valid key property. - * - * @internal - * @param {ReactNode} node Statically passed child of any type. - * @param {*} parentType node's parent's type. - */ + var checkPropTypes_1 = checkPropTypes; + var propTypesMisspellWarningShown; -function validateChildKeys(node, parentType) { - if (typeof node !== 'object') { - return; + { + propTypesMisspellWarningShown = false; } - if (Array.isArray(node)) { - for (var i = 0; i < node.length; i++) { - var child = node[i]; + function getDeclarationErrorAddendum() { + if (ReactCurrentOwner.current) { + var name = getComponentName(ReactCurrentOwner.current.type); - if (isValidElement(child)) { - validateExplicitKey(child, parentType); + if (name) { + return '\n\nCheck the render method of `' + name + '`.'; } } - } else if (isValidElement(node)) { - // This element was passed in a valid location. - if (node._store) { - node._store.validated = true; - } - } else if (node) { - var iteratorFn = getIteratorFn(node); - if (typeof iteratorFn === 'function') { - // Entry iterators used to provide implicit keys, - // but now we print a separate warning for them later. - if (iteratorFn !== node.entries) { - var iterator = iteratorFn.call(node); - var step; - - while (!(step = iterator.next()).done) { - if (isValidElement(step.value)) { - validateExplicitKey(step.value, parentType); - } - } - } - } + return ''; } -} -/** - * Given an element, validate that its props follow the propTypes definition, - * provided by the type. - * - * @param {ReactElement} element - */ + function getSourceInfoErrorAddendum(source) { + if (source !== undefined) { + var fileName = source.fileName.replace(/^.*[\\\/]/, ''); + var lineNumber = source.lineNumber; + return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; + } -function validatePropTypes(element) { - var type = element.type; - - if (type === null || type === undefined || typeof type === 'string') { - return; + return ''; } - var name = getComponentName(type); - var propTypes; + function getSourceInfoErrorAddendumForProps(elementProps) { + if (elementProps !== null && elementProps !== undefined) { + return getSourceInfoErrorAddendum(elementProps.__source); + } - if (typeof type === 'function') { - propTypes = type.propTypes; - } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. - // Inner props are checked in the reconciler. - type.$$typeof === REACT_MEMO_TYPE)) { - propTypes = type.propTypes; - } else { - return; - } - - if (propTypes) { - setCurrentlyValidatingElement(element); - checkPropTypes_1(propTypes, element.props, 'prop', name, ReactDebugCurrentFrame.getStackAddendum); - setCurrentlyValidatingElement(null); - } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { - propTypesMisspellWarningShown = true; - warningWithoutStack$1(false, 'Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', name || 'Unknown'); + return ''; } + /** + * Warn if there's no key explicitly set on dynamic arrays of children or + * object keys are not valid. This allows us to keep track of children between + * updates. + */ - if (typeof type.getDefaultProps === 'function') { - !type.getDefaultProps.isReactClassApproved ? warningWithoutStack$1(false, 'getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.') : void 0; - } -} -/** - * Given a fragment, validate that it can only be provided with fragment props - * @param {ReactElement} fragment - */ + var ownerHasKeyUseWarning = {}; -function validateFragmentProps(fragment) { - setCurrentlyValidatingElement(fragment); - var keys = Object.keys(fragment.props); + function getCurrentComponentErrorInfo(parentType) { + var info = getDeclarationErrorAddendum(); - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; + if (!info) { + var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; - if (key !== 'children' && key !== 'key') { - warning$1(false, 'Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); - break; + if (parentName) { + info = "\n\nCheck the top-level render call using <" + parentName + ">."; + } } - } - if (fragment.ref !== null) { - warning$1(false, 'Invalid attribute `ref` supplied to `React.Fragment`.'); + return info; } + /** + * Warn if the element doesn't have an explicit key assigned to it. + * This element is in an array. The array could grow and shrink or be + * reordered. All children that haven't already been validated are required to + * have a "key" property assigned to it. Error statuses are cached so a warning + * will only be shown once. + * + * @internal + * @param {ReactElement} element Element that requires a key. + * @param {*} parentType element's parent's type. + */ - setCurrentlyValidatingElement(null); -} -function jsxWithValidation(type, props, key, isStaticChildren, source, self) { - var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to - // succeed and there will likely be errors in render. + function validateExplicitKey(element, parentType) { + if (!element._store || element._store.validated || element.key != null) { + return; + } - if (!validType) { - var info = ''; + element._store.validated = true; + var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); - if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { - info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; } - var sourceInfo = getSourceInfoErrorAddendum(source); + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a + // property, it may be the creator of the child that's responsible for + // assigning it a key. - if (sourceInfo) { - info += sourceInfo; - } else { - info += getDeclarationErrorAddendum(); + var childOwner = ''; + + if (element && element._owner && element._owner !== ReactCurrentOwner.current) { + // Give the component that originally created this child. + childOwner = " It was passed a child from " + getComponentName(element._owner.type) + "."; } - var typeString; + setCurrentlyValidatingElement(element); - if (type === null) { - typeString = 'null'; - } else if (Array.isArray(type)) { - typeString = 'array'; - } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { - typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />"; - info = ' Did you accidentally export a JSX literal instead of a component?'; - } else { - typeString = typeof type; + { + error('Each child in a list should have a unique "key" prop.' + '%s%s See https://fb.me/react-warning-keys for more information.', currentComponentErrorInfo, childOwner); } - warning$1(false, 'React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); + setCurrentlyValidatingElement(null); } - - var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used. - // TODO: Drop this when these are no longer allowed as the type argument. - - if (element == null) { - return element; - } // Skip key warning if the type isn't valid since our key validation logic - // doesn't expect a non-string/function type and can throw confusing errors. - // We don't want exception behavior to differ between dev and prod. - // (Rendering will throw with a helpful message and as soon as the type is - // fixed, the key warnings will appear.) + /** + * Ensure that every element either is passed in a static location, in an + * array with an explicit keys property defined, or in an object literal + * with valid key property. + * + * @internal + * @param {ReactNode} node Statically passed child of any type. + * @param {*} parentType node's parent's type. + */ - if (validType) { - var children = props.children; + function validateChildKeys(node, parentType) { + if (typeof node !== 'object') { + return; + } - if (children !== undefined) { - if (isStaticChildren) { - if (Array.isArray(children)) { - for (var i = 0; i < children.length; i++) { - validateChildKeys(children[i], type); - } + if (Array.isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; - if (Object.freeze) { - Object.freeze(children); + if (isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (isValidElement(node)) { + // This element was passed in a valid location. + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + + if (typeof iteratorFn === 'function') { + // Entry iterators used to provide implicit keys, + // but now we print a separate warning for them later. + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + + while (!(step = iterator.next()).done) { + if (isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } } - } else { - warning$1(false, 'React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.'); } - } else { - validateChildKeys(children, type); } } } + /** + * Given an element, validate that its props follow the propTypes definition, + * provided by the type. + * + * @param {ReactElement} element + */ - if (hasOwnProperty$2.call(props, 'key')) { - warning$1(false, 'React.jsx: Spreading a key to JSX is a deprecated pattern. ' + 'Explicitly pass a key after spreading props in your JSX call. ' + 'E.g. <ComponentName {...props} key={key} />'); - } - if (type === REACT_FRAGMENT_TYPE) { - validateFragmentProps(element); - } else { - validatePropTypes(element); - } + function validatePropTypes(element) { + { + var type = element.type; - return element; -} // These two functions exist to still get child warnings in dev -// even with the prod transform. This means that jsxDEV is purely -// opt-in behavior for better messages but that we won't stop -// giving you warnings if you use production apis. + if (type === null || type === undefined || typeof type === 'string') { + return; + } -function jsxWithValidationStatic(type, props, key) { - return jsxWithValidation(type, props, key, true); -} -function jsxWithValidationDynamic(type, props, key) { - return jsxWithValidation(type, props, key, false); -} -function createElementWithValidation(type, props, children) { - var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to - // succeed and there will likely be errors in render. + var name = getComponentName(type); + var propTypes; - if (!validType) { - var info = ''; + if (typeof type === 'function') { + propTypes = type.propTypes; + } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. + // Inner props are checked in the reconciler. + type.$$typeof === REACT_MEMO_TYPE)) { + propTypes = type.propTypes; + } else { + return; + } - if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { - info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; - } + if (propTypes) { + setCurrentlyValidatingElement(element); + checkPropTypes_1(propTypes, element.props, 'prop', name, ReactDebugCurrentFrame.getStackAddendum); + setCurrentlyValidatingElement(null); + } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { + propTypesMisspellWarningShown = true; - var sourceInfo = getSourceInfoErrorAddendumForProps(props); + error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', name || 'Unknown'); + } - if (sourceInfo) { - info += sourceInfo; - } else { - info += getDeclarationErrorAddendum(); + if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) { + error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.'); + } } + } + /** + * Given a fragment, validate that it can only be provided with fragment props + * @param {ReactElement} fragment + */ - var typeString; - if (type === null) { - typeString = 'null'; - } else if (Array.isArray(type)) { - typeString = 'array'; - } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { - typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />"; - info = ' Did you accidentally export a JSX literal instead of a component?'; - } else { - typeString = typeof type; - } + function validateFragmentProps(fragment) { + { + setCurrentlyValidatingElement(fragment); + var keys = Object.keys(fragment.props); - warning$1(false, 'React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); - } + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; - var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used. - // TODO: Drop this when these are no longer allowed as the type argument. + if (key !== 'children' && key !== 'key') { + error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); - if (element == null) { - return element; - } // Skip key warning if the type isn't valid since our key validation logic - // doesn't expect a non-string/function type and can throw confusing errors. - // We don't want exception behavior to differ between dev and prod. - // (Rendering will throw with a helpful message and as soon as the type is - // fixed, the key warnings will appear.) + break; + } + } + if (fragment.ref !== null) { + error('Invalid attribute `ref` supplied to `React.Fragment`.'); + } - if (validType) { - for (var i = 2; i < arguments.length; i++) { - validateChildKeys(arguments[i], type); + setCurrentlyValidatingElement(null); } } + function createElementWithValidation(type, props, children) { + var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to + // succeed and there will likely be errors in render. - if (type === REACT_FRAGMENT_TYPE) { - validateFragmentProps(element); - } else { - validatePropTypes(element); - } - - return element; -} -function createFactoryWithValidation(type) { - var validatedFactory = createElementWithValidation.bind(null, type); - validatedFactory.type = type; // Legacy hook: remove it + if (!validType) { + var info = ''; - { - Object.defineProperty(validatedFactory, 'type', { - enumerable: false, - get: function () { - lowPriorityWarningWithoutStack$1(false, 'Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.'); - Object.defineProperty(this, 'type', { - value: type - }); - return type; + if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { + info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; } - }); - } - return validatedFactory; -} -function cloneElementWithValidation(element, props, children) { - var newElement = cloneElement.apply(this, arguments); + var sourceInfo = getSourceInfoErrorAddendumForProps(props); - for (var i = 2; i < arguments.length; i++) { - validateChildKeys(arguments[i], newElement.type); - } - - validatePropTypes(newElement); - return newElement; -} + if (sourceInfo) { + info += sourceInfo; + } else { + info += getDeclarationErrorAddendum(); + } -var enableSchedulerDebugging = false; -var enableIsInputPending = false; -var enableProfiling = true; + var typeString; -var requestHostCallback; + if (type === null) { + typeString = 'null'; + } else if (Array.isArray(type)) { + typeString = 'array'; + } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { + typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />"; + info = ' Did you accidentally export a JSX literal instead of a component?'; + } else { + typeString = typeof type; + } -var requestHostTimeout; -var cancelHostTimeout; -var shouldYieldToHost; -var requestPaint; -var getCurrentTime; -var forceFrameRate; + { + error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); + } + } -if ( // If Scheduler runs in a non-DOM environment, it falls back to a naive -// implementation using setTimeout. -typeof window === 'undefined' || // Check if MessageChannel is supported, too. -typeof MessageChannel !== 'function') { - // If this accidentally gets imported in a non-browser environment, e.g. JavaScriptCore, - // fallback to a naive implementation. - var _callback = null; - var _timeoutID = null; + var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used. + // TODO: Drop this when these are no longer allowed as the type argument. - var _flushCallback = function () { - if (_callback !== null) { - try { - var currentTime = getCurrentTime(); - var hasRemainingTime = true; + if (element == null) { + return element; + } // Skip key warning if the type isn't valid since our key validation logic + // doesn't expect a non-string/function type and can throw confusing errors. + // We don't want exception behavior to differ between dev and prod. + // (Rendering will throw with a helpful message and as soon as the type is + // fixed, the key warnings will appear.) - _callback(hasRemainingTime, currentTime); - _callback = null; - } catch (e) { - setTimeout(_flushCallback, 0); - throw e; + if (validType) { + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], type); } } - }; - - var initialTime = Date.now(); - - getCurrentTime = function () { - return Date.now() - initialTime; - }; - requestHostCallback = function (cb) { - if (_callback !== null) { - // Protect against re-entrancy. - setTimeout(requestHostCallback, 0, cb); + if (type === REACT_FRAGMENT_TYPE) { + validateFragmentProps(element); } else { - _callback = cb; - setTimeout(_flushCallback, 0); + validatePropTypes(element); } - }; - requestHostTimeout = function (cb, ms) { - _timeoutID = setTimeout(cb, ms); - }; + return element; + } + var didWarnAboutDeprecatedCreateFactory = false; + function createFactoryWithValidation(type) { + var validatedFactory = createElementWithValidation.bind(null, type); + validatedFactory.type = type; - cancelHostTimeout = function () { - clearTimeout(_timeoutID); - }; + { + if (!didWarnAboutDeprecatedCreateFactory) { + didWarnAboutDeprecatedCreateFactory = true; - shouldYieldToHost = function () { - return false; - }; + warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.'); + } // Legacy hook: remove it - requestPaint = forceFrameRate = function () {}; -} else { - // Capture local references to native APIs, in case a polyfill overrides them. - var performance = window.performance; - var _Date = window.Date; - var _setTimeout = window.setTimeout; - var _clearTimeout = window.clearTimeout; - if (typeof console !== 'undefined') { - // TODO: Scheduler no longer requires these methods to be polyfilled. But - // maybe we want to continue warning if they don't exist, to preserve the - // option to rely on it in the future? - var requestAnimationFrame = window.requestAnimationFrame; - var cancelAnimationFrame = window.cancelAnimationFrame; // TODO: Remove fb.me link + Object.defineProperty(validatedFactory, 'type', { + enumerable: false, + get: function () { + warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.'); - if (typeof requestAnimationFrame !== 'function') { - console.error("This browser doesn't support requestAnimationFrame. " + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills'); + Object.defineProperty(this, 'type', { + value: type + }); + return type; + } + }); } - if (typeof cancelAnimationFrame !== 'function') { - console.error("This browser doesn't support cancelAnimationFrame. " + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills'); - } + return validatedFactory; } + function cloneElementWithValidation(element, props, children) { + var newElement = cloneElement.apply(this, arguments); - if (typeof performance === 'object' && typeof performance.now === 'function') { - getCurrentTime = function () { - return performance.now(); - }; - } else { - var _initialTime = _Date.now(); + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], newElement.type); + } - getCurrentTime = function () { - return _Date.now() - _initialTime; - }; + validatePropTypes(newElement); + return newElement; } - var isMessageLoopRunning = false; - var scheduledHostCallback = null; - var taskTimeoutID = -1; // Scheduler periodically yields in case there is other work on the main - // thread, like user events. By default, it yields multiple times per frame. - // It does not attempt to align with frame boundaries, since most tasks don't - // need to be frame aligned; for those that do, use requestAnimationFrame. + var enableSchedulerDebugging = false; + var enableProfiling = true; + + var requestHostCallback; + var requestHostTimeout; + var cancelHostTimeout; + var shouldYieldToHost; + var requestPaint; + var getCurrentTime; + var forceFrameRate; - var yieldInterval = 5; - var deadline = 0; // TODO: Make this configurable - // TODO: Adjust this based on priority? + if ( // If Scheduler runs in a non-DOM environment, it falls back to a naive + // implementation using setTimeout. + typeof window === 'undefined' || // Check if MessageChannel is supported, too. + typeof MessageChannel !== 'function') { + // If this accidentally gets imported in a non-browser environment, e.g. JavaScriptCore, + // fallback to a naive implementation. + var _callback = null; + var _timeoutID = null; - var maxYieldInterval = 300; - var needsPaint = false; + var _flushCallback = function () { + if (_callback !== null) { + try { + var currentTime = getCurrentTime(); + var hasRemainingTime = true; - if (enableIsInputPending && navigator !== undefined && navigator.scheduling !== undefined && navigator.scheduling.isInputPending !== undefined) { - var scheduling = navigator.scheduling; + _callback(hasRemainingTime, currentTime); - shouldYieldToHost = function () { - var currentTime = getCurrentTime(); - - if (currentTime >= deadline) { - // There's no time left. We may want to yield control of the main - // thread, so the browser can perform high priority tasks. The main ones - // are painting and user input. If there's a pending paint or a pending - // input, then we should yield. But if there's neither, then we can - // yield less often while remaining responsive. We'll eventually yield - // regardless, since there could be a pending paint that wasn't - // accompanied by a call to `requestPaint`, or other main thread tasks - // like network events. - if (needsPaint || scheduling.isInputPending()) { - // There is either a pending paint or a pending input. - return true; - } // There's no pending input. Only yield if we've reached the max - // yield interval. - - - return currentTime >= maxYieldInterval; + _callback = null; + } catch (e) { + setTimeout(_flushCallback, 0); + throw e; + } + } + }; + + var initialTime = Date.now(); + + getCurrentTime = function () { + return Date.now() - initialTime; + }; + + requestHostCallback = function (cb) { + if (_callback !== null) { + // Protect against re-entrancy. + setTimeout(requestHostCallback, 0, cb); } else { - // There's still time left in the frame. - return false; + _callback = cb; + setTimeout(_flushCallback, 0); } }; - requestPaint = function () { - needsPaint = true; + requestHostTimeout = function (cb, ms) { + _timeoutID = setTimeout(cb, ms); }; - } else { - // `isInputPending` is not available. Since we have no way of knowing if - // there's pending input, always yield at the end of the frame. + + cancelHostTimeout = function () { + clearTimeout(_timeoutID); + }; + shouldYieldToHost = function () { - return getCurrentTime() >= deadline; - }; // Since we yield every frame regardless, `requestPaint` has no effect. + return false; + }; + requestPaint = forceFrameRate = function () {}; + } else { + // Capture local references to native APIs, in case a polyfill overrides them. + var performance = window.performance; + var _Date = window.Date; + var _setTimeout = window.setTimeout; + var _clearTimeout = window.clearTimeout; - requestPaint = function () {}; - } + if (typeof console !== 'undefined') { + // TODO: Scheduler no longer requires these methods to be polyfilled. But + // maybe we want to continue warning if they don't exist, to preserve the + // option to rely on it in the future? + var requestAnimationFrame = window.requestAnimationFrame; + var cancelAnimationFrame = window.cancelAnimationFrame; // TODO: Remove fb.me link + + if (typeof requestAnimationFrame !== 'function') { + // Using console['error'] to evade Babel and ESLint + console['error']("This browser doesn't support requestAnimationFrame. " + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills'); + } - forceFrameRate = function (fps) { - if (fps < 0 || fps > 125) { - console.error('forceFrameRate takes a positive int between 0 and 125, ' + 'forcing framerates higher than 125 fps is not unsupported'); - return; + if (typeof cancelAnimationFrame !== 'function') { + // Using console['error'] to evade Babel and ESLint + console['error']("This browser doesn't support cancelAnimationFrame. " + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills'); + } } - if (fps > 0) { - yieldInterval = Math.floor(1000 / fps); + if (typeof performance === 'object' && typeof performance.now === 'function') { + getCurrentTime = function () { + return performance.now(); + }; } else { - // reset the framerate - yieldInterval = 5; + var _initialTime = _Date.now(); + + getCurrentTime = function () { + return _Date.now() - _initialTime; + }; } - }; - var performWorkUntilDeadline = function () { - if (scheduledHostCallback !== null) { - var currentTime = getCurrentTime(); // Yield after `yieldInterval` ms, regardless of where we are in the vsync - // cycle. This means there's always time remaining at the beginning of - // the message event. + var isMessageLoopRunning = false; + var scheduledHostCallback = null; + var taskTimeoutID = -1; // Scheduler periodically yields in case there is other work on the main + // thread, like user events. By default, it yields multiple times per frame. + // It does not attempt to align with frame boundaries, since most tasks don't + // need to be frame aligned; for those that do, use requestAnimationFrame. - deadline = currentTime + yieldInterval; - var hasTimeRemaining = true; + var yieldInterval = 5; + var deadline = 0; // TODO: Make this configurable - try { - var hasMoreWork = scheduledHostCallback(hasTimeRemaining, currentTime); + { + // `isInputPending` is not available. Since we have no way of knowing if + // there's pending input, always yield at the end of the frame. + shouldYieldToHost = function () { + return getCurrentTime() >= deadline; + }; // Since we yield every frame regardless, `requestPaint` has no effect. - if (!hasMoreWork) { - isMessageLoopRunning = false; - scheduledHostCallback = null; - } else { - // If there's more work, schedule the next message event at the end - // of the preceding one. - port.postMessage(null); - } - } catch (error) { - // If a scheduler task throws, exit the current browser task so the - // error can be observed. - port.postMessage(null); - throw error; - } - } else { - isMessageLoopRunning = false; - } // Yielding to the browser will give it a chance to paint, so we can - // reset this. + requestPaint = function () {}; + } - needsPaint = false; - }; + forceFrameRate = function (fps) { + if (fps < 0 || fps > 125) { + // Using console['error'] to evade Babel and ESLint + console['error']('forceFrameRate takes a positive int between 0 and 125, ' + 'forcing framerates higher than 125 fps is not unsupported'); + return; + } - var channel = new MessageChannel(); - var port = channel.port2; - channel.port1.onmessage = performWorkUntilDeadline; + if (fps > 0) { + yieldInterval = Math.floor(1000 / fps); + } else { + // reset the framerate + yieldInterval = 5; + } + }; - requestHostCallback = function (callback) { - scheduledHostCallback = callback; + var performWorkUntilDeadline = function () { + if (scheduledHostCallback !== null) { + var currentTime = getCurrentTime(); // Yield after `yieldInterval` ms, regardless of where we are in the vsync + // cycle. This means there's always time remaining at the beginning of + // the message event. - if (!isMessageLoopRunning) { - isMessageLoopRunning = true; - port.postMessage(null); - } - }; + deadline = currentTime + yieldInterval; + var hasTimeRemaining = true; - requestHostTimeout = function (callback, ms) { - taskTimeoutID = _setTimeout(function () { - callback(getCurrentTime()); - }, ms); - }; + try { + var hasMoreWork = scheduledHostCallback(hasTimeRemaining, currentTime); + + if (!hasMoreWork) { + isMessageLoopRunning = false; + scheduledHostCallback = null; + } else { + // If there's more work, schedule the next message event at the end + // of the preceding one. + port.postMessage(null); + } + } catch (error) { + // If a scheduler task throws, exit the current browser task so the + // error can be observed. + port.postMessage(null); + throw error; + } + } else { + isMessageLoopRunning = false; + } // Yielding to the browser will give it a chance to paint, so we can + }; - cancelHostTimeout = function () { - _clearTimeout(taskTimeoutID); + var channel = new MessageChannel(); + var port = channel.port2; + channel.port1.onmessage = performWorkUntilDeadline; - taskTimeoutID = -1; - }; -} + requestHostCallback = function (callback) { + scheduledHostCallback = callback; -function push(heap, node) { - var index = heap.length; - heap.push(node); - siftUp(heap, node, index); -} -function peek(heap) { - var first = heap[0]; - return first === undefined ? null : first; -} -function pop(heap) { - var first = heap[0]; + if (!isMessageLoopRunning) { + isMessageLoopRunning = true; + port.postMessage(null); + } + }; - if (first !== undefined) { - var last = heap.pop(); + requestHostTimeout = function (callback, ms) { + taskTimeoutID = _setTimeout(function () { + callback(getCurrentTime()); + }, ms); + }; - if (last !== first) { - heap[0] = last; - siftDown(heap, last, 0); - } + cancelHostTimeout = function () { + _clearTimeout(taskTimeoutID); - return first; - } else { - return null; + taskTimeoutID = -1; + }; + } + + function push(heap, node) { + var index = heap.length; + heap.push(node); + siftUp(heap, node, index); + } + function peek(heap) { + var first = heap[0]; + return first === undefined ? null : first; } -} + function pop(heap) { + var first = heap[0]; -function siftUp(heap, node, i) { - var index = i; + if (first !== undefined) { + var last = heap.pop(); - while (true) { - var parentIndex = Math.floor((index - 1) / 2); - var parent = heap[parentIndex]; + if (last !== first) { + heap[0] = last; + siftDown(heap, last, 0); + } - if (parent !== undefined && compare(parent, node) > 0) { - // The parent is larger. Swap positions. - heap[parentIndex] = node; - heap[index] = parent; - index = parentIndex; + return first; } else { - // The parent is smaller. Exit. - return; + return null; + } + } + + function siftUp(heap, node, i) { + var index = i; + + while (true) { + var parentIndex = index - 1 >>> 1; + var parent = heap[parentIndex]; + + if (parent !== undefined && compare(parent, node) > 0) { + // The parent is larger. Swap positions. + heap[parentIndex] = node; + heap[index] = parent; + index = parentIndex; + } else { + // The parent is smaller. Exit. + return; + } } } -} -function siftDown(heap, node, i) { - var index = i; - var length = heap.length; + function siftDown(heap, node, i) { + var index = i; + var length = heap.length; - while (index < length) { - var leftIndex = (index + 1) * 2 - 1; - var left = heap[leftIndex]; - var rightIndex = leftIndex + 1; - var right = heap[rightIndex]; // If the left or right node is smaller, swap with the smaller of those. + while (index < length) { + var leftIndex = (index + 1) * 2 - 1; + var left = heap[leftIndex]; + var rightIndex = leftIndex + 1; + var right = heap[rightIndex]; // If the left or right node is smaller, swap with the smaller of those. - if (left !== undefined && compare(left, node) < 0) { - if (right !== undefined && compare(right, left) < 0) { + if (left !== undefined && compare(left, node) < 0) { + if (right !== undefined && compare(right, left) < 0) { + heap[index] = right; + heap[rightIndex] = node; + index = rightIndex; + } else { + heap[index] = left; + heap[leftIndex] = node; + index = leftIndex; + } + } else if (right !== undefined && compare(right, node) < 0) { heap[index] = right; heap[rightIndex] = node; index = rightIndex; } else { - heap[index] = left; - heap[leftIndex] = node; - index = leftIndex; - } - } else if (right !== undefined && compare(right, node) < 0) { - heap[index] = right; - heap[rightIndex] = node; - index = rightIndex; - } else { - // Neither child is smaller. Exit. - return; - } - } -} - -function compare(a, b) { - // Compare sort index first, then task id. - var diff = a.sortIndex - b.sortIndex; - return diff !== 0 ? diff : a.id - b.id; -} - -// TODO: Use symbols? -var NoPriority = 0; -var ImmediatePriority = 1; -var UserBlockingPriority = 2; -var NormalPriority = 3; -var LowPriority = 4; -var IdlePriority = 5; - -var runIdCounter = 0; -var mainThreadIdCounter = 0; -var profilingStateSize = 4; -var sharedProfilingBuffer = enableProfiling ? // $FlowFixMe Flow doesn't know about SharedArrayBuffer -typeof SharedArrayBuffer === 'function' ? new SharedArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : // $FlowFixMe Flow doesn't know about ArrayBuffer -typeof ArrayBuffer === 'function' ? new ArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : null // Don't crash the init path on IE9 -: null; -var profilingState = enableProfiling && sharedProfilingBuffer !== null ? new Int32Array(sharedProfilingBuffer) : []; // We can't read this but it helps save bytes for null checks - -var PRIORITY = 0; -var CURRENT_TASK_ID = 1; -var CURRENT_RUN_ID = 2; -var QUEUE_SIZE = 3; - -if (enableProfiling) { - profilingState[PRIORITY] = NoPriority; // This is maintained with a counter, because the size of the priority queue - // array might include canceled tasks. - - profilingState[QUEUE_SIZE] = 0; - profilingState[CURRENT_TASK_ID] = 0; -} // Bytes per element is 4 - - -var INITIAL_EVENT_LOG_SIZE = 131072; -var MAX_EVENT_LOG_SIZE = 524288; // Equivalent to 2 megabytes - -var eventLogSize = 0; -var eventLogBuffer = null; -var eventLog = null; -var eventLogIndex = 0; -var TaskStartEvent = 1; -var TaskCompleteEvent = 2; -var TaskErrorEvent = 3; -var TaskCancelEvent = 4; -var TaskRunEvent = 5; -var TaskYieldEvent = 6; -var SchedulerSuspendEvent = 7; -var SchedulerResumeEvent = 8; - -function logEvent(entries) { - if (eventLog !== null) { - var offset = eventLogIndex; - eventLogIndex += entries.length; - - if (eventLogIndex + 1 > eventLogSize) { - eventLogSize *= 2; - - if (eventLogSize > MAX_EVENT_LOG_SIZE) { - console.error("Scheduler Profiling: Event log exceeded maximum size. Don't " + 'forget to call `stopLoggingProfilingEvents()`.'); - stopLoggingProfilingEvents(); + // Neither child is smaller. Exit. return; } - - var newEventLog = new Int32Array(eventLogSize * 4); - newEventLog.set(eventLog); - eventLogBuffer = newEventLog.buffer; - eventLog = newEventLog; } + } - eventLog.set(entries, offset); + function compare(a, b) { + // Compare sort index first, then task id. + var diff = a.sortIndex - b.sortIndex; + return diff !== 0 ? diff : a.id - b.id; } -} -function startLoggingProfilingEvents() { - eventLogSize = INITIAL_EVENT_LOG_SIZE; - eventLogBuffer = new ArrayBuffer(eventLogSize * 4); - eventLog = new Int32Array(eventLogBuffer); - eventLogIndex = 0; -} -function stopLoggingProfilingEvents() { - var buffer = eventLogBuffer; - eventLogSize = 0; - eventLogBuffer = null; - eventLog = null; - eventLogIndex = 0; - return buffer; -} -function markTaskStart(task, ms) { - if (enableProfiling) { - profilingState[QUEUE_SIZE]++; + // TODO: Use symbols? + var NoPriority = 0; + var ImmediatePriority = 1; + var UserBlockingPriority = 2; + var NormalPriority = 3; + var LowPriority = 4; + var IdlePriority = 5; - if (eventLog !== null) { - // performance.now returns a float, representing milliseconds. When the - // event is logged, it's coerced to an int. Convert to microseconds to - // maintain extra degrees of precision. - logEvent([TaskStartEvent, ms * 1000, task.id, task.priorityLevel]); - } - } -} -function markTaskCompleted(task, ms) { - if (enableProfiling) { - profilingState[PRIORITY] = NoPriority; - profilingState[CURRENT_TASK_ID] = 0; - profilingState[QUEUE_SIZE]--; + var runIdCounter = 0; + var mainThreadIdCounter = 0; + var profilingStateSize = 4; + var sharedProfilingBuffer = // $FlowFixMe Flow doesn't know about SharedArrayBuffer + typeof SharedArrayBuffer === 'function' ? new SharedArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : // $FlowFixMe Flow doesn't know about ArrayBuffer + typeof ArrayBuffer === 'function' ? new ArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : null // Don't crash the init path on IE9 + ; + var profilingState = sharedProfilingBuffer !== null ? new Int32Array(sharedProfilingBuffer) : []; // We can't read this but it helps save bytes for null checks + + var PRIORITY = 0; + var CURRENT_TASK_ID = 1; + var CURRENT_RUN_ID = 2; + var QUEUE_SIZE = 3; + + { + profilingState[PRIORITY] = NoPriority; // This is maintained with a counter, because the size of the priority queue + // array might include canceled tasks. + profilingState[QUEUE_SIZE] = 0; + profilingState[CURRENT_TASK_ID] = 0; + } // Bytes per element is 4 + + + var INITIAL_EVENT_LOG_SIZE = 131072; + var MAX_EVENT_LOG_SIZE = 524288; // Equivalent to 2 megabytes + + var eventLogSize = 0; + var eventLogBuffer = null; + var eventLog = null; + var eventLogIndex = 0; + var TaskStartEvent = 1; + var TaskCompleteEvent = 2; + var TaskErrorEvent = 3; + var TaskCancelEvent = 4; + var TaskRunEvent = 5; + var TaskYieldEvent = 6; + var SchedulerSuspendEvent = 7; + var SchedulerResumeEvent = 8; + + function logEvent(entries) { if (eventLog !== null) { - logEvent([TaskCompleteEvent, ms * 1000, task.id]); + var offset = eventLogIndex; + eventLogIndex += entries.length; + + if (eventLogIndex + 1 > eventLogSize) { + eventLogSize *= 2; + + if (eventLogSize > MAX_EVENT_LOG_SIZE) { + // Using console['error'] to evade Babel and ESLint + console['error']("Scheduler Profiling: Event log exceeded maximum size. Don't " + 'forget to call `stopLoggingProfilingEvents()`.'); + stopLoggingProfilingEvents(); + return; + } + + var newEventLog = new Int32Array(eventLogSize * 4); + newEventLog.set(eventLog); + eventLogBuffer = newEventLog.buffer; + eventLog = newEventLog; + } + + eventLog.set(entries, offset); } } -} -function markTaskCanceled(task, ms) { - if (enableProfiling) { - profilingState[QUEUE_SIZE]--; - if (eventLog !== null) { - logEvent([TaskCancelEvent, ms * 1000, task.id]); - } + function startLoggingProfilingEvents() { + eventLogSize = INITIAL_EVENT_LOG_SIZE; + eventLogBuffer = new ArrayBuffer(eventLogSize * 4); + eventLog = new Int32Array(eventLogBuffer); + eventLogIndex = 0; } -} -function markTaskErrored(task, ms) { - if (enableProfiling) { - profilingState[PRIORITY] = NoPriority; - profilingState[CURRENT_TASK_ID] = 0; - profilingState[QUEUE_SIZE]--; + function stopLoggingProfilingEvents() { + var buffer = eventLogBuffer; + eventLogSize = 0; + eventLogBuffer = null; + eventLog = null; + eventLogIndex = 0; + return buffer; + } + function markTaskStart(task, ms) { + { + profilingState[QUEUE_SIZE]++; - if (eventLog !== null) { - logEvent([TaskErrorEvent, ms * 1000, task.id]); + if (eventLog !== null) { + // performance.now returns a float, representing milliseconds. When the + // event is logged, it's coerced to an int. Convert to microseconds to + // maintain extra degrees of precision. + logEvent([TaskStartEvent, ms * 1000, task.id, task.priorityLevel]); + } } } -} -function markTaskRun(task, ms) { - if (enableProfiling) { - runIdCounter++; - profilingState[PRIORITY] = task.priorityLevel; - profilingState[CURRENT_TASK_ID] = task.id; - profilingState[CURRENT_RUN_ID] = runIdCounter; + function markTaskCompleted(task, ms) { + { + profilingState[PRIORITY] = NoPriority; + profilingState[CURRENT_TASK_ID] = 0; + profilingState[QUEUE_SIZE]--; - if (eventLog !== null) { - logEvent([TaskRunEvent, ms * 1000, task.id, runIdCounter]); + if (eventLog !== null) { + logEvent([TaskCompleteEvent, ms * 1000, task.id]); + } } } -} -function markTaskYield(task, ms) { - if (enableProfiling) { - profilingState[PRIORITY] = NoPriority; - profilingState[CURRENT_TASK_ID] = 0; - profilingState[CURRENT_RUN_ID] = 0; + function markTaskCanceled(task, ms) { + { + profilingState[QUEUE_SIZE]--; - if (eventLog !== null) { - logEvent([TaskYieldEvent, ms * 1000, task.id, runIdCounter]); + if (eventLog !== null) { + logEvent([TaskCancelEvent, ms * 1000, task.id]); + } } } -} -function markSchedulerSuspended(ms) { - if (enableProfiling) { - mainThreadIdCounter++; + function markTaskErrored(task, ms) { + { + profilingState[PRIORITY] = NoPriority; + profilingState[CURRENT_TASK_ID] = 0; + profilingState[QUEUE_SIZE]--; - if (eventLog !== null) { - logEvent([SchedulerSuspendEvent, ms * 1000, mainThreadIdCounter]); + if (eventLog !== null) { + logEvent([TaskErrorEvent, ms * 1000, task.id]); + } } } -} -function markSchedulerUnsuspended(ms) { - if (enableProfiling) { - if (eventLog !== null) { - logEvent([SchedulerResumeEvent, ms * 1000, mainThreadIdCounter]); + function markTaskRun(task, ms) { + { + runIdCounter++; + profilingState[PRIORITY] = task.priorityLevel; + profilingState[CURRENT_TASK_ID] = task.id; + profilingState[CURRENT_RUN_ID] = runIdCounter; + + if (eventLog !== null) { + logEvent([TaskRunEvent, ms * 1000, task.id, runIdCounter]); + } } } -} - -/* eslint-disable no-var */ -// Math.pow(2, 30) - 1 -// 0b111111111111111111111111111111 - -var maxSigned31BitInt = 1073741823; // Times out immediately - -var IMMEDIATE_PRIORITY_TIMEOUT = -1; // Eventually times out - -var USER_BLOCKING_PRIORITY = 250; -var NORMAL_PRIORITY_TIMEOUT = 5000; -var LOW_PRIORITY_TIMEOUT = 10000; // Never times out - -var IDLE_PRIORITY = maxSigned31BitInt; // Tasks are stored on a min heap - -var taskQueue = []; -var timerQueue = []; // Incrementing id counter. Used to maintain insertion order. - -var taskIdCounter = 1; // Pausing the scheduler is useful for debugging. - -var isSchedulerPaused = false; -var currentTask = null; -var currentPriorityLevel = NormalPriority; // This is set while performing work, to prevent re-entrancy. - -var isPerformingWork = false; -var isHostCallbackScheduled = false; -var isHostTimeoutScheduled = false; - -function advanceTimers(currentTime) { - // Check for tasks that are no longer delayed and add them to the queue. - var timer = peek(timerQueue); - - while (timer !== null) { - if (timer.callback === null) { - // Timer was cancelled. - pop(timerQueue); - } else if (timer.startTime <= currentTime) { - // Timer fired. Transfer to the task queue. - pop(timerQueue); - timer.sortIndex = timer.expirationTime; - push(taskQueue, timer); + function markTaskYield(task, ms) { + { + profilingState[PRIORITY] = NoPriority; + profilingState[CURRENT_TASK_ID] = 0; + profilingState[CURRENT_RUN_ID] = 0; - if (enableProfiling) { - markTaskStart(timer, currentTime); - timer.isQueued = true; + if (eventLog !== null) { + logEvent([TaskYieldEvent, ms * 1000, task.id, runIdCounter]); } - } else { - // Remaining timers are pending. - return; } - - timer = peek(timerQueue); } -} - -function handleTimeout(currentTime) { - isHostTimeoutScheduled = false; - advanceTimers(currentTime); - - if (!isHostCallbackScheduled) { - if (peek(taskQueue) !== null) { - isHostCallbackScheduled = true; - requestHostCallback(flushWork); - } else { - var firstTimer = peek(timerQueue); + function markSchedulerSuspended(ms) { + { + mainThreadIdCounter++; - if (firstTimer !== null) { - requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); + if (eventLog !== null) { + logEvent([SchedulerSuspendEvent, ms * 1000, mainThreadIdCounter]); } } } -} - -function flushWork(hasTimeRemaining, initialTime) { - if (enableProfiling) { - markSchedulerUnsuspended(initialTime); - } // We'll need a host callback the next time work is scheduled. - - - isHostCallbackScheduled = false; - - if (isHostTimeoutScheduled) { - // We scheduled a timeout but it's no longer needed. Cancel it. - isHostTimeoutScheduled = false; - cancelHostTimeout(); + function markSchedulerUnsuspended(ms) { + { + if (eventLog !== null) { + logEvent([SchedulerResumeEvent, ms * 1000, mainThreadIdCounter]); + } + } } - isPerformingWork = true; - var previousPriorityLevel = currentPriorityLevel; + /* eslint-disable no-var */ + // Math.pow(2, 30) - 1 + // 0b111111111111111111111111111111 - try { - if (enableProfiling) { - try { - return workLoop(hasTimeRemaining, initialTime); - } catch (error) { - if (currentTask !== null) { - var currentTime = getCurrentTime(); - markTaskErrored(currentTask, currentTime); - currentTask.isQueued = false; - } + var maxSigned31BitInt = 1073741823; // Times out immediately - throw error; - } - } else { - // No catch in prod codepath. - return workLoop(hasTimeRemaining, initialTime); - } - } finally { - currentTask = null; - currentPriorityLevel = previousPriorityLevel; - isPerformingWork = false; + var IMMEDIATE_PRIORITY_TIMEOUT = -1; // Eventually times out - if (enableProfiling) { - var _currentTime = getCurrentTime(); + var USER_BLOCKING_PRIORITY = 250; + var NORMAL_PRIORITY_TIMEOUT = 5000; + var LOW_PRIORITY_TIMEOUT = 10000; // Never times out - markSchedulerSuspended(_currentTime); - } - } -} + var IDLE_PRIORITY = maxSigned31BitInt; // Tasks are stored on a min heap -function workLoop(hasTimeRemaining, initialTime) { - var currentTime = initialTime; - advanceTimers(currentTime); - currentTask = peek(taskQueue); + var taskQueue = []; + var timerQueue = []; // Incrementing id counter. Used to maintain insertion order. - while (currentTask !== null && !(enableSchedulerDebugging && isSchedulerPaused)) { - if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) { - // This currentTask hasn't expired, and we've reached the deadline. - break; - } + var taskIdCounter = 1; // Pausing the scheduler is useful for debugging. + var currentTask = null; + var currentPriorityLevel = NormalPriority; // This is set while performing work, to prevent re-entrancy. - var callback = currentTask.callback; + var isPerformingWork = false; + var isHostCallbackScheduled = false; + var isHostTimeoutScheduled = false; - if (callback !== null) { - currentTask.callback = null; - currentPriorityLevel = currentTask.priorityLevel; - var didUserCallbackTimeout = currentTask.expirationTime <= currentTime; - markTaskRun(currentTask, currentTime); - var continuationCallback = callback(didUserCallbackTimeout); - currentTime = getCurrentTime(); + function advanceTimers(currentTime) { + // Check for tasks that are no longer delayed and add them to the queue. + var timer = peek(timerQueue); - if (typeof continuationCallback === 'function') { - currentTask.callback = continuationCallback; - markTaskYield(currentTask, currentTime); - } else { - if (enableProfiling) { - markTaskCompleted(currentTask, currentTime); - currentTask.isQueued = false; - } + while (timer !== null) { + if (timer.callback === null) { + // Timer was cancelled. + pop(timerQueue); + } else if (timer.startTime <= currentTime) { + // Timer fired. Transfer to the task queue. + pop(timerQueue); + timer.sortIndex = timer.expirationTime; + push(taskQueue, timer); - if (currentTask === peek(taskQueue)) { - pop(taskQueue); + { + markTaskStart(timer, currentTime); + timer.isQueued = true; } + } else { + // Remaining timers are pending. + return; } - advanceTimers(currentTime); - } else { - pop(taskQueue); - } - - currentTask = peek(taskQueue); - } // Return whether there's additional work - - - if (currentTask !== null) { - return true; - } else { - var firstTimer = peek(timerQueue); - - if (firstTimer !== null) { - requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); + timer = peek(timerQueue); } - - return false; } -} - -function unstable_runWithPriority(priorityLevel, eventHandler) { - switch (priorityLevel) { - case ImmediatePriority: - case UserBlockingPriority: - case NormalPriority: - case LowPriority: - case IdlePriority: - break; - default: - priorityLevel = NormalPriority; - } + function handleTimeout(currentTime) { + isHostTimeoutScheduled = false; + advanceTimers(currentTime); - var previousPriorityLevel = currentPriorityLevel; - currentPriorityLevel = priorityLevel; + if (!isHostCallbackScheduled) { + if (peek(taskQueue) !== null) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } else { + var firstTimer = peek(timerQueue); - try { - return eventHandler(); - } finally { - currentPriorityLevel = previousPriorityLevel; + if (firstTimer !== null) { + requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); + } + } + } } -} -function unstable_next(eventHandler) { - var priorityLevel; - - switch (currentPriorityLevel) { - case ImmediatePriority: - case UserBlockingPriority: - case NormalPriority: - // Shift down to normal priority - priorityLevel = NormalPriority; - break; + function flushWork(hasTimeRemaining, initialTime) { + { + markSchedulerUnsuspended(initialTime); + } // We'll need a host callback the next time work is scheduled. - default: - // Anything lower than normal priority should remain at the current level. - priorityLevel = currentPriorityLevel; - break; - } - var previousPriorityLevel = currentPriorityLevel; - currentPriorityLevel = priorityLevel; + isHostCallbackScheduled = false; - try { - return eventHandler(); - } finally { - currentPriorityLevel = previousPriorityLevel; - } -} + if (isHostTimeoutScheduled) { + // We scheduled a timeout but it's no longer needed. Cancel it. + isHostTimeoutScheduled = false; + cancelHostTimeout(); + } -function unstable_wrapCallback(callback) { - var parentPriorityLevel = currentPriorityLevel; - return function () { - // This is a fork of runWithPriority, inlined for performance. + isPerformingWork = true; var previousPriorityLevel = currentPriorityLevel; - currentPriorityLevel = parentPriorityLevel; try { - return callback.apply(this, arguments); + if (enableProfiling) { + try { + return workLoop(hasTimeRemaining, initialTime); + } catch (error) { + if (currentTask !== null) { + var currentTime = getCurrentTime(); + markTaskErrored(currentTask, currentTime); + currentTask.isQueued = false; + } + + throw error; + } + } else { + // No catch in prod codepath. + return workLoop(hasTimeRemaining, initialTime); + } } finally { + currentTask = null; currentPriorityLevel = previousPriorityLevel; - } - }; -} - -function timeoutForPriorityLevel(priorityLevel) { - switch (priorityLevel) { - case ImmediatePriority: - return IMMEDIATE_PRIORITY_TIMEOUT; - - case UserBlockingPriority: - return USER_BLOCKING_PRIORITY; - - case IdlePriority: - return IDLE_PRIORITY; + isPerformingWork = false; - case LowPriority: - return LOW_PRIORITY_TIMEOUT; + { + var _currentTime = getCurrentTime(); - case NormalPriority: - default: - return NORMAL_PRIORITY_TIMEOUT; + markSchedulerSuspended(_currentTime); + } + } } -} -function unstable_scheduleCallback(priorityLevel, callback, options) { - var currentTime = getCurrentTime(); - var startTime; - var timeout; + function workLoop(hasTimeRemaining, initialTime) { + var currentTime = initialTime; + advanceTimers(currentTime); + currentTask = peek(taskQueue); - if (typeof options === 'object' && options !== null) { - var delay = options.delay; + while (currentTask !== null && !(enableSchedulerDebugging )) { + if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) { + // This currentTask hasn't expired, and we've reached the deadline. + break; + } - if (typeof delay === 'number' && delay > 0) { - startTime = currentTime + delay; - } else { - startTime = currentTime; - } + var callback = currentTask.callback; - timeout = typeof options.timeout === 'number' ? options.timeout : timeoutForPriorityLevel(priorityLevel); - } else { - timeout = timeoutForPriorityLevel(priorityLevel); - startTime = currentTime; - } - - var expirationTime = startTime + timeout; - var newTask = { - id: taskIdCounter++, - callback: callback, - priorityLevel: priorityLevel, - startTime: startTime, - expirationTime: expirationTime, - sortIndex: -1 - }; + if (callback !== null) { + currentTask.callback = null; + currentPriorityLevel = currentTask.priorityLevel; + var didUserCallbackTimeout = currentTask.expirationTime <= currentTime; + markTaskRun(currentTask, currentTime); + var continuationCallback = callback(didUserCallbackTimeout); + currentTime = getCurrentTime(); - if (enableProfiling) { - newTask.isQueued = false; - } + if (typeof continuationCallback === 'function') { + currentTask.callback = continuationCallback; + markTaskYield(currentTask, currentTime); + } else { + { + markTaskCompleted(currentTask, currentTime); + currentTask.isQueued = false; + } - if (startTime > currentTime) { - // This is a delayed task. - newTask.sortIndex = startTime; - push(timerQueue, newTask); + if (currentTask === peek(taskQueue)) { + pop(taskQueue); + } + } - if (peek(taskQueue) === null && newTask === peek(timerQueue)) { - // All tasks are delayed, and this is the task with the earliest delay. - if (isHostTimeoutScheduled) { - // Cancel an existing timeout. - cancelHostTimeout(); + advanceTimers(currentTime); } else { - isHostTimeoutScheduled = true; - } // Schedule a timeout. + pop(taskQueue); + } + currentTask = peek(taskQueue); + } // Return whether there's additional work - requestHostTimeout(handleTimeout, startTime - currentTime); - } - } else { - newTask.sortIndex = expirationTime; - push(taskQueue, newTask); - if (enableProfiling) { - markTaskStart(newTask, currentTime); - newTask.isQueued = true; - } // Schedule a host callback, if needed. If we're already performing work, - // wait until the next time we yield. + if (currentTask !== null) { + return true; + } else { + var firstTimer = peek(timerQueue); + if (firstTimer !== null) { + requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); + } - if (!isHostCallbackScheduled && !isPerformingWork) { - isHostCallbackScheduled = true; - requestHostCallback(flushWork); + return false; } } - return newTask; -} - -function unstable_pauseExecution() { - isSchedulerPaused = true; -} - -function unstable_continueExecution() { - isSchedulerPaused = false; - - if (!isHostCallbackScheduled && !isPerformingWork) { - isHostCallbackScheduled = true; - requestHostCallback(flushWork); - } -} - -function unstable_getFirstCallbackNode() { - return peek(taskQueue); -} + function unstable_runWithPriority(priorityLevel, eventHandler) { + switch (priorityLevel) { + case ImmediatePriority: + case UserBlockingPriority: + case NormalPriority: + case LowPriority: + case IdlePriority: + break; -function unstable_cancelCallback(task) { - if (enableProfiling) { - if (task.isQueued) { - var currentTime = getCurrentTime(); - markTaskCanceled(task, currentTime); - task.isQueued = false; + default: + priorityLevel = NormalPriority; } - } // Null out the callback to indicate the task has been canceled. (Can't - // remove from the queue because you can't remove arbitrary nodes from an - // array based heap, only the first one.) - - task.callback = null; -} + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = priorityLevel; -function unstable_getCurrentPriorityLevel() { - return currentPriorityLevel; -} + try { + return eventHandler(); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + } -function unstable_shouldYield() { - var currentTime = getCurrentTime(); - advanceTimers(currentTime); - var firstTask = peek(taskQueue); - return firstTask !== currentTask && currentTask !== null && firstTask !== null && firstTask.callback !== null && firstTask.startTime <= currentTime && firstTask.expirationTime < currentTask.expirationTime || shouldYieldToHost(); -} + function unstable_next(eventHandler) { + var priorityLevel; -var unstable_requestPaint = requestPaint; -var unstable_Profiling = enableProfiling ? { - startLoggingProfilingEvents: startLoggingProfilingEvents, - stopLoggingProfilingEvents: stopLoggingProfilingEvents, - sharedProfilingBuffer: sharedProfilingBuffer -} : null; + switch (currentPriorityLevel) { + case ImmediatePriority: + case UserBlockingPriority: + case NormalPriority: + // Shift down to normal priority + priorityLevel = NormalPriority; + break; + default: + // Anything lower than normal priority should remain at the current level. + priorityLevel = currentPriorityLevel; + break; + } + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = priorityLevel; -var Scheduler = Object.freeze({ - unstable_ImmediatePriority: ImmediatePriority, - unstable_UserBlockingPriority: UserBlockingPriority, - unstable_NormalPriority: NormalPriority, - unstable_IdlePriority: IdlePriority, - unstable_LowPriority: LowPriority, - unstable_runWithPriority: unstable_runWithPriority, - unstable_next: unstable_next, - unstable_scheduleCallback: unstable_scheduleCallback, - unstable_cancelCallback: unstable_cancelCallback, - unstable_wrapCallback: unstable_wrapCallback, - unstable_getCurrentPriorityLevel: unstable_getCurrentPriorityLevel, - unstable_shouldYield: unstable_shouldYield, - unstable_requestPaint: unstable_requestPaint, - unstable_continueExecution: unstable_continueExecution, - unstable_pauseExecution: unstable_pauseExecution, - unstable_getFirstCallbackNode: unstable_getFirstCallbackNode, - get unstable_now () { return getCurrentTime; }, - get unstable_forceFrameRate () { return forceFrameRate; }, - unstable_Profiling: unstable_Profiling -}); + try { + return eventHandler(); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + } -// Helps identify side effects in render-phase lifecycle hooks and setState -// reducers by double invoking them in Strict Mode. + function unstable_wrapCallback(callback) { + var parentPriorityLevel = currentPriorityLevel; + return function () { + // This is a fork of runWithPriority, inlined for performance. + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = parentPriorityLevel; - // To preserve the "Pause on caught exceptions" behavior of the debugger, we -// replay the begin phase of a failed component inside invokeGuardedCallback. + try { + return callback.apply(this, arguments); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + }; + } - // Warn about deprecated, async-unsafe lifecycles; relates to RFC #6: + function timeoutForPriorityLevel(priorityLevel) { + switch (priorityLevel) { + case ImmediatePriority: + return IMMEDIATE_PRIORITY_TIMEOUT; - // Gather advanced timing metrics for Profiler subtrees. + case UserBlockingPriority: + return USER_BLOCKING_PRIORITY; - // Trace which interactions trigger each commit. + case IdlePriority: + return IDLE_PRIORITY; -var enableSchedulerTracing = true; // SSR experiments + case LowPriority: + return LOW_PRIORITY_TIMEOUT; + case NormalPriority: + default: + return NORMAL_PRIORITY_TIMEOUT; + } + } - // Only used in www builds. + function unstable_scheduleCallback(priorityLevel, callback, options) { + var currentTime = getCurrentTime(); + var startTime; + var timeout; - // Only used in www builds. + if (typeof options === 'object' && options !== null) { + var delay = options.delay; - // Disable javascript: URL strings in href for XSS protection. + if (typeof delay === 'number' && delay > 0) { + startTime = currentTime + delay; + } else { + startTime = currentTime; + } - // React Fire: prevent the value and checked attributes from syncing -// with their related DOM properties + timeout = typeof options.timeout === 'number' ? options.timeout : timeoutForPriorityLevel(priorityLevel); + } else { + timeout = timeoutForPriorityLevel(priorityLevel); + startTime = currentTime; + } - // These APIs will no longer be "unstable" in the upcoming 16.7 release, -// Control this behavior with a flag to support 16.6 minor releases in the meanwhile. + var expirationTime = startTime + timeout; + var newTask = { + id: taskIdCounter++, + callback: callback, + priorityLevel: priorityLevel, + startTime: startTime, + expirationTime: expirationTime, + sortIndex: -1 + }; -var exposeConcurrentModeAPIs = false; - // Experimental React Flare event system and event components support. + { + newTask.isQueued = false; + } -var enableFlareAPI = false; // Experimental Host Component support. + if (startTime > currentTime) { + // This is a delayed task. + newTask.sortIndex = startTime; + push(timerQueue, newTask); -var enableFundamentalAPI = false; // Experimental Scope support. + if (peek(taskQueue) === null && newTask === peek(timerQueue)) { + // All tasks are delayed, and this is the task with the earliest delay. + if (isHostTimeoutScheduled) { + // Cancel an existing timeout. + cancelHostTimeout(); + } else { + isHostTimeoutScheduled = true; + } // Schedule a timeout. -var enableScopeAPI = false; // New API for JSX transforms to target - https://github.com/reactjs/rfcs/pull/107 -var enableJSXTransformAPI = false; // We will enforce mocking scheduler with scheduler/unstable_mock at some point. (v17?) -// Till then, we warn about the missing mock, but still fallback to a legacy mode compatible version + requestHostTimeout(handleTimeout, startTime - currentTime); + } + } else { + newTask.sortIndex = expirationTime; + push(taskQueue, newTask); - // For tests, we flush suspense fallbacks in an act scope; -// *except* in some of our own tests, where we test incremental loading states. + { + markTaskStart(newTask, currentTime); + newTask.isQueued = true; + } // Schedule a host callback, if needed. If we're already performing work, + // wait until the next time we yield. - // Add a callback property to suspense to notify which promises are currently -// in the update queue. This allows reporting and tracing of what is causing -// the user to see a loading state. -// Also allows hydration callbacks to fire when a dehydrated boundary gets -// hydrated or deleted. - // Part of the simplification of React.createElement so we can eventually move -// from React.createElement to React.jsx -// https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md + if (!isHostCallbackScheduled && !isPerformingWork) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } + } + return newTask; + } + function unstable_pauseExecution() { + } + function unstable_continueExecution() { + if (!isHostCallbackScheduled && !isPerformingWork) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } + } - // Flag to turn event.target and event.currentTarget in ReactNative from a reactTag to a component instance + function unstable_getFirstCallbackNode() { + return peek(taskQueue); + } -var DEFAULT_THREAD_ID = 0; // Counters used to generate unique IDs. + function unstable_cancelCallback(task) { + { + if (task.isQueued) { + var currentTime = getCurrentTime(); + markTaskCanceled(task, currentTime); + task.isQueued = false; + } + } // Null out the callback to indicate the task has been canceled. (Can't + // remove from the queue because you can't remove arbitrary nodes from an + // array based heap, only the first one.) + + + task.callback = null; + } + + function unstable_getCurrentPriorityLevel() { + return currentPriorityLevel; + } + + function unstable_shouldYield() { + var currentTime = getCurrentTime(); + advanceTimers(currentTime); + var firstTask = peek(taskQueue); + return firstTask !== currentTask && currentTask !== null && firstTask !== null && firstTask.callback !== null && firstTask.startTime <= currentTime && firstTask.expirationTime < currentTask.expirationTime || shouldYieldToHost(); + } + + var unstable_requestPaint = requestPaint; + var unstable_Profiling = { + startLoggingProfilingEvents: startLoggingProfilingEvents, + stopLoggingProfilingEvents: stopLoggingProfilingEvents, + sharedProfilingBuffer: sharedProfilingBuffer + } ; + + + + var Scheduler = /*#__PURE__*/Object.freeze({ + __proto__: null, + unstable_ImmediatePriority: ImmediatePriority, + unstable_UserBlockingPriority: UserBlockingPriority, + unstable_NormalPriority: NormalPriority, + unstable_IdlePriority: IdlePriority, + unstable_LowPriority: LowPriority, + unstable_runWithPriority: unstable_runWithPriority, + unstable_next: unstable_next, + unstable_scheduleCallback: unstable_scheduleCallback, + unstable_cancelCallback: unstable_cancelCallback, + unstable_wrapCallback: unstable_wrapCallback, + unstable_getCurrentPriorityLevel: unstable_getCurrentPriorityLevel, + unstable_shouldYield: unstable_shouldYield, + unstable_requestPaint: unstable_requestPaint, + unstable_continueExecution: unstable_continueExecution, + unstable_pauseExecution: unstable_pauseExecution, + unstable_getFirstCallbackNode: unstable_getFirstCallbackNode, + get unstable_now () { return getCurrentTime; }, + get unstable_forceFrameRate () { return forceFrameRate; }, + unstable_Profiling: unstable_Profiling + }); -var interactionIDCounter = 0; -var threadIDCounter = 0; // Set of currently traced interactions. -// Interactions "stack"– -// Meaning that newly traced interactions are appended to the previously active set. -// When an interaction goes out of scope, the previous set (if any) is restored. + var DEFAULT_THREAD_ID = 0; // Counters used to generate unique IDs. -var interactionsRef = null; // Listener(s) to notify when interactions begin and end. + var interactionIDCounter = 0; + var threadIDCounter = 0; // Set of currently traced interactions. + // Interactions "stack"– + // Meaning that newly traced interactions are appended to the previously active set. + // When an interaction goes out of scope, the previous set (if any) is restored. -var subscriberRef = null; + var interactionsRef = null; // Listener(s) to notify when interactions begin and end. -if (enableSchedulerTracing) { - interactionsRef = { - current: new Set() - }; - subscriberRef = { - current: null - }; -} + var subscriberRef = null; -function unstable_clear(callback) { - if (!enableSchedulerTracing) { - return callback(); + { + interactionsRef = { + current: new Set() + }; + subscriberRef = { + current: null + }; } + function unstable_clear(callback) { - var prevInteractions = interactionsRef.current; - interactionsRef.current = new Set(); + var prevInteractions = interactionsRef.current; + interactionsRef.current = new Set(); - try { - return callback(); - } finally { - interactionsRef.current = prevInteractions; + try { + return callback(); + } finally { + interactionsRef.current = prevInteractions; + } } -} -function unstable_getCurrent() { - if (!enableSchedulerTracing) { - return null; - } else { - return interactionsRef.current; + function unstable_getCurrent() { + { + return interactionsRef.current; + } } -} -function unstable_getThreadID() { - return ++threadIDCounter; -} -function unstable_trace(name, timestamp, callback) { - var threadID = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : DEFAULT_THREAD_ID; - - if (!enableSchedulerTracing) { - return callback(); + function unstable_getThreadID() { + return ++threadIDCounter; } + function unstable_trace(name, timestamp, callback) { + var threadID = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : DEFAULT_THREAD_ID; - var interaction = { - __count: 1, - id: interactionIDCounter++, - name: name, - timestamp: timestamp - }; - var prevInteractions = interactionsRef.current; // Traced interactions should stack/accumulate. - // To do that, clone the current interactions. - // The previous set will be restored upon completion. + var interaction = { + __count: 1, + id: interactionIDCounter++, + name: name, + timestamp: timestamp + }; + var prevInteractions = interactionsRef.current; // Traced interactions should stack/accumulate. + // To do that, clone the current interactions. + // The previous set will be restored upon completion. - var interactions = new Set(prevInteractions); - interactions.add(interaction); - interactionsRef.current = interactions; - var subscriber = subscriberRef.current; - var returnValue; + var interactions = new Set(prevInteractions); + interactions.add(interaction); + interactionsRef.current = interactions; + var subscriber = subscriberRef.current; + var returnValue; - try { - if (subscriber !== null) { - subscriber.onInteractionTraced(interaction); - } - } finally { try { if (subscriber !== null) { - subscriber.onWorkStarted(interactions, threadID); + subscriber.onInteractionTraced(interaction); } } finally { try { - returnValue = callback(); + if (subscriber !== null) { + subscriber.onWorkStarted(interactions, threadID); + } } finally { - interactionsRef.current = prevInteractions; - try { - if (subscriber !== null) { - subscriber.onWorkStopped(interactions, threadID); - } + returnValue = callback(); } finally { - interaction.__count--; // If no async work was scheduled for this interaction, - // Notify subscribers that it's completed. + interactionsRef.current = prevInteractions; - if (subscriber !== null && interaction.__count === 0) { - subscriber.onInteractionScheduledWorkCompleted(interaction); + try { + if (subscriber !== null) { + subscriber.onWorkStopped(interactions, threadID); + } + } finally { + interaction.__count--; // If no async work was scheduled for this interaction, + // Notify subscribers that it's completed. + + if (subscriber !== null && interaction.__count === 0) { + subscriber.onInteractionScheduledWorkCompleted(interaction); + } } } } } - } - return returnValue; -} -function unstable_wrap(callback) { - var threadID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_THREAD_ID; - - if (!enableSchedulerTracing) { - return callback; + return returnValue; } + function unstable_wrap(callback) { + var threadID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_THREAD_ID; - var wrappedInteractions = interactionsRef.current; - var subscriber = subscriberRef.current; - - if (subscriber !== null) { - subscriber.onWorkScheduled(wrappedInteractions, threadID); - } // Update the pending async work count for the current interactions. - // Update after calling subscribers in case of error. + var wrappedInteractions = interactionsRef.current; + var subscriber = subscriberRef.current; + if (subscriber !== null) { + subscriber.onWorkScheduled(wrappedInteractions, threadID); + } // Update the pending async work count for the current interactions. + // Update after calling subscribers in case of error. - wrappedInteractions.forEach(function (interaction) { - interaction.__count++; - }); - var hasRun = false; - function wrapped() { - var prevInteractions = interactionsRef.current; - interactionsRef.current = wrappedInteractions; - subscriber = subscriberRef.current; + wrappedInteractions.forEach(function (interaction) { + interaction.__count++; + }); + var hasRun = false; - try { - var returnValue; + function wrapped() { + var prevInteractions = interactionsRef.current; + interactionsRef.current = wrappedInteractions; + subscriber = subscriberRef.current; try { - if (subscriber !== null) { - subscriber.onWorkStarted(wrappedInteractions, threadID); - } - } finally { - try { - returnValue = callback.apply(undefined, arguments); - } finally { - interactionsRef.current = prevInteractions; + var returnValue; + try { if (subscriber !== null) { - subscriber.onWorkStopped(wrappedInteractions, threadID); + subscriber.onWorkStarted(wrappedInteractions, threadID); } + } finally { + try { + returnValue = callback.apply(undefined, arguments); + } finally { + interactionsRef.current = prevInteractions; + + if (subscriber !== null) { + subscriber.onWorkStopped(wrappedInteractions, threadID); + } + } + } + + return returnValue; + } finally { + if (!hasRun) { + // We only expect a wrapped function to be executed once, + // But in the event that it's executed more than once– + // Only decrement the outstanding interaction counts once. + hasRun = true; // Update pending async counts for all wrapped interactions. + // If this was the last scheduled async work for any of them, + // Mark them as completed. + + wrappedInteractions.forEach(function (interaction) { + interaction.__count--; + + if (subscriber !== null && interaction.__count === 0) { + subscriber.onInteractionScheduledWorkCompleted(interaction); + } + }); } } + } - return returnValue; - } finally { - if (!hasRun) { - // We only expect a wrapped function to be executed once, - // But in the event that it's executed more than once– - // Only decrement the outstanding interaction counts once. - hasRun = true; // Update pending async counts for all wrapped interactions. + wrapped.cancel = function cancel() { + subscriber = subscriberRef.current; + + try { + if (subscriber !== null) { + subscriber.onWorkCanceled(wrappedInteractions, threadID); + } + } finally { + // Update pending async counts for all wrapped interactions. // If this was the last scheduled async work for any of them, // Mark them as completed. - wrappedInteractions.forEach(function (interaction) { interaction.__count--; - if (subscriber !== null && interaction.__count === 0) { + if (subscriber && interaction.__count === 0) { subscriber.onInteractionScheduledWorkCompleted(interaction); } }); } - } - } - - wrapped.cancel = function cancel() { - subscriber = subscriberRef.current; - - try { - if (subscriber !== null) { - subscriber.onWorkCanceled(wrappedInteractions, threadID); - } - } finally { - // Update pending async counts for all wrapped interactions. - // If this was the last scheduled async work for any of them, - // Mark them as completed. - wrappedInteractions.forEach(function (interaction) { - interaction.__count--; - - if (subscriber && interaction.__count === 0) { - subscriber.onInteractionScheduledWorkCompleted(interaction); - } - }); - } - }; - - return wrapped; -} - -var subscribers = null; + }; -if (enableSchedulerTracing) { - subscribers = new Set(); -} + return wrapped; + } -function unstable_subscribe(subscriber) { - if (enableSchedulerTracing) { - subscribers.add(subscriber); + var subscribers = null; - if (subscribers.size === 1) { - subscriberRef.current = { - onInteractionScheduledWorkCompleted: onInteractionScheduledWorkCompleted, - onInteractionTraced: onInteractionTraced, - onWorkCanceled: onWorkCanceled, - onWorkScheduled: onWorkScheduled, - onWorkStarted: onWorkStarted, - onWorkStopped: onWorkStopped - }; - } + { + subscribers = new Set(); } -} -function unstable_unsubscribe(subscriber) { - if (enableSchedulerTracing) { - subscribers.delete(subscriber); - if (subscribers.size === 0) { - subscriberRef.current = null; + function unstable_subscribe(subscriber) { + { + subscribers.add(subscriber); + + if (subscribers.size === 1) { + subscriberRef.current = { + onInteractionScheduledWorkCompleted: onInteractionScheduledWorkCompleted, + onInteractionTraced: onInteractionTraced, + onWorkCanceled: onWorkCanceled, + onWorkScheduled: onWorkScheduled, + onWorkStarted: onWorkStarted, + onWorkStopped: onWorkStopped + }; + } } } -} + function unstable_unsubscribe(subscriber) { + { + subscribers.delete(subscriber); -function onInteractionTraced(interaction) { - var didCatchError = false; - var caughtError = null; - subscribers.forEach(function (subscriber) { - try { - subscriber.onInteractionTraced(interaction); - } catch (error) { - if (!didCatchError) { - didCatchError = true; - caughtError = error; + if (subscribers.size === 0) { + subscriberRef.current = null; } } - }); - - if (didCatchError) { - throw caughtError; } -} -function onInteractionScheduledWorkCompleted(interaction) { - var didCatchError = false; - var caughtError = null; - subscribers.forEach(function (subscriber) { - try { - subscriber.onInteractionScheduledWorkCompleted(interaction); - } catch (error) { - if (!didCatchError) { - didCatchError = true; - caughtError = error; + function onInteractionTraced(interaction) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onInteractionTraced(interaction); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } } - } - }); + }); - if (didCatchError) { - throw caughtError; + if (didCatchError) { + throw caughtError; + } } -} -function onWorkScheduled(interactions, threadID) { - var didCatchError = false; - var caughtError = null; - subscribers.forEach(function (subscriber) { - try { - subscriber.onWorkScheduled(interactions, threadID); - } catch (error) { - if (!didCatchError) { - didCatchError = true; - caughtError = error; + function onInteractionScheduledWorkCompleted(interaction) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onInteractionScheduledWorkCompleted(interaction); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } } - } - }); + }); - if (didCatchError) { - throw caughtError; + if (didCatchError) { + throw caughtError; + } } -} -function onWorkStarted(interactions, threadID) { - var didCatchError = false; - var caughtError = null; - subscribers.forEach(function (subscriber) { - try { - subscriber.onWorkStarted(interactions, threadID); - } catch (error) { - if (!didCatchError) { - didCatchError = true; - caughtError = error; + function onWorkScheduled(interactions, threadID) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onWorkScheduled(interactions, threadID); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } } - } - }); + }); - if (didCatchError) { - throw caughtError; + if (didCatchError) { + throw caughtError; + } } -} -function onWorkStopped(interactions, threadID) { - var didCatchError = false; - var caughtError = null; - subscribers.forEach(function (subscriber) { - try { - subscriber.onWorkStopped(interactions, threadID); - } catch (error) { - if (!didCatchError) { - didCatchError = true; - caughtError = error; + function onWorkStarted(interactions, threadID) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onWorkStarted(interactions, threadID); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } } - } - }); + }); - if (didCatchError) { - throw caughtError; + if (didCatchError) { + throw caughtError; + } } -} -function onWorkCanceled(interactions, threadID) { - var didCatchError = false; - var caughtError = null; - subscribers.forEach(function (subscriber) { - try { - subscriber.onWorkCanceled(interactions, threadID); - } catch (error) { - if (!didCatchError) { - didCatchError = true; - caughtError = error; + function onWorkStopped(interactions, threadID) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onWorkStopped(interactions, threadID); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } } + }); + + if (didCatchError) { + throw caughtError; } - }); + } - if (didCatchError) { - throw caughtError; - } -} - - - -var SchedulerTracing = Object.freeze({ - get __interactionsRef () { return interactionsRef; }, - get __subscriberRef () { return subscriberRef; }, - unstable_clear: unstable_clear, - unstable_getCurrent: unstable_getCurrent, - unstable_getThreadID: unstable_getThreadID, - unstable_trace: unstable_trace, - unstable_wrap: unstable_wrap, - unstable_subscribe: unstable_subscribe, - unstable_unsubscribe: unstable_unsubscribe -}); - -var ReactSharedInternals$2 = { - ReactCurrentDispatcher: ReactCurrentDispatcher, - ReactCurrentOwner: ReactCurrentOwner, - IsSomeRendererActing: IsSomeRendererActing, - // Used by renderers to avoid bundling object-assign twice in UMD bundles: - assign: objectAssign -}; - -{ - objectAssign(ReactSharedInternals$2, { - // These should not be included in production. - ReactDebugCurrentFrame: ReactDebugCurrentFrame, - // Shim for React DOM 16.0.0 which still destructured (but not used) this. - // TODO: remove in React 17.0. - ReactComponentTreeHook: {} - }); -} // Re-export the schedule API(s) for UMD bundles. -// This avoids introducing a dependency on a new UMD global in a minor update, -// Since that would be a breaking change (e.g. for all existing CodeSandboxes). -// This re-export is only required for UMD bundles; -// CJS bundles use the shared NPM package. + function onWorkCanceled(interactions, threadID) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onWorkCanceled(interactions, threadID); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } + } + }); + if (didCatchError) { + throw caughtError; + } + } -objectAssign(ReactSharedInternals$2, { - Scheduler: Scheduler, - SchedulerTracing: SchedulerTracing -}); -var hasBadMapPolyfill; -{ - hasBadMapPolyfill = false; + var SchedulerTracing = /*#__PURE__*/Object.freeze({ + __proto__: null, + get __interactionsRef () { return interactionsRef; }, + get __subscriberRef () { return subscriberRef; }, + unstable_clear: unstable_clear, + unstable_getCurrent: unstable_getCurrent, + unstable_getThreadID: unstable_getThreadID, + unstable_trace: unstable_trace, + unstable_wrap: unstable_wrap, + unstable_subscribe: unstable_subscribe, + unstable_unsubscribe: unstable_unsubscribe + }); - try { - var frozenObject = Object.freeze({}); - var testMap = new Map([[frozenObject, null]]); - var testSet = new Set([frozenObject]); // This is necessary for Rollup to not consider these unused. - // https://github.com/rollup/rollup/issues/1771 - // TODO: we can remove these if Rollup fixes the bug. + var ReactSharedInternals$1 = { + ReactCurrentDispatcher: ReactCurrentDispatcher, + ReactCurrentOwner: ReactCurrentOwner, + IsSomeRendererActing: IsSomeRendererActing, + // Used by renderers to avoid bundling object-assign twice in UMD bundles: + assign: objectAssign + }; - testMap.set(0, 0); - testSet.add(0); - } catch (e) { - // TODO: Consider warning about bad polyfills - hasBadMapPolyfill = true; - } -} + { + objectAssign(ReactSharedInternals$1, { + // These should not be included in production. + ReactDebugCurrentFrame: ReactDebugCurrentFrame, + // Shim for React DOM 16.0.0 which still destructured (but not used) this. + // TODO: remove in React 17.0. + ReactComponentTreeHook: {} + }); + } // Re-export the schedule API(s) for UMD bundles. + // This avoids introducing a dependency on a new UMD global in a minor update, + // Since that would be a breaking change (e.g. for all existing CodeSandboxes). + // This re-export is only required for UMD bundles; + // CJS bundles use the shared NPM package. -function createFundamentalComponent(impl) { - // We use responder as a Map key later on. When we have a bad - // polyfill, then we can't use it as a key as the polyfill tries - // to add a property to the object. - if (true && !hasBadMapPolyfill) { - Object.freeze(impl); - } - var fundamantalComponent = { - $$typeof: REACT_FUNDAMENTAL_TYPE, - impl: impl - }; + objectAssign(ReactSharedInternals$1, { + Scheduler: Scheduler, + SchedulerTracing: SchedulerTracing + }); { - Object.freeze(fundamantalComponent); - } - - return fundamantalComponent; -} - -function createEventResponder(displayName, responderConfig) { - var getInitialState = responderConfig.getInitialState, - onEvent = responderConfig.onEvent, - onMount = responderConfig.onMount, - onUnmount = responderConfig.onUnmount, - onRootEvent = responderConfig.onRootEvent, - rootEventTypes = responderConfig.rootEventTypes, - targetEventTypes = responderConfig.targetEventTypes, - targetPortalPropagation = responderConfig.targetPortalPropagation; - var eventResponder = { - $$typeof: REACT_RESPONDER_TYPE, - displayName: displayName, - getInitialState: getInitialState || null, - onEvent: onEvent || null, - onMount: onMount || null, - onRootEvent: onRootEvent || null, - onUnmount: onUnmount || null, - rootEventTypes: rootEventTypes || null, - targetEventTypes: targetEventTypes || null, - targetPortalPropagation: targetPortalPropagation || false - }; // We use responder as a Map key later on. When we have a bad - // polyfill, then we can't use it as a key as the polyfill tries - // to add a property to the object. - - if (true && !hasBadMapPolyfill) { - Object.freeze(eventResponder); - } - - return eventResponder; -} - -function createScope() { - var scopeComponent = { - $$typeof: REACT_SCOPE_TYPE - }; - { - Object.freeze(scopeComponent); - } + try { + var frozenObject = Object.freeze({}); + var testMap = new Map([[frozenObject, null]]); + var testSet = new Set([frozenObject]); // This is necessary for Rollup to not consider these unused. + // https://github.com/rollup/rollup/issues/1771 + // TODO: we can remove these if Rollup fixes the bug. - return scopeComponent; -} + testMap.set(0, 0); + testSet.add(0); + } catch (e) { + } + } -var React = { - Children: { + var createElement$1 = createElementWithValidation ; + var cloneElement$1 = cloneElementWithValidation ; + var createFactory = createFactoryWithValidation ; + var Children = { map: mapChildren, forEach: forEachChildren, count: countChildren, toArray: toArray, only: onlyChild - }, - createRef: createRef, - Component: Component, - PureComponent: PureComponent, - createContext: createContext, - forwardRef: forwardRef, - lazy: lazy, - memo: memo, - useCallback: useCallback, - useContext: useContext, - useEffect: useEffect, - useImperativeHandle: useImperativeHandle, - useDebugValue: useDebugValue, - useLayoutEffect: useLayoutEffect, - useMemo: useMemo, - useReducer: useReducer, - useRef: useRef, - useState: useState, - Fragment: REACT_FRAGMENT_TYPE, - Profiler: REACT_PROFILER_TYPE, - StrictMode: REACT_STRICT_MODE_TYPE, - Suspense: REACT_SUSPENSE_TYPE, - createElement: createElementWithValidation, - cloneElement: cloneElementWithValidation, - createFactory: createFactoryWithValidation, - isValidElement: isValidElement, - version: ReactVersion, - __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: ReactSharedInternals$2 -}; - -if (exposeConcurrentModeAPIs) { - React.useTransition = useTransition; - React.useDeferredValue = useDeferredValue; - React.SuspenseList = REACT_SUSPENSE_LIST_TYPE; - React.unstable_withSuspenseConfig = withSuspenseConfig; -} - -if (enableFlareAPI) { - React.unstable_useResponder = useResponder; - React.unstable_createResponder = createEventResponder; -} - -if (enableFundamentalAPI) { - React.unstable_createFundamental = createFundamentalComponent; -} - -if (enableScopeAPI) { - React.unstable_createScope = createScope; -} // Note: some APIs are added with feature flags. -// Make sure that stable builds for open source -// don't modify the React object to avoid deopts. -// Also let's not expose their names in stable builds. - - -if (enableJSXTransformAPI) { - { - React.jsxDEV = jsxWithValidation; - React.jsx = jsxWithValidationDynamic; - React.jsxs = jsxWithValidationStatic; - } -} - - - -var React$2 = Object.freeze({ - default: React -}); - -var React$3 = ( React$2 && React ) || React$2; - -// TODO: decide on the top-level export form. -// This is hacky but makes it work with both Rollup and Jest. - - -var react = React$3.default || React$3; + }; -return react; + exports.Children = Children; + exports.Component = Component; + exports.Fragment = REACT_FRAGMENT_TYPE; + exports.Profiler = REACT_PROFILER_TYPE; + exports.PureComponent = PureComponent; + exports.StrictMode = REACT_STRICT_MODE_TYPE; + exports.Suspense = REACT_SUSPENSE_TYPE; + exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals$1; + exports.cloneElement = cloneElement$1; + exports.createContext = createContext; + exports.createElement = createElement$1; + exports.createFactory = createFactory; + exports.createRef = createRef; + exports.forwardRef = forwardRef; + exports.isValidElement = isValidElement; + exports.lazy = lazy; + exports.memo = memo; + exports.useCallback = useCallback; + exports.useContext = useContext; + exports.useDebugValue = useDebugValue; + exports.useEffect = useEffect; + exports.useImperativeHandle = useImperativeHandle; + exports.useLayoutEffect = useLayoutEffect; + exports.useMemo = useMemo; + exports.useReducer = useReducer; + exports.useRef = useRef; + exports.useState = useState; + exports.version = ReactVersion; }))); diff --git a/browser/components/newtab/vendor/react-dom-dev.js b/browser/components/newtab/vendor/react-dom-dev.js index a484d1d9d2ad6e6ffa36cb23b34beed007f2d2d5..2bc860246f884be1c7cb527ad025d0a927342c24 100644 --- a/browser/components/newtab/vendor/react-dom-dev.js +++ b/browser/components/newtab/vendor/react-dom-dev.js @@ -1,4 +1,4 @@ -/** @license React v16.12.0 +/** @license React v16.13.1 * react-dom.development.js * * Copyright (c) Facebook, Inc. and its affiliates. @@ -10,24394 +10,21869 @@ 'use strict'; (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('react')) : - typeof define === 'function' && define.amd ? define(['react'], factory) : - (global.ReactDOM = factory(global.React)); -}(this, (function (React) { 'use strict'; - -// Do not require this module directly! Use normal `invariant` calls with -// template literal strings. The messages will be replaced with error codes -// during build. - -/** - * Use invariant() to assert state which your program assumes to be true. - * - * Provide sprintf-style format (only %s is supported) and arguments - * to provide information about what broke and what you were - * expecting. - * - * The invariant message will be stripped in production, but the invariant - * will remain to ensure logic does not differ in production. - */ - -if (!React) { - { - throw Error("ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM."); + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) : + typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) : + (global = global || self, factory(global.ReactDOM = {}, global.React)); +}(this, (function (exports, React) { 'use strict'; + + var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; // Prevent newer renderers from RTE when used with older react package versions. + // Current owner and dispatcher used to share the same ref, + // but PR #14548 split them out to better support the react-debug-tools package. + + if (!ReactSharedInternals.hasOwnProperty('ReactCurrentDispatcher')) { + ReactSharedInternals.ReactCurrentDispatcher = { + current: null + }; } -} -/** - * Injectable ordering of event plugins. - */ -var eventPluginOrder = null; -/** - * Injectable mapping from names to event plugin modules. - */ - -var namesToPlugins = {}; -/** - * Recomputes the plugin list using the injected plugins and plugin ordering. - * - * @private - */ - -function recomputePluginOrdering() { - if (!eventPluginOrder) { - // Wait until an `eventPluginOrder` is injected. - return; + if (!ReactSharedInternals.hasOwnProperty('ReactCurrentBatchConfig')) { + ReactSharedInternals.ReactCurrentBatchConfig = { + suspense: null + }; } - for (var pluginName in namesToPlugins) { - var pluginModule = namesToPlugins[pluginName]; - var pluginIndex = eventPluginOrder.indexOf(pluginName); + // by calls to these methods by a Babel plugin. + // + // In PROD (or in packages without access to React internals), + // they are left as they are instead. - if (!(pluginIndex > -1)) { - { - throw Error("EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `" + pluginName + "`."); + function warn(format) { + { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; } - } - if (plugins[pluginIndex]) { - continue; + printWarning('warn', format, args); } - - if (!pluginModule.extractEvents) { - { - throw Error("EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `" + pluginName + "` does not."); + } + function error(format) { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; } - } - plugins[pluginIndex] = pluginModule; - var publishedEvents = pluginModule.eventTypes; - - for (var eventName in publishedEvents) { - if (!publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName)) { - { - throw Error("EventPluginRegistry: Failed to publish event `" + eventName + "` for plugin `" + pluginName + "`."); - } - } + printWarning('error', format, args); } } -} -/** - * Publishes an event so that it can be dispatched by the supplied plugin. - * - * @param {object} dispatchConfig Dispatch configuration for the event. - * @param {object} PluginModule Plugin publishing the event. - * @return {boolean} True if the event was successfully published. - * @private - */ - -function publishEventForPlugin(dispatchConfig, pluginModule, eventName) { - if (!!eventNameDispatchConfigs.hasOwnProperty(eventName)) { + function printWarning(level, format, args) { + // When changing this logic, you might want to also + // update consoleWithStackDev.www.js as well. { - throw Error("EventPluginHub: More than one plugin attempted to publish the same event name, `" + eventName + "`."); - } - } + var hasExistingStack = args.length > 0 && typeof args[args.length - 1] === 'string' && args[args.length - 1].indexOf('\n in') === 0; - eventNameDispatchConfigs[eventName] = dispatchConfig; - var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames; + if (!hasExistingStack) { + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame.getStackAddendum(); - if (phasedRegistrationNames) { - for (var phaseName in phasedRegistrationNames) { - if (phasedRegistrationNames.hasOwnProperty(phaseName)) { - var phasedRegistrationName = phasedRegistrationNames[phaseName]; - publishRegistrationName(phasedRegistrationName, pluginModule, eventName); + if (stack !== '') { + format += '%s'; + args = args.concat([stack]); + } } - } - - return true; - } else if (dispatchConfig.registrationName) { - publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName); - return true; - } - - return false; -} -/** - * Publishes a registration name that is used to identify dispatched events. - * - * @param {string} registrationName Registration name to add. - * @param {object} PluginModule Plugin publishing the event. - * @private - */ + var argsWithFormat = args.map(function (item) { + return '' + item; + }); // Careful: RN currently depends on this prefix -function publishRegistrationName(registrationName, pluginModule, eventName) { - if (!!registrationNameModules[registrationName]) { - { - throw Error("EventPluginHub: More than one plugin attempted to publish the same registration name, `" + registrationName + "`."); - } - } - - registrationNameModules[registrationName] = pluginModule; - registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies; + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it + // breaks IE9: https://github.com/facebook/react/issues/13610 + // eslint-disable-next-line react-internal/no-production-logging - { - var lowerCasedName = registrationName.toLowerCase(); - possibleRegistrationNames[lowerCasedName] = registrationName; + Function.prototype.apply.call(console[level], console, argsWithFormat); - if (registrationName === 'onDoubleClick') { - possibleRegistrationNames.ondblclick = registrationName; + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + var argIndex = 0; + var message = 'Warning: ' + format.replace(/%s/g, function () { + return args[argIndex++]; + }); + throw new Error(message); + } catch (x) {} } } -} -/** - * Registers plugins so that they can extract and dispatch events. - * - * @see {EventPluginHub} - */ - -/** - * Ordered list of injected plugins. - */ - - -var plugins = []; -/** - * Mapping from event name to dispatch config - */ - -var eventNameDispatchConfigs = {}; -/** - * Mapping from registration name to plugin module - */ - -var registrationNameModules = {}; -/** - * Mapping from registration name to event name - */ -var registrationNameDependencies = {}; -/** - * Mapping from lowercase registration names to the properly cased version, - * used to warn in the case of missing event handlers. Available - * only in true. - * @type {Object} - */ - -var possibleRegistrationNames = {}; // Trust the developer to only use possibleRegistrationNames in true - -/** - * Injects an ordering of plugins (by plugin name). This allows the ordering - * to be decoupled from injection of the actual plugins so that ordering is - * always deterministic regardless of packaging, on-the-fly injection, etc. - * - * @param {array} InjectedEventPluginOrder - * @internal - * @see {EventPluginHub.injection.injectEventPluginOrder} - */ - -function injectEventPluginOrder(injectedEventPluginOrder) { - if (!!eventPluginOrder) { + if (!React) { { - throw Error("EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React."); - } - } // Clone the ordering so it cannot be dynamically mutated. - - - eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder); - recomputePluginOrdering(); -} -/** - * Injects plugins to be used by `EventPluginHub`. The plugin names must be - * in the ordering injected by `injectEventPluginOrder`. - * - * Plugins can be injected as part of page initialization or on-the-fly. - * - * @param {object} injectedNamesToPlugins Map from names to plugin modules. - * @internal - * @see {EventPluginHub.injection.injectEventPluginsByName} - */ - -function injectEventPluginsByName(injectedNamesToPlugins) { - var isOrderingDirty = false; - - for (var pluginName in injectedNamesToPlugins) { - if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) { - continue; - } - - var pluginModule = injectedNamesToPlugins[pluginName]; - - if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) { - if (!!namesToPlugins[pluginName]) { - { - throw Error("EventPluginRegistry: Cannot inject two different event plugins using the same name, `" + pluginName + "`."); - } - } - - namesToPlugins[pluginName] = pluginModule; - isOrderingDirty = true; + throw Error( "ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM." ); } } - if (isOrderingDirty) { - recomputePluginOrdering(); - } -} - -var invokeGuardedCallbackImpl = function (name, func, context, a, b, c, d, e, f) { - var funcArgs = Array.prototype.slice.call(arguments, 3); + var invokeGuardedCallbackImpl = function (name, func, context, a, b, c, d, e, f) { + var funcArgs = Array.prototype.slice.call(arguments, 3); - try { - func.apply(context, funcArgs); - } catch (error) { - this.onError(error); - } -}; + try { + func.apply(context, funcArgs); + } catch (error) { + this.onError(error); + } + }; -{ - // In DEV mode, we swap out invokeGuardedCallback for a special version - // that plays more nicely with the browser's DevTools. The idea is to preserve - // "Pause on exceptions" behavior. Because React wraps all user-provided - // functions in invokeGuardedCallback, and the production version of - // invokeGuardedCallback uses a try-catch, all user exceptions are treated - // like caught exceptions, and the DevTools won't pause unless the developer - // takes the extra step of enabling pause on caught exceptions. This is - // unintuitive, though, because even though React has caught the error, from - // the developer's perspective, the error is uncaught. - // - // To preserve the expected "Pause on exceptions" behavior, we don't use a - // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake - // DOM node, and call the user-provided callback from inside an event handler - // for that fake event. If the callback throws, the error is "captured" using - // a global event handler. But because the error happens in a different - // event loop context, it does not interrupt the normal program flow. - // Effectively, this gives us try-catch behavior without actually using - // try-catch. Neat! - // Check that the browser supports the APIs we need to implement our special - // DEV version of invokeGuardedCallback - if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') { - var fakeNode = document.createElement('react'); - - var invokeGuardedCallbackDev = function (name, func, context, a, b, c, d, e, f) { - // If document doesn't exist we know for sure we will crash in this method - // when we call document.createEvent(). However this can cause confusing - // errors: https://github.com/facebookincubator/create-react-app/issues/3482 - // So we preemptively throw with a better message instead. - if (!(typeof document !== 'undefined')) { - { - throw Error("The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous."); + { + // In DEV mode, we swap out invokeGuardedCallback for a special version + // that plays more nicely with the browser's DevTools. The idea is to preserve + // "Pause on exceptions" behavior. Because React wraps all user-provided + // functions in invokeGuardedCallback, and the production version of + // invokeGuardedCallback uses a try-catch, all user exceptions are treated + // like caught exceptions, and the DevTools won't pause unless the developer + // takes the extra step of enabling pause on caught exceptions. This is + // unintuitive, though, because even though React has caught the error, from + // the developer's perspective, the error is uncaught. + // + // To preserve the expected "Pause on exceptions" behavior, we don't use a + // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake + // DOM node, and call the user-provided callback from inside an event handler + // for that fake event. If the callback throws, the error is "captured" using + // a global event handler. But because the error happens in a different + // event loop context, it does not interrupt the normal program flow. + // Effectively, this gives us try-catch behavior without actually using + // try-catch. Neat! + // Check that the browser supports the APIs we need to implement our special + // DEV version of invokeGuardedCallback + if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') { + var fakeNode = document.createElement('react'); + + var invokeGuardedCallbackDev = function (name, func, context, a, b, c, d, e, f) { + // If document doesn't exist we know for sure we will crash in this method + // when we call document.createEvent(). However this can cause confusing + // errors: https://github.com/facebookincubator/create-react-app/issues/3482 + // So we preemptively throw with a better message instead. + if (!(typeof document !== 'undefined')) { + { + throw Error( "The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous." ); + } } - } - var evt = document.createEvent('Event'); // Keeps track of whether the user-provided callback threw an error. We - // set this to true at the beginning, then set it to false right after - // calling the function. If the function errors, `didError` will never be - // set to false. This strategy works even if the browser is flaky and - // fails to call our global error handler, because it doesn't rely on - // the error event at all. + var evt = document.createEvent('Event'); // Keeps track of whether the user-provided callback threw an error. We + // set this to true at the beginning, then set it to false right after + // calling the function. If the function errors, `didError` will never be + // set to false. This strategy works even if the browser is flaky and + // fails to call our global error handler, because it doesn't rely on + // the error event at all. - var didError = true; // Keeps track of the value of window.event so that we can reset it - // during the callback to let user code access window.event in the - // browsers that support it. + var didError = true; // Keeps track of the value of window.event so that we can reset it + // during the callback to let user code access window.event in the + // browsers that support it. - var windowEvent = window.event; // Keeps track of the descriptor of window.event to restore it after event - // dispatching: https://github.com/facebook/react/issues/13688 + var windowEvent = window.event; // Keeps track of the descriptor of window.event to restore it after event + // dispatching: https://github.com/facebook/react/issues/13688 - var windowEventDescriptor = Object.getOwnPropertyDescriptor(window, 'event'); // Create an event handler for our fake event. We will synchronously - // dispatch our fake event using `dispatchEvent`. Inside the handler, we - // call the user-provided callback. + var windowEventDescriptor = Object.getOwnPropertyDescriptor(window, 'event'); // Create an event handler for our fake event. We will synchronously + // dispatch our fake event using `dispatchEvent`. Inside the handler, we + // call the user-provided callback. - var funcArgs = Array.prototype.slice.call(arguments, 3); + var funcArgs = Array.prototype.slice.call(arguments, 3); - function callCallback() { - // We immediately remove the callback from event listeners so that - // nested `invokeGuardedCallback` calls do not clash. Otherwise, a - // nested call would trigger the fake event handlers of any call higher - // in the stack. - fakeNode.removeEventListener(evtType, callCallback, false); // We check for window.hasOwnProperty('event') to prevent the - // window.event assignment in both IE <= 10 as they throw an error - // "Member not found" in strict mode, and in Firefox which does not - // support window.event. + function callCallback() { + // We immediately remove the callback from event listeners so that + // nested `invokeGuardedCallback` calls do not clash. Otherwise, a + // nested call would trigger the fake event handlers of any call higher + // in the stack. + fakeNode.removeEventListener(evtType, callCallback, false); // We check for window.hasOwnProperty('event') to prevent the + // window.event assignment in both IE <= 10 as they throw an error + // "Member not found" in strict mode, and in Firefox which does not + // support window.event. - if (typeof window.event !== 'undefined' && window.hasOwnProperty('event')) { - window.event = windowEvent; - } + if (typeof window.event !== 'undefined' && window.hasOwnProperty('event')) { + window.event = windowEvent; + } - func.apply(context, funcArgs); - didError = false; - } // Create a global error event handler. We use this to capture the value - // that was thrown. It's possible that this error handler will fire more - // than once; for example, if non-React code also calls `dispatchEvent` - // and a handler for that event throws. We should be resilient to most of - // those cases. Even if our error event handler fires more than once, the - // last error event is always used. If the callback actually does error, - // we know that the last error event is the correct one, because it's not - // possible for anything else to have happened in between our callback - // erroring and the code that follows the `dispatchEvent` call below. If - // the callback doesn't error, but the error event was fired, we know to - // ignore it because `didError` will be false, as described above. + func.apply(context, funcArgs); + didError = false; + } // Create a global error event handler. We use this to capture the value + // that was thrown. It's possible that this error handler will fire more + // than once; for example, if non-React code also calls `dispatchEvent` + // and a handler for that event throws. We should be resilient to most of + // those cases. Even if our error event handler fires more than once, the + // last error event is always used. If the callback actually does error, + // we know that the last error event is the correct one, because it's not + // possible for anything else to have happened in between our callback + // erroring and the code that follows the `dispatchEvent` call below. If + // the callback doesn't error, but the error event was fired, we know to + // ignore it because `didError` will be false, as described above. - var error; // Use this to track whether the error event is ever called. + var error; // Use this to track whether the error event is ever called. - var didSetError = false; - var isCrossOriginError = false; + var didSetError = false; + var isCrossOriginError = false; - function handleWindowError(event) { - error = event.error; - didSetError = true; + function handleWindowError(event) { + error = event.error; + didSetError = true; - if (error === null && event.colno === 0 && event.lineno === 0) { - isCrossOriginError = true; - } + if (error === null && event.colno === 0 && event.lineno === 0) { + isCrossOriginError = true; + } - if (event.defaultPrevented) { - // Some other error handler has prevented default. - // Browsers silence the error report if this happens. - // We'll remember this to later decide whether to log it or not. - if (error != null && typeof error === 'object') { - try { - error._suppressLogging = true; - } catch (inner) {// Ignore. + if (event.defaultPrevented) { + // Some other error handler has prevented default. + // Browsers silence the error report if this happens. + // We'll remember this to later decide whether to log it or not. + if (error != null && typeof error === 'object') { + try { + error._suppressLogging = true; + } catch (inner) {// Ignore. + } } } - } - } // Create a fake event type. - + } // Create a fake event type. - var evtType = "react-" + (name ? name : 'invokeguardedcallback'); // Attach our event handlers - window.addEventListener('error', handleWindowError); - fakeNode.addEventListener(evtType, callCallback, false); // Synchronously dispatch our fake event. If the user-provided function - // errors, it will trigger our global error handler. + var evtType = "react-" + (name ? name : 'invokeguardedcallback'); // Attach our event handlers - evt.initEvent(evtType, false, false); - fakeNode.dispatchEvent(evt); + window.addEventListener('error', handleWindowError); + fakeNode.addEventListener(evtType, callCallback, false); // Synchronously dispatch our fake event. If the user-provided function + // errors, it will trigger our global error handler. - if (windowEventDescriptor) { - Object.defineProperty(window, 'event', windowEventDescriptor); - } + evt.initEvent(evtType, false, false); + fakeNode.dispatchEvent(evt); - if (didError) { - if (!didSetError) { - // The callback errored, but the error event never fired. - error = new Error('An error was thrown inside one of your components, but React ' + "doesn't know what it was. This is likely due to browser " + 'flakiness. React does its best to preserve the "Pause on ' + 'exceptions" behavior of the DevTools, which requires some ' + "DEV-mode only tricks. It's possible that these don't work in " + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.'); - } else if (isCrossOriginError) { - error = new Error("A cross-origin error was thrown. React doesn't have access to " + 'the actual error object in development. ' + 'See https://fb.me/react-crossorigin-error for more information.'); + if (windowEventDescriptor) { + Object.defineProperty(window, 'event', windowEventDescriptor); } - this.onError(error); - } // Remove our event listeners - - - window.removeEventListener('error', handleWindowError); - }; + if (didError) { + if (!didSetError) { + // The callback errored, but the error event never fired. + error = new Error('An error was thrown inside one of your components, but React ' + "doesn't know what it was. This is likely due to browser " + 'flakiness. React does its best to preserve the "Pause on ' + 'exceptions" behavior of the DevTools, which requires some ' + "DEV-mode only tricks. It's possible that these don't work in " + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.'); + } else if (isCrossOriginError) { + error = new Error("A cross-origin error was thrown. React doesn't have access to " + 'the actual error object in development. ' + 'See https://fb.me/react-crossorigin-error for more information.'); + } - invokeGuardedCallbackImpl = invokeGuardedCallbackDev; - } -} + this.onError(error); + } // Remove our event listeners -var invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl; -var hasError = false; -var caughtError = null; // Used by event system to capture/rethrow the first error. + window.removeEventListener('error', handleWindowError); + }; -var hasRethrowError = false; -var rethrowError = null; -var reporter = { - onError: function (error) { - hasError = true; - caughtError = error; + invokeGuardedCallbackImpl = invokeGuardedCallbackDev; + } } -}; -/** - * Call a function while guarding against errors that happens within it. - * Returns an error if it throws, otherwise null. - * - * In production, this is implemented using a try-catch. The reason we don't - * use a try-catch directly is so that we can swap out a different - * implementation in DEV mode. - * - * @param {String} name of the guard to use for logging or debugging - * @param {Function} func The function to invoke - * @param {*} context The context to use when calling the function - * @param {...*} args Arguments for function - */ - -function invokeGuardedCallback(name, func, context, a, b, c, d, e, f) { - hasError = false; - caughtError = null; - invokeGuardedCallbackImpl$1.apply(reporter, arguments); -} -/** - * Same as invokeGuardedCallback, but instead of returning an error, it stores - * it in a global so it can be rethrown by `rethrowCaughtError` later. - * TODO: See if caughtError and rethrowError can be unified. - * - * @param {String} name of the guard to use for logging or debugging - * @param {Function} func The function to invoke - * @param {*} context The context to use when calling the function - * @param {...*} args Arguments for function - */ -function invokeGuardedCallbackAndCatchFirstError(name, func, context, a, b, c, d, e, f) { - invokeGuardedCallback.apply(this, arguments); + var invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl; - if (hasError) { - var error = clearCaughtError(); + var hasError = false; + var caughtError = null; // Used by event system to capture/rethrow the first error. - if (!hasRethrowError) { - hasRethrowError = true; - rethrowError = error; + var hasRethrowError = false; + var rethrowError = null; + var reporter = { + onError: function (error) { + hasError = true; + caughtError = error; } - } -} -/** - * During execution of guarded functions we will capture the first error which - * we will rethrow to be handled by the top level error handler. - */ + }; + /** + * Call a function while guarding against errors that happens within it. + * Returns an error if it throws, otherwise null. + * + * In production, this is implemented using a try-catch. The reason we don't + * use a try-catch directly is so that we can swap out a different + * implementation in DEV mode. + * + * @param {String} name of the guard to use for logging or debugging + * @param {Function} func The function to invoke + * @param {*} context The context to use when calling the function + * @param {...*} args Arguments for function + */ -function rethrowCaughtError() { - if (hasRethrowError) { - var error = rethrowError; - hasRethrowError = false; - rethrowError = null; - throw error; - } -} -function hasCaughtError() { - return hasError; -} -function clearCaughtError() { - if (hasError) { - var error = caughtError; + function invokeGuardedCallback(name, func, context, a, b, c, d, e, f) { hasError = false; caughtError = null; - return error; - } else { - { - { - throw Error("clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue."); - } - } + invokeGuardedCallbackImpl$1.apply(reporter, arguments); } -} + /** + * Same as invokeGuardedCallback, but instead of returning an error, it stores + * it in a global so it can be rethrown by `rethrowCaughtError` later. + * TODO: See if caughtError and rethrowError can be unified. + * + * @param {String} name of the guard to use for logging or debugging + * @param {Function} func The function to invoke + * @param {*} context The context to use when calling the function + * @param {...*} args Arguments for function + */ -/** - * Similar to invariant but only logs a warning if the condition is not met. - * This can be used to log issues in development environments in critical - * paths. Removing the logging code for production environments will keep the - * same logic and follow the same code paths. - */ -var warningWithoutStack = function () {}; + function invokeGuardedCallbackAndCatchFirstError(name, func, context, a, b, c, d, e, f) { + invokeGuardedCallback.apply(this, arguments); -{ - warningWithoutStack = function (condition, format) { - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; - } + if (hasError) { + var error = clearCaughtError(); - if (format === undefined) { - throw new Error('`warningWithoutStack(condition, format, ...args)` requires a warning ' + 'message argument'); + if (!hasRethrowError) { + hasRethrowError = true; + rethrowError = error; + } } + } + /** + * During execution of guarded functions we will capture the first error which + * we will rethrow to be handled by the top level error handler. + */ - if (args.length > 8) { - // Check before the condition to catch violations early. - throw new Error('warningWithoutStack() currently supports at most 8 arguments.'); + function rethrowCaughtError() { + if (hasRethrowError) { + var error = rethrowError; + hasRethrowError = false; + rethrowError = null; + throw error; } - - if (condition) { - return; + } + function hasCaughtError() { + return hasError; + } + function clearCaughtError() { + if (hasError) { + var error = caughtError; + hasError = false; + caughtError = null; + return error; + } else { + { + { + throw Error( "clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue." ); + } + } } + } - if (typeof console !== 'undefined') { - var argsWithFormat = args.map(function (item) { - return '' + item; - }); - argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it - // breaks IE9: https://github.com/facebook/react/issues/13610 + var getFiberCurrentPropsFromNode = null; + var getInstanceFromNode = null; + var getNodeFromInstance = null; + function setComponentTree(getFiberCurrentPropsFromNodeImpl, getInstanceFromNodeImpl, getNodeFromInstanceImpl) { + getFiberCurrentPropsFromNode = getFiberCurrentPropsFromNodeImpl; + getInstanceFromNode = getInstanceFromNodeImpl; + getNodeFromInstance = getNodeFromInstanceImpl; - Function.prototype.apply.call(console.error, console, argsWithFormat); + { + if (!getNodeFromInstance || !getInstanceFromNode) { + error('EventPluginUtils.setComponentTree(...): Injected ' + 'module is missing getNodeFromInstance or getInstanceFromNode.'); + } } + } + var validateEventDispatches; - try { - // --- Welcome to debugging React --- - // This error was thrown as a convenience so that you can use this stack - // to find the callsite that caused this warning to fire. - var argIndex = 0; - var message = 'Warning: ' + format.replace(/%s/g, function () { - return args[argIndex++]; - }); - throw new Error(message); - } catch (x) {} - }; -} + { + validateEventDispatches = function (event) { + var dispatchListeners = event._dispatchListeners; + var dispatchInstances = event._dispatchInstances; + var listenersIsArr = Array.isArray(dispatchListeners); + var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0; + var instancesIsArr = Array.isArray(dispatchInstances); + var instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0; -var warningWithoutStack$1 = warningWithoutStack; + if (instancesIsArr !== listenersIsArr || instancesLen !== listenersLen) { + error('EventPluginUtils: Invalid `event`.'); + } + }; + } + /** + * Dispatch the event to the listener. + * @param {SyntheticEvent} event SyntheticEvent to handle + * @param {function} listener Application-level callback + * @param {*} inst Internal component instance + */ -var getFiberCurrentPropsFromNode = null; -var getInstanceFromNode = null; -var getNodeFromInstance = null; -function setComponentTree(getFiberCurrentPropsFromNodeImpl, getInstanceFromNodeImpl, getNodeFromInstanceImpl) { - getFiberCurrentPropsFromNode = getFiberCurrentPropsFromNodeImpl; - getInstanceFromNode = getInstanceFromNodeImpl; - getNodeFromInstance = getNodeFromInstanceImpl; - { - !(getNodeFromInstance && getInstanceFromNode) ? warningWithoutStack$1(false, 'EventPluginUtils.setComponentTree(...): Injected ' + 'module is missing getNodeFromInstance or getInstanceFromNode.') : void 0; + function executeDispatch(event, listener, inst) { + var type = event.type || 'unknown-event'; + event.currentTarget = getNodeFromInstance(inst); + invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event); + event.currentTarget = null; } -} -var validateEventDispatches; + /** + * Standard/simple iteration through an event's collected dispatches. + */ -{ - validateEventDispatches = function (event) { + function executeDispatchesInOrder(event) { var dispatchListeners = event._dispatchListeners; var dispatchInstances = event._dispatchInstances; - var listenersIsArr = Array.isArray(dispatchListeners); - var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0; - var instancesIsArr = Array.isArray(dispatchInstances); - var instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0; - !(instancesIsArr === listenersIsArr && instancesLen === listenersLen) ? warningWithoutStack$1(false, 'EventPluginUtils: Invalid `event`.') : void 0; - }; -} -/** - * Dispatch the event to the listener. - * @param {SyntheticEvent} event SyntheticEvent to handle - * @param {function} listener Application-level callback - * @param {*} inst Internal component instance - */ + { + validateEventDispatches(event); + } -function executeDispatch(event, listener, inst) { - var type = event.type || 'unknown-event'; - event.currentTarget = getNodeFromInstance(inst); - invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event); - event.currentTarget = null; -} -/** - * Standard/simple iteration through an event's collected dispatches. - */ + if (Array.isArray(dispatchListeners)) { + for (var i = 0; i < dispatchListeners.length; i++) { + if (event.isPropagationStopped()) { + break; + } // Listeners and Instances are two parallel arrays that are always in sync. -function executeDispatchesInOrder(event) { - var dispatchListeners = event._dispatchListeners; - var dispatchInstances = event._dispatchInstances; - { - validateEventDispatches(event); + executeDispatch(event, dispatchListeners[i], dispatchInstances[i]); + } + } else if (dispatchListeners) { + executeDispatch(event, dispatchListeners, dispatchInstances); + } + + event._dispatchListeners = null; + event._dispatchInstances = null; } - if (Array.isArray(dispatchListeners)) { - for (var i = 0; i < dispatchListeners.length; i++) { - if (event.isPropagationStopped()) { - break; - } // Listeners and Instances are two parallel arrays that are always in sync. + var FunctionComponent = 0; + var ClassComponent = 1; + var IndeterminateComponent = 2; // Before we know whether it is function or class + var HostRoot = 3; // Root of a host tree. Could be nested inside another node. - executeDispatch(event, dispatchListeners[i], dispatchInstances[i]); - } - } else if (dispatchListeners) { - executeDispatch(event, dispatchListeners, dispatchInstances); - } + var HostPortal = 4; // A subtree. Could be an entry point to a different renderer. - event._dispatchListeners = null; - event._dispatchInstances = null; -} -/** - * @see executeDispatchesInOrderStopAtTrueImpl - */ + var HostComponent = 5; + var HostText = 6; + var Fragment = 7; + var Mode = 8; + var ContextConsumer = 9; + var ContextProvider = 10; + var ForwardRef = 11; + var Profiler = 12; + var SuspenseComponent = 13; + var MemoComponent = 14; + var SimpleMemoComponent = 15; + var LazyComponent = 16; + var IncompleteClassComponent = 17; + var DehydratedFragment = 18; + var SuspenseListComponent = 19; + var FundamentalComponent = 20; + var ScopeComponent = 21; + var Block = 22; + + /** + * Injectable ordering of event plugins. + */ + var eventPluginOrder = null; + /** + * Injectable mapping from names to event plugin modules. + */ + var namesToPlugins = {}; + /** + * Recomputes the plugin list using the injected plugins and plugin ordering. + * + * @private + */ + function recomputePluginOrdering() { + if (!eventPluginOrder) { + // Wait until an `eventPluginOrder` is injected. + return; + } -/** - * Execution of a "direct" dispatch - there must be at most one dispatch - * accumulated on the event or it is considered an error. It doesn't really make - * sense for an event with multiple dispatches (bubbled) to keep track of the - * return values at each dispatch execution, but it does tend to make sense when - * dealing with "direct" dispatches. - * - * @return {*} The return value of executing the single dispatch. - */ + for (var pluginName in namesToPlugins) { + var pluginModule = namesToPlugins[pluginName]; + var pluginIndex = eventPluginOrder.indexOf(pluginName); + if (!(pluginIndex > -1)) { + { + throw Error( "EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `" + pluginName + "`." ); + } + } -/** - * @param {SyntheticEvent} event - * @return {boolean} True iff number of dispatches accumulated is greater than 0. - */ + if (plugins[pluginIndex]) { + continue; + } -/** - * Accumulates items that must not be null or undefined into the first one. This - * is used to conserve memory by avoiding array allocations, and thus sacrifices - * API cleanness. Since `current` can be null before being passed in and not - * null after this function, make sure to assign it back to `current`: - * - * `a = accumulateInto(a, b);` - * - * This API should be sparingly used. Try `accumulate` for something cleaner. - * - * @return {*|array<*>} An accumulation of items. - */ + if (!pluginModule.extractEvents) { + { + throw Error( "EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `" + pluginName + "` does not." ); + } + } -function accumulateInto(current, next) { - if (!(next != null)) { - { - throw Error("accumulateInto(...): Accumulated items must not be null or undefined."); + plugins[pluginIndex] = pluginModule; + var publishedEvents = pluginModule.eventTypes; + + for (var eventName in publishedEvents) { + if (!publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName)) { + { + throw Error( "EventPluginRegistry: Failed to publish event `" + eventName + "` for plugin `" + pluginName + "`." ); + } + } + } } } - - if (current == null) { - return next; - } // Both are not empty. Warning: Never call x.concat(y) when you are not - // certain that x is an Array (x could be a string with concat method). + /** + * Publishes an event so that it can be dispatched by the supplied plugin. + * + * @param {object} dispatchConfig Dispatch configuration for the event. + * @param {object} PluginModule Plugin publishing the event. + * @return {boolean} True if the event was successfully published. + * @private + */ - if (Array.isArray(current)) { - if (Array.isArray(next)) { - current.push.apply(current, next); - return current; + function publishEventForPlugin(dispatchConfig, pluginModule, eventName) { + if (!!eventNameDispatchConfigs.hasOwnProperty(eventName)) { + { + throw Error( "EventPluginRegistry: More than one plugin attempted to publish the same event name, `" + eventName + "`." ); + } } - current.push(next); - return current; - } + eventNameDispatchConfigs[eventName] = dispatchConfig; + var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames; - if (Array.isArray(next)) { - // A bit too dangerous to mutate `next`. - return [current].concat(next); - } + if (phasedRegistrationNames) { + for (var phaseName in phasedRegistrationNames) { + if (phasedRegistrationNames.hasOwnProperty(phaseName)) { + var phasedRegistrationName = phasedRegistrationNames[phaseName]; + publishRegistrationName(phasedRegistrationName, pluginModule, eventName); + } + } - return [current, next]; -} + return true; + } else if (dispatchConfig.registrationName) { + publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName); + return true; + } -/** - * @param {array} arr an "accumulation" of items which is either an Array or - * a single item. Useful when paired with the `accumulate` module. This is a - * simple utility that allows us to reason about a collection of items, but - * handling the case when there is exactly one item (and we do not need to - * allocate an array). - * @param {function} cb Callback invoked with each element or a collection. - * @param {?} [scope] Scope used as `this` in a callback. - */ -function forEachAccumulated(arr, cb, scope) { - if (Array.isArray(arr)) { - arr.forEach(cb, scope); - } else if (arr) { - cb.call(scope, arr); + return false; } -} + /** + * Publishes a registration name that is used to identify dispatched events. + * + * @param {string} registrationName Registration name to add. + * @param {object} PluginModule Plugin publishing the event. + * @private + */ -/** - * Internal queue of events that have accumulated their dispatches and are - * waiting to have their dispatches executed. - */ -var eventQueue = null; -/** - * Dispatches an event and releases it back into the pool, unless persistent. - * - * @param {?object} event Synthetic event to be dispatched. - * @private - */ + function publishRegistrationName(registrationName, pluginModule, eventName) { + if (!!registrationNameModules[registrationName]) { + { + throw Error( "EventPluginRegistry: More than one plugin attempted to publish the same registration name, `" + registrationName + "`." ); + } + } -var executeDispatchesAndRelease = function (event) { - if (event) { - executeDispatchesInOrder(event); + registrationNameModules[registrationName] = pluginModule; + registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies; + + { + var lowerCasedName = registrationName.toLowerCase(); + possibleRegistrationNames[lowerCasedName] = registrationName; - if (!event.isPersistent()) { - event.constructor.release(event); + if (registrationName === 'onDoubleClick') { + possibleRegistrationNames.ondblclick = registrationName; + } } } -}; - -var executeDispatchesAndReleaseTopLevel = function (e) { - return executeDispatchesAndRelease(e); -}; + /** + * Registers plugins so that they can extract and dispatch events. + */ -function runEventsInBatch(events) { - if (events !== null) { - eventQueue = accumulateInto(eventQueue, events); - } // Set `eventQueue` to null before processing it so that we can tell if more - // events get enqueued while processing. + /** + * Ordered list of injected plugins. + */ - var processingEventQueue = eventQueue; - eventQueue = null; + var plugins = []; + /** + * Mapping from event name to dispatch config + */ - if (!processingEventQueue) { - return; - } - - forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel); - - if (!!eventQueue) { - { - throw Error("processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented."); - } - } // This would be a good time to rethrow if any of the event handlers threw. - - - rethrowCaughtError(); -} - -function isInteractive(tag) { - return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea'; -} - -function shouldPreventMouseEvent(name, type, props) { - switch (name) { - case 'onClick': - case 'onClickCapture': - case 'onDoubleClick': - case 'onDoubleClickCapture': - case 'onMouseDown': - case 'onMouseDownCapture': - case 'onMouseMove': - case 'onMouseMoveCapture': - case 'onMouseUp': - case 'onMouseUpCapture': - return !!(props.disabled && isInteractive(type)); - - default: - return false; - } -} -/** - * This is a unified interface for event plugins to be installed and configured. - * - * Event plugins can implement the following properties: - * - * `extractEvents` {function(string, DOMEventTarget, string, object): *} - * Required. When a top-level event is fired, this method is expected to - * extract synthetic events that will in turn be queued and dispatched. - * - * `eventTypes` {object} - * Optional, plugins that fire events must publish a mapping of registration - * names that are used to register listeners. Values of this mapping must - * be objects that contain `registrationName` or `phasedRegistrationNames`. - * - * `executeDispatch` {function(object, function, string)} - * Optional, allows plugins to override how an event gets dispatched. By - * default, the listener is simply invoked. - * - * Each plugin that is injected into `EventsPluginHub` is immediately operable. - * - * @public - */ - -/** - * Methods for injecting dependencies. - */ - - -var injection = { + var eventNameDispatchConfigs = {}; /** - * @param {array} InjectedEventPluginOrder - * @public + * Mapping from registration name to plugin module */ - injectEventPluginOrder: injectEventPluginOrder, + var registrationNameModules = {}; /** - * @param {object} injectedNamesToPlugins Map from names to plugin modules. + * Mapping from registration name to event name */ - injectEventPluginsByName: injectEventPluginsByName -}; -/** - * @param {object} inst The instance, which is the source of events. - * @param {string} registrationName Name of listener (e.g. `onClick`). - * @return {?function} The stored callback. - */ - -function getListener(inst, registrationName) { - var listener; // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not - // live here; needs to be moved to a better place soon - - var stateNode = inst.stateNode; - if (!stateNode) { - // Work in progress (ex: onload events in incremental mode). - return null; - } + var registrationNameDependencies = {}; + /** + * Mapping from lowercase registration names to the properly cased version, + * used to warn in the case of missing event handlers. Available + * only in true. + * @type {Object} + */ - var props = getFiberCurrentPropsFromNode(stateNode); + var possibleRegistrationNames = {} ; // Trust the developer to only use possibleRegistrationNames in true - if (!props) { - // Work in progress. - return null; - } + /** + * Injects an ordering of plugins (by plugin name). This allows the ordering + * to be decoupled from injection of the actual plugins so that ordering is + * always deterministic regardless of packaging, on-the-fly injection, etc. + * + * @param {array} InjectedEventPluginOrder + * @internal + */ - listener = props[registrationName]; + function injectEventPluginOrder(injectedEventPluginOrder) { + if (!!eventPluginOrder) { + { + throw Error( "EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React." ); + } + } // Clone the ordering so it cannot be dynamically mutated. - if (shouldPreventMouseEvent(registrationName, inst.type, props)) { - return null; - } - if (!(!listener || typeof listener === 'function')) { - { - throw Error("Expected `" + registrationName + "` listener to be a function, instead got a value of `" + typeof listener + "` type."); - } + eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder); + recomputePluginOrdering(); } + /** + * Injects plugins to be used by plugin event system. The plugin names must be + * in the ordering injected by `injectEventPluginOrder`. + * + * Plugins can be injected as part of page initialization or on-the-fly. + * + * @param {object} injectedNamesToPlugins Map from names to plugin modules. + * @internal + */ - return listener; -} -/** - * Allows registered plugins an opportunity to extract events from top-level - * native browser events. - * - * @return {*} An accumulation of synthetic events. - * @internal - */ + function injectEventPluginsByName(injectedNamesToPlugins) { + var isOrderingDirty = false; -function extractPluginEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) { - var events = null; + for (var pluginName in injectedNamesToPlugins) { + if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) { + continue; + } - for (var i = 0; i < plugins.length; i++) { - // Not every plugin in the ordering may be loaded at runtime. - var possiblePlugin = plugins[i]; + var pluginModule = injectedNamesToPlugins[pluginName]; - if (possiblePlugin) { - var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags); + if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) { + if (!!namesToPlugins[pluginName]) { + { + throw Error( "EventPluginRegistry: Cannot inject two different event plugins using the same name, `" + pluginName + "`." ); + } + } - if (extractedEvents) { - events = accumulateInto(events, extractedEvents); + namesToPlugins[pluginName] = pluginModule; + isOrderingDirty = true; } } - } - return events; -} + if (isOrderingDirty) { + recomputePluginOrdering(); + } + } -function runExtractedPluginEventsInBatch(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) { - var events = extractPluginEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags); - runEventsInBatch(events); -} + var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined'); -var FunctionComponent = 0; -var ClassComponent = 1; -var IndeterminateComponent = 2; // Before we know whether it is function or class + var ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + var _assign = ReactInternals.assign; -var HostRoot = 3; // Root of a host tree. Could be nested inside another node. + var PLUGIN_EVENT_SYSTEM = 1; + var IS_REPLAYED = 1 << 5; + var IS_FIRST_ANCESTOR = 1 << 6; -var HostPortal = 4; // A subtree. Could be an entry point to a different renderer. + var restoreImpl = null; + var restoreTarget = null; + var restoreQueue = null; -var HostComponent = 5; -var HostText = 6; -var Fragment = 7; -var Mode = 8; -var ContextConsumer = 9; -var ContextProvider = 10; -var ForwardRef = 11; -var Profiler = 12; -var SuspenseComponent = 13; -var MemoComponent = 14; -var SimpleMemoComponent = 15; -var LazyComponent = 16; -var IncompleteClassComponent = 17; -var DehydratedFragment = 18; -var SuspenseListComponent = 19; -var FundamentalComponent = 20; -var ScopeComponent = 21; + function restoreStateOfTarget(target) { + // We perform this translation at the end of the event loop so that we + // always receive the correct fiber here + var internalInstance = getInstanceFromNode(target); -var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; // Prevent newer renderers from RTE when used with older react package versions. -// Current owner and dispatcher used to share the same ref, -// but PR #14548 split them out to better support the react-debug-tools package. + if (!internalInstance) { + // Unmounted + return; + } -if (!ReactSharedInternals.hasOwnProperty('ReactCurrentDispatcher')) { - ReactSharedInternals.ReactCurrentDispatcher = { - current: null - }; -} + if (!(typeof restoreImpl === 'function')) { + { + throw Error( "setRestoreImplementation() needs to be called to handle a target for controlled events. This error is likely caused by a bug in React. Please file an issue." ); + } + } -if (!ReactSharedInternals.hasOwnProperty('ReactCurrentBatchConfig')) { - ReactSharedInternals.ReactCurrentBatchConfig = { - suspense: null - }; -} + var stateNode = internalInstance.stateNode; // Guard against Fiber being unmounted. -var BEFORE_SLASH_RE = /^(.*)[\\\/]/; -var describeComponentFrame = function (name, source, ownerName) { - var sourceInfo = ''; + if (stateNode) { + var _props = getFiberCurrentPropsFromNode(stateNode); - if (source) { - var path = source.fileName; - var fileName = path.replace(BEFORE_SLASH_RE, ''); + restoreImpl(internalInstance.stateNode, internalInstance.type, _props); + } + } - { - // In DEV, include code for a common special case: - // prefer "folder/index.js" instead of just "index.js". - if (/^index\./.test(fileName)) { - var match = path.match(BEFORE_SLASH_RE); + function setRestoreImplementation(impl) { + restoreImpl = impl; + } + function enqueueStateRestore(target) { + if (restoreTarget) { + if (restoreQueue) { + restoreQueue.push(target); + } else { + restoreQueue = [target]; + } + } else { + restoreTarget = target; + } + } + function needsStateRestore() { + return restoreTarget !== null || restoreQueue !== null; + } + function restoreStateIfNeeded() { + if (!restoreTarget) { + return; + } - if (match) { - var pathBeforeSlash = match[1]; + var target = restoreTarget; + var queuedTargets = restoreQueue; + restoreTarget = null; + restoreQueue = null; + restoreStateOfTarget(target); - if (pathBeforeSlash) { - var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, ''); - fileName = folderName + '/' + fileName; - } - } + if (queuedTargets) { + for (var i = 0; i < queuedTargets.length; i++) { + restoreStateOfTarget(queuedTargets[i]); } } - - sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')'; - } else if (ownerName) { - sourceInfo = ' (created by ' + ownerName + ')'; } - return '\n in ' + (name || 'Unknown') + sourceInfo; -}; + var enableProfilerTimer = true; // Trace which interactions trigger each commit. -// The Symbol used to tag the ReactElement-like types. If there is no native Symbol -// nor polyfill, then a plain number is used for performance. -var hasSymbol = typeof Symbol === 'function' && Symbol.for; -var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; -var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; -var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; -var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; -var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; -var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; -var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary -// (unstable) APIs that have been removed. Can we remove the symbols? + var enableDeprecatedFlareAPI = false; // Experimental Host Component support. + var enableFundamentalAPI = false; // Experimental Scope support. + var warnAboutStringRefs = false; -var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; -var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; -var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; -var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8; -var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; -var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; -var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5; -var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6; -var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7; -var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; -var FAUX_ITERATOR_SYMBOL = '@@iterator'; -function getIteratorFn(maybeIterable) { - if (maybeIterable === null || typeof maybeIterable !== 'object') { - return null; - } + // the renderer. Such as when we're dispatching events or if third party + // libraries need to call batchedUpdates. Eventually, this API will go away when + // everything is batched by default. We'll then have a similar API to opt-out of + // scheduled work and instead do synchronous work. + // Defaults - var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + var batchedUpdatesImpl = function (fn, bookkeeping) { + return fn(bookkeeping); + }; - if (typeof maybeIterator === 'function') { - return maybeIterator; - } + var discreteUpdatesImpl = function (fn, a, b, c, d) { + return fn(a, b, c, d); + }; - return null; -} + var flushDiscreteUpdatesImpl = function () {}; -/** - * Similar to invariant but only logs a warning if the condition is not met. - * This can be used to log issues in development environments in critical - * paths. Removing the logging code for production environments will keep the - * same logic and follow the same code paths. - */ + var batchedEventUpdatesImpl = batchedUpdatesImpl; + var isInsideEventHandler = false; + var isBatchingEventUpdates = false; -var warning = warningWithoutStack$1; + function finishEventHandler() { + // Here we wait until all updates have propagated, which is important + // when using controlled components within layers: + // https://github.com/facebook/react/issues/1698 + // Then we restore state of any controlled component. + var controlledComponentsHavePendingUpdates = needsStateRestore(); -{ - warning = function (condition, format) { - if (condition) { - return; + if (controlledComponentsHavePendingUpdates) { + // If a controlled event was fired, we may need to restore the state of + // the DOM node back to the controlled value. This is necessary when React + // bails out of the update without touching the DOM. + flushDiscreteUpdatesImpl(); + restoreStateIfNeeded(); } + } - var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; - var stack = ReactDebugCurrentFrame.getStackAddendum(); // eslint-disable-next-line react-internal/warning-and-invariant-args - - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; + function batchedUpdates(fn, bookkeeping) { + if (isInsideEventHandler) { + // If we are currently inside another batch, we need to wait until it + // fully completes before restoring state. + return fn(bookkeeping); } - warningWithoutStack$1.apply(void 0, [false, format + '%s'].concat(args, [stack])); - }; -} - -var warning$1 = warning; - -var Uninitialized = -1; -var Pending = 0; -var Resolved = 1; -var Rejected = 2; -function refineResolvedLazyComponent(lazyComponent) { - return lazyComponent._status === Resolved ? lazyComponent._result : null; -} -function initializeLazyComponentType(lazyComponent) { - if (lazyComponent._status === Uninitialized) { - lazyComponent._status = Pending; - var ctor = lazyComponent._ctor; - var thenable = ctor(); - lazyComponent._result = thenable; - thenable.then(function (moduleObject) { - if (lazyComponent._status === Pending) { - var defaultExport = moduleObject.default; - - { - if (defaultExport === undefined) { - warning$1(false, 'lazy: Expected the result of a dynamic import() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + "const MyComponent = lazy(() => import('./MyComponent'))", moduleObject); - } - } + isInsideEventHandler = true; - lazyComponent._status = Resolved; - lazyComponent._result = defaultExport; - } - }, function (error) { - if (lazyComponent._status === Pending) { - lazyComponent._status = Rejected; - lazyComponent._result = error; - } - }); + try { + return batchedUpdatesImpl(fn, bookkeeping); + } finally { + isInsideEventHandler = false; + finishEventHandler(); + } } -} + function batchedEventUpdates(fn, a, b) { + if (isBatchingEventUpdates) { + // If we are currently inside another batch, we need to wait until it + // fully completes before restoring state. + return fn(a, b); + } -function getWrappedName(outerType, innerType, wrapperName) { - var functionName = innerType.displayName || innerType.name || ''; - return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); -} + isBatchingEventUpdates = true; -function getComponentName(type) { - if (type == null) { - // Host root, text node or just invalid type. - return null; - } + try { + return batchedEventUpdatesImpl(fn, a, b); + } finally { + isBatchingEventUpdates = false; + finishEventHandler(); + } + } // This is for the React Flare event system + function discreteUpdates(fn, a, b, c, d) { + var prevIsInsideEventHandler = isInsideEventHandler; + isInsideEventHandler = true; - { - if (typeof type.tag === 'number') { - warningWithoutStack$1(false, 'Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); + try { + return discreteUpdatesImpl(fn, a, b, c, d); + } finally { + isInsideEventHandler = prevIsInsideEventHandler; + + if (!isInsideEventHandler) { + finishEventHandler(); + } + } + } + function flushDiscreteUpdatesIfNeeded(timeStamp) { + // event.timeStamp isn't overly reliable due to inconsistencies in + // how different browsers have historically provided the time stamp. + // Some browsers provide high-resolution time stamps for all events, + // some provide low-resolution time stamps for all events. FF < 52 + // even mixes both time stamps together. Some browsers even report + // negative time stamps or time stamps that are 0 (iOS9) in some cases. + // Given we are only comparing two time stamps with equality (!==), + // we are safe from the resolution differences. If the time stamp is 0 + // we bail-out of preventing the flush, which can affect semantics, + // such as if an earlier flush removes or adds event listeners that + // are fired in the subsequent flush. However, this is the same + // behaviour as we had before this change, so the risks are low. + if (!isInsideEventHandler && (!enableDeprecatedFlareAPI )) { + flushDiscreteUpdatesImpl(); + } + } + function setBatchingImplementation(_batchedUpdatesImpl, _discreteUpdatesImpl, _flushDiscreteUpdatesImpl, _batchedEventUpdatesImpl) { + batchedUpdatesImpl = _batchedUpdatesImpl; + discreteUpdatesImpl = _discreteUpdatesImpl; + flushDiscreteUpdatesImpl = _flushDiscreteUpdatesImpl; + batchedEventUpdatesImpl = _batchedEventUpdatesImpl; + } + + var DiscreteEvent = 0; + var UserBlockingEvent = 1; + var ContinuousEvent = 2; + + var ReactInternals$1 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + var _ReactInternals$Sched = ReactInternals$1.Scheduler, + unstable_cancelCallback = _ReactInternals$Sched.unstable_cancelCallback, + unstable_now = _ReactInternals$Sched.unstable_now, + unstable_scheduleCallback = _ReactInternals$Sched.unstable_scheduleCallback, + unstable_shouldYield = _ReactInternals$Sched.unstable_shouldYield, + unstable_requestPaint = _ReactInternals$Sched.unstable_requestPaint, + unstable_getFirstCallbackNode = _ReactInternals$Sched.unstable_getFirstCallbackNode, + unstable_runWithPriority = _ReactInternals$Sched.unstable_runWithPriority, + unstable_next = _ReactInternals$Sched.unstable_next, + unstable_continueExecution = _ReactInternals$Sched.unstable_continueExecution, + unstable_pauseExecution = _ReactInternals$Sched.unstable_pauseExecution, + unstable_getCurrentPriorityLevel = _ReactInternals$Sched.unstable_getCurrentPriorityLevel, + unstable_ImmediatePriority = _ReactInternals$Sched.unstable_ImmediatePriority, + unstable_UserBlockingPriority = _ReactInternals$Sched.unstable_UserBlockingPriority, + unstable_NormalPriority = _ReactInternals$Sched.unstable_NormalPriority, + unstable_LowPriority = _ReactInternals$Sched.unstable_LowPriority, + unstable_IdlePriority = _ReactInternals$Sched.unstable_IdlePriority, + unstable_forceFrameRate = _ReactInternals$Sched.unstable_forceFrameRate, + unstable_flushAllWithoutAsserting = _ReactInternals$Sched.unstable_flushAllWithoutAsserting; + + // A reserved attribute. + // It is handled by React separately and shouldn't be written to the DOM. + var RESERVED = 0; // A simple string attribute. + // Attributes that aren't in the whitelist are presumed to have this type. + + var STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called + // "enumerated" attributes with "true" and "false" as possible values. + // When true, it should be set to a "true" string. + // When false, it should be set to a "false" string. + + var BOOLEANISH_STRING = 2; // A real boolean attribute. + // When true, it should be present (set either to an empty string or its name). + // When false, it should be omitted. + + var BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value. + // When true, it should be present (set either to an empty string or its name). + // When false, it should be omitted. + // For any other value, should be present with that value. + + var OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric. + // When falsy, it should be removed. + + var NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric. + // When falsy, it should be removed. + + var POSITIVE_NUMERIC = 6; + + /* eslint-disable max-len */ + var ATTRIBUTE_NAME_START_CHAR = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; + /* eslint-enable max-len */ + + var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; + var ROOT_ATTRIBUTE_NAME = 'data-reactroot'; + var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$'); + var hasOwnProperty = Object.prototype.hasOwnProperty; + var illegalAttributeNameCache = {}; + var validatedAttributeNameCache = {}; + function isAttributeNameSafe(attributeName) { + if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) { + return true; } - } - if (typeof type === 'function') { - return type.displayName || type.name || null; - } + if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) { + return false; + } - if (typeof type === 'string') { - return type; - } + if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) { + validatedAttributeNameCache[attributeName] = true; + return true; + } - switch (type) { - case REACT_FRAGMENT_TYPE: - return 'Fragment'; + illegalAttributeNameCache[attributeName] = true; - case REACT_PORTAL_TYPE: - return 'Portal'; + { + error('Invalid attribute name: `%s`', attributeName); + } - case REACT_PROFILER_TYPE: - return "Profiler"; + return false; + } + function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) { + if (propertyInfo !== null) { + return propertyInfo.type === RESERVED; + } - case REACT_STRICT_MODE_TYPE: - return 'StrictMode'; + if (isCustomComponentTag) { + return false; + } - case REACT_SUSPENSE_TYPE: - return 'Suspense'; + if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) { + return true; + } - case REACT_SUSPENSE_LIST_TYPE: - return 'SuspenseList'; + return false; } + function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) { + if (propertyInfo !== null && propertyInfo.type === RESERVED) { + return false; + } - if (typeof type === 'object') { - switch (type.$$typeof) { - case REACT_CONTEXT_TYPE: - return 'Context.Consumer'; - - case REACT_PROVIDER_TYPE: - return 'Context.Provider'; - - case REACT_FORWARD_REF_TYPE: - return getWrappedName(type, type.render, 'ForwardRef'); + switch (typeof value) { + case 'function': // $FlowIssue symbol is perfectly valid here - case REACT_MEMO_TYPE: - return getComponentName(type.type); + case 'symbol': + // eslint-disable-line + return true; - case REACT_LAZY_TYPE: + case 'boolean': { - var thenable = type; - var resolvedThenable = refineResolvedLazyComponent(thenable); - - if (resolvedThenable) { - return getComponentName(resolvedThenable); + if (isCustomComponentTag) { + return false; } - break; + if (propertyInfo !== null) { + return !propertyInfo.acceptsBooleans; + } else { + var prefix = name.toLowerCase().slice(0, 5); + return prefix !== 'data-' && prefix !== 'aria-'; + } } + + default: + return false; } } + function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) { + if (value === null || typeof value === 'undefined') { + return true; + } - return null; -} + if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) { + return true; + } + + if (isCustomComponentTag) { + return false; + } -var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + if (propertyInfo !== null) { + switch (propertyInfo.type) { + case BOOLEAN: + return !value; -function describeFiber(fiber) { - switch (fiber.tag) { - case HostRoot: - case HostPortal: - case HostText: - case Fragment: - case ContextProvider: - case ContextConsumer: - return ''; + case OVERLOADED_BOOLEAN: + return value === false; - default: - var owner = fiber._debugOwner; - var source = fiber._debugSource; - var name = getComponentName(fiber.type); - var ownerName = null; + case NUMERIC: + return isNaN(value); - if (owner) { - ownerName = getComponentName(owner.type); + case POSITIVE_NUMERIC: + return isNaN(value) || value < 1; } + } - return describeComponentFrame(name, source, ownerName); + return false; } -} - -function getStackByFiberInDevAndProd(workInProgress) { - var info = ''; - var node = workInProgress; + function getPropertyInfo(name) { + return properties.hasOwnProperty(name) ? properties[name] : null; + } + + function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL) { + this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN; + this.attributeName = attributeName; + this.attributeNamespace = attributeNamespace; + this.mustUseProperty = mustUseProperty; + this.propertyName = name; + this.type = type; + this.sanitizeURL = sanitizeURL; + } // When adding attributes to this list, be sure to also add them to + // the `possibleStandardNames` module to ensure casing and incorrect + // name warnings. + + + var properties = {}; // These props are reserved by React. They shouldn't be written to the DOM. + + var reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular + // elements (not just inputs). Now that ReactDOMInput assigns to the + // defaultValue property -- do we need this? + 'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style']; + + reservedProps.forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false); + }); // A few React string attributes have a different name. + // This is a mapping from React prop names to the attribute names. + + [['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) { + var name = _ref[0], + attributeName = _ref[1]; + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty + attributeName, // attributeName + null, // attributeNamespace + false); + }); // These are "enumerated" HTML attributes that accept "true" and "false". + // In React, we let users pass `true` and `false` even though technically + // these aren't boolean attributes (they are coerced to strings). + + ['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty + name.toLowerCase(), // attributeName + null, // attributeNamespace + false); + }); // These are "enumerated" SVG attributes that accept "true" and "false". + // In React, we let users pass `true` and `false` even though technically + // these aren't boolean attributes (they are coerced to strings). + // Since these are SVG attributes, their attribute names are case-sensitive. + + ['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false); + }); // These are HTML boolean attributes. + + ['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM + // on the client side because the browsers are inconsistent. Instead we call focus(). + 'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata + 'itemScope'].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty + name.toLowerCase(), // attributeName + null, // attributeNamespace + false); + }); // These are the few React props that we set as DOM properties + // rather than attributes. These are all booleans. + + ['checked', // Note: `option.selected` is not updated if `select.multiple` is + // disabled with `removeAttribute`. We have special logic for handling this. + 'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false); + }); // These are HTML attributes that are "overloaded booleans": they behave like + // booleans, but can also accept a string value. + + ['capture', 'download' // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false); + }); // These are HTML attributes that must be positive numbers. + + ['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false); + }); // These are HTML attributes that must be numbers. + + ['rowSpan', 'start'].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty + name.toLowerCase(), // attributeName + null, // attributeNamespace + false); + }); + var CAMELIZE = /[\-\:]([a-z])/g; + + var capitalize = function (token) { + return token[1].toUpperCase(); + }; // This is a list of all SVG attributes that need special casing, namespacing, + // or boolean value assignment. Regular attributes that just accept strings + // and have the same names are omitted, just like in the HTML whitelist. + // Some of these attributes can be hard to find. This list was created by + // scraping the MDN documentation. + + + ['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height' // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function (attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty + attributeName, null, // attributeNamespace + false); + }); // String SVG attributes with the xlink namespace. + + ['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function (attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty + attributeName, 'http://www.w3.org/1999/xlink', false); + }); // String SVG attributes with the xml namespace. + + ['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function (attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty + attributeName, 'http://www.w3.org/XML/1998/namespace', false); + }); // These attribute exists both in HTML and SVG. + // The attribute name is case-sensitive in SVG so we can't just use + // the React name like we do for attributes that exist only in HTML. + + ['tabIndex', 'crossOrigin'].forEach(function (attributeName) { + properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty + attributeName.toLowerCase(), // attributeName + null, // attributeNamespace + false); + }); // These attributes accept URLs. These must not allow javascript: URLS. + // These will also need to accept Trusted Types object in the future. + + var xlinkHref = 'xlinkHref'; + properties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty + 'xlink:href', 'http://www.w3.org/1999/xlink', true); + ['src', 'href', 'action', 'formAction'].forEach(function (attributeName) { + properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty + attributeName.toLowerCase(), // attributeName + null, // attributeNamespace + true); + }); - do { - info += describeFiber(node); - node = node.return; - } while (node); + var ReactDebugCurrentFrame = null; - return info; -} -var current = null; -var phase = null; -function getCurrentFiberOwnerNameInDevOrNull() { { - if (current === null) { - return null; - } + ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + } // A javascript: URL can contain leading C0 control or \u0020 SPACE, + // and any newline or tab are filtered out as if they're not part of the URL. + // https://url.spec.whatwg.org/#url-parsing + // Tab or newline are defined as \r\n\t: + // https://infra.spec.whatwg.org/#ascii-tab-or-newline + // A C0 control is a code point in the range \u0000 NULL to \u001F + // INFORMATION SEPARATOR ONE, inclusive: + // https://infra.spec.whatwg.org/#c0-control-or-space + + /* eslint-disable max-len */ - var owner = current._debugOwner; - if (owner !== null && typeof owner !== 'undefined') { - return getComponentName(owner.type); + var isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i; + var didWarn = false; + + function sanitizeURL(url) { + { + if (!didWarn && isJavaScriptProtocol.test(url)) { + didWarn = true; + + error('A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url)); + } } } - return null; -} -function getCurrentFiberStackInDev() { - { - if (current === null) { - return ''; - } // Safe because if current fiber exists, we are reconciling, - // and it is guaranteed to be the work-in-progress version. + /** + * Get the value for a property on a node. Only used in DEV for SSR validation. + * The "expected" argument is used as a hint of what the expected value is. + * Some properties have multiple equivalent values. + */ + function getValueForProperty(node, name, expected, propertyInfo) { + { + if (propertyInfo.mustUseProperty) { + var propertyName = propertyInfo.propertyName; + return node[propertyName]; + } else { + if ( propertyInfo.sanitizeURL) { + // If we haven't fully disabled javascript: URLs, and if + // the hydration is successful of a javascript: URL, we + // still want to warn on the client. + sanitizeURL('' + expected); + } + var attributeName = propertyInfo.attributeName; + var stringValue = null; - return getStackByFiberInDevAndProd(current); - } + if (propertyInfo.type === OVERLOADED_BOOLEAN) { + if (node.hasAttribute(attributeName)) { + var value = node.getAttribute(attributeName); - return ''; -} -function resetCurrentFiber() { - { - ReactDebugCurrentFrame.getCurrentStack = null; - current = null; - phase = null; - } -} -function setCurrentFiber(fiber) { - { - ReactDebugCurrentFrame.getCurrentStack = getCurrentFiberStackInDev; - current = fiber; - phase = null; - } -} -function setCurrentPhase(lifeCyclePhase) { - { - phase = lifeCyclePhase; - } -} + if (value === '') { + return true; + } -var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined'); + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { + return value; + } -function endsWith(subject, search) { - var length = subject.length; - return subject.substring(length - search.length, length) === search; -} + if (value === '' + expected) { + return expected; + } -var ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; -var _assign = ReactInternals.assign; + return value; + } + } else if (node.hasAttribute(attributeName)) { + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { + // We had an attribute but shouldn't have had one, so read it + // for the error message. + return node.getAttribute(attributeName); + } -var PLUGIN_EVENT_SYSTEM = 1; -var RESPONDER_EVENT_SYSTEM = 1 << 1; -var IS_PASSIVE = 1 << 2; -var IS_ACTIVE = 1 << 3; -var PASSIVE_NOT_SUPPORTED = 1 << 4; -var IS_REPLAYED = 1 << 5; + if (propertyInfo.type === BOOLEAN) { + // If this was a boolean, it doesn't matter what the value is + // the fact that we have it is the same as the expected. + return expected; + } // Even if this property uses a namespace we use getAttribute + // because we assume its namespaced name is the same as our config. + // To use getAttributeNS we need the local name which we don't have + // in our config atm. -var restoreImpl = null; -var restoreTarget = null; -var restoreQueue = null; -function restoreStateOfTarget(target) { - // We perform this translation at the end of the event loop so that we - // always receive the correct fiber here - var internalInstance = getInstanceFromNode(target); + stringValue = node.getAttribute(attributeName); + } - if (!internalInstance) { - // Unmounted - return; + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { + return stringValue === null ? expected : stringValue; + } else if (stringValue === '' + expected) { + return expected; + } else { + return stringValue; + } + } + } } + /** + * Get the value for a attribute on a node. Only used in DEV for SSR validation. + * The third argument is used as a hint of what the expected value is. Some + * attributes have multiple equivalent values. + */ - if (!(typeof restoreImpl === 'function')) { + function getValueForAttribute(node, name, expected) { { - throw Error("setRestoreImplementation() needs to be called to handle a target for controlled events. This error is likely caused by a bug in React. Please file an issue."); - } - } + if (!isAttributeNameSafe(name)) { + return; + } - var props = getFiberCurrentPropsFromNode(internalInstance.stateNode); - restoreImpl(internalInstance.stateNode, internalInstance.type, props); -} + if (!node.hasAttribute(name)) { + return expected === undefined ? undefined : null; + } -function setRestoreImplementation(impl) { - restoreImpl = impl; -} -function enqueueStateRestore(target) { - if (restoreTarget) { - if (restoreQueue) { - restoreQueue.push(target); - } else { - restoreQueue = [target]; - } - } else { - restoreTarget = target; - } -} -function needsStateRestore() { - return restoreTarget !== null || restoreQueue !== null; -} -function restoreStateIfNeeded() { - if (!restoreTarget) { - return; - } + var value = node.getAttribute(name); - var target = restoreTarget; - var queuedTargets = restoreQueue; - restoreTarget = null; - restoreQueue = null; - restoreStateOfTarget(target); + if (value === '' + expected) { + return expected; + } - if (queuedTargets) { - for (var i = 0; i < queuedTargets.length; i++) { - restoreStateOfTarget(queuedTargets[i]); + return value; } } -} - -var enableUserTimingAPI = true; // Helps identify side effects in render-phase lifecycle hooks and setState -// reducers by double invoking them in Strict Mode. + /** + * Sets the value for a property on a node. + * + * @param {DOMElement} node + * @param {string} name + * @param {*} value + */ -var debugRenderPhaseSideEffectsForStrictMode = true; // To preserve the "Pause on caught exceptions" behavior of the debugger, we -// replay the begin phase of a failed component inside invokeGuardedCallback. + function setValueForProperty(node, name, value, isCustomComponentTag) { + var propertyInfo = getPropertyInfo(name); -var replayFailedUnitOfWorkWithInvokeGuardedCallback = true; // Warn about deprecated, async-unsafe lifecycles; relates to RFC #6: + if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) { + return; + } -var warnAboutDeprecatedLifecycles = true; // Gather advanced timing metrics for Profiler subtrees. + if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) { + value = null; + } // If the prop isn't in the special list, treat it as a simple attribute. -var enableProfilerTimer = true; // Trace which interactions trigger each commit. -var enableSchedulerTracing = true; // SSR experiments + if (isCustomComponentTag || propertyInfo === null) { + if (isAttributeNameSafe(name)) { + var _attributeName = name; -var enableSuspenseServerRenderer = false; -var enableSelectiveHydration = false; // Only used in www builds. + if (value === null) { + node.removeAttribute(_attributeName); + } else { + node.setAttribute(_attributeName, '' + value); + } + } - // Only used in www builds. + return; + } - // Disable javascript: URL strings in href for XSS protection. + var mustUseProperty = propertyInfo.mustUseProperty; -var disableJavaScriptURLs = false; // React Fire: prevent the value and checked attributes from syncing -// with their related DOM properties + if (mustUseProperty) { + var propertyName = propertyInfo.propertyName; -var disableInputAttributeSyncing = false; // These APIs will no longer be "unstable" in the upcoming 16.7 release, -// Control this behavior with a flag to support 16.6 minor releases in the meanwhile. + if (value === null) { + var type = propertyInfo.type; + node[propertyName] = type === BOOLEAN ? false : ''; + } else { + // Contrary to `setAttribute`, object properties are properly + // `toString`ed by IE8/9. + node[propertyName] = value; + } -var exposeConcurrentModeAPIs = false; -var warnAboutShorthandPropertyCollision = false; // Experimental React Flare event system and event components support. + return; + } // The rest are treated as attributes with special cases. -var enableFlareAPI = false; // Experimental Host Component support. -var enableFundamentalAPI = false; // Experimental Scope support. + var attributeName = propertyInfo.attributeName, + attributeNamespace = propertyInfo.attributeNamespace; -var enableScopeAPI = false; // New API for JSX transforms to target - https://github.com/reactjs/rfcs/pull/107 + if (value === null) { + node.removeAttribute(attributeName); + } else { + var _type = propertyInfo.type; + var attributeValue; - // We will enforce mocking scheduler with scheduler/unstable_mock at some point. (v17?) -// Till then, we warn about the missing mock, but still fallback to a legacy mode compatible version + if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) { + // If attribute type is boolean, we know for sure it won't be an execution sink + // and we won't require Trusted Type here. + attributeValue = ''; + } else { + // `setAttribute` with objects becomes only `[object]` in IE8/9, + // ('' + value) makes it output the correct toString()-value. + { + attributeValue = '' + value; + } -var warnAboutUnmockedScheduler = false; // For tests, we flush suspense fallbacks in an act scope; -// *except* in some of our own tests, where we test incremental loading states. + if (propertyInfo.sanitizeURL) { + sanitizeURL(attributeValue.toString()); + } + } -var flushSuspenseFallbacksInTests = true; // Add a callback property to suspense to notify which promises are currently -// in the update queue. This allows reporting and tracing of what is causing -// the user to see a loading state. -// Also allows hydration callbacks to fire when a dehydrated boundary gets -// hydrated or deleted. + if (attributeNamespace) { + node.setAttributeNS(attributeNamespace, attributeName, attributeValue); + } else { + node.setAttribute(attributeName, attributeValue); + } + } + } -var enableSuspenseCallback = false; // Part of the simplification of React.createElement so we can eventually move -// from React.createElement to React.jsx -// https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md + var BEFORE_SLASH_RE = /^(.*)[\\\/]/; + function describeComponentFrame (name, source, ownerName) { + var sourceInfo = ''; -var warnAboutDefaultPropsOnFunctionComponents = false; -var warnAboutStringRefs = false; -var disableLegacyContext = false; -var disableSchedulerTimeoutBasedOnReactExpirationTime = false; -var enableTrustedTypesIntegration = false; // Flag to turn event.target and event.currentTarget in ReactNative from a reactTag to a component instance + if (source) { + var path = source.fileName; + var fileName = path.replace(BEFORE_SLASH_RE, ''); -// the renderer. Such as when we're dispatching events or if third party -// libraries need to call batchedUpdates. Eventually, this API will go away when -// everything is batched by default. We'll then have a similar API to opt-out of -// scheduled work and instead do synchronous work. -// Defaults + { + // In DEV, include code for a common special case: + // prefer "folder/index.js" instead of just "index.js". + if (/^index\./.test(fileName)) { + var match = path.match(BEFORE_SLASH_RE); -var batchedUpdatesImpl = function (fn, bookkeeping) { - return fn(bookkeeping); -}; + if (match) { + var pathBeforeSlash = match[1]; -var discreteUpdatesImpl = function (fn, a, b, c) { - return fn(a, b, c); -}; + if (pathBeforeSlash) { + var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, ''); + fileName = folderName + '/' + fileName; + } + } + } + } -var flushDiscreteUpdatesImpl = function () {}; + sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')'; + } else if (ownerName) { + sourceInfo = ' (created by ' + ownerName + ')'; + } + + return '\n in ' + (name || 'Unknown') + sourceInfo; + } + + // The Symbol used to tag the ReactElement-like types. If there is no native Symbol + // nor polyfill, then a plain number is used for performance. + var hasSymbol = typeof Symbol === 'function' && Symbol.for; + var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; + var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; + var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; + var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; + var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; + var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; + var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary + var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; + var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; + var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; + var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8; + var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; + var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; + var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9; + var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = '@@iterator'; + function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== 'object') { + return null; + } -var batchedEventUpdatesImpl = batchedUpdatesImpl; -var isInsideEventHandler = false; -var isBatchingEventUpdates = false; + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; -function finishEventHandler() { - // Here we wait until all updates have propagated, which is important - // when using controlled components within layers: - // https://github.com/facebook/react/issues/1698 - // Then we restore state of any controlled component. - var controlledComponentsHavePendingUpdates = needsStateRestore(); + if (typeof maybeIterator === 'function') { + return maybeIterator; + } - if (controlledComponentsHavePendingUpdates) { - // If a controlled event was fired, we may need to restore the state of - // the DOM node back to the controlled value. This is necessary when React - // bails out of the update without touching the DOM. - flushDiscreteUpdatesImpl(); - restoreStateIfNeeded(); + return null; } -} -function batchedUpdates(fn, bookkeeping) { - if (isInsideEventHandler) { - // If we are currently inside another batch, we need to wait until it - // fully completes before restoring state. - return fn(bookkeeping); + var Uninitialized = -1; + var Pending = 0; + var Resolved = 1; + var Rejected = 2; + function refineResolvedLazyComponent(lazyComponent) { + return lazyComponent._status === Resolved ? lazyComponent._result : null; } + function initializeLazyComponentType(lazyComponent) { + if (lazyComponent._status === Uninitialized) { + lazyComponent._status = Pending; + var ctor = lazyComponent._ctor; + var thenable = ctor(); + lazyComponent._result = thenable; + thenable.then(function (moduleObject) { + if (lazyComponent._status === Pending) { + var defaultExport = moduleObject.default; - isInsideEventHandler = true; + { + if (defaultExport === undefined) { + error('lazy: Expected the result of a dynamic import() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + "const MyComponent = lazy(() => import('./MyComponent'))", moduleObject); + } + } - try { - return batchedUpdatesImpl(fn, bookkeeping); - } finally { - isInsideEventHandler = false; - finishEventHandler(); - } -} -function batchedEventUpdates(fn, a, b) { - if (isBatchingEventUpdates) { - // If we are currently inside another batch, we need to wait until it - // fully completes before restoring state. - return fn(a, b); - } - - isBatchingEventUpdates = true; + lazyComponent._status = Resolved; + lazyComponent._result = defaultExport; + } + }, function (error) { + if (lazyComponent._status === Pending) { + lazyComponent._status = Rejected; + lazyComponent._result = error; + } + }); + } + } - try { - return batchedEventUpdatesImpl(fn, a, b); - } finally { - isBatchingEventUpdates = false; - finishEventHandler(); + function getWrappedName(outerType, innerType, wrapperName) { + var functionName = innerType.displayName || innerType.name || ''; + return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); } -} // This is for the React Flare event system -function executeUserEventHandler(fn, value) { - var previouslyInEventHandler = isInsideEventHandler; + function getComponentName(type) { + if (type == null) { + // Host root, text node or just invalid type. + return null; + } - try { - isInsideEventHandler = true; - var type = typeof value === 'object' && value !== null ? value.type : ''; - invokeGuardedCallbackAndCatchFirstError(type, fn, undefined, value); - } finally { - isInsideEventHandler = previouslyInEventHandler; - } -} -function discreteUpdates(fn, a, b, c) { - var prevIsInsideEventHandler = isInsideEventHandler; - isInsideEventHandler = true; - - try { - return discreteUpdatesImpl(fn, a, b, c); - } finally { - isInsideEventHandler = prevIsInsideEventHandler; - - if (!isInsideEventHandler) { - finishEventHandler(); + { + if (typeof type.tag === 'number') { + error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); + } } - } -} -var lastFlushedEventTimeStamp = 0; -function flushDiscreteUpdatesIfNeeded(timeStamp) { - // event.timeStamp isn't overly reliable due to inconsistencies in - // how different browsers have historically provided the time stamp. - // Some browsers provide high-resolution time stamps for all events, - // some provide low-resolution time stamps for all events. FF < 52 - // even mixes both time stamps together. Some browsers even report - // negative time stamps or time stamps that are 0 (iOS9) in some cases. - // Given we are only comparing two time stamps with equality (!==), - // we are safe from the resolution differences. If the time stamp is 0 - // we bail-out of preventing the flush, which can affect semantics, - // such as if an earlier flush removes or adds event listeners that - // are fired in the subsequent flush. However, this is the same - // behaviour as we had before this change, so the risks are low. - if (!isInsideEventHandler && (!enableFlareAPI || timeStamp === 0 || lastFlushedEventTimeStamp !== timeStamp)) { - lastFlushedEventTimeStamp = timeStamp; - flushDiscreteUpdatesImpl(); - } -} -function setBatchingImplementation(_batchedUpdatesImpl, _discreteUpdatesImpl, _flushDiscreteUpdatesImpl, _batchedEventUpdatesImpl) { - batchedUpdatesImpl = _batchedUpdatesImpl; - discreteUpdatesImpl = _discreteUpdatesImpl; - flushDiscreteUpdatesImpl = _flushDiscreteUpdatesImpl; - batchedEventUpdatesImpl = _batchedEventUpdatesImpl; -} - -var DiscreteEvent = 0; -var UserBlockingEvent = 1; -var ContinuousEvent = 2; - -var ReactInternals$1 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; -var _ReactInternals$Sched = ReactInternals$1.Scheduler; -var unstable_cancelCallback = _ReactInternals$Sched.unstable_cancelCallback; -var unstable_now = _ReactInternals$Sched.unstable_now; -var unstable_scheduleCallback = _ReactInternals$Sched.unstable_scheduleCallback; -var unstable_shouldYield = _ReactInternals$Sched.unstable_shouldYield; -var unstable_requestPaint = _ReactInternals$Sched.unstable_requestPaint; -var unstable_getFirstCallbackNode = _ReactInternals$Sched.unstable_getFirstCallbackNode; -var unstable_runWithPriority = _ReactInternals$Sched.unstable_runWithPriority; -var unstable_next = _ReactInternals$Sched.unstable_next; -var unstable_continueExecution = _ReactInternals$Sched.unstable_continueExecution; -var unstable_pauseExecution = _ReactInternals$Sched.unstable_pauseExecution; -var unstable_getCurrentPriorityLevel = _ReactInternals$Sched.unstable_getCurrentPriorityLevel; -var unstable_ImmediatePriority = _ReactInternals$Sched.unstable_ImmediatePriority; -var unstable_UserBlockingPriority = _ReactInternals$Sched.unstable_UserBlockingPriority; -var unstable_NormalPriority = _ReactInternals$Sched.unstable_NormalPriority; -var unstable_LowPriority = _ReactInternals$Sched.unstable_LowPriority; -var unstable_IdlePriority = _ReactInternals$Sched.unstable_IdlePriority; -var unstable_forceFrameRate = _ReactInternals$Sched.unstable_forceFrameRate; -var unstable_flushAllWithoutAsserting = _ReactInternals$Sched.unstable_flushAllWithoutAsserting; - -// CommonJS interop named imports. - -var UserBlockingPriority = unstable_UserBlockingPriority; -var runWithPriority = unstable_runWithPriority; -var listenToResponderEventTypesImpl; -function setListenToResponderEventTypes(_listenToResponderEventTypesImpl) { - listenToResponderEventTypesImpl = _listenToResponderEventTypesImpl; -} -var rootEventTypesToEventResponderInstances = new Map(); -var DoNotPropagateToNextResponder = 0; -var PropagateToNextResponder = 1; -var currentTimeStamp = 0; -var currentInstance = null; -var currentDocument = null; -var currentPropagationBehavior = DoNotPropagateToNextResponder; -var eventResponderContext = { - dispatchEvent: function (eventValue, eventListener, eventPriority) { - validateResponderContext(); - validateEventValue(eventValue); - - switch (eventPriority) { - case DiscreteEvent: - { - flushDiscreteUpdatesIfNeeded(currentTimeStamp); - discreteUpdates(function () { - return executeUserEventHandler(eventListener, eventValue); - }); - break; - } - case UserBlockingEvent: - { - runWithPriority(UserBlockingPriority, function () { - return executeUserEventHandler(eventListener, eventValue); - }); - break; - } + if (typeof type === 'function') { + return type.displayName || type.name || null; + } - case ContinuousEvent: - { - executeUserEventHandler(eventListener, eventValue); - break; - } + if (typeof type === 'string') { + return type; } - }, - isTargetWithinResponder: function (target) { - validateResponderContext(); - if (target != null) { - var fiber = getClosestInstanceFromNode(target); - var responderFiber = currentInstance.fiber; + switch (type) { + case REACT_FRAGMENT_TYPE: + return 'Fragment'; - while (fiber !== null) { - if (fiber === responderFiber || fiber.alternate === responderFiber) { - return true; - } + case REACT_PORTAL_TYPE: + return 'Portal'; - fiber = fiber.return; - } - } + case REACT_PROFILER_TYPE: + return "Profiler"; - return false; - }, - isTargetWithinResponderScope: function (target) { - validateResponderContext(); - var componentInstance = currentInstance; - var responder = componentInstance.responder; - - if (target != null) { - var fiber = getClosestInstanceFromNode(target); - var responderFiber = currentInstance.fiber; - - while (fiber !== null) { - if (fiber === responderFiber || fiber.alternate === responderFiber) { - return true; - } + case REACT_STRICT_MODE_TYPE: + return 'StrictMode'; - if (doesFiberHaveResponder(fiber, responder)) { - return false; - } + case REACT_SUSPENSE_TYPE: + return 'Suspense'; - fiber = fiber.return; - } + case REACT_SUSPENSE_LIST_TYPE: + return 'SuspenseList'; } - return false; - }, - isTargetWithinNode: function (childTarget, parentTarget) { - validateResponderContext(); - var childFiber = getClosestInstanceFromNode(childTarget); - var parentFiber = getClosestInstanceFromNode(parentTarget); + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + return 'Context.Consumer'; - if (childFiber != null && parentFiber != null) { - var parentAlternateFiber = parentFiber.alternate; - var node = childFiber; + case REACT_PROVIDER_TYPE: + return 'Context.Provider'; - while (node !== null) { - if (node === parentFiber || node === parentAlternateFiber) { - return true; - } + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, 'ForwardRef'); - node = node.return; + case REACT_MEMO_TYPE: + return getComponentName(type.type); + + case REACT_BLOCK_TYPE: + return getComponentName(type.render); + + case REACT_LAZY_TYPE: + { + var thenable = type; + var resolvedThenable = refineResolvedLazyComponent(thenable); + + if (resolvedThenable) { + return getComponentName(resolvedThenable); + } + + break; + } } + } - return false; - } // Fallback to DOM APIs + return null; + } + + var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + + function describeFiber(fiber) { + switch (fiber.tag) { + case HostRoot: + case HostPortal: + case HostText: + case Fragment: + case ContextProvider: + case ContextConsumer: + return ''; + default: + var owner = fiber._debugOwner; + var source = fiber._debugSource; + var name = getComponentName(fiber.type); + var ownerName = null; - return parentTarget.contains(childTarget); - }, - addRootEventTypes: function (rootEventTypes) { - validateResponderContext(); - listenToResponderEventTypesImpl(rootEventTypes, currentDocument); + if (owner) { + ownerName = getComponentName(owner.type); + } - for (var i = 0; i < rootEventTypes.length; i++) { - var rootEventType = rootEventTypes[i]; - var eventResponderInstance = currentInstance; - registerRootEventType(rootEventType, eventResponderInstance); + return describeComponentFrame(name, source, ownerName); } - }, - removeRootEventTypes: function (rootEventTypes) { - validateResponderContext(); + } - for (var i = 0; i < rootEventTypes.length; i++) { - var rootEventType = rootEventTypes[i]; - var rootEventResponders = rootEventTypesToEventResponderInstances.get(rootEventType); - var rootEventTypesSet = currentInstance.rootEventTypes; + function getStackByFiberInDevAndProd(workInProgress) { + var info = ''; + var node = workInProgress; + + do { + info += describeFiber(node); + node = node.return; + } while (node); - if (rootEventTypesSet !== null) { - rootEventTypesSet.delete(rootEventType); + return info; + } + var current = null; + var isRendering = false; + function getCurrentFiberOwnerNameInDevOrNull() { + { + if (current === null) { + return null; } - if (rootEventResponders !== undefined) { - rootEventResponders.delete(currentInstance); + var owner = current._debugOwner; + + if (owner !== null && typeof owner !== 'undefined') { + return getComponentName(owner.type); } } - }, - getActiveDocument: getActiveDocument, - objectAssign: _assign, - getTimeStamp: function () { - validateResponderContext(); - return currentTimeStamp; - }, - isTargetWithinHostComponent: function (target, elementType) { - validateResponderContext(); - var fiber = getClosestInstanceFromNode(target); - while (fiber !== null) { - if (fiber.tag === HostComponent && fiber.type === elementType) { - return true; - } + return null; + } + function getCurrentFiberStackInDev() { + { + if (current === null) { + return ''; + } // Safe because if current fiber exists, we are reconciling, + // and it is guaranteed to be the work-in-progress version. - fiber = fiber.return; - } - return false; - }, - continuePropagation: function () { - currentPropagationBehavior = PropagateToNextResponder; - }, - enqueueStateRestore: enqueueStateRestore, - getResponderNode: function () { - validateResponderContext(); - var responderFiber = currentInstance.fiber; - - if (responderFiber.tag === ScopeComponent) { - return null; + return getStackByFiberInDevAndProd(current); + } + } + function resetCurrentFiber() { + { + ReactDebugCurrentFrame$1.getCurrentStack = null; + current = null; + isRendering = false; + } + } + function setCurrentFiber(fiber) { + { + ReactDebugCurrentFrame$1.getCurrentStack = getCurrentFiberStackInDev; + current = fiber; + isRendering = false; + } + } + function setIsRendering(rendering) { + { + isRendering = rendering; } - - return responderFiber.stateNode; } -}; -function validateEventValue(eventValue) { - if (typeof eventValue === 'object' && eventValue !== null) { - var target = eventValue.target, - type = eventValue.type, - timeStamp = eventValue.timeStamp; + // Flow does not allow string concatenation of most non-string types. To work + // around this limitation, we use an opaque type that can only be obtained by + // passing the value through getToStringValue first. + function toString(value) { + return '' + value; + } + function getToStringValue(value) { + switch (typeof value) { + case 'boolean': + case 'number': + case 'object': + case 'string': + case 'undefined': + return value; - if (target == null || type == null || timeStamp == null) { - throw new Error('context.dispatchEvent: "target", "timeStamp", and "type" fields on event object are required.'); + default: + // function, symbol are assigned as empty strings + return ''; } + } - var showWarning = function (name) { - { - warning$1(false, '%s is not available on event objects created from event responder modules (React Flare). ' + 'Try wrapping in a conditional, i.e. `if (event.type !== "press") { event.%s }`', name, name); - } - }; + /** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ - eventValue.isDefaultPrevented = function () { - { - showWarning('isDefaultPrevented()'); - } - }; + var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; - eventValue.isPropagationStopped = function () { - { - showWarning('isPropagationStopped()'); - } - }; // $FlowFixMe: we don't need value, Flow thinks we do + var ReactPropTypesSecret_1 = ReactPropTypesSecret; + var printWarning$1 = function() {}; - Object.defineProperty(eventValue, 'nativeEvent', { - get: function () { - { - showWarning('nativeEvent'); - } + { + var ReactPropTypesSecret$1 = ReactPropTypesSecret_1; + var loggedTypeFailures = {}; + var has = Function.call.bind(Object.prototype.hasOwnProperty); + + printWarning$1 = function(text) { + var message = 'Warning: ' + text; + if (typeof console !== 'undefined') { + console.error(message); } - }); + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) {} + }; } -} -function doesFiberHaveResponder(fiber, responder) { - var tag = fiber.tag; - - if (tag === HostComponent || tag === ScopeComponent) { - var dependencies = fiber.dependencies; + /** + * Assert that the values match with the type specs. + * Error messages are memorized and will only be shown once. + * + * @param {object} typeSpecs Map of name to a ReactPropType + * @param {object} values Runtime values that need to be type-checked + * @param {string} location e.g. "prop", "context", "child context" + * @param {string} componentName Name of the component for error messages. + * @param {?Function} getStack Returns the component stack. + * @private + */ + function checkPropTypes(typeSpecs, values, location, componentName, getStack) { + { + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error; + // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + var err = Error( + (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + ); + err.name = 'Invariant Violation'; + throw err; + } + error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret$1); + } catch (ex) { + error = ex; + } + if (error && !(error instanceof Error)) { + printWarning$1( + (componentName || 'React class') + ': type specification of ' + + location + ' `' + typeSpecName + '` is invalid; the type checker ' + + 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' + + 'You may have forgotten to pass an argument to the type checker ' + + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + + 'shape all require an argument).' + ); + } + if (error instanceof Error && !(error.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error.message] = true; - if (dependencies !== null) { - var respondersMap = dependencies.responders; + var stack = getStack ? getStack() : ''; - if (respondersMap !== null && respondersMap.has(responder)) { - return true; + printWarning$1( + 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '') + ); + } + } } } } - return false; -} - -function getActiveDocument() { - return currentDocument; -} - -function createDOMResponderEvent(topLevelType, nativeEvent, nativeEventTarget, passive, passiveSupported) { - var _ref = nativeEvent, - buttons = _ref.buttons, - pointerType = _ref.pointerType; - var eventPointerType = ''; + /** + * Resets warning cache when testing. + * + * @private + */ + checkPropTypes.resetWarningCache = function() { + { + loggedTypeFailures = {}; + } + }; - if (pointerType !== undefined) { - eventPointerType = pointerType; - } else if (nativeEvent.key !== undefined) { - eventPointerType = 'keyboard'; - } else if (buttons !== undefined) { - eventPointerType = 'mouse'; - } else if (nativeEvent.changedTouches !== undefined) { - eventPointerType = 'touch'; - } + var checkPropTypes_1 = checkPropTypes; - return { - nativeEvent: nativeEvent, - passive: passive, - passiveSupported: passiveSupported, - pointerType: eventPointerType, - target: nativeEventTarget, - type: topLevelType + var ReactDebugCurrentFrame$2 = null; + var ReactControlledValuePropTypes = { + checkPropTypes: null }; -} -function responderEventTypesContainType(eventTypes, type) { - for (var i = 0, len = eventTypes.length; i < len; i++) { - if (eventTypes[i] === type) { - return true; - } - } + { + ReactDebugCurrentFrame$2 = ReactSharedInternals.ReactDebugCurrentFrame; + var hasReadOnlyValue = { + button: true, + checkbox: true, + image: true, + hidden: true, + radio: true, + reset: true, + submit: true + }; + var propTypes = { + value: function (props, propName, componentName) { + if (hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled || props[propName] == null || enableDeprecatedFlareAPI ) { + return null; + } - return false; -} + return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); + }, + checked: function (props, propName, componentName) { + if (props.onChange || props.readOnly || props.disabled || props[propName] == null || enableDeprecatedFlareAPI ) { + return null; + } -function validateResponderTargetEventTypes(eventType, responder) { - var targetEventTypes = responder.targetEventTypes; // Validate the target event type exists on the responder + return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); + } + }; + /** + * Provide a linked `value` attribute for controlled forms. You should not use + * this outside of the ReactDOM controlled form components. + */ - if (targetEventTypes !== null) { - return responderEventTypesContainType(targetEventTypes, eventType); + ReactControlledValuePropTypes.checkPropTypes = function (tagName, props) { + checkPropTypes_1(propTypes, props, 'prop', tagName, ReactDebugCurrentFrame$2.getStackAddendum); + }; } - return false; -} + function isCheckable(elem) { + var type = elem.type; + var nodeName = elem.nodeName; + return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio'); + } -function traverseAndHandleEventResponderInstances(topLevelType, targetFiber, nativeEvent, nativeEventTarget, eventSystemFlags) { - var isPassiveEvent = (eventSystemFlags & IS_PASSIVE) !== 0; - var isPassiveSupported = (eventSystemFlags & PASSIVE_NOT_SUPPORTED) === 0; - var isPassive = isPassiveEvent || !isPassiveSupported; - var eventType = isPassive ? topLevelType : topLevelType + '_active'; // Trigger event responders in this order: - // - Bubble target responder phase - // - Root responder phase + function getTracker(node) { + return node._valueTracker; + } - var visitedResponders = new Set(); - var responderEvent = createDOMResponderEvent(topLevelType, nativeEvent, nativeEventTarget, isPassiveEvent, isPassiveSupported); - var node = targetFiber; - var insidePortal = false; + function detachTracker(node) { + node._valueTracker = null; + } - while (node !== null) { - var _node = node, - dependencies = _node.dependencies, - tag = _node.tag; + function getValueFromNode(node) { + var value = ''; - if (tag === HostPortal) { - insidePortal = true; - } else if ((tag === HostComponent || tag === ScopeComponent) && dependencies !== null) { - var respondersMap = dependencies.responders; + if (!node) { + return value; + } - if (respondersMap !== null) { - var responderInstances = Array.from(respondersMap.values()); + if (isCheckable(node)) { + value = node.checked ? 'true' : 'false'; + } else { + value = node.value; + } - for (var i = 0, length = responderInstances.length; i < length; i++) { - var responderInstance = responderInstances[i]; - var props = responderInstance.props, - responder = responderInstance.responder, - state = responderInstance.state; + return value; + } - if (!visitedResponders.has(responder) && validateResponderTargetEventTypes(eventType, responder) && (!insidePortal || responder.targetPortalPropagation)) { - visitedResponders.add(responder); - var onEvent = responder.onEvent; + function trackValueOnNode(node) { + var valueField = isCheckable(node) ? 'checked' : 'value'; + var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField); + var currentValue = '' + node[valueField]; // if someone has already defined a value or Safari, then bail + // and don't track value will cause over reporting of changes, + // but it's better then a hard failure + // (needed for certain tests that spyOn input values and Safari) - if (onEvent !== null) { - currentInstance = responderInstance; - onEvent(responderEvent, eventResponderContext, props, state); + if (node.hasOwnProperty(valueField) || typeof descriptor === 'undefined' || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') { + return; + } - if (currentPropagationBehavior === PropagateToNextResponder) { - visitedResponders.delete(responder); - currentPropagationBehavior = DoNotPropagateToNextResponder; - } - } - } - } + var get = descriptor.get, + set = descriptor.set; + Object.defineProperty(node, valueField, { + configurable: true, + get: function () { + return get.call(this); + }, + set: function (value) { + currentValue = '' + value; + set.call(this, value); + } + }); // We could've passed this the first time + // but it triggers a bug in IE11 and Edge 14/15. + // Calling defineProperty() again should be equivalent. + // https://github.com/facebook/react/issues/11768 + + Object.defineProperty(node, valueField, { + enumerable: descriptor.enumerable + }); + var tracker = { + getValue: function () { + return currentValue; + }, + setValue: function (value) { + currentValue = '' + value; + }, + stopTracking: function () { + detachTracker(node); + delete node[valueField]; } - } + }; + return tracker; + } + + function track(node) { + if (getTracker(node)) { + return; + } // TODO: Once it's just Fiber we can move this to node._wrapperState - node = node.return; - } // Root phase + node._valueTracker = trackValueOnNode(node); + } + function updateValueIfChanged(node) { + if (!node) { + return false; + } - var rootEventResponderInstances = rootEventTypesToEventResponderInstances.get(eventType); + var tracker = getTracker(node); // if there is no tracker at this point it's unlikely + // that trying again will succeed - if (rootEventResponderInstances !== undefined) { - var _responderInstances = Array.from(rootEventResponderInstances); + if (!tracker) { + return true; + } - for (var _i = 0; _i < _responderInstances.length; _i++) { - var _responderInstance = _responderInstances[_i]; - var props = _responderInstance.props, - responder = _responderInstance.responder, - state = _responderInstance.state; - var onRootEvent = responder.onRootEvent; + var lastValue = tracker.getValue(); + var nextValue = getValueFromNode(node); - if (onRootEvent !== null) { - currentInstance = _responderInstance; - onRootEvent(responderEvent, eventResponderContext, props, state); - } + if (nextValue !== lastValue) { + tracker.setValue(nextValue); + return true; } - } -} -function mountEventResponder(responder, responderInstance, props, state) { - var onMount = responder.onMount; + return false; + } - if (onMount !== null) { - var previousInstance = currentInstance; - currentInstance = responderInstance; + var didWarnValueDefaultValue = false; + var didWarnCheckedDefaultChecked = false; + var didWarnControlledToUncontrolled = false; + var didWarnUncontrolledToControlled = false; - try { - batchedEventUpdates(function () { - onMount(eventResponderContext, props, state); - }); - } finally { - currentInstance = previousInstance; - } + function isControlled(props) { + var usesChecked = props.type === 'checkbox' || props.type === 'radio'; + return usesChecked ? props.checked != null : props.value != null; } -} -function unmountEventResponder(responderInstance) { - var responder = responderInstance.responder; - var onUnmount = responder.onUnmount; + /** + * Implements an <input> host component that allows setting these optional + * props: `checked`, `value`, `defaultChecked`, and `defaultValue`. + * + * If `checked` or `value` are not supplied (or null/undefined), user actions + * that affect the checked state or value will trigger updates to the element. + * + * If they are supplied (and not null/undefined), the rendered element will not + * trigger updates to the element. Instead, the props must change in order for + * the rendered element to be updated. + * + * The rendered element will be initialized as unchecked (or `defaultChecked`) + * with an empty value (or `defaultValue`). + * + * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html + */ - if (onUnmount !== null) { - var props = responderInstance.props, - state = responderInstance.state; - var previousInstance = currentInstance; - currentInstance = responderInstance; - try { - batchedEventUpdates(function () { - onUnmount(eventResponderContext, props, state); - }); - } finally { - currentInstance = previousInstance; - } + function getHostProps(element, props) { + var node = element; + var checked = props.checked; + + var hostProps = _assign({}, props, { + defaultChecked: undefined, + defaultValue: undefined, + value: undefined, + checked: checked != null ? checked : node._wrapperState.initialChecked + }); + + return hostProps; } + function initWrapperState(element, props) { + { + ReactControlledValuePropTypes.checkPropTypes('input', props); - var rootEventTypesSet = responderInstance.rootEventTypes; + if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) { + error('%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type); - if (rootEventTypesSet !== null) { - var rootEventTypes = Array.from(rootEventTypesSet); + didWarnCheckedDefaultChecked = true; + } - for (var i = 0; i < rootEventTypes.length; i++) { - var topLevelEventType = rootEventTypes[i]; - var rootEventResponderInstances = rootEventTypesToEventResponderInstances.get(topLevelEventType); + if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) { + error('%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type); - if (rootEventResponderInstances !== undefined) { - rootEventResponderInstances.delete(responderInstance); + didWarnValueDefaultValue = true; } } + + var node = element; + var defaultValue = props.defaultValue == null ? '' : props.defaultValue; + node._wrapperState = { + initialChecked: props.checked != null ? props.checked : props.defaultChecked, + initialValue: getToStringValue(props.value != null ? props.value : defaultValue), + controlled: isControlled(props) + }; } -} + function updateChecked(element, props) { + var node = element; + var checked = props.checked; -function validateResponderContext() { - if (!(currentInstance !== null)) { - { - throw Error("An event responder context was used outside of an event cycle."); + if (checked != null) { + setValueForProperty(node, 'checked', checked, false); } } -} + function updateWrapper(element, props) { + var node = element; + + { + var controlled = isControlled(props); -function dispatchEventForResponderEventSystem(topLevelType, targetFiber, nativeEvent, nativeEventTarget, eventSystemFlags) { - if (enableFlareAPI) { - var previousInstance = currentInstance; - var previousTimeStamp = currentTimeStamp; - var previousDocument = currentDocument; - var previousPropagationBehavior = currentPropagationBehavior; - currentPropagationBehavior = DoNotPropagateToNextResponder; // nodeType 9 is DOCUMENT_NODE + if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) { + error('A component is changing an uncontrolled input of type %s to be controlled. ' + 'Input elements should not switch from uncontrolled to controlled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type); - currentDocument = nativeEventTarget.nodeType === 9 ? nativeEventTarget : nativeEventTarget.ownerDocument; // We might want to control timeStamp another way here + didWarnUncontrolledToControlled = true; + } - currentTimeStamp = nativeEvent.timeStamp; + if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) { + error('A component is changing a controlled input of type %s to be uncontrolled. ' + 'Input elements should not switch from controlled to uncontrolled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type); - try { - batchedEventUpdates(function () { - traverseAndHandleEventResponderInstances(topLevelType, targetFiber, nativeEvent, nativeEventTarget, eventSystemFlags); - }); - } finally { - currentInstance = previousInstance; - currentTimeStamp = previousTimeStamp; - currentDocument = previousDocument; - currentPropagationBehavior = previousPropagationBehavior; + didWarnControlledToUncontrolled = true; + } } - } -} -function addRootEventTypesForResponderInstance(responderInstance, rootEventTypes) { - for (var i = 0; i < rootEventTypes.length; i++) { - var rootEventType = rootEventTypes[i]; - registerRootEventType(rootEventType, responderInstance); - } -} -function registerRootEventType(rootEventType, eventResponderInstance) { - var rootEventResponderInstances = rootEventTypesToEventResponderInstances.get(rootEventType); - - if (rootEventResponderInstances === undefined) { - rootEventResponderInstances = new Set(); - rootEventTypesToEventResponderInstances.set(rootEventType, rootEventResponderInstances); - } + updateChecked(element, props); + var value = getToStringValue(props.value); + var type = props.type; - var rootEventTypesSet = eventResponderInstance.rootEventTypes; + if (value != null) { + if (type === 'number') { + if (value === 0 && node.value === '' || // We explicitly want to coerce to number here if possible. + // eslint-disable-next-line + node.value != value) { + node.value = toString(value); + } + } else if (node.value !== toString(value)) { + node.value = toString(value); + } + } else if (type === 'submit' || type === 'reset') { + // Submit/reset inputs need the attribute removed completely to avoid + // blank-text buttons. + node.removeAttribute('value'); + return; + } - if (rootEventTypesSet === null) { - rootEventTypesSet = eventResponderInstance.rootEventTypes = new Set(); - } + { + // When syncing the value attribute, the value comes from a cascade of + // properties: + // 1. The value React property + // 2. The defaultValue React property + // 3. Otherwise there should be no change + if (props.hasOwnProperty('value')) { + setDefaultValue(node, props.type, value); + } else if (props.hasOwnProperty('defaultValue')) { + setDefaultValue(node, props.type, getToStringValue(props.defaultValue)); + } + } - if (!!rootEventTypesSet.has(rootEventType)) { { - throw Error("addRootEventTypes() found a duplicate root event type of \"" + rootEventType + "\". This might be because the event type exists in the event responder \"rootEventTypes\" array or because of a previous addRootEventTypes() using this root event type."); + // When syncing the checked attribute, it only changes when it needs + // to be removed, such as transitioning from a checkbox into a text input + if (props.checked == null && props.defaultChecked != null) { + node.defaultChecked = !!props.defaultChecked; + } } } + function postMountWrapper(element, props, isHydrating) { + var node = element; // Do not assign value if it is already set. This prevents user text input + // from being lost during SSR hydration. - rootEventTypesSet.add(rootEventType); - rootEventResponderInstances.add(eventResponderInstance); -} - -// A reserved attribute. -// It is handled by React separately and shouldn't be written to the DOM. -var RESERVED = 0; // A simple string attribute. -// Attributes that aren't in the whitelist are presumed to have this type. + if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) { + var type = props.type; + var isButton = type === 'submit' || type === 'reset'; // Avoid setting value attribute on submit/reset inputs as it overrides the + // default value provided by the browser. See: #12872 -var STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called -// "enumerated" attributes with "true" and "false" as possible values. -// When true, it should be set to a "true" string. -// When false, it should be set to a "false" string. + if (isButton && (props.value === undefined || props.value === null)) { + return; + } -var BOOLEANISH_STRING = 2; // A real boolean attribute. -// When true, it should be present (set either to an empty string or its name). -// When false, it should be omitted. + var initialValue = toString(node._wrapperState.initialValue); // Do not assign value if it is already set. This prevents user text input + // from being lost during SSR hydration. -var BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value. -// When true, it should be present (set either to an empty string or its name). -// When false, it should be omitted. -// For any other value, should be present with that value. + if (!isHydrating) { + { + // When syncing the value attribute, the value property should use + // the wrapperState._initialValue property. This uses: + // + // 1. The value React property when present + // 2. The defaultValue React property when present + // 3. An empty string + if (initialValue !== node.value) { + node.value = initialValue; + } + } + } -var OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric. -// When falsy, it should be removed. + { + // Otherwise, the value attribute is synchronized to the property, + // so we assign defaultValue to the same thing as the value property + // assignment step above. + node.defaultValue = initialValue; + } + } // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug + // this is needed to work around a chrome bug where setting defaultChecked + // will sometimes influence the value of checked (even after detachment). + // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416 + // We need to temporarily unset name to avoid disrupting radio button groups. -var NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric. -// When falsy, it should be removed. -var POSITIVE_NUMERIC = 6; + var name = node.name; -/* eslint-disable max-len */ -var ATTRIBUTE_NAME_START_CHAR = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; -/* eslint-enable max-len */ + if (name !== '') { + node.name = ''; + } -var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; + { + // When syncing the checked attribute, both the checked property and + // attribute are assigned at the same time using defaultChecked. This uses: + // + // 1. The checked React property when present + // 2. The defaultChecked React property when present + // 3. Otherwise, false + node.defaultChecked = !node.defaultChecked; + node.defaultChecked = !!node._wrapperState.initialChecked; + } -var ROOT_ATTRIBUTE_NAME = 'data-reactroot'; -var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$'); -var hasOwnProperty = Object.prototype.hasOwnProperty; -var illegalAttributeNameCache = {}; -var validatedAttributeNameCache = {}; -function isAttributeNameSafe(attributeName) { - if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) { - return true; + if (name !== '') { + node.name = name; + } } - - if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) { - return false; + function restoreControlledState(element, props) { + var node = element; + updateWrapper(node, props); + updateNamedCousins(node, props); } - if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) { - validatedAttributeNameCache[attributeName] = true; - return true; - } + function updateNamedCousins(rootNode, props) { + var name = props.name; - illegalAttributeNameCache[attributeName] = true; + if (props.type === 'radio' && name != null) { + var queryRoot = rootNode; - { - warning$1(false, 'Invalid attribute name: `%s`', attributeName); - } + while (queryRoot.parentNode) { + queryRoot = queryRoot.parentNode; + } // If `rootNode.form` was non-null, then we could try `form.elements`, + // but that sometimes behaves strangely in IE8. We could also try using + // `form.getElementsByName`, but that will only return direct children + // and won't include inputs that use the HTML5 `form=` attribute. Since + // the input might not even be in a form. It might not even be in the + // document. Let's just use the local `querySelectorAll` to ensure we don't + // miss anything. - return false; -} -function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) { - if (propertyInfo !== null) { - return propertyInfo.type === RESERVED; - } - if (isCustomComponentTag) { - return false; - } + var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]'); - if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) { - return true; - } - - return false; -} -function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) { - if (propertyInfo !== null && propertyInfo.type === RESERVED) { - return false; - } - - switch (typeof value) { - case 'function': // $FlowIssue symbol is perfectly valid here + for (var i = 0; i < group.length; i++) { + var otherNode = group[i]; - case 'symbol': - // eslint-disable-line - return true; + if (otherNode === rootNode || otherNode.form !== rootNode.form) { + continue; + } // This will throw if radio buttons rendered by different copies of React + // and the same name are rendered into the same form (same as #1939). + // That's probably okay; we don't support it just as we don't support + // mixing React radio buttons with non-React ones. - case 'boolean': - { - if (isCustomComponentTag) { - return false; - } - if (propertyInfo !== null) { - return !propertyInfo.acceptsBooleans; - } else { - var prefix = name.toLowerCase().slice(0, 5); - return prefix !== 'data-' && prefix !== 'aria-'; - } - } + var otherProps = getFiberCurrentPropsFromNode$1(otherNode); - default: - return false; - } -} -function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) { - if (value === null || typeof value === 'undefined') { - return true; - } + if (!otherProps) { + { + throw Error( "ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported." ); + } + } // We need update the tracked value on the named cousin since the value + // was changed but the input saw no event or value set - if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) { - return true; - } - if (isCustomComponentTag) { - return false; - } + updateValueIfChanged(otherNode); // If this is a controlled radio button group, forcing the input that + // was previously checked to update will cause it to be come re-checked + // as appropriate. - if (propertyInfo !== null) { - switch (propertyInfo.type) { - case BOOLEAN: - return !value; - - case OVERLOADED_BOOLEAN: - return value === false; - - case NUMERIC: - return isNaN(value); - - case POSITIVE_NUMERIC: - return isNaN(value) || value < 1; - } - } - - return false; -} -function getPropertyInfo(name) { - return properties.hasOwnProperty(name) ? properties[name] : null; -} - -function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL) { - this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN; - this.attributeName = attributeName; - this.attributeNamespace = attributeNamespace; - this.mustUseProperty = mustUseProperty; - this.propertyName = name; - this.type = type; - this.sanitizeURL = sanitizeURL; -} // When adding attributes to this list, be sure to also add them to -// the `possibleStandardNames` module to ensure casing and incorrect -// name warnings. - - -var properties = {}; // These props are reserved by React. They shouldn't be written to the DOM. - -['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular -// elements (not just inputs). Now that ReactDOMInput assigns to the -// defaultValue property -- do we need this? -'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'].forEach(function (name) { - properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty - name, // attributeName - null, // attributeNamespace - false); -}); // A few React string attributes have a different name. -// This is a mapping from React prop names to the attribute names. - -[['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) { - var name = _ref[0], - attributeName = _ref[1]; - properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty - attributeName, // attributeName - null, // attributeNamespace - false); -}); // These are "enumerated" HTML attributes that accept "true" and "false". -// In React, we let users pass `true` and `false` even though technically -// these aren't boolean attributes (they are coerced to strings). - -['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) { - properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty - name.toLowerCase(), // attributeName - null, // attributeNamespace - false); -}); // These are "enumerated" SVG attributes that accept "true" and "false". -// In React, we let users pass `true` and `false` even though technically -// these aren't boolean attributes (they are coerced to strings). -// Since these are SVG attributes, their attribute names are case-sensitive. - -['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) { - properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty - name, // attributeName - null, // attributeNamespace - false); -}); // These are HTML boolean attributes. - -['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM -// on the client side because the browsers are inconsistent. Instead we call focus(). -'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata -'itemScope'].forEach(function (name) { - properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty - name.toLowerCase(), // attributeName - null, // attributeNamespace - false); -}); // These are the few React props that we set as DOM properties -// rather than attributes. These are all booleans. - -['checked', // Note: `option.selected` is not updated if `select.multiple` is -// disabled with `removeAttribute`. We have special logic for handling this. -'multiple', 'muted', 'selected'].forEach(function (name) { - properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty - name, // attributeName - null, // attributeNamespace - false); -}); // These are HTML attributes that are "overloaded booleans": they behave like -// booleans, but can also accept a string value. - -['capture', 'download'].forEach(function (name) { - properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty - name, // attributeName - null, // attributeNamespace - false); -}); // These are HTML attributes that must be positive numbers. - -['cols', 'rows', 'size', 'span'].forEach(function (name) { - properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty - name, // attributeName - null, // attributeNamespace - false); -}); // These are HTML attributes that must be numbers. - -['rowSpan', 'start'].forEach(function (name) { - properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty - name.toLowerCase(), // attributeName - null, // attributeNamespace - false); -}); -var CAMELIZE = /[\-\:]([a-z])/g; - -var capitalize = function (token) { - return token[1].toUpperCase(); -}; // This is a list of all SVG attributes that need special casing, namespacing, -// or boolean value assignment. Regular attributes that just accept strings -// and have the same names are omitted, just like in the HTML whitelist. -// Some of these attributes can be hard to find. This list was created by -// scrapping the MDN documentation. - - -['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height'].forEach(function (attributeName) { - var name = attributeName.replace(CAMELIZE, capitalize); - properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty - attributeName, null, // attributeNamespace - false); -}); // String SVG attributes with the xlink namespace. - -['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type'].forEach(function (attributeName) { - var name = attributeName.replace(CAMELIZE, capitalize); - properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty - attributeName, 'http://www.w3.org/1999/xlink', false); -}); // String SVG attributes with the xml namespace. - -['xml:base', 'xml:lang', 'xml:space'].forEach(function (attributeName) { - var name = attributeName.replace(CAMELIZE, capitalize); - properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty - attributeName, 'http://www.w3.org/XML/1998/namespace', false); -}); // These attribute exists both in HTML and SVG. -// The attribute name is case-sensitive in SVG so we can't just use -// the React name like we do for attributes that exist only in HTML. - -['tabIndex', 'crossOrigin'].forEach(function (attributeName) { - properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty - attributeName.toLowerCase(), // attributeName - null, // attributeNamespace - false); -}); // These attributes accept URLs. These must not allow javascript: URLS. -// These will also need to accept Trusted Types object in the future. - -var xlinkHref = 'xlinkHref'; -properties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty -'xlink:href', 'http://www.w3.org/1999/xlink', true); -['src', 'href', 'action', 'formAction'].forEach(function (attributeName) { - properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty - attributeName.toLowerCase(), // attributeName - null, // attributeNamespace - true); -}); - -var ReactDebugCurrentFrame$1 = null; - -{ - ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; -} // A javascript: URL can contain leading C0 control or \u0020 SPACE, -// and any newline or tab are filtered out as if they're not part of the URL. -// https://url.spec.whatwg.org/#url-parsing -// Tab or newline are defined as \r\n\t: -// https://infra.spec.whatwg.org/#ascii-tab-or-newline -// A C0 control is a code point in the range \u0000 NULL to \u001F -// INFORMATION SEPARATOR ONE, inclusive: -// https://infra.spec.whatwg.org/#c0-control-or-space - -/* eslint-disable max-len */ - - -var isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i; -var didWarn = false; - -function sanitizeURL(url) { - if (disableJavaScriptURLs) { - if (!!isJavaScriptProtocol.test(url)) { - { - throw Error("React has blocked a javascript: URL as a security precaution." + (ReactDebugCurrentFrame$1.getStackAddendum())); - } - } - } else if (true && !didWarn && isJavaScriptProtocol.test(url)) { - didWarn = true; - warning$1(false, 'A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url)); - } -} - -// Flow does not allow string concatenation of most non-string types. To work -// around this limitation, we use an opaque type that can only be obtained by -// passing the value through getToStringValue first. -function toString(value) { - return '' + value; -} -function getToStringValue(value) { - switch (typeof value) { - case 'boolean': - case 'number': - case 'object': - case 'string': - case 'undefined': - return value; + updateWrapper(otherNode, otherProps); + } + } + } // In Chrome, assigning defaultValue to certain input types triggers input validation. + // For number inputs, the display value loses trailing decimal points. For email inputs, + // Chrome raises "The specified value <x> is not a valid email address". + // + // Here we check to see if the defaultValue has actually changed, avoiding these problems + // when the user is inputting text + // + // https://github.com/facebook/react/issues/7253 - default: - // function, symbol are assigned as empty strings - return ''; - } -} -/** Trusted value is a wrapper for "safe" values which can be assigned to DOM execution sinks. */ -/** - * We allow passing objects with toString method as element attributes or in dangerouslySetInnerHTML - * and we do validations that the value is safe. Once we do validation we want to use the validated - * value instead of the object (because object.toString may return something else on next call). - * - * If application uses Trusted Types we don't stringify trusted values, but preserve them as objects. - */ -var toStringOrTrustedType = toString; - -if (enableTrustedTypesIntegration && typeof trustedTypes !== 'undefined') { - toStringOrTrustedType = function (value) { - if (typeof value === 'object' && (trustedTypes.isHTML(value) || trustedTypes.isScript(value) || trustedTypes.isScriptURL(value) || - /* TrustedURLs are deprecated and will be removed soon: https://github.com/WICG/trusted-types/pull/204 */ - trustedTypes.isURL && trustedTypes.isURL(value))) { - // Pass Trusted Types through. - return value; + function setDefaultValue(node, type, value) { + if ( // Focused number inputs synchronize on blur. See ChangeEventPlugin.js + type !== 'number' || node.ownerDocument.activeElement !== node) { + if (value == null) { + node.defaultValue = toString(node._wrapperState.initialValue); + } else if (node.defaultValue !== toString(value)) { + node.defaultValue = toString(value); + } } + } - return toString(value); - }; -} - -/** - * Set attribute for a node. The attribute value can be either string or - * Trusted value (if application uses Trusted Types). - */ -function setAttribute(node, attributeName, attributeValue) { - node.setAttribute(attributeName, attributeValue); -} -/** - * Set attribute with namespace for a node. The attribute value can be either string or - * Trusted value (if application uses Trusted Types). - */ + var didWarnSelectedSetOnOption = false; + var didWarnInvalidChild = false; -function setAttributeNS(node, attributeNamespace, attributeName, attributeValue) { - node.setAttributeNS(attributeNamespace, attributeName, attributeValue); -} + function flattenChildren(children) { + var content = ''; // Flatten children. We'll warn if they are invalid + // during validateProps() which runs for hydration too. + // Note that this would throw on non-element objects. + // Elements are stringified (which is normally irrelevant + // but matters for <fbt>). -/** - * Get the value for a property on a node. Only used in DEV for SSR validation. - * The "expected" argument is used as a hint of what the expected value is. - * Some properties have multiple equivalent values. - */ -function getValueForProperty(node, name, expected, propertyInfo) { - { - if (propertyInfo.mustUseProperty) { - var propertyName = propertyInfo.propertyName; - return node[propertyName]; - } else { - if (!disableJavaScriptURLs && propertyInfo.sanitizeURL) { - // If we haven't fully disabled javascript: URLs, and if - // the hydration is successful of a javascript: URL, we - // still want to warn on the client. - sanitizeURL('' + expected); + React.Children.forEach(children, function (child) { + if (child == null) { + return; } - var attributeName = propertyInfo.attributeName; - var stringValue = null; + content += child; // Note: we don't warn about invalid children here. + // Instead, this is done separately below so that + // it happens during the hydration codepath too. + }); + return content; + } + /** + * Implements an <option> host component that warns when `selected` is set. + */ - if (propertyInfo.type === OVERLOADED_BOOLEAN) { - if (node.hasAttribute(attributeName)) { - var value = node.getAttribute(attributeName); - if (value === '') { - return true; + function validateProps(element, props) { + { + // This mirrors the codepath above, but runs for hydration too. + // Warn about invalid children here so that client and hydration are consistent. + // TODO: this seems like it could cause a DEV-only throw for hydration + // if children contains a non-element object. We should try to avoid that. + if (typeof props.children === 'object' && props.children !== null) { + React.Children.forEach(props.children, function (child) { + if (child == null) { + return; } - if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { - return value; + if (typeof child === 'string' || typeof child === 'number') { + return; } - if (value === '' + expected) { - return expected; + if (typeof child.type !== 'string') { + return; } - return value; - } - } else if (node.hasAttribute(attributeName)) { - if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { - // We had an attribute but shouldn't have had one, so read it - // for the error message. - return node.getAttribute(attributeName); - } + if (!didWarnInvalidChild) { + didWarnInvalidChild = true; - if (propertyInfo.type === BOOLEAN) { - // If this was a boolean, it doesn't matter what the value is - // the fact that we have it is the same as the expected. - return expected; - } // Even if this property uses a namespace we use getAttribute - // because we assume its namespaced name is the same as our config. - // To use getAttributeNS we need the local name which we don't have - // in our config atm. + error('Only strings and numbers are supported as <option> children.'); + } + }); + } // TODO: Remove support for `selected` in <option>. - stringValue = node.getAttribute(attributeName); - } + if (props.selected != null && !didWarnSelectedSetOnOption) { + error('Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.'); - if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { - return stringValue === null ? expected : stringValue; - } else if (stringValue === '' + expected) { - return expected; - } else { - return stringValue; + didWarnSelectedSetOnOption = true; } } } -} -/** - * Get the value for a attribute on a node. Only used in DEV for SSR validation. - * The third argument is used as a hint of what the expected value is. Some - * attributes have multiple equivalent values. - */ - -function getValueForAttribute(node, name, expected) { - { - if (!isAttributeNameSafe(name)) { - return; - } - - if (!node.hasAttribute(name)) { - return expected === undefined ? undefined : null; + function postMountWrapper$1(element, props) { + // value="" should make a value attribute (#6219) + if (props.value != null) { + element.setAttribute('value', toString(getToStringValue(props.value))); } + } + function getHostProps$1(element, props) { + var hostProps = _assign({ + children: undefined + }, props); - var value = node.getAttribute(name); + var content = flattenChildren(props.children); - if (value === '' + expected) { - return expected; + if (content) { + hostProps.children = content; } - return value; + return hostProps; } -} -/** - * Sets the value for a property on a node. - * - * @param {DOMElement} node - * @param {string} name - * @param {*} value - */ -function setValueForProperty(node, name, value, isCustomComponentTag) { - var propertyInfo = getPropertyInfo(name); + var didWarnValueDefaultValue$1; - if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) { - return; + { + didWarnValueDefaultValue$1 = false; } - if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) { - value = null; - } // If the prop isn't in the special list, treat it as a simple attribute. - - - if (isCustomComponentTag || propertyInfo === null) { - if (isAttributeNameSafe(name)) { - var _attributeName = name; + function getDeclarationErrorAddendum() { + var ownerName = getCurrentFiberOwnerNameInDevOrNull(); - if (value === null) { - node.removeAttribute(_attributeName); - } else { - setAttribute(node, _attributeName, toStringOrTrustedType(value)); - } + if (ownerName) { + return '\n\nCheck the render method of `' + ownerName + '`.'; } - return; + return ''; } - var mustUseProperty = propertyInfo.mustUseProperty; - - if (mustUseProperty) { - var propertyName = propertyInfo.propertyName; - - if (value === null) { - var type = propertyInfo.type; - node[propertyName] = type === BOOLEAN ? false : ''; - } else { - // Contrary to `setAttribute`, object properties are properly - // `toString`ed by IE8/9. - node[propertyName] = value; - } - - return; - } // The rest are treated as attributes with special cases. + var valuePropNames = ['value', 'defaultValue']; + /** + * Validation function for `value` and `defaultValue`. + */ + function checkSelectPropTypes(props) { + { + ReactControlledValuePropTypes.checkPropTypes('select', props); - var attributeName = propertyInfo.attributeName, - attributeNamespace = propertyInfo.attributeNamespace; + for (var i = 0; i < valuePropNames.length; i++) { + var propName = valuePropNames[i]; - if (value === null) { - node.removeAttribute(attributeName); - } else { - var _type = propertyInfo.type; - var attributeValue; + if (props[propName] == null) { + continue; + } - if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) { - // If attribute type is boolean, we know for sure it won't be an execution sink - // and we won't require Trusted Type here. - attributeValue = ''; - } else { - // `setAttribute` with objects becomes only `[object]` in IE8/9, - // ('' + value) makes it output the correct toString()-value. - attributeValue = toStringOrTrustedType(value); + var isArray = Array.isArray(props[propName]); - if (propertyInfo.sanitizeURL) { - sanitizeURL(attributeValue.toString()); + if (props.multiple && !isArray) { + error('The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum()); + } else if (!props.multiple && isArray) { + error('The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum()); + } } } - - if (attributeNamespace) { - setAttributeNS(node, attributeNamespace, attributeName, attributeValue); - } else { - setAttribute(node, attributeName, attributeValue); - } } -} - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - + function updateOptions(node, multiple, propValue, setDefaultSelected) { + var options = node.options; -var ReactPropTypesSecret$1 = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; + if (multiple) { + var selectedValues = propValue; + var selectedValue = {}; -var ReactPropTypesSecret_1 = ReactPropTypesSecret$1; - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ + for (var i = 0; i < selectedValues.length; i++) { + // Prefix to avoid chaos with special keys. + selectedValue['$' + selectedValues[i]] = true; + } + for (var _i = 0; _i < options.length; _i++) { + var selected = selectedValue.hasOwnProperty('$' + options[_i].value); + if (options[_i].selected !== selected) { + options[_i].selected = selected; + } -var printWarning = function() {}; + if (selected && setDefaultSelected) { + options[_i].defaultSelected = true; + } + } + } else { + // Do not set `select.value` as exact behavior isn't consistent across all + // browsers for all cases. + var _selectedValue = toString(getToStringValue(propValue)); -{ - var ReactPropTypesSecret = ReactPropTypesSecret_1; - var loggedTypeFailures = {}; - var has = Function.call.bind(Object.prototype.hasOwnProperty); + var defaultSelected = null; - printWarning = function(text) { - var message = 'Warning: ' + text; - if (typeof console !== 'undefined') { - console.error(message); - } - try { - // --- Welcome to debugging React --- - // This error was thrown as a convenience so that you can use this stack - // to find the callsite that caused this warning to fire. - throw new Error(message); - } catch (x) {} - }; -} + for (var _i2 = 0; _i2 < options.length; _i2++) { + if (options[_i2].value === _selectedValue) { + options[_i2].selected = true; -/** - * Assert that the values match with the type specs. - * Error messages are memorized and will only be shown once. - * - * @param {object} typeSpecs Map of name to a ReactPropType - * @param {object} values Runtime values that need to be type-checked - * @param {string} location e.g. "prop", "context", "child context" - * @param {string} componentName Name of the component for error messages. - * @param {?Function} getStack Returns the component stack. - * @private - */ -function checkPropTypes(typeSpecs, values, location, componentName, getStack) { - { - for (var typeSpecName in typeSpecs) { - if (has(typeSpecs, typeSpecName)) { - var error; - // Prop type validation may throw. In case they do, we don't want to - // fail the render phase where it didn't fail before. So we log it. - // After these have been cleaned up, we'll let them throw. - try { - // This is intentionally an invariant that gets caught. It's the same - // behavior as without this statement except with a better message. - if (typeof typeSpecs[typeSpecName] !== 'function') { - var err = Error( - (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + - 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' - ); - err.name = 'Invariant Violation'; - throw err; + if (setDefaultSelected) { + options[_i2].defaultSelected = true; } - error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret); - } catch (ex) { - error = ex; - } - if (error && !(error instanceof Error)) { - printWarning( - (componentName || 'React class') + ': type specification of ' + - location + ' `' + typeSpecName + '` is invalid; the type checker ' + - 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' + - 'You may have forgotten to pass an argument to the type checker ' + - 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + - 'shape all require an argument).' - ); - } - if (error instanceof Error && !(error.message in loggedTypeFailures)) { - // Only monitor this failure once because there tends to be a lot of the - // same error. - loggedTypeFailures[error.message] = true; - var stack = getStack ? getStack() : ''; - - printWarning( - 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '') - ); + return; } - } - } - } -} -/** - * Resets warning cache when testing. - * - * @private - */ -checkPropTypes.resetWarningCache = function() { - { - loggedTypeFailures = {}; - } -}; - -var checkPropTypes_1 = checkPropTypes; - -var ReactDebugCurrentFrame$2 = null; -var ReactControlledValuePropTypes = { - checkPropTypes: null -}; - -{ - ReactDebugCurrentFrame$2 = ReactSharedInternals.ReactDebugCurrentFrame; - var hasReadOnlyValue = { - button: true, - checkbox: true, - image: true, - hidden: true, - radio: true, - reset: true, - submit: true - }; - var propTypes = { - value: function (props, propName, componentName) { - if (hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled || props[propName] == null || enableFlareAPI && props.listeners) { - return null; + if (defaultSelected === null && !options[_i2].disabled) { + defaultSelected = options[_i2]; + } } - return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); - }, - checked: function (props, propName, componentName) { - if (props.onChange || props.readOnly || props.disabled || props[propName] == null || enableFlareAPI && props.listeners) { - return null; + if (defaultSelected !== null) { + defaultSelected.selected = true; } - - return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); } - }; + } /** - * Provide a linked `value` attribute for controlled forms. You should not use - * this outside of the ReactDOM controlled form components. + * Implements a <select> host component that allows optionally setting the + * props `value` and `defaultValue`. If `multiple` is false, the prop must be a + * stringable. If `multiple` is true, the prop must be an array of stringables. + * + * If `value` is not supplied (or null/undefined), user actions that change the + * selected option will trigger updates to the rendered options. + * + * If it is supplied (and not null/undefined), the rendered options will not + * update in response to user actions. Instead, the `value` prop must change in + * order for the rendered options to update. + * + * If `defaultValue` is provided, any options with the supplied values will be + * selected. */ - ReactControlledValuePropTypes.checkPropTypes = function (tagName, props) { - checkPropTypes_1(propTypes, props, 'prop', tagName, ReactDebugCurrentFrame$2.getStackAddendum); - }; -} -function isCheckable(elem) { - var type = elem.type; - var nodeName = elem.nodeName; - return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio'); -} + function getHostProps$2(element, props) { + return _assign({}, props, { + value: undefined + }); + } + function initWrapperState$1(element, props) { + var node = element; -function getTracker(node) { - return node._valueTracker; -} + { + checkSelectPropTypes(props); + } -function detachTracker(node) { - node._valueTracker = null; -} + node._wrapperState = { + wasMultiple: !!props.multiple + }; -function getValueFromNode(node) { - var value = ''; + { + if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue$1) { + error('Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components'); - if (!node) { - return value; + didWarnValueDefaultValue$1 = true; + } + } } + function postMountWrapper$2(element, props) { + var node = element; + node.multiple = !!props.multiple; + var value = props.value; - if (isCheckable(node)) { - value = node.checked ? 'true' : 'false'; - } else { - value = node.value; + if (value != null) { + updateOptions(node, !!props.multiple, value, false); + } else if (props.defaultValue != null) { + updateOptions(node, !!props.multiple, props.defaultValue, true); + } } + function postUpdateWrapper(element, props) { + var node = element; + var wasMultiple = node._wrapperState.wasMultiple; + node._wrapperState.wasMultiple = !!props.multiple; + var value = props.value; - return value; -} - -function trackValueOnNode(node) { - var valueField = isCheckable(node) ? 'checked' : 'value'; - var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField); - var currentValue = '' + node[valueField]; // if someone has already defined a value or Safari, then bail - // and don't track value will cause over reporting of changes, - // but it's better then a hard failure - // (needed for certain tests that spyOn input values and Safari) - - if (node.hasOwnProperty(valueField) || typeof descriptor === 'undefined' || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') { - return; + if (value != null) { + updateOptions(node, !!props.multiple, value, false); + } else if (wasMultiple !== !!props.multiple) { + // For simplicity, reapply `defaultValue` if `multiple` is toggled. + if (props.defaultValue != null) { + updateOptions(node, !!props.multiple, props.defaultValue, true); + } else { + // Revert the select back to its default unselected state. + updateOptions(node, !!props.multiple, props.multiple ? [] : '', false); + } + } } + function restoreControlledState$1(element, props) { + var node = element; + var value = props.value; - var get = descriptor.get, - set = descriptor.set; - Object.defineProperty(node, valueField, { - configurable: true, - get: function () { - return get.call(this); - }, - set: function (value) { - currentValue = '' + value; - set.call(this, value); + if (value != null) { + updateOptions(node, !!props.multiple, value, false); } - }); // We could've passed this the first time - // but it triggers a bug in IE11 and Edge 14/15. - // Calling defineProperty() again should be equivalent. - // https://github.com/facebook/react/issues/11768 + } - Object.defineProperty(node, valueField, { - enumerable: descriptor.enumerable - }); - var tracker = { - getValue: function () { - return currentValue; - }, - setValue: function (value) { - currentValue = '' + value; - }, - stopTracking: function () { - detachTracker(node); - delete node[valueField]; - } - }; - return tracker; -} + var didWarnValDefaultVal = false; -function track(node) { - if (getTracker(node)) { - return; - } // TODO: Once it's just Fiber we can move this to node._wrapperState + /** + * Implements a <textarea> host component that allows setting `value`, and + * `defaultValue`. This differs from the traditional DOM API because value is + * usually set as PCDATA children. + * + * If `value` is not supplied (or null/undefined), user actions that affect the + * value will trigger updates to the element. + * + * If `value` is supplied (and not null/undefined), the rendered element will + * not trigger updates to the element. Instead, the `value` prop must change in + * order for the rendered element to be updated. + * + * The rendered element will be initialized with an empty value, the prop + * `defaultValue` if specified, or the children content (deprecated). + */ + function getHostProps$3(element, props) { + var node = element; + if (!(props.dangerouslySetInnerHTML == null)) { + { + throw Error( "`dangerouslySetInnerHTML` does not make sense on <textarea>." ); + } + } // Always set children to the same thing. In IE9, the selection range will + // get reset if `textContent` is mutated. We could add a check in setTextContent + // to only set the value if/when the value differs from the node value (which would + // completely solve this IE9 bug), but Sebastian+Sophie seemed to like this + // solution. The value can be a boolean or object so that's why it's forced + // to be a string. - node._valueTracker = trackValueOnNode(node); -} -function updateValueIfChanged(node) { - if (!node) { - return false; - } - var tracker = getTracker(node); // if there is no tracker at this point it's unlikely - // that trying again will succeed + var hostProps = _assign({}, props, { + value: undefined, + defaultValue: undefined, + children: toString(node._wrapperState.initialValue) + }); - if (!tracker) { - return true; + return hostProps; } + function initWrapperState$2(element, props) { + var node = element; - var lastValue = tracker.getValue(); - var nextValue = getValueFromNode(node); + { + ReactControlledValuePropTypes.checkPropTypes('textarea', props); - if (nextValue !== lastValue) { - tracker.setValue(nextValue); - return true; - } + if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) { + error('%s contains a textarea with both value and defaultValue props. ' + 'Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component'); - return false; -} + didWarnValDefaultVal = true; + } + } -// TODO: direct imports like some-package/src/* are bad. Fix me. -var didWarnValueDefaultValue = false; -var didWarnCheckedDefaultChecked = false; -var didWarnControlledToUncontrolled = false; -var didWarnUncontrolledToControlled = false; + var initialValue = props.value; // Only bother fetching default value if we're going to use it -function isControlled(props) { - var usesChecked = props.type === 'checkbox' || props.type === 'radio'; - return usesChecked ? props.checked != null : props.value != null; -} -/** - * Implements an <input> host component that allows setting these optional - * props: `checked`, `value`, `defaultChecked`, and `defaultValue`. - * - * If `checked` or `value` are not supplied (or null/undefined), user actions - * that affect the checked state or value will trigger updates to the element. - * - * If they are supplied (and not null/undefined), the rendered element will not - * trigger updates to the element. Instead, the props must change in order for - * the rendered element to be updated. - * - * The rendered element will be initialized as unchecked (or `defaultChecked`) - * with an empty value (or `defaultValue`). - * - * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html - */ + if (initialValue == null) { + var children = props.children, + defaultValue = props.defaultValue; + if (children != null) { + { + error('Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.'); + } -function getHostProps(element, props) { - var node = element; - var checked = props.checked; + { + if (!(defaultValue == null)) { + { + throw Error( "If you supply `defaultValue` on a <textarea>, do not pass children." ); + } + } - var hostProps = _assign({}, props, { - defaultChecked: undefined, - defaultValue: undefined, - value: undefined, - checked: checked != null ? checked : node._wrapperState.initialChecked - }); + if (Array.isArray(children)) { + if (!(children.length <= 1)) { + { + throw Error( "<textarea> can only have at most one child." ); + } + } - return hostProps; -} -function initWrapperState(element, props) { - { - ReactControlledValuePropTypes.checkPropTypes('input', props); + children = children[0]; + } - if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) { - warning$1(false, '%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type); - didWarnCheckedDefaultChecked = true; - } + defaultValue = children; + } + } - if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) { - warning$1(false, '%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type); - didWarnValueDefaultValue = true; - } - } + if (defaultValue == null) { + defaultValue = ''; + } - var node = element; - var defaultValue = props.defaultValue == null ? '' : props.defaultValue; - node._wrapperState = { - initialChecked: props.checked != null ? props.checked : props.defaultChecked, - initialValue: getToStringValue(props.value != null ? props.value : defaultValue), - controlled: isControlled(props) - }; -} -function updateChecked(element, props) { - var node = element; - var checked = props.checked; + initialValue = defaultValue; + } - if (checked != null) { - setValueForProperty(node, 'checked', checked, false); + node._wrapperState = { + initialValue: getToStringValue(initialValue) + }; } -} -function updateWrapper(element, props) { - var node = element; + function updateWrapper$1(element, props) { + var node = element; + var value = getToStringValue(props.value); + var defaultValue = getToStringValue(props.defaultValue); - { - var controlled = isControlled(props); + if (value != null) { + // Cast `value` to a string to ensure the value is set correctly. While + // browsers typically do this as necessary, jsdom doesn't. + var newValue = toString(value); // To avoid side effects (such as losing text selection), only set value if changed + + if (newValue !== node.value) { + node.value = newValue; + } - if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) { - warning$1(false, 'A component is changing an uncontrolled input of type %s to be controlled. ' + 'Input elements should not switch from uncontrolled to controlled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type); - didWarnUncontrolledToControlled = true; + if (props.defaultValue == null && node.defaultValue !== newValue) { + node.defaultValue = newValue; + } } - if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) { - warning$1(false, 'A component is changing a controlled input of type %s to be uncontrolled. ' + 'Input elements should not switch from controlled to uncontrolled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type); - didWarnControlledToUncontrolled = true; + if (defaultValue != null) { + node.defaultValue = toString(defaultValue); } } + function postMountWrapper$3(element, props) { + var node = element; // This is in postMount because we need access to the DOM node, which is not + // available until after the component has mounted. - updateChecked(element, props); - var value = getToStringValue(props.value); - var type = props.type; + var textContent = node.textContent; // Only set node.value if textContent is equal to the expected + // initial value. In IE10/IE11 there is a bug where the placeholder attribute + // will populate textContent as well. + // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/ - if (value != null) { - if (type === 'number') { - if (value === 0 && node.value === '' || // We explicitly want to coerce to number here if possible. - // eslint-disable-next-line - node.value != value) { - node.value = toString(value); + if (textContent === node._wrapperState.initialValue) { + if (textContent !== '' && textContent !== null) { + node.value = textContent; } - } else if (node.value !== toString(value)) { - node.value = toString(value); - } - } else if (type === 'submit' || type === 'reset') { - // Submit/reset inputs need the attribute removed completely to avoid - // blank-text buttons. - node.removeAttribute('value'); - return; - } - - if (disableInputAttributeSyncing) { - // When not syncing the value attribute, React only assigns a new value - // whenever the defaultValue React prop has changed. When not present, - // React does nothing - if (props.hasOwnProperty('defaultValue')) { - setDefaultValue(node, props.type, getToStringValue(props.defaultValue)); - } - } else { - // When syncing the value attribute, the value comes from a cascade of - // properties: - // 1. The value React property - // 2. The defaultValue React property - // 3. Otherwise there should be no change - if (props.hasOwnProperty('value')) { - setDefaultValue(node, props.type, value); - } else if (props.hasOwnProperty('defaultValue')) { - setDefaultValue(node, props.type, getToStringValue(props.defaultValue)); - } - } - - if (disableInputAttributeSyncing) { - // When not syncing the checked attribute, the attribute is directly - // controllable from the defaultValue React property. It needs to be - // updated as new props come in. - if (props.defaultChecked == null) { - node.removeAttribute('checked'); - } else { - node.defaultChecked = !!props.defaultChecked; - } - } else { - // When syncing the checked attribute, it only changes when it needs - // to be removed, such as transitioning from a checkbox into a text input - if (props.checked == null && props.defaultChecked != null) { - node.defaultChecked = !!props.defaultChecked; } } -} -function postMountWrapper(element, props, isHydrating) { - var node = element; // Do not assign value if it is already set. This prevents user text input - // from being lost during SSR hydration. - - if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) { - var type = props.type; - var isButton = type === 'submit' || type === 'reset'; // Avoid setting value attribute on submit/reset inputs as it overrides the - // default value provided by the browser. See: #12872 + function restoreControlledState$2(element, props) { + // DOM component is still mounted; update + updateWrapper$1(element, props); + } - if (isButton && (props.value === undefined || props.value === null)) { - return; - } + var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml'; + var MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML'; + var SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; + var Namespaces = { + html: HTML_NAMESPACE, + mathml: MATH_NAMESPACE, + svg: SVG_NAMESPACE + }; // Assumes there is no parent namespace. - var initialValue = toString(node._wrapperState.initialValue); // Do not assign value if it is already set. This prevents user text input - // from being lost during SSR hydration. + function getIntrinsicNamespace(type) { + switch (type) { + case 'svg': + return SVG_NAMESPACE; - if (!isHydrating) { - if (disableInputAttributeSyncing) { - var value = getToStringValue(props.value); // When not syncing the value attribute, the value property points - // directly to the React prop. Only assign it if it exists. + case 'math': + return MATH_NAMESPACE; - if (value != null) { - // Always assign on buttons so that it is possible to assign an - // empty string to clear button text. - // - // Otherwise, do not re-assign the value property if is empty. This - // potentially avoids a DOM write and prevents Firefox (~60.0.1) from - // prematurely marking required inputs as invalid. Equality is compared - // to the current value in case the browser provided value is not an - // empty string. - if (isButton || value !== node.value) { - node.value = toString(value); - } - } - } else { - // When syncing the value attribute, the value property should use - // the wrapperState._initialValue property. This uses: - // - // 1. The value React property when present - // 2. The defaultValue React property when present - // 3. An empty string - if (initialValue !== node.value) { - node.value = initialValue; - } - } + default: + return HTML_NAMESPACE; } - - if (disableInputAttributeSyncing) { - // When not syncing the value attribute, assign the value attribute - // directly from the defaultValue React property (when present) - var defaultValue = getToStringValue(props.defaultValue); - - if (defaultValue != null) { - node.defaultValue = toString(defaultValue); - } - } else { - // Otherwise, the value attribute is synchronized to the property, - // so we assign defaultValue to the same thing as the value property - // assignment step above. - node.defaultValue = initialValue; + } + function getChildNamespace(parentNamespace, type) { + if (parentNamespace == null || parentNamespace === HTML_NAMESPACE) { + // No (or default) parent namespace: potential entry point. + return getIntrinsicNamespace(type); } - } // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug - // this is needed to work around a chrome bug where setting defaultChecked - // will sometimes influence the value of checked (even after detachment). - // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416 - // We need to temporarily unset name to avoid disrupting radio button groups. + if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') { + // We're leaving SVG. + return HTML_NAMESPACE; + } // By default, pass namespace below. - var name = node.name; - if (name !== '') { - node.name = ''; + return parentNamespace; } - if (disableInputAttributeSyncing) { - // When not syncing the checked attribute, the checked property - // never gets assigned. It must be manually set. We don't want - // to do this when hydrating so that existing user input isn't - // modified - if (!isHydrating) { - updateChecked(element, props); - } // Only assign the checked attribute if it is defined. This saves - // a DOM write when controlling the checked attribute isn't needed - // (text inputs, submit/reset) - + /* globals MSApp */ - if (props.hasOwnProperty('defaultChecked')) { - node.defaultChecked = !node.defaultChecked; - node.defaultChecked = !!props.defaultChecked; + /** + * Create a function which has 'unsafe' privileges (required by windows8 apps) + */ + var createMicrosoftUnsafeLocalFunction = function (func) { + if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) { + return function (arg0, arg1, arg2, arg3) { + MSApp.execUnsafeLocalFunction(function () { + return func(arg0, arg1, arg2, arg3); + }); + }; + } else { + return func; } - } else { - // When syncing the checked attribute, both the checked property and - // attribute are assigned at the same time using defaultChecked. This uses: - // - // 1. The checked React property when present - // 2. The defaultChecked React property when present - // 3. Otherwise, false - node.defaultChecked = !node.defaultChecked; - node.defaultChecked = !!node._wrapperState.initialChecked; - } + }; - if (name !== '') { - node.name = name; - } -} -function restoreControlledState$1(element, props) { - var node = element; - updateWrapper(node, props); - updateNamedCousins(node, props); -} + var reusableSVGContainer; + /** + * Set the innerHTML property of a node + * + * @param {DOMElement} node + * @param {string} html + * @internal + */ -function updateNamedCousins(rootNode, props) { - var name = props.name; + var setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) { + if (node.namespaceURI === Namespaces.svg) { - if (props.type === 'radio' && name != null) { - var queryRoot = rootNode; + if (!('innerHTML' in node)) { + // IE does not have innerHTML for SVG nodes, so instead we inject the + // new markup in a temp node and then move the child nodes across into + // the target node + reusableSVGContainer = reusableSVGContainer || document.createElement('div'); + reusableSVGContainer.innerHTML = '<svg>' + html.valueOf().toString() + '</svg>'; + var svgNode = reusableSVGContainer.firstChild; - while (queryRoot.parentNode) { - queryRoot = queryRoot.parentNode; - } // If `rootNode.form` was non-null, then we could try `form.elements`, - // but that sometimes behaves strangely in IE8. We could also try using - // `form.getElementsByName`, but that will only return direct children - // and won't include inputs that use the HTML5 `form=` attribute. Since - // the input might not even be in a form. It might not even be in the - // document. Let's just use the local `querySelectorAll` to ensure we don't - // miss anything. + while (node.firstChild) { + node.removeChild(node.firstChild); + } + while (svgNode.firstChild) { + node.appendChild(svgNode.firstChild); + } - var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]'); - - for (var i = 0; i < group.length; i++) { - var otherNode = group[i]; + return; + } + } - if (otherNode === rootNode || otherNode.form !== rootNode.form) { - continue; - } // This will throw if radio buttons rendered by different copies of React - // and the same name are rendered into the same form (same as #1939). - // That's probably okay; we don't support it just as we don't support - // mixing React radio buttons with non-React ones. + node.innerHTML = html; + }); + /** + * HTML nodeType values that represent the type of the node + */ + var ELEMENT_NODE = 1; + var TEXT_NODE = 3; + var COMMENT_NODE = 8; + var DOCUMENT_NODE = 9; + var DOCUMENT_FRAGMENT_NODE = 11; - var otherProps = getFiberCurrentPropsFromNode$1(otherNode); + /** + * Set the textContent property of a node. For text updates, it's faster + * to set the `nodeValue` of the Text node directly instead of using + * `.textContent` which will remove the existing node and create a new one. + * + * @param {DOMElement} node + * @param {string} text + * @internal + */ - if (!otherProps) { - { - throw Error("ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported."); - } - } // We need update the tracked value on the named cousin since the value - // was changed but the input saw no event or value set + var setTextContent = function (node, text) { + if (text) { + var firstChild = node.firstChild; + if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) { + firstChild.nodeValue = text; + return; + } + } - updateValueIfChanged(otherNode); // If this is a controlled radio button group, forcing the input that - // was previously checked to update will cause it to be come re-checked - // as appropriate. + node.textContent = text; + }; - updateWrapper(otherNode, otherProps); - } + // Do not use the below two methods directly! + // Instead use constants exported from DOMTopLevelEventTypes in ReactDOM. + // (It is the only module that is allowed to access these methods.) + function unsafeCastStringToDOMTopLevelType(topLevelType) { + return topLevelType; + } + function unsafeCastDOMTopLevelTypeToString(topLevelType) { + return topLevelType; } -} // In Chrome, assigning defaultValue to certain input types triggers input validation. -// For number inputs, the display value loses trailing decimal points. For email inputs, -// Chrome raises "The specified value <x> is not a valid email address". -// -// Here we check to see if the defaultValue has actually changed, avoiding these problems -// when the user is inputting text -// -// https://github.com/facebook/react/issues/7253 + /** + * Generate a mapping of standard vendor prefixes using the defined style property and event name. + * + * @param {string} styleProp + * @param {string} eventName + * @returns {object} + */ -function setDefaultValue(node, type, value) { - if ( // Focused number inputs synchronize on blur. See ChangeEventPlugin.js - type !== 'number' || node.ownerDocument.activeElement !== node) { - if (value == null) { - node.defaultValue = toString(node._wrapperState.initialValue); - } else if (node.defaultValue !== toString(value)) { - node.defaultValue = toString(value); - } + function makePrefixMap(styleProp, eventName) { + var prefixes = {}; + prefixes[styleProp.toLowerCase()] = eventName.toLowerCase(); + prefixes['Webkit' + styleProp] = 'webkit' + eventName; + prefixes['Moz' + styleProp] = 'moz' + eventName; + return prefixes; } -} + /** + * A list of event names to a configurable list of vendor prefixes. + */ -var didWarnSelectedSetOnOption = false; -var didWarnInvalidChild = false; -function flattenChildren(children) { - var content = ''; // Flatten children. We'll warn if they are invalid - // during validateProps() which runs for hydration too. - // Note that this would throw on non-element objects. - // Elements are stringified (which is normally irrelevant - // but matters for <fbt>). + var vendorPrefixes = { + animationend: makePrefixMap('Animation', 'AnimationEnd'), + animationiteration: makePrefixMap('Animation', 'AnimationIteration'), + animationstart: makePrefixMap('Animation', 'AnimationStart'), + transitionend: makePrefixMap('Transition', 'TransitionEnd') + }; + /** + * Event names that have already been detected and prefixed (if applicable). + */ - React.Children.forEach(children, function (child) { - if (child == null) { - return; - } + var prefixedEventNames = {}; + /** + * Element to check for prefixes on. + */ - content += child; // Note: we don't warn about invalid children here. - // Instead, this is done separately below so that - // it happens during the hydration codepath too. - }); - return content; -} -/** - * Implements an <option> host component that warns when `selected` is set. - */ + var style = {}; + /** + * Bootstrap if a DOM exists. + */ + if (canUseDOM) { + style = document.createElement('div').style; // On some platforms, in particular some releases of Android 4.x, + // the un-prefixed "animation" and "transition" properties are defined on the + // style object but the events that fire will still be prefixed, so we need + // to check if the un-prefixed events are usable, and if not remove them from the map. -function validateProps(element, props) { - { - // This mirrors the codepath above, but runs for hydration too. - // Warn about invalid children here so that client and hydration are consistent. - // TODO: this seems like it could cause a DEV-only throw for hydration - // if children contains a non-element object. We should try to avoid that. - if (typeof props.children === 'object' && props.children !== null) { - React.Children.forEach(props.children, function (child) { - if (child == null) { - return; - } + if (!('AnimationEvent' in window)) { + delete vendorPrefixes.animationend.animation; + delete vendorPrefixes.animationiteration.animation; + delete vendorPrefixes.animationstart.animation; + } // Same as above - if (typeof child === 'string' || typeof child === 'number') { - return; - } - if (typeof child.type !== 'string') { - return; - } + if (!('TransitionEvent' in window)) { + delete vendorPrefixes.transitionend.transition; + } + } + /** + * Attempts to determine the correct vendor prefixed event name. + * + * @param {string} eventName + * @returns {string} + */ - if (!didWarnInvalidChild) { - didWarnInvalidChild = true; - warning$1(false, 'Only strings and numbers are supported as <option> children.'); - } - }); - } // TODO: Remove support for `selected` in <option>. + function getVendorPrefixedEventName(eventName) { + if (prefixedEventNames[eventName]) { + return prefixedEventNames[eventName]; + } else if (!vendorPrefixes[eventName]) { + return eventName; + } + + var prefixMap = vendorPrefixes[eventName]; - if (props.selected != null && !didWarnSelectedSetOnOption) { - warning$1(false, 'Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.'); - didWarnSelectedSetOnOption = true; + for (var styleProp in prefixMap) { + if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) { + return prefixedEventNames[eventName] = prefixMap[styleProp]; + } } + + return eventName; } -} -function postMountWrapper$1(element, props) { - // value="" should make a value attribute (#6219) - if (props.value != null) { - element.setAttribute('value', toString(getToStringValue(props.value))); - } -} -function getHostProps$1(element, props) { - var hostProps = _assign({ - children: undefined - }, props); - var content = flattenChildren(props.children); + /** + * To identify top level events in ReactDOM, we use constants defined by this + * module. This is the only module that uses the unsafe* methods to express + * that the constants actually correspond to the browser event names. This lets + * us save some bundle size by avoiding a top level type -> event name map. + * The rest of ReactDOM code should import top level types from this file. + */ - if (content) { - hostProps.children = content; + var TOP_ABORT = unsafeCastStringToDOMTopLevelType('abort'); + var TOP_ANIMATION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationend')); + var TOP_ANIMATION_ITERATION = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationiteration')); + var TOP_ANIMATION_START = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationstart')); + var TOP_BLUR = unsafeCastStringToDOMTopLevelType('blur'); + var TOP_CAN_PLAY = unsafeCastStringToDOMTopLevelType('canplay'); + var TOP_CAN_PLAY_THROUGH = unsafeCastStringToDOMTopLevelType('canplaythrough'); + var TOP_CANCEL = unsafeCastStringToDOMTopLevelType('cancel'); + var TOP_CHANGE = unsafeCastStringToDOMTopLevelType('change'); + var TOP_CLICK = unsafeCastStringToDOMTopLevelType('click'); + var TOP_CLOSE = unsafeCastStringToDOMTopLevelType('close'); + var TOP_COMPOSITION_END = unsafeCastStringToDOMTopLevelType('compositionend'); + var TOP_COMPOSITION_START = unsafeCastStringToDOMTopLevelType('compositionstart'); + var TOP_COMPOSITION_UPDATE = unsafeCastStringToDOMTopLevelType('compositionupdate'); + var TOP_CONTEXT_MENU = unsafeCastStringToDOMTopLevelType('contextmenu'); + var TOP_COPY = unsafeCastStringToDOMTopLevelType('copy'); + var TOP_CUT = unsafeCastStringToDOMTopLevelType('cut'); + var TOP_DOUBLE_CLICK = unsafeCastStringToDOMTopLevelType('dblclick'); + var TOP_AUX_CLICK = unsafeCastStringToDOMTopLevelType('auxclick'); + var TOP_DRAG = unsafeCastStringToDOMTopLevelType('drag'); + var TOP_DRAG_END = unsafeCastStringToDOMTopLevelType('dragend'); + var TOP_DRAG_ENTER = unsafeCastStringToDOMTopLevelType('dragenter'); + var TOP_DRAG_EXIT = unsafeCastStringToDOMTopLevelType('dragexit'); + var TOP_DRAG_LEAVE = unsafeCastStringToDOMTopLevelType('dragleave'); + var TOP_DRAG_OVER = unsafeCastStringToDOMTopLevelType('dragover'); + var TOP_DRAG_START = unsafeCastStringToDOMTopLevelType('dragstart'); + var TOP_DROP = unsafeCastStringToDOMTopLevelType('drop'); + var TOP_DURATION_CHANGE = unsafeCastStringToDOMTopLevelType('durationchange'); + var TOP_EMPTIED = unsafeCastStringToDOMTopLevelType('emptied'); + var TOP_ENCRYPTED = unsafeCastStringToDOMTopLevelType('encrypted'); + var TOP_ENDED = unsafeCastStringToDOMTopLevelType('ended'); + var TOP_ERROR = unsafeCastStringToDOMTopLevelType('error'); + var TOP_FOCUS = unsafeCastStringToDOMTopLevelType('focus'); + var TOP_GOT_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('gotpointercapture'); + var TOP_INPUT = unsafeCastStringToDOMTopLevelType('input'); + var TOP_INVALID = unsafeCastStringToDOMTopLevelType('invalid'); + var TOP_KEY_DOWN = unsafeCastStringToDOMTopLevelType('keydown'); + var TOP_KEY_PRESS = unsafeCastStringToDOMTopLevelType('keypress'); + var TOP_KEY_UP = unsafeCastStringToDOMTopLevelType('keyup'); + var TOP_LOAD = unsafeCastStringToDOMTopLevelType('load'); + var TOP_LOAD_START = unsafeCastStringToDOMTopLevelType('loadstart'); + var TOP_LOADED_DATA = unsafeCastStringToDOMTopLevelType('loadeddata'); + var TOP_LOADED_METADATA = unsafeCastStringToDOMTopLevelType('loadedmetadata'); + var TOP_LOST_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('lostpointercapture'); + var TOP_MOUSE_DOWN = unsafeCastStringToDOMTopLevelType('mousedown'); + var TOP_MOUSE_MOVE = unsafeCastStringToDOMTopLevelType('mousemove'); + var TOP_MOUSE_OUT = unsafeCastStringToDOMTopLevelType('mouseout'); + var TOP_MOUSE_OVER = unsafeCastStringToDOMTopLevelType('mouseover'); + var TOP_MOUSE_UP = unsafeCastStringToDOMTopLevelType('mouseup'); + var TOP_PASTE = unsafeCastStringToDOMTopLevelType('paste'); + var TOP_PAUSE = unsafeCastStringToDOMTopLevelType('pause'); + var TOP_PLAY = unsafeCastStringToDOMTopLevelType('play'); + var TOP_PLAYING = unsafeCastStringToDOMTopLevelType('playing'); + var TOP_POINTER_CANCEL = unsafeCastStringToDOMTopLevelType('pointercancel'); + var TOP_POINTER_DOWN = unsafeCastStringToDOMTopLevelType('pointerdown'); + var TOP_POINTER_MOVE = unsafeCastStringToDOMTopLevelType('pointermove'); + var TOP_POINTER_OUT = unsafeCastStringToDOMTopLevelType('pointerout'); + var TOP_POINTER_OVER = unsafeCastStringToDOMTopLevelType('pointerover'); + var TOP_POINTER_UP = unsafeCastStringToDOMTopLevelType('pointerup'); + var TOP_PROGRESS = unsafeCastStringToDOMTopLevelType('progress'); + var TOP_RATE_CHANGE = unsafeCastStringToDOMTopLevelType('ratechange'); + var TOP_RESET = unsafeCastStringToDOMTopLevelType('reset'); + var TOP_SCROLL = unsafeCastStringToDOMTopLevelType('scroll'); + var TOP_SEEKED = unsafeCastStringToDOMTopLevelType('seeked'); + var TOP_SEEKING = unsafeCastStringToDOMTopLevelType('seeking'); + var TOP_SELECTION_CHANGE = unsafeCastStringToDOMTopLevelType('selectionchange'); + var TOP_STALLED = unsafeCastStringToDOMTopLevelType('stalled'); + var TOP_SUBMIT = unsafeCastStringToDOMTopLevelType('submit'); + var TOP_SUSPEND = unsafeCastStringToDOMTopLevelType('suspend'); + var TOP_TEXT_INPUT = unsafeCastStringToDOMTopLevelType('textInput'); + var TOP_TIME_UPDATE = unsafeCastStringToDOMTopLevelType('timeupdate'); + var TOP_TOGGLE = unsafeCastStringToDOMTopLevelType('toggle'); + var TOP_TOUCH_CANCEL = unsafeCastStringToDOMTopLevelType('touchcancel'); + var TOP_TOUCH_END = unsafeCastStringToDOMTopLevelType('touchend'); + var TOP_TOUCH_MOVE = unsafeCastStringToDOMTopLevelType('touchmove'); + var TOP_TOUCH_START = unsafeCastStringToDOMTopLevelType('touchstart'); + var TOP_TRANSITION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('transitionend')); + var TOP_VOLUME_CHANGE = unsafeCastStringToDOMTopLevelType('volumechange'); + var TOP_WAITING = unsafeCastStringToDOMTopLevelType('waiting'); + var TOP_WHEEL = unsafeCastStringToDOMTopLevelType('wheel'); // List of events that need to be individually attached to media elements. + // Note that events in this list will *not* be listened to at the top level + // unless they're explicitly whitelisted in `ReactBrowserEventEmitter.listenTo`. + + var mediaEventTypes = [TOP_ABORT, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_VOLUME_CHANGE, TOP_WAITING]; + function getRawEventName(topLevelType) { + return unsafeCastDOMTopLevelTypeToString(topLevelType); + } + + var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; // prettier-ignore + + var elementListenerMap = new PossiblyWeakMap(); + function getListenerMapForElement(element) { + var listenerMap = elementListenerMap.get(element); + + if (listenerMap === undefined) { + listenerMap = new Map(); + elementListenerMap.set(element, listenerMap); + } + + return listenerMap; } - return hostProps; -} - -// TODO: direct imports like some-package/src/* are bad. Fix me. -var didWarnValueDefaultValue$1; + /** + * `ReactInstanceMap` maintains a mapping from a public facing stateful + * instance (key) and the internal representation (value). This allows public + * methods to accept the user facing instance as an argument and map them back + * to internal methods. + * + * Note that this module is currently shared and assumed to be stateless. + * If this becomes an actual Map, that will break. + */ + function get(key) { + return key._reactInternalFiber; + } + function has$1(key) { + return key._reactInternalFiber !== undefined; + } + function set(key, value) { + key._reactInternalFiber = value; + } + + // Don't change these two values. They're used by React Dev Tools. + var NoEffect = + /* */ + 0; + var PerformedWork = + /* */ + 1; // You can change the rest (and add more). + + var Placement = + /* */ + 2; + var Update = + /* */ + 4; + var PlacementAndUpdate = + /* */ + 6; + var Deletion = + /* */ + 8; + var ContentReset = + /* */ + 16; + var Callback = + /* */ + 32; + var DidCapture = + /* */ + 64; + var Ref = + /* */ + 128; + var Snapshot = + /* */ + 256; + var Passive = + /* */ + 512; + var Hydrating = + /* */ + 1024; + var HydratingAndUpdate = + /* */ + 1028; // Passive & Update & Callback & Ref & Snapshot + + var LifecycleEffectMask = + /* */ + 932; // Union of all host effects + + var HostEffectMask = + /* */ + 2047; + var Incomplete = + /* */ + 2048; + var ShouldCapture = + /* */ + 4096; + + var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner; + function getNearestMountedFiber(fiber) { + var node = fiber; + var nearestMounted = fiber; -{ - didWarnValueDefaultValue$1 = false; -} + if (!fiber.alternate) { + // If there is no alternate, this might be a new tree that isn't inserted + // yet. If it is, then it will have a pending insertion effect on it. + var nextNode = node; -function getDeclarationErrorAddendum() { - var ownerName = getCurrentFiberOwnerNameInDevOrNull(); + do { + node = nextNode; - if (ownerName) { - return '\n\nCheck the render method of `' + ownerName + '`.'; - } + if ((node.effectTag & (Placement | Hydrating)) !== NoEffect) { + // This is an insertion or in-progress hydration. The nearest possible + // mounted fiber is the parent but we need to continue to figure out + // if that one is still mounted. + nearestMounted = node.return; + } - return ''; -} + nextNode = node.return; + } while (nextNode); + } else { + while (node.return) { + node = node.return; + } + } -var valuePropNames = ['value', 'defaultValue']; -/** - * Validation function for `value` and `defaultValue`. - */ + if (node.tag === HostRoot) { + // TODO: Check if this was a nested HostRoot when used with + // renderContainerIntoSubtree. + return nearestMounted; + } // If we didn't hit the root, that means that we're in an disconnected tree + // that has been unmounted. -function checkSelectPropTypes(props) { - ReactControlledValuePropTypes.checkPropTypes('select', props); - for (var i = 0; i < valuePropNames.length; i++) { - var propName = valuePropNames[i]; + return null; + } + function getSuspenseInstanceFromFiber(fiber) { + if (fiber.tag === SuspenseComponent) { + var suspenseState = fiber.memoizedState; - if (props[propName] == null) { - continue; - } + if (suspenseState === null) { + var current = fiber.alternate; - var isArray = Array.isArray(props[propName]); + if (current !== null) { + suspenseState = current.memoizedState; + } + } - if (props.multiple && !isArray) { - warning$1(false, 'The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum()); - } else if (!props.multiple && isArray) { - warning$1(false, 'The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum()); + if (suspenseState !== null) { + return suspenseState.dehydrated; + } } + + return null; } -} + function getContainerFromFiber(fiber) { + return fiber.tag === HostRoot ? fiber.stateNode.containerInfo : null; + } + function isFiberMounted(fiber) { + return getNearestMountedFiber(fiber) === fiber; + } + function isMounted(component) { + { + var owner = ReactCurrentOwner.current; -function updateOptions(node, multiple, propValue, setDefaultSelected) { - var options = node.options; + if (owner !== null && owner.tag === ClassComponent) { + var ownerFiber = owner; + var instance = ownerFiber.stateNode; - if (multiple) { - var selectedValues = propValue; - var selectedValue = {}; + if (!instance._warnedAboutRefsInRender) { + error('%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(ownerFiber.type) || 'A component'); + } - for (var i = 0; i < selectedValues.length; i++) { - // Prefix to avoid chaos with special keys. - selectedValue['$' + selectedValues[i]] = true; + instance._warnedAboutRefsInRender = true; + } } - for (var _i = 0; _i < options.length; _i++) { - var selected = selectedValue.hasOwnProperty('$' + options[_i].value); + var fiber = get(component); - if (options[_i].selected !== selected) { - options[_i].selected = selected; - } + if (!fiber) { + return false; + } + + return getNearestMountedFiber(fiber) === fiber; + } - if (selected && setDefaultSelected) { - options[_i].defaultSelected = true; + function assertIsMounted(fiber) { + if (!(getNearestMountedFiber(fiber) === fiber)) { + { + throw Error( "Unable to find node on an unmounted component." ); } } - } else { - // Do not set `select.value` as exact behavior isn't consistent across all - // browsers for all cases. - var _selectedValue = toString(getToStringValue(propValue)); + } - var defaultSelected = null; + function findCurrentFiberUsingSlowPath(fiber) { + var alternate = fiber.alternate; - for (var _i2 = 0; _i2 < options.length; _i2++) { - if (options[_i2].value === _selectedValue) { - options[_i2].selected = true; + if (!alternate) { + // If there is no alternate, then we only need to check if it is mounted. + var nearestMounted = getNearestMountedFiber(fiber); - if (setDefaultSelected) { - options[_i2].defaultSelected = true; + if (!(nearestMounted !== null)) { + { + throw Error( "Unable to find node on an unmounted component." ); } + } - return; + if (nearestMounted !== fiber) { + return null; } - if (defaultSelected === null && !options[_i2].disabled) { - defaultSelected = options[_i2]; + return fiber; + } // If we have two possible branches, we'll walk backwards up to the root + // to see what path the root points to. On the way we may hit one of the + // special cases and we'll deal with them. + + + var a = fiber; + var b = alternate; + + while (true) { + var parentA = a.return; + + if (parentA === null) { + // We're at the root. + break; } - } - if (defaultSelected !== null) { - defaultSelected.selected = true; - } - } -} -/** - * Implements a <select> host component that allows optionally setting the - * props `value` and `defaultValue`. If `multiple` is false, the prop must be a - * stringable. If `multiple` is true, the prop must be an array of stringables. - * - * If `value` is not supplied (or null/undefined), user actions that change the - * selected option will trigger updates to the rendered options. - * - * If it is supplied (and not null/undefined), the rendered options will not - * update in response to user actions. Instead, the `value` prop must change in - * order for the rendered options to update. - * - * If `defaultValue` is provided, any options with the supplied values will be - * selected. - */ + var parentB = parentA.alternate; + if (parentB === null) { + // There is no alternate. This is an unusual case. Currently, it only + // happens when a Suspense component is hidden. An extra fragment fiber + // is inserted in between the Suspense fiber and its children. Skip + // over this extra fragment fiber and proceed to the next parent. + var nextParent = parentA.return; -function getHostProps$2(element, props) { - return _assign({}, props, { - value: undefined - }); -} -function initWrapperState$1(element, props) { - var node = element; + if (nextParent !== null) { + a = b = nextParent; + continue; + } // If there's no parent, we're at the root. - { - checkSelectPropTypes(props); - } - node._wrapperState = { - wasMultiple: !!props.multiple - }; + break; + } // If both copies of the parent fiber point to the same child, we can + // assume that the child is current. This happens when we bailout on low + // priority: the bailed out fiber's child reuses the current child. - { - if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue$1) { - warning$1(false, 'Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components'); - didWarnValueDefaultValue$1 = true; - } - } -} -function postMountWrapper$2(element, props) { - var node = element; - node.multiple = !!props.multiple; - var value = props.value; - - if (value != null) { - updateOptions(node, !!props.multiple, value, false); - } else if (props.defaultValue != null) { - updateOptions(node, !!props.multiple, props.defaultValue, true); - } -} -function postUpdateWrapper(element, props) { - var node = element; - var wasMultiple = node._wrapperState.wasMultiple; - node._wrapperState.wasMultiple = !!props.multiple; - var value = props.value; - - if (value != null) { - updateOptions(node, !!props.multiple, value, false); - } else if (wasMultiple !== !!props.multiple) { - // For simplicity, reapply `defaultValue` if `multiple` is toggled. - if (props.defaultValue != null) { - updateOptions(node, !!props.multiple, props.defaultValue, true); - } else { - // Revert the select back to its default unselected state. - updateOptions(node, !!props.multiple, props.multiple ? [] : '', false); - } - } -} -function restoreControlledState$2(element, props) { - var node = element; - var value = props.value; - if (value != null) { - updateOptions(node, !!props.multiple, value, false); - } -} + if (parentA.child === parentB.child) { + var child = parentA.child; -var didWarnValDefaultVal = false; + while (child) { + if (child === a) { + // We've determined that A is the current branch. + assertIsMounted(parentA); + return fiber; + } -/** - * Implements a <textarea> host component that allows setting `value`, and - * `defaultValue`. This differs from the traditional DOM API because value is - * usually set as PCDATA children. - * - * If `value` is not supplied (or null/undefined), user actions that affect the - * value will trigger updates to the element. - * - * If `value` is supplied (and not null/undefined), the rendered element will - * not trigger updates to the element. Instead, the `value` prop must change in - * order for the rendered element to be updated. - * - * The rendered element will be initialized with an empty value, the prop - * `defaultValue` if specified, or the children content (deprecated). - */ -function getHostProps$3(element, props) { - var node = element; + if (child === b) { + // We've determined that B is the current branch. + assertIsMounted(parentA); + return alternate; + } - if (!(props.dangerouslySetInnerHTML == null)) { - { - throw Error("`dangerouslySetInnerHTML` does not make sense on <textarea>."); - } - } // Always set children to the same thing. In IE9, the selection range will - // get reset if `textContent` is mutated. We could add a check in setTextContent - // to only set the value if/when the value differs from the node value (which would - // completely solve this IE9 bug), but Sebastian+Sophie seemed to like this - // solution. The value can be a boolean or object so that's why it's forced - // to be a string. + child = child.sibling; + } // We should never have an alternate for any mounting node. So the only + // way this could possibly happen is if this was unmounted, if at all. - var hostProps = _assign({}, props, { - value: undefined, - defaultValue: undefined, - children: toString(node._wrapperState.initialValue) - }); + { + { + throw Error( "Unable to find node on an unmounted component." ); + } + } + } - return hostProps; -} -function initWrapperState$2(element, props) { - var node = element; + if (a.return !== b.return) { + // The return pointer of A and the return pointer of B point to different + // fibers. We assume that return pointers never criss-cross, so A must + // belong to the child set of A.return, and B must belong to the child + // set of B.return. + a = parentA; + b = parentB; + } else { + // The return pointers point to the same fiber. We'll have to use the + // default, slow path: scan the child sets of each parent alternate to see + // which child belongs to which set. + // + // Search parent A's child set + var didFindChild = false; + var _child = parentA.child; - { - ReactControlledValuePropTypes.checkPropTypes('textarea', props); + while (_child) { + if (_child === a) { + didFindChild = true; + a = parentA; + b = parentB; + break; + } - if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) { - warning$1(false, '%s contains a textarea with both value and defaultValue props. ' + 'Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component'); - didWarnValDefaultVal = true; - } - } + if (_child === b) { + didFindChild = true; + b = parentA; + a = parentB; + break; + } - var initialValue = props.value; // Only bother fetching default value if we're going to use it + _child = _child.sibling; + } + + if (!didFindChild) { + // Search parent B's child set + _child = parentB.child; + + while (_child) { + if (_child === a) { + didFindChild = true; + a = parentB; + b = parentA; + break; + } - if (initialValue == null) { - var defaultValue = props.defaultValue; // TODO (yungsters): Remove support for children content in <textarea>. + if (_child === b) { + didFindChild = true; + b = parentB; + a = parentA; + break; + } - var children = props.children; + _child = _child.sibling; + } - if (children != null) { - { - warning$1(false, 'Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.'); + if (!didFindChild) { + { + throw Error( "Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue." ); + } + } + } } - if (!(defaultValue == null)) { + if (!(a.alternate === b)) { { - throw Error("If you supply `defaultValue` on a <textarea>, do not pass children."); + throw Error( "Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue." ); } } + } // If the root is not a host container, we're in a disconnected tree. I.e. + // unmounted. - if (Array.isArray(children)) { - if (!(children.length <= 1)) { - { - throw Error("<textarea> can only have at most one child."); - } - } - children = children[0]; + if (!(a.tag === HostRoot)) { + { + throw Error( "Unable to find node on an unmounted component." ); } - - defaultValue = children; } - if (defaultValue == null) { - defaultValue = ''; - } + if (a.stateNode.current === a) { + // We've determined that A is the current branch. + return fiber; + } // Otherwise B has to be current branch. - initialValue = defaultValue; + + return alternate; } + function findCurrentHostFiber(parent) { + var currentParent = findCurrentFiberUsingSlowPath(parent); - node._wrapperState = { - initialValue: getToStringValue(initialValue) - }; -} -function updateWrapper$1(element, props) { - var node = element; - var value = getToStringValue(props.value); - var defaultValue = getToStringValue(props.defaultValue); + if (!currentParent) { + return null; + } // Next we'll drill down this component to find the first HostComponent/Text. - if (value != null) { - // Cast `value` to a string to ensure the value is set correctly. While - // browsers typically do this as necessary, jsdom doesn't. - var newValue = toString(value); // To avoid side effects (such as losing text selection), only set value if changed - if (newValue !== node.value) { - node.value = newValue; - } + var node = currentParent; - if (props.defaultValue == null && node.defaultValue !== newValue) { - node.defaultValue = newValue; - } - } + while (true) { + if (node.tag === HostComponent || node.tag === HostText) { + return node; + } else if (node.child) { + node.child.return = node; + node = node.child; + continue; + } - if (defaultValue != null) { - node.defaultValue = toString(defaultValue); - } -} -function postMountWrapper$3(element, props) { - var node = element; // This is in postMount because we need access to the DOM node, which is not - // available until after the component has mounted. + if (node === currentParent) { + return null; + } - var textContent = node.textContent; // Only set node.value if textContent is equal to the expected - // initial value. In IE10/IE11 there is a bug where the placeholder attribute - // will populate textContent as well. - // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/ + while (!node.sibling) { + if (!node.return || node.return === currentParent) { + return null; + } - if (textContent === node._wrapperState.initialValue) { - if (textContent !== '' && textContent !== null) { - node.value = textContent; - } + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } // Flow needs the return null here, but ESLint complains about it. + // eslint-disable-next-line no-unreachable + + + return null; } -} -function restoreControlledState$3(element, props) { - // DOM component is still mounted; update - updateWrapper$1(element, props); -} + function findCurrentHostFiberWithNoPortals(parent) { + var currentParent = findCurrentFiberUsingSlowPath(parent); -var HTML_NAMESPACE$1 = 'http://www.w3.org/1999/xhtml'; -var MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML'; -var SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; -var Namespaces = { - html: HTML_NAMESPACE$1, - mathml: MATH_NAMESPACE, - svg: SVG_NAMESPACE -}; // Assumes there is no parent namespace. + if (!currentParent) { + return null; + } // Next we'll drill down this component to find the first HostComponent/Text. -function getIntrinsicNamespace(type) { - switch (type) { - case 'svg': - return SVG_NAMESPACE; - case 'math': - return MATH_NAMESPACE; + var node = currentParent; - default: - return HTML_NAMESPACE$1; - } -} -function getChildNamespace(parentNamespace, type) { - if (parentNamespace == null || parentNamespace === HTML_NAMESPACE$1) { - // No (or default) parent namespace: potential entry point. - return getIntrinsicNamespace(type); - } + while (true) { + if (node.tag === HostComponent || node.tag === HostText || enableFundamentalAPI ) { + return node; + } else if (node.child && node.tag !== HostPortal) { + node.child.return = node; + node = node.child; + continue; + } - if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') { - // We're leaving SVG. - return HTML_NAMESPACE$1; - } // By default, pass namespace below. + if (node === currentParent) { + return null; + } + + while (!node.sibling) { + if (!node.return || node.return === currentParent) { + return null; + } + node = node.return; + } - return parentNamespace; -} + node.sibling.return = node.return; + node = node.sibling; + } // Flow needs the return null here, but ESLint complains about it. + // eslint-disable-next-line no-unreachable -/* globals MSApp */ -/** - * Create a function which has 'unsafe' privileges (required by windows8 apps) - */ -var createMicrosoftUnsafeLocalFunction = function (func) { - if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) { - return function (arg0, arg1, arg2, arg3) { - MSApp.execUnsafeLocalFunction(function () { - return func(arg0, arg1, arg2, arg3); - }); - }; - } else { - return func; + return null; } -}; -var reusableSVGContainer; -/** - * Set the innerHTML property of a node - * - * @param {DOMElement} node - * @param {string} html - * @internal - */ + /** + * Accumulates items that must not be null or undefined into the first one. This + * is used to conserve memory by avoiding array allocations, and thus sacrifices + * API cleanness. Since `current` can be null before being passed in and not + * null after this function, make sure to assign it back to `current`: + * + * `a = accumulateInto(a, b);` + * + * This API should be sparingly used. Try `accumulate` for something cleaner. + * + * @return {*|array<*>} An accumulation of items. + */ -var setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) { - if (node.namespaceURI === Namespaces.svg) { - { - if (enableTrustedTypesIntegration) { - // TODO: reconsider the text of this warning and when it should show - // before enabling the feature flag. - !(typeof trustedTypes === 'undefined') ? warning$1(false, "Using 'dangerouslySetInnerHTML' in an svg element with " + 'Trusted Types enabled in an Internet Explorer will cause ' + 'the trusted value to be converted to string. Assigning string ' + "to 'innerHTML' will throw an error if Trusted Types are enforced. " + "You can try to wrap your svg element inside a div and use 'dangerouslySetInnerHTML' " + 'on the enclosing div instead.') : void 0; + function accumulateInto(current, next) { + if (!(next != null)) { + { + throw Error( "accumulateInto(...): Accumulated items must not be null or undefined." ); } } - if (!('innerHTML' in node)) { - // IE does not have innerHTML for SVG nodes, so instead we inject the - // new markup in a temp node and then move the child nodes across into - // the target node - reusableSVGContainer = reusableSVGContainer || document.createElement('div'); - reusableSVGContainer.innerHTML = '<svg>' + html.valueOf().toString() + '</svg>'; - var svgNode = reusableSVGContainer.firstChild; + if (current == null) { + return next; + } // Both are not empty. Warning: Never call x.concat(y) when you are not + // certain that x is an Array (x could be a string with concat method). - while (node.firstChild) { - node.removeChild(node.firstChild); - } - while (svgNode.firstChild) { - node.appendChild(svgNode.firstChild); + if (Array.isArray(current)) { + if (Array.isArray(next)) { + current.push.apply(current, next); + return current; } - return; + current.push(next); + return current; } - } - node.innerHTML = html; -}); - -/** - * HTML nodeType values that represent the type of the node - */ -var ELEMENT_NODE = 1; -var TEXT_NODE = 3; -var COMMENT_NODE = 8; -var DOCUMENT_NODE = 9; -var DOCUMENT_FRAGMENT_NODE = 11; - -/** - * Set the textContent property of a node. For text updates, it's faster - * to set the `nodeValue` of the Text node directly instead of using - * `.textContent` which will remove the existing node and create a new one. - * - * @param {DOMElement} node - * @param {string} text - * @internal - */ + if (Array.isArray(next)) { + // A bit too dangerous to mutate `next`. + return [current].concat(next); + } -var setTextContent = function (node, text) { - if (text) { - var firstChild = node.firstChild; + return [current, next]; + } - if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) { - firstChild.nodeValue = text; - return; + /** + * @param {array} arr an "accumulation" of items which is either an Array or + * a single item. Useful when paired with the `accumulate` module. This is a + * simple utility that allows us to reason about a collection of items, but + * handling the case when there is exactly one item (and we do not need to + * allocate an array). + * @param {function} cb Callback invoked with each element or a collection. + * @param {?} [scope] Scope used as `this` in a callback. + */ + function forEachAccumulated(arr, cb, scope) { + if (Array.isArray(arr)) { + arr.forEach(cb, scope); + } else if (arr) { + cb.call(scope, arr); } } - node.textContent = text; -}; + /** + * Internal queue of events that have accumulated their dispatches and are + * waiting to have their dispatches executed. + */ -// Do not use the below two methods directly! -// Instead use constants exported from DOMTopLevelEventTypes in ReactDOM. -// (It is the only module that is allowed to access these methods.) -function unsafeCastStringToDOMTopLevelType(topLevelType) { - return topLevelType; -} -function unsafeCastDOMTopLevelTypeToString(topLevelType) { - return topLevelType; -} + var eventQueue = null; + /** + * Dispatches an event and releases it back into the pool, unless persistent. + * + * @param {?object} event Synthetic event to be dispatched. + * @private + */ -/** - * Generate a mapping of standard vendor prefixes using the defined style property and event name. - * - * @param {string} styleProp - * @param {string} eventName - * @returns {object} - */ - -function makePrefixMap(styleProp, eventName) { - var prefixes = {}; - prefixes[styleProp.toLowerCase()] = eventName.toLowerCase(); - prefixes['Webkit' + styleProp] = 'webkit' + eventName; - prefixes['Moz' + styleProp] = 'moz' + eventName; - return prefixes; -} -/** - * A list of event names to a configurable list of vendor prefixes. - */ + var executeDispatchesAndRelease = function (event) { + if (event) { + executeDispatchesInOrder(event); + if (!event.isPersistent()) { + event.constructor.release(event); + } + } + }; -var vendorPrefixes = { - animationend: makePrefixMap('Animation', 'AnimationEnd'), - animationiteration: makePrefixMap('Animation', 'AnimationIteration'), - animationstart: makePrefixMap('Animation', 'AnimationStart'), - transitionend: makePrefixMap('Transition', 'TransitionEnd') -}; -/** - * Event names that have already been detected and prefixed (if applicable). - */ + var executeDispatchesAndReleaseTopLevel = function (e) { + return executeDispatchesAndRelease(e); + }; -var prefixedEventNames = {}; -/** - * Element to check for prefixes on. - */ + function runEventsInBatch(events) { + if (events !== null) { + eventQueue = accumulateInto(eventQueue, events); + } // Set `eventQueue` to null before processing it so that we can tell if more + // events get enqueued while processing. -var style = {}; -/** - * Bootstrap if a DOM exists. - */ -if (canUseDOM) { - style = document.createElement('div').style; // On some platforms, in particular some releases of Android 4.x, - // the un-prefixed "animation" and "transition" properties are defined on the - // style object but the events that fire will still be prefixed, so we need - // to check if the un-prefixed events are usable, and if not remove them from the map. + var processingEventQueue = eventQueue; + eventQueue = null; - if (!('AnimationEvent' in window)) { - delete vendorPrefixes.animationend.animation; - delete vendorPrefixes.animationiteration.animation; - delete vendorPrefixes.animationstart.animation; - } // Same as above + if (!processingEventQueue) { + return; + } + forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel); - if (!('TransitionEvent' in window)) { - delete vendorPrefixes.transitionend.transition; - } -} -/** - * Attempts to determine the correct vendor prefixed event name. - * - * @param {string} eventName - * @returns {string} - */ + if (!!eventQueue) { + { + throw Error( "processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented." ); + } + } // This would be a good time to rethrow if any of the event handlers threw. -function getVendorPrefixedEventName(eventName) { - if (prefixedEventNames[eventName]) { - return prefixedEventNames[eventName]; - } else if (!vendorPrefixes[eventName]) { - return eventName; + rethrowCaughtError(); } - var prefixMap = vendorPrefixes[eventName]; - - for (var styleProp in prefixMap) { - if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) { - return prefixedEventNames[eventName] = prefixMap[styleProp]; - } - } + /** + * Gets the target node from a native browser event by accounting for + * inconsistencies in browser DOM APIs. + * + * @param {object} nativeEvent Native browser event. + * @return {DOMEventTarget} Target node. + */ - return eventName; -} + function getEventTarget(nativeEvent) { + // Fallback to nativeEvent.srcElement for IE9 + // https://github.com/facebook/react/issues/12506 + var target = nativeEvent.target || nativeEvent.srcElement || window; // Normalize SVG <use> element events #4963 -/** - * To identify top level events in ReactDOM, we use constants defined by this - * module. This is the only module that uses the unsafe* methods to express - * that the constants actually correspond to the browser event names. This lets - * us save some bundle size by avoiding a top level type -> event name map. - * The rest of ReactDOM code should import top level types from this file. - */ + if (target.correspondingUseElement) { + target = target.correspondingUseElement; + } // Safari may fire events on text nodes (Node.TEXT_NODE is 3). + // @see http://www.quirksmode.org/js/events_properties.html -var TOP_ABORT = unsafeCastStringToDOMTopLevelType('abort'); -var TOP_ANIMATION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationend')); -var TOP_ANIMATION_ITERATION = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationiteration')); -var TOP_ANIMATION_START = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationstart')); -var TOP_BLUR = unsafeCastStringToDOMTopLevelType('blur'); -var TOP_CAN_PLAY = unsafeCastStringToDOMTopLevelType('canplay'); -var TOP_CAN_PLAY_THROUGH = unsafeCastStringToDOMTopLevelType('canplaythrough'); -var TOP_CANCEL = unsafeCastStringToDOMTopLevelType('cancel'); -var TOP_CHANGE = unsafeCastStringToDOMTopLevelType('change'); -var TOP_CLICK = unsafeCastStringToDOMTopLevelType('click'); -var TOP_CLOSE = unsafeCastStringToDOMTopLevelType('close'); -var TOP_COMPOSITION_END = unsafeCastStringToDOMTopLevelType('compositionend'); -var TOP_COMPOSITION_START = unsafeCastStringToDOMTopLevelType('compositionstart'); -var TOP_COMPOSITION_UPDATE = unsafeCastStringToDOMTopLevelType('compositionupdate'); -var TOP_CONTEXT_MENU = unsafeCastStringToDOMTopLevelType('contextmenu'); -var TOP_COPY = unsafeCastStringToDOMTopLevelType('copy'); -var TOP_CUT = unsafeCastStringToDOMTopLevelType('cut'); -var TOP_DOUBLE_CLICK = unsafeCastStringToDOMTopLevelType('dblclick'); -var TOP_AUX_CLICK = unsafeCastStringToDOMTopLevelType('auxclick'); -var TOP_DRAG = unsafeCastStringToDOMTopLevelType('drag'); -var TOP_DRAG_END = unsafeCastStringToDOMTopLevelType('dragend'); -var TOP_DRAG_ENTER = unsafeCastStringToDOMTopLevelType('dragenter'); -var TOP_DRAG_EXIT = unsafeCastStringToDOMTopLevelType('dragexit'); -var TOP_DRAG_LEAVE = unsafeCastStringToDOMTopLevelType('dragleave'); -var TOP_DRAG_OVER = unsafeCastStringToDOMTopLevelType('dragover'); -var TOP_DRAG_START = unsafeCastStringToDOMTopLevelType('dragstart'); -var TOP_DROP = unsafeCastStringToDOMTopLevelType('drop'); -var TOP_DURATION_CHANGE = unsafeCastStringToDOMTopLevelType('durationchange'); -var TOP_EMPTIED = unsafeCastStringToDOMTopLevelType('emptied'); -var TOP_ENCRYPTED = unsafeCastStringToDOMTopLevelType('encrypted'); -var TOP_ENDED = unsafeCastStringToDOMTopLevelType('ended'); -var TOP_ERROR = unsafeCastStringToDOMTopLevelType('error'); -var TOP_FOCUS = unsafeCastStringToDOMTopLevelType('focus'); -var TOP_GOT_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('gotpointercapture'); -var TOP_INPUT = unsafeCastStringToDOMTopLevelType('input'); -var TOP_INVALID = unsafeCastStringToDOMTopLevelType('invalid'); -var TOP_KEY_DOWN = unsafeCastStringToDOMTopLevelType('keydown'); -var TOP_KEY_PRESS = unsafeCastStringToDOMTopLevelType('keypress'); -var TOP_KEY_UP = unsafeCastStringToDOMTopLevelType('keyup'); -var TOP_LOAD = unsafeCastStringToDOMTopLevelType('load'); -var TOP_LOAD_START = unsafeCastStringToDOMTopLevelType('loadstart'); -var TOP_LOADED_DATA = unsafeCastStringToDOMTopLevelType('loadeddata'); -var TOP_LOADED_METADATA = unsafeCastStringToDOMTopLevelType('loadedmetadata'); -var TOP_LOST_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('lostpointercapture'); -var TOP_MOUSE_DOWN = unsafeCastStringToDOMTopLevelType('mousedown'); -var TOP_MOUSE_MOVE = unsafeCastStringToDOMTopLevelType('mousemove'); -var TOP_MOUSE_OUT = unsafeCastStringToDOMTopLevelType('mouseout'); -var TOP_MOUSE_OVER = unsafeCastStringToDOMTopLevelType('mouseover'); -var TOP_MOUSE_UP = unsafeCastStringToDOMTopLevelType('mouseup'); -var TOP_PASTE = unsafeCastStringToDOMTopLevelType('paste'); -var TOP_PAUSE = unsafeCastStringToDOMTopLevelType('pause'); -var TOP_PLAY = unsafeCastStringToDOMTopLevelType('play'); -var TOP_PLAYING = unsafeCastStringToDOMTopLevelType('playing'); -var TOP_POINTER_CANCEL = unsafeCastStringToDOMTopLevelType('pointercancel'); -var TOP_POINTER_DOWN = unsafeCastStringToDOMTopLevelType('pointerdown'); - - -var TOP_POINTER_MOVE = unsafeCastStringToDOMTopLevelType('pointermove'); -var TOP_POINTER_OUT = unsafeCastStringToDOMTopLevelType('pointerout'); -var TOP_POINTER_OVER = unsafeCastStringToDOMTopLevelType('pointerover'); -var TOP_POINTER_UP = unsafeCastStringToDOMTopLevelType('pointerup'); -var TOP_PROGRESS = unsafeCastStringToDOMTopLevelType('progress'); -var TOP_RATE_CHANGE = unsafeCastStringToDOMTopLevelType('ratechange'); -var TOP_RESET = unsafeCastStringToDOMTopLevelType('reset'); -var TOP_SCROLL = unsafeCastStringToDOMTopLevelType('scroll'); -var TOP_SEEKED = unsafeCastStringToDOMTopLevelType('seeked'); -var TOP_SEEKING = unsafeCastStringToDOMTopLevelType('seeking'); -var TOP_SELECTION_CHANGE = unsafeCastStringToDOMTopLevelType('selectionchange'); -var TOP_STALLED = unsafeCastStringToDOMTopLevelType('stalled'); -var TOP_SUBMIT = unsafeCastStringToDOMTopLevelType('submit'); -var TOP_SUSPEND = unsafeCastStringToDOMTopLevelType('suspend'); -var TOP_TEXT_INPUT = unsafeCastStringToDOMTopLevelType('textInput'); -var TOP_TIME_UPDATE = unsafeCastStringToDOMTopLevelType('timeupdate'); -var TOP_TOGGLE = unsafeCastStringToDOMTopLevelType('toggle'); -var TOP_TOUCH_CANCEL = unsafeCastStringToDOMTopLevelType('touchcancel'); -var TOP_TOUCH_END = unsafeCastStringToDOMTopLevelType('touchend'); -var TOP_TOUCH_MOVE = unsafeCastStringToDOMTopLevelType('touchmove'); -var TOP_TOUCH_START = unsafeCastStringToDOMTopLevelType('touchstart'); -var TOP_TRANSITION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('transitionend')); -var TOP_VOLUME_CHANGE = unsafeCastStringToDOMTopLevelType('volumechange'); -var TOP_WAITING = unsafeCastStringToDOMTopLevelType('waiting'); -var TOP_WHEEL = unsafeCastStringToDOMTopLevelType('wheel'); // List of events that need to be individually attached to media elements. -// Note that events in this list will *not* be listened to at the top level -// unless they're explicitly whitelisted in `ReactBrowserEventEmitter.listenTo`. - -var mediaEventTypes = [TOP_ABORT, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_VOLUME_CHANGE, TOP_WAITING]; -function getRawEventName(topLevelType) { - return unsafeCastDOMTopLevelTypeToString(topLevelType); -} - -/** - * `ReactInstanceMap` maintains a mapping from a public facing stateful - * instance (key) and the internal representation (value). This allows public - * methods to accept the user facing instance as an argument and map them back - * to internal methods. - * - * Note that this module is currently shared and assumed to be stateless. - * If this becomes an actual Map, that will break. - */ -/** - * This API should be called `delete` but we'd have to make sure to always - * transform these to strings for IE support. When this transform is fully - * supported we can rename it. - */ + return target.nodeType === TEXT_NODE ? target.parentNode : target; + } -function get(key) { - return key._reactInternalFiber; -} -function has$1(key) { - return key._reactInternalFiber !== undefined; -} -function set(key, value) { - key._reactInternalFiber = value; -} - -// Don't change these two values. They're used by React Dev Tools. -var NoEffect = -/* */ -0; -var PerformedWork = -/* */ -1; // You can change the rest (and add more). - -var Placement = -/* */ -2; -var Update = -/* */ -4; -var PlacementAndUpdate = -/* */ -6; -var Deletion = -/* */ -8; -var ContentReset = -/* */ -16; -var Callback = -/* */ -32; -var DidCapture = -/* */ -64; -var Ref = -/* */ -128; -var Snapshot = -/* */ -256; -var Passive = -/* */ -512; -var Hydrating = -/* */ -1024; -var HydratingAndUpdate = -/* */ -1028; // Passive & Update & Callback & Ref & Snapshot - -var LifecycleEffectMask = -/* */ -932; // Union of all host effects - -var HostEffectMask = -/* */ -2047; -var Incomplete = -/* */ -2048; -var ShouldCapture = -/* */ -4096; - -var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner; -function getNearestMountedFiber(fiber) { - var node = fiber; - var nearestMounted = fiber; - - if (!fiber.alternate) { - // If there is no alternate, this might be a new tree that isn't inserted - // yet. If it is, then it will have a pending insertion effect on it. - var nextNode = node; + /** + * Checks if an event is supported in the current execution environment. + * + * NOTE: This will not work correctly for non-generic events such as `change`, + * `reset`, `load`, `error`, and `select`. + * + * Borrows from Modernizr. + * + * @param {string} eventNameSuffix Event name, e.g. "click". + * @return {boolean} True if the event is supported. + * @internal + * @license Modernizr 3.0.0pre (Custom Build) | MIT + */ - do { - node = nextNode; + function isEventSupported(eventNameSuffix) { + if (!canUseDOM) { + return false; + } - if ((node.effectTag & (Placement | Hydrating)) !== NoEffect) { - // This is an insertion or in-progress hydration. The nearest possible - // mounted fiber is the parent but we need to continue to figure out - // if that one is still mounted. - nearestMounted = node.return; - } + var eventName = 'on' + eventNameSuffix; + var isSupported = eventName in document; - nextNode = node.return; - } while (nextNode); - } else { - while (node.return) { - node = node.return; + if (!isSupported) { + var element = document.createElement('div'); + element.setAttribute(eventName, 'return;'); + isSupported = typeof element[eventName] === 'function'; } - } - - if (node.tag === HostRoot) { - // TODO: Check if this was a nested HostRoot when used with - // renderContainerIntoSubtree. - return nearestMounted; - } // If we didn't hit the root, that means that we're in an disconnected tree - // that has been unmounted. + return isSupported; + } - return null; -} -function getSuspenseInstanceFromFiber(fiber) { - if (fiber.tag === SuspenseComponent) { - var suspenseState = fiber.memoizedState; + /** + * Summary of `DOMEventPluginSystem` event handling: + * + * - Top-level delegation is used to trap most native browser events. This + * may only occur in the main thread and is the responsibility of + * ReactDOMEventListener, which is injected and can therefore support + * pluggable event sources. This is the only work that occurs in the main + * thread. + * + * - We normalize and de-duplicate events to account for browser quirks. This + * may be done in the worker thread. + * + * - Forward these native events (with the associated top-level type used to + * trap it) to `EventPluginRegistry`, which in turn will ask plugins if they want + * to extract any synthetic events. + * + * - The `EventPluginRegistry` will then process each event by annotating them with + * "dispatches", a sequence of listeners and IDs that care about that event. + * + * - The `EventPluginRegistry` then dispatches the events. + * + * Overview of React and the event system: + * + * +------------+ . + * | DOM | . + * +------------+ . + * | . + * v . + * +------------+ . + * | ReactEvent | . + * | Listener | . + * +------------+ . +-----------+ + * | . +--------+|SimpleEvent| + * | . | |Plugin | + * +-----|------+ . v +-----------+ + * | | | . +--------------+ +------------+ + * | +-----------.--->|PluginRegistry| | Event | + * | | . | | +-----------+ | Propagators| + * | ReactEvent | . | | |TapEvent | |------------| + * | Emitter | . | |<---+|Plugin | |other plugin| + * | | . | | +-----------+ | utilities | + * | +-----------.--->| | +------------+ + * | | | . +--------------+ + * +-----|------+ . ^ +-----------+ + * | . | |Enter/Leave| + * + . +-------+|Plugin | + * +-------------+ . +-----------+ + * | application | . + * |-------------| . + * | | . + * | | . + * +-------------+ . + * . + * React Core . General Purpose Event Plugin System + */ - if (suspenseState === null) { - var current = fiber.alternate; + var CALLBACK_BOOKKEEPING_POOL_SIZE = 10; + var callbackBookkeepingPool = []; - if (current !== null) { - suspenseState = current.memoizedState; - } - } + function releaseTopLevelCallbackBookKeeping(instance) { + instance.topLevelType = null; + instance.nativeEvent = null; + instance.targetInst = null; + instance.ancestors.length = 0; - if (suspenseState !== null) { - return suspenseState.dehydrated; + if (callbackBookkeepingPool.length < CALLBACK_BOOKKEEPING_POOL_SIZE) { + callbackBookkeepingPool.push(instance); } - } + } // Used to store ancestor hierarchy in top level callback - return null; -} -function getContainerFromFiber(fiber) { - return fiber.tag === HostRoot ? fiber.stateNode.containerInfo : null; -} -function isFiberMounted(fiber) { - return getNearestMountedFiber(fiber) === fiber; -} -function isMounted(component) { - { - var owner = ReactCurrentOwner.current; - if (owner !== null && owner.tag === ClassComponent) { - var ownerFiber = owner; - var instance = ownerFiber.stateNode; - !instance._warnedAboutRefsInRender ? warningWithoutStack$1(false, '%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(ownerFiber.type) || 'A component') : void 0; - instance._warnedAboutRefsInRender = true; + function getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst, eventSystemFlags) { + if (callbackBookkeepingPool.length) { + var instance = callbackBookkeepingPool.pop(); + instance.topLevelType = topLevelType; + instance.eventSystemFlags = eventSystemFlags; + instance.nativeEvent = nativeEvent; + instance.targetInst = targetInst; + return instance; } - } - var fiber = get(component); - - if (!fiber) { - return false; + return { + topLevelType: topLevelType, + eventSystemFlags: eventSystemFlags, + nativeEvent: nativeEvent, + targetInst: targetInst, + ancestors: [] + }; } + /** + * Find the deepest React component completely containing the root of the + * passed-in instance (for use when entire React trees are nested within each + * other). If React trees are not nested, returns null. + */ - return getNearestMountedFiber(fiber) === fiber; -} - -function assertIsMounted(fiber) { - if (!(getNearestMountedFiber(fiber) === fiber)) { - { - throw Error("Unable to find node on an unmounted component."); - } - } -} -function findCurrentFiberUsingSlowPath(fiber) { - var alternate = fiber.alternate; + function findRootContainerNode(inst) { + if (inst.tag === HostRoot) { + return inst.stateNode.containerInfo; + } // TODO: It may be a good idea to cache this to prevent unnecessary DOM + // traversal, but caching is difficult to do correctly without using a + // mutation observer to listen for all DOM changes. - if (!alternate) { - // If there is no alternate, then we only need to check if it is mounted. - var nearestMounted = getNearestMountedFiber(fiber); - if (!(nearestMounted !== null)) { - { - throw Error("Unable to find node on an unmounted component."); - } + while (inst.return) { + inst = inst.return; } - if (nearestMounted !== fiber) { + if (inst.tag !== HostRoot) { + // This can happen if we're in a detached tree. return null; } - return fiber; - } // If we have two possible branches, we'll walk backwards up to the root - // to see what path the root points to. On the way we may hit one of the - // special cases and we'll deal with them. + return inst.stateNode.containerInfo; + } + /** + * Allows registered plugins an opportunity to extract events from top-level + * native browser events. + * + * @return {*} An accumulation of synthetic events. + * @internal + */ - var a = fiber; - var b = alternate; + function extractPluginEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) { + var events = null; - while (true) { - var parentA = a.return; + for (var i = 0; i < plugins.length; i++) { + // Not every plugin in the ordering may be loaded at runtime. + var possiblePlugin = plugins[i]; - if (parentA === null) { - // We're at the root. - break; + if (possiblePlugin) { + var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags); + + if (extractedEvents) { + events = accumulateInto(events, extractedEvents); + } + } } - var parentB = parentA.alternate; + return events; + } - if (parentB === null) { - // There is no alternate. This is an unusual case. Currently, it only - // happens when a Suspense component is hidden. An extra fragment fiber - // is inserted in between the Suspense fiber and its children. Skip - // over this extra fragment fiber and proceed to the next parent. - var nextParent = parentA.return; + function runExtractedPluginEventsInBatch(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) { + var events = extractPluginEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags); + runEventsInBatch(events); + } - if (nextParent !== null) { - a = b = nextParent; - continue; - } // If there's no parent, we're at the root. + function handleTopLevel(bookKeeping) { + var targetInst = bookKeeping.targetInst; // Loop through the hierarchy, in case there's any nested components. + // It's important that we build the array of ancestors before calling any + // event handlers, because event handlers can modify the DOM, leading to + // inconsistencies with ReactMount's node cache. See #1105. + var ancestor = targetInst; - break; - } // If both copies of the parent fiber point to the same child, we can - // assume that the child is current. This happens when we bailout on low - // priority: the bailed out fiber's child reuses the current child. + do { + if (!ancestor) { + var ancestors = bookKeeping.ancestors; + ancestors.push(ancestor); + break; + } + var root = findRootContainerNode(ancestor); - if (parentA.child === parentB.child) { - var child = parentA.child; + if (!root) { + break; + } - while (child) { - if (child === a) { - // We've determined that A is the current branch. - assertIsMounted(parentA); - return fiber; - } + var tag = ancestor.tag; - if (child === b) { - // We've determined that B is the current branch. - assertIsMounted(parentA); - return alternate; - } + if (tag === HostComponent || tag === HostText) { + bookKeeping.ancestors.push(ancestor); + } - child = child.sibling; - } // We should never have an alternate for any mounting node. So the only - // way this could possibly happen is if this was unmounted, if at all. + ancestor = getClosestInstanceFromNode(root); + } while (ancestor); + for (var i = 0; i < bookKeeping.ancestors.length; i++) { + targetInst = bookKeeping.ancestors[i]; + var eventTarget = getEventTarget(bookKeeping.nativeEvent); + var topLevelType = bookKeeping.topLevelType; + var nativeEvent = bookKeeping.nativeEvent; + var eventSystemFlags = bookKeeping.eventSystemFlags; // If this is the first ancestor, we mark it on the system flags - { - { - throw Error("Unable to find node on an unmounted component."); - } + if (i === 0) { + eventSystemFlags |= IS_FIRST_ANCESTOR; } + + runExtractedPluginEventsInBatch(topLevelType, targetInst, nativeEvent, eventTarget, eventSystemFlags); } + } - if (a.return !== b.return) { - // The return pointer of A and the return pointer of B point to different - // fibers. We assume that return pointers never criss-cross, so A must - // belong to the child set of A.return, and B must belong to the child - // set of B.return. - a = parentA; - b = parentB; - } else { - // The return pointers point to the same fiber. We'll have to use the - // default, slow path: scan the child sets of each parent alternate to see - // which child belongs to which set. - // - // Search parent A's child set - var didFindChild = false; - var _child = parentA.child; - - while (_child) { - if (_child === a) { - didFindChild = true; - a = parentA; - b = parentB; - break; - } + function dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst) { + var bookKeeping = getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst, eventSystemFlags); + + try { + // Event queue being processed in the same cycle allows + // `preventDefault`. + batchedEventUpdates(handleTopLevel, bookKeeping); + } finally { + releaseTopLevelCallbackBookKeeping(bookKeeping); + } + } + /** + * We listen for bubbled touch events on the document object. + * + * Firefox v8.01 (and possibly others) exhibited strange behavior when + * mounting `onmousemove` events at some node that was not the document + * element. The symptoms were that if your mouse is not moving over something + * contained within that mount point (for example on the background) the + * top-level listeners for `onmousemove` won't be called. However, if you + * register the `mousemove` on the document object, then it will of course + * catch all `mousemove`s. This along with iOS quirks, justifies restricting + * top-level listeners to the document object only, at least for these + * movement types of events and possibly all events. + * + * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html + * + * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but + * they bubble to document. + * + * @param {string} registrationName Name of listener (e.g. `onClick`). + * @param {object} mountAt Container where to mount the listener + */ + + function legacyListenToEvent(registrationName, mountAt) { + var listenerMap = getListenerMapForElement(mountAt); + var dependencies = registrationNameDependencies[registrationName]; - if (_child === b) { - didFindChild = true; - b = parentA; - a = parentB; + for (var i = 0; i < dependencies.length; i++) { + var dependency = dependencies[i]; + legacyListenToTopLevelEvent(dependency, mountAt, listenerMap); + } + } + function legacyListenToTopLevelEvent(topLevelType, mountAt, listenerMap) { + if (!listenerMap.has(topLevelType)) { + switch (topLevelType) { + case TOP_SCROLL: + trapCapturedEvent(TOP_SCROLL, mountAt); break; - } - _child = _child.sibling; - } + case TOP_FOCUS: + case TOP_BLUR: + trapCapturedEvent(TOP_FOCUS, mountAt); + trapCapturedEvent(TOP_BLUR, mountAt); // We set the flag for a single dependency later in this function, + // but this ensures we mark both as attached rather than just one. - if (!didFindChild) { - // Search parent B's child set - _child = parentB.child; + listenerMap.set(TOP_BLUR, null); + listenerMap.set(TOP_FOCUS, null); + break; - while (_child) { - if (_child === a) { - didFindChild = true; - a = parentB; - b = parentA; - break; + case TOP_CANCEL: + case TOP_CLOSE: + if (isEventSupported(getRawEventName(topLevelType))) { + trapCapturedEvent(topLevelType, mountAt); } - if (_child === b) { - didFindChild = true; - b = parentB; - a = parentA; - break; - } + break; - _child = _child.sibling; - } + case TOP_INVALID: + case TOP_SUBMIT: + case TOP_RESET: + // We listen to them on the target DOM elements. + // Some of them bubble so we don't want them to fire twice. + break; - if (!didFindChild) { - { - throw Error("Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue."); + default: + // By default, listen on the top level to all non-media events. + // Media events don't bubble so adding the listener wouldn't do anything. + var isMediaEvent = mediaEventTypes.indexOf(topLevelType) !== -1; + + if (!isMediaEvent) { + trapBubbledEvent(topLevelType, mountAt); } - } - } - } - if (!(a.alternate === b)) { - { - throw Error("Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue."); + break; } + + listenerMap.set(topLevelType, null); } - } // If the root is not a host container, we're in a disconnected tree. I.e. - // unmounted. + } + function isListeningToAllDependencies(registrationName, mountAt) { + var listenerMap = getListenerMapForElement(mountAt); + var dependencies = registrationNameDependencies[registrationName]; + for (var i = 0; i < dependencies.length; i++) { + var dependency = dependencies[i]; - if (!(a.tag === HostRoot)) { - { - throw Error("Unable to find node on an unmounted component."); + if (!listenerMap.has(dependency)) { + return false; + } } - } - if (a.stateNode.current === a) { - // We've determined that A is the current branch. - return fiber; - } // Otherwise B has to be current branch. + return true; + } + var attemptUserBlockingHydration; + function setAttemptUserBlockingHydration(fn) { + attemptUserBlockingHydration = fn; + } + var attemptContinuousHydration; + function setAttemptContinuousHydration(fn) { + attemptContinuousHydration = fn; + } + var attemptHydrationAtCurrentPriority; + function setAttemptHydrationAtCurrentPriority(fn) { + attemptHydrationAtCurrentPriority = fn; + } // TODO: Upgrade this definition once we're on a newer version of Flow that + var hasScheduledReplayAttempt = false; // The queue of discrete events to be replayed. - return alternate; -} -function findCurrentHostFiber(parent) { - var currentParent = findCurrentFiberUsingSlowPath(parent); + var queuedDiscreteEvents = []; // Indicates if any continuous event targets are non-null for early bailout. + // if the last target was dehydrated. - if (!currentParent) { - return null; - } // Next we'll drill down this component to find the first HostComponent/Text. + var queuedFocus = null; + var queuedDrag = null; + var queuedMouse = null; // For pointer events there can be one latest event per pointerId. + var queuedPointers = new Map(); + var queuedPointerCaptures = new Map(); // We could consider replaying selectionchange and touchmoves too. - var node = currentParent; + var queuedExplicitHydrationTargets = []; + function hasQueuedDiscreteEvents() { + return queuedDiscreteEvents.length > 0; + } + var discreteReplayableEvents = [TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_TOUCH_CANCEL, TOP_TOUCH_END, TOP_TOUCH_START, TOP_AUX_CLICK, TOP_DOUBLE_CLICK, TOP_POINTER_CANCEL, TOP_POINTER_DOWN, TOP_POINTER_UP, TOP_DRAG_END, TOP_DRAG_START, TOP_DROP, TOP_COMPOSITION_END, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_INPUT, TOP_TEXT_INPUT, TOP_CLOSE, TOP_CANCEL, TOP_COPY, TOP_CUT, TOP_PASTE, TOP_CLICK, TOP_CHANGE, TOP_CONTEXT_MENU, TOP_RESET, TOP_SUBMIT]; + var continuousReplayableEvents = [TOP_FOCUS, TOP_BLUR, TOP_DRAG_ENTER, TOP_DRAG_LEAVE, TOP_MOUSE_OVER, TOP_MOUSE_OUT, TOP_POINTER_OVER, TOP_POINTER_OUT, TOP_GOT_POINTER_CAPTURE, TOP_LOST_POINTER_CAPTURE]; + function isReplayableDiscreteEvent(eventType) { + return discreteReplayableEvents.indexOf(eventType) > -1; + } - while (true) { - if (node.tag === HostComponent || node.tag === HostText) { - return node; - } else if (node.child) { - node.child.return = node; - node = node.child; - continue; - } + function trapReplayableEventForDocument(topLevelType, document, listenerMap) { + legacyListenToTopLevelEvent(topLevelType, document, listenerMap); + } - if (node === currentParent) { - return null; - } + function eagerlyTrapReplayableEvents(container, document) { + var listenerMapForDoc = getListenerMapForElement(document); // Discrete - while (!node.sibling) { - if (!node.return || node.return === currentParent) { - return null; - } + discreteReplayableEvents.forEach(function (topLevelType) { + trapReplayableEventForDocument(topLevelType, document, listenerMapForDoc); + }); // Continuous - node = node.return; - } + continuousReplayableEvents.forEach(function (topLevelType) { + trapReplayableEventForDocument(topLevelType, document, listenerMapForDoc); + }); + } - node.sibling.return = node.return; - node = node.sibling; - } // Flow needs the return null here, but ESLint complains about it. - // eslint-disable-next-line no-unreachable + function createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) { + return { + blockedOn: blockedOn, + topLevelType: topLevelType, + eventSystemFlags: eventSystemFlags | IS_REPLAYED, + nativeEvent: nativeEvent, + container: container + }; + } + function queueDiscreteEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) { + var queuedEvent = createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent); + queuedDiscreteEvents.push(queuedEvent); + } // Resets the replaying for this type of continuous event to no event. - return null; -} -function findCurrentHostFiberWithNoPortals(parent) { - var currentParent = findCurrentFiberUsingSlowPath(parent); + function clearIfContinuousEvent(topLevelType, nativeEvent) { + switch (topLevelType) { + case TOP_FOCUS: + case TOP_BLUR: + queuedFocus = null; + break; - if (!currentParent) { - return null; - } // Next we'll drill down this component to find the first HostComponent/Text. + case TOP_DRAG_ENTER: + case TOP_DRAG_LEAVE: + queuedDrag = null; + break; + case TOP_MOUSE_OVER: + case TOP_MOUSE_OUT: + queuedMouse = null; + break; - var node = currentParent; + case TOP_POINTER_OVER: + case TOP_POINTER_OUT: + { + var pointerId = nativeEvent.pointerId; + queuedPointers.delete(pointerId); + break; + } - while (true) { - if (node.tag === HostComponent || node.tag === HostText || enableFundamentalAPI && node.tag === FundamentalComponent) { - return node; - } else if (node.child && node.tag !== HostPortal) { - node.child.return = node; - node = node.child; - continue; + case TOP_GOT_POINTER_CAPTURE: + case TOP_LOST_POINTER_CAPTURE: + { + var _pointerId = nativeEvent.pointerId; + queuedPointerCaptures.delete(_pointerId); + break; + } } + } - if (node === currentParent) { - return null; - } + function accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) { + if (existingQueuedEvent === null || existingQueuedEvent.nativeEvent !== nativeEvent) { + var queuedEvent = createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent); - while (!node.sibling) { - if (!node.return || node.return === currentParent) { - return null; + if (blockedOn !== null) { + var _fiber2 = getInstanceFromNode$1(blockedOn); + + if (_fiber2 !== null) { + // Attempt to increase the priority of this target. + attemptContinuousHydration(_fiber2); + } } - node = node.return; - } + return queuedEvent; + } // If we have already queued this exact event, then it's because + // the different event systems have different DOM event listeners. + // We can accumulate the flags and store a single event to be + // replayed. - node.sibling.return = node.return; - node = node.sibling; - } // Flow needs the return null here, but ESLint complains about it. - // eslint-disable-next-line no-unreachable + existingQueuedEvent.eventSystemFlags |= eventSystemFlags; + return existingQueuedEvent; + } - return null; -} + function queueIfContinuousEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) { + // These set relatedTarget to null because the replayed event will be treated as if we + // moved from outside the window (no target) onto the target once it hydrates. + // Instead of mutating we could clone the event. + switch (topLevelType) { + case TOP_FOCUS: + { + var focusEvent = nativeEvent; + queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(queuedFocus, blockedOn, topLevelType, eventSystemFlags, container, focusEvent); + return true; + } -var attemptSynchronousHydration; -function setAttemptSynchronousHydration(fn) { - attemptSynchronousHydration = fn; -} -var attemptUserBlockingHydration; -function setAttemptUserBlockingHydration(fn) { - attemptUserBlockingHydration = fn; -} -var attemptContinuousHydration; -function setAttemptContinuousHydration(fn) { - attemptContinuousHydration = fn; -} -var attemptHydrationAtCurrentPriority; -function setAttemptHydrationAtCurrentPriority(fn) { - attemptHydrationAtCurrentPriority = fn; -} // TODO: Upgrade this definition once we're on a newer version of Flow that -// has this definition built-in. + case TOP_DRAG_ENTER: + { + var dragEvent = nativeEvent; + queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(queuedDrag, blockedOn, topLevelType, eventSystemFlags, container, dragEvent); + return true; + } -var hasScheduledReplayAttempt = false; // The queue of discrete events to be replayed. + case TOP_MOUSE_OVER: + { + var mouseEvent = nativeEvent; + queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(queuedMouse, blockedOn, topLevelType, eventSystemFlags, container, mouseEvent); + return true; + } -var queuedDiscreteEvents = []; // Indicates if any continuous event targets are non-null for early bailout. + case TOP_POINTER_OVER: + { + var pointerEvent = nativeEvent; + var pointerId = pointerEvent.pointerId; + queuedPointers.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointers.get(pointerId) || null, blockedOn, topLevelType, eventSystemFlags, container, pointerEvent)); + return true; + } -// if the last target was dehydrated. + case TOP_GOT_POINTER_CAPTURE: + { + var _pointerEvent = nativeEvent; + var _pointerId2 = _pointerEvent.pointerId; + queuedPointerCaptures.set(_pointerId2, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointerCaptures.get(_pointerId2) || null, blockedOn, topLevelType, eventSystemFlags, container, _pointerEvent)); + return true; + } + } -var queuedFocus = null; -var queuedDrag = null; -var queuedMouse = null; // For pointer events there can be one latest event per pointerId. + return false; + } // Check if this target is unblocked. Returns true if it's unblocked. -var queuedPointers = new Map(); -var queuedPointerCaptures = new Map(); // We could consider replaying selectionchange and touchmoves too. + function attemptExplicitHydrationTarget(queuedTarget) { + // TODO: This function shares a lot of logic with attemptToDispatchEvent. + // Try to unify them. It's a bit tricky since it would require two return + // values. + var targetInst = getClosestInstanceFromNode(queuedTarget.target); -var queuedExplicitHydrationTargets = []; -function hasQueuedDiscreteEvents() { - return queuedDiscreteEvents.length > 0; -} + if (targetInst !== null) { + var nearestMounted = getNearestMountedFiber(targetInst); -var discreteReplayableEvents = [TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_TOUCH_CANCEL, TOP_TOUCH_END, TOP_TOUCH_START, TOP_AUX_CLICK, TOP_DOUBLE_CLICK, TOP_POINTER_CANCEL, TOP_POINTER_DOWN, TOP_POINTER_UP, TOP_DRAG_END, TOP_DRAG_START, TOP_DROP, TOP_COMPOSITION_END, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_INPUT, TOP_TEXT_INPUT, TOP_CLOSE, TOP_CANCEL, TOP_COPY, TOP_CUT, TOP_PASTE, TOP_CLICK, TOP_CHANGE, TOP_CONTEXT_MENU, TOP_RESET, TOP_SUBMIT]; -var continuousReplayableEvents = [TOP_FOCUS, TOP_BLUR, TOP_DRAG_ENTER, TOP_DRAG_LEAVE, TOP_MOUSE_OVER, TOP_MOUSE_OUT, TOP_POINTER_OVER, TOP_POINTER_OUT, TOP_GOT_POINTER_CAPTURE, TOP_LOST_POINTER_CAPTURE]; -function isReplayableDiscreteEvent(eventType) { - return discreteReplayableEvents.indexOf(eventType) > -1; -} + if (nearestMounted !== null) { + var tag = nearestMounted.tag; -function trapReplayableEvent(topLevelType, document, listeningSet) { - listenToTopLevel(topLevelType, document, listeningSet); + if (tag === SuspenseComponent) { + var instance = getSuspenseInstanceFromFiber(nearestMounted); - if (enableFlareAPI) { - // Trap events for the responder system. - var passiveEventKey = unsafeCastDOMTopLevelTypeToString(topLevelType) + '_passive'; + if (instance !== null) { + // We're blocked on hydrating this boundary. + // Increase its priority. + queuedTarget.blockedOn = instance; + unstable_runWithPriority(queuedTarget.priority, function () { + attemptHydrationAtCurrentPriority(nearestMounted); + }); + return; + } + } else if (tag === HostRoot) { + var root = nearestMounted.stateNode; - if (!listeningSet.has(passiveEventKey)) { - trapEventForResponderEventSystem(document, topLevelType, true); - listeningSet.add(passiveEventKey); - } // TODO: This listens to all events as active which might have - // undesirable effects. It's also unnecessary to have both - // passive and active listeners. Instead, we could start with - // a passive and upgrade it to an active one if needed. - // For replaying purposes the active is never needed since we - // currently don't preventDefault. + if (root.hydrate) { + queuedTarget.blockedOn = getContainerFromFiber(nearestMounted); // We don't currently have a way to increase the priority of + // a root other than sync. + return; + } + } + } + } - var activeEventKey = unsafeCastDOMTopLevelTypeToString(topLevelType) + '_active'; + queuedTarget.blockedOn = null; + } - if (!listeningSet.has(activeEventKey)) { - trapEventForResponderEventSystem(document, topLevelType, false); - listeningSet.add(activeEventKey); + function attemptReplayContinuousQueuedEvent(queuedEvent) { + if (queuedEvent.blockedOn !== null) { + return false; } - } -} -function eagerlyTrapReplayableEvents(document) { - var listeningSet = getListeningSetForElement(document); // Discrete + var nextBlockedOn = attemptToDispatchEvent(queuedEvent.topLevelType, queuedEvent.eventSystemFlags, queuedEvent.container, queuedEvent.nativeEvent); - discreteReplayableEvents.forEach(function (topLevelType) { - trapReplayableEvent(topLevelType, document, listeningSet); - }); // Continuous + if (nextBlockedOn !== null) { + // We're still blocked. Try again later. + var _fiber3 = getInstanceFromNode$1(nextBlockedOn); - continuousReplayableEvents.forEach(function (topLevelType) { - trapReplayableEvent(topLevelType, document, listeningSet); - }); -} - -function createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, nativeEvent) { - return { - blockedOn: blockedOn, - topLevelType: topLevelType, - eventSystemFlags: eventSystemFlags | IS_REPLAYED, - nativeEvent: nativeEvent - }; -} + if (_fiber3 !== null) { + attemptContinuousHydration(_fiber3); + } + + queuedEvent.blockedOn = nextBlockedOn; + return false; + } -function queueDiscreteEvent(blockedOn, topLevelType, eventSystemFlags, nativeEvent) { - var queuedEvent = createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, nativeEvent); - queuedDiscreteEvents.push(queuedEvent); + return true; + } - if (enableSelectiveHydration) { - if (queuedDiscreteEvents.length === 1) { - // If this was the first discrete event, we might be able to - // synchronously unblock it so that preventDefault still works. - while (queuedEvent.blockedOn !== null) { - var _fiber = getInstanceFromNode$1(queuedEvent.blockedOn); + function attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) { + if (attemptReplayContinuousQueuedEvent(queuedEvent)) { + map.delete(key); + } + } - if (_fiber === null) { - break; - } + function replayUnblockedEvents() { + hasScheduledReplayAttempt = false; // First replay discrete events. - attemptSynchronousHydration(_fiber); + while (queuedDiscreteEvents.length > 0) { + var nextDiscreteEvent = queuedDiscreteEvents[0]; - if (queuedEvent.blockedOn === null) { - // We got unblocked by hydration. Let's try again. - replayUnblockedEvents(); // If we're reblocked, on an inner boundary, we might need - // to attempt hydrating that one. + if (nextDiscreteEvent.blockedOn !== null) { + // We're still blocked. + // Increase the priority of this boundary to unblock + // the next discrete event. + var _fiber4 = getInstanceFromNode$1(nextDiscreteEvent.blockedOn); - continue; - } else { - // We're still blocked from hydation, we have to give up - // and replay later. - break; + if (_fiber4 !== null) { + attemptUserBlockingHydration(_fiber4); } - } - } - } -} // Resets the replaying for this type of continuous event to no event. -function clearIfContinuousEvent(topLevelType, nativeEvent) { - switch (topLevelType) { - case TOP_FOCUS: - case TOP_BLUR: - queuedFocus = null; - break; + break; + } - case TOP_DRAG_ENTER: - case TOP_DRAG_LEAVE: - queuedDrag = null; - break; + var nextBlockedOn = attemptToDispatchEvent(nextDiscreteEvent.topLevelType, nextDiscreteEvent.eventSystemFlags, nextDiscreteEvent.container, nextDiscreteEvent.nativeEvent); - case TOP_MOUSE_OVER: - case TOP_MOUSE_OUT: - queuedMouse = null; - break; - - case TOP_POINTER_OVER: - case TOP_POINTER_OUT: - { - var pointerId = nativeEvent.pointerId; - queuedPointers.delete(pointerId); - break; + if (nextBlockedOn !== null) { + // We're still blocked. Try again later. + nextDiscreteEvent.blockedOn = nextBlockedOn; + } else { + // We've successfully replayed the first event. Let's try the next one. + queuedDiscreteEvents.shift(); } + } // Next replay any continuous events. - case TOP_GOT_POINTER_CAPTURE: - case TOP_LOST_POINTER_CAPTURE: - { - var _pointerId = nativeEvent.pointerId; - queuedPointerCaptures.delete(_pointerId); - break; - } - } -} -function accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, topLevelType, eventSystemFlags, nativeEvent) { - if (existingQueuedEvent === null || existingQueuedEvent.nativeEvent !== nativeEvent) { - var queuedEvent = createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, nativeEvent); + if (queuedFocus !== null && attemptReplayContinuousQueuedEvent(queuedFocus)) { + queuedFocus = null; + } - if (blockedOn !== null) { - var _fiber2 = getInstanceFromNode$1(blockedOn); + if (queuedDrag !== null && attemptReplayContinuousQueuedEvent(queuedDrag)) { + queuedDrag = null; + } - if (_fiber2 !== null) { - // Attempt to increase the priority of this target. - attemptContinuousHydration(_fiber2); - } + if (queuedMouse !== null && attemptReplayContinuousQueuedEvent(queuedMouse)) { + queuedMouse = null; } - return queuedEvent; - } // If we have already queued this exact event, then it's because - // the different event systems have different DOM event listeners. - // We can accumulate the flags and store a single event to be - // replayed. + queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap); + queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap); + } + function scheduleCallbackIfUnblocked(queuedEvent, unblocked) { + if (queuedEvent.blockedOn === unblocked) { + queuedEvent.blockedOn = null; - existingQueuedEvent.eventSystemFlags |= eventSystemFlags; - return existingQueuedEvent; -} + if (!hasScheduledReplayAttempt) { + hasScheduledReplayAttempt = true; // Schedule a callback to attempt replaying as many events as are + // now unblocked. This first might not actually be unblocked yet. + // We could check it early to avoid scheduling an unnecessary callback. -function queueIfContinuousEvent(blockedOn, topLevelType, eventSystemFlags, nativeEvent) { - // These set relatedTarget to null because the replayed event will be treated as if we - // moved from outside the window (no target) onto the target once it hydrates. - // Instead of mutating we could clone the event. - switch (topLevelType) { - case TOP_FOCUS: - { - var focusEvent = nativeEvent; - queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(queuedFocus, blockedOn, topLevelType, eventSystemFlags, focusEvent); - return true; + unstable_scheduleCallback(unstable_NormalPriority, replayUnblockedEvents); } + } + } - case TOP_DRAG_ENTER: - { - var dragEvent = nativeEvent; - queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(queuedDrag, blockedOn, topLevelType, eventSystemFlags, dragEvent); - return true; - } + function retryIfBlockedOn(unblocked) { + // Mark anything that was blocked on this as no longer blocked + // and eligible for a replay. + if (queuedDiscreteEvents.length > 0) { + scheduleCallbackIfUnblocked(queuedDiscreteEvents[0], unblocked); // This is a exponential search for each boundary that commits. I think it's + // worth it because we expect very few discrete events to queue up and once + // we are actually fully unblocked it will be fast to replay them. - case TOP_MOUSE_OVER: - { - var mouseEvent = nativeEvent; - queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(queuedMouse, blockedOn, topLevelType, eventSystemFlags, mouseEvent); - return true; - } + for (var i = 1; i < queuedDiscreteEvents.length; i++) { + var queuedEvent = queuedDiscreteEvents[i]; - case TOP_POINTER_OVER: - { - var pointerEvent = nativeEvent; - var pointerId = pointerEvent.pointerId; - queuedPointers.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointers.get(pointerId) || null, blockedOn, topLevelType, eventSystemFlags, pointerEvent)); - return true; + if (queuedEvent.blockedOn === unblocked) { + queuedEvent.blockedOn = null; + } } + } - case TOP_GOT_POINTER_CAPTURE: - { - var _pointerEvent = nativeEvent; - var _pointerId2 = _pointerEvent.pointerId; - queuedPointerCaptures.set(_pointerId2, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointerCaptures.get(_pointerId2) || null, blockedOn, topLevelType, eventSystemFlags, _pointerEvent)); - return true; - } - } + if (queuedFocus !== null) { + scheduleCallbackIfUnblocked(queuedFocus, unblocked); + } - return false; -} // Check if this target is unblocked. Returns true if it's unblocked. + if (queuedDrag !== null) { + scheduleCallbackIfUnblocked(queuedDrag, unblocked); + } -function attemptExplicitHydrationTarget(queuedTarget) { - // TODO: This function shares a lot of logic with attemptToDispatchEvent. - // Try to unify them. It's a bit tricky since it would require two return - // values. - var targetInst = getClosestInstanceFromNode(queuedTarget.target); + if (queuedMouse !== null) { + scheduleCallbackIfUnblocked(queuedMouse, unblocked); + } - if (targetInst !== null) { - var nearestMounted = getNearestMountedFiber(targetInst); + var unblock = function (queuedEvent) { + return scheduleCallbackIfUnblocked(queuedEvent, unblocked); + }; - if (nearestMounted !== null) { - var tag = nearestMounted.tag; + queuedPointers.forEach(unblock); + queuedPointerCaptures.forEach(unblock); - if (tag === SuspenseComponent) { - var instance = getSuspenseInstanceFromFiber(nearestMounted); + for (var _i = 0; _i < queuedExplicitHydrationTargets.length; _i++) { + var queuedTarget = queuedExplicitHydrationTargets[_i]; - if (instance !== null) { - // We're blocked on hydrating this boundary. - // Increase its priority. - queuedTarget.blockedOn = instance; - unstable_runWithPriority(queuedTarget.priority, function () { - attemptHydrationAtCurrentPriority(nearestMounted); - }); - return; - } - } else if (tag === HostRoot) { - var root = nearestMounted.stateNode; + if (queuedTarget.blockedOn === unblocked) { + queuedTarget.blockedOn = null; + } + } - if (root.hydrate) { - queuedTarget.blockedOn = getContainerFromFiber(nearestMounted); // We don't currently have a way to increase the priority of - // a root other than sync. + while (queuedExplicitHydrationTargets.length > 0) { + var nextExplicitTarget = queuedExplicitHydrationTargets[0]; - return; + if (nextExplicitTarget.blockedOn !== null) { + // We're still blocked. + break; + } else { + attemptExplicitHydrationTarget(nextExplicitTarget); + + if (nextExplicitTarget.blockedOn === null) { + // We're unblocked. + queuedExplicitHydrationTargets.shift(); } } } } - queuedTarget.blockedOn = null; -} + function addEventBubbleListener(element, eventType, listener) { + element.addEventListener(eventType, listener, false); + } + function addEventCaptureListener(element, eventType, listener) { + element.addEventListener(eventType, listener, true); + } + + // do it in two places, which duplicates logic + // and increases the bundle size, we do it all + // here once. If we remove or refactor the + // SimpleEventPlugin, we should also remove or + // update the below line. -function queueExplicitHydrationTarget(target) { - if (enableSelectiveHydration) { - var priority = unstable_getCurrentPriorityLevel(); - var queuedTarget = { - blockedOn: null, - target: target, - priority: priority - }; - var i = 0; + var simpleEventPluginEventTypes = {}; + var topLevelEventsToDispatchConfig = new Map(); + var eventPriorities = new Map(); // We store most of the events in this module in pairs of two strings so we can re-use + // the code required to apply the same logic for event prioritization and that of the + // SimpleEventPlugin. This complicates things slightly, but the aim is to reduce code + // duplication (for which there would be quite a bit). For the events that are not needed + // for the SimpleEventPlugin (otherDiscreteEvents) we process them separately as an + // array of top level events. + // Lastly, we ignore prettier so we can keep the formatting sane. + // prettier-ignore - for (; i < queuedExplicitHydrationTargets.length; i++) { - if (priority <= queuedExplicitHydrationTargets[i].priority) { - break; - } - } + var discreteEventPairsForSimpleEventPlugin = [TOP_BLUR, 'blur', TOP_CANCEL, 'cancel', TOP_CLICK, 'click', TOP_CLOSE, 'close', TOP_CONTEXT_MENU, 'contextMenu', TOP_COPY, 'copy', TOP_CUT, 'cut', TOP_AUX_CLICK, 'auxClick', TOP_DOUBLE_CLICK, 'doubleClick', TOP_DRAG_END, 'dragEnd', TOP_DRAG_START, 'dragStart', TOP_DROP, 'drop', TOP_FOCUS, 'focus', TOP_INPUT, 'input', TOP_INVALID, 'invalid', TOP_KEY_DOWN, 'keyDown', TOP_KEY_PRESS, 'keyPress', TOP_KEY_UP, 'keyUp', TOP_MOUSE_DOWN, 'mouseDown', TOP_MOUSE_UP, 'mouseUp', TOP_PASTE, 'paste', TOP_PAUSE, 'pause', TOP_PLAY, 'play', TOP_POINTER_CANCEL, 'pointerCancel', TOP_POINTER_DOWN, 'pointerDown', TOP_POINTER_UP, 'pointerUp', TOP_RATE_CHANGE, 'rateChange', TOP_RESET, 'reset', TOP_SEEKED, 'seeked', TOP_SUBMIT, 'submit', TOP_TOUCH_CANCEL, 'touchCancel', TOP_TOUCH_END, 'touchEnd', TOP_TOUCH_START, 'touchStart', TOP_VOLUME_CHANGE, 'volumeChange']; + var otherDiscreteEvents = [TOP_CHANGE, TOP_SELECTION_CHANGE, TOP_TEXT_INPUT, TOP_COMPOSITION_START, TOP_COMPOSITION_END, TOP_COMPOSITION_UPDATE]; // prettier-ignore - queuedExplicitHydrationTargets.splice(i, 0, queuedTarget); + var userBlockingPairsForSimpleEventPlugin = [TOP_DRAG, 'drag', TOP_DRAG_ENTER, 'dragEnter', TOP_DRAG_EXIT, 'dragExit', TOP_DRAG_LEAVE, 'dragLeave', TOP_DRAG_OVER, 'dragOver', TOP_MOUSE_MOVE, 'mouseMove', TOP_MOUSE_OUT, 'mouseOut', TOP_MOUSE_OVER, 'mouseOver', TOP_POINTER_MOVE, 'pointerMove', TOP_POINTER_OUT, 'pointerOut', TOP_POINTER_OVER, 'pointerOver', TOP_SCROLL, 'scroll', TOP_TOGGLE, 'toggle', TOP_TOUCH_MOVE, 'touchMove', TOP_WHEEL, 'wheel']; // prettier-ignore + + var continuousPairsForSimpleEventPlugin = [TOP_ABORT, 'abort', TOP_ANIMATION_END, 'animationEnd', TOP_ANIMATION_ITERATION, 'animationIteration', TOP_ANIMATION_START, 'animationStart', TOP_CAN_PLAY, 'canPlay', TOP_CAN_PLAY_THROUGH, 'canPlayThrough', TOP_DURATION_CHANGE, 'durationChange', TOP_EMPTIED, 'emptied', TOP_ENCRYPTED, 'encrypted', TOP_ENDED, 'ended', TOP_ERROR, 'error', TOP_GOT_POINTER_CAPTURE, 'gotPointerCapture', TOP_LOAD, 'load', TOP_LOADED_DATA, 'loadedData', TOP_LOADED_METADATA, 'loadedMetadata', TOP_LOAD_START, 'loadStart', TOP_LOST_POINTER_CAPTURE, 'lostPointerCapture', TOP_PLAYING, 'playing', TOP_PROGRESS, 'progress', TOP_SEEKING, 'seeking', TOP_STALLED, 'stalled', TOP_SUSPEND, 'suspend', TOP_TIME_UPDATE, 'timeUpdate', TOP_TRANSITION_END, 'transitionEnd', TOP_WAITING, 'waiting']; + /** + * Turns + * ['abort', ...] + * into + * eventTypes = { + * 'abort': { + * phasedRegistrationNames: { + * bubbled: 'onAbort', + * captured: 'onAbortCapture', + * }, + * dependencies: [TOP_ABORT], + * }, + * ... + * }; + * topLevelEventsToDispatchConfig = new Map([ + * [TOP_ABORT, { sameConfig }], + * ]); + */ - if (i === 0) { - attemptExplicitHydrationTarget(queuedTarget); + function processSimpleEventPluginPairsByPriority(eventTypes, priority) { + // As the event types are in pairs of two, we need to iterate + // through in twos. The events are in pairs of two to save code + // and improve init perf of processing this array, as it will + // result in far fewer object allocations and property accesses + // if we only use three arrays to process all the categories of + // instead of tuples. + for (var i = 0; i < eventTypes.length; i += 2) { + var topEvent = eventTypes[i]; + var event = eventTypes[i + 1]; + var capitalizedEvent = event[0].toUpperCase() + event.slice(1); + var onEvent = 'on' + capitalizedEvent; + var config = { + phasedRegistrationNames: { + bubbled: onEvent, + captured: onEvent + 'Capture' + }, + dependencies: [topEvent], + eventPriority: priority + }; + eventPriorities.set(topEvent, priority); + topLevelEventsToDispatchConfig.set(topEvent, config); + simpleEventPluginEventTypes[event] = config; } } -} -function attemptReplayContinuousQueuedEvent(queuedEvent) { - if (queuedEvent.blockedOn !== null) { - return false; - } + function processTopEventPairsByPriority(eventTypes, priority) { + for (var i = 0; i < eventTypes.length; i++) { + eventPriorities.set(eventTypes[i], priority); + } + } // SimpleEventPlugin - var nextBlockedOn = attemptToDispatchEvent(queuedEvent.topLevelType, queuedEvent.eventSystemFlags, queuedEvent.nativeEvent); - if (nextBlockedOn !== null) { - // We're still blocked. Try again later. - var _fiber3 = getInstanceFromNode$1(nextBlockedOn); + processSimpleEventPluginPairsByPriority(discreteEventPairsForSimpleEventPlugin, DiscreteEvent); + processSimpleEventPluginPairsByPriority(userBlockingPairsForSimpleEventPlugin, UserBlockingEvent); + processSimpleEventPluginPairsByPriority(continuousPairsForSimpleEventPlugin, ContinuousEvent); // Not used by SimpleEventPlugin - if (_fiber3 !== null) { - attemptContinuousHydration(_fiber3); - } + processTopEventPairsByPriority(otherDiscreteEvents, DiscreteEvent); + function getEventPriorityForPluginSystem(topLevelType) { + var priority = eventPriorities.get(topLevelType); // Default to a ContinuousEvent. Note: we might + // want to warn if we can't detect the priority + // for the event. - queuedEvent.blockedOn = nextBlockedOn; - return false; + return priority === undefined ? ContinuousEvent : priority; } - return true; -} + // Intentionally not named imports because Rollup would use dynamic dispatch for + var UserBlockingPriority = unstable_UserBlockingPriority, + runWithPriority = unstable_runWithPriority; // TODO: can we stop exporting these? -function attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) { - if (attemptReplayContinuousQueuedEvent(queuedEvent)) { - map.delete(key); + var _enabled = true; + function setEnabled(enabled) { + _enabled = !!enabled; + } + function isEnabled() { + return _enabled; + } + function trapBubbledEvent(topLevelType, element) { + trapEventForPluginEventSystem(element, topLevelType, false); + } + function trapCapturedEvent(topLevelType, element) { + trapEventForPluginEventSystem(element, topLevelType, true); } -} - -function replayUnblockedEvents() { - hasScheduledReplayAttempt = false; // First replay discrete events. - while (queuedDiscreteEvents.length > 0) { - var nextDiscreteEvent = queuedDiscreteEvents[0]; + function trapEventForPluginEventSystem(container, topLevelType, capture) { + var listener; - if (nextDiscreteEvent.blockedOn !== null) { - // We're still blocked. - // Increase the priority of this boundary to unblock - // the next discrete event. - var _fiber4 = getInstanceFromNode$1(nextDiscreteEvent.blockedOn); + switch (getEventPriorityForPluginSystem(topLevelType)) { + case DiscreteEvent: + listener = dispatchDiscreteEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container); + break; - if (_fiber4 !== null) { - attemptUserBlockingHydration(_fiber4); - } + case UserBlockingEvent: + listener = dispatchUserBlockingUpdate.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container); + break; - break; + case ContinuousEvent: + default: + listener = dispatchEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container); + break; } - var nextBlockedOn = attemptToDispatchEvent(nextDiscreteEvent.topLevelType, nextDiscreteEvent.eventSystemFlags, nextDiscreteEvent.nativeEvent); + var rawEventName = getRawEventName(topLevelType); - if (nextBlockedOn !== null) { - // We're still blocked. Try again later. - nextDiscreteEvent.blockedOn = nextBlockedOn; + if (capture) { + addEventCaptureListener(container, rawEventName, listener); } else { - // We've successfully replayed the first event. Let's try the next one. - queuedDiscreteEvents.shift(); + addEventBubbleListener(container, rawEventName, listener); } - } // Next replay any continuous events. - - - if (queuedFocus !== null && attemptReplayContinuousQueuedEvent(queuedFocus)) { - queuedFocus = null; } - if (queuedDrag !== null && attemptReplayContinuousQueuedEvent(queuedDrag)) { - queuedDrag = null; + function dispatchDiscreteEvent(topLevelType, eventSystemFlags, container, nativeEvent) { + flushDiscreteUpdatesIfNeeded(nativeEvent.timeStamp); + discreteUpdates(dispatchEvent, topLevelType, eventSystemFlags, container, nativeEvent); } - if (queuedMouse !== null && attemptReplayContinuousQueuedEvent(queuedMouse)) { - queuedMouse = null; + function dispatchUserBlockingUpdate(topLevelType, eventSystemFlags, container, nativeEvent) { + runWithPriority(UserBlockingPriority, dispatchEvent.bind(null, topLevelType, eventSystemFlags, container, nativeEvent)); } - queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap); - queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap); -} + function dispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent) { + if (!_enabled) { + return; + } -function scheduleCallbackIfUnblocked(queuedEvent, unblocked) { - if (queuedEvent.blockedOn === unblocked) { - queuedEvent.blockedOn = null; + if (hasQueuedDiscreteEvents() && isReplayableDiscreteEvent(topLevelType)) { + // If we already have a queue of discrete events, and this is another discrete + // event, then we can't dispatch it regardless of its target, since they + // need to dispatch in order. + queueDiscreteEvent(null, // Flags that we're not actually blocked on anything as far as we know. + topLevelType, eventSystemFlags, container, nativeEvent); + return; + } - if (!hasScheduledReplayAttempt) { - hasScheduledReplayAttempt = true; // Schedule a callback to attempt replaying as many events as are - // now unblocked. This first might not actually be unblocked yet. - // We could check it early to avoid scheduling an unnecessary callback. + var blockedOn = attemptToDispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent); - unstable_scheduleCallback(unstable_NormalPriority, replayUnblockedEvents); + if (blockedOn === null) { + // We successfully dispatched this event. + clearIfContinuousEvent(topLevelType, nativeEvent); + return; } - } -} -function retryIfBlockedOn(unblocked) { - // Mark anything that was blocked on this as no longer blocked - // and eligible for a replay. - if (queuedDiscreteEvents.length > 0) { - scheduleCallbackIfUnblocked(queuedDiscreteEvents[0], unblocked); // This is a exponential search for each boundary that commits. I think it's - // worth it because we expect very few discrete events to queue up and once - // we are actually fully unblocked it will be fast to replay them. + if (isReplayableDiscreteEvent(topLevelType)) { + // This this to be replayed later once the target is available. + queueDiscreteEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent); + return; + } + + if (queueIfContinuousEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent)) { + return; + } // We need to clear only if we didn't queue because + // queueing is accummulative. + - for (var i = 1; i < queuedDiscreteEvents.length; i++) { - var queuedEvent = queuedDiscreteEvents[i]; + clearIfContinuousEvent(topLevelType, nativeEvent); // This is not replayable so we'll invoke it but without a target, + // in case the event system needs to trace it. - if (queuedEvent.blockedOn === unblocked) { - queuedEvent.blockedOn = null; - } + { + dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, null); } - } + } // Attempt dispatching an event. Returns a SuspenseInstance or Container if it's blocked. - if (queuedFocus !== null) { - scheduleCallbackIfUnblocked(queuedFocus, unblocked); - } + function attemptToDispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent) { + // TODO: Warn if _enabled is false. + var nativeEventTarget = getEventTarget(nativeEvent); + var targetInst = getClosestInstanceFromNode(nativeEventTarget); - if (queuedDrag !== null) { - scheduleCallbackIfUnblocked(queuedDrag, unblocked); - } + if (targetInst !== null) { + var nearestMounted = getNearestMountedFiber(targetInst); - if (queuedMouse !== null) { - scheduleCallbackIfUnblocked(queuedMouse, unblocked); - } + if (nearestMounted === null) { + // This tree has been unmounted already. Dispatch without a target. + targetInst = null; + } else { + var tag = nearestMounted.tag; + + if (tag === SuspenseComponent) { + var instance = getSuspenseInstanceFromFiber(nearestMounted); + + if (instance !== null) { + // Queue the event to be replayed later. Abort dispatching since we + // don't want this event dispatched twice through the event system. + // TODO: If this is the first discrete event in the queue. Schedule an increased + // priority for this boundary. + return instance; + } // This shouldn't happen, something went wrong but to avoid blocking + // the whole system, dispatch the event without a target. + // TODO: Warn. + + + targetInst = null; + } else if (tag === HostRoot) { + var root = nearestMounted.stateNode; + + if (root.hydrate) { + // If this happens during a replay something went wrong and it might block + // the whole system. + return getContainerFromFiber(nearestMounted); + } - var unblock = function (queuedEvent) { - return scheduleCallbackIfUnblocked(queuedEvent, unblocked); - }; + targetInst = null; + } else if (nearestMounted !== targetInst) { + // If we get an event (ex: img onload) before committing that + // component's mount, ignore it for now (that is, treat it as if it was an + // event on a non-React tree). We might also consider queueing events and + // dispatching them after the mount. + targetInst = null; + } + } + } - queuedPointers.forEach(unblock); - queuedPointerCaptures.forEach(unblock); + { + dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst); + } // We're not blocked on anything. - for (var _i = 0; _i < queuedExplicitHydrationTargets.length; _i++) { - var queuedTarget = queuedExplicitHydrationTargets[_i]; - if (queuedTarget.blockedOn === unblocked) { - queuedTarget.blockedOn = null; - } + return null; } - while (queuedExplicitHydrationTargets.length > 0) { - var nextExplicitTarget = queuedExplicitHydrationTargets[0]; + // List derived from Gecko source code: + // https://github.com/mozilla/gecko-dev/blob/4e638efc71/layout/style/test/property_database.js + var shorthandToLonghand = { + animation: ['animationDelay', 'animationDirection', 'animationDuration', 'animationFillMode', 'animationIterationCount', 'animationName', 'animationPlayState', 'animationTimingFunction'], + background: ['backgroundAttachment', 'backgroundClip', 'backgroundColor', 'backgroundImage', 'backgroundOrigin', 'backgroundPositionX', 'backgroundPositionY', 'backgroundRepeat', 'backgroundSize'], + backgroundPosition: ['backgroundPositionX', 'backgroundPositionY'], + border: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth', 'borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth', 'borderLeftColor', 'borderLeftStyle', 'borderLeftWidth', 'borderRightColor', 'borderRightStyle', 'borderRightWidth', 'borderTopColor', 'borderTopStyle', 'borderTopWidth'], + borderBlockEnd: ['borderBlockEndColor', 'borderBlockEndStyle', 'borderBlockEndWidth'], + borderBlockStart: ['borderBlockStartColor', 'borderBlockStartStyle', 'borderBlockStartWidth'], + borderBottom: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth'], + borderColor: ['borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor'], + borderImage: ['borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth'], + borderInlineEnd: ['borderInlineEndColor', 'borderInlineEndStyle', 'borderInlineEndWidth'], + borderInlineStart: ['borderInlineStartColor', 'borderInlineStartStyle', 'borderInlineStartWidth'], + borderLeft: ['borderLeftColor', 'borderLeftStyle', 'borderLeftWidth'], + borderRadius: ['borderBottomLeftRadius', 'borderBottomRightRadius', 'borderTopLeftRadius', 'borderTopRightRadius'], + borderRight: ['borderRightColor', 'borderRightStyle', 'borderRightWidth'], + borderStyle: ['borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle'], + borderTop: ['borderTopColor', 'borderTopStyle', 'borderTopWidth'], + borderWidth: ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth'], + columnRule: ['columnRuleColor', 'columnRuleStyle', 'columnRuleWidth'], + columns: ['columnCount', 'columnWidth'], + flex: ['flexBasis', 'flexGrow', 'flexShrink'], + flexFlow: ['flexDirection', 'flexWrap'], + font: ['fontFamily', 'fontFeatureSettings', 'fontKerning', 'fontLanguageOverride', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition', 'fontWeight', 'lineHeight'], + fontVariant: ['fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition'], + gap: ['columnGap', 'rowGap'], + grid: ['gridAutoColumns', 'gridAutoFlow', 'gridAutoRows', 'gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'], + gridArea: ['gridColumnEnd', 'gridColumnStart', 'gridRowEnd', 'gridRowStart'], + gridColumn: ['gridColumnEnd', 'gridColumnStart'], + gridColumnGap: ['columnGap'], + gridGap: ['columnGap', 'rowGap'], + gridRow: ['gridRowEnd', 'gridRowStart'], + gridRowGap: ['rowGap'], + gridTemplate: ['gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'], + listStyle: ['listStyleImage', 'listStylePosition', 'listStyleType'], + margin: ['marginBottom', 'marginLeft', 'marginRight', 'marginTop'], + marker: ['markerEnd', 'markerMid', 'markerStart'], + mask: ['maskClip', 'maskComposite', 'maskImage', 'maskMode', 'maskOrigin', 'maskPositionX', 'maskPositionY', 'maskRepeat', 'maskSize'], + maskPosition: ['maskPositionX', 'maskPositionY'], + outline: ['outlineColor', 'outlineStyle', 'outlineWidth'], + overflow: ['overflowX', 'overflowY'], + padding: ['paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop'], + placeContent: ['alignContent', 'justifyContent'], + placeItems: ['alignItems', 'justifyItems'], + placeSelf: ['alignSelf', 'justifySelf'], + textDecoration: ['textDecorationColor', 'textDecorationLine', 'textDecorationStyle'], + textEmphasis: ['textEmphasisColor', 'textEmphasisStyle'], + transition: ['transitionDelay', 'transitionDuration', 'transitionProperty', 'transitionTimingFunction'], + wordWrap: ['overflowWrap'] + }; - if (nextExplicitTarget.blockedOn !== null) { - // We're still blocked. - break; - } else { - attemptExplicitHydrationTarget(nextExplicitTarget); + /** + * CSS properties which accept numbers but are not in units of "px". + */ + var isUnitlessNumber = { + animationIterationCount: true, + borderImageOutset: true, + borderImageSlice: true, + borderImageWidth: true, + boxFlex: true, + boxFlexGroup: true, + boxOrdinalGroup: true, + columnCount: true, + columns: true, + flex: true, + flexGrow: true, + flexPositive: true, + flexShrink: true, + flexNegative: true, + flexOrder: true, + gridArea: true, + gridRow: true, + gridRowEnd: true, + gridRowSpan: true, + gridRowStart: true, + gridColumn: true, + gridColumnEnd: true, + gridColumnSpan: true, + gridColumnStart: true, + fontWeight: true, + lineClamp: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + tabSize: true, + widows: true, + zIndex: true, + zoom: true, + // SVG-related properties + fillOpacity: true, + floodOpacity: true, + stopOpacity: true, + strokeDasharray: true, + strokeDashoffset: true, + strokeMiterlimit: true, + strokeOpacity: true, + strokeWidth: true + }; + /** + * @param {string} prefix vendor-specific prefix, eg: Webkit + * @param {string} key style name, eg: transitionDuration + * @return {string} style name prefixed with `prefix`, properly camelCased, eg: + * WebkitTransitionDuration + */ - if (nextExplicitTarget.blockedOn === null) { - // We're unblocked. - queuedExplicitHydrationTargets.shift(); - } - } + function prefixKey(prefix, key) { + return prefix + key.charAt(0).toUpperCase() + key.substring(1); } -} - -function addEventBubbleListener(element, eventType, listener) { - element.addEventListener(eventType, listener, false); -} -function addEventCaptureListener(element, eventType, listener) { - element.addEventListener(eventType, listener, true); -} -function addEventCaptureListenerWithPassiveFlag(element, eventType, listener, passive) { - element.addEventListener(eventType, listener, { - capture: true, - passive: passive - }); -} + /** + * Support style names that may come passed in prefixed by adding permutations + * of vendor prefixes. + */ -/** - * Gets the target node from a native browser event by accounting for - * inconsistencies in browser DOM APIs. - * - * @param {object} nativeEvent Native browser event. - * @return {DOMEventTarget} Target node. - */ -function getEventTarget(nativeEvent) { - // Fallback to nativeEvent.srcElement for IE9 - // https://github.com/facebook/react/issues/12506 - var target = nativeEvent.target || nativeEvent.srcElement || window; // Normalize SVG <use> element events #4963 + var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an + // infinite loop, because it iterates over the newly added props too. - if (target.correspondingUseElement) { - target = target.correspondingUseElement; - } // Safari may fire events on text nodes (Node.TEXT_NODE is 3). - // @see http://www.quirksmode.org/js/events_properties.html + Object.keys(isUnitlessNumber).forEach(function (prop) { + prefixes.forEach(function (prefix) { + isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop]; + }); + }); + /** + * Convert a value into the proper css writable value. The style name `name` + * should be logical (no hyphens), as specified + * in `CSSProperty.isUnitlessNumber`. + * + * @param {string} name CSS property name such as `topMargin`. + * @param {*} value CSS property value such as `10px`. + * @return {string} Normalized style value with dimensions applied. + */ - return target.nodeType === TEXT_NODE ? target.parentNode : target; -} + function dangerousStyleValue(name, value, isCustomProperty) { + // Note that we've removed escapeTextForBrowser() calls here since the + // whole string will be escaped when the attribute is injected into + // the markup. If you provide unsafe user data here they can inject + // arbitrary CSS which may be problematic (I couldn't repro this): + // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet + // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/ + // This is not an XSS hole but instead a potential CSS injection issue + // which has lead to a greater discussion about how we're going to + // trust URLs moving forward. See #2115901 + var isEmpty = value == null || typeof value === 'boolean' || value === ''; + + if (isEmpty) { + return ''; + } -function getParent(inst) { - do { - inst = inst.return; // TODO: If this is a HostRoot we might want to bail out. - // That is depending on if we want nested subtrees (layers) to bubble - // events to their parent. We could also go through parentNode on the - // host node but that wouldn't work for React Native and doesn't let us - // do the portal feature. - } while (inst && inst.tag !== HostComponent); + if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) { + return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers + } - if (inst) { - return inst; + return ('' + value).trim(); } - return null; -} -/** - * Return the lowest common ancestor of A and B, or null if they are in - * different trees. - */ + var uppercasePattern = /([A-Z])/g; + var msPattern = /^ms-/; + /** + * Hyphenates a camelcased CSS property name, for example: + * + * > hyphenateStyleName('backgroundColor') + * < "background-color" + * > hyphenateStyleName('MozTransition') + * < "-moz-transition" + * > hyphenateStyleName('msTransition') + * < "-ms-transition" + * + * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix + * is converted to `-ms-`. + */ + function hyphenateStyleName(name) { + return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-'); + } -function getLowestCommonAncestor(instA, instB) { - var depthA = 0; + var warnValidStyle = function () {}; - for (var tempA = instA; tempA; tempA = getParent(tempA)) { - depthA++; - } + { + // 'msTransform' is correct, but the other prefixes should be capitalized + var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/; + var msPattern$1 = /^-ms-/; + var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon + + var badStyleValueWithSemicolonPattern = /;\s*$/; + var warnedStyleNames = {}; + var warnedStyleValues = {}; + var warnedForNaNValue = false; + var warnedForInfinityValue = false; + + var camelize = function (string) { + return string.replace(hyphenPattern, function (_, character) { + return character.toUpperCase(); + }); + }; - var depthB = 0; + var warnHyphenatedStyleName = function (name) { + if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { + return; + } - for (var tempB = instB; tempB; tempB = getParent(tempB)) { - depthB++; - } // If A is deeper, crawl up. + warnedStyleNames[name] = true; + error('Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests + // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix + // is converted to lowercase `ms`. + camelize(name.replace(msPattern$1, 'ms-'))); + }; - while (depthA - depthB > 0) { - instA = getParent(instA); - depthA--; - } // If B is deeper, crawl up. + var warnBadVendoredStyleName = function (name) { + if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { + return; + } + warnedStyleNames[name] = true; - while (depthB - depthA > 0) { - instB = getParent(instB); - depthB--; - } // Walk in lockstep until we find a match. + error('Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1)); + }; + var warnStyleValueWithSemicolon = function (name, value) { + if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) { + return; + } - var depth = depthA; + warnedStyleValues[value] = true; - while (depth--) { - if (instA === instB || instA === instB.alternate) { - return instA; - } + error("Style property values shouldn't contain a semicolon. " + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, '')); + }; - instA = getParent(instA); - instB = getParent(instB); - } + var warnStyleValueIsNaN = function (name, value) { + if (warnedForNaNValue) { + return; + } - return null; -} -/** - * Return if A is an ancestor of B. - */ + warnedForNaNValue = true; + error('`NaN` is an invalid value for the `%s` css style property.', name); + }; -/** - * Return the parent instance of the passed-in instance. - */ + var warnStyleValueIsInfinity = function (name, value) { + if (warnedForInfinityValue) { + return; + } + warnedForInfinityValue = true; -/** - * Simulates the traversal of a two-phase, capture/bubble event dispatch. - */ + error('`Infinity` is an invalid value for the `%s` css style property.', name); + }; -function traverseTwoPhase(inst, fn, arg) { - var path = []; + warnValidStyle = function (name, value) { + if (name.indexOf('-') > -1) { + warnHyphenatedStyleName(name); + } else if (badVendoredStyleNamePattern.test(name)) { + warnBadVendoredStyleName(name); + } else if (badStyleValueWithSemicolonPattern.test(value)) { + warnStyleValueWithSemicolon(name, value); + } - while (inst) { - path.push(inst); - inst = getParent(inst); + if (typeof value === 'number') { + if (isNaN(value)) { + warnStyleValueIsNaN(name, value); + } else if (!isFinite(value)) { + warnStyleValueIsInfinity(name, value); + } + } + }; } - var i; + var warnValidStyle$1 = warnValidStyle; - for (i = path.length; i-- > 0;) { - fn(path[i], 'captured', arg); - } + /** + * Operations for dealing with CSS properties. + */ - for (i = 0; i < path.length; i++) { - fn(path[i], 'bubbled', arg); - } -} -/** - * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that - * should would receive a `mouseEnter` or `mouseLeave` event. - * - * Does not invoke the callback on the nearest common ancestor because nothing - * "entered" or "left" that element. - */ + /** + * This creates a string that is expected to be equivalent to the style + * attribute generated by server-side rendering. It by-passes warnings and + * security checks so it's not safe to use this value for anything other than + * comparison. It is only used in DEV for SSR validation. + */ -function traverseEnterLeave(from, to, fn, argFrom, argTo) { - var common = from && to ? getLowestCommonAncestor(from, to) : null; - var pathFrom = []; + function createDangerousStringForStyles(styles) { + { + var serialized = ''; + var delimiter = ''; - while (true) { - if (!from) { - break; - } + for (var styleName in styles) { + if (!styles.hasOwnProperty(styleName)) { + continue; + } - if (from === common) { - break; - } + var styleValue = styles[styleName]; - var alternate = from.alternate; + if (styleValue != null) { + var isCustomProperty = styleName.indexOf('--') === 0; + serialized += delimiter + (isCustomProperty ? styleName : hyphenateStyleName(styleName)) + ':'; + serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty); + delimiter = ';'; + } + } - if (alternate !== null && alternate === common) { - break; + return serialized || null; } - - pathFrom.push(from); - from = getParent(from); } + /** + * Sets the value for multiple styles on a node. If a value is specified as + * '' (empty string), the corresponding style property will be unset. + * + * @param {DOMElement} node + * @param {object} styles + */ - var pathTo = []; + function setValueForStyles(node, styles) { + var style = node.style; - while (true) { - if (!to) { - break; - } + for (var styleName in styles) { + if (!styles.hasOwnProperty(styleName)) { + continue; + } - if (to === common) { - break; - } + var isCustomProperty = styleName.indexOf('--') === 0; + + { + if (!isCustomProperty) { + warnValidStyle$1(styleName, styles[styleName]); + } + } - var _alternate = to.alternate; + var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty); - if (_alternate !== null && _alternate === common) { - break; - } + if (styleName === 'float') { + styleName = 'cssFloat'; + } - pathTo.push(to); - to = getParent(to); + if (isCustomProperty) { + style.setProperty(styleName, styleValue); + } else { + style[styleName] = styleValue; + } + } } - for (var i = 0; i < pathFrom.length; i++) { - fn(pathFrom[i], 'bubbled', argFrom); + function isValueEmpty(value) { + return value == null || typeof value === 'boolean' || value === ''; } + /** + * Given {color: 'red', overflow: 'hidden'} returns { + * color: 'color', + * overflowX: 'overflow', + * overflowY: 'overflow', + * }. This can be read as "the overflowY property was set by the overflow + * shorthand". That is, the values are the property that each was derived from. + */ - for (var _i = pathTo.length; _i-- > 0;) { - fn(pathTo[_i], 'captured', argTo); - } -} -/** - * Some event types have a notion of different registration names for different - * "phases" of propagation. This finds listeners by a given phase. - */ -function listenerAtPhase(inst, event, propagationPhase) { - var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase]; - return getListener(inst, registrationName); -} -/** - * A small set of propagation patterns, each of which will accept a small amount - * of information, and generate a set of "dispatch ready event objects" - which - * are sets of events that have already been annotated with a set of dispatched - * listener functions/ids. The API is designed this way to discourage these - * propagation strategies from actually executing the dispatches, since we - * always want to collect the entire set of dispatches before executing even a - * single one. - */ + function expandShorthandMap(styles) { + var expanded = {}; -/** - * Tags a `SyntheticEvent` with dispatched listeners. Creating this function - * here, allows us to not have to bind or create functions for each event. - * Mutating the event's members allows us to not have to create a wrapping - * "dispatch" object that pairs the event with the listener. - */ + for (var key in styles) { + var longhands = shorthandToLonghand[key] || [key]; + for (var i = 0; i < longhands.length; i++) { + expanded[longhands[i]] = key; + } + } -function accumulateDirectionalDispatches(inst, phase, event) { - { - !inst ? warningWithoutStack$1(false, 'Dispatching inst must not be null') : void 0; + return expanded; } + /** + * When mixing shorthand and longhand property names, we warn during updates if + * we expect an incorrect result to occur. In particular, we warn for: + * + * Updating a shorthand property (longhand gets overwritten): + * {font: 'foo', fontVariant: 'bar'} -> {font: 'baz', fontVariant: 'bar'} + * becomes .style.font = 'baz' + * Removing a shorthand property (longhand gets lost too): + * {font: 'foo', fontVariant: 'bar'} -> {fontVariant: 'bar'} + * becomes .style.font = '' + * Removing a longhand property (should revert to shorthand; doesn't): + * {font: 'foo', fontVariant: 'bar'} -> {font: 'foo'} + * becomes .style.fontVariant = '' + */ - var listener = listenerAtPhase(inst, event, phase); - if (listener) { - event._dispatchListeners = accumulateInto(event._dispatchListeners, listener); - event._dispatchInstances = accumulateInto(event._dispatchInstances, inst); - } -} -/** - * Collect dispatches (must be entirely collected before dispatching - see unit - * tests). Lazily allocate the array to conserve memory. We must loop through - * each event and perform the traversal for each one. We cannot perform a - * single traversal for the entire collection of events because each event may - * have a different target. - */ + function validateShorthandPropertyCollisionInDev(styleUpdates, nextStyles) { + { + if (!nextStyles) { + return; + } -function accumulateTwoPhaseDispatchesSingle(event) { - if (event && event.dispatchConfig.phasedRegistrationNames) { - traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event); - } -} -/** - * Accumulates without regard to direction, does not look for phased - * registration names. Same as `accumulateDirectDispatchesSingle` but without - * requiring that the `dispatchMarker` be the same as the dispatched ID. - */ + var expandedUpdates = expandShorthandMap(styleUpdates); + var expandedStyles = expandShorthandMap(nextStyles); + var warnedAbout = {}; + for (var key in expandedUpdates) { + var originalKey = expandedUpdates[key]; + var correctOriginalKey = expandedStyles[key]; -function accumulateDispatches(inst, ignoredDirection, event) { - if (inst && event && event.dispatchConfig.registrationName) { - var registrationName = event.dispatchConfig.registrationName; - var listener = getListener(inst, registrationName); + if (correctOriginalKey && originalKey !== correctOriginalKey) { + var warningKey = originalKey + ',' + correctOriginalKey; - if (listener) { - event._dispatchListeners = accumulateInto(event._dispatchListeners, listener); - event._dispatchInstances = accumulateInto(event._dispatchInstances, inst); - } - } -} -/** - * Accumulates dispatches on an `SyntheticEvent`, but only for the - * `dispatchMarker`. - * @param {SyntheticEvent} event - */ + if (warnedAbout[warningKey]) { + continue; + } + warnedAbout[warningKey] = true; -function accumulateDirectDispatchesSingle(event) { - if (event && event.dispatchConfig.registrationName) { - accumulateDispatches(event._targetInst, null, event); + error('%s a style property during rerender (%s) when a ' + 'conflicting property is set (%s) can lead to styling bugs. To ' + "avoid this, don't mix shorthand and non-shorthand properties " + 'for the same value; instead, replace the shorthand with ' + 'separate values.', isValueEmpty(styleUpdates[originalKey]) ? 'Removing' : 'Updating', originalKey, correctOriginalKey); + } + } + } } -} -function accumulateTwoPhaseDispatches(events) { - forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle); -} + // For HTML, certain tags should omit their close tag. We keep a whitelist for + // those special-case tags. + var omittedCloseTags = { + area: true, + base: true, + br: true, + col: true, + embed: true, + hr: true, + img: true, + input: true, + keygen: true, + link: true, + meta: true, + param: true, + source: true, + track: true, + wbr: true // NOTE: menuitem's close tag should be omitted, but that causes problems. -function accumulateEnterLeaveDispatches(leave, enter, from, to) { - traverseEnterLeave(from, to, accumulateDispatches, leave, enter); -} -function accumulateDirectDispatches(events) { - forEachAccumulated(events, accumulateDirectDispatchesSingle); -} + }; -/* eslint valid-typeof: 0 */ -var EVENT_POOL_SIZE = 10; -/** - * @interface Event - * @see http://www.w3.org/TR/DOM-Level-3-Events/ - */ + // `omittedCloseTags` except that `menuitem` should still have its closing tag. -var EventInterface = { - type: null, - target: null, - // currentTarget is set when dispatching; no use in copying it here - currentTarget: function () { - return null; - }, - eventPhase: null, - bubbles: null, - cancelable: null, - timeStamp: function (event) { - return event.timeStamp || Date.now(); - }, - defaultPrevented: null, - isTrusted: null -}; - -function functionThatReturnsTrue() { - return true; -} - -function functionThatReturnsFalse() { - return false; -} -/** - * Synthetic events are dispatched by event plugins, typically in response to a - * top-level event delegation handler. - * - * These systems should generally use pooling to reduce the frequency of garbage - * collection. The system should check `isPersistent` to determine whether the - * event should be released into the pool after being dispatched. Users that - * need a persisted event should invoke `persist`. - * - * Synthetic events (and subclasses) implement the DOM Level 3 Events API by - * normalizing browser quirks. Subclasses do not necessarily have to implement a - * DOM interface; custom application-specific events can also subclass this. - * - * @param {object} dispatchConfig Configuration used to dispatch this event. - * @param {*} targetInst Marker identifying the event target. - * @param {object} nativeEvent Native browser event. - * @param {DOMEventTarget} nativeEventTarget Target node. - */ + var voidElementTags = _assign({ + menuitem: true + }, omittedCloseTags); + var HTML = '__html'; + var ReactDebugCurrentFrame$3 = null; -function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) { { - // these have a getter/setter for warnings - delete this.nativeEvent; - delete this.preventDefault; - delete this.stopPropagation; - delete this.isDefaultPrevented; - delete this.isPropagationStopped; + ReactDebugCurrentFrame$3 = ReactSharedInternals.ReactDebugCurrentFrame; } - this.dispatchConfig = dispatchConfig; - this._targetInst = targetInst; - this.nativeEvent = nativeEvent; - var Interface = this.constructor.Interface; + function assertValidProps(tag, props) { + if (!props) { + return; + } // Note the use of `==` which checks for null or undefined. - for (var propName in Interface) { - if (!Interface.hasOwnProperty(propName)) { - continue; - } - { - delete this[propName]; // this has a getter/setter for warnings + if (voidElementTags[tag]) { + if (!(props.children == null && props.dangerouslySetInnerHTML == null)) { + { + throw Error( tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`." + ( ReactDebugCurrentFrame$3.getStackAddendum() ) ); + } + } } - var normalize = Interface[propName]; + if (props.dangerouslySetInnerHTML != null) { + if (!(props.children == null)) { + { + throw Error( "Can only set one of `children` or `props.dangerouslySetInnerHTML`." ); + } + } - if (normalize) { - this[propName] = normalize(nativeEvent); - } else { - if (propName === 'target') { - this.target = nativeEventTarget; - } else { - this[propName] = nativeEvent[propName]; + if (!(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML)) { + { + throw Error( "`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information." ); + } } } - } - var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false; + { + if (!props.suppressContentEditableWarning && props.contentEditable && props.children != null) { + error('A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.'); + } + } - if (defaultPrevented) { - this.isDefaultPrevented = functionThatReturnsTrue; - } else { - this.isDefaultPrevented = functionThatReturnsFalse; + if (!(props.style == null || typeof props.style === 'object')) { + { + throw Error( "The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX." + ( ReactDebugCurrentFrame$3.getStackAddendum() ) ); + } + } } - this.isPropagationStopped = functionThatReturnsFalse; - return this; -} + function isCustomComponent(tagName, props) { + if (tagName.indexOf('-') === -1) { + return typeof props.is === 'string'; + } -_assign(SyntheticEvent.prototype, { - preventDefault: function () { - this.defaultPrevented = true; - var event = this.nativeEvent; + switch (tagName) { + // These are reserved SVG and MathML elements. + // We don't mind this whitelist too much because we expect it to never grow. + // The alternative is to track the namespace in a few places which is convoluted. + // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts + case 'annotation-xml': + case 'color-profile': + case 'font-face': + case 'font-face-src': + case 'font-face-uri': + case 'font-face-format': + case 'font-face-name': + case 'missing-glyph': + return false; - if (!event) { - return; - } - - if (event.preventDefault) { - event.preventDefault(); - } else if (typeof event.returnValue !== 'unknown') { - event.returnValue = false; - } - - this.isDefaultPrevented = functionThatReturnsTrue; - }, - stopPropagation: function () { - var event = this.nativeEvent; - - if (!event) { - return; - } - - if (event.stopPropagation) { - event.stopPropagation(); - } else if (typeof event.cancelBubble !== 'unknown') { - // The ChangeEventPlugin registers a "propertychange" event for - // IE. This event does not support bubbling or cancelling, and - // any references to cancelBubble throw "Member not found". A - // typeof check of "unknown" circumvents this issue (and is also - // IE specific). - event.cancelBubble = true; + default: + return true; } + } - this.isPropagationStopped = functionThatReturnsTrue; - }, - - /** - * We release all dispatched `SyntheticEvent`s after each event loop, adding - * them back into the pool. This allows a way to hold onto a reference that - * won't be added back into the pool. - */ - persist: function () { - this.isPersistent = functionThatReturnsTrue; - }, - - /** - * Checks if this event should be released back into the pool. - * - * @return {boolean} True if this should not be released, false otherwise. - */ - isPersistent: functionThatReturnsFalse, - - /** - * `PooledClass` looks for `destructor` on each instance it releases. - */ - destructor: function () { - var Interface = this.constructor.Interface; + // When adding attributes to the HTML or SVG whitelist, be sure to + // also add them to this module to ensure casing and incorrect name + // warnings. + var possibleStandardNames = { + // HTML + accept: 'accept', + acceptcharset: 'acceptCharset', + 'accept-charset': 'acceptCharset', + accesskey: 'accessKey', + action: 'action', + allowfullscreen: 'allowFullScreen', + alt: 'alt', + as: 'as', + async: 'async', + autocapitalize: 'autoCapitalize', + autocomplete: 'autoComplete', + autocorrect: 'autoCorrect', + autofocus: 'autoFocus', + autoplay: 'autoPlay', + autosave: 'autoSave', + capture: 'capture', + cellpadding: 'cellPadding', + cellspacing: 'cellSpacing', + challenge: 'challenge', + charset: 'charSet', + checked: 'checked', + children: 'children', + cite: 'cite', + class: 'className', + classid: 'classID', + classname: 'className', + cols: 'cols', + colspan: 'colSpan', + content: 'content', + contenteditable: 'contentEditable', + contextmenu: 'contextMenu', + controls: 'controls', + controlslist: 'controlsList', + coords: 'coords', + crossorigin: 'crossOrigin', + dangerouslysetinnerhtml: 'dangerouslySetInnerHTML', + data: 'data', + datetime: 'dateTime', + default: 'default', + defaultchecked: 'defaultChecked', + defaultvalue: 'defaultValue', + defer: 'defer', + dir: 'dir', + disabled: 'disabled', + disablepictureinpicture: 'disablePictureInPicture', + download: 'download', + draggable: 'draggable', + enctype: 'encType', + for: 'htmlFor', + form: 'form', + formmethod: 'formMethod', + formaction: 'formAction', + formenctype: 'formEncType', + formnovalidate: 'formNoValidate', + formtarget: 'formTarget', + frameborder: 'frameBorder', + headers: 'headers', + height: 'height', + hidden: 'hidden', + high: 'high', + href: 'href', + hreflang: 'hrefLang', + htmlfor: 'htmlFor', + httpequiv: 'httpEquiv', + 'http-equiv': 'httpEquiv', + icon: 'icon', + id: 'id', + innerhtml: 'innerHTML', + inputmode: 'inputMode', + integrity: 'integrity', + is: 'is', + itemid: 'itemID', + itemprop: 'itemProp', + itemref: 'itemRef', + itemscope: 'itemScope', + itemtype: 'itemType', + keyparams: 'keyParams', + keytype: 'keyType', + kind: 'kind', + label: 'label', + lang: 'lang', + list: 'list', + loop: 'loop', + low: 'low', + manifest: 'manifest', + marginwidth: 'marginWidth', + marginheight: 'marginHeight', + max: 'max', + maxlength: 'maxLength', + media: 'media', + mediagroup: 'mediaGroup', + method: 'method', + min: 'min', + minlength: 'minLength', + multiple: 'multiple', + muted: 'muted', + name: 'name', + nomodule: 'noModule', + nonce: 'nonce', + novalidate: 'noValidate', + open: 'open', + optimum: 'optimum', + pattern: 'pattern', + placeholder: 'placeholder', + playsinline: 'playsInline', + poster: 'poster', + preload: 'preload', + profile: 'profile', + radiogroup: 'radioGroup', + readonly: 'readOnly', + referrerpolicy: 'referrerPolicy', + rel: 'rel', + required: 'required', + reversed: 'reversed', + role: 'role', + rows: 'rows', + rowspan: 'rowSpan', + sandbox: 'sandbox', + scope: 'scope', + scoped: 'scoped', + scrolling: 'scrolling', + seamless: 'seamless', + selected: 'selected', + shape: 'shape', + size: 'size', + sizes: 'sizes', + span: 'span', + spellcheck: 'spellCheck', + src: 'src', + srcdoc: 'srcDoc', + srclang: 'srcLang', + srcset: 'srcSet', + start: 'start', + step: 'step', + style: 'style', + summary: 'summary', + tabindex: 'tabIndex', + target: 'target', + title: 'title', + type: 'type', + usemap: 'useMap', + value: 'value', + width: 'width', + wmode: 'wmode', + wrap: 'wrap', + // SVG + about: 'about', + accentheight: 'accentHeight', + 'accent-height': 'accentHeight', + accumulate: 'accumulate', + additive: 'additive', + alignmentbaseline: 'alignmentBaseline', + 'alignment-baseline': 'alignmentBaseline', + allowreorder: 'allowReorder', + alphabetic: 'alphabetic', + amplitude: 'amplitude', + arabicform: 'arabicForm', + 'arabic-form': 'arabicForm', + ascent: 'ascent', + attributename: 'attributeName', + attributetype: 'attributeType', + autoreverse: 'autoReverse', + azimuth: 'azimuth', + basefrequency: 'baseFrequency', + baselineshift: 'baselineShift', + 'baseline-shift': 'baselineShift', + baseprofile: 'baseProfile', + bbox: 'bbox', + begin: 'begin', + bias: 'bias', + by: 'by', + calcmode: 'calcMode', + capheight: 'capHeight', + 'cap-height': 'capHeight', + clip: 'clip', + clippath: 'clipPath', + 'clip-path': 'clipPath', + clippathunits: 'clipPathUnits', + cliprule: 'clipRule', + 'clip-rule': 'clipRule', + color: 'color', + colorinterpolation: 'colorInterpolation', + 'color-interpolation': 'colorInterpolation', + colorinterpolationfilters: 'colorInterpolationFilters', + 'color-interpolation-filters': 'colorInterpolationFilters', + colorprofile: 'colorProfile', + 'color-profile': 'colorProfile', + colorrendering: 'colorRendering', + 'color-rendering': 'colorRendering', + contentscripttype: 'contentScriptType', + contentstyletype: 'contentStyleType', + cursor: 'cursor', + cx: 'cx', + cy: 'cy', + d: 'd', + datatype: 'datatype', + decelerate: 'decelerate', + descent: 'descent', + diffuseconstant: 'diffuseConstant', + direction: 'direction', + display: 'display', + divisor: 'divisor', + dominantbaseline: 'dominantBaseline', + 'dominant-baseline': 'dominantBaseline', + dur: 'dur', + dx: 'dx', + dy: 'dy', + edgemode: 'edgeMode', + elevation: 'elevation', + enablebackground: 'enableBackground', + 'enable-background': 'enableBackground', + end: 'end', + exponent: 'exponent', + externalresourcesrequired: 'externalResourcesRequired', + fill: 'fill', + fillopacity: 'fillOpacity', + 'fill-opacity': 'fillOpacity', + fillrule: 'fillRule', + 'fill-rule': 'fillRule', + filter: 'filter', + filterres: 'filterRes', + filterunits: 'filterUnits', + floodopacity: 'floodOpacity', + 'flood-opacity': 'floodOpacity', + floodcolor: 'floodColor', + 'flood-color': 'floodColor', + focusable: 'focusable', + fontfamily: 'fontFamily', + 'font-family': 'fontFamily', + fontsize: 'fontSize', + 'font-size': 'fontSize', + fontsizeadjust: 'fontSizeAdjust', + 'font-size-adjust': 'fontSizeAdjust', + fontstretch: 'fontStretch', + 'font-stretch': 'fontStretch', + fontstyle: 'fontStyle', + 'font-style': 'fontStyle', + fontvariant: 'fontVariant', + 'font-variant': 'fontVariant', + fontweight: 'fontWeight', + 'font-weight': 'fontWeight', + format: 'format', + from: 'from', + fx: 'fx', + fy: 'fy', + g1: 'g1', + g2: 'g2', + glyphname: 'glyphName', + 'glyph-name': 'glyphName', + glyphorientationhorizontal: 'glyphOrientationHorizontal', + 'glyph-orientation-horizontal': 'glyphOrientationHorizontal', + glyphorientationvertical: 'glyphOrientationVertical', + 'glyph-orientation-vertical': 'glyphOrientationVertical', + glyphref: 'glyphRef', + gradienttransform: 'gradientTransform', + gradientunits: 'gradientUnits', + hanging: 'hanging', + horizadvx: 'horizAdvX', + 'horiz-adv-x': 'horizAdvX', + horizoriginx: 'horizOriginX', + 'horiz-origin-x': 'horizOriginX', + ideographic: 'ideographic', + imagerendering: 'imageRendering', + 'image-rendering': 'imageRendering', + in2: 'in2', + in: 'in', + inlist: 'inlist', + intercept: 'intercept', + k1: 'k1', + k2: 'k2', + k3: 'k3', + k4: 'k4', + k: 'k', + kernelmatrix: 'kernelMatrix', + kernelunitlength: 'kernelUnitLength', + kerning: 'kerning', + keypoints: 'keyPoints', + keysplines: 'keySplines', + keytimes: 'keyTimes', + lengthadjust: 'lengthAdjust', + letterspacing: 'letterSpacing', + 'letter-spacing': 'letterSpacing', + lightingcolor: 'lightingColor', + 'lighting-color': 'lightingColor', + limitingconeangle: 'limitingConeAngle', + local: 'local', + markerend: 'markerEnd', + 'marker-end': 'markerEnd', + markerheight: 'markerHeight', + markermid: 'markerMid', + 'marker-mid': 'markerMid', + markerstart: 'markerStart', + 'marker-start': 'markerStart', + markerunits: 'markerUnits', + markerwidth: 'markerWidth', + mask: 'mask', + maskcontentunits: 'maskContentUnits', + maskunits: 'maskUnits', + mathematical: 'mathematical', + mode: 'mode', + numoctaves: 'numOctaves', + offset: 'offset', + opacity: 'opacity', + operator: 'operator', + order: 'order', + orient: 'orient', + orientation: 'orientation', + origin: 'origin', + overflow: 'overflow', + overlineposition: 'overlinePosition', + 'overline-position': 'overlinePosition', + overlinethickness: 'overlineThickness', + 'overline-thickness': 'overlineThickness', + paintorder: 'paintOrder', + 'paint-order': 'paintOrder', + panose1: 'panose1', + 'panose-1': 'panose1', + pathlength: 'pathLength', + patterncontentunits: 'patternContentUnits', + patterntransform: 'patternTransform', + patternunits: 'patternUnits', + pointerevents: 'pointerEvents', + 'pointer-events': 'pointerEvents', + points: 'points', + pointsatx: 'pointsAtX', + pointsaty: 'pointsAtY', + pointsatz: 'pointsAtZ', + prefix: 'prefix', + preservealpha: 'preserveAlpha', + preserveaspectratio: 'preserveAspectRatio', + primitiveunits: 'primitiveUnits', + property: 'property', + r: 'r', + radius: 'radius', + refx: 'refX', + refy: 'refY', + renderingintent: 'renderingIntent', + 'rendering-intent': 'renderingIntent', + repeatcount: 'repeatCount', + repeatdur: 'repeatDur', + requiredextensions: 'requiredExtensions', + requiredfeatures: 'requiredFeatures', + resource: 'resource', + restart: 'restart', + result: 'result', + results: 'results', + rotate: 'rotate', + rx: 'rx', + ry: 'ry', + scale: 'scale', + security: 'security', + seed: 'seed', + shaperendering: 'shapeRendering', + 'shape-rendering': 'shapeRendering', + slope: 'slope', + spacing: 'spacing', + specularconstant: 'specularConstant', + specularexponent: 'specularExponent', + speed: 'speed', + spreadmethod: 'spreadMethod', + startoffset: 'startOffset', + stddeviation: 'stdDeviation', + stemh: 'stemh', + stemv: 'stemv', + stitchtiles: 'stitchTiles', + stopcolor: 'stopColor', + 'stop-color': 'stopColor', + stopopacity: 'stopOpacity', + 'stop-opacity': 'stopOpacity', + strikethroughposition: 'strikethroughPosition', + 'strikethrough-position': 'strikethroughPosition', + strikethroughthickness: 'strikethroughThickness', + 'strikethrough-thickness': 'strikethroughThickness', + string: 'string', + stroke: 'stroke', + strokedasharray: 'strokeDasharray', + 'stroke-dasharray': 'strokeDasharray', + strokedashoffset: 'strokeDashoffset', + 'stroke-dashoffset': 'strokeDashoffset', + strokelinecap: 'strokeLinecap', + 'stroke-linecap': 'strokeLinecap', + strokelinejoin: 'strokeLinejoin', + 'stroke-linejoin': 'strokeLinejoin', + strokemiterlimit: 'strokeMiterlimit', + 'stroke-miterlimit': 'strokeMiterlimit', + strokewidth: 'strokeWidth', + 'stroke-width': 'strokeWidth', + strokeopacity: 'strokeOpacity', + 'stroke-opacity': 'strokeOpacity', + suppresscontenteditablewarning: 'suppressContentEditableWarning', + suppresshydrationwarning: 'suppressHydrationWarning', + surfacescale: 'surfaceScale', + systemlanguage: 'systemLanguage', + tablevalues: 'tableValues', + targetx: 'targetX', + targety: 'targetY', + textanchor: 'textAnchor', + 'text-anchor': 'textAnchor', + textdecoration: 'textDecoration', + 'text-decoration': 'textDecoration', + textlength: 'textLength', + textrendering: 'textRendering', + 'text-rendering': 'textRendering', + to: 'to', + transform: 'transform', + typeof: 'typeof', + u1: 'u1', + u2: 'u2', + underlineposition: 'underlinePosition', + 'underline-position': 'underlinePosition', + underlinethickness: 'underlineThickness', + 'underline-thickness': 'underlineThickness', + unicode: 'unicode', + unicodebidi: 'unicodeBidi', + 'unicode-bidi': 'unicodeBidi', + unicoderange: 'unicodeRange', + 'unicode-range': 'unicodeRange', + unitsperem: 'unitsPerEm', + 'units-per-em': 'unitsPerEm', + unselectable: 'unselectable', + valphabetic: 'vAlphabetic', + 'v-alphabetic': 'vAlphabetic', + values: 'values', + vectoreffect: 'vectorEffect', + 'vector-effect': 'vectorEffect', + version: 'version', + vertadvy: 'vertAdvY', + 'vert-adv-y': 'vertAdvY', + vertoriginx: 'vertOriginX', + 'vert-origin-x': 'vertOriginX', + vertoriginy: 'vertOriginY', + 'vert-origin-y': 'vertOriginY', + vhanging: 'vHanging', + 'v-hanging': 'vHanging', + videographic: 'vIdeographic', + 'v-ideographic': 'vIdeographic', + viewbox: 'viewBox', + viewtarget: 'viewTarget', + visibility: 'visibility', + vmathematical: 'vMathematical', + 'v-mathematical': 'vMathematical', + vocab: 'vocab', + widths: 'widths', + wordspacing: 'wordSpacing', + 'word-spacing': 'wordSpacing', + writingmode: 'writingMode', + 'writing-mode': 'writingMode', + x1: 'x1', + x2: 'x2', + x: 'x', + xchannelselector: 'xChannelSelector', + xheight: 'xHeight', + 'x-height': 'xHeight', + xlinkactuate: 'xlinkActuate', + 'xlink:actuate': 'xlinkActuate', + xlinkarcrole: 'xlinkArcrole', + 'xlink:arcrole': 'xlinkArcrole', + xlinkhref: 'xlinkHref', + 'xlink:href': 'xlinkHref', + xlinkrole: 'xlinkRole', + 'xlink:role': 'xlinkRole', + xlinkshow: 'xlinkShow', + 'xlink:show': 'xlinkShow', + xlinktitle: 'xlinkTitle', + 'xlink:title': 'xlinkTitle', + xlinktype: 'xlinkType', + 'xlink:type': 'xlinkType', + xmlbase: 'xmlBase', + 'xml:base': 'xmlBase', + xmllang: 'xmlLang', + 'xml:lang': 'xmlLang', + xmlns: 'xmlns', + 'xml:space': 'xmlSpace', + xmlnsxlink: 'xmlnsXlink', + 'xmlns:xlink': 'xmlnsXlink', + xmlspace: 'xmlSpace', + y1: 'y1', + y2: 'y2', + y: 'y', + ychannelselector: 'yChannelSelector', + z: 'z', + zoomandpan: 'zoomAndPan' + }; - for (var propName in Interface) { - { - Object.defineProperty(this, propName, getPooledWarningPropertyDefinition(propName, Interface[propName])); - } - } + var ariaProperties = { + 'aria-current': 0, + // state + 'aria-details': 0, + 'aria-disabled': 0, + // state + 'aria-hidden': 0, + // state + 'aria-invalid': 0, + // state + 'aria-keyshortcuts': 0, + 'aria-label': 0, + 'aria-roledescription': 0, + // Widget Attributes + 'aria-autocomplete': 0, + 'aria-checked': 0, + 'aria-expanded': 0, + 'aria-haspopup': 0, + 'aria-level': 0, + 'aria-modal': 0, + 'aria-multiline': 0, + 'aria-multiselectable': 0, + 'aria-orientation': 0, + 'aria-placeholder': 0, + 'aria-pressed': 0, + 'aria-readonly': 0, + 'aria-required': 0, + 'aria-selected': 0, + 'aria-sort': 0, + 'aria-valuemax': 0, + 'aria-valuemin': 0, + 'aria-valuenow': 0, + 'aria-valuetext': 0, + // Live Region Attributes + 'aria-atomic': 0, + 'aria-busy': 0, + 'aria-live': 0, + 'aria-relevant': 0, + // Drag-and-Drop Attributes + 'aria-dropeffect': 0, + 'aria-grabbed': 0, + // Relationship Attributes + 'aria-activedescendant': 0, + 'aria-colcount': 0, + 'aria-colindex': 0, + 'aria-colspan': 0, + 'aria-controls': 0, + 'aria-describedby': 0, + 'aria-errormessage': 0, + 'aria-flowto': 0, + 'aria-labelledby': 0, + 'aria-owns': 0, + 'aria-posinset': 0, + 'aria-rowcount': 0, + 'aria-rowindex': 0, + 'aria-rowspan': 0, + 'aria-setsize': 0 + }; - this.dispatchConfig = null; - this._targetInst = null; - this.nativeEvent = null; - this.isDefaultPrevented = functionThatReturnsFalse; - this.isPropagationStopped = functionThatReturnsFalse; - this._dispatchListeners = null; - this._dispatchInstances = null; + var warnedProperties = {}; + var rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$'); + var rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$'); + var hasOwnProperty$1 = Object.prototype.hasOwnProperty; + function validateProperty(tagName, name) { { - Object.defineProperty(this, 'nativeEvent', getPooledWarningPropertyDefinition('nativeEvent', null)); - Object.defineProperty(this, 'isDefaultPrevented', getPooledWarningPropertyDefinition('isDefaultPrevented', functionThatReturnsFalse)); - Object.defineProperty(this, 'isPropagationStopped', getPooledWarningPropertyDefinition('isPropagationStopped', functionThatReturnsFalse)); - Object.defineProperty(this, 'preventDefault', getPooledWarningPropertyDefinition('preventDefault', function () {})); - Object.defineProperty(this, 'stopPropagation', getPooledWarningPropertyDefinition('stopPropagation', function () {})); - } - } -}); + if (hasOwnProperty$1.call(warnedProperties, name) && warnedProperties[name]) { + return true; + } -SyntheticEvent.Interface = EventInterface; -/** - * Helper to reduce boilerplate when creating subclasses. - */ + if (rARIACamel.test(name)) { + var ariaName = 'aria-' + name.slice(4).toLowerCase(); + var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM + // DOM properties, then it is an invalid aria-* attribute. -SyntheticEvent.extend = function (Interface) { - var Super = this; + if (correctName == null) { + error('Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name); - var E = function () {}; + warnedProperties[name] = true; + return true; + } // aria-* attributes should be lowercase; suggest the lowercase version. - E.prototype = Super.prototype; - var prototype = new E(); - function Class() { - return Super.apply(this, arguments); - } + if (name !== correctName) { + error('Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName); - _assign(prototype, Class.prototype); + warnedProperties[name] = true; + return true; + } + } - Class.prototype = prototype; - Class.prototype.constructor = Class; - Class.Interface = _assign({}, Super.Interface, Interface); - Class.extend = Super.extend; - addEventPoolingTo(Class); - return Class; -}; + if (rARIA.test(name)) { + var lowerCasedName = name.toLowerCase(); + var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM + // DOM properties, then it is an invalid aria-* attribute. -addEventPoolingTo(SyntheticEvent); -/** - * Helper to nullify syntheticEvent instance properties when destructing - * - * @param {String} propName - * @param {?object} getVal - * @return {object} defineProperty object - */ + if (standardName == null) { + warnedProperties[name] = true; + return false; + } // aria-* attributes should be lowercase; suggest the lowercase version. -function getPooledWarningPropertyDefinition(propName, getVal) { - var isFunction = typeof getVal === 'function'; - return { - configurable: true, - set: set, - get: get - }; - function set(val) { - var action = isFunction ? 'setting the method' : 'setting the property'; - warn(action, 'This is effectively a no-op'); - return val; - } + if (name !== standardName) { + error('Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName); - function get() { - var action = isFunction ? 'accessing the method' : 'accessing the property'; - var result = isFunction ? 'This is a no-op function' : 'This is set to null'; - warn(action, result); - return getVal; - } + warnedProperties[name] = true; + return true; + } + } + } - function warn(action, result) { - var warningCondition = false; - !warningCondition ? warningWithoutStack$1(false, "This synthetic event is reused for performance reasons. If you're seeing this, " + "you're %s `%s` on a released/nullified synthetic event. %s. " + 'If you must keep the original synthetic event around, use event.persist(). ' + 'See https://fb.me/react-event-pooling for more information.', action, propName, result) : void 0; + return true; } -} -function getPooledEvent(dispatchConfig, targetInst, nativeEvent, nativeInst) { - var EventConstructor = this; + function warnInvalidARIAProps(type, props) { + { + var invalidProps = []; - if (EventConstructor.eventPool.length) { - var instance = EventConstructor.eventPool.pop(); - EventConstructor.call(instance, dispatchConfig, targetInst, nativeEvent, nativeInst); - return instance; - } + for (var key in props) { + var isValid = validateProperty(type, key); - return new EventConstructor(dispatchConfig, targetInst, nativeEvent, nativeInst); -} + if (!isValid) { + invalidProps.push(key); + } + } -function releasePooledEvent(event) { - var EventConstructor = this; + var unknownPropString = invalidProps.map(function (prop) { + return '`' + prop + '`'; + }).join(', '); - if (!(event instanceof EventConstructor)) { - { - throw Error("Trying to release an event instance into a pool of a different type."); + if (invalidProps.length === 1) { + error('Invalid aria prop %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type); + } else if (invalidProps.length > 1) { + error('Invalid aria props %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type); + } } } - event.destructor(); + function validateProperties(type, props) { + if (isCustomComponent(type, props)) { + return; + } - if (EventConstructor.eventPool.length < EVENT_POOL_SIZE) { - EventConstructor.eventPool.push(event); + warnInvalidARIAProps(type, props); } -} -function addEventPoolingTo(EventConstructor) { - EventConstructor.eventPool = []; - EventConstructor.getPooled = getPooledEvent; - EventConstructor.release = releasePooledEvent; -} - -/** - * @interface Event - * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface - * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent - */ - -var SyntheticAnimationEvent = SyntheticEvent.extend({ - animationName: null, - elapsedTime: null, - pseudoElement: null -}); + var didWarnValueNull = false; + function validateProperties$1(type, props) { + { + if (type !== 'input' && type !== 'textarea' && type !== 'select') { + return; + } -/** - * @interface Event - * @see http://www.w3.org/TR/clipboard-apis/ - */ + if (props != null && props.value === null && !didWarnValueNull) { + didWarnValueNull = true; -var SyntheticClipboardEvent = SyntheticEvent.extend({ - clipboardData: function (event) { - return 'clipboardData' in event ? event.clipboardData : window.clipboardData; + if (type === 'select' && props.multiple) { + error('`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.', type); + } else { + error('`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type); + } + } + } } -}); -var SyntheticUIEvent = SyntheticEvent.extend({ - view: null, - detail: null -}); + var validateProperty$1 = function () {}; -/** - * @interface FocusEvent - * @see http://www.w3.org/TR/DOM-Level-3-Events/ - */ + { + var warnedProperties$1 = {}; + var _hasOwnProperty = Object.prototype.hasOwnProperty; + var EVENT_NAME_REGEX = /^on./; + var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/; + var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$'); + var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$'); + + validateProperty$1 = function (tagName, name, value, canUseEventSystem) { + if (_hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) { + return true; + } -var SyntheticFocusEvent = SyntheticUIEvent.extend({ - relatedTarget: null -}); + var lowerCasedName = name.toLowerCase(); -/** - * `charCode` represents the actual "character code" and is safe to use with - * `String.fromCharCode`. As such, only keys that correspond to printable - * characters produce a valid `charCode`, the only exception to this is Enter. - * The Tab-key is considered non-printable and does not have a `charCode`, - * presumably because it does not produce a tab-character in browsers. - * - * @param {object} nativeEvent Native browser event. - * @return {number} Normalized `charCode` property. - */ -function getEventCharCode(nativeEvent) { - var charCode; - var keyCode = nativeEvent.keyCode; + if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') { + error('React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.'); - if ('charCode' in nativeEvent) { - charCode = nativeEvent.charCode; // FF does not set `charCode` for the Enter-key, check against `keyCode`. + warnedProperties$1[name] = true; + return true; + } // We can't rely on the event system being injected on the server. - if (charCode === 0 && keyCode === 13) { - charCode = 13; - } - } else { - // IE8 does not implement `charCode`, but `keyCode` has the correct value. - charCode = keyCode; - } // IE and Edge (on Windows) and Chrome / Safari (on Windows and Linux) - // report Enter as charCode 10 when ctrl is pressed. + if (canUseEventSystem) { + if (registrationNameModules.hasOwnProperty(name)) { + return true; + } - if (charCode === 10) { - charCode = 13; - } // Some non-printable keys are reported in `charCode`/`keyCode`, discard them. - // Must not discard the (non-)printable Enter-key. + var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null; + if (registrationName != null) { + error('Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName); - if (charCode >= 32 || charCode === 13) { - return charCode; - } + warnedProperties$1[name] = true; + return true; + } - return 0; -} + if (EVENT_NAME_REGEX.test(name)) { + error('Unknown event handler property `%s`. It will be ignored.', name); -/** - * Normalization of deprecated HTML5 `key` values - * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names - */ + warnedProperties$1[name] = true; + return true; + } + } else if (EVENT_NAME_REGEX.test(name)) { + // If no event plugins have been injected, we are in a server environment. + // So we can't tell if the event name is correct for sure, but we can filter + // out known bad ones like `onclick`. We can't suggest a specific replacement though. + if (INVALID_EVENT_NAME_REGEX.test(name)) { + error('Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name); + } -var normalizeKey = { - Esc: 'Escape', - Spacebar: ' ', - Left: 'ArrowLeft', - Up: 'ArrowUp', - Right: 'ArrowRight', - Down: 'ArrowDown', - Del: 'Delete', - Win: 'OS', - Menu: 'ContextMenu', - Apps: 'ContextMenu', - Scroll: 'ScrollLock', - MozPrintableKey: 'Unidentified' -}; -/** - * Translation from legacy `keyCode` to HTML5 `key` - * Only special keys supported, all others depend on keyboard layout or browser - * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names - */ + warnedProperties$1[name] = true; + return true; + } // Let the ARIA attribute hook validate ARIA attributes -var translateToKey = { - '8': 'Backspace', - '9': 'Tab', - '12': 'Clear', - '13': 'Enter', - '16': 'Shift', - '17': 'Control', - '18': 'Alt', - '19': 'Pause', - '20': 'CapsLock', - '27': 'Escape', - '32': ' ', - '33': 'PageUp', - '34': 'PageDown', - '35': 'End', - '36': 'Home', - '37': 'ArrowLeft', - '38': 'ArrowUp', - '39': 'ArrowRight', - '40': 'ArrowDown', - '45': 'Insert', - '46': 'Delete', - '112': 'F1', - '113': 'F2', - '114': 'F3', - '115': 'F4', - '116': 'F5', - '117': 'F6', - '118': 'F7', - '119': 'F8', - '120': 'F9', - '121': 'F10', - '122': 'F11', - '123': 'F12', - '144': 'NumLock', - '145': 'ScrollLock', - '224': 'Meta' -}; -/** - * @param {object} nativeEvent Native browser event. - * @return {string} Normalized `key` property. - */ -function getEventKey(nativeEvent) { - if (nativeEvent.key) { - // Normalize inconsistent values reported by browsers due to - // implementations of a working draft specification. - // FireFox implements `key` but returns `MozPrintableKey` for all - // printable characters (normalized to `Unidentified`), ignore it. - var key = normalizeKey[nativeEvent.key] || nativeEvent.key; + if (rARIA$1.test(name) || rARIACamel$1.test(name)) { + return true; + } - if (key !== 'Unidentified') { - return key; - } - } // Browser does not implement `key`, polyfill as much of it as we can. + if (lowerCasedName === 'innerhtml') { + error('Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.'); + warnedProperties$1[name] = true; + return true; + } - if (nativeEvent.type === 'keypress') { - var charCode = getEventCharCode(nativeEvent); // The enter-key is technically both printable and non-printable and can - // thus be captured by `keypress`, no other non-printable key should. + if (lowerCasedName === 'aria') { + error('The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.'); - return charCode === 13 ? 'Enter' : String.fromCharCode(charCode); - } + warnedProperties$1[name] = true; + return true; + } - if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') { - // While user keyboard layout determines the actual meaning of each - // `keyCode` value, almost all function keys have a universal value. - return translateToKey[nativeEvent.keyCode] || 'Unidentified'; - } + if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') { + error('Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value); - return ''; -} + warnedProperties$1[name] = true; + return true; + } -/** - * Translation from modifier key to the associated property in the event. - * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers - */ -var modifierKeyToProp = { - Alt: 'altKey', - Control: 'ctrlKey', - Meta: 'metaKey', - Shift: 'shiftKey' -}; // Older browsers (Safari <= 10, iOS Safari <= 10.2) do not support -// getModifierState. If getModifierState is not supported, we map it to a set of -// modifier keys exposed by the event. In this case, Lock-keys are not supported. - -function modifierStateGetter(keyArg) { - var syntheticEvent = this; - var nativeEvent = syntheticEvent.nativeEvent; - - if (nativeEvent.getModifierState) { - return nativeEvent.getModifierState(keyArg); - } - - var keyProp = modifierKeyToProp[keyArg]; - return keyProp ? !!nativeEvent[keyProp] : false; -} - -function getEventModifierState(nativeEvent) { - return modifierStateGetter; -} - -/** - * @interface KeyboardEvent - * @see http://www.w3.org/TR/DOM-Level-3-Events/ - */ + if (typeof value === 'number' && isNaN(value)) { + error('Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name); -var SyntheticKeyboardEvent = SyntheticUIEvent.extend({ - key: getEventKey, - location: null, - ctrlKey: null, - shiftKey: null, - altKey: null, - metaKey: null, - repeat: null, - locale: null, - getModifierState: getEventModifierState, - // Legacy Interface - charCode: function (event) { - // `charCode` is the result of a KeyPress event and represents the value of - // the actual printable character. - // KeyPress is deprecated, but its replacement is not yet final and not - // implemented in any major browser. Only KeyPress has charCode. - if (event.type === 'keypress') { - return getEventCharCode(event); - } + warnedProperties$1[name] = true; + return true; + } - return 0; - }, - keyCode: function (event) { - // `keyCode` is the result of a KeyDown/Up event and represents the value of - // physical keyboard key. - // The actual meaning of the value depends on the users' keyboard layout - // which cannot be detected. Assuming that it is a US keyboard layout - // provides a surprisingly accurate mapping for US and European users. - // Due to this, it is left to the user to implement at this time. - if (event.type === 'keydown' || event.type === 'keyup') { - return event.keyCode; - } + var propertyInfo = getPropertyInfo(name); + var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config. - return 0; - }, - which: function (event) { - // `which` is an alias for either `keyCode` or `charCode` depending on the - // type of the event. - if (event.type === 'keypress') { - return getEventCharCode(event); - } + if (possibleStandardNames.hasOwnProperty(lowerCasedName)) { + var standardName = possibleStandardNames[lowerCasedName]; - if (event.type === 'keydown' || event.type === 'keyup') { - return event.keyCode; - } + if (standardName !== name) { + error('Invalid DOM property `%s`. Did you mean `%s`?', name, standardName); - return 0; - } -}); + warnedProperties$1[name] = true; + return true; + } + } else if (!isReserved && name !== lowerCasedName) { + // Unknown attributes should have lowercase casing since that's how they + // will be cased anyway with server rendering. + error('React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.', name, lowerCasedName); -var previousScreenX = 0; -var previousScreenY = 0; // Use flags to signal movementX/Y has already been set + warnedProperties$1[name] = true; + return true; + } -var isMovementXSet = false; -var isMovementYSet = false; -/** - * @interface MouseEvent - * @see http://www.w3.org/TR/DOM-Level-3-Events/ - */ + if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) { + if (value) { + error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.', value, name, name, value, name); + } else { + error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name); + } -var SyntheticMouseEvent = SyntheticUIEvent.extend({ - screenX: null, - screenY: null, - clientX: null, - clientY: null, - pageX: null, - pageY: null, - ctrlKey: null, - shiftKey: null, - altKey: null, - metaKey: null, - getModifierState: getEventModifierState, - button: null, - buttons: null, - relatedTarget: function (event) { - return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement); - }, - movementX: function (event) { - if ('movementX' in event) { - return event.movementX; - } - - var screenX = previousScreenX; - previousScreenX = event.screenX; - - if (!isMovementXSet) { - isMovementXSet = true; - return 0; - } + warnedProperties$1[name] = true; + return true; + } // Now that we've validated casing, do not validate + // data types for reserved props - return event.type === 'mousemove' ? event.screenX - screenX : 0; - }, - movementY: function (event) { - if ('movementY' in event) { - return event.movementY; - } - var screenY = previousScreenY; - previousScreenY = event.screenY; + if (isReserved) { + return true; + } // Warn when a known attribute is a bad type - if (!isMovementYSet) { - isMovementYSet = true; - return 0; - } - return event.type === 'mousemove' ? event.screenY - screenY : 0; - } -}); + if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) { + warnedProperties$1[name] = true; + return false; + } // Warn when passing the strings 'false' or 'true' into a boolean prop -/** - * @interface PointerEvent - * @see http://www.w3.org/TR/pointerevents/ - */ -var SyntheticPointerEvent = SyntheticMouseEvent.extend({ - pointerId: null, - width: null, - height: null, - pressure: null, - tangentialPressure: null, - tiltX: null, - tiltY: null, - twist: null, - pointerType: null, - isPrimary: null -}); - -/** - * @interface DragEvent - * @see http://www.w3.org/TR/DOM-Level-3-Events/ - */ + if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) { + error('Received the string `%s` for the boolean attribute `%s`. ' + '%s ' + 'Did you mean %s={%s}?', value, name, value === 'false' ? 'The browser will interpret it as a truthy value.' : 'Although this works, it will not work as expected if you pass the string "false".', name, value); -var SyntheticDragEvent = SyntheticMouseEvent.extend({ - dataTransfer: null -}); + warnedProperties$1[name] = true; + return true; + } -/** - * @interface TouchEvent - * @see http://www.w3.org/TR/touch-events/ - */ + return true; + }; + } -var SyntheticTouchEvent = SyntheticUIEvent.extend({ - touches: null, - targetTouches: null, - changedTouches: null, - altKey: null, - metaKey: null, - ctrlKey: null, - shiftKey: null, - getModifierState: getEventModifierState -}); - -/** - * @interface Event - * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events- - * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent - */ + var warnUnknownProperties = function (type, props, canUseEventSystem) { + { + var unknownProps = []; -var SyntheticTransitionEvent = SyntheticEvent.extend({ - propertyName: null, - elapsedTime: null, - pseudoElement: null -}); + for (var key in props) { + var isValid = validateProperty$1(type, key, props[key], canUseEventSystem); -/** - * @interface WheelEvent - * @see http://www.w3.org/TR/DOM-Level-3-Events/ - */ + if (!isValid) { + unknownProps.push(key); + } + } -var SyntheticWheelEvent = SyntheticMouseEvent.extend({ - deltaX: function (event) { - return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive). - 'wheelDeltaX' in event ? -event.wheelDeltaX : 0; - }, - deltaY: function (event) { - return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive). - 'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive). - 'wheelDelta' in event ? -event.wheelDelta : 0; - }, - deltaZ: null, - // Browsers without "deltaMode" is reporting in raw wheel delta where one - // notch on the scroll is always +/- 120, roughly equivalent to pixels. - // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or - // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size. - deltaMode: null -}); - -/** - * Turns - * ['abort', ...] - * into - * eventTypes = { - * 'abort': { - * phasedRegistrationNames: { - * bubbled: 'onAbort', - * captured: 'onAbortCapture', - * }, - * dependencies: [TOP_ABORT], - * }, - * ... - * }; - * topLevelEventsToDispatchConfig = new Map([ - * [TOP_ABORT, { sameConfig }], - * ]); - */ + var unknownPropString = unknownProps.map(function (prop) { + return '`' + prop + '`'; + }).join(', '); -var eventTuples = [// Discrete events -[TOP_BLUR, 'blur', DiscreteEvent], [TOP_CANCEL, 'cancel', DiscreteEvent], [TOP_CLICK, 'click', DiscreteEvent], [TOP_CLOSE, 'close', DiscreteEvent], [TOP_CONTEXT_MENU, 'contextMenu', DiscreteEvent], [TOP_COPY, 'copy', DiscreteEvent], [TOP_CUT, 'cut', DiscreteEvent], [TOP_AUX_CLICK, 'auxClick', DiscreteEvent], [TOP_DOUBLE_CLICK, 'doubleClick', DiscreteEvent], [TOP_DRAG_END, 'dragEnd', DiscreteEvent], [TOP_DRAG_START, 'dragStart', DiscreteEvent], [TOP_DROP, 'drop', DiscreteEvent], [TOP_FOCUS, 'focus', DiscreteEvent], [TOP_INPUT, 'input', DiscreteEvent], [TOP_INVALID, 'invalid', DiscreteEvent], [TOP_KEY_DOWN, 'keyDown', DiscreteEvent], [TOP_KEY_PRESS, 'keyPress', DiscreteEvent], [TOP_KEY_UP, 'keyUp', DiscreteEvent], [TOP_MOUSE_DOWN, 'mouseDown', DiscreteEvent], [TOP_MOUSE_UP, 'mouseUp', DiscreteEvent], [TOP_PASTE, 'paste', DiscreteEvent], [TOP_PAUSE, 'pause', DiscreteEvent], [TOP_PLAY, 'play', DiscreteEvent], [TOP_POINTER_CANCEL, 'pointerCancel', DiscreteEvent], [TOP_POINTER_DOWN, 'pointerDown', DiscreteEvent], [TOP_POINTER_UP, 'pointerUp', DiscreteEvent], [TOP_RATE_CHANGE, 'rateChange', DiscreteEvent], [TOP_RESET, 'reset', DiscreteEvent], [TOP_SEEKED, 'seeked', DiscreteEvent], [TOP_SUBMIT, 'submit', DiscreteEvent], [TOP_TOUCH_CANCEL, 'touchCancel', DiscreteEvent], [TOP_TOUCH_END, 'touchEnd', DiscreteEvent], [TOP_TOUCH_START, 'touchStart', DiscreteEvent], [TOP_VOLUME_CHANGE, 'volumeChange', DiscreteEvent], // User-blocking events -[TOP_DRAG, 'drag', UserBlockingEvent], [TOP_DRAG_ENTER, 'dragEnter', UserBlockingEvent], [TOP_DRAG_EXIT, 'dragExit', UserBlockingEvent], [TOP_DRAG_LEAVE, 'dragLeave', UserBlockingEvent], [TOP_DRAG_OVER, 'dragOver', UserBlockingEvent], [TOP_MOUSE_MOVE, 'mouseMove', UserBlockingEvent], [TOP_MOUSE_OUT, 'mouseOut', UserBlockingEvent], [TOP_MOUSE_OVER, 'mouseOver', UserBlockingEvent], [TOP_POINTER_MOVE, 'pointerMove', UserBlockingEvent], [TOP_POINTER_OUT, 'pointerOut', UserBlockingEvent], [TOP_POINTER_OVER, 'pointerOver', UserBlockingEvent], [TOP_SCROLL, 'scroll', UserBlockingEvent], [TOP_TOGGLE, 'toggle', UserBlockingEvent], [TOP_TOUCH_MOVE, 'touchMove', UserBlockingEvent], [TOP_WHEEL, 'wheel', UserBlockingEvent], // Continuous events -[TOP_ABORT, 'abort', ContinuousEvent], [TOP_ANIMATION_END, 'animationEnd', ContinuousEvent], [TOP_ANIMATION_ITERATION, 'animationIteration', ContinuousEvent], [TOP_ANIMATION_START, 'animationStart', ContinuousEvent], [TOP_CAN_PLAY, 'canPlay', ContinuousEvent], [TOP_CAN_PLAY_THROUGH, 'canPlayThrough', ContinuousEvent], [TOP_DURATION_CHANGE, 'durationChange', ContinuousEvent], [TOP_EMPTIED, 'emptied', ContinuousEvent], [TOP_ENCRYPTED, 'encrypted', ContinuousEvent], [TOP_ENDED, 'ended', ContinuousEvent], [TOP_ERROR, 'error', ContinuousEvent], [TOP_GOT_POINTER_CAPTURE, 'gotPointerCapture', ContinuousEvent], [TOP_LOAD, 'load', ContinuousEvent], [TOP_LOADED_DATA, 'loadedData', ContinuousEvent], [TOP_LOADED_METADATA, 'loadedMetadata', ContinuousEvent], [TOP_LOAD_START, 'loadStart', ContinuousEvent], [TOP_LOST_POINTER_CAPTURE, 'lostPointerCapture', ContinuousEvent], [TOP_PLAYING, 'playing', ContinuousEvent], [TOP_PROGRESS, 'progress', ContinuousEvent], [TOP_SEEKING, 'seeking', ContinuousEvent], [TOP_STALLED, 'stalled', ContinuousEvent], [TOP_SUSPEND, 'suspend', ContinuousEvent], [TOP_TIME_UPDATE, 'timeUpdate', ContinuousEvent], [TOP_TRANSITION_END, 'transitionEnd', ContinuousEvent], [TOP_WAITING, 'waiting', ContinuousEvent]]; -var eventTypes = {}; -var topLevelEventsToDispatchConfig = {}; - -for (var i = 0; i < eventTuples.length; i++) { - var eventTuple = eventTuples[i]; - var topEvent = eventTuple[0]; - var event = eventTuple[1]; - var eventPriority = eventTuple[2]; - var capitalizedEvent = event[0].toUpperCase() + event.slice(1); - var onEvent = 'on' + capitalizedEvent; - var config = { - phasedRegistrationNames: { - bubbled: onEvent, - captured: onEvent + 'Capture' - }, - dependencies: [topEvent], - eventPriority: eventPriority - }; - eventTypes[event] = config; - topLevelEventsToDispatchConfig[topEvent] = config; -} // Only used in DEV for exhaustiveness validation. - - -var knownHTMLTopLevelTypes = [TOP_ABORT, TOP_CANCEL, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_CLOSE, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_INPUT, TOP_INVALID, TOP_LOAD, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_RESET, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUBMIT, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_TOGGLE, TOP_VOLUME_CHANGE, TOP_WAITING]; -var SimpleEventPlugin = { - eventTypes: eventTypes, - getEventPriority: function (topLevelType) { - var config = topLevelEventsToDispatchConfig[topLevelType]; - return config !== undefined ? config.eventPriority : ContinuousEvent; - }, - extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) { - var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType]; - - if (!dispatchConfig) { - return null; + if (unknownProps.length === 1) { + error('Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type); + } else if (unknownProps.length > 1) { + error('Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type); + } } + }; - var EventConstructor; + function validateProperties$2(type, props, canUseEventSystem) { + if (isCustomComponent(type, props)) { + return; + } - switch (topLevelType) { - case TOP_KEY_PRESS: - // Firefox creates a keypress event for function keys too. This removes - // the unwanted keypress events. Enter is however both printable and - // non-printable. One would expect Tab to be as well (but it isn't). - if (getEventCharCode(nativeEvent) === 0) { - return null; - } + warnUnknownProperties(type, props, canUseEventSystem); + } + + var didWarnInvalidHydration = false; + var DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML'; + var SUPPRESS_CONTENT_EDITABLE_WARNING = 'suppressContentEditableWarning'; + var SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning'; + var AUTOFOCUS = 'autoFocus'; + var CHILDREN = 'children'; + var STYLE = 'style'; + var HTML$1 = '__html'; + var HTML_NAMESPACE$1 = Namespaces.html; + var warnedUnknownTags; + var suppressHydrationWarning; + var validatePropertiesInDevelopment; + var warnForTextDifference; + var warnForPropDifference; + var warnForExtraAttributes; + var warnForInvalidEventListener; + var canDiffStyleForHydrationWarning; + var normalizeMarkupForTextOrAttribute; + var normalizeHTML; - /* falls through */ + { + warnedUnknownTags = { + // Chrome is the only major browser not shipping <time>. But as of July + // 2017 it intends to ship it due to widespread usage. We intentionally + // *don't* warn for <time> even if it's unrecognized by Chrome because + // it soon will be, and many apps have been using it anyway. + time: true, + // There are working polyfills for <dialog>. Let people use it. + dialog: true, + // Electron ships a custom <webview> tag to display external web content in + // an isolated frame and process. + // This tag is not present in non Electron environments such as JSDom which + // is often used for testing purposes. + // @see https://electronjs.org/docs/api/webview-tag + webview: true + }; - case TOP_KEY_DOWN: - case TOP_KEY_UP: - EventConstructor = SyntheticKeyboardEvent; - break; + validatePropertiesInDevelopment = function (type, props) { + validateProperties(type, props); + validateProperties$1(type, props); + validateProperties$2(type, props, + /* canUseEventSystem */ + true); + }; // IE 11 parses & normalizes the style attribute as opposed to other + // browsers. It adds spaces and sorts the properties in some + // non-alphabetical order. Handling that would require sorting CSS + // properties in the client & server versions or applying + // `expectedStyle` to a temporary DOM node to read its `style` attribute + // normalized. Since it only affects IE, we're skipping style warnings + // in that browser completely in favor of doing all that work. + // See https://github.com/facebook/react/issues/11807 + + + canDiffStyleForHydrationWarning = canUseDOM && !document.documentMode; // HTML parsing normalizes CR and CRLF to LF. + // It also can turn \u0000 into \uFFFD inside attributes. + // https://www.w3.org/TR/html5/single-page.html#preprocessing-the-input-stream + // If we have a mismatch, it might be caused by that. + // We will still patch up in this case but not fire the warning. + + var NORMALIZE_NEWLINES_REGEX = /\r\n?/g; + var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\u0000|\uFFFD/g; + + normalizeMarkupForTextOrAttribute = function (markup) { + var markupString = typeof markup === 'string' ? markup : '' + markup; + return markupString.replace(NORMALIZE_NEWLINES_REGEX, '\n').replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, ''); + }; - case TOP_BLUR: - case TOP_FOCUS: - EventConstructor = SyntheticFocusEvent; - break; + warnForTextDifference = function (serverText, clientText) { + if (didWarnInvalidHydration) { + return; + } - case TOP_CLICK: - // Firefox creates a click event on right mouse clicks. This removes the - // unwanted click events. - if (nativeEvent.button === 2) { - return null; - } + var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText); + var normalizedServerText = normalizeMarkupForTextOrAttribute(serverText); - /* falls through */ + if (normalizedServerText === normalizedClientText) { + return; + } - case TOP_AUX_CLICK: - case TOP_DOUBLE_CLICK: - case TOP_MOUSE_DOWN: - case TOP_MOUSE_MOVE: - case TOP_MOUSE_UP: // TODO: Disabled elements should not respond to mouse events + didWarnInvalidHydration = true; - /* falls through */ + error('Text content did not match. Server: "%s" Client: "%s"', normalizedServerText, normalizedClientText); + }; - case TOP_MOUSE_OUT: - case TOP_MOUSE_OVER: - case TOP_CONTEXT_MENU: - EventConstructor = SyntheticMouseEvent; - break; + warnForPropDifference = function (propName, serverValue, clientValue) { + if (didWarnInvalidHydration) { + return; + } - case TOP_DRAG: - case TOP_DRAG_END: - case TOP_DRAG_ENTER: - case TOP_DRAG_EXIT: - case TOP_DRAG_LEAVE: - case TOP_DRAG_OVER: - case TOP_DRAG_START: - case TOP_DROP: - EventConstructor = SyntheticDragEvent; - break; + var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue); + var normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue); - case TOP_TOUCH_CANCEL: - case TOP_TOUCH_END: - case TOP_TOUCH_MOVE: - case TOP_TOUCH_START: - EventConstructor = SyntheticTouchEvent; - break; + if (normalizedServerValue === normalizedClientValue) { + return; + } - case TOP_ANIMATION_END: - case TOP_ANIMATION_ITERATION: - case TOP_ANIMATION_START: - EventConstructor = SyntheticAnimationEvent; - break; + didWarnInvalidHydration = true; - case TOP_TRANSITION_END: - EventConstructor = SyntheticTransitionEvent; - break; + error('Prop `%s` did not match. Server: %s Client: %s', propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue)); + }; - case TOP_SCROLL: - EventConstructor = SyntheticUIEvent; - break; + warnForExtraAttributes = function (attributeNames) { + if (didWarnInvalidHydration) { + return; + } - case TOP_WHEEL: - EventConstructor = SyntheticWheelEvent; - break; + didWarnInvalidHydration = true; + var names = []; + attributeNames.forEach(function (name) { + names.push(name); + }); - case TOP_COPY: - case TOP_CUT: - case TOP_PASTE: - EventConstructor = SyntheticClipboardEvent; - break; + error('Extra attributes from the server: %s', names); + }; - case TOP_GOT_POINTER_CAPTURE: - case TOP_LOST_POINTER_CAPTURE: - case TOP_POINTER_CANCEL: - case TOP_POINTER_DOWN: - case TOP_POINTER_MOVE: - case TOP_POINTER_OUT: - case TOP_POINTER_OVER: - case TOP_POINTER_UP: - EventConstructor = SyntheticPointerEvent; - break; + warnForInvalidEventListener = function (registrationName, listener) { + if (listener === false) { + error('Expected `%s` listener to be a function, instead got `false`.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', registrationName, registrationName, registrationName); + } else { + error('Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener); + } + }; // Parse the HTML and read it back to normalize the HTML string so that it + // can be used for comparison. - default: - { - if (knownHTMLTopLevelTypes.indexOf(topLevelType) === -1) { - warningWithoutStack$1(false, 'SimpleEventPlugin: Unhandled event type, `%s`. This warning ' + 'is likely caused by a bug in React. Please file an issue.', topLevelType); - } - } // HTML Events - // @see http://www.w3.org/TR/html5/index.html#events-0 + normalizeHTML = function (parent, html) { + // We could have created a separate document here to avoid + // re-initializing custom elements if they exist. But this breaks + // how <noscript> is being handled. So we use the same document. + // See the discussion in https://github.com/facebook/react/pull/11157. + var testElement = parent.namespaceURI === HTML_NAMESPACE$1 ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName); + testElement.innerHTML = html; + return testElement.innerHTML; + }; + } - EventConstructor = SyntheticEvent; - break; - } + function ensureListeningTo(rootContainerElement, registrationName) { + var isDocumentOrFragment = rootContainerElement.nodeType === DOCUMENT_NODE || rootContainerElement.nodeType === DOCUMENT_FRAGMENT_NODE; + var doc = isDocumentOrFragment ? rootContainerElement : rootContainerElement.ownerDocument; + legacyListenToEvent(registrationName, doc); + } - var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget); - accumulateTwoPhaseDispatches(event); - return event; + function getOwnerDocumentFromRootContainer(rootContainerElement) { + return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument; } -}; -var passiveBrowserEventsSupported = false; // Check if browser support events with passive listeners -// https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support + function noop() {} -if (enableFlareAPI && canUseDOM) { - try { - var options = {}; // $FlowFixMe: Ignore Flow complaining about needing a value + function trapClickOnNonInteractiveElement(node) { + // Mobile Safari does not fire properly bubble click events on + // non-interactive elements, which means delegated click listeners do not + // fire. The workaround for this bug involves attaching an empty click + // listener on the target node. + // http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html + // Just set it using the onclick property so that we don't have to manage any + // bookkeeping for it. Not sure if we need to clear it when the listener is + // removed. + // TODO: Only do this for the relevant Safaris maybe? + node.onclick = noop; + } - Object.defineProperty(options, 'passive', { - get: function () { - passiveBrowserEventsSupported = true; + function setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) { + for (var propKey in nextProps) { + if (!nextProps.hasOwnProperty(propKey)) { + continue; } - }); - window.addEventListener('test', options, options); - window.removeEventListener('test', options, options); - } catch (e) { - passiveBrowserEventsSupported = false; - } -} - -// Intentionally not named imports because Rollup would use dynamic dispatch for -// CommonJS interop named imports. -var UserBlockingPriority$1 = unstable_UserBlockingPriority; -var runWithPriority$1 = unstable_runWithPriority; -var getEventPriority = SimpleEventPlugin.getEventPriority; -var CALLBACK_BOOKKEEPING_POOL_SIZE = 10; -var callbackBookkeepingPool = []; - -/** - * Find the deepest React component completely containing the root of the - * passed-in instance (for use when entire React trees are nested within each - * other). If React trees are not nested, returns null. - */ -function findRootContainerNode(inst) { - if (inst.tag === HostRoot) { - return inst.stateNode.containerInfo; - } // TODO: It may be a good idea to cache this to prevent unnecessary DOM - // traversal, but caching is difficult to do correctly without using a - // mutation observer to listen for all DOM changes. + var nextProp = nextProps[propKey]; - while (inst.return) { - inst = inst.return; - } + if (propKey === STYLE) { + { + if (nextProp) { + // Freeze the next style object so that we can assume it won't be + // mutated. We have already warned for this in the past. + Object.freeze(nextProp); + } + } // Relies on `updateStylesByID` not mutating `styleUpdates`. - if (inst.tag !== HostRoot) { - // This can happen if we're in a detached tree. - return null; - } - return inst.stateNode.containerInfo; -} // Used to store ancestor hierarchy in top level callback + setValueForStyles(domElement, nextProp); + } else if (propKey === DANGEROUSLY_SET_INNER_HTML) { + var nextHtml = nextProp ? nextProp[HTML$1] : undefined; + if (nextHtml != null) { + setInnerHTML(domElement, nextHtml); + } + } else if (propKey === CHILDREN) { + if (typeof nextProp === 'string') { + // Avoid setting initial textContent when the text is empty. In IE11 setting + // textContent on a <textarea> will cause the placeholder to not + // show within the <textarea> until it has been focused and blurred again. + // https://github.com/facebook/react/issues/6731#issuecomment-254874553 + var canSetTextContent = tag !== 'textarea' || nextProp !== ''; -function getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst, eventSystemFlags) { - if (callbackBookkeepingPool.length) { - var instance = callbackBookkeepingPool.pop(); - instance.topLevelType = topLevelType; - instance.eventSystemFlags = eventSystemFlags; - instance.nativeEvent = nativeEvent; - instance.targetInst = targetInst; - return instance; - } + if (canSetTextContent) { + setTextContent(domElement, nextProp); + } + } else if (typeof nextProp === 'number') { + setTextContent(domElement, '' + nextProp); + } + } else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameModules.hasOwnProperty(propKey)) { + if (nextProp != null) { + if ( typeof nextProp !== 'function') { + warnForInvalidEventListener(propKey, nextProp); + } - return { - topLevelType: topLevelType, - eventSystemFlags: eventSystemFlags, - nativeEvent: nativeEvent, - targetInst: targetInst, - ancestors: [] - }; -} + ensureListeningTo(rootContainerElement, propKey); + } + } else if (nextProp != null) { + setValueForProperty(domElement, propKey, nextProp, isCustomComponentTag); + } + } + } -function releaseTopLevelCallbackBookKeeping(instance) { - instance.topLevelType = null; - instance.nativeEvent = null; - instance.targetInst = null; - instance.ancestors.length = 0; + function updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) { + // TODO: Handle wasCustomComponentTag + for (var i = 0; i < updatePayload.length; i += 2) { + var propKey = updatePayload[i]; + var propValue = updatePayload[i + 1]; - if (callbackBookkeepingPool.length < CALLBACK_BOOKKEEPING_POOL_SIZE) { - callbackBookkeepingPool.push(instance); + if (propKey === STYLE) { + setValueForStyles(domElement, propValue); + } else if (propKey === DANGEROUSLY_SET_INNER_HTML) { + setInnerHTML(domElement, propValue); + } else if (propKey === CHILDREN) { + setTextContent(domElement, propValue); + } else { + setValueForProperty(domElement, propKey, propValue, isCustomComponentTag); + } + } } -} -function handleTopLevel(bookKeeping) { - var targetInst = bookKeeping.targetInst; // Loop through the hierarchy, in case there's any nested components. - // It's important that we build the array of ancestors before calling any - // event handlers, because event handlers can modify the DOM, leading to - // inconsistencies with ReactMount's node cache. See #1105. + function createElement(type, props, rootContainerElement, parentNamespace) { + var isCustomComponentTag; // We create tags in the namespace of their parent container, except HTML + // tags get no namespace. - var ancestor = targetInst; + var ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement); + var domElement; + var namespaceURI = parentNamespace; - do { - if (!ancestor) { - var ancestors = bookKeeping.ancestors; - ancestors.push(ancestor); - break; + if (namespaceURI === HTML_NAMESPACE$1) { + namespaceURI = getIntrinsicNamespace(type); } - var root = findRootContainerNode(ancestor); - - if (!root) { - break; - } + if (namespaceURI === HTML_NAMESPACE$1) { + { + isCustomComponentTag = isCustomComponent(type, props); // Should this check be gated by parent namespace? Not sure we want to + // allow <SVG> or <mATH>. - var tag = ancestor.tag; + if (!isCustomComponentTag && type !== type.toLowerCase()) { + error('<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', type); + } + } - if (tag === HostComponent || tag === HostText) { - bookKeeping.ancestors.push(ancestor); - } + if (type === 'script') { + // Create the script via .innerHTML so its "parser-inserted" flag is + // set to true and it does not execute + var div = ownerDocument.createElement('div'); - ancestor = getClosestInstanceFromNode(root); - } while (ancestor); + div.innerHTML = '<script><' + '/script>'; // eslint-disable-line + // This is guaranteed to yield a script element. - for (var i = 0; i < bookKeeping.ancestors.length; i++) { - targetInst = bookKeeping.ancestors[i]; - var eventTarget = getEventTarget(bookKeeping.nativeEvent); - var topLevelType = bookKeeping.topLevelType; - var nativeEvent = bookKeeping.nativeEvent; - runExtractedPluginEventsInBatch(topLevelType, targetInst, nativeEvent, eventTarget, bookKeeping.eventSystemFlags); - } -} // TODO: can we stop exporting these? - - -var _enabled = true; -function setEnabled(enabled) { - _enabled = !!enabled; -} -function isEnabled() { - return _enabled; -} -function trapBubbledEvent(topLevelType, element) { - trapEventForPluginEventSystem(element, topLevelType, false); -} -function trapCapturedEvent(topLevelType, element) { - trapEventForPluginEventSystem(element, topLevelType, true); -} -function trapEventForResponderEventSystem(element, topLevelType, passive) { - if (enableFlareAPI) { - var rawEventName = getRawEventName(topLevelType); - var eventFlags = RESPONDER_EVENT_SYSTEM; // If passive option is not supported, then the event will be - // active and not passive, but we flag it as using not being - // supported too. This way the responder event plugins know, - // and can provide polyfills if needed. - - if (passive) { - if (passiveBrowserEventsSupported) { - eventFlags |= IS_PASSIVE; + var firstChild = div.firstChild; + domElement = div.removeChild(firstChild); + } else if (typeof props.is === 'string') { + // $FlowIssue `createElement` should be updated for Web Components + domElement = ownerDocument.createElement(type, { + is: props.is + }); } else { - eventFlags |= IS_ACTIVE; - eventFlags |= PASSIVE_NOT_SUPPORTED; - passive = false; + // Separate else branch instead of using `props.is || undefined` above because of a Firefox bug. + // See discussion in https://github.com/facebook/react/pull/6896 + // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240 + domElement = ownerDocument.createElement(type); // Normally attributes are assigned in `setInitialDOMProperties`, however the `multiple` and `size` + // attributes on `select`s needs to be added before `option`s are inserted. + // This prevents: + // - a bug where the `select` does not scroll to the correct option because singular + // `select` elements automatically pick the first item #13222 + // - a bug where the `select` set the first item as selected despite the `size` attribute #14239 + // See https://github.com/facebook/react/issues/13222 + // and https://github.com/facebook/react/issues/14239 + + if (type === 'select') { + var node = domElement; + + if (props.multiple) { + node.multiple = true; + } else if (props.size) { + // Setting a size greater than 1 causes a select to behave like `multiple=true`, where + // it is possible that no option is selected. + // + // This is only necessary when a select in "single selection mode". + node.size = props.size; + } + } } } else { - eventFlags |= IS_ACTIVE; - } // Check if interactive and wrap in discreteUpdates - - - var listener = dispatchEvent.bind(null, topLevelType, eventFlags); - - if (passiveBrowserEventsSupported) { - addEventCaptureListenerWithPassiveFlag(element, rawEventName, listener, passive); - } else { - addEventCaptureListener(element, rawEventName, listener); + domElement = ownerDocument.createElementNS(namespaceURI, type); } - } -} - -function trapEventForPluginEventSystem(element, topLevelType, capture) { - var listener; - switch (getEventPriority(topLevelType)) { - case DiscreteEvent: - listener = dispatchDiscreteEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM); - break; + { + if (namespaceURI === HTML_NAMESPACE$1) { + if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !Object.prototype.hasOwnProperty.call(warnedUnknownTags, type)) { + warnedUnknownTags[type] = true; - case UserBlockingEvent: - listener = dispatchUserBlockingUpdate.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM); - break; + error('The tag <%s> is unrecognized in this browser. ' + 'If you meant to render a React component, start its name with ' + 'an uppercase letter.', type); + } + } + } - case ContinuousEvent: - default: - listener = dispatchEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM); - break; + return domElement; } + function createTextNode(text, rootContainerElement) { + return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text); + } + function setInitialProperties(domElement, tag, rawProps, rootContainerElement) { + var isCustomComponentTag = isCustomComponent(tag, rawProps); - var rawEventName = getRawEventName(topLevelType); + { + validatePropertiesInDevelopment(tag, rawProps); + } // TODO: Make sure that we check isMounted before firing any of these events. - if (capture) { - addEventCaptureListener(element, rawEventName, listener); - } else { - addEventBubbleListener(element, rawEventName, listener); - } -} -function dispatchDiscreteEvent(topLevelType, eventSystemFlags, nativeEvent) { - flushDiscreteUpdatesIfNeeded(nativeEvent.timeStamp); - discreteUpdates(dispatchEvent, topLevelType, eventSystemFlags, nativeEvent); -} + var props; -function dispatchUserBlockingUpdate(topLevelType, eventSystemFlags, nativeEvent) { - runWithPriority$1(UserBlockingPriority$1, dispatchEvent.bind(null, topLevelType, eventSystemFlags, nativeEvent)); -} + switch (tag) { + case 'iframe': + case 'object': + case 'embed': + trapBubbledEvent(TOP_LOAD, domElement); + props = rawProps; + break; -function dispatchEventForPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst) { - var bookKeeping = getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst, eventSystemFlags); + case 'video': + case 'audio': + // Create listener for each media event + for (var i = 0; i < mediaEventTypes.length; i++) { + trapBubbledEvent(mediaEventTypes[i], domElement); + } - try { - // Event queue being processed in the same cycle allows - // `preventDefault`. - batchedEventUpdates(handleTopLevel, bookKeeping); - } finally { - releaseTopLevelCallbackBookKeeping(bookKeeping); - } -} + props = rawProps; + break; -function dispatchEvent(topLevelType, eventSystemFlags, nativeEvent) { - if (!_enabled) { - return; - } + case 'source': + trapBubbledEvent(TOP_ERROR, domElement); + props = rawProps; + break; - if (hasQueuedDiscreteEvents() && isReplayableDiscreteEvent(topLevelType)) { - // If we already have a queue of discrete events, and this is another discrete - // event, then we can't dispatch it regardless of its target, since they - // need to dispatch in order. - queueDiscreteEvent(null, // Flags that we're not actually blocked on anything as far as we know. - topLevelType, eventSystemFlags, nativeEvent); - return; - } + case 'img': + case 'image': + case 'link': + trapBubbledEvent(TOP_ERROR, domElement); + trapBubbledEvent(TOP_LOAD, domElement); + props = rawProps; + break; - var blockedOn = attemptToDispatchEvent(topLevelType, eventSystemFlags, nativeEvent); + case 'form': + trapBubbledEvent(TOP_RESET, domElement); + trapBubbledEvent(TOP_SUBMIT, domElement); + props = rawProps; + break; - if (blockedOn === null) { - // We successfully dispatched this event. - clearIfContinuousEvent(topLevelType, nativeEvent); - return; - } + case 'details': + trapBubbledEvent(TOP_TOGGLE, domElement); + props = rawProps; + break; - if (isReplayableDiscreteEvent(topLevelType)) { - // This this to be replayed later once the target is available. - queueDiscreteEvent(blockedOn, topLevelType, eventSystemFlags, nativeEvent); - return; - } + case 'input': + initWrapperState(domElement, rawProps); + props = getHostProps(domElement, rawProps); + trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening + // to onChange. Even if there is no listener. - if (queueIfContinuousEvent(blockedOn, topLevelType, eventSystemFlags, nativeEvent)) { - return; - } // We need to clear only if we didn't queue because - // queueing is accummulative. + ensureListeningTo(rootContainerElement, 'onChange'); + break; + case 'option': + validateProps(domElement, rawProps); + props = getHostProps$1(domElement, rawProps); + break; - clearIfContinuousEvent(topLevelType, nativeEvent); // This is not replayable so we'll invoke it but without a target, - // in case the event system needs to trace it. + case 'select': + initWrapperState$1(domElement, rawProps); + props = getHostProps$2(domElement, rawProps); + trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening + // to onChange. Even if there is no listener. - if (enableFlareAPI) { - if (eventSystemFlags & PLUGIN_EVENT_SYSTEM) { - dispatchEventForPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, null); - } + ensureListeningTo(rootContainerElement, 'onChange'); + break; - if (eventSystemFlags & RESPONDER_EVENT_SYSTEM) { - // React Flare event system - dispatchEventForResponderEventSystem(topLevelType, null, nativeEvent, getEventTarget(nativeEvent), eventSystemFlags); - } - } else { - dispatchEventForPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, null); - } -} // Attempt dispatching an event. Returns a SuspenseInstance or Container if it's blocked. + case 'textarea': + initWrapperState$2(domElement, rawProps); + props = getHostProps$3(domElement, rawProps); + trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening + // to onChange. Even if there is no listener. -function attemptToDispatchEvent(topLevelType, eventSystemFlags, nativeEvent) { - // TODO: Warn if _enabled is false. - var nativeEventTarget = getEventTarget(nativeEvent); - var targetInst = getClosestInstanceFromNode(nativeEventTarget); + ensureListeningTo(rootContainerElement, 'onChange'); + break; - if (targetInst !== null) { - var nearestMounted = getNearestMountedFiber(targetInst); + default: + props = rawProps; + } - if (nearestMounted === null) { - // This tree has been unmounted already. Dispatch without a target. - targetInst = null; - } else { - var tag = nearestMounted.tag; + assertValidProps(tag, props); + setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag); - if (tag === SuspenseComponent) { - var instance = getSuspenseInstanceFromFiber(nearestMounted); + switch (tag) { + case 'input': + // TODO: Make sure we check if this is still unmounted or do any clean + // up necessary since we never stop tracking anymore. + track(domElement); + postMountWrapper(domElement, rawProps, false); + break; - if (instance !== null) { - // Queue the event to be replayed later. Abort dispatching since we - // don't want this event dispatched twice through the event system. - // TODO: If this is the first discrete event in the queue. Schedule an increased - // priority for this boundary. - return instance; - } // This shouldn't happen, something went wrong but to avoid blocking - // the whole system, dispatch the event without a target. - // TODO: Warn. + case 'textarea': + // TODO: Make sure we check if this is still unmounted or do any clean + // up necessary since we never stop tracking anymore. + track(domElement); + postMountWrapper$3(domElement); + break; + case 'option': + postMountWrapper$1(domElement, rawProps); + break; - targetInst = null; - } else if (tag === HostRoot) { - var root = nearestMounted.stateNode; + case 'select': + postMountWrapper$2(domElement, rawProps); + break; - if (root.hydrate) { - // If this happens during a replay something went wrong and it might block - // the whole system. - return getContainerFromFiber(nearestMounted); + default: + if (typeof props.onClick === 'function') { + // TODO: This cast may not be sound for SVG, MathML or custom elements. + trapClickOnNonInteractiveElement(domElement); } - targetInst = null; - } else if (nearestMounted !== targetInst) { - // If we get an event (ex: img onload) before committing that - // component's mount, ignore it for now (that is, treat it as if it was an - // event on a non-React tree). We might also consider queueing events and - // dispatching them after the mount. - targetInst = null; - } - } - } - - if (enableFlareAPI) { - if (eventSystemFlags & PLUGIN_EVENT_SYSTEM) { - dispatchEventForPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst); + break; } + } // Calculate the diff between the two objects. - if (eventSystemFlags & RESPONDER_EVENT_SYSTEM) { - // React Flare event system - dispatchEventForResponderEventSystem(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags); + function diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) { + { + validatePropertiesInDevelopment(tag, nextRawProps); } - } else { - dispatchEventForPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst); - } // We're not blocked on anything. - - - return null; -} - -/** - * Checks if an event is supported in the current execution environment. - * - * NOTE: This will not work correctly for non-generic events such as `change`, - * `reset`, `load`, `error`, and `select`. - * - * Borrows from Modernizr. - * - * @param {string} eventNameSuffix Event name, e.g. "click". - * @return {boolean} True if the event is supported. - * @internal - * @license Modernizr 3.0.0pre (Custom Build) | MIT - */ - -function isEventSupported(eventNameSuffix) { - if (!canUseDOM) { - return false; - } - - var eventName = 'on' + eventNameSuffix; - var isSupported = eventName in document; - - if (!isSupported) { - var element = document.createElement('div'); - element.setAttribute(eventName, 'return;'); - isSupported = typeof element[eventName] === 'function'; - } - - return isSupported; -} - -/** - * Summary of `ReactBrowserEventEmitter` event handling: - * - * - Top-level delegation is used to trap most native browser events. This - * may only occur in the main thread and is the responsibility of - * ReactDOMEventListener, which is injected and can therefore support - * pluggable event sources. This is the only work that occurs in the main - * thread. - * - * - We normalize and de-duplicate events to account for browser quirks. This - * may be done in the worker thread. - * - * - Forward these native events (with the associated top-level type used to - * trap it) to `EventPluginHub`, which in turn will ask plugins if they want - * to extract any synthetic events. - * - * - The `EventPluginHub` will then process each event by annotating them with - * "dispatches", a sequence of listeners and IDs that care about that event. - * - * - The `EventPluginHub` then dispatches the events. - * - * Overview of React and the event system: - * - * +------------+ . - * | DOM | . - * +------------+ . - * | . - * v . - * +------------+ . - * | ReactEvent | . - * | Listener | . - * +------------+ . +-----------+ - * | . +--------+|SimpleEvent| - * | . | |Plugin | - * +-----|------+ . v +-----------+ - * | | | . +--------------+ +------------+ - * | +-----------.--->|EventPluginHub| | Event | - * | | . | | +-----------+ | Propagators| - * | ReactEvent | . | | |TapEvent | |------------| - * | Emitter | . | |<---+|Plugin | |other plugin| - * | | . | | +-----------+ | utilities | - * | +-----------.--->| | +------------+ - * | | | . +--------------+ - * +-----|------+ . ^ +-----------+ - * | . | |Enter/Leave| - * + . +-------+|Plugin | - * +-------------+ . +-----------+ - * | application | . - * |-------------| . - * | | . - * | | . - * +-------------+ . - * . - * React Core . General Purpose Event Plugin System - */ - -var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; -var elementListeningSets = new PossiblyWeakMap(); -function getListeningSetForElement(element) { - var listeningSet = elementListeningSets.get(element); - - if (listeningSet === undefined) { - listeningSet = new Set(); - elementListeningSets.set(element, listeningSet); - } - - return listeningSet; -} -/** - * We listen for bubbled touch events on the document object. - * - * Firefox v8.01 (and possibly others) exhibited strange behavior when - * mounting `onmousemove` events at some node that was not the document - * element. The symptoms were that if your mouse is not moving over something - * contained within that mount point (for example on the background) the - * top-level listeners for `onmousemove` won't be called. However, if you - * register the `mousemove` on the document object, then it will of course - * catch all `mousemove`s. This along with iOS quirks, justifies restricting - * top-level listeners to the document object only, at least for these - * movement types of events and possibly all events. - * - * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html - * - * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but - * they bubble to document. - * - * @param {string} registrationName Name of listener (e.g. `onClick`). - * @param {object} mountAt Container where to mount the listener - */ -function listenTo(registrationName, mountAt) { - var listeningSet = getListeningSetForElement(mountAt); - var dependencies = registrationNameDependencies[registrationName]; + var updatePayload = null; + var lastProps; + var nextProps; - for (var i = 0; i < dependencies.length; i++) { - var dependency = dependencies[i]; - listenToTopLevel(dependency, mountAt, listeningSet); - } -} -function listenToTopLevel(topLevelType, mountAt, listeningSet) { - if (!listeningSet.has(topLevelType)) { - switch (topLevelType) { - case TOP_SCROLL: - trapCapturedEvent(TOP_SCROLL, mountAt); + switch (tag) { + case 'input': + lastProps = getHostProps(domElement, lastRawProps); + nextProps = getHostProps(domElement, nextRawProps); + updatePayload = []; break; - case TOP_FOCUS: - case TOP_BLUR: - trapCapturedEvent(TOP_FOCUS, mountAt); - trapCapturedEvent(TOP_BLUR, mountAt); // We set the flag for a single dependency later in this function, - // but this ensures we mark both as attached rather than just one. - - listeningSet.add(TOP_BLUR); - listeningSet.add(TOP_FOCUS); + case 'option': + lastProps = getHostProps$1(domElement, lastRawProps); + nextProps = getHostProps$1(domElement, nextRawProps); + updatePayload = []; break; - case TOP_CANCEL: - case TOP_CLOSE: - if (isEventSupported(getRawEventName(topLevelType))) { - trapCapturedEvent(topLevelType, mountAt); - } - + case 'select': + lastProps = getHostProps$2(domElement, lastRawProps); + nextProps = getHostProps$2(domElement, nextRawProps); + updatePayload = []; break; - case TOP_INVALID: - case TOP_SUBMIT: - case TOP_RESET: - // We listen to them on the target DOM elements. - // Some of them bubble so we don't want them to fire twice. + case 'textarea': + lastProps = getHostProps$3(domElement, lastRawProps); + nextProps = getHostProps$3(domElement, nextRawProps); + updatePayload = []; break; default: - // By default, listen on the top level to all non-media events. - // Media events don't bubble so adding the listener wouldn't do anything. - var isMediaEvent = mediaEventTypes.indexOf(topLevelType) !== -1; + lastProps = lastRawProps; + nextProps = nextRawProps; - if (!isMediaEvent) { - trapBubbledEvent(topLevelType, mountAt); + if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') { + // TODO: This cast may not be sound for SVG, MathML or custom elements. + trapClickOnNonInteractiveElement(domElement); } break; } - listeningSet.add(topLevelType); - } -} -function isListeningToAllDependencies(registrationName, mountAt) { - var listeningSet = getListeningSetForElement(mountAt); - var dependencies = registrationNameDependencies[registrationName]; - - for (var i = 0; i < dependencies.length; i++) { - var dependency = dependencies[i]; - - if (!listeningSet.has(dependency)) { - return false; - } - } - - return true; -} - -// List derived from Gecko source code: -// https://github.com/mozilla/gecko-dev/blob/4e638efc71/layout/style/test/property_database.js -var shorthandToLonghand = { - animation: ['animationDelay', 'animationDirection', 'animationDuration', 'animationFillMode', 'animationIterationCount', 'animationName', 'animationPlayState', 'animationTimingFunction'], - background: ['backgroundAttachment', 'backgroundClip', 'backgroundColor', 'backgroundImage', 'backgroundOrigin', 'backgroundPositionX', 'backgroundPositionY', 'backgroundRepeat', 'backgroundSize'], - backgroundPosition: ['backgroundPositionX', 'backgroundPositionY'], - border: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth', 'borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth', 'borderLeftColor', 'borderLeftStyle', 'borderLeftWidth', 'borderRightColor', 'borderRightStyle', 'borderRightWidth', 'borderTopColor', 'borderTopStyle', 'borderTopWidth'], - borderBlockEnd: ['borderBlockEndColor', 'borderBlockEndStyle', 'borderBlockEndWidth'], - borderBlockStart: ['borderBlockStartColor', 'borderBlockStartStyle', 'borderBlockStartWidth'], - borderBottom: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth'], - borderColor: ['borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor'], - borderImage: ['borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth'], - borderInlineEnd: ['borderInlineEndColor', 'borderInlineEndStyle', 'borderInlineEndWidth'], - borderInlineStart: ['borderInlineStartColor', 'borderInlineStartStyle', 'borderInlineStartWidth'], - borderLeft: ['borderLeftColor', 'borderLeftStyle', 'borderLeftWidth'], - borderRadius: ['borderBottomLeftRadius', 'borderBottomRightRadius', 'borderTopLeftRadius', 'borderTopRightRadius'], - borderRight: ['borderRightColor', 'borderRightStyle', 'borderRightWidth'], - borderStyle: ['borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle'], - borderTop: ['borderTopColor', 'borderTopStyle', 'borderTopWidth'], - borderWidth: ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth'], - columnRule: ['columnRuleColor', 'columnRuleStyle', 'columnRuleWidth'], - columns: ['columnCount', 'columnWidth'], - flex: ['flexBasis', 'flexGrow', 'flexShrink'], - flexFlow: ['flexDirection', 'flexWrap'], - font: ['fontFamily', 'fontFeatureSettings', 'fontKerning', 'fontLanguageOverride', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition', 'fontWeight', 'lineHeight'], - fontVariant: ['fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition'], - gap: ['columnGap', 'rowGap'], - grid: ['gridAutoColumns', 'gridAutoFlow', 'gridAutoRows', 'gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'], - gridArea: ['gridColumnEnd', 'gridColumnStart', 'gridRowEnd', 'gridRowStart'], - gridColumn: ['gridColumnEnd', 'gridColumnStart'], - gridColumnGap: ['columnGap'], - gridGap: ['columnGap', 'rowGap'], - gridRow: ['gridRowEnd', 'gridRowStart'], - gridRowGap: ['rowGap'], - gridTemplate: ['gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'], - listStyle: ['listStyleImage', 'listStylePosition', 'listStyleType'], - margin: ['marginBottom', 'marginLeft', 'marginRight', 'marginTop'], - marker: ['markerEnd', 'markerMid', 'markerStart'], - mask: ['maskClip', 'maskComposite', 'maskImage', 'maskMode', 'maskOrigin', 'maskPositionX', 'maskPositionY', 'maskRepeat', 'maskSize'], - maskPosition: ['maskPositionX', 'maskPositionY'], - outline: ['outlineColor', 'outlineStyle', 'outlineWidth'], - overflow: ['overflowX', 'overflowY'], - padding: ['paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop'], - placeContent: ['alignContent', 'justifyContent'], - placeItems: ['alignItems', 'justifyItems'], - placeSelf: ['alignSelf', 'justifySelf'], - textDecoration: ['textDecorationColor', 'textDecorationLine', 'textDecorationStyle'], - textEmphasis: ['textEmphasisColor', 'textEmphasisStyle'], - transition: ['transitionDelay', 'transitionDuration', 'transitionProperty', 'transitionTimingFunction'], - wordWrap: ['overflowWrap'] -}; - -/** - * CSS properties which accept numbers but are not in units of "px". - */ -var isUnitlessNumber = { - animationIterationCount: true, - borderImageOutset: true, - borderImageSlice: true, - borderImageWidth: true, - boxFlex: true, - boxFlexGroup: true, - boxOrdinalGroup: true, - columnCount: true, - columns: true, - flex: true, - flexGrow: true, - flexPositive: true, - flexShrink: true, - flexNegative: true, - flexOrder: true, - gridArea: true, - gridRow: true, - gridRowEnd: true, - gridRowSpan: true, - gridRowStart: true, - gridColumn: true, - gridColumnEnd: true, - gridColumnSpan: true, - gridColumnStart: true, - fontWeight: true, - lineClamp: true, - lineHeight: true, - opacity: true, - order: true, - orphans: true, - tabSize: true, - widows: true, - zIndex: true, - zoom: true, - // SVG-related properties - fillOpacity: true, - floodOpacity: true, - stopOpacity: true, - strokeDasharray: true, - strokeDashoffset: true, - strokeMiterlimit: true, - strokeOpacity: true, - strokeWidth: true -}; -/** - * @param {string} prefix vendor-specific prefix, eg: Webkit - * @param {string} key style name, eg: transitionDuration - * @return {string} style name prefixed with `prefix`, properly camelCased, eg: - * WebkitTransitionDuration - */ + assertValidProps(tag, nextProps); + var propKey; + var styleName; + var styleUpdates = null; -function prefixKey(prefix, key) { - return prefix + key.charAt(0).toUpperCase() + key.substring(1); -} -/** - * Support style names that may come passed in prefixed by adding permutations - * of vendor prefixes. - */ + for (propKey in lastProps) { + if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) { + continue; + } + if (propKey === STYLE) { + var lastStyle = lastProps[propKey]; -var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an -// infinite loop, because it iterates over the newly added props too. + for (styleName in lastStyle) { + if (lastStyle.hasOwnProperty(styleName)) { + if (!styleUpdates) { + styleUpdates = {}; + } -Object.keys(isUnitlessNumber).forEach(function (prop) { - prefixes.forEach(function (prefix) { - isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop]; - }); -}); + styleUpdates[styleName] = ''; + } + } + } else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN) ; else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameModules.hasOwnProperty(propKey)) { + // This is a special case. If any listener updates we need to ensure + // that the "current" fiber pointer gets updated so we need a commit + // to update this element. + if (!updatePayload) { + updatePayload = []; + } + } else { + // For all other deleted properties we add it to the queue. We use + // the whitelist in the commit phase instead. + (updatePayload = updatePayload || []).push(propKey, null); + } + } -/** - * Convert a value into the proper css writable value. The style name `name` - * should be logical (no hyphens), as specified - * in `CSSProperty.isUnitlessNumber`. - * - * @param {string} name CSS property name such as `topMargin`. - * @param {*} value CSS property value such as `10px`. - * @return {string} Normalized style value with dimensions applied. - */ + for (propKey in nextProps) { + var nextProp = nextProps[propKey]; + var lastProp = lastProps != null ? lastProps[propKey] : undefined; -function dangerousStyleValue(name, value, isCustomProperty) { - // Note that we've removed escapeTextForBrowser() calls here since the - // whole string will be escaped when the attribute is injected into - // the markup. If you provide unsafe user data here they can inject - // arbitrary CSS which may be problematic (I couldn't repro this): - // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet - // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/ - // This is not an XSS hole but instead a potential CSS injection issue - // which has lead to a greater discussion about how we're going to - // trust URLs moving forward. See #2115901 - var isEmpty = value == null || typeof value === 'boolean' || value === ''; - - if (isEmpty) { - return ''; - } + if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) { + continue; + } - if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) { - return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers - } + if (propKey === STYLE) { + { + if (nextProp) { + // Freeze the next style object so that we can assume it won't be + // mutated. We have already warned for this in the past. + Object.freeze(nextProp); + } + } - return ('' + value).trim(); -} + if (lastProp) { + // Unset styles on `lastProp` but not on `nextProp`. + for (styleName in lastProp) { + if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) { + if (!styleUpdates) { + styleUpdates = {}; + } -var uppercasePattern = /([A-Z])/g; -var msPattern = /^ms-/; -/** - * Hyphenates a camelcased CSS property name, for example: - * - * > hyphenateStyleName('backgroundColor') - * < "background-color" - * > hyphenateStyleName('MozTransition') - * < "-moz-transition" - * > hyphenateStyleName('msTransition') - * < "-ms-transition" - * - * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix - * is converted to `-ms-`. - */ + styleUpdates[styleName] = ''; + } + } // Update styles that changed since `lastProp`. -function hyphenateStyleName(name) { - return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-'); -} -var warnValidStyle = function () {}; + for (styleName in nextProp) { + if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) { + if (!styleUpdates) { + styleUpdates = {}; + } -{ - // 'msTransform' is correct, but the other prefixes should be capitalized - var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/; - var msPattern$1 = /^-ms-/; - var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon + styleUpdates[styleName] = nextProp[styleName]; + } + } + } else { + // Relies on `updateStylesByID` not mutating `styleUpdates`. + if (!styleUpdates) { + if (!updatePayload) { + updatePayload = []; + } - var badStyleValueWithSemicolonPattern = /;\s*$/; - var warnedStyleNames = {}; - var warnedStyleValues = {}; - var warnedForNaNValue = false; - var warnedForInfinityValue = false; + updatePayload.push(propKey, styleUpdates); + } - var camelize = function (string) { - return string.replace(hyphenPattern, function (_, character) { - return character.toUpperCase(); - }); - }; + styleUpdates = nextProp; + } + } else if (propKey === DANGEROUSLY_SET_INNER_HTML) { + var nextHtml = nextProp ? nextProp[HTML$1] : undefined; + var lastHtml = lastProp ? lastProp[HTML$1] : undefined; - var warnHyphenatedStyleName = function (name) { - if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { - return; - } + if (nextHtml != null) { + if (lastHtml !== nextHtml) { + (updatePayload = updatePayload || []).push(propKey, nextHtml); + } + } + } else if (propKey === CHILDREN) { + if (lastProp !== nextProp && (typeof nextProp === 'string' || typeof nextProp === 'number')) { + (updatePayload = updatePayload || []).push(propKey, '' + nextProp); + } + } else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (registrationNameModules.hasOwnProperty(propKey)) { + if (nextProp != null) { + // We eagerly listen to this even though we haven't committed yet. + if ( typeof nextProp !== 'function') { + warnForInvalidEventListener(propKey, nextProp); + } - warnedStyleNames[name] = true; - warning$1(false, 'Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests - // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix - // is converted to lowercase `ms`. - camelize(name.replace(msPattern$1, 'ms-'))); - }; + ensureListeningTo(rootContainerElement, propKey); + } - var warnBadVendoredStyleName = function (name) { - if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { - return; + if (!updatePayload && lastProp !== nextProp) { + // This is a special case. If any listener updates we need to ensure + // that the "current" props pointer gets updated so we need a commit + // to update this element. + updatePayload = []; + } + } else { + // For any other property we always add it to the queue and then we + // filter it out using the whitelist during the commit. + (updatePayload = updatePayload || []).push(propKey, nextProp); + } } - warnedStyleNames[name] = true; - warning$1(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1)); - }; + if (styleUpdates) { + { + validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE]); + } - var warnStyleValueWithSemicolon = function (name, value) { - if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) { - return; + (updatePayload = updatePayload || []).push(STYLE, styleUpdates); } - warnedStyleValues[value] = true; - warning$1(false, "Style property values shouldn't contain a semicolon. " + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, '')); - }; + return updatePayload; + } // Apply the diff. - var warnStyleValueIsNaN = function (name, value) { - if (warnedForNaNValue) { - return; + function updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) { + // Update checked *before* name. + // In the middle of an update, it is possible to have multiple checked. + // When a checked radio tries to change name, browser makes another radio's checked false. + if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) { + updateChecked(domElement, nextRawProps); } - warnedForNaNValue = true; - warning$1(false, '`NaN` is an invalid value for the `%s` css style property.', name); - }; + var wasCustomComponentTag = isCustomComponent(tag, lastRawProps); + var isCustomComponentTag = isCustomComponent(tag, nextRawProps); // Apply the diff. - var warnStyleValueIsInfinity = function (name, value) { - if (warnedForInfinityValue) { - return; - } + updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag); // TODO: Ensure that an update gets scheduled if any of the special props + // changed. - warnedForInfinityValue = true; - warning$1(false, '`Infinity` is an invalid value for the `%s` css style property.', name); - }; + switch (tag) { + case 'input': + // Update the wrapper around inputs *after* updating props. This has to + // happen after `updateDOMProperties`. Otherwise HTML5 input validations + // raise warnings and prevent the new value from being assigned. + updateWrapper(domElement, nextRawProps); + break; - warnValidStyle = function (name, value) { - if (name.indexOf('-') > -1) { - warnHyphenatedStyleName(name); - } else if (badVendoredStyleNamePattern.test(name)) { - warnBadVendoredStyleName(name); - } else if (badStyleValueWithSemicolonPattern.test(value)) { - warnStyleValueWithSemicolon(name, value); - } + case 'textarea': + updateWrapper$1(domElement, nextRawProps); + break; - if (typeof value === 'number') { - if (isNaN(value)) { - warnStyleValueIsNaN(name, value); - } else if (!isFinite(value)) { - warnStyleValueIsInfinity(name, value); - } + case 'select': + // <select> value update needs to occur after <option> children + // reconciliation + postUpdateWrapper(domElement, nextRawProps); + break; } - }; -} + } -var warnValidStyle$1 = warnValidStyle; + function getPossibleStandardName(propName) { + { + var lowerCasedName = propName.toLowerCase(); -/** - * Operations for dealing with CSS properties. - */ + if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) { + return null; + } -/** - * This creates a string that is expected to be equivalent to the style - * attribute generated by server-side rendering. It by-passes warnings and - * security checks so it's not safe to use this value for anything other than - * comparison. It is only used in DEV for SSR validation. - */ + return possibleStandardNames[lowerCasedName] || null; + } + } -function createDangerousStringForStyles(styles) { - { - var serialized = ''; - var delimiter = ''; + function diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement) { + var isCustomComponentTag; + var extraAttributeNames; - for (var styleName in styles) { - if (!styles.hasOwnProperty(styleName)) { - continue; - } + { + suppressHydrationWarning = rawProps[SUPPRESS_HYDRATION_WARNING] === true; + isCustomComponentTag = isCustomComponent(tag, rawProps); + validatePropertiesInDevelopment(tag, rawProps); + } // TODO: Make sure that we check isMounted before firing any of these events. - var styleValue = styles[styleName]; - if (styleValue != null) { - var isCustomProperty = styleName.indexOf('--') === 0; - serialized += delimiter + (isCustomProperty ? styleName : hyphenateStyleName(styleName)) + ':'; - serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty); - delimiter = ';'; - } - } + switch (tag) { + case 'iframe': + case 'object': + case 'embed': + trapBubbledEvent(TOP_LOAD, domElement); + break; - return serialized || null; - } -} -/** - * Sets the value for multiple styles on a node. If a value is specified as - * '' (empty string), the corresponding style property will be unset. - * - * @param {DOMElement} node - * @param {object} styles - */ + case 'video': + case 'audio': + // Create listener for each media event + for (var i = 0; i < mediaEventTypes.length; i++) { + trapBubbledEvent(mediaEventTypes[i], domElement); + } -function setValueForStyles(node, styles) { - var style = node.style; + break; - for (var styleName in styles) { - if (!styles.hasOwnProperty(styleName)) { - continue; - } + case 'source': + trapBubbledEvent(TOP_ERROR, domElement); + break; - var isCustomProperty = styleName.indexOf('--') === 0; + case 'img': + case 'image': + case 'link': + trapBubbledEvent(TOP_ERROR, domElement); + trapBubbledEvent(TOP_LOAD, domElement); + break; - { - if (!isCustomProperty) { - warnValidStyle$1(styleName, styles[styleName]); - } - } + case 'form': + trapBubbledEvent(TOP_RESET, domElement); + trapBubbledEvent(TOP_SUBMIT, domElement); + break; - var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty); + case 'details': + trapBubbledEvent(TOP_TOGGLE, domElement); + break; - if (styleName === 'float') { - styleName = 'cssFloat'; - } + case 'input': + initWrapperState(domElement, rawProps); + trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening + // to onChange. Even if there is no listener. - if (isCustomProperty) { - style.setProperty(styleName, styleValue); - } else { - style[styleName] = styleValue; - } - } -} + ensureListeningTo(rootContainerElement, 'onChange'); + break; -function isValueEmpty(value) { - return value == null || typeof value === 'boolean' || value === ''; -} -/** - * Given {color: 'red', overflow: 'hidden'} returns { - * color: 'color', - * overflowX: 'overflow', - * overflowY: 'overflow', - * }. This can be read as "the overflowY property was set by the overflow - * shorthand". That is, the values are the property that each was derived from. - */ + case 'option': + validateProps(domElement, rawProps); + break; + case 'select': + initWrapperState$1(domElement, rawProps); + trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening + // to onChange. Even if there is no listener. -function expandShorthandMap(styles) { - var expanded = {}; + ensureListeningTo(rootContainerElement, 'onChange'); + break; - for (var key in styles) { - var longhands = shorthandToLonghand[key] || [key]; + case 'textarea': + initWrapperState$2(domElement, rawProps); + trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening + // to onChange. Even if there is no listener. - for (var i = 0; i < longhands.length; i++) { - expanded[longhands[i]] = key; + ensureListeningTo(rootContainerElement, 'onChange'); + break; } - } - return expanded; -} -/** - * When mixing shorthand and longhand property names, we warn during updates if - * we expect an incorrect result to occur. In particular, we warn for: - * - * Updating a shorthand property (longhand gets overwritten): - * {font: 'foo', fontVariant: 'bar'} -> {font: 'baz', fontVariant: 'bar'} - * becomes .style.font = 'baz' - * Removing a shorthand property (longhand gets lost too): - * {font: 'foo', fontVariant: 'bar'} -> {fontVariant: 'bar'} - * becomes .style.font = '' - * Removing a longhand property (should revert to shorthand; doesn't): - * {font: 'foo', fontVariant: 'bar'} -> {font: 'foo'} - * becomes .style.fontVariant = '' - */ + assertValidProps(tag, rawProps); + { + extraAttributeNames = new Set(); + var attributes = domElement.attributes; -function validateShorthandPropertyCollisionInDev(styleUpdates, nextStyles) { - if (!warnAboutShorthandPropertyCollision) { - return; - } + for (var _i = 0; _i < attributes.length; _i++) { + var name = attributes[_i].name.toLowerCase(); - if (!nextStyles) { - return; - } + switch (name) { + // Built-in SSR attribute is whitelisted + case 'data-reactroot': + break; + // Controlled attributes are not validated + // TODO: Only ignore them on controlled tags. - var expandedUpdates = expandShorthandMap(styleUpdates); - var expandedStyles = expandShorthandMap(nextStyles); - var warnedAbout = {}; + case 'value': + break; - for (var key in expandedUpdates) { - var originalKey = expandedUpdates[key]; - var correctOriginalKey = expandedStyles[key]; + case 'checked': + break; - if (correctOriginalKey && originalKey !== correctOriginalKey) { - var warningKey = originalKey + ',' + correctOriginalKey; + case 'selected': + break; - if (warnedAbout[warningKey]) { - continue; + default: + // Intentionally use the original name. + // See discussion in https://github.com/facebook/react/pull/10676. + extraAttributeNames.add(attributes[_i].name); + } } - - warnedAbout[warningKey] = true; - warning$1(false, '%s a style property during rerender (%s) when a ' + 'conflicting property is set (%s) can lead to styling bugs. To ' + "avoid this, don't mix shorthand and non-shorthand properties " + 'for the same value; instead, replace the shorthand with ' + 'separate values.', isValueEmpty(styleUpdates[originalKey]) ? 'Removing' : 'Updating', originalKey, correctOriginalKey); } - } -} -// For HTML, certain tags should omit their close tag. We keep a whitelist for -// those special-case tags. -var omittedCloseTags = { - area: true, - base: true, - br: true, - col: true, - embed: true, - hr: true, - img: true, - input: true, - keygen: true, - link: true, - meta: true, - param: true, - source: true, - track: true, - wbr: true // NOTE: menuitem's close tag should be omitted, but that causes problems. + var updatePayload = null; -}; + for (var propKey in rawProps) { + if (!rawProps.hasOwnProperty(propKey)) { + continue; + } -// `omittedCloseTags` except that `menuitem` should still have its closing tag. + var nextProp = rawProps[propKey]; + + if (propKey === CHILDREN) { + // For text content children we compare against textContent. This + // might match additional HTML that is hidden when we read it using + // textContent. E.g. "foo" will match "f<span>oo</span>" but that still + // satisfies our requirement. Our requirement is not to produce perfect + // HTML and attributes. Ideally we should preserve structure but it's + // ok not to if the visible content is still enough to indicate what + // even listeners these nodes might be wired up to. + // TODO: Warn if there is more than a single textNode as a child. + // TODO: Should we use domElement.firstChild.nodeValue to compare? + if (typeof nextProp === 'string') { + if (domElement.textContent !== nextProp) { + if ( !suppressHydrationWarning) { + warnForTextDifference(domElement.textContent, nextProp); + } -var voidElementTags = _assign({ - menuitem: true -}, omittedCloseTags); + updatePayload = [CHILDREN, nextProp]; + } + } else if (typeof nextProp === 'number') { + if (domElement.textContent !== '' + nextProp) { + if ( !suppressHydrationWarning) { + warnForTextDifference(domElement.textContent, nextProp); + } -// or add stack by default to invariants where possible. + updatePayload = [CHILDREN, '' + nextProp]; + } + } + } else if (registrationNameModules.hasOwnProperty(propKey)) { + if (nextProp != null) { + if ( typeof nextProp !== 'function') { + warnForInvalidEventListener(propKey, nextProp); + } -var HTML$1 = '__html'; -var ReactDebugCurrentFrame$3 = null; + ensureListeningTo(rootContainerElement, propKey); + } + } else if ( // Convince Flow we've calculated it (it's DEV-only in this method.) + typeof isCustomComponentTag === 'boolean') { + // Validate that the properties correspond to their expected values. + var serverValue = void 0; + var propertyInfo = getPropertyInfo(propKey); -{ - ReactDebugCurrentFrame$3 = ReactSharedInternals.ReactDebugCurrentFrame; -} + if (suppressHydrationWarning) ; else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING || // Controlled attributes are not validated + // TODO: Only ignore them on controlled tags. + propKey === 'value' || propKey === 'checked' || propKey === 'selected') ; else if (propKey === DANGEROUSLY_SET_INNER_HTML) { + var serverHTML = domElement.innerHTML; + var nextHtml = nextProp ? nextProp[HTML$1] : undefined; + var expectedHTML = normalizeHTML(domElement, nextHtml != null ? nextHtml : ''); -function assertValidProps(tag, props) { - if (!props) { - return; - } // Note the use of `==` which checks for null or undefined. + if (expectedHTML !== serverHTML) { + warnForPropDifference(propKey, serverHTML, expectedHTML); + } + } else if (propKey === STYLE) { + // $FlowFixMe - Should be inferred as not undefined. + extraAttributeNames.delete(propKey); + if (canDiffStyleForHydrationWarning) { + var expectedStyle = createDangerousStringForStyles(nextProp); + serverValue = domElement.getAttribute('style'); - if (voidElementTags[tag]) { - if (!(props.children == null && props.dangerouslySetInnerHTML == null)) { - { - throw Error(tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`." + (ReactDebugCurrentFrame$3.getStackAddendum())); - } - } - } + if (expectedStyle !== serverValue) { + warnForPropDifference(propKey, serverValue, expectedStyle); + } + } + } else if (isCustomComponentTag) { + // $FlowFixMe - Should be inferred as not undefined. + extraAttributeNames.delete(propKey.toLowerCase()); + serverValue = getValueForAttribute(domElement, propKey, nextProp); - if (props.dangerouslySetInnerHTML != null) { - if (!(props.children == null)) { - { - throw Error("Can only set one of `children` or `props.dangerouslySetInnerHTML`."); - } - } + if (nextProp !== serverValue) { + warnForPropDifference(propKey, serverValue, nextProp); + } + } else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) { + var isMismatchDueToBadCasing = false; - if (!(typeof props.dangerouslySetInnerHTML === 'object' && HTML$1 in props.dangerouslySetInnerHTML)) { - { - throw Error("`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information."); - } - } - } + if (propertyInfo !== null) { + // $FlowFixMe - Should be inferred as not undefined. + extraAttributeNames.delete(propertyInfo.attributeName); + serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo); + } else { + var ownNamespace = parentNamespace; - { - !(props.suppressContentEditableWarning || !props.contentEditable || props.children == null) ? warning$1(false, 'A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.') : void 0; - } + if (ownNamespace === HTML_NAMESPACE$1) { + ownNamespace = getIntrinsicNamespace(tag); + } - if (!(props.style == null || typeof props.style === 'object')) { - { - throw Error("The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX." + (ReactDebugCurrentFrame$3.getStackAddendum())); - } - } -} + if (ownNamespace === HTML_NAMESPACE$1) { + // $FlowFixMe - Should be inferred as not undefined. + extraAttributeNames.delete(propKey.toLowerCase()); + } else { + var standardName = getPossibleStandardName(propKey); -function isCustomComponent(tagName, props) { - if (tagName.indexOf('-') === -1) { - return typeof props.is === 'string'; - } + if (standardName !== null && standardName !== propKey) { + // If an SVG prop is supplied with bad casing, it will + // be successfully parsed from HTML, but will produce a mismatch + // (and would be incorrectly rendered on the client). + // However, we already warn about bad casing elsewhere. + // So we'll skip the misleading extra mismatch warning in this case. + isMismatchDueToBadCasing = true; // $FlowFixMe - Should be inferred as not undefined. - switch (tagName) { - // These are reserved SVG and MathML elements. - // We don't mind this whitelist too much because we expect it to never grow. - // The alternative is to track the namespace in a few places which is convoluted. - // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts - case 'annotation-xml': - case 'color-profile': - case 'font-face': - case 'font-face-src': - case 'font-face-uri': - case 'font-face-format': - case 'font-face-name': - case 'missing-glyph': - return false; + extraAttributeNames.delete(standardName); + } // $FlowFixMe - Should be inferred as not undefined. - default: - return true; - } -} - -// When adding attributes to the HTML or SVG whitelist, be sure to -// also add them to this module to ensure casing and incorrect name -// warnings. -var possibleStandardNames = { - // HTML - accept: 'accept', - acceptcharset: 'acceptCharset', - 'accept-charset': 'acceptCharset', - accesskey: 'accessKey', - action: 'action', - allowfullscreen: 'allowFullScreen', - alt: 'alt', - as: 'as', - async: 'async', - autocapitalize: 'autoCapitalize', - autocomplete: 'autoComplete', - autocorrect: 'autoCorrect', - autofocus: 'autoFocus', - autoplay: 'autoPlay', - autosave: 'autoSave', - capture: 'capture', - cellpadding: 'cellPadding', - cellspacing: 'cellSpacing', - challenge: 'challenge', - charset: 'charSet', - checked: 'checked', - children: 'children', - cite: 'cite', - class: 'className', - classid: 'classID', - classname: 'className', - cols: 'cols', - colspan: 'colSpan', - content: 'content', - contenteditable: 'contentEditable', - contextmenu: 'contextMenu', - controls: 'controls', - controlslist: 'controlsList', - coords: 'coords', - crossorigin: 'crossOrigin', - dangerouslysetinnerhtml: 'dangerouslySetInnerHTML', - data: 'data', - datetime: 'dateTime', - default: 'default', - defaultchecked: 'defaultChecked', - defaultvalue: 'defaultValue', - defer: 'defer', - dir: 'dir', - disabled: 'disabled', - disablepictureinpicture: 'disablePictureInPicture', - download: 'download', - draggable: 'draggable', - enctype: 'encType', - for: 'htmlFor', - form: 'form', - formmethod: 'formMethod', - formaction: 'formAction', - formenctype: 'formEncType', - formnovalidate: 'formNoValidate', - formtarget: 'formTarget', - frameborder: 'frameBorder', - headers: 'headers', - height: 'height', - hidden: 'hidden', - high: 'high', - href: 'href', - hreflang: 'hrefLang', - htmlfor: 'htmlFor', - httpequiv: 'httpEquiv', - 'http-equiv': 'httpEquiv', - icon: 'icon', - id: 'id', - innerhtml: 'innerHTML', - inputmode: 'inputMode', - integrity: 'integrity', - is: 'is', - itemid: 'itemID', - itemprop: 'itemProp', - itemref: 'itemRef', - itemscope: 'itemScope', - itemtype: 'itemType', - keyparams: 'keyParams', - keytype: 'keyType', - kind: 'kind', - label: 'label', - lang: 'lang', - list: 'list', - loop: 'loop', - low: 'low', - manifest: 'manifest', - marginwidth: 'marginWidth', - marginheight: 'marginHeight', - max: 'max', - maxlength: 'maxLength', - media: 'media', - mediagroup: 'mediaGroup', - method: 'method', - min: 'min', - minlength: 'minLength', - multiple: 'multiple', - muted: 'muted', - name: 'name', - nomodule: 'noModule', - nonce: 'nonce', - novalidate: 'noValidate', - open: 'open', - optimum: 'optimum', - pattern: 'pattern', - placeholder: 'placeholder', - playsinline: 'playsInline', - poster: 'poster', - preload: 'preload', - profile: 'profile', - radiogroup: 'radioGroup', - readonly: 'readOnly', - referrerpolicy: 'referrerPolicy', - rel: 'rel', - required: 'required', - reversed: 'reversed', - role: 'role', - rows: 'rows', - rowspan: 'rowSpan', - sandbox: 'sandbox', - scope: 'scope', - scoped: 'scoped', - scrolling: 'scrolling', - seamless: 'seamless', - selected: 'selected', - shape: 'shape', - size: 'size', - sizes: 'sizes', - span: 'span', - spellcheck: 'spellCheck', - src: 'src', - srcdoc: 'srcDoc', - srclang: 'srcLang', - srcset: 'srcSet', - start: 'start', - step: 'step', - style: 'style', - summary: 'summary', - tabindex: 'tabIndex', - target: 'target', - title: 'title', - type: 'type', - usemap: 'useMap', - value: 'value', - width: 'width', - wmode: 'wmode', - wrap: 'wrap', - // SVG - about: 'about', - accentheight: 'accentHeight', - 'accent-height': 'accentHeight', - accumulate: 'accumulate', - additive: 'additive', - alignmentbaseline: 'alignmentBaseline', - 'alignment-baseline': 'alignmentBaseline', - allowreorder: 'allowReorder', - alphabetic: 'alphabetic', - amplitude: 'amplitude', - arabicform: 'arabicForm', - 'arabic-form': 'arabicForm', - ascent: 'ascent', - attributename: 'attributeName', - attributetype: 'attributeType', - autoreverse: 'autoReverse', - azimuth: 'azimuth', - basefrequency: 'baseFrequency', - baselineshift: 'baselineShift', - 'baseline-shift': 'baselineShift', - baseprofile: 'baseProfile', - bbox: 'bbox', - begin: 'begin', - bias: 'bias', - by: 'by', - calcmode: 'calcMode', - capheight: 'capHeight', - 'cap-height': 'capHeight', - clip: 'clip', - clippath: 'clipPath', - 'clip-path': 'clipPath', - clippathunits: 'clipPathUnits', - cliprule: 'clipRule', - 'clip-rule': 'clipRule', - color: 'color', - colorinterpolation: 'colorInterpolation', - 'color-interpolation': 'colorInterpolation', - colorinterpolationfilters: 'colorInterpolationFilters', - 'color-interpolation-filters': 'colorInterpolationFilters', - colorprofile: 'colorProfile', - 'color-profile': 'colorProfile', - colorrendering: 'colorRendering', - 'color-rendering': 'colorRendering', - contentscripttype: 'contentScriptType', - contentstyletype: 'contentStyleType', - cursor: 'cursor', - cx: 'cx', - cy: 'cy', - d: 'd', - datatype: 'datatype', - decelerate: 'decelerate', - descent: 'descent', - diffuseconstant: 'diffuseConstant', - direction: 'direction', - display: 'display', - divisor: 'divisor', - dominantbaseline: 'dominantBaseline', - 'dominant-baseline': 'dominantBaseline', - dur: 'dur', - dx: 'dx', - dy: 'dy', - edgemode: 'edgeMode', - elevation: 'elevation', - enablebackground: 'enableBackground', - 'enable-background': 'enableBackground', - end: 'end', - exponent: 'exponent', - externalresourcesrequired: 'externalResourcesRequired', - fill: 'fill', - fillopacity: 'fillOpacity', - 'fill-opacity': 'fillOpacity', - fillrule: 'fillRule', - 'fill-rule': 'fillRule', - filter: 'filter', - filterres: 'filterRes', - filterunits: 'filterUnits', - floodopacity: 'floodOpacity', - 'flood-opacity': 'floodOpacity', - floodcolor: 'floodColor', - 'flood-color': 'floodColor', - focusable: 'focusable', - fontfamily: 'fontFamily', - 'font-family': 'fontFamily', - fontsize: 'fontSize', - 'font-size': 'fontSize', - fontsizeadjust: 'fontSizeAdjust', - 'font-size-adjust': 'fontSizeAdjust', - fontstretch: 'fontStretch', - 'font-stretch': 'fontStretch', - fontstyle: 'fontStyle', - 'font-style': 'fontStyle', - fontvariant: 'fontVariant', - 'font-variant': 'fontVariant', - fontweight: 'fontWeight', - 'font-weight': 'fontWeight', - format: 'format', - from: 'from', - fx: 'fx', - fy: 'fy', - g1: 'g1', - g2: 'g2', - glyphname: 'glyphName', - 'glyph-name': 'glyphName', - glyphorientationhorizontal: 'glyphOrientationHorizontal', - 'glyph-orientation-horizontal': 'glyphOrientationHorizontal', - glyphorientationvertical: 'glyphOrientationVertical', - 'glyph-orientation-vertical': 'glyphOrientationVertical', - glyphref: 'glyphRef', - gradienttransform: 'gradientTransform', - gradientunits: 'gradientUnits', - hanging: 'hanging', - horizadvx: 'horizAdvX', - 'horiz-adv-x': 'horizAdvX', - horizoriginx: 'horizOriginX', - 'horiz-origin-x': 'horizOriginX', - ideographic: 'ideographic', - imagerendering: 'imageRendering', - 'image-rendering': 'imageRendering', - in2: 'in2', - in: 'in', - inlist: 'inlist', - intercept: 'intercept', - k1: 'k1', - k2: 'k2', - k3: 'k3', - k4: 'k4', - k: 'k', - kernelmatrix: 'kernelMatrix', - kernelunitlength: 'kernelUnitLength', - kerning: 'kerning', - keypoints: 'keyPoints', - keysplines: 'keySplines', - keytimes: 'keyTimes', - lengthadjust: 'lengthAdjust', - letterspacing: 'letterSpacing', - 'letter-spacing': 'letterSpacing', - lightingcolor: 'lightingColor', - 'lighting-color': 'lightingColor', - limitingconeangle: 'limitingConeAngle', - local: 'local', - markerend: 'markerEnd', - 'marker-end': 'markerEnd', - markerheight: 'markerHeight', - markermid: 'markerMid', - 'marker-mid': 'markerMid', - markerstart: 'markerStart', - 'marker-start': 'markerStart', - markerunits: 'markerUnits', - markerwidth: 'markerWidth', - mask: 'mask', - maskcontentunits: 'maskContentUnits', - maskunits: 'maskUnits', - mathematical: 'mathematical', - mode: 'mode', - numoctaves: 'numOctaves', - offset: 'offset', - opacity: 'opacity', - operator: 'operator', - order: 'order', - orient: 'orient', - orientation: 'orientation', - origin: 'origin', - overflow: 'overflow', - overlineposition: 'overlinePosition', - 'overline-position': 'overlinePosition', - overlinethickness: 'overlineThickness', - 'overline-thickness': 'overlineThickness', - paintorder: 'paintOrder', - 'paint-order': 'paintOrder', - panose1: 'panose1', - 'panose-1': 'panose1', - pathlength: 'pathLength', - patterncontentunits: 'patternContentUnits', - patterntransform: 'patternTransform', - patternunits: 'patternUnits', - pointerevents: 'pointerEvents', - 'pointer-events': 'pointerEvents', - points: 'points', - pointsatx: 'pointsAtX', - pointsaty: 'pointsAtY', - pointsatz: 'pointsAtZ', - prefix: 'prefix', - preservealpha: 'preserveAlpha', - preserveaspectratio: 'preserveAspectRatio', - primitiveunits: 'primitiveUnits', - property: 'property', - r: 'r', - radius: 'radius', - refx: 'refX', - refy: 'refY', - renderingintent: 'renderingIntent', - 'rendering-intent': 'renderingIntent', - repeatcount: 'repeatCount', - repeatdur: 'repeatDur', - requiredextensions: 'requiredExtensions', - requiredfeatures: 'requiredFeatures', - resource: 'resource', - restart: 'restart', - result: 'result', - results: 'results', - rotate: 'rotate', - rx: 'rx', - ry: 'ry', - scale: 'scale', - security: 'security', - seed: 'seed', - shaperendering: 'shapeRendering', - 'shape-rendering': 'shapeRendering', - slope: 'slope', - spacing: 'spacing', - specularconstant: 'specularConstant', - specularexponent: 'specularExponent', - speed: 'speed', - spreadmethod: 'spreadMethod', - startoffset: 'startOffset', - stddeviation: 'stdDeviation', - stemh: 'stemh', - stemv: 'stemv', - stitchtiles: 'stitchTiles', - stopcolor: 'stopColor', - 'stop-color': 'stopColor', - stopopacity: 'stopOpacity', - 'stop-opacity': 'stopOpacity', - strikethroughposition: 'strikethroughPosition', - 'strikethrough-position': 'strikethroughPosition', - strikethroughthickness: 'strikethroughThickness', - 'strikethrough-thickness': 'strikethroughThickness', - string: 'string', - stroke: 'stroke', - strokedasharray: 'strokeDasharray', - 'stroke-dasharray': 'strokeDasharray', - strokedashoffset: 'strokeDashoffset', - 'stroke-dashoffset': 'strokeDashoffset', - strokelinecap: 'strokeLinecap', - 'stroke-linecap': 'strokeLinecap', - strokelinejoin: 'strokeLinejoin', - 'stroke-linejoin': 'strokeLinejoin', - strokemiterlimit: 'strokeMiterlimit', - 'stroke-miterlimit': 'strokeMiterlimit', - strokewidth: 'strokeWidth', - 'stroke-width': 'strokeWidth', - strokeopacity: 'strokeOpacity', - 'stroke-opacity': 'strokeOpacity', - suppresscontenteditablewarning: 'suppressContentEditableWarning', - suppresshydrationwarning: 'suppressHydrationWarning', - surfacescale: 'surfaceScale', - systemlanguage: 'systemLanguage', - tablevalues: 'tableValues', - targetx: 'targetX', - targety: 'targetY', - textanchor: 'textAnchor', - 'text-anchor': 'textAnchor', - textdecoration: 'textDecoration', - 'text-decoration': 'textDecoration', - textlength: 'textLength', - textrendering: 'textRendering', - 'text-rendering': 'textRendering', - to: 'to', - transform: 'transform', - typeof: 'typeof', - u1: 'u1', - u2: 'u2', - underlineposition: 'underlinePosition', - 'underline-position': 'underlinePosition', - underlinethickness: 'underlineThickness', - 'underline-thickness': 'underlineThickness', - unicode: 'unicode', - unicodebidi: 'unicodeBidi', - 'unicode-bidi': 'unicodeBidi', - unicoderange: 'unicodeRange', - 'unicode-range': 'unicodeRange', - unitsperem: 'unitsPerEm', - 'units-per-em': 'unitsPerEm', - unselectable: 'unselectable', - valphabetic: 'vAlphabetic', - 'v-alphabetic': 'vAlphabetic', - values: 'values', - vectoreffect: 'vectorEffect', - 'vector-effect': 'vectorEffect', - version: 'version', - vertadvy: 'vertAdvY', - 'vert-adv-y': 'vertAdvY', - vertoriginx: 'vertOriginX', - 'vert-origin-x': 'vertOriginX', - vertoriginy: 'vertOriginY', - 'vert-origin-y': 'vertOriginY', - vhanging: 'vHanging', - 'v-hanging': 'vHanging', - videographic: 'vIdeographic', - 'v-ideographic': 'vIdeographic', - viewbox: 'viewBox', - viewtarget: 'viewTarget', - visibility: 'visibility', - vmathematical: 'vMathematical', - 'v-mathematical': 'vMathematical', - vocab: 'vocab', - widths: 'widths', - wordspacing: 'wordSpacing', - 'word-spacing': 'wordSpacing', - writingmode: 'writingMode', - 'writing-mode': 'writingMode', - x1: 'x1', - x2: 'x2', - x: 'x', - xchannelselector: 'xChannelSelector', - xheight: 'xHeight', - 'x-height': 'xHeight', - xlinkactuate: 'xlinkActuate', - 'xlink:actuate': 'xlinkActuate', - xlinkarcrole: 'xlinkArcrole', - 'xlink:arcrole': 'xlinkArcrole', - xlinkhref: 'xlinkHref', - 'xlink:href': 'xlinkHref', - xlinkrole: 'xlinkRole', - 'xlink:role': 'xlinkRole', - xlinkshow: 'xlinkShow', - 'xlink:show': 'xlinkShow', - xlinktitle: 'xlinkTitle', - 'xlink:title': 'xlinkTitle', - xlinktype: 'xlinkType', - 'xlink:type': 'xlinkType', - xmlbase: 'xmlBase', - 'xml:base': 'xmlBase', - xmllang: 'xmlLang', - 'xml:lang': 'xmlLang', - xmlns: 'xmlns', - 'xml:space': 'xmlSpace', - xmlnsxlink: 'xmlnsXlink', - 'xmlns:xlink': 'xmlnsXlink', - xmlspace: 'xmlSpace', - y1: 'y1', - y2: 'y2', - y: 'y', - ychannelselector: 'yChannelSelector', - z: 'z', - zoomandpan: 'zoomAndPan' -}; - -var ariaProperties = { - 'aria-current': 0, - // state - 'aria-details': 0, - 'aria-disabled': 0, - // state - 'aria-hidden': 0, - // state - 'aria-invalid': 0, - // state - 'aria-keyshortcuts': 0, - 'aria-label': 0, - 'aria-roledescription': 0, - // Widget Attributes - 'aria-autocomplete': 0, - 'aria-checked': 0, - 'aria-expanded': 0, - 'aria-haspopup': 0, - 'aria-level': 0, - 'aria-modal': 0, - 'aria-multiline': 0, - 'aria-multiselectable': 0, - 'aria-orientation': 0, - 'aria-placeholder': 0, - 'aria-pressed': 0, - 'aria-readonly': 0, - 'aria-required': 0, - 'aria-selected': 0, - 'aria-sort': 0, - 'aria-valuemax': 0, - 'aria-valuemin': 0, - 'aria-valuenow': 0, - 'aria-valuetext': 0, - // Live Region Attributes - 'aria-atomic': 0, - 'aria-busy': 0, - 'aria-live': 0, - 'aria-relevant': 0, - // Drag-and-Drop Attributes - 'aria-dropeffect': 0, - 'aria-grabbed': 0, - // Relationship Attributes - 'aria-activedescendant': 0, - 'aria-colcount': 0, - 'aria-colindex': 0, - 'aria-colspan': 0, - 'aria-controls': 0, - 'aria-describedby': 0, - 'aria-errormessage': 0, - 'aria-flowto': 0, - 'aria-labelledby': 0, - 'aria-owns': 0, - 'aria-posinset': 0, - 'aria-rowcount': 0, - 'aria-rowindex': 0, - 'aria-rowspan': 0, - 'aria-setsize': 0 -}; - -var warnedProperties = {}; -var rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$'); -var rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$'); -var hasOwnProperty$1 = Object.prototype.hasOwnProperty; - -function validateProperty(tagName, name) { - if (hasOwnProperty$1.call(warnedProperties, name) && warnedProperties[name]) { - return true; - } - if (rARIACamel.test(name)) { - var ariaName = 'aria-' + name.slice(4).toLowerCase(); - var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM - // DOM properties, then it is an invalid aria-* attribute. + extraAttributeNames.delete(propKey); + } - if (correctName == null) { - warning$1(false, 'Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name); - warnedProperties[name] = true; - return true; - } // aria-* attributes should be lowercase; suggest the lowercase version. + serverValue = getValueForAttribute(domElement, propKey, nextProp); + } + if (nextProp !== serverValue && !isMismatchDueToBadCasing) { + warnForPropDifference(propKey, serverValue, nextProp); + } + } + } + } - if (name !== correctName) { - warning$1(false, 'Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName); - warnedProperties[name] = true; - return true; + { + // $FlowFixMe - Should be inferred as not undefined. + if (extraAttributeNames.size > 0 && !suppressHydrationWarning) { + // $FlowFixMe - Should be inferred as not undefined. + warnForExtraAttributes(extraAttributeNames); + } } - } - if (rARIA.test(name)) { - var lowerCasedName = name.toLowerCase(); - var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM - // DOM properties, then it is an invalid aria-* attribute. + switch (tag) { + case 'input': + // TODO: Make sure we check if this is still unmounted or do any clean + // up necessary since we never stop tracking anymore. + track(domElement); + postMountWrapper(domElement, rawProps, true); + break; - if (standardName == null) { - warnedProperties[name] = true; - return false; - } // aria-* attributes should be lowercase; suggest the lowercase version. + case 'textarea': + // TODO: Make sure we check if this is still unmounted or do any clean + // up necessary since we never stop tracking anymore. + track(domElement); + postMountWrapper$3(domElement); + break; + + case 'select': + case 'option': + // For input and textarea we current always set the value property at + // post mount to force it to diverge from attributes. However, for + // option and select we don't quite do the same thing and select + // is not resilient to the DOM state changing so we don't do that here. + // TODO: Consider not doing this for input and textarea. + break; + default: + if (typeof rawProps.onClick === 'function') { + // TODO: This cast may not be sound for SVG, MathML or custom elements. + trapClickOnNonInteractiveElement(domElement); + } - if (name !== standardName) { - warning$1(false, 'Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName); - warnedProperties[name] = true; - return true; + break; + } + + return updatePayload; + } + function diffHydratedText(textNode, text) { + var isDifferent = textNode.nodeValue !== text; + return isDifferent; + } + function warnForUnmatchedText(textNode, text) { + { + warnForTextDifference(textNode.nodeValue, text); } } + function warnForDeletedHydratableElement(parentNode, child) { + { + if (didWarnInvalidHydration) { + return; + } - return true; -} + didWarnInvalidHydration = true; -function warnInvalidARIAProps(type, props) { - var invalidProps = []; + error('Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase()); + } + } + function warnForDeletedHydratableText(parentNode, child) { + { + if (didWarnInvalidHydration) { + return; + } - for (var key in props) { - var isValid = validateProperty(type, key); + didWarnInvalidHydration = true; - if (!isValid) { - invalidProps.push(key); + error('Did not expect server HTML to contain the text node "%s" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase()); } } + function warnForInsertedHydratedElement(parentNode, tag, props) { + { + if (didWarnInvalidHydration) { + return; + } - var unknownPropString = invalidProps.map(function (prop) { - return '`' + prop + '`'; - }).join(', '); + didWarnInvalidHydration = true; - if (invalidProps.length === 1) { - warning$1(false, 'Invalid aria prop %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type); - } else if (invalidProps.length > 1) { - warning$1(false, 'Invalid aria props %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type); + error('Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase()); + } } -} + function warnForInsertedHydratedText(parentNode, text) { + { + if (text === '') { + // We expect to insert empty text nodes since they're not represented in + // the HTML. + // TODO: Remove this special case if we can just avoid inserting empty + // text nodes. + return; + } -function validateProperties(type, props) { - if (isCustomComponent(type, props)) { - return; - } + if (didWarnInvalidHydration) { + return; + } - warnInvalidARIAProps(type, props); -} + didWarnInvalidHydration = true; -var didWarnValueNull = false; -function validateProperties$1(type, props) { - if (type !== 'input' && type !== 'textarea' && type !== 'select') { - return; + error('Expected server HTML to contain a matching text node for "%s" in <%s>.', text, parentNode.nodeName.toLowerCase()); + } } + function restoreControlledState$3(domElement, tag, props) { + switch (tag) { + case 'input': + restoreControlledState(domElement, props); + return; - if (props != null && props.value === null && !didWarnValueNull) { - didWarnValueNull = true; + case 'textarea': + restoreControlledState$2(domElement, props); + return; - if (type === 'select' && props.multiple) { - warning$1(false, '`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.', type); - } else { - warning$1(false, '`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type); + case 'select': + restoreControlledState$1(domElement, props); + return; } } -} -var validateProperty$1 = function () {}; + function getActiveElement(doc) { + doc = doc || (typeof document !== 'undefined' ? document : undefined); -{ - var warnedProperties$1 = {}; - var _hasOwnProperty = Object.prototype.hasOwnProperty; - var EVENT_NAME_REGEX = /^on./; - var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/; - var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$'); - var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$'); + if (typeof doc === 'undefined') { + return null; + } - validateProperty$1 = function (tagName, name, value, canUseEventSystem) { - if (_hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) { - return true; + try { + return doc.activeElement || doc.body; + } catch (e) { + return doc.body; } + } - var lowerCasedName = name.toLowerCase(); + /** + * Given any node return the first leaf node without children. + * + * @param {DOMElement|DOMTextNode} node + * @return {DOMElement|DOMTextNode} + */ - if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') { - warning$1(false, 'React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.'); - warnedProperties$1[name] = true; - return true; - } // We can't rely on the event system being injected on the server. + function getLeafNode(node) { + while (node && node.firstChild) { + node = node.firstChild; + } + + return node; + } + /** + * Get the next sibling within a container. This will walk up the + * DOM if a node's siblings have been exhausted. + * + * @param {DOMElement|DOMTextNode} node + * @return {?DOMElement|DOMTextNode} + */ - if (canUseEventSystem) { - if (registrationNameModules.hasOwnProperty(name)) { - return true; + function getSiblingNode(node) { + while (node) { + if (node.nextSibling) { + return node.nextSibling; } - var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null; + node = node.parentNode; + } + } + /** + * Get object describing the nodes which contain characters at offset. + * + * @param {DOMElement|DOMTextNode} root + * @param {number} offset + * @return {?object} + */ - if (registrationName != null) { - warning$1(false, 'Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName); - warnedProperties$1[name] = true; - return true; - } - if (EVENT_NAME_REGEX.test(name)) { - warning$1(false, 'Unknown event handler property `%s`. It will be ignored.', name); - warnedProperties$1[name] = true; - return true; - } - } else if (EVENT_NAME_REGEX.test(name)) { - // If no event plugins have been injected, we are in a server environment. - // So we can't tell if the event name is correct for sure, but we can filter - // out known bad ones like `onclick`. We can't suggest a specific replacement though. - if (INVALID_EVENT_NAME_REGEX.test(name)) { - warning$1(false, 'Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name); - } + function getNodeForCharacterOffset(root, offset) { + var node = getLeafNode(root); + var nodeStart = 0; + var nodeEnd = 0; - warnedProperties$1[name] = true; - return true; - } // Let the ARIA attribute hook validate ARIA attributes + while (node) { + if (node.nodeType === TEXT_NODE) { + nodeEnd = nodeStart + node.textContent.length; + + if (nodeStart <= offset && nodeEnd >= offset) { + return { + node: node, + offset: offset - nodeStart + }; + } + nodeStart = nodeEnd; + } - if (rARIA$1.test(name) || rARIACamel$1.test(name)) { - return true; + node = getLeafNode(getSiblingNode(node)); } + } - if (lowerCasedName === 'innerhtml') { - warning$1(false, 'Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.'); - warnedProperties$1[name] = true; - return true; - } + /** + * @param {DOMElement} outerNode + * @return {?object} + */ - if (lowerCasedName === 'aria') { - warning$1(false, 'The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.'); - warnedProperties$1[name] = true; - return true; - } + function getOffsets(outerNode) { + var ownerDocument = outerNode.ownerDocument; + var win = ownerDocument && ownerDocument.defaultView || window; + var selection = win.getSelection && win.getSelection(); - if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') { - warning$1(false, 'Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value); - warnedProperties$1[name] = true; - return true; + if (!selection || selection.rangeCount === 0) { + return null; } - if (typeof value === 'number' && isNaN(value)) { - warning$1(false, 'Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name); - warnedProperties$1[name] = true; - return true; + var anchorNode = selection.anchorNode, + anchorOffset = selection.anchorOffset, + focusNode = selection.focusNode, + focusOffset = selection.focusOffset; // In Firefox, anchorNode and focusNode can be "anonymous divs", e.g. the + // up/down buttons on an <input type="number">. Anonymous divs do not seem to + // expose properties, triggering a "Permission denied error" if any of its + // properties are accessed. The only seemingly possible way to avoid erroring + // is to access a property that typically works for non-anonymous divs and + // catch any error that may otherwise arise. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=208427 + + try { + /* eslint-disable no-unused-expressions */ + anchorNode.nodeType; + focusNode.nodeType; + /* eslint-enable no-unused-expressions */ + } catch (e) { + return null; } - var propertyInfo = getPropertyInfo(name); - var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config. + return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset); + } + /** + * Returns {start, end} where `start` is the character/codepoint index of + * (anchorNode, anchorOffset) within the textContent of `outerNode`, and + * `end` is the index of (focusNode, focusOffset). + * + * Returns null if you pass in garbage input but we should probably just crash. + * + * Exported only for testing. + */ - if (possibleStandardNames.hasOwnProperty(lowerCasedName)) { - var standardName = possibleStandardNames[lowerCasedName]; + function getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) { + var length = 0; + var start = -1; + var end = -1; + var indexWithinAnchor = 0; + var indexWithinFocus = 0; + var node = outerNode; + var parentNode = null; - if (standardName !== name) { - warning$1(false, 'Invalid DOM property `%s`. Did you mean `%s`?', name, standardName); - warnedProperties$1[name] = true; - return true; - } - } else if (!isReserved && name !== lowerCasedName) { - // Unknown attributes should have lowercase casing since that's how they - // will be cased anyway with server rendering. - warning$1(false, 'React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.', name, lowerCasedName); - warnedProperties$1[name] = true; - return true; - } + outer: while (true) { + var next = null; - if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) { - if (value) { - warning$1(false, 'Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.', value, name, name, value, name); - } else { - warning$1(false, 'Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name); - } + while (true) { + if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) { + start = length + anchorOffset; + } - warnedProperties$1[name] = true; - return true; - } // Now that we've validated casing, do not validate - // data types for reserved props + if (node === focusNode && (focusOffset === 0 || node.nodeType === TEXT_NODE)) { + end = length + focusOffset; + } + if (node.nodeType === TEXT_NODE) { + length += node.nodeValue.length; + } - if (isReserved) { - return true; - } // Warn when a known attribute is a bad type + if ((next = node.firstChild) === null) { + break; + } // Moving from `node` to its first child `next`. - if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) { - warnedProperties$1[name] = true; - return false; - } // Warn when passing the strings 'false' or 'true' into a boolean prop + parentNode = node; + node = next; + } + while (true) { + if (node === outerNode) { + // If `outerNode` has children, this is always the second time visiting + // it. If it has no children, this is still the first loop, and the only + // valid selection is anchorNode and focusNode both equal to this node + // and both offsets 0, in which case we will have handled above. + break outer; + } - if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) { - warning$1(false, 'Received the string `%s` for the boolean attribute `%s`. ' + '%s ' + 'Did you mean %s={%s}?', value, name, value === 'false' ? 'The browser will interpret it as a truthy value.' : 'Although this works, it will not work as expected if you pass the string "false".', name, value); - warnedProperties$1[name] = true; - return true; - } + if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset) { + start = length; + } - return true; - }; -} - -var warnUnknownProperties = function (type, props, canUseEventSystem) { - var unknownProps = []; - - for (var key in props) { - var isValid = validateProperty$1(type, key, props[key], canUseEventSystem); - - if (!isValid) { - unknownProps.push(key); - } - } - - var unknownPropString = unknownProps.map(function (prop) { - return '`' + prop + '`'; - }).join(', '); - - if (unknownProps.length === 1) { - warning$1(false, 'Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type); - } else if (unknownProps.length > 1) { - warning$1(false, 'Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type); - } -}; - -function validateProperties$2(type, props, canUseEventSystem) { - if (isCustomComponent(type, props)) { - return; - } - - warnUnknownProperties(type, props, canUseEventSystem); -} - -// TODO: direct imports like some-package/src/* are bad. Fix me. -var didWarnInvalidHydration = false; -var didWarnShadyDOM = false; -var didWarnScriptTags = false; -var DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML'; -var SUPPRESS_CONTENT_EDITABLE_WARNING = 'suppressContentEditableWarning'; -var SUPPRESS_HYDRATION_WARNING$1 = 'suppressHydrationWarning'; -var AUTOFOCUS = 'autoFocus'; -var CHILDREN = 'children'; -var STYLE$1 = 'style'; -var HTML = '__html'; -var LISTENERS = 'listeners'; -var HTML_NAMESPACE = Namespaces.html; -var warnedUnknownTags; -var suppressHydrationWarning; -var validatePropertiesInDevelopment; -var warnForTextDifference; -var warnForPropDifference; -var warnForExtraAttributes; -var warnForInvalidEventListener; -var canDiffStyleForHydrationWarning; -var normalizeMarkupForTextOrAttribute; -var normalizeHTML; - -{ - warnedUnknownTags = { - // Chrome is the only major browser not shipping <time>. But as of July - // 2017 it intends to ship it due to widespread usage. We intentionally - // *don't* warn for <time> even if it's unrecognized by Chrome because - // it soon will be, and many apps have been using it anyway. - time: true, - // There are working polyfills for <dialog>. Let people use it. - dialog: true, - // Electron ships a custom <webview> tag to display external web content in - // an isolated frame and process. - // This tag is not present in non Electron environments such as JSDom which - // is often used for testing purposes. - // @see https://electronjs.org/docs/api/webview-tag - webview: true - }; + if (parentNode === focusNode && ++indexWithinFocus === focusOffset) { + end = length; + } - validatePropertiesInDevelopment = function (type, props) { - validateProperties(type, props); - validateProperties$1(type, props); - validateProperties$2(type, props, - /* canUseEventSystem */ - true); - }; // IE 11 parses & normalizes the style attribute as opposed to other - // browsers. It adds spaces and sorts the properties in some - // non-alphabetical order. Handling that would require sorting CSS - // properties in the client & server versions or applying - // `expectedStyle` to a temporary DOM node to read its `style` attribute - // normalized. Since it only affects IE, we're skipping style warnings - // in that browser completely in favor of doing all that work. - // See https://github.com/facebook/react/issues/11807 - - - canDiffStyleForHydrationWarning = canUseDOM && !document.documentMode; // HTML parsing normalizes CR and CRLF to LF. - // It also can turn \u0000 into \uFFFD inside attributes. - // https://www.w3.org/TR/html5/single-page.html#preprocessing-the-input-stream - // If we have a mismatch, it might be caused by that. - // We will still patch up in this case but not fire the warning. - - var NORMALIZE_NEWLINES_REGEX = /\r\n?/g; - var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\u0000|\uFFFD/g; - - normalizeMarkupForTextOrAttribute = function (markup) { - var markupString = typeof markup === 'string' ? markup : '' + markup; - return markupString.replace(NORMALIZE_NEWLINES_REGEX, '\n').replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, ''); - }; + if ((next = node.nextSibling) !== null) { + break; + } - warnForTextDifference = function (serverText, clientText) { - if (didWarnInvalidHydration) { - return; - } + node = parentNode; + parentNode = node.parentNode; + } // Moving from `node` to its next sibling `next`. - var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText); - var normalizedServerText = normalizeMarkupForTextOrAttribute(serverText); - if (normalizedServerText === normalizedClientText) { - return; + node = next; } - didWarnInvalidHydration = true; - warningWithoutStack$1(false, 'Text content did not match. Server: "%s" Client: "%s"', normalizedServerText, normalizedClientText); - }; - - warnForPropDifference = function (propName, serverValue, clientValue) { - if (didWarnInvalidHydration) { - return; + if (start === -1 || end === -1) { + // This should never happen. (Would happen if the anchor/focus nodes aren't + // actually inside the passed-in node.) + return null; } - var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue); - var normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue); - - if (normalizedServerValue === normalizedClientValue) { - return; - } + return { + start: start, + end: end + }; + } + /** + * In modern non-IE browsers, we can support both forward and backward + * selections. + * + * Note: IE10+ supports the Selection object, but it does not support + * the `extend` method, which means that even in modern IE, it's not possible + * to programmatically create a backward selection. Thus, for all IE + * versions, we use the old IE API to create our selections. + * + * @param {DOMElement|DOMTextNode} node + * @param {object} offsets + */ - didWarnInvalidHydration = true; - warningWithoutStack$1(false, 'Prop `%s` did not match. Server: %s Client: %s', propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue)); - }; + function setOffsets(node, offsets) { + var doc = node.ownerDocument || document; + var win = doc && doc.defaultView || window; // Edge fails with "Object expected" in some scenarios. + // (For instance: TinyMCE editor used in a list component that supports pasting to add more, + // fails when pasting 100+ items) - warnForExtraAttributes = function (attributeNames) { - if (didWarnInvalidHydration) { + if (!win.getSelection) { return; } - didWarnInvalidHydration = true; - var names = []; - attributeNames.forEach(function (name) { - names.push(name); - }); - warningWithoutStack$1(false, 'Extra attributes from the server: %s', names); - }; + var selection = win.getSelection(); + var length = node.textContent.length; + var start = Math.min(offsets.start, length); + var end = offsets.end === undefined ? start : Math.min(offsets.end, length); // IE 11 uses modern selection, but doesn't support the extend method. + // Flip backward selections, so we can set with a single range. - warnForInvalidEventListener = function (registrationName, listener) { - if (listener === false) { - warning$1(false, 'Expected `%s` listener to be a function, instead got `false`.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', registrationName, registrationName, registrationName); - } else { - warning$1(false, 'Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener); + if (!selection.extend && start > end) { + var temp = end; + end = start; + start = temp; } - }; // Parse the HTML and read it back to normalize the HTML string so that it - // can be used for comparison. - - - normalizeHTML = function (parent, html) { - // We could have created a separate document here to avoid - // re-initializing custom elements if they exist. But this breaks - // how <noscript> is being handled. So we use the same document. - // See the discussion in https://github.com/facebook/react/pull/11157. - var testElement = parent.namespaceURI === HTML_NAMESPACE ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName); - testElement.innerHTML = html; - return testElement.innerHTML; - }; -} - -function ensureListeningTo(rootContainerElement, registrationName) { - var isDocumentOrFragment = rootContainerElement.nodeType === DOCUMENT_NODE || rootContainerElement.nodeType === DOCUMENT_FRAGMENT_NODE; - var doc = isDocumentOrFragment ? rootContainerElement : rootContainerElement.ownerDocument; - listenTo(registrationName, doc); -} - -function getOwnerDocumentFromRootContainer(rootContainerElement) { - return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument; -} - -function noop() {} - -function trapClickOnNonInteractiveElement(node) { - // Mobile Safari does not fire properly bubble click events on - // non-interactive elements, which means delegated click listeners do not - // fire. The workaround for this bug involves attaching an empty click - // listener on the target node. - // http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html - // Just set it using the onclick property so that we don't have to manage any - // bookkeeping for it. Not sure if we need to clear it when the listener is - // removed. - // TODO: Only do this for the relevant Safaris maybe? - node.onclick = noop; -} - -function setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) { - for (var propKey in nextProps) { - if (!nextProps.hasOwnProperty(propKey)) { - continue; - } - - var nextProp = nextProps[propKey]; - - if (propKey === STYLE$1) { - { - if (nextProp) { - // Freeze the next style object so that we can assume it won't be - // mutated. We have already warned for this in the past. - Object.freeze(nextProp); - } - } // Relies on `updateStylesByID` not mutating `styleUpdates`. - - setValueForStyles(domElement, nextProp); - } else if (propKey === DANGEROUSLY_SET_INNER_HTML) { - var nextHtml = nextProp ? nextProp[HTML] : undefined; + var startMarker = getNodeForCharacterOffset(node, start); + var endMarker = getNodeForCharacterOffset(node, end); - if (nextHtml != null) { - setInnerHTML(domElement, nextHtml); + if (startMarker && endMarker) { + if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) { + return; } - } else if (propKey === CHILDREN) { - if (typeof nextProp === 'string') { - // Avoid setting initial textContent when the text is empty. In IE11 setting - // textContent on a <textarea> will cause the placeholder to not - // show within the <textarea> until it has been focused and blurred again. - // https://github.com/facebook/react/issues/6731#issuecomment-254874553 - var canSetTextContent = tag !== 'textarea' || nextProp !== ''; - if (canSetTextContent) { - setTextContent(domElement, nextProp); - } - } else if (typeof nextProp === 'number') { - setTextContent(domElement, '' + nextProp); - } - } else if (enableFlareAPI && propKey === LISTENERS || propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1) {// Noop - } else if (propKey === AUTOFOCUS) {// We polyfill it separately on the client during commit. - // We could have excluded it in the property list instead of - // adding a special case here, but then it wouldn't be emitted - // on server rendering (but we *do* want to emit it in SSR). - } else if (registrationNameModules.hasOwnProperty(propKey)) { - if (nextProp != null) { - if (true && typeof nextProp !== 'function') { - warnForInvalidEventListener(propKey, nextProp); - } + var range = doc.createRange(); + range.setStart(startMarker.node, startMarker.offset); + selection.removeAllRanges(); - ensureListeningTo(rootContainerElement, propKey); + if (start > end) { + selection.addRange(range); + selection.extend(endMarker.node, endMarker.offset); + } else { + range.setEnd(endMarker.node, endMarker.offset); + selection.addRange(range); } - } else if (nextProp != null) { - setValueForProperty(domElement, propKey, nextProp, isCustomComponentTag); } } -} -function updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) { - // TODO: Handle wasCustomComponentTag - for (var i = 0; i < updatePayload.length; i += 2) { - var propKey = updatePayload[i]; - var propValue = updatePayload[i + 1]; + function isTextNode(node) { + return node && node.nodeType === TEXT_NODE; + } - if (propKey === STYLE$1) { - setValueForStyles(domElement, propValue); - } else if (propKey === DANGEROUSLY_SET_INNER_HTML) { - setInnerHTML(domElement, propValue); - } else if (propKey === CHILDREN) { - setTextContent(domElement, propValue); + function containsNode(outerNode, innerNode) { + if (!outerNode || !innerNode) { + return false; + } else if (outerNode === innerNode) { + return true; + } else if (isTextNode(outerNode)) { + return false; + } else if (isTextNode(innerNode)) { + return containsNode(outerNode, innerNode.parentNode); + } else if ('contains' in outerNode) { + return outerNode.contains(innerNode); + } else if (outerNode.compareDocumentPosition) { + return !!(outerNode.compareDocumentPosition(innerNode) & 16); } else { - setValueForProperty(domElement, propKey, propValue, isCustomComponentTag); + return false; } } -} - -function createElement(type, props, rootContainerElement, parentNamespace) { - var isCustomComponentTag; // We create tags in the namespace of their parent container, except HTML - // tags get no namespace. - - var ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement); - var domElement; - var namespaceURI = parentNamespace; - if (namespaceURI === HTML_NAMESPACE) { - namespaceURI = getIntrinsicNamespace(type); + function isInDocument(node) { + return node && node.ownerDocument && containsNode(node.ownerDocument.documentElement, node); } - if (namespaceURI === HTML_NAMESPACE) { - { - isCustomComponentTag = isCustomComponent(type, props); // Should this check be gated by parent namespace? Not sure we want to - // allow <SVG> or <mATH>. - - !(isCustomComponentTag || type === type.toLowerCase()) ? warning$1(false, '<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', type) : void 0; + function isSameOriginFrame(iframe) { + try { + // Accessing the contentDocument of a HTMLIframeElement can cause the browser + // to throw, e.g. if it has a cross-origin src attribute. + // Safari will show an error in the console when the access results in "Blocked a frame with origin". e.g: + // iframe.contentDocument.defaultView; + // A safety way is to access one of the cross origin properties: Window or Location + // Which might result in "SecurityError" DOM Exception and it is compatible to Safari. + // https://html.spec.whatwg.org/multipage/browsers.html#integration-with-idl + return typeof iframe.contentWindow.location.href === 'string'; + } catch (err) { + return false; } + } - if (type === 'script') { - // Create the script via .innerHTML so its "parser-inserted" flag is - // set to true and it does not execute - var div = ownerDocument.createElement('div'); + function getActiveElementDeep() { + var win = window; + var element = getActiveElement(); - { - if (enableTrustedTypesIntegration && !didWarnScriptTags) { - warning$1(false, 'Encountered a script tag while rendering React component. ' + 'Scripts inside React components are never executed when rendering ' + 'on the client. Consider using template tag instead ' + '(https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template).'); - didWarnScriptTags = true; - } + while (element instanceof win.HTMLIFrameElement) { + if (isSameOriginFrame(element)) { + win = element.contentWindow; + } else { + return element; } - div.innerHTML = '<script><' + '/script>'; // eslint-disable-line - // This is guaranteed to yield a script element. - - var firstChild = div.firstChild; - domElement = div.removeChild(firstChild); - } else if (typeof props.is === 'string') { - // $FlowIssue `createElement` should be updated for Web Components - domElement = ownerDocument.createElement(type, { - is: props.is - }); - } else { - // Separate else branch instead of using `props.is || undefined` above because of a Firefox bug. - // See discussion in https://github.com/facebook/react/pull/6896 - // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240 - domElement = ownerDocument.createElement(type); // Normally attributes are assigned in `setInitialDOMProperties`, however the `multiple` and `size` - // attributes on `select`s needs to be added before `option`s are inserted. - // This prevents: - // - a bug where the `select` does not scroll to the correct option because singular - // `select` elements automatically pick the first item #13222 - // - a bug where the `select` set the first item as selected despite the `size` attribute #14239 - // See https://github.com/facebook/react/issues/13222 - // and https://github.com/facebook/react/issues/14239 - - if (type === 'select') { - var node = domElement; - - if (props.multiple) { - node.multiple = true; - } else if (props.size) { - // Setting a size greater than 1 causes a select to behave like `multiple=true`, where - // it is possible that no option is selected. - // - // This is only necessary when a select in "single selection mode". - node.size = props.size; - } - } + element = getActiveElement(win.document); } - } else { - domElement = ownerDocument.createElementNS(namespaceURI, type); - } - { - if (namespaceURI === HTML_NAMESPACE) { - if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !Object.prototype.hasOwnProperty.call(warnedUnknownTags, type)) { - warnedUnknownTags[type] = true; - warning$1(false, 'The tag <%s> is unrecognized in this browser. ' + 'If you meant to render a React component, start its name with ' + 'an uppercase letter.', type); - } - } + return element; } + /** + * @ReactInputSelection: React input selection module. Based on Selection.js, + * but modified to be suitable for react and has a couple of bug fixes (doesn't + * assume buttons have range selections allowed). + * Input selection module for React. + */ - return domElement; -} -function createTextNode(text, rootContainerElement) { - return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text); -} -function setInitialProperties(domElement, tag, rawProps, rootContainerElement) { - var isCustomComponentTag = isCustomComponent(tag, rawProps); - - { - validatePropertiesInDevelopment(tag, rawProps); - - if (isCustomComponentTag && !didWarnShadyDOM && domElement.shadyRoot) { - warning$1(false, '%s is using shady DOM. Using shady DOM with React can ' + 'cause things to break subtly.', getCurrentFiberOwnerNameInDevOrNull() || 'A component'); - didWarnShadyDOM = true; - } - } // TODO: Make sure that we check isMounted before firing any of these events. - - - var props; - - switch (tag) { - case 'iframe': - case 'object': - case 'embed': - trapBubbledEvent(TOP_LOAD, domElement); - props = rawProps; - break; - - case 'video': - case 'audio': - // Create listener for each media event - for (var i = 0; i < mediaEventTypes.length; i++) { - trapBubbledEvent(mediaEventTypes[i], domElement); - } - - props = rawProps; - break; + /** + * @hasSelectionCapabilities: we get the element types that support selection + * from https://html.spec.whatwg.org/#do-not-apply, looking at `selectionStart` + * and `selectionEnd` rows. + */ - case 'source': - trapBubbledEvent(TOP_ERROR, domElement); - props = rawProps; - break; - case 'img': - case 'image': - case 'link': - trapBubbledEvent(TOP_ERROR, domElement); - trapBubbledEvent(TOP_LOAD, domElement); - props = rawProps; - break; + function hasSelectionCapabilities(elem) { + var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); + return nodeName && (nodeName === 'input' && (elem.type === 'text' || elem.type === 'search' || elem.type === 'tel' || elem.type === 'url' || elem.type === 'password') || nodeName === 'textarea' || elem.contentEditable === 'true'); + } + function getSelectionInformation() { + var focusedElem = getActiveElementDeep(); + return { + // Used by Flare + activeElementDetached: null, + focusedElem: focusedElem, + selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection(focusedElem) : null + }; + } + /** + * @restoreSelection: If any selection information was potentially lost, + * restore it. This is useful when performing operations that could remove dom + * nodes and place them back in, resulting in focus being lost. + */ - case 'form': - trapBubbledEvent(TOP_RESET, domElement); - trapBubbledEvent(TOP_SUBMIT, domElement); - props = rawProps; - break; + function restoreSelection(priorSelectionInformation) { + var curFocusedElem = getActiveElementDeep(); + var priorFocusedElem = priorSelectionInformation.focusedElem; + var priorSelectionRange = priorSelectionInformation.selectionRange; - case 'details': - trapBubbledEvent(TOP_TOGGLE, domElement); - props = rawProps; - break; + if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) { + if (priorSelectionRange !== null && hasSelectionCapabilities(priorFocusedElem)) { + setSelection(priorFocusedElem, priorSelectionRange); + } // Focusing a node can change the scroll position, which is undesirable - case 'input': - initWrapperState(domElement, rawProps); - props = getHostProps(domElement, rawProps); - trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening - // to onChange. Even if there is no listener. - ensureListeningTo(rootContainerElement, 'onChange'); - break; + var ancestors = []; + var ancestor = priorFocusedElem; - case 'option': - validateProps(domElement, rawProps); - props = getHostProps$1(domElement, rawProps); - break; + while (ancestor = ancestor.parentNode) { + if (ancestor.nodeType === ELEMENT_NODE) { + ancestors.push({ + element: ancestor, + left: ancestor.scrollLeft, + top: ancestor.scrollTop + }); + } + } - case 'select': - initWrapperState$1(domElement, rawProps); - props = getHostProps$2(domElement, rawProps); - trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening - // to onChange. Even if there is no listener. + if (typeof priorFocusedElem.focus === 'function') { + priorFocusedElem.focus(); + } - ensureListeningTo(rootContainerElement, 'onChange'); - break; + for (var i = 0; i < ancestors.length; i++) { + var info = ancestors[i]; + info.element.scrollLeft = info.left; + info.element.scrollTop = info.top; + } + } + } + /** + * @getSelection: Gets the selection bounds of a focused textarea, input or + * contentEditable node. + * -@input: Look up selection bounds of this input + * -@return {start: selectionStart, end: selectionEnd} + */ - case 'textarea': - initWrapperState$2(domElement, rawProps); - props = getHostProps$3(domElement, rawProps); - trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening - // to onChange. Even if there is no listener. + function getSelection(input) { + var selection; - ensureListeningTo(rootContainerElement, 'onChange'); - break; + if ('selectionStart' in input) { + // Modern browser with input or textarea. + selection = { + start: input.selectionStart, + end: input.selectionEnd + }; + } else { + // Content editable or old IE textarea. + selection = getOffsets(input); + } - default: - props = rawProps; + return selection || { + start: 0, + end: 0 + }; } + /** + * @setSelection: Sets the selection bounds of a textarea or input and focuses + * the input. + * -@input Set selection bounds of this input or textarea + * -@offsets Object of same form that is returned from get* + */ - assertValidProps(tag, props); - setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag); - - switch (tag) { - case 'input': - // TODO: Make sure we check if this is still unmounted or do any clean - // up necessary since we never stop tracking anymore. - track(domElement); - postMountWrapper(domElement, rawProps, false); - break; + function setSelection(input, offsets) { + var start = offsets.start, + end = offsets.end; - case 'textarea': - // TODO: Make sure we check if this is still unmounted or do any clean - // up necessary since we never stop tracking anymore. - track(domElement); - postMountWrapper$3(domElement, rawProps); - break; - - case 'option': - postMountWrapper$1(domElement, rawProps); - break; - - case 'select': - postMountWrapper$2(domElement, rawProps); - break; - - default: - if (typeof props.onClick === 'function') { - // TODO: This cast may not be sound for SVG, MathML or custom elements. - trapClickOnNonInteractiveElement(domElement); - } - - break; - } -} // Calculate the diff between the two objects. + if (end === undefined) { + end = start; + } -function diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) { - { - validatePropertiesInDevelopment(tag, nextRawProps); + if ('selectionStart' in input) { + input.selectionStart = start; + input.selectionEnd = Math.min(end, input.value.length); + } else { + setOffsets(input, offsets); + } } - var updatePayload = null; - var lastProps; - var nextProps; + var validateDOMNesting = function () {}; - switch (tag) { - case 'input': - lastProps = getHostProps(domElement, lastRawProps); - nextProps = getHostProps(domElement, nextRawProps); - updatePayload = []; - break; + var updatedAncestorInfo = function () {}; - case 'option': - lastProps = getHostProps$1(domElement, lastRawProps); - nextProps = getHostProps$1(domElement, nextRawProps); - updatePayload = []; - break; - - case 'select': - lastProps = getHostProps$2(domElement, lastRawProps); - nextProps = getHostProps$2(domElement, nextRawProps); - updatePayload = []; - break; + { + // This validation code was written based on the HTML5 parsing spec: + // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope + // + // Note: this does not catch all invalid nesting, nor does it try to (as it's + // not clear what practical benefit doing so provides); instead, we warn only + // for cases where the parser will give a parse tree differing from what React + // intended. For example, <b><div></div></b> is invalid but we don't warn + // because it still parses correctly; we do warn for other cases like nested + // <p> tags where the beginning of the second element implicitly closes the + // first, causing a confusing mess. + // https://html.spec.whatwg.org/multipage/syntax.html#special + var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope + + var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template', // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point + // TODO: Distinguish by namespace here -- for <title>, including it here + // errs on the side of fewer warnings + 'foreignObject', 'desc', 'title']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope + + var buttonScopeTags = inScopeTags.concat(['button']); // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags + + var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt']; + var emptyAncestorInfo = { + current: null, + formTag: null, + aTagInScope: null, + buttonTagInScope: null, + nobrTagInScope: null, + pTagInButtonScope: null, + listItemTagAutoclosing: null, + dlItemTagAutoclosing: null + }; - case 'textarea': - lastProps = getHostProps$3(domElement, lastRawProps); - nextProps = getHostProps$3(domElement, nextRawProps); - updatePayload = []; - break; + updatedAncestorInfo = function (oldInfo, tag) { + var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo); - default: - lastProps = lastRawProps; - nextProps = nextRawProps; + var info = { + tag: tag + }; - if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') { - // TODO: This cast may not be sound for SVG, MathML or custom elements. - trapClickOnNonInteractiveElement(domElement); + if (inScopeTags.indexOf(tag) !== -1) { + ancestorInfo.aTagInScope = null; + ancestorInfo.buttonTagInScope = null; + ancestorInfo.nobrTagInScope = null; } - break; - } + if (buttonScopeTags.indexOf(tag) !== -1) { + ancestorInfo.pTagInButtonScope = null; + } // See rules for 'li', 'dd', 'dt' start tags in + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody - assertValidProps(tag, nextProps); - var propKey; - var styleName; - var styleUpdates = null; - for (propKey in lastProps) { - if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) { - continue; - } + if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') { + ancestorInfo.listItemTagAutoclosing = null; + ancestorInfo.dlItemTagAutoclosing = null; + } - if (propKey === STYLE$1) { - var lastStyle = lastProps[propKey]; + ancestorInfo.current = info; - for (styleName in lastStyle) { - if (lastStyle.hasOwnProperty(styleName)) { - if (!styleUpdates) { - styleUpdates = {}; - } + if (tag === 'form') { + ancestorInfo.formTag = info; + } - styleUpdates[styleName] = ''; - } + if (tag === 'a') { + ancestorInfo.aTagInScope = info; } - } else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN) {// Noop. This is handled by the clear text mechanism. - } else if (enableFlareAPI && propKey === LISTENERS || propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1) {// Noop - } else if (propKey === AUTOFOCUS) {// Noop. It doesn't work on updates anyway. - } else if (registrationNameModules.hasOwnProperty(propKey)) { - // This is a special case. If any listener updates we need to ensure - // that the "current" fiber pointer gets updated so we need a commit - // to update this element. - if (!updatePayload) { - updatePayload = []; + + if (tag === 'button') { + ancestorInfo.buttonTagInScope = info; } - } else { - // For all other deleted properties we add it to the queue. We use - // the whitelist in the commit phase instead. - (updatePayload = updatePayload || []).push(propKey, null); - } - } - for (propKey in nextProps) { - var nextProp = nextProps[propKey]; - var lastProp = lastProps != null ? lastProps[propKey] : undefined; + if (tag === 'nobr') { + ancestorInfo.nobrTagInScope = info; + } - if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) { - continue; - } + if (tag === 'p') { + ancestorInfo.pTagInButtonScope = info; + } - if (propKey === STYLE$1) { - { - if (nextProp) { - // Freeze the next style object so that we can assume it won't be - // mutated. We have already warned for this in the past. - Object.freeze(nextProp); - } + if (tag === 'li') { + ancestorInfo.listItemTagAutoclosing = info; } - if (lastProp) { - // Unset styles on `lastProp` but not on `nextProp`. - for (styleName in lastProp) { - if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) { - if (!styleUpdates) { - styleUpdates = {}; - } + if (tag === 'dd' || tag === 'dt') { + ancestorInfo.dlItemTagAutoclosing = info; + } - styleUpdates[styleName] = ''; - } - } // Update styles that changed since `lastProp`. + return ancestorInfo; + }; + /** + * Returns whether + */ + + + var isTagValidWithParent = function (tag, parentTag) { + // First, let's check if we're in an unusual parsing mode... + switch (parentTag) { + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect + case 'select': + return tag === 'option' || tag === 'optgroup' || tag === '#text'; + + case 'optgroup': + return tag === 'option' || tag === '#text'; + // Strictly speaking, seeing an <option> doesn't mean we're in a <select> + // but + + case 'option': + return tag === '#text'; + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption + // No special behavior since these rules fall back to "in body" mode for + // all except special table nodes which cause bad parsing behavior anyway. + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr + + case 'tr': + return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template'; + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody + + case 'tbody': + case 'thead': + case 'tfoot': + return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template'; + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup + + case 'colgroup': + return tag === 'col' || tag === 'template'; + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable + + case 'table': + return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template'; + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead + + case 'head': + return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template'; + // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element + + case 'html': + return tag === 'head' || tag === 'body' || tag === 'frameset'; + + case 'frameset': + return tag === 'frame'; + + case '#document': + return tag === 'html'; + } // Probably in the "in body" parsing mode, so we outlaw only tag combos + // where the parsing rules cause implicit opens or closes to be added. + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody + + + switch (tag) { + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6'; + + case 'rp': + case 'rt': + return impliedEndTags.indexOf(parentTag) === -1; + + case 'body': + case 'caption': + case 'col': + case 'colgroup': + case 'frameset': + case 'frame': + case 'head': + case 'html': + case 'tbody': + case 'td': + case 'tfoot': + case 'th': + case 'thead': + case 'tr': + // These tags are only valid with a few parents that have special child + // parsing rules -- if we're down here, then none of those matched and + // so we allow it only if we don't know what the parent is, as all other + // cases are invalid. + return parentTag == null; + } + + return true; + }; + /** + * Returns whether + */ + + + var findInvalidAncestorForTag = function (tag, ancestorInfo) { + switch (tag) { + case 'address': + case 'article': + case 'aside': + case 'blockquote': + case 'center': + case 'details': + case 'dialog': + case 'dir': + case 'div': + case 'dl': + case 'fieldset': + case 'figcaption': + case 'figure': + case 'footer': + case 'header': + case 'hgroup': + case 'main': + case 'menu': + case 'nav': + case 'ol': + case 'p': + case 'section': + case 'summary': + case 'ul': + case 'pre': + case 'listing': + case 'table': + case 'hr': + case 'xmp': + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + return ancestorInfo.pTagInButtonScope; + + case 'form': + return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope; + + case 'li': + return ancestorInfo.listItemTagAutoclosing; + + case 'dd': + case 'dt': + return ancestorInfo.dlItemTagAutoclosing; + + case 'button': + return ancestorInfo.buttonTagInScope; + + case 'a': + // Spec says something about storing a list of markers, but it sounds + // equivalent to this check. + return ancestorInfo.aTagInScope; + + case 'nobr': + return ancestorInfo.nobrTagInScope; + } + return null; + }; - for (styleName in nextProp) { - if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) { - if (!styleUpdates) { - styleUpdates = {}; - } + var didWarn$1 = {}; - styleUpdates[styleName] = nextProp[styleName]; - } - } - } else { - // Relies on `updateStylesByID` not mutating `styleUpdates`. - if (!styleUpdates) { - if (!updatePayload) { - updatePayload = []; - } + validateDOMNesting = function (childTag, childText, ancestorInfo) { + ancestorInfo = ancestorInfo || emptyAncestorInfo; + var parentInfo = ancestorInfo.current; + var parentTag = parentInfo && parentInfo.tag; - updatePayload.push(propKey, styleUpdates); + if (childText != null) { + if (childTag != null) { + error('validateDOMNesting: when childText is passed, childTag should be null'); } - styleUpdates = nextProp; + childTag = '#text'; } - } else if (propKey === DANGEROUSLY_SET_INNER_HTML) { - var nextHtml = nextProp ? nextProp[HTML] : undefined; - var lastHtml = lastProp ? lastProp[HTML] : undefined; - if (nextHtml != null) { - if (lastHtml !== nextHtml) { - (updatePayload = updatePayload || []).push(propKey, toStringOrTrustedType(nextHtml)); - } - } else {// TODO: It might be too late to clear this if we have children - // inserted already. - } - } else if (propKey === CHILDREN) { - if (lastProp !== nextProp && (typeof nextProp === 'string' || typeof nextProp === 'number')) { - (updatePayload = updatePayload || []).push(propKey, '' + nextProp); - } - } else if (enableFlareAPI && propKey === LISTENERS || propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1) {// Noop - } else if (registrationNameModules.hasOwnProperty(propKey)) { - if (nextProp != null) { - // We eagerly listen to this even though we haven't committed yet. - if (true && typeof nextProp !== 'function') { - warnForInvalidEventListener(propKey, nextProp); - } + var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo; + var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo); + var invalidParentOrAncestor = invalidParent || invalidAncestor; - ensureListeningTo(rootContainerElement, propKey); + if (!invalidParentOrAncestor) { + return; } - if (!updatePayload && lastProp !== nextProp) { - // This is a special case. If any listener updates we need to ensure - // that the "current" props pointer gets updated so we need a commit - // to update this element. - updatePayload = []; + var ancestorTag = invalidParentOrAncestor.tag; + var addendum = getCurrentFiberStackInDev(); + var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + addendum; + + if (didWarn$1[warnKey]) { + return; } - } else { - // For any other property we always add it to the queue and then we - // filter it out using the whitelist during the commit. - (updatePayload = updatePayload || []).push(propKey, nextProp); - } - } - if (styleUpdates) { - { - validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE$1]); - } + didWarn$1[warnKey] = true; + var tagDisplayName = childTag; + var whitespaceInfo = ''; - (updatePayload = updatePayload || []).push(STYLE$1, styleUpdates); - } + if (childTag === '#text') { + if (/\S/.test(childText)) { + tagDisplayName = 'Text nodes'; + } else { + tagDisplayName = 'Whitespace text nodes'; + whitespaceInfo = " Make sure you don't have any extra whitespace between tags on " + 'each line of your source code.'; + } + } else { + tagDisplayName = '<' + childTag + '>'; + } + + if (invalidParent) { + var info = ''; - return updatePayload; -} // Apply the diff. + if (ancestorTag === 'table' && childTag === 'tr') { + info += ' Add a <tbody>, <thead> or <tfoot> to your code to match the DOM tree generated by ' + 'the browser.'; + } -function updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) { - // Update checked *before* name. - // In the middle of an update, it is possible to have multiple checked. - // When a checked radio tries to change name, browser makes another radio's checked false. - if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) { - updateChecked(domElement, nextRawProps); + error('validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info); + } else { + error('validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.', tagDisplayName, ancestorTag); + } + }; } - var wasCustomComponentTag = isCustomComponent(tag, lastRawProps); - var isCustomComponentTag = isCustomComponent(tag, nextRawProps); // Apply the diff. + var SUPPRESS_HYDRATION_WARNING$1; - updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag); // TODO: Ensure that an update gets scheduled if any of the special props - // changed. + { + SUPPRESS_HYDRATION_WARNING$1 = 'suppressHydrationWarning'; + } - switch (tag) { - case 'input': - // Update the wrapper around inputs *after* updating props. This has to - // happen after `updateDOMProperties`. Otherwise HTML5 input validations - // raise warnings and prevent the new value from being assigned. - updateWrapper(domElement, nextRawProps); - break; + var SUSPENSE_START_DATA = '$'; + var SUSPENSE_END_DATA = '/$'; + var SUSPENSE_PENDING_START_DATA = '$?'; + var SUSPENSE_FALLBACK_START_DATA = '$!'; + var STYLE$1 = 'style'; + var eventsEnabled = null; + var selectionInformation = null; - case 'textarea': - updateWrapper$1(domElement, nextRawProps); - break; + function shouldAutoFocusHostComponent(type, props) { + switch (type) { + case 'button': + case 'input': + case 'select': + case 'textarea': + return !!props.autoFocus; + } - case 'select': - // <select> value update needs to occur after <option> children - // reconciliation - postUpdateWrapper(domElement, nextRawProps); - break; + return false; } -} + function getRootHostContext(rootContainerInstance) { + var type; + var namespace; + var nodeType = rootContainerInstance.nodeType; -function getPossibleStandardName(propName) { - { - var lowerCasedName = propName.toLowerCase(); + switch (nodeType) { + case DOCUMENT_NODE: + case DOCUMENT_FRAGMENT_NODE: + { + type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment'; + var root = rootContainerInstance.documentElement; + namespace = root ? root.namespaceURI : getChildNamespace(null, ''); + break; + } - if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) { - return null; + default: + { + var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance; + var ownNamespace = container.namespaceURI || null; + type = container.tagName; + namespace = getChildNamespace(ownNamespace, type); + break; + } } - return possibleStandardNames[lowerCasedName] || null; + { + var validatedTag = type.toLowerCase(); + var ancestorInfo = updatedAncestorInfo(null, validatedTag); + return { + namespace: namespace, + ancestorInfo: ancestorInfo + }; + } + } + function getChildHostContext(parentHostContext, type, rootContainerInstance) { + { + var parentHostContextDev = parentHostContext; + var namespace = getChildNamespace(parentHostContextDev.namespace, type); + var ancestorInfo = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type); + return { + namespace: namespace, + ancestorInfo: ancestorInfo + }; + } + } + function getPublicInstance(instance) { + return instance; } + function prepareForCommit(containerInfo) { + eventsEnabled = isEnabled(); + selectionInformation = getSelectionInformation(); + setEnabled(false); + } + function resetAfterCommit(containerInfo) { + restoreSelection(selectionInformation); + setEnabled(eventsEnabled); + eventsEnabled = null; - return null; -} + selectionInformation = null; + } + function createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) { + var parentNamespace; -function diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement) { - var isCustomComponentTag; - var extraAttributeNames; + { + // TODO: take namespace into account when validating. + var hostContextDev = hostContext; + validateDOMNesting(type, null, hostContextDev.ancestorInfo); - { - suppressHydrationWarning = rawProps[SUPPRESS_HYDRATION_WARNING$1] === true; - isCustomComponentTag = isCustomComponent(tag, rawProps); - validatePropertiesInDevelopment(tag, rawProps); + if (typeof props.children === 'string' || typeof props.children === 'number') { + var string = '' + props.children; + var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type); + validateDOMNesting(null, string, ownAncestorInfo); + } - if (isCustomComponentTag && !didWarnShadyDOM && domElement.shadyRoot) { - warning$1(false, '%s is using shady DOM. Using shady DOM with React can ' + 'cause things to break subtly.', getCurrentFiberOwnerNameInDevOrNull() || 'A component'); - didWarnShadyDOM = true; + parentNamespace = hostContextDev.namespace; } - } // TODO: Make sure that we check isMounted before firing any of these events. - - switch (tag) { - case 'iframe': - case 'object': - case 'embed': - trapBubbledEvent(TOP_LOAD, domElement); - break; + var domElement = createElement(type, props, rootContainerInstance, parentNamespace); + precacheFiberNode(internalInstanceHandle, domElement); + updateFiberProps(domElement, props); + return domElement; + } + function appendInitialChild(parentInstance, child) { + parentInstance.appendChild(child); + } + function finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) { + setInitialProperties(domElement, type, props, rootContainerInstance); + return shouldAutoFocusHostComponent(type, props); + } + function prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) { + { + var hostContextDev = hostContext; - case 'video': - case 'audio': - // Create listener for each media event - for (var i = 0; i < mediaEventTypes.length; i++) { - trapBubbledEvent(mediaEventTypes[i], domElement); + if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) { + var string = '' + newProps.children; + var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type); + validateDOMNesting(null, string, ownAncestorInfo); } + } - break; + return diffProperties(domElement, type, oldProps, newProps, rootContainerInstance); + } + function shouldSetTextContent(type, props) { + return type === 'textarea' || type === 'option' || type === 'noscript' || typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && props.dangerouslySetInnerHTML.__html != null; + } + function shouldDeprioritizeSubtree(type, props) { + return !!props.hidden; + } + function createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) { + { + var hostContextDev = hostContext; + validateDOMNesting(null, text, hostContextDev.ancestorInfo); + } - case 'source': - trapBubbledEvent(TOP_ERROR, domElement); - break; + var textNode = createTextNode(text, rootContainerInstance); + precacheFiberNode(internalInstanceHandle, textNode); + return textNode; + } + // if a component just imports ReactDOM (e.g. for findDOMNode). + // Some environments might not have setTimeout or clearTimeout. - case 'img': - case 'image': - case 'link': - trapBubbledEvent(TOP_ERROR, domElement); - trapBubbledEvent(TOP_LOAD, domElement); - break; + var scheduleTimeout = typeof setTimeout === 'function' ? setTimeout : undefined; + var cancelTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined; + var noTimeout = -1; // ------------------- + function commitMount(domElement, type, newProps, internalInstanceHandle) { + // Despite the naming that might imply otherwise, this method only + // fires if there is an `Update` effect scheduled during mounting. + // This happens if `finalizeInitialChildren` returns `true` (which it + // does to implement the `autoFocus` attribute on the client). But + // there are also other cases when this might happen (such as patching + // up text content during hydration mismatch). So we'll check this again. + if (shouldAutoFocusHostComponent(type, newProps)) { + domElement.focus(); + } + } + function commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) { + // Update the props handle so that we know which props are the ones with + // with current event handlers. + updateFiberProps(domElement, newProps); // Apply the diff to the DOM node. - case 'form': - trapBubbledEvent(TOP_RESET, domElement); - trapBubbledEvent(TOP_SUBMIT, domElement); - break; + updateProperties(domElement, updatePayload, type, oldProps, newProps); + } + function resetTextContent(domElement) { + setTextContent(domElement, ''); + } + function commitTextUpdate(textInstance, oldText, newText) { + textInstance.nodeValue = newText; + } + function appendChild(parentInstance, child) { + parentInstance.appendChild(child); + } + function appendChildToContainer(container, child) { + var parentNode; - case 'details': - trapBubbledEvent(TOP_TOGGLE, domElement); - break; + if (container.nodeType === COMMENT_NODE) { + parentNode = container.parentNode; + parentNode.insertBefore(child, container); + } else { + parentNode = container; + parentNode.appendChild(child); + } // This container might be used for a portal. + // If something inside a portal is clicked, that click should bubble + // through the React tree. However, on Mobile Safari the click would + // never bubble through the *DOM* tree unless an ancestor with onclick + // event exists. So we wouldn't see it and dispatch it. + // This is why we ensure that non React root containers have inline onclick + // defined. + // https://github.com/facebook/react/issues/11918 - case 'input': - initWrapperState(domElement, rawProps); - trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening - // to onChange. Even if there is no listener. - ensureListeningTo(rootContainerElement, 'onChange'); - break; + var reactRootContainer = container._reactRootContainer; - case 'option': - validateProps(domElement, rawProps); - break; + if ((reactRootContainer === null || reactRootContainer === undefined) && parentNode.onclick === null) { + // TODO: This cast may not be sound for SVG, MathML or custom elements. + trapClickOnNonInteractiveElement(parentNode); + } + } + function insertBefore(parentInstance, child, beforeChild) { + parentInstance.insertBefore(child, beforeChild); + } + function insertInContainerBefore(container, child, beforeChild) { + if (container.nodeType === COMMENT_NODE) { + container.parentNode.insertBefore(child, beforeChild); + } else { + container.insertBefore(child, beforeChild); + } + } + function removeChild(parentInstance, child) { + parentInstance.removeChild(child); + } + function removeChildFromContainer(container, child) { + if (container.nodeType === COMMENT_NODE) { + container.parentNode.removeChild(child); + } else { + container.removeChild(child); + } + } - case 'select': - initWrapperState$1(domElement, rawProps); - trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening - // to onChange. Even if there is no listener. + function hideInstance(instance) { + // pass host context to this method? - ensureListeningTo(rootContainerElement, 'onChange'); - break; - case 'textarea': - initWrapperState$2(domElement, rawProps); - trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening - // to onChange. Even if there is no listener. + instance = instance; + var style = instance.style; - ensureListeningTo(rootContainerElement, 'onChange'); - break; + if (typeof style.setProperty === 'function') { + style.setProperty('display', 'none', 'important'); + } else { + style.display = 'none'; + } } + function hideTextInstance(textInstance) { + textInstance.nodeValue = ''; + } + function unhideInstance(instance, props) { + instance = instance; + var styleProp = props[STYLE$1]; + var display = styleProp !== undefined && styleProp !== null && styleProp.hasOwnProperty('display') ? styleProp.display : null; + instance.style.display = dangerousStyleValue('display', display); + } + function unhideTextInstance(textInstance, text) { + textInstance.nodeValue = text; + } // ------------------- + function canHydrateInstance(instance, type, props) { + if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) { + return null; + } // This has now been refined to an element node. - assertValidProps(tag, rawProps); - - { - extraAttributeNames = new Set(); - var attributes = domElement.attributes; - - for (var _i = 0; _i < attributes.length; _i++) { - var name = attributes[_i].name.toLowerCase(); - switch (name) { - // Built-in SSR attribute is whitelisted - case 'data-reactroot': - break; - // Controlled attributes are not validated - // TODO: Only ignore them on controlled tags. + return instance; + } + function canHydrateTextInstance(instance, text) { + if (text === '' || instance.nodeType !== TEXT_NODE) { + // Empty strings are not parsed by HTML so there won't be a correct match here. + return null; + } // This has now been refined to a text node. - case 'value': - break; - case 'checked': - break; + return instance; + } + function isSuspenseInstancePending(instance) { + return instance.data === SUSPENSE_PENDING_START_DATA; + } + function isSuspenseInstanceFallback(instance) { + return instance.data === SUSPENSE_FALLBACK_START_DATA; + } - case 'selected': - break; + function getNextHydratable(node) { + // Skip non-hydratable nodes. + for (; node != null; node = node.nextSibling) { + var nodeType = node.nodeType; - default: - // Intentionally use the original name. - // See discussion in https://github.com/facebook/react/pull/10676. - extraAttributeNames.add(attributes[_i].name); + if (nodeType === ELEMENT_NODE || nodeType === TEXT_NODE) { + break; } } + + return node; + } + + function getNextHydratableSibling(instance) { + return getNextHydratable(instance.nextSibling); + } + function getFirstHydratableChild(parentInstance) { + return getNextHydratable(parentInstance.firstChild); } + function hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle) { + precacheFiberNode(internalInstanceHandle, instance); // TODO: Possibly defer this until the commit phase where all the events + // get attached. - var updatePayload = null; + updateFiberProps(instance, props); + var parentNamespace; - for (var propKey in rawProps) { - if (!rawProps.hasOwnProperty(propKey)) { - continue; + { + var hostContextDev = hostContext; + parentNamespace = hostContextDev.namespace; } - var nextProp = rawProps[propKey]; + return diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance); + } + function hydrateTextInstance(textInstance, text, internalInstanceHandle) { + precacheFiberNode(internalInstanceHandle, textInstance); + return diffHydratedText(textInstance, text); + } + function getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) { + var node = suspenseInstance.nextSibling; // Skip past all nodes within this suspense boundary. + // There might be nested nodes so we need to keep track of how + // deep we are and only break out when we're back on top. - if (propKey === CHILDREN) { - // For text content children we compare against textContent. This - // might match additional HTML that is hidden when we read it using - // textContent. E.g. "foo" will match "f<span>oo</span>" but that still - // satisfies our requirement. Our requirement is not to produce perfect - // HTML and attributes. Ideally we should preserve structure but it's - // ok not to if the visible content is still enough to indicate what - // even listeners these nodes might be wired up to. - // TODO: Warn if there is more than a single textNode as a child. - // TODO: Should we use domElement.firstChild.nodeValue to compare? - if (typeof nextProp === 'string') { - if (domElement.textContent !== nextProp) { - if (true && !suppressHydrationWarning) { - warnForTextDifference(domElement.textContent, nextProp); - } + var depth = 0; - updatePayload = [CHILDREN, nextProp]; - } - } else if (typeof nextProp === 'number') { - if (domElement.textContent !== '' + nextProp) { - if (true && !suppressHydrationWarning) { - warnForTextDifference(domElement.textContent, nextProp); - } + while (node) { + if (node.nodeType === COMMENT_NODE) { + var data = node.data; - updatePayload = [CHILDREN, '' + nextProp]; - } - } - } else if (registrationNameModules.hasOwnProperty(propKey)) { - if (nextProp != null) { - if (true && typeof nextProp !== 'function') { - warnForInvalidEventListener(propKey, nextProp); + if (data === SUSPENSE_END_DATA) { + if (depth === 0) { + return getNextHydratableSibling(node); + } else { + depth--; + } + } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) { + depth++; } - - ensureListeningTo(rootContainerElement, propKey); } - } else if (true && // Convince Flow we've calculated it (it's DEV-only in this method.) - typeof isCustomComponentTag === 'boolean') { - // Validate that the properties correspond to their expected values. - var serverValue = void 0; - var propertyInfo = getPropertyInfo(propKey); - if (suppressHydrationWarning) {// Don't bother comparing. We're ignoring all these warnings. - } else if (enableFlareAPI && propKey === LISTENERS || propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1 || // Controlled attributes are not validated - // TODO: Only ignore them on controlled tags. - propKey === 'value' || propKey === 'checked' || propKey === 'selected') {// Noop - } else if (propKey === DANGEROUSLY_SET_INNER_HTML) { - var serverHTML = domElement.innerHTML; - var nextHtml = nextProp ? nextProp[HTML] : undefined; - var expectedHTML = normalizeHTML(domElement, nextHtml != null ? nextHtml : ''); - - if (expectedHTML !== serverHTML) { - warnForPropDifference(propKey, serverHTML, expectedHTML); - } - } else if (propKey === STYLE$1) { - // $FlowFixMe - Should be inferred as not undefined. - extraAttributeNames.delete(propKey); + node = node.nextSibling; + } // TODO: Warn, we didn't find the end comment boundary. - if (canDiffStyleForHydrationWarning) { - var expectedStyle = createDangerousStringForStyles(nextProp); - serverValue = domElement.getAttribute('style'); - if (expectedStyle !== serverValue) { - warnForPropDifference(propKey, serverValue, expectedStyle); - } - } - } else if (isCustomComponentTag) { - // $FlowFixMe - Should be inferred as not undefined. - extraAttributeNames.delete(propKey.toLowerCase()); - serverValue = getValueForAttribute(domElement, propKey, nextProp); + return null; + } // Returns the SuspenseInstance if this node is a direct child of a + // SuspenseInstance. I.e. if its previous sibling is a Comment with + // SUSPENSE_x_START_DATA. Otherwise, null. - if (nextProp !== serverValue) { - warnForPropDifference(propKey, serverValue, nextProp); - } - } else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) { - var isMismatchDueToBadCasing = false; + function getParentSuspenseInstance(targetInstance) { + var node = targetInstance.previousSibling; // Skip past all nodes within this suspense boundary. + // There might be nested nodes so we need to keep track of how + // deep we are and only break out when we're back on top. - if (propertyInfo !== null) { - // $FlowFixMe - Should be inferred as not undefined. - extraAttributeNames.delete(propertyInfo.attributeName); - serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo); - } else { - var ownNamespace = parentNamespace; + var depth = 0; - if (ownNamespace === HTML_NAMESPACE) { - ownNamespace = getIntrinsicNamespace(tag); - } + while (node) { + if (node.nodeType === COMMENT_NODE) { + var data = node.data; - if (ownNamespace === HTML_NAMESPACE) { - // $FlowFixMe - Should be inferred as not undefined. - extraAttributeNames.delete(propKey.toLowerCase()); + if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) { + if (depth === 0) { + return node; } else { - var standardName = getPossibleStandardName(propKey); - - if (standardName !== null && standardName !== propKey) { - // If an SVG prop is supplied with bad casing, it will - // be successfully parsed from HTML, but will produce a mismatch - // (and would be incorrectly rendered on the client). - // However, we already warn about bad casing elsewhere. - // So we'll skip the misleading extra mismatch warning in this case. - isMismatchDueToBadCasing = true; // $FlowFixMe - Should be inferred as not undefined. - - extraAttributeNames.delete(standardName); - } // $FlowFixMe - Should be inferred as not undefined. - - - extraAttributeNames.delete(propKey); + depth--; } - - serverValue = getValueForAttribute(domElement, propKey, nextProp); - } - - if (nextProp !== serverValue && !isMismatchDueToBadCasing) { - warnForPropDifference(propKey, serverValue, nextProp); + } else if (data === SUSPENSE_END_DATA) { + depth++; } } + + node = node.previousSibling; } - } - { - // $FlowFixMe - Should be inferred as not undefined. - if (extraAttributeNames.size > 0 && !suppressHydrationWarning) { - // $FlowFixMe - Should be inferred as not undefined. - warnForExtraAttributes(extraAttributeNames); - } - } - - switch (tag) { - case 'input': - // TODO: Make sure we check if this is still unmounted or do any clean - // up necessary since we never stop tracking anymore. - track(domElement); - postMountWrapper(domElement, rawProps, true); - break; - - case 'textarea': - // TODO: Make sure we check if this is still unmounted or do any clean - // up necessary since we never stop tracking anymore. - track(domElement); - postMountWrapper$3(domElement, rawProps); - break; - - case 'select': - case 'option': - // For input and textarea we current always set the value property at - // post mount to force it to diverge from attributes. However, for - // option and select we don't quite do the same thing and select - // is not resilient to the DOM state changing so we don't do that here. - // TODO: Consider not doing this for input and textarea. - break; - - default: - if (typeof rawProps.onClick === 'function') { - // TODO: This cast may not be sound for SVG, MathML or custom elements. - trapClickOnNonInteractiveElement(domElement); - } - - break; - } - - return updatePayload; -} -function diffHydratedText(textNode, text) { - var isDifferent = textNode.nodeValue !== text; - return isDifferent; -} -function warnForUnmatchedText(textNode, text) { - { - warnForTextDifference(textNode.nodeValue, text); + return null; } -} -function warnForDeletedHydratableElement(parentNode, child) { - { - if (didWarnInvalidHydration) { - return; + function commitHydratedContainer(container) { + // Retry if any event replaying was blocked on this. + retryIfBlockedOn(container); + } + function commitHydratedSuspenseInstance(suspenseInstance) { + // Retry if any event replaying was blocked on this. + retryIfBlockedOn(suspenseInstance); + } + function didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text) { + { + warnForUnmatchedText(textInstance, text); } - - didWarnInvalidHydration = true; - warningWithoutStack$1(false, 'Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase()); } -} -function warnForDeletedHydratableText(parentNode, child) { - { - if (didWarnInvalidHydration) { - return; + function didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text) { + if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) { + warnForUnmatchedText(textInstance, text); } - - didWarnInvalidHydration = true; - warningWithoutStack$1(false, 'Did not expect server HTML to contain the text node "%s" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase()); } -} -function warnForInsertedHydratedElement(parentNode, tag, props) { - { - if (didWarnInvalidHydration) { - return; + function didNotHydrateContainerInstance(parentContainer, instance) { + { + if (instance.nodeType === ELEMENT_NODE) { + warnForDeletedHydratableElement(parentContainer, instance); + } else if (instance.nodeType === COMMENT_NODE) ; else { + warnForDeletedHydratableText(parentContainer, instance); + } } - - didWarnInvalidHydration = true; - warningWithoutStack$1(false, 'Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase()); } -} -function warnForInsertedHydratedText(parentNode, text) { - { - if (text === '') { - // We expect to insert empty text nodes since they're not represented in - // the HTML. - // TODO: Remove this special case if we can just avoid inserting empty - // text nodes. - return; + function didNotHydrateInstance(parentType, parentProps, parentInstance, instance) { + if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) { + if (instance.nodeType === ELEMENT_NODE) { + warnForDeletedHydratableElement(parentInstance, instance); + } else if (instance.nodeType === COMMENT_NODE) ; else { + warnForDeletedHydratableText(parentInstance, instance); + } } - - if (didWarnInvalidHydration) { - return; + } + function didNotFindHydratableContainerInstance(parentContainer, type, props) { + { + warnForInsertedHydratedElement(parentContainer, type); } - - didWarnInvalidHydration = true; - warningWithoutStack$1(false, 'Expected server HTML to contain a matching text node for "%s" in <%s>.', text, parentNode.nodeName.toLowerCase()); } -} -function restoreControlledState$$1(domElement, tag, props) { - switch (tag) { - case 'input': - restoreControlledState$1(domElement, props); - return; - - case 'textarea': - restoreControlledState$3(domElement, props); - return; + function didNotFindHydratableContainerTextInstance(parentContainer, text) { + { + warnForInsertedHydratedText(parentContainer, text); + } + } + function didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props) { + if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) { + warnForInsertedHydratedElement(parentInstance, type); + } + } + function didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text) { + if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) { + warnForInsertedHydratedText(parentInstance, text); + } + } + function didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance) { + if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) ; + } - case 'select': - restoreControlledState$2(domElement, props); - return; + var randomKey = Math.random().toString(36).slice(2); + var internalInstanceKey = '__reactInternalInstance$' + randomKey; + var internalEventHandlersKey = '__reactEventHandlers$' + randomKey; + var internalContainerInstanceKey = '__reactContainere$' + randomKey; + function precacheFiberNode(hostInst, node) { + node[internalInstanceKey] = hostInst; + } + function markContainerAsRoot(hostRoot, node) { + node[internalContainerInstanceKey] = hostRoot; + } + function unmarkContainerAsRoot(node) { + node[internalContainerInstanceKey] = null; } -} -function listenToEventResponderEventTypes(eventTypes, element) { - if (enableFlareAPI) { - // Get the listening Set for this element. We use this to track - // what events we're listening to. - var listeningSet = getListeningSetForElement(element); // Go through each target event type of the event responder + function isContainerMarkedAsRoot(node) { + return !!node[internalContainerInstanceKey]; + } // Given a DOM node, return the closest HostComponent or HostText fiber ancestor. + // If the target node is part of a hydrated or not yet rendered subtree, then + // this may also return a SuspenseComponent or HostRoot to indicate that. + // Conceptually the HostRoot fiber is a child of the Container node. So if you + // pass the Container node as the targetNode, you will not actually get the + // HostRoot back. To get to the HostRoot, you need to pass a child of it. + // The same thing applies to Suspense boundaries. - for (var i = 0, length = eventTypes.length; i < length; ++i) { - var eventType = eventTypes[i]; - var isPassive = !endsWith(eventType, '_active'); - var eventKey = isPassive ? eventType + '_passive' : eventType; - var targetEventType = isPassive ? eventType : eventType.substring(0, eventType.length - 7); + function getClosestInstanceFromNode(targetNode) { + var targetInst = targetNode[internalInstanceKey]; - if (!listeningSet.has(eventKey)) { - trapEventForResponderEventSystem(element, targetEventType, isPassive); - listeningSet.add(eventKey); - } - } - } -} // We can remove this once the event API is stable and out of a flag + if (targetInst) { + // Don't return HostRoot or SuspenseComponent here. + return targetInst; + } // If the direct event target isn't a React owned DOM node, we need to look + // to see if one of its parents is a React owned DOM node. + + + var parentNode = targetNode.parentNode; + + while (parentNode) { + // We'll check if this is a container root that could include + // React nodes in the future. We need to check this first because + // if we're a child of a dehydrated container, we need to first + // find that inner container before moving on to finding the parent + // instance. Note that we don't check this field on the targetNode + // itself because the fibers are conceptually between the container + // node and the first child. It isn't surrounding the container node. + // If it's not a container, we check if it's an instance. + targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey]; + + if (targetInst) { + // Since this wasn't the direct target of the event, we might have + // stepped past dehydrated DOM nodes to get here. However they could + // also have been non-React nodes. We need to answer which one. + // If we the instance doesn't have any children, then there can't be + // a nested suspense boundary within it. So we can use this as a fast + // bailout. Most of the time, when people add non-React children to + // the tree, it is using a ref to a child-less DOM node. + // Normally we'd only need to check one of the fibers because if it + // has ever gone from having children to deleting them or vice versa + // it would have deleted the dehydrated boundary nested inside already. + // However, since the HostRoot starts out with an alternate it might + // have one on the alternate so we need to check in case this was a + // root. + var alternate = targetInst.alternate; + + if (targetInst.child !== null || alternate !== null && alternate.child !== null) { + // Next we need to figure out if the node that skipped past is + // nested within a dehydrated boundary and if so, which one. + var suspenseInstance = getParentSuspenseInstance(targetNode); + + while (suspenseInstance !== null) { + // We found a suspense instance. That means that we haven't + // hydrated it yet. Even though we leave the comments in the + // DOM after hydrating, and there are boundaries in the DOM + // that could already be hydrated, we wouldn't have found them + // through this pass since if the target is hydrated it would + // have had an internalInstanceKey on it. + // Let's get the fiber associated with the SuspenseComponent + // as the deepest instance. + var targetSuspenseInst = suspenseInstance[internalInstanceKey]; + + if (targetSuspenseInst) { + return targetSuspenseInst; + } // If we don't find a Fiber on the comment, it might be because + // we haven't gotten to hydrate it yet. There might still be a + // parent boundary that hasn't above this one so we need to find + // the outer most that is known. + + + suspenseInstance = getParentSuspenseInstance(suspenseInstance); // If we don't find one, then that should mean that the parent + // host component also hasn't hydrated yet. We can return it + // below since it will bail out on the isMounted check later. + } + } -if (enableFlareAPI) { - setListenToResponderEventTypes(listenToEventResponderEventTypes); -} + return targetInst; + } -function getActiveElement(doc) { - doc = doc || (typeof document !== 'undefined' ? document : undefined); + targetNode = parentNode; + parentNode = targetNode.parentNode; + } - if (typeof doc === 'undefined') { return null; } + /** + * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent + * instance, or null if the node was not rendered by this React. + */ - try { - return doc.activeElement || doc.body; - } catch (e) { - return doc.body; - } -} + function getInstanceFromNode$1(node) { + var inst = node[internalInstanceKey] || node[internalContainerInstanceKey]; -/** - * Given any node return the first leaf node without children. - * - * @param {DOMElement|DOMTextNode} node - * @return {DOMElement|DOMTextNode} - */ + if (inst) { + if (inst.tag === HostComponent || inst.tag === HostText || inst.tag === SuspenseComponent || inst.tag === HostRoot) { + return inst; + } else { + return null; + } + } -function getLeafNode(node) { - while (node && node.firstChild) { - node = node.firstChild; + return null; } + /** + * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding + * DOM node. + */ - return node; -} -/** - * Get the next sibling within a container. This will walk up the - * DOM if a node's siblings have been exhausted. - * - * @param {DOMElement|DOMTextNode} node - * @return {?DOMElement|DOMTextNode} - */ + function getNodeFromInstance$1(inst) { + if (inst.tag === HostComponent || inst.tag === HostText) { + // In Fiber this, is just the state node right now. We assume it will be + // a host component or host text. + return inst.stateNode; + } // Without this first invariant, passing a non-DOM-component triggers the next + // invariant for a missing parent, which is super confusing. -function getSiblingNode(node) { - while (node) { - if (node.nextSibling) { - return node.nextSibling; + { + { + throw Error( "getNodeFromInstance: Invalid argument." ); + } } - - node = node.parentNode; } -} -/** - * Get object describing the nodes which contain characters at offset. - * - * @param {DOMElement|DOMTextNode} root - * @param {number} offset - * @return {?object} - */ + function getFiberCurrentPropsFromNode$1(node) { + return node[internalEventHandlersKey] || null; + } + function updateFiberProps(node, props) { + node[internalEventHandlersKey] = props; + } + function getParent(inst) { + do { + inst = inst.return; // TODO: If this is a HostRoot we might want to bail out. + // That is depending on if we want nested subtrees (layers) to bubble + // events to their parent. We could also go through parentNode on the + // host node but that wouldn't work for React Native and doesn't let us + // do the portal feature. + } while (inst && inst.tag !== HostComponent); + + if (inst) { + return inst; + } -function getNodeForCharacterOffset(root, offset) { - var node = getLeafNode(root); - var nodeStart = 0; - var nodeEnd = 0; + return null; + } + /** + * Return the lowest common ancestor of A and B, or null if they are in + * different trees. + */ - while (node) { - if (node.nodeType === TEXT_NODE) { - nodeEnd = nodeStart + node.textContent.length; - if (nodeStart <= offset && nodeEnd >= offset) { - return { - node: node, - offset: offset - nodeStart - }; - } + function getLowestCommonAncestor(instA, instB) { + var depthA = 0; - nodeStart = nodeEnd; + for (var tempA = instA; tempA; tempA = getParent(tempA)) { + depthA++; } - node = getLeafNode(getSiblingNode(node)); - } -} + var depthB = 0; -/** - * @param {DOMElement} outerNode - * @return {?object} - */ + for (var tempB = instB; tempB; tempB = getParent(tempB)) { + depthB++; + } // If A is deeper, crawl up. -function getOffsets(outerNode) { - var ownerDocument = outerNode.ownerDocument; - var win = ownerDocument && ownerDocument.defaultView || window; - var selection = win.getSelection && win.getSelection(); - if (!selection || selection.rangeCount === 0) { - return null; - } + while (depthA - depthB > 0) { + instA = getParent(instA); + depthA--; + } // If B is deeper, crawl up. + + + while (depthB - depthA > 0) { + instB = getParent(instB); + depthB--; + } // Walk in lockstep until we find a match. + + + var depth = depthA; + + while (depth--) { + if (instA === instB || instA === instB.alternate) { + return instA; + } + + instA = getParent(instA); + instB = getParent(instB); + } - var anchorNode = selection.anchorNode, - anchorOffset = selection.anchorOffset, - focusNode = selection.focusNode, - focusOffset = selection.focusOffset; // In Firefox, anchorNode and focusNode can be "anonymous divs", e.g. the - // up/down buttons on an <input type="number">. Anonymous divs do not seem to - // expose properties, triggering a "Permission denied error" if any of its - // properties are accessed. The only seemingly possible way to avoid erroring - // is to access a property that typically works for non-anonymous divs and - // catch any error that may otherwise arise. See - // https://bugzilla.mozilla.org/show_bug.cgi?id=208427 - - try { - /* eslint-disable no-unused-expressions */ - anchorNode.nodeType; - focusNode.nodeType; - /* eslint-enable no-unused-expressions */ - } catch (e) { return null; } + /** + * Simulates the traversal of a two-phase, capture/bubble event dispatch. + */ - return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset); -} -/** - * Returns {start, end} where `start` is the character/codepoint index of - * (anchorNode, anchorOffset) within the textContent of `outerNode`, and - * `end` is the index of (focusNode, focusOffset). - * - * Returns null if you pass in garbage input but we should probably just crash. - * - * Exported only for testing. - */ + function traverseTwoPhase(inst, fn, arg) { + var path = []; + + while (inst) { + path.push(inst); + inst = getParent(inst); + } + + var i; -function getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) { - var length = 0; - var start = -1; - var end = -1; - var indexWithinAnchor = 0; - var indexWithinFocus = 0; - var node = outerNode; - var parentNode = null; + for (i = path.length; i-- > 0;) { + fn(path[i], 'captured', arg); + } + + for (i = 0; i < path.length; i++) { + fn(path[i], 'bubbled', arg); + } + } + /** + * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that + * should would receive a `mouseEnter` or `mouseLeave` event. + * + * Does not invoke the callback on the nearest common ancestor because nothing + * "entered" or "left" that element. + */ - outer: while (true) { - var next = null; + function traverseEnterLeave(from, to, fn, argFrom, argTo) { + var common = from && to ? getLowestCommonAncestor(from, to) : null; + var pathFrom = []; while (true) { - if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) { - start = length + anchorOffset; + if (!from) { + break; } - if (node === focusNode && (focusOffset === 0 || node.nodeType === TEXT_NODE)) { - end = length + focusOffset; + if (from === common) { + break; } - if (node.nodeType === TEXT_NODE) { - length += node.nodeValue.length; - } + var alternate = from.alternate; - if ((next = node.firstChild) === null) { + if (alternate !== null && alternate === common) { break; - } // Moving from `node` to its first child `next`. - + } - parentNode = node; - node = next; + pathFrom.push(from); + from = getParent(from); } + var pathTo = []; + while (true) { - if (node === outerNode) { - // If `outerNode` has children, this is always the second time visiting - // it. If it has no children, this is still the first loop, and the only - // valid selection is anchorNode and focusNode both equal to this node - // and both offsets 0, in which case we will have handled above. - break outer; + if (!to) { + break; } - if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset) { - start = length; + if (to === common) { + break; } - if (parentNode === focusNode && ++indexWithinFocus === focusOffset) { - end = length; - } + var _alternate = to.alternate; - if ((next = node.nextSibling) !== null) { + if (_alternate !== null && _alternate === common) { break; } - node = parentNode; - parentNode = node.parentNode; - } // Moving from `node` to its next sibling `next`. + pathTo.push(to); + to = getParent(to); + } + for (var i = 0; i < pathFrom.length; i++) { + fn(pathFrom[i], 'bubbled', argFrom); + } - node = next; + for (var _i = pathTo.length; _i-- > 0;) { + fn(pathTo[_i], 'captured', argTo); + } } - if (start === -1 || end === -1) { - // This should never happen. (Would happen if the anchor/focus nodes aren't - // actually inside the passed-in node.) - return null; + function isInteractive(tag) { + return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea'; } - return { - start: start, - end: end - }; -} -/** - * In modern non-IE browsers, we can support both forward and backward - * selections. - * - * Note: IE10+ supports the Selection object, but it does not support - * the `extend` method, which means that even in modern IE, it's not possible - * to programmatically create a backward selection. Thus, for all IE - * versions, we use the old IE API to create our selections. - * - * @param {DOMElement|DOMTextNode} node - * @param {object} offsets - */ - -function setOffsets(node, offsets) { - var doc = node.ownerDocument || document; - var win = doc && doc.defaultView || window; // Edge fails with "Object expected" in some scenarios. - // (For instance: TinyMCE editor used in a list component that supports pasting to add more, - // fails when pasting 100+ items) + function shouldPreventMouseEvent(name, type, props) { + switch (name) { + case 'onClick': + case 'onClickCapture': + case 'onDoubleClick': + case 'onDoubleClickCapture': + case 'onMouseDown': + case 'onMouseDownCapture': + case 'onMouseMove': + case 'onMouseMoveCapture': + case 'onMouseUp': + case 'onMouseUpCapture': + case 'onMouseEnter': + return !!(props.disabled && isInteractive(type)); - if (!win.getSelection) { - return; + default: + return false; + } } + /** + * @param {object} inst The instance, which is the source of events. + * @param {string} registrationName Name of listener (e.g. `onClick`). + * @return {?function} The stored callback. + */ - var selection = win.getSelection(); - var length = node.textContent.length; - var start = Math.min(offsets.start, length); - var end = offsets.end === undefined ? start : Math.min(offsets.end, length); // IE 11 uses modern selection, but doesn't support the extend method. - // Flip backward selections, so we can set with a single range. - if (!selection.extend && start > end) { - var temp = end; - end = start; - start = temp; - } + function getListener(inst, registrationName) { + var listener; // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not + // live here; needs to be moved to a better place soon - var startMarker = getNodeForCharacterOffset(node, start); - var endMarker = getNodeForCharacterOffset(node, end); + var stateNode = inst.stateNode; - if (startMarker && endMarker) { - if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) { - return; + if (!stateNode) { + // Work in progress (ex: onload events in incremental mode). + return null; } - var range = doc.createRange(); - range.setStart(startMarker.node, startMarker.offset); - selection.removeAllRanges(); + var props = getFiberCurrentPropsFromNode(stateNode); - if (start > end) { - selection.addRange(range); - selection.extend(endMarker.node, endMarker.offset); - } else { - range.setEnd(endMarker.node, endMarker.offset); - selection.addRange(range); + if (!props) { + // Work in progress. + return null; } - } -} -function isTextNode(node) { - return node && node.nodeType === TEXT_NODE; -} - -function containsNode(outerNode, innerNode) { - if (!outerNode || !innerNode) { - return false; - } else if (outerNode === innerNode) { - return true; - } else if (isTextNode(outerNode)) { - return false; - } else if (isTextNode(innerNode)) { - return containsNode(outerNode, innerNode.parentNode); - } else if ('contains' in outerNode) { - return outerNode.contains(innerNode); - } else if (outerNode.compareDocumentPosition) { - return !!(outerNode.compareDocumentPosition(innerNode) & 16); - } else { - return false; - } -} - -function isInDocument(node) { - return node && node.ownerDocument && containsNode(node.ownerDocument.documentElement, node); -} - -function isSameOriginFrame(iframe) { - try { - // Accessing the contentDocument of a HTMLIframeElement can cause the browser - // to throw, e.g. if it has a cross-origin src attribute. - // Safari will show an error in the console when the access results in "Blocked a frame with origin". e.g: - // iframe.contentDocument.defaultView; - // A safety way is to access one of the cross origin properties: Window or Location - // Which might result in "SecurityError" DOM Exception and it is compatible to Safari. - // https://html.spec.whatwg.org/multipage/browsers.html#integration-with-idl - return typeof iframe.contentWindow.location.href === 'string'; - } catch (err) { - return false; - } -} + listener = props[registrationName]; -function getActiveElementDeep() { - var win = window; - var element = getActiveElement(); + if (shouldPreventMouseEvent(registrationName, inst.type, props)) { + return null; + } - while (element instanceof win.HTMLIFrameElement) { - if (isSameOriginFrame(element)) { - win = element.contentWindow; - } else { - return element; + if (!(!listener || typeof listener === 'function')) { + { + throw Error( "Expected `" + registrationName + "` listener to be a function, instead got a value of `" + typeof listener + "` type." ); + } } - element = getActiveElement(win.document); + return listener; } - return element; -} -/** - * @ReactInputSelection: React input selection module. Based on Selection.js, - * but modified to be suitable for react and has a couple of bug fixes (doesn't - * assume buttons have range selections allowed). - * Input selection module for React. - */ + /** + * Some event types have a notion of different registration names for different + * "phases" of propagation. This finds listeners by a given phase. + */ + function listenerAtPhase(inst, event, propagationPhase) { + var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase]; + return getListener(inst, registrationName); + } + /** + * A small set of propagation patterns, each of which will accept a small amount + * of information, and generate a set of "dispatch ready event objects" - which + * are sets of events that have already been annotated with a set of dispatched + * listener functions/ids. The API is designed this way to discourage these + * propagation strategies from actually executing the dispatches, since we + * always want to collect the entire set of dispatches before executing even a + * single one. + */ -/** - * @hasSelectionCapabilities: we get the element types that support selection - * from https://html.spec.whatwg.org/#do-not-apply, looking at `selectionStart` - * and `selectionEnd` rows. - */ + /** + * Tags a `SyntheticEvent` with dispatched listeners. Creating this function + * here, allows us to not have to bind or create functions for each event. + * Mutating the event's members allows us to not have to create a wrapping + * "dispatch" object that pairs the event with the listener. + */ -function hasSelectionCapabilities(elem) { - var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); - return nodeName && (nodeName === 'input' && (elem.type === 'text' || elem.type === 'search' || elem.type === 'tel' || elem.type === 'url' || elem.type === 'password') || nodeName === 'textarea' || elem.contentEditable === 'true'); -} -function getSelectionInformation() { - var focusedElem = getActiveElementDeep(); - return { - focusedElem: focusedElem, - selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection(focusedElem) : null - }; -} -/** - * @restoreSelection: If any selection information was potentially lost, - * restore it. This is useful when performing operations that could remove dom - * nodes and place them back in, resulting in focus being lost. - */ + function accumulateDirectionalDispatches(inst, phase, event) { + { + if (!inst) { + error('Dispatching inst must not be null'); + } + } + + var listener = listenerAtPhase(inst, event, phase); + + if (listener) { + event._dispatchListeners = accumulateInto(event._dispatchListeners, listener); + event._dispatchInstances = accumulateInto(event._dispatchInstances, inst); + } + } + /** + * Collect dispatches (must be entirely collected before dispatching - see unit + * tests). Lazily allocate the array to conserve memory. We must loop through + * each event and perform the traversal for each one. We cannot perform a + * single traversal for the entire collection of events because each event may + * have a different target. + */ -function restoreSelection(priorSelectionInformation) { - var curFocusedElem = getActiveElementDeep(); - var priorFocusedElem = priorSelectionInformation.focusedElem; - var priorSelectionRange = priorSelectionInformation.selectionRange; - if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) { - if (priorSelectionRange !== null && hasSelectionCapabilities(priorFocusedElem)) { - setSelection(priorFocusedElem, priorSelectionRange); - } // Focusing a node can change the scroll position, which is undesirable + function accumulateTwoPhaseDispatchesSingle(event) { + if (event && event.dispatchConfig.phasedRegistrationNames) { + traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event); + } + } + /** + * Accumulates without regard to direction, does not look for phased + * registration names. Same as `accumulateDirectDispatchesSingle` but without + * requiring that the `dispatchMarker` be the same as the dispatched ID. + */ - var ancestors = []; - var ancestor = priorFocusedElem; + function accumulateDispatches(inst, ignoredDirection, event) { + if (inst && event && event.dispatchConfig.registrationName) { + var registrationName = event.dispatchConfig.registrationName; + var listener = getListener(inst, registrationName); - while (ancestor = ancestor.parentNode) { - if (ancestor.nodeType === ELEMENT_NODE) { - ancestors.push({ - element: ancestor, - left: ancestor.scrollLeft, - top: ancestor.scrollTop - }); + if (listener) { + event._dispatchListeners = accumulateInto(event._dispatchListeners, listener); + event._dispatchInstances = accumulateInto(event._dispatchInstances, inst); } } + } + /** + * Accumulates dispatches on an `SyntheticEvent`, but only for the + * `dispatchMarker`. + * @param {SyntheticEvent} event + */ - if (typeof priorFocusedElem.focus === 'function') { - priorFocusedElem.focus(); - } - for (var i = 0; i < ancestors.length; i++) { - var info = ancestors[i]; - info.element.scrollLeft = info.left; - info.element.scrollTop = info.top; + function accumulateDirectDispatchesSingle(event) { + if (event && event.dispatchConfig.registrationName) { + accumulateDispatches(event._targetInst, null, event); } } -} -/** - * @getSelection: Gets the selection bounds of a focused textarea, input or - * contentEditable node. - * -@input: Look up selection bounds of this input - * -@return {start: selectionStart, end: selectionEnd} - */ -function getSelection(input) { - var selection; + function accumulateTwoPhaseDispatches(events) { + forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle); + } + function accumulateEnterLeaveDispatches(leave, enter, from, to) { + traverseEnterLeave(from, to, accumulateDispatches, leave, enter); + } + function accumulateDirectDispatches(events) { + forEachAccumulated(events, accumulateDirectDispatchesSingle); + } - if ('selectionStart' in input) { - // Modern browser with input or textarea. - selection = { - start: input.selectionStart, - end: input.selectionEnd - }; - } else { - // Content editable or old IE textarea. - selection = getOffsets(input); + /** + * These variables store information about text content of a target node, + * allowing comparison of content before and after a given event. + * + * Identify the node where selection currently begins, then observe + * both its text content and its current position in the DOM. Since the + * browser may natively replace the target node during composition, we can + * use its position to find its replacement. + * + * + */ + var root = null; + var startText = null; + var fallbackText = null; + function initialize(nativeEventTarget) { + root = nativeEventTarget; + startText = getText(); + return true; } + function reset() { + root = null; + startText = null; + fallbackText = null; + } + function getData() { + if (fallbackText) { + return fallbackText; + } - return selection || { - start: 0, - end: 0 - }; -} -/** - * @setSelection: Sets the selection bounds of a textarea or input and focuses - * the input. - * -@input Set selection bounds of this input or textarea - * -@offsets Object of same form that is returned from get* - */ + var start; + var startValue = startText; + var startLength = startValue.length; + var end; + var endValue = getText(); + var endLength = endValue.length; -function setSelection(input, offsets) { - var start = offsets.start, - end = offsets.end; + for (start = 0; start < startLength; start++) { + if (startValue[start] !== endValue[start]) { + break; + } + } - if (end === undefined) { - end = start; - } + var minEnd = startLength - start; - if ('selectionStart' in input) { - input.selectionStart = start; - input.selectionEnd = Math.min(end, input.value.length); - } else { - setOffsets(input, offsets); + for (end = 1; end <= minEnd; end++) { + if (startValue[startLength - end] !== endValue[endLength - end]) { + break; + } + } + + var sliceTail = end > 1 ? 1 - end : undefined; + fallbackText = endValue.slice(start, sliceTail); + return fallbackText; } -} + function getText() { + if ('value' in root) { + return root.value; + } -var validateDOMNesting = function () {}; + return root.textContent; + } -var updatedAncestorInfo = function () {}; + var EVENT_POOL_SIZE = 10; + /** + * @interface Event + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ -{ - // This validation code was written based on the HTML5 parsing spec: - // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope - // - // Note: this does not catch all invalid nesting, nor does it try to (as it's - // not clear what practical benefit doing so provides); instead, we warn only - // for cases where the parser will give a parse tree differing from what React - // intended. For example, <b><div></div></b> is invalid but we don't warn - // because it still parses correctly; we do warn for other cases like nested - // <p> tags where the beginning of the second element implicitly closes the - // first, causing a confusing mess. - // https://html.spec.whatwg.org/multipage/syntax.html#special - var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope - - var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template', // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point - // TODO: Distinguish by namespace here -- for <title>, including it here - // errs on the side of fewer warnings - 'foreignObject', 'desc', 'title']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope - - var buttonScopeTags = inScopeTags.concat(['button']); // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags - - var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt']; - var emptyAncestorInfo = { - current: null, - formTag: null, - aTagInScope: null, - buttonTagInScope: null, - nobrTagInScope: null, - pTagInButtonScope: null, - listItemTagAutoclosing: null, - dlItemTagAutoclosing: null + var EventInterface = { + type: null, + target: null, + // currentTarget is set when dispatching; no use in copying it here + currentTarget: function () { + return null; + }, + eventPhase: null, + bubbles: null, + cancelable: null, + timeStamp: function (event) { + return event.timeStamp || Date.now(); + }, + defaultPrevented: null, + isTrusted: null }; - updatedAncestorInfo = function (oldInfo, tag) { - var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo); - - var info = { - tag: tag - }; - - if (inScopeTags.indexOf(tag) !== -1) { - ancestorInfo.aTagInScope = null; - ancestorInfo.buttonTagInScope = null; - ancestorInfo.nobrTagInScope = null; - } + function functionThatReturnsTrue() { + return true; + } - if (buttonScopeTags.indexOf(tag) !== -1) { - ancestorInfo.pTagInButtonScope = null; - } // See rules for 'li', 'dd', 'dt' start tags in - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody + function functionThatReturnsFalse() { + return false; + } + /** + * Synthetic events are dispatched by event plugins, typically in response to a + * top-level event delegation handler. + * + * These systems should generally use pooling to reduce the frequency of garbage + * collection. The system should check `isPersistent` to determine whether the + * event should be released into the pool after being dispatched. Users that + * need a persisted event should invoke `persist`. + * + * Synthetic events (and subclasses) implement the DOM Level 3 Events API by + * normalizing browser quirks. Subclasses do not necessarily have to implement a + * DOM interface; custom application-specific events can also subclass this. + * + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {*} targetInst Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @param {DOMEventTarget} nativeEventTarget Target node. + */ - if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') { - ancestorInfo.listItemTagAutoclosing = null; - ancestorInfo.dlItemTagAutoclosing = null; + function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) { + { + // these have a getter/setter for warnings + delete this.nativeEvent; + delete this.preventDefault; + delete this.stopPropagation; + delete this.isDefaultPrevented; + delete this.isPropagationStopped; } - ancestorInfo.current = info; - - if (tag === 'form') { - ancestorInfo.formTag = info; - } + this.dispatchConfig = dispatchConfig; + this._targetInst = targetInst; + this.nativeEvent = nativeEvent; + var Interface = this.constructor.Interface; - if (tag === 'a') { - ancestorInfo.aTagInScope = info; - } + for (var propName in Interface) { + if (!Interface.hasOwnProperty(propName)) { + continue; + } - if (tag === 'button') { - ancestorInfo.buttonTagInScope = info; - } + { + delete this[propName]; // this has a getter/setter for warnings + } - if (tag === 'nobr') { - ancestorInfo.nobrTagInScope = info; - } + var normalize = Interface[propName]; - if (tag === 'p') { - ancestorInfo.pTagInButtonScope = info; + if (normalize) { + this[propName] = normalize(nativeEvent); + } else { + if (propName === 'target') { + this.target = nativeEventTarget; + } else { + this[propName] = nativeEvent[propName]; + } + } } - if (tag === 'li') { - ancestorInfo.listItemTagAutoclosing = info; - } + var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false; - if (tag === 'dd' || tag === 'dt') { - ancestorInfo.dlItemTagAutoclosing = info; + if (defaultPrevented) { + this.isDefaultPrevented = functionThatReturnsTrue; + } else { + this.isDefaultPrevented = functionThatReturnsFalse; } - return ancestorInfo; - }; - /** - * Returns whether - */ - + this.isPropagationStopped = functionThatReturnsFalse; + return this; + } - var isTagValidWithParent = function (tag, parentTag) { - // First, let's check if we're in an unusual parsing mode... - switch (parentTag) { - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect - case 'select': - return tag === 'option' || tag === 'optgroup' || tag === '#text'; + _assign(SyntheticEvent.prototype, { + preventDefault: function () { + this.defaultPrevented = true; + var event = this.nativeEvent; - case 'optgroup': - return tag === 'option' || tag === '#text'; - // Strictly speaking, seeing an <option> doesn't mean we're in a <select> - // but + if (!event) { + return; + } - case 'option': - return tag === '#text'; - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption - // No special behavior since these rules fall back to "in body" mode for - // all except special table nodes which cause bad parsing behavior anyway. - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr + if (event.preventDefault) { + event.preventDefault(); + } else if (typeof event.returnValue !== 'unknown') { + event.returnValue = false; + } - case 'tr': - return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template'; - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody + this.isDefaultPrevented = functionThatReturnsTrue; + }, + stopPropagation: function () { + var event = this.nativeEvent; - case 'tbody': - case 'thead': - case 'tfoot': - return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template'; - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup + if (!event) { + return; + } - case 'colgroup': - return tag === 'col' || tag === 'template'; - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable + if (event.stopPropagation) { + event.stopPropagation(); + } else if (typeof event.cancelBubble !== 'unknown') { + // The ChangeEventPlugin registers a "propertychange" event for + // IE. This event does not support bubbling or cancelling, and + // any references to cancelBubble throw "Member not found". A + // typeof check of "unknown" circumvents this issue (and is also + // IE specific). + event.cancelBubble = true; + } - case 'table': - return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template'; - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead + this.isPropagationStopped = functionThatReturnsTrue; + }, - case 'head': - return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template'; - // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element + /** + * We release all dispatched `SyntheticEvent`s after each event loop, adding + * them back into the pool. This allows a way to hold onto a reference that + * won't be added back into the pool. + */ + persist: function () { + this.isPersistent = functionThatReturnsTrue; + }, - case 'html': - return tag === 'head' || tag === 'body' || tag === 'frameset'; + /** + * Checks if this event should be released back into the pool. + * + * @return {boolean} True if this should not be released, false otherwise. + */ + isPersistent: functionThatReturnsFalse, - case 'frameset': - return tag === 'frame'; + /** + * `PooledClass` looks for `destructor` on each instance it releases. + */ + destructor: function () { + var Interface = this.constructor.Interface; - case '#document': - return tag === 'html'; - } // Probably in the "in body" parsing mode, so we outlaw only tag combos - // where the parsing rules cause implicit opens or closes to be added. - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody + for (var propName in Interface) { + { + Object.defineProperty(this, propName, getPooledWarningPropertyDefinition(propName, Interface[propName])); + } + } + this.dispatchConfig = null; + this._targetInst = null; + this.nativeEvent = null; + this.isDefaultPrevented = functionThatReturnsFalse; + this.isPropagationStopped = functionThatReturnsFalse; + this._dispatchListeners = null; + this._dispatchInstances = null; - switch (tag) { - case 'h1': - case 'h2': - case 'h3': - case 'h4': - case 'h5': - case 'h6': - return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6'; - - case 'rp': - case 'rt': - return impliedEndTags.indexOf(parentTag) === -1; - - case 'body': - case 'caption': - case 'col': - case 'colgroup': - case 'frameset': - case 'frame': - case 'head': - case 'html': - case 'tbody': - case 'td': - case 'tfoot': - case 'th': - case 'thead': - case 'tr': - // These tags are only valid with a few parents that have special child - // parsing rules -- if we're down here, then none of those matched and - // so we allow it only if we don't know what the parent is, as all other - // cases are invalid. - return parentTag == null; + { + Object.defineProperty(this, 'nativeEvent', getPooledWarningPropertyDefinition('nativeEvent', null)); + Object.defineProperty(this, 'isDefaultPrevented', getPooledWarningPropertyDefinition('isDefaultPrevented', functionThatReturnsFalse)); + Object.defineProperty(this, 'isPropagationStopped', getPooledWarningPropertyDefinition('isPropagationStopped', functionThatReturnsFalse)); + Object.defineProperty(this, 'preventDefault', getPooledWarningPropertyDefinition('preventDefault', function () {})); + Object.defineProperty(this, 'stopPropagation', getPooledWarningPropertyDefinition('stopPropagation', function () {})); + } } + }); - return true; - }; + SyntheticEvent.Interface = EventInterface; /** - * Returns whether + * Helper to reduce boilerplate when creating subclasses. */ + SyntheticEvent.extend = function (Interface) { + var Super = this; - var findInvalidAncestorForTag = function (tag, ancestorInfo) { - switch (tag) { - case 'address': - case 'article': - case 'aside': - case 'blockquote': - case 'center': - case 'details': - case 'dialog': - case 'dir': - case 'div': - case 'dl': - case 'fieldset': - case 'figcaption': - case 'figure': - case 'footer': - case 'header': - case 'hgroup': - case 'main': - case 'menu': - case 'nav': - case 'ol': - case 'p': - case 'section': - case 'summary': - case 'ul': - case 'pre': - case 'listing': - case 'table': - case 'hr': - case 'xmp': - case 'h1': - case 'h2': - case 'h3': - case 'h4': - case 'h5': - case 'h6': - return ancestorInfo.pTagInButtonScope; - - case 'form': - return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope; - - case 'li': - return ancestorInfo.listItemTagAutoclosing; - - case 'dd': - case 'dt': - return ancestorInfo.dlItemTagAutoclosing; + var E = function () {}; - case 'button': - return ancestorInfo.buttonTagInScope; - - case 'a': - // Spec says something about storing a list of markers, but it sounds - // equivalent to this check. - return ancestorInfo.aTagInScope; + E.prototype = Super.prototype; + var prototype = new E(); - case 'nobr': - return ancestorInfo.nobrTagInScope; + function Class() { + return Super.apply(this, arguments); } - return null; + _assign(prototype, Class.prototype); + + Class.prototype = prototype; + Class.prototype.constructor = Class; + Class.Interface = _assign({}, Super.Interface, Interface); + Class.extend = Super.extend; + addEventPoolingTo(Class); + return Class; }; - var didWarn$1 = {}; + addEventPoolingTo(SyntheticEvent); + /** + * Helper to nullify syntheticEvent instance properties when destructing + * + * @param {String} propName + * @param {?object} getVal + * @return {object} defineProperty object + */ - validateDOMNesting = function (childTag, childText, ancestorInfo) { - ancestorInfo = ancestorInfo || emptyAncestorInfo; - var parentInfo = ancestorInfo.current; - var parentTag = parentInfo && parentInfo.tag; + function getPooledWarningPropertyDefinition(propName, getVal) { + var isFunction = typeof getVal === 'function'; + return { + configurable: true, + set: set, + get: get + }; - if (childText != null) { - !(childTag == null) ? warningWithoutStack$1(false, 'validateDOMNesting: when childText is passed, childTag should be null') : void 0; - childTag = '#text'; + function set(val) { + var action = isFunction ? 'setting the method' : 'setting the property'; + warn(action, 'This is effectively a no-op'); + return val; } - var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo; - var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo); - var invalidParentOrAncestor = invalidParent || invalidAncestor; - - if (!invalidParentOrAncestor) { - return; + function get() { + var action = isFunction ? 'accessing the method' : 'accessing the property'; + var result = isFunction ? 'This is a no-op function' : 'This is set to null'; + warn(action, result); + return getVal; } - var ancestorTag = invalidParentOrAncestor.tag; - var addendum = getCurrentFiberStackInDev(); - var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + addendum; - - if (didWarn$1[warnKey]) { - return; + function warn(action, result) { + { + error("This synthetic event is reused for performance reasons. If you're seeing this, " + "you're %s `%s` on a released/nullified synthetic event. %s. " + 'If you must keep the original synthetic event around, use event.persist(). ' + 'See https://fb.me/react-event-pooling for more information.', action, propName, result); + } } + } - didWarn$1[warnKey] = true; - var tagDisplayName = childTag; - var whitespaceInfo = ''; + function getPooledEvent(dispatchConfig, targetInst, nativeEvent, nativeInst) { + var EventConstructor = this; - if (childTag === '#text') { - if (/\S/.test(childText)) { - tagDisplayName = 'Text nodes'; - } else { - tagDisplayName = 'Whitespace text nodes'; - whitespaceInfo = " Make sure you don't have any extra whitespace between tags on " + 'each line of your source code.'; - } - } else { - tagDisplayName = '<' + childTag + '>'; + if (EventConstructor.eventPool.length) { + var instance = EventConstructor.eventPool.pop(); + EventConstructor.call(instance, dispatchConfig, targetInst, nativeEvent, nativeInst); + return instance; } - if (invalidParent) { - var info = ''; + return new EventConstructor(dispatchConfig, targetInst, nativeEvent, nativeInst); + } + + function releasePooledEvent(event) { + var EventConstructor = this; - if (ancestorTag === 'table' && childTag === 'tr') { - info += ' Add a <tbody>, <thead> or <tfoot> to your code to match the DOM tree generated by ' + 'the browser.'; + if (!(event instanceof EventConstructor)) { + { + throw Error( "Trying to release an event instance into a pool of a different type." ); } - - warningWithoutStack$1(false, 'validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info, addendum); - } else { - warningWithoutStack$1(false, 'validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.%s', tagDisplayName, ancestorTag, addendum); } - }; -} -// can re-export everything from this module. + event.destructor(); -function shim() { - { - { - throw Error("The current renderer does not support persistence. This error is likely caused by a bug in React. Please file an issue."); + if (EventConstructor.eventPool.length < EVENT_POOL_SIZE) { + EventConstructor.eventPool.push(event); } } -} // Persistence (when unsupported) + function addEventPoolingTo(EventConstructor) { + EventConstructor.eventPool = []; + EventConstructor.getPooled = getPooledEvent; + EventConstructor.release = releasePooledEvent; + } -var supportsPersistence = false; -var cloneInstance = shim; -var cloneFundamentalInstance = shim; -var createContainerChildSet = shim; -var appendChildToContainerChildSet = shim; -var finalizeContainerChildren = shim; -var replaceContainerChildren = shim; -var cloneHiddenInstance = shim; -var cloneHiddenTextInstance = shim; - -var SUPPRESS_HYDRATION_WARNING; + /** + * @interface Event + * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents + */ -{ - SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning'; -} + var SyntheticCompositionEvent = SyntheticEvent.extend({ + data: null + }); -var SUSPENSE_START_DATA = '$'; -var SUSPENSE_END_DATA = '/$'; -var SUSPENSE_PENDING_START_DATA = '$?'; -var SUSPENSE_FALLBACK_START_DATA = '$!'; -var STYLE = 'style'; -var eventsEnabled = null; -var selectionInformation = null; + /** + * @interface Event + * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105 + * /#events-inputevents + */ -function shouldAutoFocusHostComponent(type, props) { - switch (type) { - case 'button': - case 'input': - case 'select': - case 'textarea': - return !!props.autoFocus; - } + var SyntheticInputEvent = SyntheticEvent.extend({ + data: null + }); - return false; -} + var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space -function getRootHostContext(rootContainerInstance) { - var type; - var namespace; - var nodeType = rootContainerInstance.nodeType; + var START_KEYCODE = 229; + var canUseCompositionEvent = canUseDOM && 'CompositionEvent' in window; + var documentMode = null; - switch (nodeType) { - case DOCUMENT_NODE: - case DOCUMENT_FRAGMENT_NODE: - { - type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment'; - var root = rootContainerInstance.documentElement; - namespace = root ? root.namespaceURI : getChildNamespace(null, ''); - break; - } + if (canUseDOM && 'documentMode' in document) { + documentMode = document.documentMode; + } // Webkit offers a very useful `textInput` event that can be used to + // directly represent `beforeInput`. The IE `textinput` event is not as + // useful, so we don't use it. - default: - { - var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance; - var ownNamespace = container.namespaceURI || null; - type = container.tagName; - namespace = getChildNamespace(ownNamespace, type); - break; - } - } - { - var validatedTag = type.toLowerCase(); - var ancestorInfo = updatedAncestorInfo(null, validatedTag); - return { - namespace: namespace, - ancestorInfo: ancestorInfo - }; - } + var canUseTextInputEvent = canUseDOM && 'TextEvent' in window && !documentMode; // In IE9+, we have access to composition events, but the data supplied + // by the native compositionend event may be incorrect. Japanese ideographic + // spaces, for instance (\u3000) are not recorded correctly. - return namespace; -} -function getChildHostContext(parentHostContext, type, rootContainerInstance) { - { - var parentHostContextDev = parentHostContext; - var namespace = getChildNamespace(parentHostContextDev.namespace, type); - var ancestorInfo = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type); - return { - namespace: namespace, - ancestorInfo: ancestorInfo - }; - } + var useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11); + var SPACEBAR_CODE = 32; + var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); // Events and their corresponding property names. - var parentNamespace = parentHostContext; - return getChildNamespace(parentNamespace, type); -} -function getPublicInstance(instance) { - return instance; -} -function prepareForCommit(containerInfo) { - eventsEnabled = isEnabled(); - selectionInformation = getSelectionInformation(); - setEnabled(false); -} -function resetAfterCommit(containerInfo) { - restoreSelection(selectionInformation); - selectionInformation = null; - setEnabled(eventsEnabled); - eventsEnabled = null; -} -function createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) { - var parentNamespace; + var eventTypes = { + beforeInput: { + phasedRegistrationNames: { + bubbled: 'onBeforeInput', + captured: 'onBeforeInputCapture' + }, + dependencies: [TOP_COMPOSITION_END, TOP_KEY_PRESS, TOP_TEXT_INPUT, TOP_PASTE] + }, + compositionEnd: { + phasedRegistrationNames: { + bubbled: 'onCompositionEnd', + captured: 'onCompositionEndCapture' + }, + dependencies: [TOP_BLUR, TOP_COMPOSITION_END, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN] + }, + compositionStart: { + phasedRegistrationNames: { + bubbled: 'onCompositionStart', + captured: 'onCompositionStartCapture' + }, + dependencies: [TOP_BLUR, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN] + }, + compositionUpdate: { + phasedRegistrationNames: { + bubbled: 'onCompositionUpdate', + captured: 'onCompositionUpdateCapture' + }, + dependencies: [TOP_BLUR, TOP_COMPOSITION_UPDATE, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN] + } + }; // Track whether we've ever handled a keypress on the space key. - { - // TODO: take namespace into account when validating. - var hostContextDev = hostContext; - validateDOMNesting(type, null, hostContextDev.ancestorInfo); - - if (typeof props.children === 'string' || typeof props.children === 'number') { - var string = '' + props.children; - var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type); - validateDOMNesting(null, string, ownAncestorInfo); - } - - parentNamespace = hostContextDev.namespace; - } - - var domElement = createElement(type, props, rootContainerInstance, parentNamespace); - precacheFiberNode(internalInstanceHandle, domElement); - updateFiberProps(domElement, props); - return domElement; -} -function appendInitialChild(parentInstance, child) { - parentInstance.appendChild(child); -} -function finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) { - setInitialProperties(domElement, type, props, rootContainerInstance); - return shouldAutoFocusHostComponent(type, props); -} -function prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) { - { - var hostContextDev = hostContext; + var hasSpaceKeypress = false; + /** + * Return whether a native keypress event is assumed to be a command. + * This is required because Firefox fires `keypress` events for key commands + * (cut, copy, select-all, etc.) even though no character is inserted. + */ - if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) { - var string = '' + newProps.children; - var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type); - validateDOMNesting(null, string, ownAncestorInfo); - } + function isKeypressCommand(nativeEvent) { + return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && // ctrlKey && altKey is equivalent to AltGr, and is not a command. + !(nativeEvent.ctrlKey && nativeEvent.altKey); } + /** + * Translate native top level events into event types. + * + * @param {string} topLevelType + * @return {object} + */ - return diffProperties(domElement, type, oldProps, newProps, rootContainerInstance); -} -function shouldSetTextContent(type, props) { - return type === 'textarea' || type === 'option' || type === 'noscript' || typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && props.dangerouslySetInnerHTML.__html != null; -} -function shouldDeprioritizeSubtree(type, props) { - return !!props.hidden; -} -function createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) { - { - var hostContextDev = hostContext; - validateDOMNesting(null, text, hostContextDev.ancestorInfo); - } - - var textNode = createTextNode(text, rootContainerInstance); - precacheFiberNode(internalInstanceHandle, textNode); - return textNode; -} -var isPrimaryRenderer = true; -var warnsIfNotActing = true; // This initialization code may run even on server environments -// if a component just imports ReactDOM (e.g. for findDOMNode). -// Some environments might not have setTimeout or clearTimeout. - -var scheduleTimeout = typeof setTimeout === 'function' ? setTimeout : undefined; -var cancelTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined; -var noTimeout = -1; // ------------------- -// Mutation -// ------------------- - -var supportsMutation = true; -function commitMount(domElement, type, newProps, internalInstanceHandle) { - // Despite the naming that might imply otherwise, this method only - // fires if there is an `Update` effect scheduled during mounting. - // This happens if `finalizeInitialChildren` returns `true` (which it - // does to implement the `autoFocus` attribute on the client). But - // there are also other cases when this might happen (such as patching - // up text content during hydration mismatch). So we'll check this again. - if (shouldAutoFocusHostComponent(type, newProps)) { - domElement.focus(); - } -} -function commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) { - // Update the props handle so that we know which props are the ones with - // with current event handlers. - updateFiberProps(domElement, newProps); // Apply the diff to the DOM node. - - updateProperties(domElement, updatePayload, type, oldProps, newProps); -} -function resetTextContent(domElement) { - setTextContent(domElement, ''); -} -function commitTextUpdate(textInstance, oldText, newText) { - textInstance.nodeValue = newText; -} -function appendChild(parentInstance, child) { - parentInstance.appendChild(child); -} -function appendChildToContainer(container, child) { - var parentNode; - - if (container.nodeType === COMMENT_NODE) { - parentNode = container.parentNode; - parentNode.insertBefore(child, container); - } else { - parentNode = container; - parentNode.appendChild(child); - } // This container might be used for a portal. - // If something inside a portal is clicked, that click should bubble - // through the React tree. However, on Mobile Safari the click would - // never bubble through the *DOM* tree unless an ancestor with onclick - // event exists. So we wouldn't see it and dispatch it. - // This is why we ensure that non React root containers have inline onclick - // defined. - // https://github.com/facebook/react/issues/11918 - - - var reactRootContainer = container._reactRootContainer; - - if ((reactRootContainer === null || reactRootContainer === undefined) && parentNode.onclick === null) { - // TODO: This cast may not be sound for SVG, MathML or custom elements. - trapClickOnNonInteractiveElement(parentNode); - } -} -function insertBefore(parentInstance, child, beforeChild) { - parentInstance.insertBefore(child, beforeChild); -} -function insertInContainerBefore(container, child, beforeChild) { - if (container.nodeType === COMMENT_NODE) { - container.parentNode.insertBefore(child, beforeChild); - } else { - container.insertBefore(child, beforeChild); - } -} // This is a specific event for the React Flare -// event system, so event responders can act -// accordingly to a DOM node being unmounted that -// previously had active document focus. - -function dispatchDetachedVisibleNodeEvent(child) { - if (enableFlareAPI && selectionInformation && child === selectionInformation.focusedElem) { - var targetFiber = getClosestInstanceFromNode(child); // Simlulate a blur event to the React Flare responder system. - - dispatchEventForResponderEventSystem('detachedvisiblenode', targetFiber, { - target: child, - timeStamp: Date.now() - }, child, RESPONDER_EVENT_SYSTEM | IS_PASSIVE); - } -} - -function removeChild(parentInstance, child) { - dispatchDetachedVisibleNodeEvent(child); - parentInstance.removeChild(child); -} -function removeChildFromContainer(container, child) { - if (container.nodeType === COMMENT_NODE) { - container.parentNode.removeChild(child); - } else { - dispatchDetachedVisibleNodeEvent(child); - container.removeChild(child); - } -} -function clearSuspenseBoundary(parentInstance, suspenseInstance) { - var node = suspenseInstance; // Delete all nodes within this suspense boundary. - // There might be nested nodes so we need to keep track of how - // deep we are and only break out when we're back on top. - - var depth = 0; - - do { - var nextNode = node.nextSibling; - parentInstance.removeChild(node); - - if (nextNode && nextNode.nodeType === COMMENT_NODE) { - var data = nextNode.data; - - if (data === SUSPENSE_END_DATA) { - if (depth === 0) { - parentInstance.removeChild(nextNode); // Retry if any event replaying was blocked on this. - - retryIfBlockedOn(suspenseInstance); - return; - } else { - depth--; - } - } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_PENDING_START_DATA || data === SUSPENSE_FALLBACK_START_DATA) { - depth++; - } - } - - node = nextNode; - } while (node); // TODO: Warn, we didn't find the end comment boundary. - // Retry if any event replaying was blocked on this. - - - retryIfBlockedOn(suspenseInstance); -} -function clearSuspenseBoundaryFromContainer(container, suspenseInstance) { - if (container.nodeType === COMMENT_NODE) { - clearSuspenseBoundary(container.parentNode, suspenseInstance); - } else if (container.nodeType === ELEMENT_NODE) { - clearSuspenseBoundary(container, suspenseInstance); - } else {} // Document nodes should never contain suspense boundaries. - // Retry if any event replaying was blocked on this. - - - retryIfBlockedOn(container); -} -function hideInstance(instance) { - // TODO: Does this work for all element types? What about MathML? Should we - // pass host context to this method? - instance = instance; - var style = instance.style; - - if (typeof style.setProperty === 'function') { - style.setProperty('display', 'none', 'important'); - } else { - style.display = 'none'; - } -} -function hideTextInstance(textInstance) { - textInstance.nodeValue = ''; -} -function unhideInstance(instance, props) { - instance = instance; - var styleProp = props[STYLE]; - var display = styleProp !== undefined && styleProp !== null && styleProp.hasOwnProperty('display') ? styleProp.display : null; - instance.style.display = dangerousStyleValue('display', display); -} -function unhideTextInstance(textInstance, text) { - textInstance.nodeValue = text; -} // ------------------- -// Hydration -// ------------------- - -var supportsHydration = true; -function canHydrateInstance(instance, type, props) { - if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) { - return null; - } // This has now been refined to an element node. + function getCompositionEventType(topLevelType) { + switch (topLevelType) { + case TOP_COMPOSITION_START: + return eventTypes.compositionStart; - return instance; -} -function canHydrateTextInstance(instance, text) { - if (text === '' || instance.nodeType !== TEXT_NODE) { - // Empty strings are not parsed by HTML so there won't be a correct match here. - return null; - } // This has now been refined to a text node. + case TOP_COMPOSITION_END: + return eventTypes.compositionEnd; + case TOP_COMPOSITION_UPDATE: + return eventTypes.compositionUpdate; + } + } + /** + * Does our fallback best-guess model think this event signifies that + * composition has begun? + * + * @param {string} topLevelType + * @param {object} nativeEvent + * @return {boolean} + */ - return instance; -} -function canHydrateSuspenseInstance(instance) { - if (instance.nodeType !== COMMENT_NODE) { - // Empty strings are not parsed by HTML so there won't be a correct match here. - return null; - } // This has now been refined to a suspense node. + function isFallbackCompositionStart(topLevelType, nativeEvent) { + return topLevelType === TOP_KEY_DOWN && nativeEvent.keyCode === START_KEYCODE; + } + /** + * Does our fallback mode think that this event is the end of composition? + * + * @param {string} topLevelType + * @param {object} nativeEvent + * @return {boolean} + */ - return instance; -} -function isSuspenseInstancePending(instance) { - return instance.data === SUSPENSE_PENDING_START_DATA; -} -function isSuspenseInstanceFallback(instance) { - return instance.data === SUSPENSE_FALLBACK_START_DATA; -} -function registerSuspenseInstanceRetry(instance, callback) { - instance._reactRetry = callback; -} -function getNextHydratable(node) { - // Skip non-hydratable nodes. - for (; node != null; node = node.nextSibling) { - var nodeType = node.nodeType; + function isFallbackCompositionEnd(topLevelType, nativeEvent) { + switch (topLevelType) { + case TOP_KEY_UP: + // Command keys insert or clear IME input. + return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1; - if (nodeType === ELEMENT_NODE || nodeType === TEXT_NODE) { - break; - } + case TOP_KEY_DOWN: + // Expect IME keyCode on each keydown. If we get any other + // code we must have exited earlier. + return nativeEvent.keyCode !== START_KEYCODE; - if (enableSuspenseServerRenderer) { - if (nodeType === COMMENT_NODE) { - var nodeData = node.data; + case TOP_KEY_PRESS: + case TOP_MOUSE_DOWN: + case TOP_BLUR: + // Events are not possible without cancelling IME. + return true; - if (nodeData === SUSPENSE_START_DATA || nodeData === SUSPENSE_FALLBACK_START_DATA || nodeData === SUSPENSE_PENDING_START_DATA) { - break; - } - } + default: + return false; } } + /** + * Google Input Tools provides composition data via a CustomEvent, + * with the `data` property populated in the `detail` object. If this + * is available on the event object, use it. If not, this is a plain + * composition event and we have nothing special to extract. + * + * @param {object} nativeEvent + * @return {?string} + */ - return node; -} - -function getNextHydratableSibling(instance) { - return getNextHydratable(instance.nextSibling); -} -function getFirstHydratableChild(parentInstance) { - return getNextHydratable(parentInstance.firstChild); -} -function hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle) { - precacheFiberNode(internalInstanceHandle, instance); // TODO: Possibly defer this until the commit phase where all the events - // get attached. - updateFiberProps(instance, props); - var parentNamespace; + function getDataFromCustomEvent(nativeEvent) { + var detail = nativeEvent.detail; - { - var hostContextDev = hostContext; - parentNamespace = hostContextDev.namespace; - } - - return diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance); -} -function hydrateTextInstance(textInstance, text, internalInstanceHandle) { - precacheFiberNode(internalInstanceHandle, textInstance); - return diffHydratedText(textInstance, text); -} -function hydrateSuspenseInstance(suspenseInstance, internalInstanceHandle) { - precacheFiberNode(internalInstanceHandle, suspenseInstance); -} -function getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) { - var node = suspenseInstance.nextSibling; // Skip past all nodes within this suspense boundary. - // There might be nested nodes so we need to keep track of how - // deep we are and only break out when we're back on top. - - var depth = 0; - - while (node) { - if (node.nodeType === COMMENT_NODE) { - var data = node.data; - - if (data === SUSPENSE_END_DATA) { - if (depth === 0) { - return getNextHydratableSibling(node); - } else { - depth--; - } - } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) { - depth++; - } + if (typeof detail === 'object' && 'data' in detail) { + return detail.data; } - node = node.nextSibling; - } // TODO: Warn, we didn't find the end comment boundary. + return null; + } + /** + * Check if a composition event was triggered by Korean IME. + * Our fallback mode does not work well with IE's Korean IME, + * so just use native composition events when Korean IME is used. + * Although CompositionEvent.locale property is deprecated, + * it is available in IE, where our fallback mode is enabled. + * + * @param {object} nativeEvent + * @return {boolean} + */ - return null; -} // Returns the SuspenseInstance if this node is a direct child of a -// SuspenseInstance. I.e. if its previous sibling is a Comment with -// SUSPENSE_x_START_DATA. Otherwise, null. + function isUsingKoreanIME(nativeEvent) { + return nativeEvent.locale === 'ko'; + } // Track the current IME composition status, if any. -function getParentSuspenseInstance(targetInstance) { - var node = targetInstance.previousSibling; // Skip past all nodes within this suspense boundary. - // There might be nested nodes so we need to keep track of how - // deep we are and only break out when we're back on top. - var depth = 0; + var isComposing = false; + /** + * @return {?object} A SyntheticCompositionEvent. + */ - while (node) { - if (node.nodeType === COMMENT_NODE) { - var data = node.data; + function extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) { + var eventType; + var fallbackData; - if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) { - if (depth === 0) { - return node; - } else { - depth--; - } - } else if (data === SUSPENSE_END_DATA) { - depth++; + if (canUseCompositionEvent) { + eventType = getCompositionEventType(topLevelType); + } else if (!isComposing) { + if (isFallbackCompositionStart(topLevelType, nativeEvent)) { + eventType = eventTypes.compositionStart; } + } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) { + eventType = eventTypes.compositionEnd; } - node = node.previousSibling; - } + if (!eventType) { + return null; + } - return null; -} -function commitHydratedContainer(container) { - // Retry if any event replaying was blocked on this. - retryIfBlockedOn(container); -} -function commitHydratedSuspenseInstance(suspenseInstance) { - // Retry if any event replaying was blocked on this. - retryIfBlockedOn(suspenseInstance); -} -function didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text) { - { - warnForUnmatchedText(textInstance, text); - } -} -function didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text) { - if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) { - warnForUnmatchedText(textInstance, text); - } -} -function didNotHydrateContainerInstance(parentContainer, instance) { - { - if (instance.nodeType === ELEMENT_NODE) { - warnForDeletedHydratableElement(parentContainer, instance); - } else if (instance.nodeType === COMMENT_NODE) {// TODO: warnForDeletedHydratableSuspenseBoundary - } else { - warnForDeletedHydratableText(parentContainer, instance); + if (useFallbackCompositionData && !isUsingKoreanIME(nativeEvent)) { + // The current composition is stored statically and must not be + // overwritten while composition continues. + if (!isComposing && eventType === eventTypes.compositionStart) { + isComposing = initialize(nativeEventTarget); + } else if (eventType === eventTypes.compositionEnd) { + if (isComposing) { + fallbackData = getData(); + } + } } - } -} -function didNotHydrateInstance(parentType, parentProps, parentInstance, instance) { - if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) { - if (instance.nodeType === ELEMENT_NODE) { - warnForDeletedHydratableElement(parentInstance, instance); - } else if (instance.nodeType === COMMENT_NODE) {// TODO: warnForDeletedHydratableSuspenseBoundary + + var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget); + + if (fallbackData) { + // Inject data generated from fallback path into the synthetic event. + // This matches the property of native CompositionEventInterface. + event.data = fallbackData; } else { - warnForDeletedHydratableText(parentInstance, instance); + var customData = getDataFromCustomEvent(nativeEvent); + + if (customData !== null) { + event.data = customData; + } } + + accumulateTwoPhaseDispatches(event); + return event; } -} -function didNotFindHydratableContainerInstance(parentContainer, type, props) { - { - warnForInsertedHydratedElement(parentContainer, type, props); - } -} -function didNotFindHydratableContainerTextInstance(parentContainer, text) { - { - warnForInsertedHydratedText(parentContainer, text); - } -} - -function didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props) { - if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) { - warnForInsertedHydratedElement(parentInstance, type, props); - } -} -function didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text) { - if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) { - warnForInsertedHydratedText(parentInstance, text); - } -} -function didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance) { - if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {// TODO: warnForInsertedHydratedSuspense(parentInstance); - } -} -function mountResponderInstance(responder, responderInstance, responderProps, responderState, instance) { - // Listen to events - var doc = instance.ownerDocument; - var _ref = responder, - rootEventTypes = _ref.rootEventTypes, - targetEventTypes = _ref.targetEventTypes; - - if (targetEventTypes !== null) { - listenToEventResponderEventTypes(targetEventTypes, doc); - } - - if (rootEventTypes !== null) { - addRootEventTypesForResponderInstance(responderInstance, rootEventTypes); - listenToEventResponderEventTypes(rootEventTypes, doc); - } - - mountEventResponder(responder, responderInstance, responderProps, responderState); - return responderInstance; -} -function unmountResponderInstance(responderInstance) { - if (enableFlareAPI) { - // TODO stop listening to targetEventTypes - unmountEventResponder(responderInstance); - } -} -function getFundamentalComponentInstance(fundamentalInstance) { - if (enableFundamentalAPI) { - var currentFiber = fundamentalInstance.currentFiber, - impl = fundamentalInstance.impl, - props = fundamentalInstance.props, - state = fundamentalInstance.state; - var instance = impl.getInstance(null, props, state); - precacheFiberNode(currentFiber, instance); - return instance; - } // Because of the flag above, this gets around the Flow error; - - - return null; -} -function mountFundamentalComponent(fundamentalInstance) { - if (enableFundamentalAPI) { - var impl = fundamentalInstance.impl, - instance = fundamentalInstance.instance, - props = fundamentalInstance.props, - state = fundamentalInstance.state; - var onMount = impl.onMount; - - if (onMount !== undefined) { - onMount(null, instance, props, state); - } - } -} -function shouldUpdateFundamentalComponent(fundamentalInstance) { - if (enableFundamentalAPI) { - var impl = fundamentalInstance.impl, - prevProps = fundamentalInstance.prevProps, - props = fundamentalInstance.props, - state = fundamentalInstance.state; - var shouldUpdate = impl.shouldUpdate; - - if (shouldUpdate !== undefined) { - return shouldUpdate(null, prevProps, props, state); - } - } - - return true; -} -function updateFundamentalComponent(fundamentalInstance) { - if (enableFundamentalAPI) { - var impl = fundamentalInstance.impl, - instance = fundamentalInstance.instance, - prevProps = fundamentalInstance.prevProps, - props = fundamentalInstance.props, - state = fundamentalInstance.state; - var onUpdate = impl.onUpdate; - - if (onUpdate !== undefined) { - onUpdate(null, instance, prevProps, props, state); - } - } -} -function unmountFundamentalComponent(fundamentalInstance) { - if (enableFundamentalAPI) { - var impl = fundamentalInstance.impl, - instance = fundamentalInstance.instance, - props = fundamentalInstance.props, - state = fundamentalInstance.state; - var onUnmount = impl.onUnmount; - - if (onUnmount !== undefined) { - onUnmount(null, instance, props, state); - } - } -} -function getInstanceFromNode$2(node) { - return getClosestInstanceFromNode(node) || null; -} - -var randomKey = Math.random().toString(36).slice(2); -var internalInstanceKey = '__reactInternalInstance$' + randomKey; -var internalEventHandlersKey = '__reactEventHandlers$' + randomKey; -var internalContainerInstanceKey = '__reactContainere$' + randomKey; -function precacheFiberNode(hostInst, node) { - node[internalInstanceKey] = hostInst; -} -function markContainerAsRoot(hostRoot, node) { - node[internalContainerInstanceKey] = hostRoot; -} -function unmarkContainerAsRoot(node) { - node[internalContainerInstanceKey] = null; -} -function isContainerMarkedAsRoot(node) { - return !!node[internalContainerInstanceKey]; -} // Given a DOM node, return the closest HostComponent or HostText fiber ancestor. -// If the target node is part of a hydrated or not yet rendered subtree, then -// this may also return a SuspenseComponent or HostRoot to indicate that. -// Conceptually the HostRoot fiber is a child of the Container node. So if you -// pass the Container node as the targetNode, you will not actually get the -// HostRoot back. To get to the HostRoot, you need to pass a child of it. -// The same thing applies to Suspense boundaries. - -function getClosestInstanceFromNode(targetNode) { - var targetInst = targetNode[internalInstanceKey]; - - if (targetInst) { - // Don't return HostRoot or SuspenseComponent here. - return targetInst; - } // If the direct event target isn't a React owned DOM node, we need to look - // to see if one of its parents is a React owned DOM node. - - - var parentNode = targetNode.parentNode; - - while (parentNode) { - // We'll check if this is a container root that could include - // React nodes in the future. We need to check this first because - // if we're a child of a dehydrated container, we need to first - // find that inner container before moving on to finding the parent - // instance. Note that we don't check this field on the targetNode - // itself because the fibers are conceptually between the container - // node and the first child. It isn't surrounding the container node. - // If it's not a container, we check if it's an instance. - targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey]; + /** + * @param {TopLevelType} topLevelType Number from `TopLevelType`. + * @param {object} nativeEvent Native browser event. + * @return {?string} The string corresponding to this `beforeInput` event. + */ - if (targetInst) { - // Since this wasn't the direct target of the event, we might have - // stepped past dehydrated DOM nodes to get here. However they could - // also have been non-React nodes. We need to answer which one. - // If we the instance doesn't have any children, then there can't be - // a nested suspense boundary within it. So we can use this as a fast - // bailout. Most of the time, when people add non-React children to - // the tree, it is using a ref to a child-less DOM node. - // Normally we'd only need to check one of the fibers because if it - // has ever gone from having children to deleting them or vice versa - // it would have deleted the dehydrated boundary nested inside already. - // However, since the HostRoot starts out with an alternate it might - // have one on the alternate so we need to check in case this was a - // root. - var alternate = targetInst.alternate; - if (targetInst.child !== null || alternate !== null && alternate.child !== null) { - // Next we need to figure out if the node that skipped past is - // nested within a dehydrated boundary and if so, which one. - var suspenseInstance = getParentSuspenseInstance(targetNode); + function getNativeBeforeInputChars(topLevelType, nativeEvent) { + switch (topLevelType) { + case TOP_COMPOSITION_END: + return getDataFromCustomEvent(nativeEvent); - while (suspenseInstance !== null) { - // We found a suspense instance. That means that we haven't - // hydrated it yet. Even though we leave the comments in the - // DOM after hydrating, and there are boundaries in the DOM - // that could already be hydrated, we wouldn't have found them - // through this pass since if the target is hydrated it would - // have had an internalInstanceKey on it. - // Let's get the fiber associated with the SuspenseComponent - // as the deepest instance. - var targetSuspenseInst = suspenseInstance[internalInstanceKey]; + case TOP_KEY_PRESS: + /** + * If native `textInput` events are available, our goal is to make + * use of them. However, there is a special case: the spacebar key. + * In Webkit, preventing default on a spacebar `textInput` event + * cancels character insertion, but it *also* causes the browser + * to fall back to its default spacebar behavior of scrolling the + * page. + * + * Tracking at: + * https://code.google.com/p/chromium/issues/detail?id=355103 + * + * To avoid this issue, use the keypress event as if no `textInput` + * event is available. + */ + var which = nativeEvent.which; + + if (which !== SPACEBAR_CODE) { + return null; + } - if (targetSuspenseInst) { - return targetSuspenseInst; - } // If we don't find a Fiber on the comment, it might be because - // we haven't gotten to hydrate it yet. There might still be a - // parent boundary that hasn't above this one so we need to find - // the outer most that is known. + hasSpaceKeypress = true; + return SPACEBAR_CHAR; + case TOP_TEXT_INPUT: + // Record the characters to be added to the DOM. + var chars = nativeEvent.data; // If it's a spacebar character, assume that we have already handled + // it at the keypress level and bail immediately. Android Chrome + // doesn't give us keycodes, so we need to ignore it. - suspenseInstance = getParentSuspenseInstance(suspenseInstance); // If we don't find one, then that should mean that the parent - // host component also hasn't hydrated yet. We can return it - // below since it will bail out on the isMounted check later. + if (chars === SPACEBAR_CHAR && hasSpaceKeypress) { + return null; } - } - return targetInst; - } + return chars; - targetNode = parentNode; - parentNode = targetNode.parentNode; + default: + // For other native event types, do nothing. + return null; + } } + /** + * For browsers that do not provide the `textInput` event, extract the + * appropriate string to use for SyntheticInputEvent. + * + * @param {number} topLevelType Number from `TopLevelEventTypes`. + * @param {object} nativeEvent Native browser event. + * @return {?string} The fallback string for this `beforeInput` event. + */ - return null; -} -/** - * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent - * instance, or null if the node was not rendered by this React. - */ -function getInstanceFromNode$1(node) { - var inst = node[internalInstanceKey] || node[internalContainerInstanceKey]; + function getFallbackBeforeInputChars(topLevelType, nativeEvent) { + // If we are currently composing (IME) and using a fallback to do so, + // try to extract the composed characters from the fallback object. + // If composition event is available, we extract a string only at + // compositionevent, otherwise extract it at fallback events. + if (isComposing) { + if (topLevelType === TOP_COMPOSITION_END || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) { + var chars = getData(); + reset(); + isComposing = false; + return chars; + } - if (inst) { - if (inst.tag === HostComponent || inst.tag === HostText || inst.tag === SuspenseComponent || inst.tag === HostRoot) { - return inst; - } else { return null; } - } - return null; -} -/** - * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding - * DOM node. - */ + switch (topLevelType) { + case TOP_PASTE: + // If a paste event occurs after a keypress, throw out the input + // chars. Paste events should not lead to BeforeInput events. + return null; -function getNodeFromInstance$1(inst) { - if (inst.tag === HostComponent || inst.tag === HostText) { - // In Fiber this, is just the state node right now. We assume it will be - // a host component or host text. - return inst.stateNode; - } // Without this first invariant, passing a non-DOM-component triggers the next - // invariant for a missing parent, which is super confusing. + case TOP_KEY_PRESS: + /** + * As of v27, Firefox may fire keypress events even when no character + * will be inserted. A few possibilities: + * + * - `which` is `0`. Arrow keys, Esc key, etc. + * + * - `which` is the pressed key code, but no char is available. + * Ex: 'AltGr + d` in Polish. There is no modified character for + * this key combination and no character is inserted into the + * document, but FF fires the keypress for char code `100` anyway. + * No `input` event will occur. + * + * - `which` is the pressed key code, but a command combination is + * being used. Ex: `Cmd+C`. No character is inserted, and no + * `input` event will occur. + */ + if (!isKeypressCommand(nativeEvent)) { + // IE fires the `keypress` event when a user types an emoji via + // Touch keyboard of Windows. In such a case, the `char` property + // holds an emoji character like `\uD83D\uDE0A`. Because its length + // is 2, the property `which` does not represent an emoji correctly. + // In such a case, we directly return the `char` property instead of + // using `which`. + if (nativeEvent.char && nativeEvent.char.length > 1) { + return nativeEvent.char; + } else if (nativeEvent.which) { + return String.fromCharCode(nativeEvent.which); + } + } + return null; - { - { - throw Error("getNodeFromInstance: Invalid argument."); + case TOP_COMPOSITION_END: + return useFallbackCompositionData && !isUsingKoreanIME(nativeEvent) ? null : nativeEvent.data; + + default: + return null; } } -} -function getFiberCurrentPropsFromNode$1(node) { - return node[internalEventHandlersKey] || null; -} -function updateFiberProps(node, props) { - node[internalEventHandlersKey] = props; -} + /** + * Extract a SyntheticInputEvent for `beforeInput`, based on either native + * `textInput` or fallback behavior. + * + * @return {?object} A SyntheticInputEvent. + */ -/** - * These variables store information about text content of a target node, - * allowing comparison of content before and after a given event. - * - * Identify the node where selection currently begins, then observe - * both its text content and its current position in the DOM. Since the - * browser may natively replace the target node during composition, we can - * use its position to find its replacement. - * - * - */ -var root = null; -var startText = null; -var fallbackText = null; -function initialize(nativeEventTarget) { - root = nativeEventTarget; - startText = getText(); - return true; -} -function reset() { - root = null; - startText = null; - fallbackText = null; -} -function getData() { - if (fallbackText) { - return fallbackText; - } - var start; - var startValue = startText; - var startLength = startValue.length; - var end; - var endValue = getText(); - var endLength = endValue.length; + function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) { + var chars; - for (start = 0; start < startLength; start++) { - if (startValue[start] !== endValue[start]) { - break; - } - } + if (canUseTextInputEvent) { + chars = getNativeBeforeInputChars(topLevelType, nativeEvent); + } else { + chars = getFallbackBeforeInputChars(topLevelType, nativeEvent); + } // If no characters are being inserted, no BeforeInput event should + // be fired. - var minEnd = startLength - start; - for (end = 1; end <= minEnd; end++) { - if (startValue[startLength - end] !== endValue[endLength - end]) { - break; + if (!chars) { + return null; } - } - var sliceTail = end > 1 ? 1 - end : undefined; - fallbackText = endValue.slice(start, sliceTail); - return fallbackText; -} -function getText() { - if ('value' in root) { - return root.value; + var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget); + event.data = chars; + accumulateTwoPhaseDispatches(event); + return event; } + /** + * Create an `onBeforeInput` event to match + * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents. + * + * This event plugin is based on the native `textInput` event + * available in Chrome, Safari, Opera, and IE. This event fires after + * `onKeyPress` and `onCompositionEnd`, but before `onInput`. + * + * `beforeInput` is spec'd but not implemented in any browsers, and + * the `input` event does not provide any useful information about what has + * actually been added, contrary to the spec. Thus, `textInput` is the best + * available event to identify the characters that have actually been inserted + * into the target node. + * + * This plugin is also responsible for emitting `composition` events, thus + * allowing us to share composition fallback code for both `beforeInput` and + * `composition` event types. + */ - return root.textContent; -} -/** - * @interface Event - * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents - */ + var BeforeInputEventPlugin = { + eventTypes: eventTypes, + extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) { + var composition = extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget); + var beforeInput = extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget); -var SyntheticCompositionEvent = SyntheticEvent.extend({ - data: null -}); + if (composition === null) { + return beforeInput; + } -/** - * @interface Event - * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105 - * /#events-inputevents - */ + if (beforeInput === null) { + return composition; + } + + return [composition, beforeInput]; + } + }; -var SyntheticInputEvent = SyntheticEvent.extend({ - data: null -}); + /** + * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary + */ + var supportedInputTypes = { + color: true, + date: true, + datetime: true, + 'datetime-local': true, + email: true, + month: true, + number: true, + password: true, + range: true, + search: true, + tel: true, + text: true, + time: true, + url: true, + week: true + }; -var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space + function isTextInputElement(elem) { + var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); -var START_KEYCODE = 229; -var canUseCompositionEvent = canUseDOM && 'CompositionEvent' in window; -var documentMode = null; + if (nodeName === 'input') { + return !!supportedInputTypes[elem.type]; + } -if (canUseDOM && 'documentMode' in document) { - documentMode = document.documentMode; -} // Webkit offers a very useful `textInput` event that can be used to -// directly represent `beforeInput`. The IE `textinput` event is not as -// useful, so we don't use it. + if (nodeName === 'textarea') { + return true; + } + return false; + } -var canUseTextInputEvent = canUseDOM && 'TextEvent' in window && !documentMode; // In IE9+, we have access to composition events, but the data supplied -// by the native compositionend event may be incorrect. Japanese ideographic -// spaces, for instance (\u3000) are not recorded correctly. + var eventTypes$1 = { + change: { + phasedRegistrationNames: { + bubbled: 'onChange', + captured: 'onChangeCapture' + }, + dependencies: [TOP_BLUR, TOP_CHANGE, TOP_CLICK, TOP_FOCUS, TOP_INPUT, TOP_KEY_DOWN, TOP_KEY_UP, TOP_SELECTION_CHANGE] + } + }; -var useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11); -var SPACEBAR_CODE = 32; -var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); // Events and their corresponding property names. + function createAndAccumulateChangeEvent(inst, nativeEvent, target) { + var event = SyntheticEvent.getPooled(eventTypes$1.change, inst, nativeEvent, target); + event.type = 'change'; // Flag this event loop as needing state restore. -var eventTypes$1 = { - beforeInput: { - phasedRegistrationNames: { - bubbled: 'onBeforeInput', - captured: 'onBeforeInputCapture' - }, - dependencies: [TOP_COMPOSITION_END, TOP_KEY_PRESS, TOP_TEXT_INPUT, TOP_PASTE] - }, - compositionEnd: { - phasedRegistrationNames: { - bubbled: 'onCompositionEnd', - captured: 'onCompositionEndCapture' - }, - dependencies: [TOP_BLUR, TOP_COMPOSITION_END, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN] - }, - compositionStart: { - phasedRegistrationNames: { - bubbled: 'onCompositionStart', - captured: 'onCompositionStartCapture' - }, - dependencies: [TOP_BLUR, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN] - }, - compositionUpdate: { - phasedRegistrationNames: { - bubbled: 'onCompositionUpdate', - captured: 'onCompositionUpdateCapture' - }, - dependencies: [TOP_BLUR, TOP_COMPOSITION_UPDATE, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN] + enqueueStateRestore(target); + accumulateTwoPhaseDispatches(event); + return event; } -}; // Track whether we've ever handled a keypress on the space key. + /** + * For IE shims + */ -var hasSpaceKeypress = false; -/** - * Return whether a native keypress event is assumed to be a command. - * This is required because Firefox fires `keypress` events for key commands - * (cut, copy, select-all, etc.) even though no character is inserted. - */ -function isKeypressCommand(nativeEvent) { - return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && // ctrlKey && altKey is equivalent to AltGr, and is not a command. - !(nativeEvent.ctrlKey && nativeEvent.altKey); -} -/** - * Translate native top level events into event types. - * - * @param {string} topLevelType - * @return {object} - */ + var activeElement = null; + var activeElementInst = null; + /** + * SECTION: handle `change` event + */ + function shouldUseChangeEvent(elem) { + var nodeName = elem.nodeName && elem.nodeName.toLowerCase(); + return nodeName === 'select' || nodeName === 'input' && elem.type === 'file'; + } -function getCompositionEventType(topLevelType) { - switch (topLevelType) { - case TOP_COMPOSITION_START: - return eventTypes$1.compositionStart; + function manualDispatchChangeEvent(nativeEvent) { + var event = createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent)); // If change and propertychange bubbled, we'd just bind to it like all the + // other events and have it go through ReactBrowserEventEmitter. Since it + // doesn't, we manually listen for the events and so we have to enqueue and + // process the abstract event manually. + // + // Batching is necessary here in order to ensure that all event handlers run + // before the next rerender (including event handlers attached to ancestor + // elements instead of directly on the input). Without this, controlled + // components don't work properly in conjunction with event bubbling because + // the component is rerendered and the value reverted before all the event + // handlers can run. See https://github.com/facebook/react/issues/708. - case TOP_COMPOSITION_END: - return eventTypes$1.compositionEnd; + batchedUpdates(runEventInBatch, event); + } - case TOP_COMPOSITION_UPDATE: - return eventTypes$1.compositionUpdate; + function runEventInBatch(event) { + runEventsInBatch(event); } -} -/** - * Does our fallback best-guess model think this event signifies that - * composition has begun? - * - * @param {string} topLevelType - * @param {object} nativeEvent - * @return {boolean} - */ + function getInstIfValueChanged(targetInst) { + var targetNode = getNodeFromInstance$1(targetInst); -function isFallbackCompositionStart(topLevelType, nativeEvent) { - return topLevelType === TOP_KEY_DOWN && nativeEvent.keyCode === START_KEYCODE; -} -/** - * Does our fallback mode think that this event is the end of composition? - * - * @param {string} topLevelType - * @param {object} nativeEvent - * @return {boolean} - */ + if (updateValueIfChanged(targetNode)) { + return targetInst; + } + } + function getTargetInstForChangeEvent(topLevelType, targetInst) { + if (topLevelType === TOP_CHANGE) { + return targetInst; + } + } + /** + * SECTION: handle `input` event + */ -function isFallbackCompositionEnd(topLevelType, nativeEvent) { - switch (topLevelType) { - case TOP_KEY_UP: - // Command keys insert or clear IME input. - return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1; - case TOP_KEY_DOWN: - // Expect IME keyCode on each keydown. If we get any other - // code we must have exited earlier. - return nativeEvent.keyCode !== START_KEYCODE; + var isInputEventSupported = false; - case TOP_KEY_PRESS: - case TOP_MOUSE_DOWN: - case TOP_BLUR: - // Events are not possible without cancelling IME. - return true; + if (canUseDOM) { + // IE9 claims to support the input event but fails to trigger it when + // deleting text, so we ignore its input events. + isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 9); + } + /** + * (For IE <=9) Starts tracking propertychange events on the passed-in element + * and override the value property so that we can distinguish user events from + * value changes in JS. + */ - default: - return false; + + function startWatchingForValueChange(target, targetInst) { + activeElement = target; + activeElementInst = targetInst; + activeElement.attachEvent('onpropertychange', handlePropertyChange); } -} -/** - * Google Input Tools provides composition data via a CustomEvent, - * with the `data` property populated in the `detail` object. If this - * is available on the event object, use it. If not, this is a plain - * composition event and we have nothing special to extract. - * - * @param {object} nativeEvent - * @return {?string} - */ + /** + * (For IE <=9) Removes the event listeners from the currently-tracked element, + * if any exists. + */ -function getDataFromCustomEvent(nativeEvent) { - var detail = nativeEvent.detail; + function stopWatchingForValueChange() { + if (!activeElement) { + return; + } - if (typeof detail === 'object' && 'data' in detail) { - return detail.data; + activeElement.detachEvent('onpropertychange', handlePropertyChange); + activeElement = null; + activeElementInst = null; } - - return null; -} -/** - * Check if a composition event was triggered by Korean IME. - * Our fallback mode does not work well with IE's Korean IME, - * so just use native composition events when Korean IME is used. - * Although CompositionEvent.locale property is deprecated, - * it is available in IE, where our fallback mode is enabled. - * - * @param {object} nativeEvent - * @return {boolean} - */ + /** + * (For IE <=9) Handles a propertychange event, sending a `change` event if + * the value of the active element has changed. + */ -function isUsingKoreanIME(nativeEvent) { - return nativeEvent.locale === 'ko'; -} // Track the current IME composition status, if any. + function handlePropertyChange(nativeEvent) { + if (nativeEvent.propertyName !== 'value') { + return; + } + if (getInstIfValueChanged(activeElementInst)) { + manualDispatchChangeEvent(nativeEvent); + } + } -var isComposing = false; -/** - * @return {?object} A SyntheticCompositionEvent. - */ + function handleEventsForInputEventPolyfill(topLevelType, target, targetInst) { + if (topLevelType === TOP_FOCUS) { + // In IE9, propertychange fires for most input events but is buggy and + // doesn't fire when text is deleted, but conveniently, selectionchange + // appears to fire in all of the remaining cases so we catch those and + // forward the event if the value has changed + // In either case, we don't want to call the event handler if the value + // is changed from JS so we redefine a setter for `.value` that updates + // our activeElementValue variable, allowing us to ignore those changes + // + // stopWatching() should be a noop here but we call it just in case we + // missed a blur event somehow. + stopWatchingForValueChange(); + startWatchingForValueChange(target, targetInst); + } else if (topLevelType === TOP_BLUR) { + stopWatchingForValueChange(); + } + } // For IE8 and IE9. -function extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var eventType; - var fallbackData; - if (canUseCompositionEvent) { - eventType = getCompositionEventType(topLevelType); - } else if (!isComposing) { - if (isFallbackCompositionStart(topLevelType, nativeEvent)) { - eventType = eventTypes$1.compositionStart; + function getTargetInstForInputEventPolyfill(topLevelType, targetInst) { + if (topLevelType === TOP_SELECTION_CHANGE || topLevelType === TOP_KEY_UP || topLevelType === TOP_KEY_DOWN) { + // On the selectionchange event, the target is just document which isn't + // helpful for us so just check activeElement instead. + // + // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire + // propertychange on the first input event after setting `value` from a + // script and fires only keydown, keypress, keyup. Catching keyup usually + // gets it and catching keydown lets us fire an event for the first + // keystroke if user does a key repeat (it'll be a little delayed: right + // before the second keystroke). Other input methods (e.g., paste) seem to + // fire selectionchange normally. + return getInstIfValueChanged(activeElementInst); } - } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) { - eventType = eventTypes$1.compositionEnd; } + /** + * SECTION: handle `click` event + */ - if (!eventType) { - return null; + + function shouldUseClickEvent(elem) { + // Use the `click` event to detect changes to checkbox and radio inputs. + // This approach works across all browsers, whereas `change` does not fire + // until `blur` in IE8. + var nodeName = elem.nodeName; + return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio'); } - if (useFallbackCompositionData && !isUsingKoreanIME(nativeEvent)) { - // The current composition is stored statically and must not be - // overwritten while composition continues. - if (!isComposing && eventType === eventTypes$1.compositionStart) { - isComposing = initialize(nativeEventTarget); - } else if (eventType === eventTypes$1.compositionEnd) { - if (isComposing) { - fallbackData = getData(); - } + function getTargetInstForClickEvent(topLevelType, targetInst) { + if (topLevelType === TOP_CLICK) { + return getInstIfValueChanged(targetInst); + } + } + + function getTargetInstForInputOrChangeEvent(topLevelType, targetInst) { + if (topLevelType === TOP_INPUT || topLevelType === TOP_CHANGE) { + return getInstIfValueChanged(targetInst); } } - var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget); + function handleControlledInputBlur(node) { + var state = node._wrapperState; - if (fallbackData) { - // Inject data generated from fallback path into the synthetic event. - // This matches the property of native CompositionEventInterface. - event.data = fallbackData; - } else { - var customData = getDataFromCustomEvent(nativeEvent); + if (!state || !state.controlled || node.type !== 'number') { + return; + } - if (customData !== null) { - event.data = customData; + { + // If controlled, assign the value attribute to the current value on blur + setDefaultValue(node, 'number', node.value); } } + /** + * This plugin creates an `onChange` event that normalizes change events + * across form elements. This event fires at a time when it's possible to + * change the element's value without seeing a flicker. + * + * Supported elements are: + * - input (see `isTextInputElement`) + * - textarea + * - select + */ - accumulateTwoPhaseDispatches(event); - return event; -} -/** - * @param {TopLevelType} topLevelType Number from `TopLevelType`. - * @param {object} nativeEvent Native browser event. - * @return {?string} The string corresponding to this `beforeInput` event. - */ + var ChangeEventPlugin = { + eventTypes: eventTypes$1, + _isInputEventSupported: isInputEventSupported, + extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) { + var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window; + var getTargetInstFunc, handleEventFunc; -function getNativeBeforeInputChars(topLevelType, nativeEvent) { - switch (topLevelType) { - case TOP_COMPOSITION_END: - return getDataFromCustomEvent(nativeEvent); - - case TOP_KEY_PRESS: - /** - * If native `textInput` events are available, our goal is to make - * use of them. However, there is a special case: the spacebar key. - * In Webkit, preventing default on a spacebar `textInput` event - * cancels character insertion, but it *also* causes the browser - * to fall back to its default spacebar behavior of scrolling the - * page. - * - * Tracking at: - * https://code.google.com/p/chromium/issues/detail?id=355103 - * - * To avoid this issue, use the keypress event as if no `textInput` - * event is available. - */ - var which = nativeEvent.which; - - if (which !== SPACEBAR_CODE) { - return null; + if (shouldUseChangeEvent(targetNode)) { + getTargetInstFunc = getTargetInstForChangeEvent; + } else if (isTextInputElement(targetNode)) { + if (isInputEventSupported) { + getTargetInstFunc = getTargetInstForInputOrChangeEvent; + } else { + getTargetInstFunc = getTargetInstForInputEventPolyfill; + handleEventFunc = handleEventsForInputEventPolyfill; + } + } else if (shouldUseClickEvent(targetNode)) { + getTargetInstFunc = getTargetInstForClickEvent; } - hasSpaceKeypress = true; - return SPACEBAR_CHAR; + if (getTargetInstFunc) { + var inst = getTargetInstFunc(topLevelType, targetInst); - case TOP_TEXT_INPUT: - // Record the characters to be added to the DOM. - var chars = nativeEvent.data; // If it's a spacebar character, assume that we have already handled - // it at the keypress level and bail immediately. Android Chrome - // doesn't give us keycodes, so we need to ignore it. - - if (chars === SPACEBAR_CHAR && hasSpaceKeypress) { - return null; + if (inst) { + var event = createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget); + return event; + } } - return chars; - - default: - // For other native event types, do nothing. - return null; - } -} -/** - * For browsers that do not provide the `textInput` event, extract the - * appropriate string to use for SyntheticInputEvent. - * - * @param {number} topLevelType Number from `TopLevelEventTypes`. - * @param {object} nativeEvent Native browser event. - * @return {?string} The fallback string for this `beforeInput` event. - */ + if (handleEventFunc) { + handleEventFunc(topLevelType, targetNode, targetInst); + } // When blurring, set the value attribute for number inputs -function getFallbackBeforeInputChars(topLevelType, nativeEvent) { - // If we are currently composing (IME) and using a fallback to do so, - // try to extract the composed characters from the fallback object. - // If composition event is available, we extract a string only at - // compositionevent, otherwise extract it at fallback events. - if (isComposing) { - if (topLevelType === TOP_COMPOSITION_END || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) { - var chars = getData(); - reset(); - isComposing = false; - return chars; + if (topLevelType === TOP_BLUR) { + handleControlledInputBlur(targetNode); + } } + }; - return null; - } + var SyntheticUIEvent = SyntheticEvent.extend({ + view: null, + detail: null + }); - switch (topLevelType) { - case TOP_PASTE: - // If a paste event occurs after a keypress, throw out the input - // chars. Paste events should not lead to BeforeInput events. - return null; + /** + * Translation from modifier key to the associated property in the event. + * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers + */ + var modifierKeyToProp = { + Alt: 'altKey', + Control: 'ctrlKey', + Meta: 'metaKey', + Shift: 'shiftKey' + }; // Older browsers (Safari <= 10, iOS Safari <= 10.2) do not support + // getModifierState. If getModifierState is not supported, we map it to a set of + // modifier keys exposed by the event. In this case, Lock-keys are not supported. - case TOP_KEY_PRESS: - /** - * As of v27, Firefox may fire keypress events even when no character - * will be inserted. A few possibilities: - * - * - `which` is `0`. Arrow keys, Esc key, etc. - * - * - `which` is the pressed key code, but no char is available. - * Ex: 'AltGr + d` in Polish. There is no modified character for - * this key combination and no character is inserted into the - * document, but FF fires the keypress for char code `100` anyway. - * No `input` event will occur. - * - * - `which` is the pressed key code, but a command combination is - * being used. Ex: `Cmd+C`. No character is inserted, and no - * `input` event will occur. - */ - if (!isKeypressCommand(nativeEvent)) { - // IE fires the `keypress` event when a user types an emoji via - // Touch keyboard of Windows. In such a case, the `char` property - // holds an emoji character like `\uD83D\uDE0A`. Because its length - // is 2, the property `which` does not represent an emoji correctly. - // In such a case, we directly return the `char` property instead of - // using `which`. - if (nativeEvent.char && nativeEvent.char.length > 1) { - return nativeEvent.char; - } else if (nativeEvent.which) { - return String.fromCharCode(nativeEvent.which); - } - } + function modifierStateGetter(keyArg) { + var syntheticEvent = this; + var nativeEvent = syntheticEvent.nativeEvent; - return null; + if (nativeEvent.getModifierState) { + return nativeEvent.getModifierState(keyArg); + } - case TOP_COMPOSITION_END: - return useFallbackCompositionData && !isUsingKoreanIME(nativeEvent) ? null : nativeEvent.data; + var keyProp = modifierKeyToProp[keyArg]; + return keyProp ? !!nativeEvent[keyProp] : false; + } - default: - return null; + function getEventModifierState(nativeEvent) { + return modifierStateGetter; } -} -/** - * Extract a SyntheticInputEvent for `beforeInput`, based on either native - * `textInput` or fallback behavior. - * - * @return {?object} A SyntheticInputEvent. - */ + var previousScreenX = 0; + var previousScreenY = 0; // Use flags to signal movementX/Y has already been set -function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var chars; + var isMovementXSet = false; + var isMovementYSet = false; + /** + * @interface MouseEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ - if (canUseTextInputEvent) { - chars = getNativeBeforeInputChars(topLevelType, nativeEvent); - } else { - chars = getFallbackBeforeInputChars(topLevelType, nativeEvent); - } // If no characters are being inserted, no BeforeInput event should - // be fired. + var SyntheticMouseEvent = SyntheticUIEvent.extend({ + screenX: null, + screenY: null, + clientX: null, + clientY: null, + pageX: null, + pageY: null, + ctrlKey: null, + shiftKey: null, + altKey: null, + metaKey: null, + getModifierState: getEventModifierState, + button: null, + buttons: null, + relatedTarget: function (event) { + return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement); + }, + movementX: function (event) { + if ('movementX' in event) { + return event.movementX; + } + var screenX = previousScreenX; + previousScreenX = event.screenX; - if (!chars) { - return null; - } + if (!isMovementXSet) { + isMovementXSet = true; + return 0; + } - var event = SyntheticInputEvent.getPooled(eventTypes$1.beforeInput, targetInst, nativeEvent, nativeEventTarget); - event.data = chars; - accumulateTwoPhaseDispatches(event); - return event; -} -/** - * Create an `onBeforeInput` event to match - * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents. - * - * This event plugin is based on the native `textInput` event - * available in Chrome, Safari, Opera, and IE. This event fires after - * `onKeyPress` and `onCompositionEnd`, but before `onInput`. - * - * `beforeInput` is spec'd but not implemented in any browsers, and - * the `input` event does not provide any useful information about what has - * actually been added, contrary to the spec. Thus, `textInput` is the best - * available event to identify the characters that have actually been inserted - * into the target node. - * - * This plugin is also responsible for emitting `composition` events, thus - * allowing us to share composition fallback code for both `beforeInput` and - * `composition` event types. - */ + return event.type === 'mousemove' ? event.screenX - screenX : 0; + }, + movementY: function (event) { + if ('movementY' in event) { + return event.movementY; + } + var screenY = previousScreenY; + previousScreenY = event.screenY; -var BeforeInputEventPlugin = { - eventTypes: eventTypes$1, - extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) { - var composition = extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget); - var beforeInput = extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget); + if (!isMovementYSet) { + isMovementYSet = true; + return 0; + } - if (composition === null) { - return beforeInput; + return event.type === 'mousemove' ? event.screenY - screenY : 0; } + }); + + /** + * @interface PointerEvent + * @see http://www.w3.org/TR/pointerevents/ + */ - if (beforeInput === null) { - return composition; + var SyntheticPointerEvent = SyntheticMouseEvent.extend({ + pointerId: null, + width: null, + height: null, + pressure: null, + tangentialPressure: null, + tiltX: null, + tiltY: null, + twist: null, + pointerType: null, + isPrimary: null + }); + + var eventTypes$2 = { + mouseEnter: { + registrationName: 'onMouseEnter', + dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER] + }, + mouseLeave: { + registrationName: 'onMouseLeave', + dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER] + }, + pointerEnter: { + registrationName: 'onPointerEnter', + dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER] + }, + pointerLeave: { + registrationName: 'onPointerLeave', + dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER] } + }; + var EnterLeaveEventPlugin = { + eventTypes: eventTypes$2, + + /** + * For almost every interaction we care about, there will be both a top-level + * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that + * we do not extract duplicate events. However, moving the mouse into the + * browser from outside will not fire a `mouseout` event. In this case, we use + * the `mouseover` top-level event. + */ + extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) { + var isOverEvent = topLevelType === TOP_MOUSE_OVER || topLevelType === TOP_POINTER_OVER; + var isOutEvent = topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_POINTER_OUT; + + if (isOverEvent && (eventSystemFlags & IS_REPLAYED) === 0 && (nativeEvent.relatedTarget || nativeEvent.fromElement)) { + // If this is an over event with a target, then we've already dispatched + // the event in the out event of the other target. If this is replayed, + // then it's because we couldn't dispatch against this target previously + // so we have to do it now instead. + return null; + } - return [composition, beforeInput]; - } -}; + if (!isOutEvent && !isOverEvent) { + // Must not be a mouse or pointer in or out - ignoring. + return null; + } -/** - * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary - */ -var supportedInputTypes = { - color: true, - date: true, - datetime: true, - 'datetime-local': true, - email: true, - month: true, - number: true, - password: true, - range: true, - search: true, - tel: true, - text: true, - time: true, - url: true, - week: true -}; - -function isTextInputElement(elem) { - var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); - - if (nodeName === 'input') { - return !!supportedInputTypes[elem.type]; - } - - if (nodeName === 'textarea') { - return true; - } + var win; - return false; -} + if (nativeEventTarget.window === nativeEventTarget) { + // `nativeEventTarget` is probably a window object. + win = nativeEventTarget; + } else { + // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8. + var doc = nativeEventTarget.ownerDocument; -var eventTypes$2 = { - change: { - phasedRegistrationNames: { - bubbled: 'onChange', - captured: 'onChangeCapture' - }, - dependencies: [TOP_BLUR, TOP_CHANGE, TOP_CLICK, TOP_FOCUS, TOP_INPUT, TOP_KEY_DOWN, TOP_KEY_UP, TOP_SELECTION_CHANGE] - } -}; + if (doc) { + win = doc.defaultView || doc.parentWindow; + } else { + win = window; + } + } -function createAndAccumulateChangeEvent(inst, nativeEvent, target) { - var event = SyntheticEvent.getPooled(eventTypes$2.change, inst, nativeEvent, target); - event.type = 'change'; // Flag this event loop as needing state restore. + var from; + var to; - enqueueStateRestore(target); - accumulateTwoPhaseDispatches(event); - return event; -} -/** - * For IE shims - */ + if (isOutEvent) { + from = targetInst; + var related = nativeEvent.relatedTarget || nativeEvent.toElement; + to = related ? getClosestInstanceFromNode(related) : null; + if (to !== null) { + var nearestMounted = getNearestMountedFiber(to); -var activeElement = null; -var activeElementInst = null; -/** - * SECTION: handle `change` event - */ + if (to !== nearestMounted || to.tag !== HostComponent && to.tag !== HostText) { + to = null; + } + } + } else { + // Moving to a node from outside the window. + from = null; + to = targetInst; + } -function shouldUseChangeEvent(elem) { - var nodeName = elem.nodeName && elem.nodeName.toLowerCase(); - return nodeName === 'select' || nodeName === 'input' && elem.type === 'file'; -} + if (from === to) { + // Nothing pertains to our managed components. + return null; + } -function manualDispatchChangeEvent(nativeEvent) { - var event = createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent)); // If change and propertychange bubbled, we'd just bind to it like all the - // other events and have it go through ReactBrowserEventEmitter. Since it - // doesn't, we manually listen for the events and so we have to enqueue and - // process the abstract event manually. - // - // Batching is necessary here in order to ensure that all event handlers run - // before the next rerender (including event handlers attached to ancestor - // elements instead of directly on the input). Without this, controlled - // components don't work properly in conjunction with event bubbling because - // the component is rerendered and the value reverted before all the event - // handlers can run. See https://github.com/facebook/react/issues/708. + var eventInterface, leaveEventType, enterEventType, eventTypePrefix; - batchedUpdates(runEventInBatch, event); -} + if (topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_MOUSE_OVER) { + eventInterface = SyntheticMouseEvent; + leaveEventType = eventTypes$2.mouseLeave; + enterEventType = eventTypes$2.mouseEnter; + eventTypePrefix = 'mouse'; + } else if (topLevelType === TOP_POINTER_OUT || topLevelType === TOP_POINTER_OVER) { + eventInterface = SyntheticPointerEvent; + leaveEventType = eventTypes$2.pointerLeave; + enterEventType = eventTypes$2.pointerEnter; + eventTypePrefix = 'pointer'; + } -function runEventInBatch(event) { - runEventsInBatch(event); -} + var fromNode = from == null ? win : getNodeFromInstance$1(from); + var toNode = to == null ? win : getNodeFromInstance$1(to); + var leave = eventInterface.getPooled(leaveEventType, from, nativeEvent, nativeEventTarget); + leave.type = eventTypePrefix + 'leave'; + leave.target = fromNode; + leave.relatedTarget = toNode; + var enter = eventInterface.getPooled(enterEventType, to, nativeEvent, nativeEventTarget); + enter.type = eventTypePrefix + 'enter'; + enter.target = toNode; + enter.relatedTarget = fromNode; + accumulateEnterLeaveDispatches(leave, enter, from, to); // If we are not processing the first ancestor, then we + // should not process the same nativeEvent again, as we + // will have already processed it in the first ancestor. -function getInstIfValueChanged(targetInst) { - var targetNode = getNodeFromInstance$1(targetInst); + if ((eventSystemFlags & IS_FIRST_ANCESTOR) === 0) { + return [leave]; + } - if (updateValueIfChanged(targetNode)) { - return targetInst; - } -} + return [leave, enter]; + } + }; -function getTargetInstForChangeEvent(topLevelType, targetInst) { - if (topLevelType === TOP_CHANGE) { - return targetInst; + /** + * inlined Object.is polyfill to avoid requiring consumers ship their own + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + */ + function is(x, y) { + return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare + ; } -} -/** - * SECTION: handle `input` event - */ - -var isInputEventSupported = false; + var objectIs = typeof Object.is === 'function' ? Object.is : is; -if (canUseDOM) { - // IE9 claims to support the input event but fails to trigger it when - // deleting text, so we ignore its input events. - isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 9); -} -/** - * (For IE <=9) Starts tracking propertychange events on the passed-in element - * and override the value property so that we can distinguish user events from - * value changes in JS. - */ + var hasOwnProperty$2 = Object.prototype.hasOwnProperty; + /** + * Performs equality by iterating through keys on an object and returning false + * when any key has values which are not strictly equal between the arguments. + * Returns true when the values of all keys are strictly equal. + */ + function shallowEqual(objA, objB) { + if (objectIs(objA, objB)) { + return true; + } -function startWatchingForValueChange(target, targetInst) { - activeElement = target; - activeElementInst = targetInst; - activeElement.attachEvent('onpropertychange', handlePropertyChange); -} -/** - * (For IE <=9) Removes the event listeners from the currently-tracked element, - * if any exists. - */ + if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) { + return false; + } + var keysA = Object.keys(objA); + var keysB = Object.keys(objB); -function stopWatchingForValueChange() { - if (!activeElement) { - return; - } + if (keysA.length !== keysB.length) { + return false; + } // Test for A's keys different from B. - activeElement.detachEvent('onpropertychange', handlePropertyChange); - activeElement = null; - activeElementInst = null; -} -/** - * (For IE <=9) Handles a propertychange event, sending a `change` event if - * the value of the active element has changed. - */ + for (var i = 0; i < keysA.length; i++) { + if (!hasOwnProperty$2.call(objB, keysA[i]) || !objectIs(objA[keysA[i]], objB[keysA[i]])) { + return false; + } + } -function handlePropertyChange(nativeEvent) { - if (nativeEvent.propertyName !== 'value') { - return; + return true; } - if (getInstIfValueChanged(activeElementInst)) { - manualDispatchChangeEvent(nativeEvent); - } -} + var skipSelectionChangeEvent = canUseDOM && 'documentMode' in document && document.documentMode <= 11; + var eventTypes$3 = { + select: { + phasedRegistrationNames: { + bubbled: 'onSelect', + captured: 'onSelectCapture' + }, + dependencies: [TOP_BLUR, TOP_CONTEXT_MENU, TOP_DRAG_END, TOP_FOCUS, TOP_KEY_DOWN, TOP_KEY_UP, TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_SELECTION_CHANGE] + } + }; + var activeElement$1 = null; + var activeElementInst$1 = null; + var lastSelection = null; + var mouseDown = false; + /** + * Get an object which is a unique representation of the current selection. + * + * The return value will not be consistent across nodes or browsers, but + * two identical selections on the same node will return identical objects. + * + * @param {DOMElement} node + * @return {object} + */ -function handleEventsForInputEventPolyfill(topLevelType, target, targetInst) { - if (topLevelType === TOP_FOCUS) { - // In IE9, propertychange fires for most input events but is buggy and - // doesn't fire when text is deleted, but conveniently, selectionchange - // appears to fire in all of the remaining cases so we catch those and - // forward the event if the value has changed - // In either case, we don't want to call the event handler if the value - // is changed from JS so we redefine a setter for `.value` that updates - // our activeElementValue variable, allowing us to ignore those changes - // - // stopWatching() should be a noop here but we call it just in case we - // missed a blur event somehow. - stopWatchingForValueChange(); - startWatchingForValueChange(target, targetInst); - } else if (topLevelType === TOP_BLUR) { - stopWatchingForValueChange(); + function getSelection$1(node) { + if ('selectionStart' in node && hasSelectionCapabilities(node)) { + return { + start: node.selectionStart, + end: node.selectionEnd + }; + } else { + var win = node.ownerDocument && node.ownerDocument.defaultView || window; + var selection = win.getSelection(); + return { + anchorNode: selection.anchorNode, + anchorOffset: selection.anchorOffset, + focusNode: selection.focusNode, + focusOffset: selection.focusOffset + }; + } } -} // For IE8 and IE9. + /** + * Get document associated with the event target. + * + * @param {object} nativeEventTarget + * @return {Document} + */ -function getTargetInstForInputEventPolyfill(topLevelType, targetInst) { - if (topLevelType === TOP_SELECTION_CHANGE || topLevelType === TOP_KEY_UP || topLevelType === TOP_KEY_DOWN) { - // On the selectionchange event, the target is just document which isn't - // helpful for us so just check activeElement instead. - // - // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire - // propertychange on the first input event after setting `value` from a - // script and fires only keydown, keypress, keyup. Catching keyup usually - // gets it and catching keydown lets us fire an event for the first - // keystroke if user does a key repeat (it'll be a little delayed: right - // before the second keystroke). Other input methods (e.g., paste) seem to - // fire selectionchange normally. - return getInstIfValueChanged(activeElementInst); - } -} -/** - * SECTION: handle `click` event - */ + function getEventTargetDocument(eventTarget) { + return eventTarget.window === eventTarget ? eventTarget.document : eventTarget.nodeType === DOCUMENT_NODE ? eventTarget : eventTarget.ownerDocument; + } + /** + * Poll selection to see whether it's changed. + * + * @param {object} nativeEvent + * @param {object} nativeEventTarget + * @return {?SyntheticEvent} + */ -function shouldUseClickEvent(elem) { - // Use the `click` event to detect changes to checkbox and radio inputs. - // This approach works across all browsers, whereas `change` does not fire - // until `blur` in IE8. - var nodeName = elem.nodeName; - return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio'); -} + function constructSelectEvent(nativeEvent, nativeEventTarget) { + // Ensure we have the right element, and that the user is not dragging a + // selection (this matches native `select` event behavior). In HTML5, select + // fires only on input and textarea thus if there's no focused element we + // won't dispatch. + var doc = getEventTargetDocument(nativeEventTarget); -function getTargetInstForClickEvent(topLevelType, targetInst) { - if (topLevelType === TOP_CLICK) { - return getInstIfValueChanged(targetInst); - } -} + if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement(doc)) { + return null; + } // Only fire when selection has actually changed. -function getTargetInstForInputOrChangeEvent(topLevelType, targetInst) { - if (topLevelType === TOP_INPUT || topLevelType === TOP_CHANGE) { - return getInstIfValueChanged(targetInst); - } -} -function handleControlledInputBlur(node) { - var state = node._wrapperState; + var currentSelection = getSelection$1(activeElement$1); - if (!state || !state.controlled || node.type !== 'number') { - return; - } + if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) { + lastSelection = currentSelection; + var syntheticEvent = SyntheticEvent.getPooled(eventTypes$3.select, activeElementInst$1, nativeEvent, nativeEventTarget); + syntheticEvent.type = 'select'; + syntheticEvent.target = activeElement$1; + accumulateTwoPhaseDispatches(syntheticEvent); + return syntheticEvent; + } - if (!disableInputAttributeSyncing) { - // If controlled, assign the value attribute to the current value on blur - setDefaultValue(node, 'number', node.value); + return null; } -} -/** - * This plugin creates an `onChange` event that normalizes change events - * across form elements. This event fires at a time when it's possible to - * change the element's value without seeing a flicker. - * - * Supported elements are: - * - input (see `isTextInputElement`) - * - textarea - * - select - */ + /** + * This plugin creates an `onSelect` event that normalizes select events + * across form elements. + * + * Supported elements are: + * - input (see `isTextInputElement`) + * - textarea + * - contentEditable + * + * This differs from native browser implementations in the following ways: + * - Fires on contentEditable fields as well as inputs. + * - Fires for collapsed selection. + * - Fires after user input. + */ -var ChangeEventPlugin = { - eventTypes: eventTypes$2, - _isInputEventSupported: isInputEventSupported, - extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) { - var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window; - var getTargetInstFunc, handleEventFunc; + var SelectEventPlugin = { + eventTypes: eventTypes$3, + extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, container) { + var containerOrDoc = container || getEventTargetDocument(nativeEventTarget); // Track whether all listeners exists for this plugin. If none exist, we do + // not extract events. See #3639. - if (shouldUseChangeEvent(targetNode)) { - getTargetInstFunc = getTargetInstForChangeEvent; - } else if (isTextInputElement(targetNode)) { - if (isInputEventSupported) { - getTargetInstFunc = getTargetInstForInputOrChangeEvent; - } else { - getTargetInstFunc = getTargetInstForInputEventPolyfill; - handleEventFunc = handleEventsForInputEventPolyfill; + if (!containerOrDoc || !isListeningToAllDependencies('onSelect', containerOrDoc)) { + return null; } - } else if (shouldUseClickEvent(targetNode)) { - getTargetInstFunc = getTargetInstForClickEvent; - } - if (getTargetInstFunc) { - var inst = getTargetInstFunc(topLevelType, targetInst); + var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window; - if (inst) { - var event = createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget); - return event; - } - } + switch (topLevelType) { + // Track the input node that has focus. + case TOP_FOCUS: + if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') { + activeElement$1 = targetNode; + activeElementInst$1 = targetInst; + lastSelection = null; + } - if (handleEventFunc) { - handleEventFunc(topLevelType, targetNode, targetInst); - } // When blurring, set the value attribute for number inputs + break; + case TOP_BLUR: + activeElement$1 = null; + activeElementInst$1 = null; + lastSelection = null; + break; + // Don't fire the event while the user is dragging. This matches the + // semantics of the native select event. - if (topLevelType === TOP_BLUR) { - handleControlledInputBlur(targetNode); - } - } -}; + case TOP_MOUSE_DOWN: + mouseDown = true; + break; -/** - * Module that is injectable into `EventPluginHub`, that specifies a - * deterministic ordering of `EventPlugin`s. A convenient way to reason about - * plugins, without having to package every one of them. This is better than - * having plugins be ordered in the same order that they are injected because - * that ordering would be influenced by the packaging order. - * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that - * preventing default on events is convenient in `SimpleEventPlugin` handlers. - */ -var DOMEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin']; - -var eventTypes$3 = { - mouseEnter: { - registrationName: 'onMouseEnter', - dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER] - }, - mouseLeave: { - registrationName: 'onMouseLeave', - dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER] - }, - pointerEnter: { - registrationName: 'onPointerEnter', - dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER] - }, - pointerLeave: { - registrationName: 'onPointerLeave', - dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER] - } -}; // We track the lastNativeEvent to ensure that when we encounter -// cases where we process the same nativeEvent multiple times, -// which can happen when have multiple ancestors, that we don't -// duplicate enter - -var lastNativeEvent; -var EnterLeaveEventPlugin = { - eventTypes: eventTypes$3, + case TOP_CONTEXT_MENU: + case TOP_MOUSE_UP: + case TOP_DRAG_END: + mouseDown = false; + return constructSelectEvent(nativeEvent, nativeEventTarget); + // Chrome and IE fire non-standard event when selection is changed (and + // sometimes when it hasn't). IE's event fires out of order with respect + // to key and input events on deletion, so we discard it. + // + // Firefox doesn't support selectionchange, so check selection status + // after each key entry. The selection changes after keydown and before + // keyup, but we check on keydown as well in the case of holding down a + // key, when multiple keydown events are fired but only one keyup is. + // This is also our approach for IE handling, for the reason above. + + case TOP_SELECTION_CHANGE: + if (skipSelectionChangeEvent) { + break; + } - /** - * For almost every interaction we care about, there will be both a top-level - * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that - * we do not extract duplicate events. However, moving the mouse into the - * browser from outside will not fire a `mouseout` event. In this case, we use - * the `mouseover` top-level event. - */ - extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) { - var isOverEvent = topLevelType === TOP_MOUSE_OVER || topLevelType === TOP_POINTER_OVER; - var isOutEvent = topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_POINTER_OUT; - - if (isOverEvent && (eventSystemFlags & IS_REPLAYED) === 0 && (nativeEvent.relatedTarget || nativeEvent.fromElement)) { - // If this is an over event with a target, then we've already dispatched - // the event in the out event of the other target. If this is replayed, - // then it's because we couldn't dispatch against this target previously - // so we have to do it now instead. - return null; - } + // falls through + + case TOP_KEY_DOWN: + case TOP_KEY_UP: + return constructSelectEvent(nativeEvent, nativeEventTarget); + } - if (!isOutEvent && !isOverEvent) { - // Must not be a mouse or pointer in or out - ignoring. return null; } + }; - var win; + /** + * @interface Event + * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface + * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent + */ - if (nativeEventTarget.window === nativeEventTarget) { - // `nativeEventTarget` is probably a window object. - win = nativeEventTarget; - } else { - // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8. - var doc = nativeEventTarget.ownerDocument; + var SyntheticAnimationEvent = SyntheticEvent.extend({ + animationName: null, + elapsedTime: null, + pseudoElement: null + }); - if (doc) { - win = doc.defaultView || doc.parentWindow; - } else { - win = window; - } + /** + * @interface Event + * @see http://www.w3.org/TR/clipboard-apis/ + */ + + var SyntheticClipboardEvent = SyntheticEvent.extend({ + clipboardData: function (event) { + return 'clipboardData' in event ? event.clipboardData : window.clipboardData; } + }); + + /** + * @interface FocusEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ - var from; - var to; + var SyntheticFocusEvent = SyntheticUIEvent.extend({ + relatedTarget: null + }); - if (isOutEvent) { - from = targetInst; - var related = nativeEvent.relatedTarget || nativeEvent.toElement; - to = related ? getClosestInstanceFromNode(related) : null; + /** + * `charCode` represents the actual "character code" and is safe to use with + * `String.fromCharCode`. As such, only keys that correspond to printable + * characters produce a valid `charCode`, the only exception to this is Enter. + * The Tab-key is considered non-printable and does not have a `charCode`, + * presumably because it does not produce a tab-character in browsers. + * + * @param {object} nativeEvent Native browser event. + * @return {number} Normalized `charCode` property. + */ + function getEventCharCode(nativeEvent) { + var charCode; + var keyCode = nativeEvent.keyCode; - if (to !== null) { - var nearestMounted = getNearestMountedFiber(to); + if ('charCode' in nativeEvent) { + charCode = nativeEvent.charCode; // FF does not set `charCode` for the Enter-key, check against `keyCode`. - if (to !== nearestMounted || to.tag !== HostComponent && to.tag !== HostText) { - to = null; - } + if (charCode === 0 && keyCode === 13) { + charCode = 13; } } else { - // Moving to a node from outside the window. - from = null; - to = targetInst; - } + // IE8 does not implement `charCode`, but `keyCode` has the correct value. + charCode = keyCode; + } // IE and Edge (on Windows) and Chrome / Safari (on Windows and Linux) + // report Enter as charCode 10 when ctrl is pressed. - if (from === to) { - // Nothing pertains to our managed components. - return null; - } - var eventInterface, leaveEventType, enterEventType, eventTypePrefix; - - if (topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_MOUSE_OVER) { - eventInterface = SyntheticMouseEvent; - leaveEventType = eventTypes$3.mouseLeave; - enterEventType = eventTypes$3.mouseEnter; - eventTypePrefix = 'mouse'; - } else if (topLevelType === TOP_POINTER_OUT || topLevelType === TOP_POINTER_OVER) { - eventInterface = SyntheticPointerEvent; - leaveEventType = eventTypes$3.pointerLeave; - enterEventType = eventTypes$3.pointerEnter; - eventTypePrefix = 'pointer'; - } + if (charCode === 10) { + charCode = 13; + } // Some non-printable keys are reported in `charCode`/`keyCode`, discard them. + // Must not discard the (non-)printable Enter-key. - var fromNode = from == null ? win : getNodeFromInstance$1(from); - var toNode = to == null ? win : getNodeFromInstance$1(to); - var leave = eventInterface.getPooled(leaveEventType, from, nativeEvent, nativeEventTarget); - leave.type = eventTypePrefix + 'leave'; - leave.target = fromNode; - leave.relatedTarget = toNode; - var enter = eventInterface.getPooled(enterEventType, to, nativeEvent, nativeEventTarget); - enter.type = eventTypePrefix + 'enter'; - enter.target = toNode; - enter.relatedTarget = fromNode; - accumulateEnterLeaveDispatches(leave, enter, from, to); - if (nativeEvent === lastNativeEvent) { - lastNativeEvent = null; - return [leave]; + if (charCode >= 32 || charCode === 13) { + return charCode; } - lastNativeEvent = nativeEvent; - return [leave, enter]; + return 0; } -}; -/** - * inlined Object.is polyfill to avoid requiring consumers ship their own - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is - */ -function is(x, y) { - return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare - ; -} - -var is$1 = typeof Object.is === 'function' ? Object.is : is; - -var hasOwnProperty$2 = Object.prototype.hasOwnProperty; -/** - * Performs equality by iterating through keys on an object and returning false - * when any key has values which are not strictly equal between the arguments. - * Returns true when the values of all keys are strictly equal. - */ + /** + * Normalization of deprecated HTML5 `key` values + * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names + */ -function shallowEqual(objA, objB) { - if (is$1(objA, objB)) { - return true; - } + var normalizeKey = { + Esc: 'Escape', + Spacebar: ' ', + Left: 'ArrowLeft', + Up: 'ArrowUp', + Right: 'ArrowRight', + Down: 'ArrowDown', + Del: 'Delete', + Win: 'OS', + Menu: 'ContextMenu', + Apps: 'ContextMenu', + Scroll: 'ScrollLock', + MozPrintableKey: 'Unidentified' + }; + /** + * Translation from legacy `keyCode` to HTML5 `key` + * Only special keys supported, all others depend on keyboard layout or browser + * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names + */ - if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) { - return false; - } + var translateToKey = { + '8': 'Backspace', + '9': 'Tab', + '12': 'Clear', + '13': 'Enter', + '16': 'Shift', + '17': 'Control', + '18': 'Alt', + '19': 'Pause', + '20': 'CapsLock', + '27': 'Escape', + '32': ' ', + '33': 'PageUp', + '34': 'PageDown', + '35': 'End', + '36': 'Home', + '37': 'ArrowLeft', + '38': 'ArrowUp', + '39': 'ArrowRight', + '40': 'ArrowDown', + '45': 'Insert', + '46': 'Delete', + '112': 'F1', + '113': 'F2', + '114': 'F3', + '115': 'F4', + '116': 'F5', + '117': 'F6', + '118': 'F7', + '119': 'F8', + '120': 'F9', + '121': 'F10', + '122': 'F11', + '123': 'F12', + '144': 'NumLock', + '145': 'ScrollLock', + '224': 'Meta' + }; + /** + * @param {object} nativeEvent Native browser event. + * @return {string} Normalized `key` property. + */ - var keysA = Object.keys(objA); - var keysB = Object.keys(objB); + function getEventKey(nativeEvent) { + if (nativeEvent.key) { + // Normalize inconsistent values reported by browsers due to + // implementations of a working draft specification. + // FireFox implements `key` but returns `MozPrintableKey` for all + // printable characters (normalized to `Unidentified`), ignore it. + var key = normalizeKey[nativeEvent.key] || nativeEvent.key; - if (keysA.length !== keysB.length) { - return false; - } // Test for A's keys different from B. + if (key !== 'Unidentified') { + return key; + } + } // Browser does not implement `key`, polyfill as much of it as we can. - for (var i = 0; i < keysA.length; i++) { - if (!hasOwnProperty$2.call(objB, keysA[i]) || !is$1(objA[keysA[i]], objB[keysA[i]])) { - return false; + if (nativeEvent.type === 'keypress') { + var charCode = getEventCharCode(nativeEvent); // The enter-key is technically both printable and non-printable and can + // thus be captured by `keypress`, no other non-printable key should. + + return charCode === 13 ? 'Enter' : String.fromCharCode(charCode); } + + if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') { + // While user keyboard layout determines the actual meaning of each + // `keyCode` value, almost all function keys have a universal value. + return translateToKey[nativeEvent.keyCode] || 'Unidentified'; + } + + return ''; } - return true; -} + /** + * @interface KeyboardEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ -var skipSelectionChangeEvent = canUseDOM && 'documentMode' in document && document.documentMode <= 11; -var eventTypes$4 = { - select: { - phasedRegistrationNames: { - bubbled: 'onSelect', - captured: 'onSelectCapture' - }, - dependencies: [TOP_BLUR, TOP_CONTEXT_MENU, TOP_DRAG_END, TOP_FOCUS, TOP_KEY_DOWN, TOP_KEY_UP, TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_SELECTION_CHANGE] - } -}; -var activeElement$1 = null; -var activeElementInst$1 = null; -var lastSelection = null; -var mouseDown = false; -/** - * Get an object which is a unique representation of the current selection. - * - * The return value will not be consistent across nodes or browsers, but - * two identical selections on the same node will return identical objects. - * - * @param {DOMElement} node - * @return {object} - */ + var SyntheticKeyboardEvent = SyntheticUIEvent.extend({ + key: getEventKey, + location: null, + ctrlKey: null, + shiftKey: null, + altKey: null, + metaKey: null, + repeat: null, + locale: null, + getModifierState: getEventModifierState, + // Legacy Interface + charCode: function (event) { + // `charCode` is the result of a KeyPress event and represents the value of + // the actual printable character. + // KeyPress is deprecated, but its replacement is not yet final and not + // implemented in any major browser. Only KeyPress has charCode. + if (event.type === 'keypress') { + return getEventCharCode(event); + } -function getSelection$1(node) { - if ('selectionStart' in node && hasSelectionCapabilities(node)) { - return { - start: node.selectionStart, - end: node.selectionEnd - }; - } else { - var win = node.ownerDocument && node.ownerDocument.defaultView || window; - var selection = win.getSelection(); - return { - anchorNode: selection.anchorNode, - anchorOffset: selection.anchorOffset, - focusNode: selection.focusNode, - focusOffset: selection.focusOffset - }; - } -} -/** - * Get document associated with the event target. - * - * @param {object} nativeEventTarget - * @return {Document} - */ + return 0; + }, + keyCode: function (event) { + // `keyCode` is the result of a KeyDown/Up event and represents the value of + // physical keyboard key. + // The actual meaning of the value depends on the users' keyboard layout + // which cannot be detected. Assuming that it is a US keyboard layout + // provides a surprisingly accurate mapping for US and European users. + // Due to this, it is left to the user to implement at this time. + if (event.type === 'keydown' || event.type === 'keyup') { + return event.keyCode; + } + return 0; + }, + which: function (event) { + // `which` is an alias for either `keyCode` or `charCode` depending on the + // type of the event. + if (event.type === 'keypress') { + return getEventCharCode(event); + } -function getEventTargetDocument(eventTarget) { - return eventTarget.window === eventTarget ? eventTarget.document : eventTarget.nodeType === DOCUMENT_NODE ? eventTarget : eventTarget.ownerDocument; -} -/** - * Poll selection to see whether it's changed. - * - * @param {object} nativeEvent - * @param {object} nativeEventTarget - * @return {?SyntheticEvent} - */ + if (event.type === 'keydown' || event.type === 'keyup') { + return event.keyCode; + } + return 0; + } + }); -function constructSelectEvent(nativeEvent, nativeEventTarget) { - // Ensure we have the right element, and that the user is not dragging a - // selection (this matches native `select` event behavior). In HTML5, select - // fires only on input and textarea thus if there's no focused element we - // won't dispatch. - var doc = getEventTargetDocument(nativeEventTarget); + /** + * @interface DragEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ - if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement(doc)) { - return null; - } // Only fire when selection has actually changed. + var SyntheticDragEvent = SyntheticMouseEvent.extend({ + dataTransfer: null + }); + /** + * @interface TouchEvent + * @see http://www.w3.org/TR/touch-events/ + */ - var currentSelection = getSelection$1(activeElement$1); + var SyntheticTouchEvent = SyntheticUIEvent.extend({ + touches: null, + targetTouches: null, + changedTouches: null, + altKey: null, + metaKey: null, + ctrlKey: null, + shiftKey: null, + getModifierState: getEventModifierState + }); - if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) { - lastSelection = currentSelection; - var syntheticEvent = SyntheticEvent.getPooled(eventTypes$4.select, activeElementInst$1, nativeEvent, nativeEventTarget); - syntheticEvent.type = 'select'; - syntheticEvent.target = activeElement$1; - accumulateTwoPhaseDispatches(syntheticEvent); - return syntheticEvent; - } + /** + * @interface Event + * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events- + * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent + */ - return null; -} -/** - * This plugin creates an `onSelect` event that normalizes select events - * across form elements. - * - * Supported elements are: - * - input (see `isTextInputElement`) - * - textarea - * - contentEditable - * - * This differs from native browser implementations in the following ways: - * - Fires on contentEditable fields as well as inputs. - * - Fires for collapsed selection. - * - Fires after user input. - */ + var SyntheticTransitionEvent = SyntheticEvent.extend({ + propertyName: null, + elapsedTime: null, + pseudoElement: null + }); + /** + * @interface WheelEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ -var SelectEventPlugin = { - eventTypes: eventTypes$4, - extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) { - var doc = getEventTargetDocument(nativeEventTarget); // Track whether all listeners exists for this plugin. If none exist, we do - // not extract events. See #3639. + var SyntheticWheelEvent = SyntheticMouseEvent.extend({ + deltaX: function (event) { + return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive). + 'wheelDeltaX' in event ? -event.wheelDeltaX : 0; + }, + deltaY: function (event) { + return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive). + 'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive). + 'wheelDelta' in event ? -event.wheelDelta : 0; + }, + deltaZ: null, + // Browsers without "deltaMode" is reporting in raw wheel delta where one + // notch on the scroll is always +/- 120, roughly equivalent to pixels. + // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or + // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size. + deltaMode: null + }); - if (!doc || !isListeningToAllDependencies('onSelect', doc)) { - return null; - } + var knownHTMLTopLevelTypes = [TOP_ABORT, TOP_CANCEL, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_CLOSE, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_INPUT, TOP_INVALID, TOP_LOAD, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_RESET, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUBMIT, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_TOGGLE, TOP_VOLUME_CHANGE, TOP_WAITING]; + var SimpleEventPlugin = { + // simpleEventPluginEventTypes gets populated from + // the DOMEventProperties module. + eventTypes: simpleEventPluginEventTypes, + extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) { + var dispatchConfig = topLevelEventsToDispatchConfig.get(topLevelType); - var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window; + if (!dispatchConfig) { + return null; + } - switch (topLevelType) { - // Track the input node that has focus. - case TOP_FOCUS: - if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') { - activeElement$1 = targetNode; - activeElementInst$1 = targetInst; - lastSelection = null; - } + var EventConstructor; - break; + switch (topLevelType) { + case TOP_KEY_PRESS: + // Firefox creates a keypress event for function keys too. This removes + // the unwanted keypress events. Enter is however both printable and + // non-printable. One would expect Tab to be as well (but it isn't). + if (getEventCharCode(nativeEvent) === 0) { + return null; + } - case TOP_BLUR: - activeElement$1 = null; - activeElementInst$1 = null; - lastSelection = null; - break; - // Don't fire the event while the user is dragging. This matches the - // semantics of the native select event. + /* falls through */ - case TOP_MOUSE_DOWN: - mouseDown = true; - break; + case TOP_KEY_DOWN: + case TOP_KEY_UP: + EventConstructor = SyntheticKeyboardEvent; + break; - case TOP_CONTEXT_MENU: - case TOP_MOUSE_UP: - case TOP_DRAG_END: - mouseDown = false; - return constructSelectEvent(nativeEvent, nativeEventTarget); - // Chrome and IE fire non-standard event when selection is changed (and - // sometimes when it hasn't). IE's event fires out of order with respect - // to key and input events on deletion, so we discard it. - // - // Firefox doesn't support selectionchange, so check selection status - // after each key entry. The selection changes after keydown and before - // keyup, but we check on keydown as well in the case of holding down a - // key, when multiple keydown events are fired but only one keyup is. - // This is also our approach for IE handling, for the reason above. - - case TOP_SELECTION_CHANGE: - if (skipSelectionChangeEvent) { + case TOP_BLUR: + case TOP_FOCUS: + EventConstructor = SyntheticFocusEvent; break; - } - // falls through + case TOP_CLICK: + // Firefox creates a click event on right mouse clicks. This removes the + // unwanted click events. + if (nativeEvent.button === 2) { + return null; + } - case TOP_KEY_DOWN: - case TOP_KEY_UP: - return constructSelectEvent(nativeEvent, nativeEventTarget); - } + /* falls through */ - return null; - } -}; + case TOP_AUX_CLICK: + case TOP_DOUBLE_CLICK: + case TOP_MOUSE_DOWN: + case TOP_MOUSE_MOVE: + case TOP_MOUSE_UP: // TODO: Disabled elements should not respond to mouse events -/** - * Inject modules for resolving DOM hierarchy and plugin ordering. - */ + /* falls through */ -injection.injectEventPluginOrder(DOMEventPluginOrder); -setComponentTree(getFiberCurrentPropsFromNode$1, getInstanceFromNode$1, getNodeFromInstance$1); -/** - * Some important event plugins included by default (without having to require - * them). - */ + case TOP_MOUSE_OUT: + case TOP_MOUSE_OVER: + case TOP_CONTEXT_MENU: + EventConstructor = SyntheticMouseEvent; + break; -injection.injectEventPluginsByName({ - SimpleEventPlugin: SimpleEventPlugin, - EnterLeaveEventPlugin: EnterLeaveEventPlugin, - ChangeEventPlugin: ChangeEventPlugin, - SelectEventPlugin: SelectEventPlugin, - BeforeInputEventPlugin: BeforeInputEventPlugin -}); - -// Prefix measurements so that it's possible to filter them. -// Longer prefixes are hard to read in DevTools. -var reactEmoji = "\u269B"; -var warningEmoji = "\u26D4"; -var supportsUserTiming = typeof performance !== 'undefined' && typeof performance.mark === 'function' && typeof performance.clearMarks === 'function' && typeof performance.measure === 'function' && typeof performance.clearMeasures === 'function'; // Keep track of current fiber so that we know the path to unwind on pause. -// TODO: this looks the same as nextUnitOfWork in scheduler. Can we unify them? - -var currentFiber = null; // If we're in the middle of user code, which fiber and method is it? -// Reusing `currentFiber` would be confusing for this because user code fiber -// can change during commit phase too, but we don't need to unwind it (since -// lifecycles in the commit phase don't resemble a tree). - -var currentPhase = null; -var currentPhaseFiber = null; // Did lifecycle hook schedule an update? This is often a performance problem, -// so we will keep track of it, and include it in the report. -// Track commits caused by cascading updates. - -var isCommitting = false; -var hasScheduledUpdateInCurrentCommit = false; -var hasScheduledUpdateInCurrentPhase = false; -var commitCountInCurrentWorkLoop = 0; -var effectCountInCurrentCommit = 0; -// to avoid stretch the commit phase with measurement overhead. - -var labelsInCurrentCommit = new Set(); - -var formatMarkName = function (markName) { - return reactEmoji + " " + markName; -}; - -var formatLabel = function (label, warning) { - var prefix = warning ? warningEmoji + " " : reactEmoji + " "; - var suffix = warning ? " Warning: " + warning : ''; - return "" + prefix + label + suffix; -}; - -var beginMark = function (markName) { - performance.mark(formatMarkName(markName)); -}; - -var clearMark = function (markName) { - performance.clearMarks(formatMarkName(markName)); -}; - -var endMark = function (label, markName, warning) { - var formattedMarkName = formatMarkName(markName); - var formattedLabel = formatLabel(label, warning); - - try { - performance.measure(formattedLabel, formattedMarkName); - } catch (err) {} // If previous mark was missing for some reason, this will throw. - // This could only happen if React crashed in an unexpected place earlier. - // Don't pile on with more errors. - // Clear marks immediately to avoid growing buffer. - - - performance.clearMarks(formattedMarkName); - performance.clearMeasures(formattedLabel); -}; - -var getFiberMarkName = function (label, debugID) { - return label + " (#" + debugID + ")"; -}; - -var getFiberLabel = function (componentName, isMounted, phase) { - if (phase === null) { - // These are composite component total time measurements. - return componentName + " [" + (isMounted ? 'update' : 'mount') + "]"; - } else { - // Composite component methods. - return componentName + "." + phase; - } -}; - -var beginFiberMark = function (fiber, phase) { - var componentName = getComponentName(fiber.type) || 'Unknown'; - var debugID = fiber._debugID; - var isMounted = fiber.alternate !== null; - var label = getFiberLabel(componentName, isMounted, phase); - - if (isCommitting && labelsInCurrentCommit.has(label)) { - // During the commit phase, we don't show duplicate labels because - // there is a fixed overhead for every measurement, and we don't - // want to stretch the commit phase beyond necessary. - return false; - } + case TOP_DRAG: + case TOP_DRAG_END: + case TOP_DRAG_ENTER: + case TOP_DRAG_EXIT: + case TOP_DRAG_LEAVE: + case TOP_DRAG_OVER: + case TOP_DRAG_START: + case TOP_DROP: + EventConstructor = SyntheticDragEvent; + break; - labelsInCurrentCommit.add(label); - var markName = getFiberMarkName(label, debugID); - beginMark(markName); - return true; -}; - -var clearFiberMark = function (fiber, phase) { - var componentName = getComponentName(fiber.type) || 'Unknown'; - var debugID = fiber._debugID; - var isMounted = fiber.alternate !== null; - var label = getFiberLabel(componentName, isMounted, phase); - var markName = getFiberMarkName(label, debugID); - clearMark(markName); -}; - -var endFiberMark = function (fiber, phase, warning) { - var componentName = getComponentName(fiber.type) || 'Unknown'; - var debugID = fiber._debugID; - var isMounted = fiber.alternate !== null; - var label = getFiberLabel(componentName, isMounted, phase); - var markName = getFiberMarkName(label, debugID); - endMark(label, markName, warning); -}; - -var shouldIgnoreFiber = function (fiber) { - // Host components should be skipped in the timeline. - // We could check typeof fiber.type, but does this work with RN? - switch (fiber.tag) { - case HostRoot: - case HostComponent: - case HostText: - case HostPortal: - case Fragment: - case ContextProvider: - case ContextConsumer: - case Mode: - return true; + case TOP_TOUCH_CANCEL: + case TOP_TOUCH_END: + case TOP_TOUCH_MOVE: + case TOP_TOUCH_START: + EventConstructor = SyntheticTouchEvent; + break; - default: - return false; - } -}; + case TOP_ANIMATION_END: + case TOP_ANIMATION_ITERATION: + case TOP_ANIMATION_START: + EventConstructor = SyntheticAnimationEvent; + break; -var clearPendingPhaseMeasurement = function () { - if (currentPhase !== null && currentPhaseFiber !== null) { - clearFiberMark(currentPhaseFiber, currentPhase); - } + case TOP_TRANSITION_END: + EventConstructor = SyntheticTransitionEvent; + break; - currentPhaseFiber = null; - currentPhase = null; - hasScheduledUpdateInCurrentPhase = false; -}; + case TOP_SCROLL: + EventConstructor = SyntheticUIEvent; + break; -var pauseTimers = function () { - // Stops all currently active measurements so that they can be resumed - // if we continue in a later deferred loop from the same unit of work. - var fiber = currentFiber; + case TOP_WHEEL: + EventConstructor = SyntheticWheelEvent; + break; - while (fiber) { - if (fiber._debugIsCurrentlyTiming) { - endFiberMark(fiber, null, null); - } + case TOP_COPY: + case TOP_CUT: + case TOP_PASTE: + EventConstructor = SyntheticClipboardEvent; + break; - fiber = fiber.return; - } -}; + case TOP_GOT_POINTER_CAPTURE: + case TOP_LOST_POINTER_CAPTURE: + case TOP_POINTER_CANCEL: + case TOP_POINTER_DOWN: + case TOP_POINTER_MOVE: + case TOP_POINTER_OUT: + case TOP_POINTER_OVER: + case TOP_POINTER_UP: + EventConstructor = SyntheticPointerEvent; + break; -var resumeTimersRecursively = function (fiber) { - if (fiber.return !== null) { - resumeTimersRecursively(fiber.return); - } + default: + { + if (knownHTMLTopLevelTypes.indexOf(topLevelType) === -1) { + error('SimpleEventPlugin: Unhandled event type, `%s`. This warning ' + 'is likely caused by a bug in React. Please file an issue.', topLevelType); + } + } // HTML Events + // @see http://www.w3.org/TR/html5/index.html#events-0 - if (fiber._debugIsCurrentlyTiming) { - beginFiberMark(fiber, null); - } -}; -var resumeTimers = function () { - // Resumes all measurements that were active during the last deferred loop. - if (currentFiber !== null) { - resumeTimersRecursively(currentFiber); - } -}; + EventConstructor = SyntheticEvent; + break; + } -function recordEffect() { - if (enableUserTimingAPI) { - effectCountInCurrentCommit++; - } -} -function recordScheduleUpdate() { - if (enableUserTimingAPI) { - if (isCommitting) { - hasScheduledUpdateInCurrentCommit = true; + var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget); + accumulateTwoPhaseDispatches(event); + return event; } + }; - if (currentPhase !== null && currentPhase !== 'componentWillMount' && currentPhase !== 'componentWillReceiveProps') { - hasScheduledUpdateInCurrentPhase = true; - } - } -} + /** + * Specifies a deterministic ordering of `EventPlugin`s. A convenient way to + * reason about plugins, without having to package every one of them. This + * is better than having plugins be ordered in the same order that they + * are injected because that ordering would be influenced by the packaging order. + * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that + * preventing default on events is convenient in `SimpleEventPlugin` handlers. + */ + var DOMEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin']; + /** + * Inject modules for resolving DOM hierarchy and plugin ordering. + */ -function startWorkTimer(fiber) { - if (enableUserTimingAPI) { - if (!supportsUserTiming || shouldIgnoreFiber(fiber)) { - return; - } // If we pause, this is the fiber to unwind from. + injectEventPluginOrder(DOMEventPluginOrder); + setComponentTree(getFiberCurrentPropsFromNode$1, getInstanceFromNode$1, getNodeFromInstance$1); + /** + * Some important event plugins included by default (without having to require + * them). + */ + injectEventPluginsByName({ + SimpleEventPlugin: SimpleEventPlugin, + EnterLeaveEventPlugin: EnterLeaveEventPlugin, + ChangeEventPlugin: ChangeEventPlugin, + SelectEventPlugin: SelectEventPlugin, + BeforeInputEventPlugin: BeforeInputEventPlugin + }); - currentFiber = fiber; + // Prefix measurements so that it's possible to filter them. + // Longer prefixes are hard to read in DevTools. + var reactEmoji = "\u269B"; + var warningEmoji = "\u26D4"; + var supportsUserTiming = typeof performance !== 'undefined' && typeof performance.mark === 'function' && typeof performance.clearMarks === 'function' && typeof performance.measure === 'function' && typeof performance.clearMeasures === 'function'; // Keep track of current fiber so that we know the path to unwind on pause. + // TODO: this looks the same as nextUnitOfWork in scheduler. Can we unify them? + + var currentFiber = null; // If we're in the middle of user code, which fiber and method is it? + // Reusing `currentFiber` would be confusing for this because user code fiber + // can change during commit phase too, but we don't need to unwind it (since + // lifecycles in the commit phase don't resemble a tree). + + var currentPhase = null; + var currentPhaseFiber = null; // Did lifecycle hook schedule an update? This is often a performance problem, + // so we will keep track of it, and include it in the report. + // Track commits caused by cascading updates. + + var isCommitting = false; + var hasScheduledUpdateInCurrentCommit = false; + var hasScheduledUpdateInCurrentPhase = false; + var commitCountInCurrentWorkLoop = 0; + var effectCountInCurrentCommit = 0; + // to avoid stretch the commit phase with measurement overhead. + + var labelsInCurrentCommit = new Set(); + + var formatMarkName = function (markName) { + return reactEmoji + " " + markName; + }; - if (!beginFiberMark(fiber, null)) { - return; - } + var formatLabel = function (label, warning) { + var prefix = warning ? warningEmoji + " " : reactEmoji + " "; + var suffix = warning ? " Warning: " + warning : ''; + return "" + prefix + label + suffix; + }; - fiber._debugIsCurrentlyTiming = true; - } -} -function cancelWorkTimer(fiber) { - if (enableUserTimingAPI) { - if (!supportsUserTiming || shouldIgnoreFiber(fiber)) { - return; - } // Remember we shouldn't complete measurement for this fiber. - // Otherwise flamechart will be deep even for small updates. + var beginMark = function (markName) { + performance.mark(formatMarkName(markName)); + }; + var clearMark = function (markName) { + performance.clearMarks(formatMarkName(markName)); + }; - fiber._debugIsCurrentlyTiming = false; - clearFiberMark(fiber, null); - } -} -function stopWorkTimer(fiber) { - if (enableUserTimingAPI) { - if (!supportsUserTiming || shouldIgnoreFiber(fiber)) { - return; - } // If we pause, its parent is the fiber to unwind from. + var endMark = function (label, markName, warning) { + var formattedMarkName = formatMarkName(markName); + var formattedLabel = formatLabel(label, warning); + try { + performance.measure(formattedLabel, formattedMarkName); + } catch (err) {} // If previous mark was missing for some reason, this will throw. + // This could only happen if React crashed in an unexpected place earlier. + // Don't pile on with more errors. + // Clear marks immediately to avoid growing buffer. - currentFiber = fiber.return; - if (!fiber._debugIsCurrentlyTiming) { - return; - } + performance.clearMarks(formattedMarkName); + performance.clearMeasures(formattedLabel); + }; - fiber._debugIsCurrentlyTiming = false; - endFiberMark(fiber, null, null); - } -} -function stopFailedWorkTimer(fiber) { - if (enableUserTimingAPI) { - if (!supportsUserTiming || shouldIgnoreFiber(fiber)) { - return; - } // If we pause, its parent is the fiber to unwind from. + var getFiberMarkName = function (label, debugID) { + return label + " (#" + debugID + ")"; + }; + var getFiberLabel = function (componentName, isMounted, phase) { + if (phase === null) { + // These are composite component total time measurements. + return componentName + " [" + (isMounted ? 'update' : 'mount') + "]"; + } else { + // Composite component methods. + return componentName + "." + phase; + } + }; - currentFiber = fiber.return; + var beginFiberMark = function (fiber, phase) { + var componentName = getComponentName(fiber.type) || 'Unknown'; + var debugID = fiber._debugID; + var isMounted = fiber.alternate !== null; + var label = getFiberLabel(componentName, isMounted, phase); - if (!fiber._debugIsCurrentlyTiming) { - return; + if (isCommitting && labelsInCurrentCommit.has(label)) { + // During the commit phase, we don't show duplicate labels because + // there is a fixed overhead for every measurement, and we don't + // want to stretch the commit phase beyond necessary. + return false; } - fiber._debugIsCurrentlyTiming = false; - var warning = fiber.tag === SuspenseComponent ? 'Rendering was suspended' : 'An error was thrown inside this error boundary'; - endFiberMark(fiber, null, warning); - } -} -function startPhaseTimer(fiber, phase) { - if (enableUserTimingAPI) { - if (!supportsUserTiming) { - return; - } + labelsInCurrentCommit.add(label); + var markName = getFiberMarkName(label, debugID); + beginMark(markName); + return true; + }; - clearPendingPhaseMeasurement(); + var clearFiberMark = function (fiber, phase) { + var componentName = getComponentName(fiber.type) || 'Unknown'; + var debugID = fiber._debugID; + var isMounted = fiber.alternate !== null; + var label = getFiberLabel(componentName, isMounted, phase); + var markName = getFiberMarkName(label, debugID); + clearMark(markName); + }; - if (!beginFiberMark(fiber, phase)) { - return; - } + var endFiberMark = function (fiber, phase, warning) { + var componentName = getComponentName(fiber.type) || 'Unknown'; + var debugID = fiber._debugID; + var isMounted = fiber.alternate !== null; + var label = getFiberLabel(componentName, isMounted, phase); + var markName = getFiberMarkName(label, debugID); + endMark(label, markName, warning); + }; - currentPhaseFiber = fiber; - currentPhase = phase; - } -} -function stopPhaseTimer() { - if (enableUserTimingAPI) { - if (!supportsUserTiming) { - return; + var shouldIgnoreFiber = function (fiber) { + // Host components should be skipped in the timeline. + // We could check typeof fiber.type, but does this work with RN? + switch (fiber.tag) { + case HostRoot: + case HostComponent: + case HostText: + case HostPortal: + case Fragment: + case ContextProvider: + case ContextConsumer: + case Mode: + return true; + + default: + return false; } + }; + var clearPendingPhaseMeasurement = function () { if (currentPhase !== null && currentPhaseFiber !== null) { - var warning = hasScheduledUpdateInCurrentPhase ? 'Scheduled a cascading update' : null; - endFiberMark(currentPhaseFiber, currentPhase, warning); + clearFiberMark(currentPhaseFiber, currentPhase); } - currentPhase = null; currentPhaseFiber = null; - } -} -function startWorkLoopTimer(nextUnitOfWork) { - if (enableUserTimingAPI) { - currentFiber = nextUnitOfWork; - - if (!supportsUserTiming) { - return; - } + currentPhase = null; + hasScheduledUpdateInCurrentPhase = false; + }; - commitCountInCurrentWorkLoop = 0; // This is top level call. - // Any other measurements are performed within. + var pauseTimers = function () { + // Stops all currently active measurements so that they can be resumed + // if we continue in a later deferred loop from the same unit of work. + var fiber = currentFiber; - beginMark('(React Tree Reconciliation)'); // Resume any measurements that were in progress during the last loop. + while (fiber) { + if (fiber._debugIsCurrentlyTiming) { + endFiberMark(fiber, null, null); + } - resumeTimers(); - } -} -function stopWorkLoopTimer(interruptedBy, didCompleteRoot) { - if (enableUserTimingAPI) { - if (!supportsUserTiming) { - return; + fiber = fiber.return; } + }; - var warning = null; - - if (interruptedBy !== null) { - if (interruptedBy.tag === HostRoot) { - warning = 'A top-level update interrupted the previous render'; - } else { - var componentName = getComponentName(interruptedBy.type) || 'Unknown'; - warning = "An update to " + componentName + " interrupted the previous render"; - } - } else if (commitCountInCurrentWorkLoop > 1) { - warning = 'There were cascading updates'; + var resumeTimersRecursively = function (fiber) { + if (fiber.return !== null) { + resumeTimersRecursively(fiber.return); } - commitCountInCurrentWorkLoop = 0; - var label = didCompleteRoot ? '(React Tree Reconciliation: Completed Root)' : '(React Tree Reconciliation: Yielded)'; // Pause any measurements until the next loop. - - pauseTimers(); - endMark(label, '(React Tree Reconciliation)', warning); - } -} -function startCommitTimer() { - if (enableUserTimingAPI) { - if (!supportsUserTiming) { - return; + if (fiber._debugIsCurrentlyTiming) { + beginFiberMark(fiber, null); } + }; - isCommitting = true; - hasScheduledUpdateInCurrentCommit = false; - labelsInCurrentCommit.clear(); - beginMark('(Committing Changes)'); - } -} -function stopCommitTimer() { - if (enableUserTimingAPI) { - if (!supportsUserTiming) { - return; + var resumeTimers = function () { + // Resumes all measurements that were active during the last deferred loop. + if (currentFiber !== null) { + resumeTimersRecursively(currentFiber); } + }; - var warning = null; - - if (hasScheduledUpdateInCurrentCommit) { - warning = 'Lifecycle hook scheduled a cascading update'; - } else if (commitCountInCurrentWorkLoop > 0) { - warning = 'Caused by a cascading update in earlier commit'; + function recordEffect() { + { + effectCountInCurrentCommit++; } - - hasScheduledUpdateInCurrentCommit = false; - commitCountInCurrentWorkLoop++; - isCommitting = false; - labelsInCurrentCommit.clear(); - endMark('(Committing Changes)', '(Committing Changes)', warning); } -} -function startCommitSnapshotEffectsTimer() { - if (enableUserTimingAPI) { - if (!supportsUserTiming) { - return; - } + function recordScheduleUpdate() { + { + if (isCommitting) { + hasScheduledUpdateInCurrentCommit = true; + } - effectCountInCurrentCommit = 0; - beginMark('(Committing Snapshot Effects)'); - } -} -function stopCommitSnapshotEffectsTimer() { - if (enableUserTimingAPI) { - if (!supportsUserTiming) { - return; + if (currentPhase !== null && currentPhase !== 'componentWillMount' && currentPhase !== 'componentWillReceiveProps') { + hasScheduledUpdateInCurrentPhase = true; + } } - - var count = effectCountInCurrentCommit; - effectCountInCurrentCommit = 0; - endMark("(Committing Snapshot Effects: " + count + " Total)", '(Committing Snapshot Effects)', null); } -} -function startCommitHostEffectsTimer() { - if (enableUserTimingAPI) { - if (!supportsUserTiming) { - return; - } + function startWorkTimer(fiber) { + { + if (!supportsUserTiming || shouldIgnoreFiber(fiber)) { + return; + } // If we pause, this is the fiber to unwind from. - effectCountInCurrentCommit = 0; - beginMark('(Committing Host Effects)'); - } -} -function stopCommitHostEffectsTimer() { - if (enableUserTimingAPI) { - if (!supportsUserTiming) { - return; - } - var count = effectCountInCurrentCommit; - effectCountInCurrentCommit = 0; - endMark("(Committing Host Effects: " + count + " Total)", '(Committing Host Effects)', null); - } -} -function startCommitLifeCyclesTimer() { - if (enableUserTimingAPI) { - if (!supportsUserTiming) { - return; - } + currentFiber = fiber; - effectCountInCurrentCommit = 0; - beginMark('(Calling Lifecycle Methods)'); - } -} -function stopCommitLifeCyclesTimer() { - if (enableUserTimingAPI) { - if (!supportsUserTiming) { - return; - } + if (!beginFiberMark(fiber, null)) { + return; + } - var count = effectCountInCurrentCommit; - effectCountInCurrentCommit = 0; - endMark("(Calling Lifecycle Methods: " + count + " Total)", '(Calling Lifecycle Methods)', null); + fiber._debugIsCurrentlyTiming = true; + } } -} - -var valueStack = []; -var fiberStack; + function cancelWorkTimer(fiber) { + { + if (!supportsUserTiming || shouldIgnoreFiber(fiber)) { + return; + } // Remember we shouldn't complete measurement for this fiber. + // Otherwise flamechart will be deep even for small updates. -{ - fiberStack = []; -} -var index = -1; + fiber._debugIsCurrentlyTiming = false; + clearFiberMark(fiber, null); + } + } + function stopWorkTimer(fiber) { + { + if (!supportsUserTiming || shouldIgnoreFiber(fiber)) { + return; + } // If we pause, its parent is the fiber to unwind from. -function createCursor(defaultValue) { - return { - current: defaultValue - }; -} -function pop(cursor, fiber) { - if (index < 0) { - { - warningWithoutStack$1(false, 'Unexpected pop.'); - } + currentFiber = fiber.return; - return; - } + if (!fiber._debugIsCurrentlyTiming) { + return; + } - { - if (fiber !== fiberStack[index]) { - warningWithoutStack$1(false, 'Unexpected Fiber popped.'); + fiber._debugIsCurrentlyTiming = false; + endFiberMark(fiber, null, null); } } + function stopFailedWorkTimer(fiber) { + { + if (!supportsUserTiming || shouldIgnoreFiber(fiber)) { + return; + } // If we pause, its parent is the fiber to unwind from. - cursor.current = valueStack[index]; - valueStack[index] = null; - { - fiberStack[index] = null; + currentFiber = fiber.return; + + if (!fiber._debugIsCurrentlyTiming) { + return; + } + + fiber._debugIsCurrentlyTiming = false; + var warning = fiber.tag === SuspenseComponent ? 'Rendering was suspended' : 'An error was thrown inside this error boundary'; + endFiberMark(fiber, null, warning); + } } + function startPhaseTimer(fiber, phase) { + { + if (!supportsUserTiming) { + return; + } - index--; -} + clearPendingPhaseMeasurement(); -function push(cursor, value, fiber) { - index++; - valueStack[index] = cursor.current; + if (!beginFiberMark(fiber, phase)) { + return; + } - { - fiberStack[index] = fiber; + currentPhaseFiber = fiber; + currentPhase = phase; + } } + function stopPhaseTimer() { + { + if (!supportsUserTiming) { + return; + } - cursor.current = value; -} + if (currentPhase !== null && currentPhaseFiber !== null) { + var warning = hasScheduledUpdateInCurrentPhase ? 'Scheduled a cascading update' : null; + endFiberMark(currentPhaseFiber, currentPhase, warning); + } -var warnedAboutMissingGetChildContext; + currentPhase = null; + currentPhaseFiber = null; + } + } + function startWorkLoopTimer(nextUnitOfWork) { + { + currentFiber = nextUnitOfWork; -{ - warnedAboutMissingGetChildContext = {}; -} + if (!supportsUserTiming) { + return; + } -var emptyContextObject = {}; + commitCountInCurrentWorkLoop = 0; // This is top level call. + // Any other measurements are performed within. -{ - Object.freeze(emptyContextObject); -} // A cursor to the current merged context object on the stack. + beginMark('(React Tree Reconciliation)'); // Resume any measurements that were in progress during the last loop. + resumeTimers(); + } + } + function stopWorkLoopTimer(interruptedBy, didCompleteRoot) { + { + if (!supportsUserTiming) { + return; + } -var contextStackCursor = createCursor(emptyContextObject); // A cursor to a boolean indicating whether the context has changed. + var warning = null; -var didPerformWorkStackCursor = createCursor(false); // Keep track of the previous context object that was on the stack. -// We use this to get access to the parent context after we have already -// pushed the next context provider, and now need to merge their contexts. + if (interruptedBy !== null) { + if (interruptedBy.tag === HostRoot) { + warning = 'A top-level update interrupted the previous render'; + } else { + var componentName = getComponentName(interruptedBy.type) || 'Unknown'; + warning = "An update to " + componentName + " interrupted the previous render"; + } + } else if (commitCountInCurrentWorkLoop > 1) { + warning = 'There were cascading updates'; + } -var previousContext = emptyContextObject; + commitCountInCurrentWorkLoop = 0; + var label = didCompleteRoot ? '(React Tree Reconciliation: Completed Root)' : '(React Tree Reconciliation: Yielded)'; // Pause any measurements until the next loop. -function getUnmaskedContext(workInProgress, Component, didPushOwnContextIfProvider) { - if (disableLegacyContext) { - return emptyContextObject; - } else { - if (didPushOwnContextIfProvider && isContextProvider(Component)) { - // If the fiber is a context provider itself, when we read its context - // we may have already pushed its own child context on the stack. A context - // provider should not "see" its own child context. Therefore we read the - // previous (parent) context instead for a context provider. - return previousContext; + pauseTimers(); + endMark(label, '(React Tree Reconciliation)', warning); } - - return contextStackCursor.current; } -} + function startCommitTimer() { + { + if (!supportsUserTiming) { + return; + } -function cacheContext(workInProgress, unmaskedContext, maskedContext) { - if (disableLegacyContext) { - return; - } else { - var instance = workInProgress.stateNode; - instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext; - instance.__reactInternalMemoizedMaskedChildContext = maskedContext; + isCommitting = true; + hasScheduledUpdateInCurrentCommit = false; + labelsInCurrentCommit.clear(); + beginMark('(Committing Changes)'); + } } -} - -function getMaskedContext(workInProgress, unmaskedContext) { - if (disableLegacyContext) { - return emptyContextObject; - } else { - var type = workInProgress.type; - var contextTypes = type.contextTypes; - - if (!contextTypes) { - return emptyContextObject; - } // Avoid recreating masked context unless unmasked context has changed. - // Failing to do this will result in unnecessary calls to componentWillReceiveProps. - // This may trigger infinite loops if componentWillReceiveProps calls setState. + function stopCommitTimer() { + { + if (!supportsUserTiming) { + return; + } + var warning = null; - var instance = workInProgress.stateNode; + if (hasScheduledUpdateInCurrentCommit) { + warning = 'Lifecycle hook scheduled a cascading update'; + } else if (commitCountInCurrentWorkLoop > 0) { + warning = 'Caused by a cascading update in earlier commit'; + } - if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) { - return instance.__reactInternalMemoizedMaskedChildContext; + hasScheduledUpdateInCurrentCommit = false; + commitCountInCurrentWorkLoop++; + isCommitting = false; + labelsInCurrentCommit.clear(); + endMark('(Committing Changes)', '(Committing Changes)', warning); } + } + function startCommitSnapshotEffectsTimer() { + { + if (!supportsUserTiming) { + return; + } - var context = {}; - - for (var key in contextTypes) { - context[key] = unmaskedContext[key]; + effectCountInCurrentCommit = 0; + beginMark('(Committing Snapshot Effects)'); } - + } + function stopCommitSnapshotEffectsTimer() { { - var name = getComponentName(type) || 'Unknown'; - checkPropTypes_1(contextTypes, context, 'context', name, getCurrentFiberStackInDev); - } // Cache unmasked context so we can avoid recreating masked context unless necessary. - // Context is created before the class component is instantiated so check for instance. - + if (!supportsUserTiming) { + return; + } - if (instance) { - cacheContext(workInProgress, unmaskedContext, context); + var count = effectCountInCurrentCommit; + effectCountInCurrentCommit = 0; + endMark("(Committing Snapshot Effects: " + count + " Total)", '(Committing Snapshot Effects)', null); } + } + function startCommitHostEffectsTimer() { + { + if (!supportsUserTiming) { + return; + } - return context; + effectCountInCurrentCommit = 0; + beginMark('(Committing Host Effects)'); + } } -} + function stopCommitHostEffectsTimer() { + { + if (!supportsUserTiming) { + return; + } -function hasContextChanged() { - if (disableLegacyContext) { - return false; - } else { - return didPerformWorkStackCursor.current; + var count = effectCountInCurrentCommit; + effectCountInCurrentCommit = 0; + endMark("(Committing Host Effects: " + count + " Total)", '(Committing Host Effects)', null); + } } -} + function startCommitLifeCyclesTimer() { + { + if (!supportsUserTiming) { + return; + } -function isContextProvider(type) { - if (disableLegacyContext) { - return false; - } else { - var childContextTypes = type.childContextTypes; - return childContextTypes !== null && childContextTypes !== undefined; - } -} - -function popContext(fiber) { - if (disableLegacyContext) { - return; - } else { - pop(didPerformWorkStackCursor, fiber); - pop(contextStackCursor, fiber); - } -} - -function popTopLevelContextObject(fiber) { - if (disableLegacyContext) { - return; - } else { - pop(didPerformWorkStackCursor, fiber); - pop(contextStackCursor, fiber); - } -} - -function pushTopLevelContextObject(fiber, context, didChange) { - if (disableLegacyContext) { - return; - } else { - if (!(contextStackCursor.current === emptyContextObject)) { - { - throw Error("Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue."); + effectCountInCurrentCommit = 0; + beginMark('(Calling Lifecycle Methods)'); + } + } + function stopCommitLifeCyclesTimer() { + { + if (!supportsUserTiming) { + return; } + + var count = effectCountInCurrentCommit; + effectCountInCurrentCommit = 0; + endMark("(Calling Lifecycle Methods: " + count + " Total)", '(Calling Lifecycle Methods)', null); } + } + + var valueStack = []; + var fiberStack; - push(contextStackCursor, context, fiber); - push(didPerformWorkStackCursor, didChange, fiber); + { + fiberStack = []; } -} -function processChildContext(fiber, type, parentContext) { - if (disableLegacyContext) { - return parentContext; - } else { - var instance = fiber.stateNode; - var childContextTypes = type.childContextTypes; // TODO (bvaughn) Replace this behavior with an invariant() in the future. - // It has only been added in Fiber to match the (unintentional) behavior in Stack. + var index = -1; - if (typeof instance.getChildContext !== 'function') { - { - var componentName = getComponentName(type) || 'Unknown'; + function createCursor(defaultValue) { + return { + current: defaultValue + }; + } - if (!warnedAboutMissingGetChildContext[componentName]) { - warnedAboutMissingGetChildContext[componentName] = true; - warningWithoutStack$1(false, '%s.childContextTypes is specified but there is no getChildContext() method ' + 'on the instance. You can either define getChildContext() on %s or remove ' + 'childContextTypes from it.', componentName, componentName); - } + function pop(cursor, fiber) { + if (index < 0) { + { + error('Unexpected pop.'); } - return parentContext; + return; } - var childContext; - { - setCurrentPhase('getChildContext'); + if (fiber !== fiberStack[index]) { + error('Unexpected Fiber popped.'); + } } - startPhaseTimer(fiber, 'getChildContext'); - childContext = instance.getChildContext(); - stopPhaseTimer(); + cursor.current = valueStack[index]; + valueStack[index] = null; { - setCurrentPhase(null); + fiberStack[index] = null; } - for (var contextKey in childContext) { - if (!(contextKey in childContextTypes)) { - { - throw Error((getComponentName(type) || 'Unknown') + ".getChildContext(): key \"" + contextKey + "\" is not defined in childContextTypes."); - } - } - } + index--; + } + + function push(cursor, value, fiber) { + index++; + valueStack[index] = cursor.current; { - var name = getComponentName(type) || 'Unknown'; - checkPropTypes_1(childContextTypes, childContext, 'child context', name, // In practice, there is one case in which we won't get a stack. It's when - // somebody calls unstable_renderSubtreeIntoContainer() and we process - // context from the parent component instance. The stack will be missing - // because it's outside of the reconciliation, and so the pointer has not - // been set. This is rare and doesn't matter. We'll also remove that API. - getCurrentFiberStackInDev); + fiberStack[index] = fiber; } - return _assign({}, parentContext, {}, childContext); + cursor.current = value; } -} -function pushContextProvider(workInProgress) { - if (disableLegacyContext) { - return false; - } else { - var instance = workInProgress.stateNode; // We push the context as early as possible to ensure stack integrity. - // If the instance does not exist yet, we will push null at first, - // and replace it on the stack later when invalidating the context. + var warnedAboutMissingGetChildContext; - var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject; // Remember the parent context so we can merge with it later. - // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates. - - previousContext = contextStackCursor.current; - push(contextStackCursor, memoizedMergedChildContext, workInProgress); - push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress); - return true; + { + warnedAboutMissingGetChildContext = {}; } -} -function invalidateContextProvider(workInProgress, type, didChange) { - if (disableLegacyContext) { - return; - } else { - var instance = workInProgress.stateNode; + var emptyContextObject = {}; - if (!instance) { - { - throw Error("Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue."); - } - } + { + Object.freeze(emptyContextObject); + } // A cursor to the current merged context object on the stack. - if (didChange) { - // Merge parent and own context. - // Skip this if we're not updating due to sCU. - // This avoids unnecessarily recomputing memoized values. - var mergedContext = processChildContext(workInProgress, type, previousContext); - instance.__reactInternalMemoizedMergedChildContext = mergedContext; // Replace the old (or empty) context with the new one. - // It is important to unwind the context in the reverse order. - pop(didPerformWorkStackCursor, workInProgress); - pop(contextStackCursor, workInProgress); // Now push the new context and mark that it has changed. + var contextStackCursor = createCursor(emptyContextObject); // A cursor to a boolean indicating whether the context has changed. - push(contextStackCursor, mergedContext, workInProgress); - push(didPerformWorkStackCursor, didChange, workInProgress); - } else { - pop(didPerformWorkStackCursor, workInProgress); - push(didPerformWorkStackCursor, didChange, workInProgress); + var didPerformWorkStackCursor = createCursor(false); // Keep track of the previous context object that was on the stack. + // We use this to get access to the parent context after we have already + // pushed the next context provider, and now need to merge their contexts. + + var previousContext = emptyContextObject; + + function getUnmaskedContext(workInProgress, Component, didPushOwnContextIfProvider) { + { + if (didPushOwnContextIfProvider && isContextProvider(Component)) { + // If the fiber is a context provider itself, when we read its context + // we may have already pushed its own child context on the stack. A context + // provider should not "see" its own child context. Therefore we read the + // previous (parent) context instead for a context provider. + return previousContext; + } + + return contextStackCursor.current; } } -} -function findCurrentUnmaskedContext(fiber) { - if (disableLegacyContext) { - return emptyContextObject; - } else { - // Currently this is only used with renderSubtreeIntoContainer; not sure if it - // makes sense elsewhere - if (!(isFiberMounted(fiber) && fiber.tag === ClassComponent)) { - { - throw Error("Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue."); - } + function cacheContext(workInProgress, unmaskedContext, maskedContext) { + { + var instance = workInProgress.stateNode; + instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext; + instance.__reactInternalMemoizedMaskedChildContext = maskedContext; } + } - var node = fiber; + function getMaskedContext(workInProgress, unmaskedContext) { + { + var type = workInProgress.type; + var contextTypes = type.contextTypes; - do { - switch (node.tag) { - case HostRoot: - return node.stateNode.context; + if (!contextTypes) { + return emptyContextObject; + } // Avoid recreating masked context unless unmasked context has changed. + // Failing to do this will result in unnecessary calls to componentWillReceiveProps. + // This may trigger infinite loops if componentWillReceiveProps calls setState. - case ClassComponent: - { - var Component = node.type; - if (isContextProvider(Component)) { - return node.stateNode.__reactInternalMemoizedMergedChildContext; - } + var instance = workInProgress.stateNode; - break; - } + if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) { + return instance.__reactInternalMemoizedMaskedChildContext; } - node = node.return; - } while (node !== null); + var context = {}; + + for (var key in contextTypes) { + context[key] = unmaskedContext[key]; + } - { { - throw Error("Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue."); - } - } - } -} - -var LegacyRoot = 0; -var BlockingRoot = 1; -var ConcurrentRoot = 2; - -var ReactInternals$2 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; -var _ReactInternals$Sched$1 = ReactInternals$2.SchedulerTracing; -var __interactionsRef = _ReactInternals$Sched$1.__interactionsRef; -var __subscriberRef = _ReactInternals$Sched$1.__subscriberRef; -var unstable_clear = _ReactInternals$Sched$1.unstable_clear; -var unstable_getCurrent = _ReactInternals$Sched$1.unstable_getCurrent; -var unstable_getThreadID = _ReactInternals$Sched$1.unstable_getThreadID; -var unstable_subscribe = _ReactInternals$Sched$1.unstable_subscribe; -var unstable_trace = _ReactInternals$Sched$1.unstable_trace; -var unstable_unsubscribe = _ReactInternals$Sched$1.unstable_unsubscribe; -var unstable_wrap = _ReactInternals$Sched$1.unstable_wrap; - -// Intentionally not named imports because Rollup would use dynamic dispatch for -// CommonJS interop named imports. -var Scheduler_runWithPriority = unstable_runWithPriority; -var Scheduler_scheduleCallback = unstable_scheduleCallback; -var Scheduler_cancelCallback = unstable_cancelCallback; -var Scheduler_shouldYield = unstable_shouldYield; -var Scheduler_requestPaint = unstable_requestPaint; -var Scheduler_now = unstable_now; -var Scheduler_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel; -var Scheduler_ImmediatePriority = unstable_ImmediatePriority; -var Scheduler_UserBlockingPriority = unstable_UserBlockingPriority; -var Scheduler_NormalPriority = unstable_NormalPriority; -var Scheduler_LowPriority = unstable_LowPriority; -var Scheduler_IdlePriority = unstable_IdlePriority; - -if (enableSchedulerTracing) { - // Provide explicit error message when production+profiling bundle of e.g. - // react-dom is used with production (non-profiling) bundle of - // scheduler/tracing - if (!(__interactionsRef != null && __interactionsRef.current != null)) { - { - throw Error("It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `scheduler/tracing` module with `scheduler/tracing-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at http://fb.me/react-profiling"); - } - } -} - -var fakeCallbackNode = {}; // Except for NoPriority, these correspond to Scheduler priorities. We use -// ascending numbers so we can compare them like numbers. They start at 90 to -// avoid clashing with Scheduler's priorities. - -var ImmediatePriority = 99; -var UserBlockingPriority$2 = 98; -var NormalPriority = 97; -var LowPriority = 96; -var IdlePriority = 95; // NoPriority is the absence of priority. Also React-only. - -var NoPriority = 90; -var shouldYield = Scheduler_shouldYield; -var requestPaint = // Fall back gracefully if we're running an older version of Scheduler. -Scheduler_requestPaint !== undefined ? Scheduler_requestPaint : function () {}; -var syncQueue = null; -var immediateQueueCallbackNode = null; -var isFlushingSyncQueue = false; -var initialTimeMs = Scheduler_now(); // If the initial timestamp is reasonably small, use Scheduler's `now` directly. -// This will be the case for modern browsers that support `performance.now`. In -// older browsers, Scheduler falls back to `Date.now`, which returns a Unix -// timestamp. In that case, subtract the module initialization time to simulate -// the behavior of performance.now and keep our times small enough to fit -// within 32 bits. -// TODO: Consider lifting this into Scheduler. - -var now = initialTimeMs < 10000 ? Scheduler_now : function () { - return Scheduler_now() - initialTimeMs; -}; -function getCurrentPriorityLevel() { - switch (Scheduler_getCurrentPriorityLevel()) { - case Scheduler_ImmediatePriority: - return ImmediatePriority; + var name = getComponentName(type) || 'Unknown'; + checkPropTypes_1(contextTypes, context, 'context', name, getCurrentFiberStackInDev); + } // Cache unmasked context so we can avoid recreating masked context unless necessary. + // Context is created before the class component is instantiated so check for instance. - case Scheduler_UserBlockingPriority: - return UserBlockingPriority$2; - case Scheduler_NormalPriority: - return NormalPriority; + if (instance) { + cacheContext(workInProgress, unmaskedContext, context); + } - case Scheduler_LowPriority: - return LowPriority; + return context; + } + } - case Scheduler_IdlePriority: - return IdlePriority; + function hasContextChanged() { + { + return didPerformWorkStackCursor.current; + } + } - default: - { + function isContextProvider(type) { + { + var childContextTypes = type.childContextTypes; + return childContextTypes !== null && childContextTypes !== undefined; + } + } + + function popContext(fiber) { + { + pop(didPerformWorkStackCursor, fiber); + pop(contextStackCursor, fiber); + } + } + + function popTopLevelContextObject(fiber) { + { + pop(didPerformWorkStackCursor, fiber); + pop(contextStackCursor, fiber); + } + } + + function pushTopLevelContextObject(fiber, context, didChange) { + { + if (!(contextStackCursor.current === emptyContextObject)) { { - throw Error("Unknown priority level."); + throw Error( "Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue." ); } } + push(contextStackCursor, context, fiber); + push(didPerformWorkStackCursor, didChange, fiber); + } } -} -function reactPriorityToSchedulerPriority(reactPriorityLevel) { - switch (reactPriorityLevel) { - case ImmediatePriority: - return Scheduler_ImmediatePriority; + function processChildContext(fiber, type, parentContext) { + { + var instance = fiber.stateNode; + var childContextTypes = type.childContextTypes; // TODO (bvaughn) Replace this behavior with an invariant() in the future. + // It has only been added in Fiber to match the (unintentional) behavior in Stack. - case UserBlockingPriority$2: - return Scheduler_UserBlockingPriority; + if (typeof instance.getChildContext !== 'function') { + { + var componentName = getComponentName(type) || 'Unknown'; - case NormalPriority: - return Scheduler_NormalPriority; + if (!warnedAboutMissingGetChildContext[componentName]) { + warnedAboutMissingGetChildContext[componentName] = true; - case LowPriority: - return Scheduler_LowPriority; + error('%s.childContextTypes is specified but there is no getChildContext() method ' + 'on the instance. You can either define getChildContext() on %s or remove ' + 'childContextTypes from it.', componentName, componentName); + } + } - case IdlePriority: - return Scheduler_IdlePriority; + return parentContext; + } - default: - { - { - throw Error("Unknown priority level."); + var childContext; + startPhaseTimer(fiber, 'getChildContext'); + childContext = instance.getChildContext(); + stopPhaseTimer(); + + for (var contextKey in childContext) { + if (!(contextKey in childContextTypes)) { + { + throw Error( (getComponentName(type) || 'Unknown') + ".getChildContext(): key \"" + contextKey + "\" is not defined in childContextTypes." ); + } } } - } -} - -function runWithPriority$2(reactPriorityLevel, fn) { - var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel); - return Scheduler_runWithPriority(priorityLevel, fn); -} -function scheduleCallback(reactPriorityLevel, callback, options) { - var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel); - return Scheduler_scheduleCallback(priorityLevel, callback, options); -} -function scheduleSyncCallback(callback) { - // Push this callback into an internal queue. We'll flush these either in - // the next tick, or earlier if something calls `flushSyncCallbackQueue`. - if (syncQueue === null) { - syncQueue = [callback]; // Flush the queue in the next tick, at the earliest. + { + var name = getComponentName(type) || 'Unknown'; + checkPropTypes_1(childContextTypes, childContext, 'child context', name, // In practice, there is one case in which we won't get a stack. It's when + // somebody calls unstable_renderSubtreeIntoContainer() and we process + // context from the parent component instance. The stack will be missing + // because it's outside of the reconciliation, and so the pointer has not + // been set. This is rare and doesn't matter. We'll also remove that API. + getCurrentFiberStackInDev); + } - immediateQueueCallbackNode = Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueueImpl); - } else { - // Push onto existing queue. Don't need to schedule a callback because - // we already scheduled one when we created the queue. - syncQueue.push(callback); + return _assign({}, parentContext, {}, childContext); + } } - return fakeCallbackNode; -} -function cancelCallback(callbackNode) { - if (callbackNode !== fakeCallbackNode) { - Scheduler_cancelCallback(callbackNode); - } -} -function flushSyncCallbackQueue() { - if (immediateQueueCallbackNode !== null) { - var node = immediateQueueCallbackNode; - immediateQueueCallbackNode = null; - Scheduler_cancelCallback(node); - } + function pushContextProvider(workInProgress) { + { + var instance = workInProgress.stateNode; // We push the context as early as possible to ensure stack integrity. + // If the instance does not exist yet, we will push null at first, + // and replace it on the stack later when invalidating the context. - flushSyncCallbackQueueImpl(); -} + var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject; // Remember the parent context so we can merge with it later. + // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates. -function flushSyncCallbackQueueImpl() { - if (!isFlushingSyncQueue && syncQueue !== null) { - // Prevent re-entrancy. - isFlushingSyncQueue = true; - var i = 0; + previousContext = contextStackCursor.current; + push(contextStackCursor, memoizedMergedChildContext, workInProgress); + push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress); + return true; + } + } - try { - var _isSync = true; - var queue = syncQueue; - runWithPriority$2(ImmediatePriority, function () { - for (; i < queue.length; i++) { - var callback = queue[i]; + function invalidateContextProvider(workInProgress, type, didChange) { + { + var instance = workInProgress.stateNode; - do { - callback = callback(_isSync); - } while (callback !== null); + if (!instance) { + { + throw Error( "Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue." ); } - }); - syncQueue = null; - } catch (error) { - // If something throws, leave the remaining callbacks on the queue. - if (syncQueue !== null) { - syncQueue = syncQueue.slice(i + 1); - } // Resume flushing in the next tick - + } - Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueue); - throw error; - } finally { - isFlushingSyncQueue = false; - } - } -} - -var NoMode = 0; -var StrictMode = 1; // TODO: Remove BlockingMode and ConcurrentMode by reading from the root -// tag instead - -var BlockingMode = 2; -var ConcurrentMode = 4; -var ProfileMode = 8; - -// Max 31 bit integer. The max integer size in V8 for 32-bit systems. -// Math.pow(2, 30) - 1 -// 0b111111111111111111111111111111 -var MAX_SIGNED_31_BIT_INT = 1073741823; - -var NoWork = 0; // TODO: Think of a better name for Never. The key difference with Idle is that -// Never work can be committed in an inconsistent state without tearing the UI. -// The main example is offscreen content, like a hidden subtree. So one possible -// name is Offscreen. However, it also includes dehydrated Suspense boundaries, -// which are inconsistent in the sense that they haven't finished yet, but -// aren't visibly inconsistent because the server rendered HTML matches what the -// hydrated tree would look like. - -var Never = 1; // Idle is slightly higher priority than Never. It must completely finish in -// order to be consistent. - -var Idle = 2; // Continuous Hydration is a moving priority. It is slightly higher than Idle -// and is used to increase priority of hover targets. It is increasing with -// each usage so that last always wins. - -var ContinuousHydration = 3; -var Sync = MAX_SIGNED_31_BIT_INT; -var Batched = Sync - 1; -var UNIT_SIZE = 10; -var MAGIC_NUMBER_OFFSET = Batched - 1; // 1 unit of expiration time represents 10ms. - -function msToExpirationTime(ms) { - // Always add an offset so that we don't clash with the magic number for NoWork. - return MAGIC_NUMBER_OFFSET - (ms / UNIT_SIZE | 0); -} -function expirationTimeToMs(expirationTime) { - return (MAGIC_NUMBER_OFFSET - expirationTime) * UNIT_SIZE; -} - -function ceiling(num, precision) { - return ((num / precision | 0) + 1) * precision; -} - -function computeExpirationBucket(currentTime, expirationInMs, bucketSizeMs) { - return MAGIC_NUMBER_OFFSET - ceiling(MAGIC_NUMBER_OFFSET - currentTime + expirationInMs / UNIT_SIZE, bucketSizeMs / UNIT_SIZE); -} // TODO: This corresponds to Scheduler's NormalPriority, not LowPriority. Update -// the names to reflect. - - -var LOW_PRIORITY_EXPIRATION = 5000; -var LOW_PRIORITY_BATCH_SIZE = 250; -function computeAsyncExpiration(currentTime) { - return computeExpirationBucket(currentTime, LOW_PRIORITY_EXPIRATION, LOW_PRIORITY_BATCH_SIZE); -} -function computeSuspenseExpiration(currentTime, timeoutMs) { - // TODO: Should we warn if timeoutMs is lower than the normal pri expiration time? - return computeExpirationBucket(currentTime, timeoutMs, LOW_PRIORITY_BATCH_SIZE); -} // We intentionally set a higher expiration time for interactive updates in -// dev than in production. -// -// If the main thread is being blocked so long that you hit the expiration, -// it's a problem that could be solved with better scheduling. -// -// People will be more likely to notice this and fix it with the long -// expiration time in development. -// -// In production we opt for better UX at the risk of masking scheduling -// problems, by expiring fast. - -var HIGH_PRIORITY_EXPIRATION = 500; -var HIGH_PRIORITY_BATCH_SIZE = 100; -function computeInteractiveExpiration(currentTime) { - return computeExpirationBucket(currentTime, HIGH_PRIORITY_EXPIRATION, HIGH_PRIORITY_BATCH_SIZE); -} -function computeContinuousHydrationExpiration(currentTime) { - // Each time we ask for a new one of these we increase the priority. - // This ensures that the last one always wins since we can't deprioritize - // once we've scheduled work already. - return ContinuousHydration++; -} -function inferPriorityFromExpirationTime(currentTime, expirationTime) { - if (expirationTime === Sync) { - return ImmediatePriority; - } - - if (expirationTime === Never || expirationTime === Idle) { - return IdlePriority; - } + if (didChange) { + // Merge parent and own context. + // Skip this if we're not updating due to sCU. + // This avoids unnecessarily recomputing memoized values. + var mergedContext = processChildContext(workInProgress, type, previousContext); + instance.__reactInternalMemoizedMergedChildContext = mergedContext; // Replace the old (or empty) context with the new one. + // It is important to unwind the context in the reverse order. - var msUntil = expirationTimeToMs(expirationTime) - expirationTimeToMs(currentTime); + pop(didPerformWorkStackCursor, workInProgress); + pop(contextStackCursor, workInProgress); // Now push the new context and mark that it has changed. - if (msUntil <= 0) { - return ImmediatePriority; + push(contextStackCursor, mergedContext, workInProgress); + push(didPerformWorkStackCursor, didChange, workInProgress); + } else { + pop(didPerformWorkStackCursor, workInProgress); + push(didPerformWorkStackCursor, didChange, workInProgress); + } + } } - if (msUntil <= HIGH_PRIORITY_EXPIRATION + HIGH_PRIORITY_BATCH_SIZE) { - return UserBlockingPriority$2; - } + function findCurrentUnmaskedContext(fiber) { + { + // Currently this is only used with renderSubtreeIntoContainer; not sure if it + // makes sense elsewhere + if (!(isFiberMounted(fiber) && fiber.tag === ClassComponent)) { + { + throw Error( "Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue." ); + } + } - if (msUntil <= LOW_PRIORITY_EXPIRATION + LOW_PRIORITY_BATCH_SIZE) { - return NormalPriority; - } // TODO: Handle LowPriority - // Assume anything lower has idle priority + var node = fiber; + do { + switch (node.tag) { + case HostRoot: + return node.stateNode.context; - return IdlePriority; -} + case ClassComponent: + { + var Component = node.type; -/** - * Forked from fbjs/warning: - * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js - * - * Only change is we use console.warn instead of console.error, - * and do nothing when 'console' is not supported. - * This really simplifies the code. - * --- - * Similar to invariant but only logs a warning if the condition is not met. - * This can be used to log issues in development environments in critical - * paths. Removing the logging code for production environments will keep the - * same logic and follow the same code paths. - */ -var lowPriorityWarningWithoutStack = function () {}; + if (isContextProvider(Component)) { + return node.stateNode.__reactInternalMemoizedMergedChildContext; + } -{ - var printWarning$1 = function (format) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } + break; + } + } - var argIndex = 0; - var message = 'Warning: ' + format.replace(/%s/g, function () { - return args[argIndex++]; - }); + node = node.return; + } while (node !== null); - if (typeof console !== 'undefined') { - console.warn(message); + { + { + throw Error( "Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue." ); + } + } } + } - try { - // --- Welcome to debugging React --- - // This error was thrown as a convenience so that you can use this stack - // to find the callsite that caused this warning to fire. - throw new Error(message); - } catch (x) {} - }; + var LegacyRoot = 0; + var BlockingRoot = 1; + var ConcurrentRoot = 2; - lowPriorityWarningWithoutStack = function (condition, format) { - if (format === undefined) { - throw new Error('`lowPriorityWarningWithoutStack(condition, format, ...args)` requires a warning ' + 'message argument'); - } + var ReactInternals$2 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + var _ReactInternals$Sched$1 = ReactInternals$2.SchedulerTracing, + __interactionsRef = _ReactInternals$Sched$1.__interactionsRef, + __subscriberRef = _ReactInternals$Sched$1.__subscriberRef, + unstable_clear = _ReactInternals$Sched$1.unstable_clear, + unstable_getCurrent = _ReactInternals$Sched$1.unstable_getCurrent, + unstable_getThreadID = _ReactInternals$Sched$1.unstable_getThreadID, + unstable_subscribe = _ReactInternals$Sched$1.unstable_subscribe, + unstable_trace = _ReactInternals$Sched$1.unstable_trace, + unstable_unsubscribe = _ReactInternals$Sched$1.unstable_unsubscribe, + unstable_wrap = _ReactInternals$Sched$1.unstable_wrap; - if (!condition) { - for (var _len2 = arguments.length, args = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) { - args[_key2 - 2] = arguments[_key2]; - } + var Scheduler_runWithPriority = unstable_runWithPriority, + Scheduler_scheduleCallback = unstable_scheduleCallback, + Scheduler_cancelCallback = unstable_cancelCallback, + Scheduler_shouldYield = unstable_shouldYield, + Scheduler_requestPaint = unstable_requestPaint, + Scheduler_now = unstable_now, + Scheduler_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel, + Scheduler_ImmediatePriority = unstable_ImmediatePriority, + Scheduler_UserBlockingPriority = unstable_UserBlockingPriority, + Scheduler_NormalPriority = unstable_NormalPriority, + Scheduler_LowPriority = unstable_LowPriority, + Scheduler_IdlePriority = unstable_IdlePriority; - printWarning$1.apply(void 0, [format].concat(args)); - } + { + // Provide explicit error message when production+profiling bundle of e.g. + // react-dom is used with production (non-profiling) bundle of + // scheduler/tracing + if (!(__interactionsRef != null && __interactionsRef.current != null)) { + { + throw Error( "It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `scheduler/tracing` module with `scheduler/tracing-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at http://fb.me/react-profiling" ); + } + } + } + + var fakeCallbackNode = {}; // Except for NoPriority, these correspond to Scheduler priorities. We use + // ascending numbers so we can compare them like numbers. They start at 90 to + // avoid clashing with Scheduler's priorities. + + var ImmediatePriority = 99; + var UserBlockingPriority$1 = 98; + var NormalPriority = 97; + var LowPriority = 96; + var IdlePriority = 95; // NoPriority is the absence of priority. Also React-only. + + var NoPriority = 90; + var shouldYield = Scheduler_shouldYield; + var requestPaint = // Fall back gracefully if we're running an older version of Scheduler. + Scheduler_requestPaint !== undefined ? Scheduler_requestPaint : function () {}; + var syncQueue = null; + var immediateQueueCallbackNode = null; + var isFlushingSyncQueue = false; + var initialTimeMs = Scheduler_now(); // If the initial timestamp is reasonably small, use Scheduler's `now` directly. + // This will be the case for modern browsers that support `performance.now`. In + // older browsers, Scheduler falls back to `Date.now`, which returns a Unix + // timestamp. In that case, subtract the module initialization time to simulate + // the behavior of performance.now and keep our times small enough to fit + // within 32 bits. + // TODO: Consider lifting this into Scheduler. + + var now = initialTimeMs < 10000 ? Scheduler_now : function () { + return Scheduler_now() - initialTimeMs; }; -} + function getCurrentPriorityLevel() { + switch (Scheduler_getCurrentPriorityLevel()) { + case Scheduler_ImmediatePriority: + return ImmediatePriority; -var lowPriorityWarningWithoutStack$1 = lowPriorityWarningWithoutStack; + case Scheduler_UserBlockingPriority: + return UserBlockingPriority$1; -var ReactStrictModeWarnings = { - recordUnsafeLifecycleWarnings: function (fiber, instance) {}, - flushPendingUnsafeLifecycleWarnings: function () {}, - recordLegacyContextWarning: function (fiber, instance) {}, - flushLegacyContextWarning: function () {}, - discardPendingWarnings: function () {} -}; + case Scheduler_NormalPriority: + return NormalPriority; -{ - var findStrictRoot = function (fiber) { - var maybeStrictRoot = null; - var node = fiber; + case Scheduler_LowPriority: + return LowPriority; - while (node !== null) { - if (node.mode & StrictMode) { - maybeStrictRoot = node; - } + case Scheduler_IdlePriority: + return IdlePriority; + + default: + { + { + throw Error( "Unknown priority level." ); + } + } - node = node.return; } + } - return maybeStrictRoot; - }; + function reactPriorityToSchedulerPriority(reactPriorityLevel) { + switch (reactPriorityLevel) { + case ImmediatePriority: + return Scheduler_ImmediatePriority; - var setToSortedString = function (set) { - var array = []; - set.forEach(function (value) { - array.push(value); - }); - return array.sort().join(', '); - }; + case UserBlockingPriority$1: + return Scheduler_UserBlockingPriority; - var pendingComponentWillMountWarnings = []; - var pendingUNSAFE_ComponentWillMountWarnings = []; - var pendingComponentWillReceivePropsWarnings = []; - var pendingUNSAFE_ComponentWillReceivePropsWarnings = []; - var pendingComponentWillUpdateWarnings = []; - var pendingUNSAFE_ComponentWillUpdateWarnings = []; // Tracks components we have already warned about. + case NormalPriority: + return Scheduler_NormalPriority; - var didWarnAboutUnsafeLifecycles = new Set(); + case LowPriority: + return Scheduler_LowPriority; - ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function (fiber, instance) { - // Dedup strategy: Warn once per component. - if (didWarnAboutUnsafeLifecycles.has(fiber.type)) { - return; - } + case IdlePriority: + return Scheduler_IdlePriority; - if (typeof instance.componentWillMount === 'function' && // Don't warn about react-lifecycles-compat polyfilled components. - instance.componentWillMount.__suppressDeprecationWarning !== true) { - pendingComponentWillMountWarnings.push(fiber); - } + default: + { + { + throw Error( "Unknown priority level." ); + } + } - if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillMount === 'function') { - pendingUNSAFE_ComponentWillMountWarnings.push(fiber); } + } - if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) { - pendingComponentWillReceivePropsWarnings.push(fiber); - } + function runWithPriority$1(reactPriorityLevel, fn) { + var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel); + return Scheduler_runWithPriority(priorityLevel, fn); + } + function scheduleCallback(reactPriorityLevel, callback, options) { + var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel); + return Scheduler_scheduleCallback(priorityLevel, callback, options); + } + function scheduleSyncCallback(callback) { + // Push this callback into an internal queue. We'll flush these either in + // the next tick, or earlier if something calls `flushSyncCallbackQueue`. + if (syncQueue === null) { + syncQueue = [callback]; // Flush the queue in the next tick, at the earliest. - if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillReceiveProps === 'function') { - pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber); + immediateQueueCallbackNode = Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueueImpl); + } else { + // Push onto existing queue. Don't need to schedule a callback because + // we already scheduled one when we created the queue. + syncQueue.push(callback); } - if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) { - pendingComponentWillUpdateWarnings.push(fiber); + return fakeCallbackNode; + } + function cancelCallback(callbackNode) { + if (callbackNode !== fakeCallbackNode) { + Scheduler_cancelCallback(callbackNode); } - - if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillUpdate === 'function') { - pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber); + } + function flushSyncCallbackQueue() { + if (immediateQueueCallbackNode !== null) { + var node = immediateQueueCallbackNode; + immediateQueueCallbackNode = null; + Scheduler_cancelCallback(node); } - }; - - ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function () { - // We do an initial pass to gather component names - var componentWillMountUniqueNames = new Set(); - if (pendingComponentWillMountWarnings.length > 0) { - pendingComponentWillMountWarnings.forEach(function (fiber) { - componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component'); - didWarnAboutUnsafeLifecycles.add(fiber.type); - }); - pendingComponentWillMountWarnings = []; - } + flushSyncCallbackQueueImpl(); + } - var UNSAFE_componentWillMountUniqueNames = new Set(); + function flushSyncCallbackQueueImpl() { + if (!isFlushingSyncQueue && syncQueue !== null) { + // Prevent re-entrancy. + isFlushingSyncQueue = true; + var i = 0; - if (pendingUNSAFE_ComponentWillMountWarnings.length > 0) { - pendingUNSAFE_ComponentWillMountWarnings.forEach(function (fiber) { - UNSAFE_componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component'); - didWarnAboutUnsafeLifecycles.add(fiber.type); - }); - pendingUNSAFE_ComponentWillMountWarnings = []; - } + try { + var _isSync = true; + var queue = syncQueue; + runWithPriority$1(ImmediatePriority, function () { + for (; i < queue.length; i++) { + var callback = queue[i]; + + do { + callback = callback(_isSync); + } while (callback !== null); + } + }); + syncQueue = null; + } catch (error) { + // If something throws, leave the remaining callbacks on the queue. + if (syncQueue !== null) { + syncQueue = syncQueue.slice(i + 1); + } // Resume flushing in the next tick - var componentWillReceivePropsUniqueNames = new Set(); - if (pendingComponentWillReceivePropsWarnings.length > 0) { - pendingComponentWillReceivePropsWarnings.forEach(function (fiber) { - componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component'); - didWarnAboutUnsafeLifecycles.add(fiber.type); - }); - pendingComponentWillReceivePropsWarnings = []; + Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueue); + throw error; + } finally { + isFlushingSyncQueue = false; + } } + } - var UNSAFE_componentWillReceivePropsUniqueNames = new Set(); - - if (pendingUNSAFE_ComponentWillReceivePropsWarnings.length > 0) { - pendingUNSAFE_ComponentWillReceivePropsWarnings.forEach(function (fiber) { - UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component'); - didWarnAboutUnsafeLifecycles.add(fiber.type); - }); - pendingUNSAFE_ComponentWillReceivePropsWarnings = []; - } + var NoMode = 0; + var StrictMode = 1; // TODO: Remove BlockingMode and ConcurrentMode by reading from the root + // tag instead - var componentWillUpdateUniqueNames = new Set(); + var BlockingMode = 2; + var ConcurrentMode = 4; + var ProfileMode = 8; - if (pendingComponentWillUpdateWarnings.length > 0) { - pendingComponentWillUpdateWarnings.forEach(function (fiber) { - componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component'); - didWarnAboutUnsafeLifecycles.add(fiber.type); - }); - pendingComponentWillUpdateWarnings = []; - } + // Max 31 bit integer. The max integer size in V8 for 32-bit systems. + // Math.pow(2, 30) - 1 + // 0b111111111111111111111111111111 + var MAX_SIGNED_31_BIT_INT = 1073741823; - var UNSAFE_componentWillUpdateUniqueNames = new Set(); + var NoWork = 0; // TODO: Think of a better name for Never. The key difference with Idle is that + // Never work can be committed in an inconsistent state without tearing the UI. + // The main example is offscreen content, like a hidden subtree. So one possible + // name is Offscreen. However, it also includes dehydrated Suspense boundaries, + // which are inconsistent in the sense that they haven't finished yet, but + // aren't visibly inconsistent because the server rendered HTML matches what the + // hydrated tree would look like. - if (pendingUNSAFE_ComponentWillUpdateWarnings.length > 0) { - pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function (fiber) { - UNSAFE_componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component'); - didWarnAboutUnsafeLifecycles.add(fiber.type); - }); - pendingUNSAFE_ComponentWillUpdateWarnings = []; - } // Finally, we flush all the warnings - // UNSAFE_ ones before the deprecated ones, since they'll be 'louder' + var Never = 1; // Idle is slightly higher priority than Never. It must completely finish in + // order to be consistent. + var Idle = 2; // Continuous Hydration is slightly higher than Idle and is used to increase + // priority of hover targets. - if (UNSAFE_componentWillMountUniqueNames.size > 0) { - var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames); - warningWithoutStack$1(false, 'Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\n' + '\nPlease update the following components: %s', sortedNames); - } + var ContinuousHydration = 3; + var Sync = MAX_SIGNED_31_BIT_INT; + var Batched = Sync - 1; + var UNIT_SIZE = 10; + var MAGIC_NUMBER_OFFSET = Batched - 1; // 1 unit of expiration time represents 10ms. - if (UNSAFE_componentWillReceivePropsUniqueNames.size > 0) { - var _sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames); + function msToExpirationTime(ms) { + // Always subtract from the offset so that we don't clash with the magic number for NoWork. + return MAGIC_NUMBER_OFFSET - (ms / UNIT_SIZE | 0); + } + function expirationTimeToMs(expirationTime) { + return (MAGIC_NUMBER_OFFSET - expirationTime) * UNIT_SIZE; + } - warningWithoutStack$1(false, 'Using UNSAFE_componentWillReceiveProps in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + "* If you're updating state whenever props change, " + 'refactor your code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state\n' + '\nPlease update the following components: %s', _sortedNames); - } + function ceiling(num, precision) { + return ((num / precision | 0) + 1) * precision; + } - if (UNSAFE_componentWillUpdateUniqueNames.size > 0) { - var _sortedNames2 = setToSortedString(UNSAFE_componentWillUpdateUniqueNames); + function computeExpirationBucket(currentTime, expirationInMs, bucketSizeMs) { + return MAGIC_NUMBER_OFFSET - ceiling(MAGIC_NUMBER_OFFSET - currentTime + expirationInMs / UNIT_SIZE, bucketSizeMs / UNIT_SIZE); + } // TODO: This corresponds to Scheduler's NormalPriority, not LowPriority. Update + // the names to reflect. - warningWithoutStack$1(false, 'Using UNSAFE_componentWillUpdate in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '\nPlease update the following components: %s', _sortedNames2); - } - if (componentWillMountUniqueNames.size > 0) { - var _sortedNames3 = setToSortedString(componentWillMountUniqueNames); + var LOW_PRIORITY_EXPIRATION = 5000; + var LOW_PRIORITY_BATCH_SIZE = 250; + function computeAsyncExpiration(currentTime) { + return computeExpirationBucket(currentTime, LOW_PRIORITY_EXPIRATION, LOW_PRIORITY_BATCH_SIZE); + } + function computeSuspenseExpiration(currentTime, timeoutMs) { + // TODO: Should we warn if timeoutMs is lower than the normal pri expiration time? + return computeExpirationBucket(currentTime, timeoutMs, LOW_PRIORITY_BATCH_SIZE); + } // We intentionally set a higher expiration time for interactive updates in + // dev than in production. + // + // If the main thread is being blocked so long that you hit the expiration, + // it's a problem that could be solved with better scheduling. + // + // People will be more likely to notice this and fix it with the long + // expiration time in development. + // + // In production we opt for better UX at the risk of masking scheduling + // problems, by expiring fast. - lowPriorityWarningWithoutStack$1(false, 'componentWillMount has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\n' + '* Rename componentWillMount to UNSAFE_componentWillMount to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames3); + var HIGH_PRIORITY_EXPIRATION = 500 ; + var HIGH_PRIORITY_BATCH_SIZE = 100; + function computeInteractiveExpiration(currentTime) { + return computeExpirationBucket(currentTime, HIGH_PRIORITY_EXPIRATION, HIGH_PRIORITY_BATCH_SIZE); + } + function inferPriorityFromExpirationTime(currentTime, expirationTime) { + if (expirationTime === Sync) { + return ImmediatePriority; } - if (componentWillReceivePropsUniqueNames.size > 0) { - var _sortedNames4 = setToSortedString(componentWillReceivePropsUniqueNames); - - lowPriorityWarningWithoutStack$1(false, 'componentWillReceiveProps has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + "* If you're updating state whenever props change, refactor your " + 'code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state\n' + '* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames4); + if (expirationTime === Never || expirationTime === Idle) { + return IdlePriority; } - if (componentWillUpdateUniqueNames.size > 0) { - var _sortedNames5 = setToSortedString(componentWillUpdateUniqueNames); + var msUntil = expirationTimeToMs(expirationTime) - expirationTimeToMs(currentTime); - lowPriorityWarningWithoutStack$1(false, 'componentWillUpdate has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames5); + if (msUntil <= 0) { + return ImmediatePriority; } - }; - var pendingLegacyContextWarning = new Map(); // Tracks components we have already warned about. + if (msUntil <= HIGH_PRIORITY_EXPIRATION + HIGH_PRIORITY_BATCH_SIZE) { + return UserBlockingPriority$1; + } - var didWarnAboutLegacyContext = new Set(); + if (msUntil <= LOW_PRIORITY_EXPIRATION + LOW_PRIORITY_BATCH_SIZE) { + return NormalPriority; + } // TODO: Handle LowPriority + // Assume anything lower has idle priority - ReactStrictModeWarnings.recordLegacyContextWarning = function (fiber, instance) { - var strictRoot = findStrictRoot(fiber); - if (strictRoot === null) { - warningWithoutStack$1(false, 'Expected to find a StrictMode component in a strict mode tree. ' + 'This error is likely caused by a bug in React. Please file an issue.'); - return; - } // Dedup strategy: Warn once per component. + return IdlePriority; + } + var ReactStrictModeWarnings = { + recordUnsafeLifecycleWarnings: function (fiber, instance) {}, + flushPendingUnsafeLifecycleWarnings: function () {}, + recordLegacyContextWarning: function (fiber, instance) {}, + flushLegacyContextWarning: function () {}, + discardPendingWarnings: function () {} + }; - if (didWarnAboutLegacyContext.has(fiber.type)) { - return; - } + { + var findStrictRoot = function (fiber) { + var maybeStrictRoot = null; + var node = fiber; - var warningsForRoot = pendingLegacyContextWarning.get(strictRoot); + while (node !== null) { + if (node.mode & StrictMode) { + maybeStrictRoot = node; + } - if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === 'function') { - if (warningsForRoot === undefined) { - warningsForRoot = []; - pendingLegacyContextWarning.set(strictRoot, warningsForRoot); + node = node.return; } - warningsForRoot.push(fiber); - } - }; + return maybeStrictRoot; + }; - ReactStrictModeWarnings.flushLegacyContextWarning = function () { - pendingLegacyContextWarning.forEach(function (fiberArray, strictRoot) { - var uniqueNames = new Set(); - fiberArray.forEach(function (fiber) { - uniqueNames.add(getComponentName(fiber.type) || 'Component'); - didWarnAboutLegacyContext.add(fiber.type); + var setToSortedString = function (set) { + var array = []; + set.forEach(function (value) { + array.push(value); }); - var sortedNames = setToSortedString(uniqueNames); - var strictRootComponentStack = getStackByFiberInDevAndProd(strictRoot); - warningWithoutStack$1(false, 'Legacy context API has been detected within a strict-mode tree.' + '\n\nThe old API will be supported in all 16.x releases, but applications ' + 'using it should migrate to the new version.' + '\n\nPlease update the following components: %s' + '\n\nLearn more about this warning here: https://fb.me/react-legacy-context' + '%s', sortedNames, strictRootComponentStack); - }); - }; + return array.sort().join(', '); + }; - ReactStrictModeWarnings.discardPendingWarnings = function () { - pendingComponentWillMountWarnings = []; - pendingUNSAFE_ComponentWillMountWarnings = []; - pendingComponentWillReceivePropsWarnings = []; - pendingUNSAFE_ComponentWillReceivePropsWarnings = []; - pendingComponentWillUpdateWarnings = []; - pendingUNSAFE_ComponentWillUpdateWarnings = []; - pendingLegacyContextWarning = new Map(); - }; -} + var pendingComponentWillMountWarnings = []; + var pendingUNSAFE_ComponentWillMountWarnings = []; + var pendingComponentWillReceivePropsWarnings = []; + var pendingUNSAFE_ComponentWillReceivePropsWarnings = []; + var pendingComponentWillUpdateWarnings = []; + var pendingUNSAFE_ComponentWillUpdateWarnings = []; // Tracks components we have already warned about. -var resolveFamily = null; // $FlowFixMe Flow gets confused by a WeakSet feature check below. + var didWarnAboutUnsafeLifecycles = new Set(); -var failedBoundaries = null; -var setRefreshHandler = function (handler) { - { - resolveFamily = handler; - } -}; -function resolveFunctionForHotReloading(type) { - { - if (resolveFamily === null) { - // Hot reloading is disabled. - return type; - } + ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function (fiber, instance) { + // Dedup strategy: Warn once per component. + if (didWarnAboutUnsafeLifecycles.has(fiber.type)) { + return; + } - var family = resolveFamily(type); + if (typeof instance.componentWillMount === 'function' && // Don't warn about react-lifecycles-compat polyfilled components. + instance.componentWillMount.__suppressDeprecationWarning !== true) { + pendingComponentWillMountWarnings.push(fiber); + } - if (family === undefined) { - return type; - } // Use the latest known implementation. + if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillMount === 'function') { + pendingUNSAFE_ComponentWillMountWarnings.push(fiber); + } + if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) { + pendingComponentWillReceivePropsWarnings.push(fiber); + } - return family.current; - } -} -function resolveClassForHotReloading(type) { - // No implementation differences. - return resolveFunctionForHotReloading(type); -} -function resolveForwardRefForHotReloading(type) { - { - if (resolveFamily === null) { - // Hot reloading is disabled. - return type; - } + if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillReceiveProps === 'function') { + pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber); + } - var family = resolveFamily(type); + if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) { + pendingComponentWillUpdateWarnings.push(fiber); + } - if (family === undefined) { - // Check if we're dealing with a real forwardRef. Don't want to crash early. - if (type !== null && type !== undefined && typeof type.render === 'function') { - // ForwardRef is special because its resolved .type is an object, - // but it's possible that we only have its inner render function in the map. - // If that inner render function is different, we'll build a new forwardRef type. - var currentRender = resolveFunctionForHotReloading(type.render); + if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillUpdate === 'function') { + pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber); + } + }; - if (type.render !== currentRender) { - var syntheticType = { - $$typeof: REACT_FORWARD_REF_TYPE, - render: currentRender - }; + ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function () { + // We do an initial pass to gather component names + var componentWillMountUniqueNames = new Set(); - if (type.displayName !== undefined) { - syntheticType.displayName = type.displayName; - } + if (pendingComponentWillMountWarnings.length > 0) { + pendingComponentWillMountWarnings.forEach(function (fiber) { + componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingComponentWillMountWarnings = []; + } - return syntheticType; - } + var UNSAFE_componentWillMountUniqueNames = new Set(); + + if (pendingUNSAFE_ComponentWillMountWarnings.length > 0) { + pendingUNSAFE_ComponentWillMountWarnings.forEach(function (fiber) { + UNSAFE_componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingUNSAFE_ComponentWillMountWarnings = []; } - return type; - } // Use the latest known implementation. + var componentWillReceivePropsUniqueNames = new Set(); + if (pendingComponentWillReceivePropsWarnings.length > 0) { + pendingComponentWillReceivePropsWarnings.forEach(function (fiber) { + componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingComponentWillReceivePropsWarnings = []; + } - return family.current; - } -} -function isCompatibleFamilyForHotReloading(fiber, element) { - { - if (resolveFamily === null) { - // Hot reloading is disabled. - return false; - } + var UNSAFE_componentWillReceivePropsUniqueNames = new Set(); - var prevType = fiber.elementType; - var nextType = element.type; // If we got here, we know types aren't === equal. + if (pendingUNSAFE_ComponentWillReceivePropsWarnings.length > 0) { + pendingUNSAFE_ComponentWillReceivePropsWarnings.forEach(function (fiber) { + UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingUNSAFE_ComponentWillReceivePropsWarnings = []; + } - var needsCompareFamilies = false; - var $$typeofNextType = typeof nextType === 'object' && nextType !== null ? nextType.$$typeof : null; + var componentWillUpdateUniqueNames = new Set(); - switch (fiber.tag) { - case ClassComponent: - { - if (typeof nextType === 'function') { - needsCompareFamilies = true; - } + if (pendingComponentWillUpdateWarnings.length > 0) { + pendingComponentWillUpdateWarnings.forEach(function (fiber) { + componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingComponentWillUpdateWarnings = []; + } - break; - } + var UNSAFE_componentWillUpdateUniqueNames = new Set(); - case FunctionComponent: - { - if (typeof nextType === 'function') { - needsCompareFamilies = true; - } else if ($$typeofNextType === REACT_LAZY_TYPE) { - // We don't know the inner type yet. - // We're going to assume that the lazy inner type is stable, - // and so it is sufficient to avoid reconciling it away. - // We're not going to unwrap or actually use the new lazy type. - needsCompareFamilies = true; - } + if (pendingUNSAFE_ComponentWillUpdateWarnings.length > 0) { + pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function (fiber) { + UNSAFE_componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingUNSAFE_ComponentWillUpdateWarnings = []; + } // Finally, we flush all the warnings + // UNSAFE_ ones before the deprecated ones, since they'll be 'louder' - break; - } - case ForwardRef: - { - if ($$typeofNextType === REACT_FORWARD_REF_TYPE) { - needsCompareFamilies = true; - } else if ($$typeofNextType === REACT_LAZY_TYPE) { - needsCompareFamilies = true; - } + if (UNSAFE_componentWillMountUniqueNames.size > 0) { + var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames); - break; - } + error('Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\n' + '\nPlease update the following components: %s', sortedNames); + } - case MemoComponent: - case SimpleMemoComponent: - { - if ($$typeofNextType === REACT_MEMO_TYPE) { - // TODO: if it was but can no longer be simple, - // we shouldn't set this. - needsCompareFamilies = true; - } else if ($$typeofNextType === REACT_LAZY_TYPE) { - needsCompareFamilies = true; - } + if (UNSAFE_componentWillReceivePropsUniqueNames.size > 0) { + var _sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames); - break; - } + error('Using UNSAFE_componentWillReceiveProps in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + "* If you're updating state whenever props change, " + 'refactor your code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state\n' + '\nPlease update the following components: %s', _sortedNames); + } - default: - return false; - } // Check if both types have a family and it's the same one. + if (UNSAFE_componentWillUpdateUniqueNames.size > 0) { + var _sortedNames2 = setToSortedString(UNSAFE_componentWillUpdateUniqueNames); + error('Using UNSAFE_componentWillUpdate in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '\nPlease update the following components: %s', _sortedNames2); + } - if (needsCompareFamilies) { - // Note: memo() and forwardRef() we'll compare outer rather than inner type. - // This means both of them need to be registered to preserve state. - // If we unwrapped and compared the inner types for wrappers instead, - // then we would risk falsely saying two separate memo(Foo) - // calls are equivalent because they wrap the same Foo function. - var prevFamily = resolveFamily(prevType); + if (componentWillMountUniqueNames.size > 0) { + var _sortedNames3 = setToSortedString(componentWillMountUniqueNames); - if (prevFamily !== undefined && prevFamily === resolveFamily(nextType)) { - return true; + warn('componentWillMount has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\n' + '* Rename componentWillMount to UNSAFE_componentWillMount to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames3); } - } - - return false; - } -} -function markFailedErrorBoundaryForHotReloading(fiber) { - { - if (resolveFamily === null) { - // Hot reloading is disabled. - return; - } - if (typeof WeakSet !== 'function') { - return; - } + if (componentWillReceivePropsUniqueNames.size > 0) { + var _sortedNames4 = setToSortedString(componentWillReceivePropsUniqueNames); - if (failedBoundaries === null) { - failedBoundaries = new WeakSet(); - } + warn('componentWillReceiveProps has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + "* If you're updating state whenever props change, refactor your " + 'code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state\n' + '* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames4); + } - failedBoundaries.add(fiber); - } -} -var scheduleRefresh = function (root, update) { - { - if (resolveFamily === null) { - // Hot reloading is disabled. - return; - } + if (componentWillUpdateUniqueNames.size > 0) { + var _sortedNames5 = setToSortedString(componentWillUpdateUniqueNames); - var staleFamilies = update.staleFamilies, - updatedFamilies = update.updatedFamilies; - flushPassiveEffects(); - flushSync(function () { - scheduleFibersWithFamiliesRecursively(root.current, updatedFamilies, staleFamilies); - }); - } -}; -var scheduleRoot = function (root, element) { - { - if (root.context !== emptyContextObject) { - // Super edge case: root has a legacy _renderSubtree context - // but we don't know the parentComponent so we can't pass it. - // Just ignore. We'll delete this with _renderSubtree code path later. - return; - } + warn('componentWillUpdate has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames5); + } + }; - flushPassiveEffects(); - syncUpdates(function () { - updateContainer(element, root, null, null); - }); - } -}; + var pendingLegacyContextWarning = new Map(); // Tracks components we have already warned about. -function scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) { - { - var alternate = fiber.alternate, - child = fiber.child, - sibling = fiber.sibling, - tag = fiber.tag, - type = fiber.type; - var candidateType = null; + var didWarnAboutLegacyContext = new Set(); - switch (tag) { - case FunctionComponent: - case SimpleMemoComponent: - case ClassComponent: - candidateType = type; - break; + ReactStrictModeWarnings.recordLegacyContextWarning = function (fiber, instance) { + var strictRoot = findStrictRoot(fiber); - case ForwardRef: - candidateType = type.render; - break; + if (strictRoot === null) { + error('Expected to find a StrictMode component in a strict mode tree. ' + 'This error is likely caused by a bug in React. Please file an issue.'); - default: - break; - } + return; + } // Dedup strategy: Warn once per component. - if (resolveFamily === null) { - throw new Error('Expected resolveFamily to be set during hot reload.'); - } - var needsRender = false; - var needsRemount = false; + if (didWarnAboutLegacyContext.has(fiber.type)) { + return; + } - if (candidateType !== null) { - var family = resolveFamily(candidateType); + var warningsForRoot = pendingLegacyContextWarning.get(strictRoot); - if (family !== undefined) { - if (staleFamilies.has(family)) { - needsRemount = true; - } else if (updatedFamilies.has(family)) { - if (tag === ClassComponent) { - needsRemount = true; - } else { - needsRender = true; - } + if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === 'function') { + if (warningsForRoot === undefined) { + warningsForRoot = []; + pendingLegacyContextWarning.set(strictRoot, warningsForRoot); } - } - } - if (failedBoundaries !== null) { - if (failedBoundaries.has(fiber) || alternate !== null && failedBoundaries.has(alternate)) { - needsRemount = true; + warningsForRoot.push(fiber); } - } + }; - if (needsRemount) { - fiber._debugNeedsRemount = true; - } + ReactStrictModeWarnings.flushLegacyContextWarning = function () { + pendingLegacyContextWarning.forEach(function (fiberArray, strictRoot) { + if (fiberArray.length === 0) { + return; + } - if (needsRemount || needsRender) { - scheduleWork(fiber, Sync); - } + var firstFiber = fiberArray[0]; + var uniqueNames = new Set(); + fiberArray.forEach(function (fiber) { + uniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutLegacyContext.add(fiber.type); + }); + var sortedNames = setToSortedString(uniqueNames); + var firstComponentStack = getStackByFiberInDevAndProd(firstFiber); - if (child !== null && !needsRemount) { - scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies); - } + error('Legacy context API has been detected within a strict-mode tree.' + '\n\nThe old API will be supported in all 16.x releases, but applications ' + 'using it should migrate to the new version.' + '\n\nPlease update the following components: %s' + '\n\nLearn more about this warning here: https://fb.me/react-legacy-context' + '%s', sortedNames, firstComponentStack); + }); + }; - if (sibling !== null) { - scheduleFibersWithFamiliesRecursively(sibling, updatedFamilies, staleFamilies); - } + ReactStrictModeWarnings.discardPendingWarnings = function () { + pendingComponentWillMountWarnings = []; + pendingUNSAFE_ComponentWillMountWarnings = []; + pendingComponentWillReceivePropsWarnings = []; + pendingUNSAFE_ComponentWillReceivePropsWarnings = []; + pendingComponentWillUpdateWarnings = []; + pendingUNSAFE_ComponentWillUpdateWarnings = []; + pendingLegacyContextWarning = new Map(); + }; } -} -var findHostInstancesForRefresh = function (root, families) { - { - var hostInstances = new Set(); - var types = new Set(families.map(function (family) { + var resolveFamily = null; // $FlowFixMe Flow gets confused by a WeakSet feature check below. + + var failedBoundaries = null; + var setRefreshHandler = function (handler) { + { + resolveFamily = handler; + } + }; + function resolveFunctionForHotReloading(type) { + { + if (resolveFamily === null) { + // Hot reloading is disabled. + return type; + } + + var family = resolveFamily(type); + + if (family === undefined) { + return type; + } // Use the latest known implementation. + + return family.current; - })); - findHostInstancesForMatchingFibersRecursively(root.current, types, hostInstances); - return hostInstances; + } + } + function resolveClassForHotReloading(type) { + // No implementation differences. + return resolveFunctionForHotReloading(type); } -}; + function resolveForwardRefForHotReloading(type) { + { + if (resolveFamily === null) { + // Hot reloading is disabled. + return type; + } -function findHostInstancesForMatchingFibersRecursively(fiber, types, hostInstances) { - { - var child = fiber.child, - sibling = fiber.sibling, - tag = fiber.tag, - type = fiber.type; - var candidateType = null; + var family = resolveFamily(type); - switch (tag) { - case FunctionComponent: - case SimpleMemoComponent: - case ClassComponent: - candidateType = type; - break; + if (family === undefined) { + // Check if we're dealing with a real forwardRef. Don't want to crash early. + if (type !== null && type !== undefined && typeof type.render === 'function') { + // ForwardRef is special because its resolved .type is an object, + // but it's possible that we only have its inner render function in the map. + // If that inner render function is different, we'll build a new forwardRef type. + var currentRender = resolveFunctionForHotReloading(type.render); - case ForwardRef: - candidateType = type.render; - break; + if (type.render !== currentRender) { + var syntheticType = { + $$typeof: REACT_FORWARD_REF_TYPE, + render: currentRender + }; - default: - break; - } + if (type.displayName !== undefined) { + syntheticType.displayName = type.displayName; + } - var didMatch = false; + return syntheticType; + } + } - if (candidateType !== null) { - if (types.has(candidateType)) { - didMatch = true; - } - } + return type; + } // Use the latest known implementation. - if (didMatch) { - // We have a match. This only drills down to the closest host components. - // There's no need to search deeper because for the purpose of giving - // visual feedback, "flashing" outermost parent rectangles is sufficient. - findHostInstancesForFiberShallowly(fiber, hostInstances); - } else { - // If there's no match, maybe there will be one further down in the child tree. - if (child !== null) { - findHostInstancesForMatchingFibersRecursively(child, types, hostInstances); - } - } - if (sibling !== null) { - findHostInstancesForMatchingFibersRecursively(sibling, types, hostInstances); + return family.current; } } -} + function isCompatibleFamilyForHotReloading(fiber, element) { + { + if (resolveFamily === null) { + // Hot reloading is disabled. + return false; + } -function findHostInstancesForFiberShallowly(fiber, hostInstances) { - { - var foundHostInstances = findChildHostInstancesForFiberShallowly(fiber, hostInstances); + var prevType = fiber.elementType; + var nextType = element.type; // If we got here, we know types aren't === equal. - if (foundHostInstances) { - return; - } // If we didn't find any host children, fallback to closest host parent. + var needsCompareFamilies = false; + var $$typeofNextType = typeof nextType === 'object' && nextType !== null ? nextType.$$typeof : null; + switch (fiber.tag) { + case ClassComponent: + { + if (typeof nextType === 'function') { + needsCompareFamilies = true; + } - var node = fiber; + break; + } - while (true) { - switch (node.tag) { - case HostComponent: - hostInstances.add(node.stateNode); - return; + case FunctionComponent: + { + if (typeof nextType === 'function') { + needsCompareFamilies = true; + } else if ($$typeofNextType === REACT_LAZY_TYPE) { + // We don't know the inner type yet. + // We're going to assume that the lazy inner type is stable, + // and so it is sufficient to avoid reconciling it away. + // We're not going to unwrap or actually use the new lazy type. + needsCompareFamilies = true; + } - case HostPortal: - hostInstances.add(node.stateNode.containerInfo); - return; + break; + } - case HostRoot: - hostInstances.add(node.stateNode.containerInfo); - return; - } + case ForwardRef: + { + if ($$typeofNextType === REACT_FORWARD_REF_TYPE) { + needsCompareFamilies = true; + } else if ($$typeofNextType === REACT_LAZY_TYPE) { + needsCompareFamilies = true; + } - if (node.return === null) { - throw new Error('Expected to reach root first.'); - } + break; + } - node = node.return; - } - } -} + case MemoComponent: + case SimpleMemoComponent: + { + if ($$typeofNextType === REACT_MEMO_TYPE) { + // TODO: if it was but can no longer be simple, + // we shouldn't set this. + needsCompareFamilies = true; + } else if ($$typeofNextType === REACT_LAZY_TYPE) { + needsCompareFamilies = true; + } -function findChildHostInstancesForFiberShallowly(fiber, hostInstances) { - { - var node = fiber; - var foundHostInstances = false; + break; + } - while (true) { - if (node.tag === HostComponent) { - // We got a match. - foundHostInstances = true; - hostInstances.add(node.stateNode); // There may still be more, so keep searching. - } else if (node.child !== null) { - node.child.return = node; - node = node.child; - continue; - } + default: + return false; + } // Check if both types have a family and it's the same one. - if (node === fiber) { - return foundHostInstances; - } - while (node.sibling === null) { - if (node.return === null || node.return === fiber) { - return foundHostInstances; - } + if (needsCompareFamilies) { + // Note: memo() and forwardRef() we'll compare outer rather than inner type. + // This means both of them need to be registered to preserve state. + // If we unwrapped and compared the inner types for wrappers instead, + // then we would risk falsely saying two separate memo(Foo) + // calls are equivalent because they wrap the same Foo function. + var prevFamily = resolveFamily(prevType); - node = node.return; + if (prevFamily !== undefined && prevFamily === resolveFamily(nextType)) { + return true; + } } - node.sibling.return = node.return; - node = node.sibling; + return false; } } + function markFailedErrorBoundaryForHotReloading(fiber) { + { + if (resolveFamily === null) { + // Hot reloading is disabled. + return; + } - return false; -} + if (typeof WeakSet !== 'function') { + return; + } -function resolveDefaultProps(Component, baseProps) { - if (Component && Component.defaultProps) { - // Resolve default props. Taken from ReactElement - var props = _assign({}, baseProps); + if (failedBoundaries === null) { + failedBoundaries = new WeakSet(); + } - var defaultProps = Component.defaultProps; + failedBoundaries.add(fiber); + } + } + var scheduleRefresh = function (root, update) { + { + if (resolveFamily === null) { + // Hot reloading is disabled. + return; + } - for (var propName in defaultProps) { - if (props[propName] === undefined) { - props[propName] = defaultProps[propName]; + var staleFamilies = update.staleFamilies, + updatedFamilies = update.updatedFamilies; + flushPassiveEffects(); + flushSync(function () { + scheduleFibersWithFamiliesRecursively(root.current, updatedFamilies, staleFamilies); + }); + } + }; + var scheduleRoot = function (root, element) { + { + if (root.context !== emptyContextObject) { + // Super edge case: root has a legacy _renderSubtree context + // but we don't know the parentComponent so we can't pass it. + // Just ignore. We'll delete this with _renderSubtree code path later. + return; } + + flushPassiveEffects(); + syncUpdates(function () { + updateContainer(element, root, null, null); + }); } + }; - return props; - } + function scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) { + { + var alternate = fiber.alternate, + child = fiber.child, + sibling = fiber.sibling, + tag = fiber.tag, + type = fiber.type; + var candidateType = null; + + switch (tag) { + case FunctionComponent: + case SimpleMemoComponent: + case ClassComponent: + candidateType = type; + break; - return baseProps; -} -function readLazyComponentType(lazyComponent) { - initializeLazyComponentType(lazyComponent); + case ForwardRef: + candidateType = type.render; + break; + } - if (lazyComponent._status !== Resolved) { - throw lazyComponent._result; - } + if (resolveFamily === null) { + throw new Error('Expected resolveFamily to be set during hot reload.'); + } - return lazyComponent._result; -} + var needsRender = false; + var needsRemount = false; -var valueCursor = createCursor(null); -var rendererSigil; + if (candidateType !== null) { + var family = resolveFamily(candidateType); -{ - // Use this to detect multiple renderers using the same context - rendererSigil = {}; -} + if (family !== undefined) { + if (staleFamilies.has(family)) { + needsRemount = true; + } else if (updatedFamilies.has(family)) { + if (tag === ClassComponent) { + needsRemount = true; + } else { + needsRender = true; + } + } + } + } -var currentlyRenderingFiber = null; -var lastContextDependency = null; -var lastContextWithAllBitsObserved = null; -var isDisallowedContextReadInDEV = false; -function resetContextDependencies() { - // This is called right before React yields execution, to ensure `readContext` - // cannot be called outside the render phase. - currentlyRenderingFiber = null; - lastContextDependency = null; - lastContextWithAllBitsObserved = null; + if (failedBoundaries !== null) { + if (failedBoundaries.has(fiber) || alternate !== null && failedBoundaries.has(alternate)) { + needsRemount = true; + } + } - { - isDisallowedContextReadInDEV = false; - } -} -function enterDisallowedContextReadInDEV() { - { - isDisallowedContextReadInDEV = true; - } -} -function exitDisallowedContextReadInDEV() { - { - isDisallowedContextReadInDEV = false; - } -} -function pushProvider(providerFiber, nextValue) { - var context = providerFiber.type._context; + if (needsRemount) { + fiber._debugNeedsRemount = true; + } - if (isPrimaryRenderer) { - push(valueCursor, context._currentValue, providerFiber); - context._currentValue = nextValue; + if (needsRemount || needsRender) { + scheduleWork(fiber, Sync); + } - { - !(context._currentRenderer === undefined || context._currentRenderer === null || context._currentRenderer === rendererSigil) ? warningWithoutStack$1(false, 'Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.') : void 0; - context._currentRenderer = rendererSigil; - } - } else { - push(valueCursor, context._currentValue2, providerFiber); - context._currentValue2 = nextValue; + if (child !== null && !needsRemount) { + scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies); + } - { - !(context._currentRenderer2 === undefined || context._currentRenderer2 === null || context._currentRenderer2 === rendererSigil) ? warningWithoutStack$1(false, 'Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.') : void 0; - context._currentRenderer2 = rendererSigil; + if (sibling !== null) { + scheduleFibersWithFamiliesRecursively(sibling, updatedFamilies, staleFamilies); + } } } -} -function popProvider(providerFiber) { - var currentValue = valueCursor.current; - pop(valueCursor, providerFiber); - var context = providerFiber.type._context; - - if (isPrimaryRenderer) { - context._currentValue = currentValue; - } else { - context._currentValue2 = currentValue; - } -} -function calculateChangedBits(context, newValue, oldValue) { - if (is$1(oldValue, newValue)) { - // No change - return 0; - } else { - var changedBits = typeof context._calculateChangedBits === 'function' ? context._calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT; + var findHostInstancesForRefresh = function (root, families) { { - !((changedBits & MAX_SIGNED_31_BIT_INT) === changedBits) ? warning$1(false, 'calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: %s', changedBits) : void 0; + var hostInstances = new Set(); + var types = new Set(families.map(function (family) { + return family.current; + })); + findHostInstancesForMatchingFibersRecursively(root.current, types, hostInstances); + return hostInstances; } + }; - return changedBits | 0; - } -} -function scheduleWorkOnParentPath(parent, renderExpirationTime) { - // Update the child expiration time of all the ancestors, including - // the alternates. - var node = parent; - - while (node !== null) { - var alternate = node.alternate; + function findHostInstancesForMatchingFibersRecursively(fiber, types, hostInstances) { + { + var child = fiber.child, + sibling = fiber.sibling, + tag = fiber.tag, + type = fiber.type; + var candidateType = null; - if (node.childExpirationTime < renderExpirationTime) { - node.childExpirationTime = renderExpirationTime; + switch (tag) { + case FunctionComponent: + case SimpleMemoComponent: + case ClassComponent: + candidateType = type; + break; - if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) { - alternate.childExpirationTime = renderExpirationTime; + case ForwardRef: + candidateType = type.render; + break; } - } else if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) { - alternate.childExpirationTime = renderExpirationTime; - } else { - // Neither alternate was updated, which means the rest of the - // ancestor path already has sufficient priority. - break; - } - node = node.return; - } -} -function propagateContextChange(workInProgress, context, changedBits, renderExpirationTime) { - var fiber = workInProgress.child; + var didMatch = false; - if (fiber !== null) { - // Set the return pointer of the child to the work-in-progress fiber. - fiber.return = workInProgress; - } - - while (fiber !== null) { - var nextFiber = void 0; // Visit this fiber. - - var list = fiber.dependencies; + if (candidateType !== null) { + if (types.has(candidateType)) { + didMatch = true; + } + } - if (list !== null) { - nextFiber = fiber.child; - var dependency = list.firstContext; + if (didMatch) { + // We have a match. This only drills down to the closest host components. + // There's no need to search deeper because for the purpose of giving + // visual feedback, "flashing" outermost parent rectangles is sufficient. + findHostInstancesForFiberShallowly(fiber, hostInstances); + } else { + // If there's no match, maybe there will be one further down in the child tree. + if (child !== null) { + findHostInstancesForMatchingFibersRecursively(child, types, hostInstances); + } + } - while (dependency !== null) { - // Check if the context matches. - if (dependency.context === context && (dependency.observedBits & changedBits) !== 0) { - // Match! Schedule an update on this fiber. - if (fiber.tag === ClassComponent) { - // Schedule a force update on the work-in-progress. - var update = createUpdate(renderExpirationTime, null); - update.tag = ForceUpdate; // TODO: Because we don't have a work-in-progress, this will add the - // update to the current fiber, too, which means it will persist even if - // this render is thrown away. Since it's a race condition, not sure it's - // worth fixing. + if (sibling !== null) { + findHostInstancesForMatchingFibersRecursively(sibling, types, hostInstances); + } + } + } - enqueueUpdate(fiber, update); - } + function findHostInstancesForFiberShallowly(fiber, hostInstances) { + { + var foundHostInstances = findChildHostInstancesForFiberShallowly(fiber, hostInstances); - if (fiber.expirationTime < renderExpirationTime) { - fiber.expirationTime = renderExpirationTime; - } + if (foundHostInstances) { + return; + } // If we didn't find any host children, fallback to closest host parent. - var alternate = fiber.alternate; - if (alternate !== null && alternate.expirationTime < renderExpirationTime) { - alternate.expirationTime = renderExpirationTime; - } + var node = fiber; - scheduleWorkOnParentPath(fiber.return, renderExpirationTime); // Mark the expiration time on the list, too. + while (true) { + switch (node.tag) { + case HostComponent: + hostInstances.add(node.stateNode); + return; - if (list.expirationTime < renderExpirationTime) { - list.expirationTime = renderExpirationTime; - } // Since we already found a match, we can stop traversing the - // dependency list. + case HostPortal: + hostInstances.add(node.stateNode.containerInfo); + return; + case HostRoot: + hostInstances.add(node.stateNode.containerInfo); + return; + } - break; + if (node.return === null) { + throw new Error('Expected to reach root first.'); } - dependency = dependency.next; + node = node.return; } - } else if (fiber.tag === ContextProvider) { - // Don't scan deeper if this is a matching provider - nextFiber = fiber.type === workInProgress.type ? null : fiber.child; - } else if (enableSuspenseServerRenderer && fiber.tag === DehydratedFragment) { - // If a dehydrated suspense bounudary is in this subtree, we don't know - // if it will have any context consumers in it. The best we can do is - // mark it as having updates. - var parentSuspense = fiber.return; + } + } - if (!(parentSuspense !== null)) { - { - throw Error("We just came from a parent so we must have had a parent. This is a bug in React."); + function findChildHostInstancesForFiberShallowly(fiber, hostInstances) { + { + var node = fiber; + var foundHostInstances = false; + + while (true) { + if (node.tag === HostComponent) { + // We got a match. + foundHostInstances = true; + hostInstances.add(node.stateNode); // There may still be more, so keep searching. + } else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; } - } - if (parentSuspense.expirationTime < renderExpirationTime) { - parentSuspense.expirationTime = renderExpirationTime; - } - - var _alternate = parentSuspense.alternate; + if (node === fiber) { + return foundHostInstances; + } - if (_alternate !== null && _alternate.expirationTime < renderExpirationTime) { - _alternate.expirationTime = renderExpirationTime; - } // This is intentionally passing this fiber as the parent - // because we want to schedule this fiber as having work - // on its children. We'll use the childExpirationTime on - // this fiber to indicate that a context has changed. + while (node.sibling === null) { + if (node.return === null || node.return === fiber) { + return foundHostInstances; + } + node = node.return; + } - scheduleWorkOnParentPath(parentSuspense, renderExpirationTime); - nextFiber = fiber.sibling; - } else { - // Traverse down. - nextFiber = fiber.child; + node.sibling.return = node.return; + node = node.sibling; + } } - if (nextFiber !== null) { - // Set the return pointer of the child to the work-in-progress fiber. - nextFiber.return = fiber; - } else { - // No child. Traverse to next sibling. - nextFiber = fiber; - - while (nextFiber !== null) { - if (nextFiber === workInProgress) { - // We're back to the root of this subtree. Exit. - nextFiber = null; - break; - } - - var sibling = nextFiber.sibling; + return false; + } - if (sibling !== null) { - // Set the return pointer of the sibling to the work-in-progress fiber. - sibling.return = nextFiber.return; - nextFiber = sibling; - break; - } // No more siblings. Traverse up. + function resolveDefaultProps(Component, baseProps) { + if (Component && Component.defaultProps) { + // Resolve default props. Taken from ReactElement + var props = _assign({}, baseProps); + var defaultProps = Component.defaultProps; - nextFiber = nextFiber.return; + for (var propName in defaultProps) { + if (props[propName] === undefined) { + props[propName] = defaultProps[propName]; + } } + + return props; } - fiber = nextFiber; + return baseProps; } -} -function prepareToReadContext(workInProgress, renderExpirationTime) { - currentlyRenderingFiber = workInProgress; - lastContextDependency = null; - lastContextWithAllBitsObserved = null; - var dependencies = workInProgress.dependencies; + function readLazyComponentType(lazyComponent) { + initializeLazyComponentType(lazyComponent); - if (dependencies !== null) { - var firstContext = dependencies.firstContext; + if (lazyComponent._status !== Resolved) { + throw lazyComponent._result; + } - if (firstContext !== null) { - if (dependencies.expirationTime >= renderExpirationTime) { - // Context list has a pending update. Mark that this fiber performed work. - markWorkInProgressReceivedUpdate(); - } // Reset the work-in-progress list + return lazyComponent._result; + } + var valueCursor = createCursor(null); + var rendererSigil; - dependencies.firstContext = null; - } - } -} -function readContext(context, observedBits) { { - // This warning would fire if you read context inside a Hook like useMemo. - // Unlike the class check below, it's not enforced in production for perf. - !!isDisallowedContextReadInDEV ? warning$1(false, 'Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().') : void 0; + // Use this to detect multiple renderers using the same context + rendererSigil = {}; } - if (lastContextWithAllBitsObserved === context) {// Nothing to do. We already observe everything in this context. - } else if (observedBits === false || observedBits === 0) {// Do not observe any updates. - } else { - var resolvedObservedBits; // Avoid deopting on observable arguments or heterogeneous types. + var currentlyRenderingFiber = null; + var lastContextDependency = null; + var lastContextWithAllBitsObserved = null; + var isDisallowedContextReadInDEV = false; + function resetContextDependencies() { + // This is called right before React yields execution, to ensure `readContext` + // cannot be called outside the render phase. + currentlyRenderingFiber = null; + lastContextDependency = null; + lastContextWithAllBitsObserved = null; - if (typeof observedBits !== 'number' || observedBits === MAX_SIGNED_31_BIT_INT) { - // Observe all updates. - lastContextWithAllBitsObserved = context; - resolvedObservedBits = MAX_SIGNED_31_BIT_INT; - } else { - resolvedObservedBits = observedBits; + { + isDisallowedContextReadInDEV = false; + } + } + function enterDisallowedContextReadInDEV() { + { + isDisallowedContextReadInDEV = true; + } + } + function exitDisallowedContextReadInDEV() { + { + isDisallowedContextReadInDEV = false; } + } + function pushProvider(providerFiber, nextValue) { + var context = providerFiber.type._context; - var contextItem = { - context: context, - observedBits: resolvedObservedBits, - next: null - }; + { + push(valueCursor, context._currentValue, providerFiber); + context._currentValue = nextValue; - if (lastContextDependency === null) { - if (!(currentlyRenderingFiber !== null)) { - { - throw Error("Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo()."); + { + if (context._currentRenderer !== undefined && context._currentRenderer !== null && context._currentRenderer !== rendererSigil) { + error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.'); } - } // This is the first dependency for this component. Create a new list. - - - lastContextDependency = contextItem; - currentlyRenderingFiber.dependencies = { - expirationTime: NoWork, - firstContext: contextItem, - responders: null - }; - } else { - // Append a new context item. - lastContextDependency = lastContextDependency.next = contextItem; - } - } - - return isPrimaryRenderer ? context._currentValue : context._currentValue2; -} - -// UpdateQueue is a linked list of prioritized updates. -// -// Like fibers, update queues come in pairs: a current queue, which represents -// the visible state of the screen, and a work-in-progress queue, which can be -// mutated and processed asynchronously before it is committed — a form of -// double buffering. If a work-in-progress render is discarded before finishing, -// we create a new work-in-progress by cloning the current queue. -// -// Both queues share a persistent, singly-linked list structure. To schedule an -// update, we append it to the end of both queues. Each queue maintains a -// pointer to first update in the persistent list that hasn't been processed. -// The work-in-progress pointer always has a position equal to or greater than -// the current queue, since we always work on that one. The current queue's -// pointer is only updated during the commit phase, when we swap in the -// work-in-progress. -// -// For example: -// -// Current pointer: A - B - C - D - E - F -// Work-in-progress pointer: D - E - F -// ^ -// The work-in-progress queue has -// processed more updates than current. -// -// The reason we append to both queues is because otherwise we might drop -// updates without ever processing them. For example, if we only add updates to -// the work-in-progress queue, some updates could be lost whenever a work-in -// -progress render restarts by cloning from current. Similarly, if we only add -// updates to the current queue, the updates will be lost whenever an already -// in-progress queue commits and swaps with the current queue. However, by -// adding to both queues, we guarantee that the update will be part of the next -// work-in-progress. (And because the work-in-progress queue becomes the -// current queue once it commits, there's no danger of applying the same -// update twice.) -// -// Prioritization -// -------------- -// -// Updates are not sorted by priority, but by insertion; new updates are always -// appended to the end of the list. -// -// The priority is still important, though. When processing the update queue -// during the render phase, only the updates with sufficient priority are -// included in the result. If we skip an update because it has insufficient -// priority, it remains in the queue to be processed later, during a lower -// priority render. Crucially, all updates subsequent to a skipped update also -// remain in the queue *regardless of their priority*. That means high priority -// updates are sometimes processed twice, at two separate priorities. We also -// keep track of a base state, that represents the state before the first -// update in the queue is applied. -// -// For example: -// -// Given a base state of '', and the following queue of updates -// -// A1 - B2 - C1 - D2 -// -// where the number indicates the priority, and the update is applied to the -// previous state by appending a letter, React will process these updates as -// two separate renders, one per distinct priority level: -// -// First render, at priority 1: -// Base state: '' -// Updates: [A1, C1] -// Result state: 'AC' -// -// Second render, at priority 2: -// Base state: 'A' <- The base state does not include C1, -// because B2 was skipped. -// Updates: [B2, C1, D2] <- C1 was rebased on top of B2 -// Result state: 'ABCD' -// -// Because we process updates in insertion order, and rebase high priority -// updates when preceding updates are skipped, the final result is deterministic -// regardless of priority. Intermediate state may vary according to system -// resources, but the final state is always the same. -var UpdateState = 0; -var ReplaceState = 1; -var ForceUpdate = 2; -var CaptureUpdate = 3; // Global state that is reset at the beginning of calling `processUpdateQueue`. -// It should only be read right after calling `processUpdateQueue`, via -// `checkHasForceUpdateAfterProcessing`. - -var hasForceUpdate = false; -var didWarnUpdateInsideUpdate; -var currentlyProcessingQueue; - - -{ - didWarnUpdateInsideUpdate = false; - currentlyProcessingQueue = null; - - -} - -function createUpdateQueue(baseState) { - var queue = { - baseState: baseState, - firstUpdate: null, - lastUpdate: null, - firstCapturedUpdate: null, - lastCapturedUpdate: null, - firstEffect: null, - lastEffect: null, - firstCapturedEffect: null, - lastCapturedEffect: null - }; - return queue; -} - -function cloneUpdateQueue(currentQueue) { - var queue = { - baseState: currentQueue.baseState, - firstUpdate: currentQueue.firstUpdate, - lastUpdate: currentQueue.lastUpdate, - // TODO: With resuming, if we bail out and resuse the child tree, we should - // keep these effects. - firstCapturedUpdate: null, - lastCapturedUpdate: null, - firstEffect: null, - lastEffect: null, - firstCapturedEffect: null, - lastCapturedEffect: null - }; - return queue; -} - -function createUpdate(expirationTime, suspenseConfig) { - var update = { - expirationTime: expirationTime, - suspenseConfig: suspenseConfig, - tag: UpdateState, - payload: null, - callback: null, - next: null, - nextEffect: null - }; - { - update.priority = getCurrentPriorityLevel(); - } - - return update; -} - -function appendUpdateToQueue(queue, update) { - // Append the update to the end of the list. - if (queue.lastUpdate === null) { - // Queue is empty - queue.firstUpdate = queue.lastUpdate = update; - } else { - queue.lastUpdate.next = update; - queue.lastUpdate = update; - } -} - -function enqueueUpdate(fiber, update) { - // Update queues are created lazily. - var alternate = fiber.alternate; - var queue1; - var queue2; - - if (alternate === null) { - // There's only one fiber. - queue1 = fiber.updateQueue; - queue2 = null; - - if (queue1 === null) { - queue1 = fiber.updateQueue = createUpdateQueue(fiber.memoizedState); - } - } else { - // There are two owners. - queue1 = fiber.updateQueue; - queue2 = alternate.updateQueue; - - if (queue1 === null) { - if (queue2 === null) { - // Neither fiber has an update queue. Create new ones. - queue1 = fiber.updateQueue = createUpdateQueue(fiber.memoizedState); - queue2 = alternate.updateQueue = createUpdateQueue(alternate.memoizedState); - } else { - // Only one fiber has an update queue. Clone to create a new one. - queue1 = fiber.updateQueue = cloneUpdateQueue(queue2); - } - } else { - if (queue2 === null) { - // Only one fiber has an update queue. Clone to create a new one. - queue2 = alternate.updateQueue = cloneUpdateQueue(queue1); - } else {// Both owners have an update queue. + context._currentRenderer = rendererSigil; } } } + function popProvider(providerFiber) { + var currentValue = valueCursor.current; + pop(valueCursor, providerFiber); + var context = providerFiber.type._context; - if (queue2 === null || queue1 === queue2) { - // There's only a single queue. - appendUpdateToQueue(queue1, update); - } else { - // There are two queues. We need to append the update to both queues, - // while accounting for the persistent structure of the list — we don't - // want the same update to be added multiple times. - if (queue1.lastUpdate === null || queue2.lastUpdate === null) { - // One of the queues is not empty. We must add the update to both queues. - appendUpdateToQueue(queue1, update); - appendUpdateToQueue(queue2, update); - } else { - // Both queues are non-empty. The last update is the same in both lists, - // because of structural sharing. So, only append to one of the lists. - appendUpdateToQueue(queue1, update); // But we still need to update the `lastUpdate` pointer of queue2. - - queue2.lastUpdate = update; + { + context._currentValue = currentValue; } } + function calculateChangedBits(context, newValue, oldValue) { + if (objectIs(oldValue, newValue)) { + // No change + return 0; + } else { + var changedBits = typeof context._calculateChangedBits === 'function' ? context._calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT; - { - if (fiber.tag === ClassComponent && (currentlyProcessingQueue === queue1 || queue2 !== null && currentlyProcessingQueue === queue2) && !didWarnUpdateInsideUpdate) { - warningWithoutStack$1(false, 'An update (setState, replaceState, or forceUpdate) was scheduled ' + 'from inside an update function. Update functions should be pure, ' + 'with zero side-effects. Consider using componentDidUpdate or a ' + 'callback.'); - didWarnUpdateInsideUpdate = true; + { + if ((changedBits & MAX_SIGNED_31_BIT_INT) !== changedBits) { + error('calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: %s', changedBits); + } + } + + return changedBits | 0; } } -} -function enqueueCapturedUpdate(workInProgress, update) { - // Captured updates go into a separate list, and only on the work-in- - // progress queue. - var workInProgressQueue = workInProgress.updateQueue; - - if (workInProgressQueue === null) { - workInProgressQueue = workInProgress.updateQueue = createUpdateQueue(workInProgress.memoizedState); - } else { - // TODO: I put this here rather than createWorkInProgress so that we don't - // clone the queue unnecessarily. There's probably a better way to - // structure this. - workInProgressQueue = ensureWorkInProgressQueueIsAClone(workInProgress, workInProgressQueue); - } // Append the update to the end of the list. + function scheduleWorkOnParentPath(parent, renderExpirationTime) { + // Update the child expiration time of all the ancestors, including + // the alternates. + var node = parent; + while (node !== null) { + var alternate = node.alternate; - if (workInProgressQueue.lastCapturedUpdate === null) { - // This is the first render phase update - workInProgressQueue.firstCapturedUpdate = workInProgressQueue.lastCapturedUpdate = update; - } else { - workInProgressQueue.lastCapturedUpdate.next = update; - workInProgressQueue.lastCapturedUpdate = update; - } -} + if (node.childExpirationTime < renderExpirationTime) { + node.childExpirationTime = renderExpirationTime; -function ensureWorkInProgressQueueIsAClone(workInProgress, queue) { - var current = workInProgress.alternate; + if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) { + alternate.childExpirationTime = renderExpirationTime; + } + } else if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) { + alternate.childExpirationTime = renderExpirationTime; + } else { + // Neither alternate was updated, which means the rest of the + // ancestor path already has sufficient priority. + break; + } - if (current !== null) { - // If the work-in-progress queue is equal to the current queue, - // we need to clone it first. - if (queue === current.updateQueue) { - queue = workInProgress.updateQueue = cloneUpdateQueue(queue); + node = node.return; } } + function propagateContextChange(workInProgress, context, changedBits, renderExpirationTime) { + var fiber = workInProgress.child; - return queue; -} - -function getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) { - switch (update.tag) { - case ReplaceState: - { - var payload = update.payload; + if (fiber !== null) { + // Set the return pointer of the child to the work-in-progress fiber. + fiber.return = workInProgress; + } - if (typeof payload === 'function') { - // Updater function - { - enterDisallowedContextReadInDEV(); + while (fiber !== null) { + var nextFiber = void 0; // Visit this fiber. + + var list = fiber.dependencies; + + if (list !== null) { + nextFiber = fiber.child; + var dependency = list.firstContext; + + while (dependency !== null) { + // Check if the context matches. + if (dependency.context === context && (dependency.observedBits & changedBits) !== 0) { + // Match! Schedule an update on this fiber. + if (fiber.tag === ClassComponent) { + // Schedule a force update on the work-in-progress. + var update = createUpdate(renderExpirationTime, null); + update.tag = ForceUpdate; // TODO: Because we don't have a work-in-progress, this will add the + // update to the current fiber, too, which means it will persist even if + // this render is thrown away. Since it's a race condition, not sure it's + // worth fixing. + + enqueueUpdate(fiber, update); + } - if (debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) { - payload.call(instance, prevState, nextProps); + if (fiber.expirationTime < renderExpirationTime) { + fiber.expirationTime = renderExpirationTime; } - } - var nextState = payload.call(instance, prevState, nextProps); + var alternate = fiber.alternate; - { - exitDisallowedContextReadInDEV(); - } + if (alternate !== null && alternate.expirationTime < renderExpirationTime) { + alternate.expirationTime = renderExpirationTime; + } - return nextState; - } // State object + scheduleWorkOnParentPath(fiber.return, renderExpirationTime); // Mark the expiration time on the list, too. + if (list.expirationTime < renderExpirationTime) { + list.expirationTime = renderExpirationTime; + } // Since we already found a match, we can stop traversing the + // dependency list. - return payload; - } - case CaptureUpdate: - { - workInProgress.effectTag = workInProgress.effectTag & ~ShouldCapture | DidCapture; - } - // Intentional fallthrough + break; + } - case UpdateState: - { - var _payload = update.payload; - var partialState; + dependency = dependency.next; + } + } else if (fiber.tag === ContextProvider) { + // Don't scan deeper if this is a matching provider + nextFiber = fiber.type === workInProgress.type ? null : fiber.child; + } else { + // Traverse down. + nextFiber = fiber.child; + } - if (typeof _payload === 'function') { - // Updater function - { - enterDisallowedContextReadInDEV(); + if (nextFiber !== null) { + // Set the return pointer of the child to the work-in-progress fiber. + nextFiber.return = fiber; + } else { + // No child. Traverse to next sibling. + nextFiber = fiber; - if (debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) { - _payload.call(instance, prevState, nextProps); - } + while (nextFiber !== null) { + if (nextFiber === workInProgress) { + // We're back to the root of this subtree. Exit. + nextFiber = null; + break; } - partialState = _payload.call(instance, prevState, nextProps); - - { - exitDisallowedContextReadInDEV(); - } - } else { - // Partial state object - partialState = _payload; - } + var sibling = nextFiber.sibling; - if (partialState === null || partialState === undefined) { - // Null and undefined are treated as no-ops. - return prevState; - } // Merge the partial state and the previous state. + if (sibling !== null) { + // Set the return pointer of the sibling to the work-in-progress fiber. + sibling.return = nextFiber.return; + nextFiber = sibling; + break; + } // No more siblings. Traverse up. - return _assign({}, prevState, partialState); + nextFiber = nextFiber.return; + } } - case ForceUpdate: - { - hasForceUpdate = true; - return prevState; - } + fiber = nextFiber; + } } + function prepareToReadContext(workInProgress, renderExpirationTime) { + currentlyRenderingFiber = workInProgress; + lastContextDependency = null; + lastContextWithAllBitsObserved = null; + var dependencies = workInProgress.dependencies; - return prevState; -} - -function processUpdateQueue(workInProgress, queue, props, instance, renderExpirationTime) { - hasForceUpdate = false; - queue = ensureWorkInProgressQueueIsAClone(workInProgress, queue); - - { - currentlyProcessingQueue = queue; - } // These values may change as we process the queue. - - - var newBaseState = queue.baseState; - var newFirstUpdate = null; - var newExpirationTime = NoWork; // Iterate through the list of updates to compute the result. - - var update = queue.firstUpdate; - var resultState = newBaseState; + if (dependencies !== null) { + var firstContext = dependencies.firstContext; - while (update !== null) { - var updateExpirationTime = update.expirationTime; + if (firstContext !== null) { + if (dependencies.expirationTime >= renderExpirationTime) { + // Context list has a pending update. Mark that this fiber performed work. + markWorkInProgressReceivedUpdate(); + } // Reset the work-in-progress list - if (updateExpirationTime < renderExpirationTime) { - // This update does not have sufficient priority. Skip it. - if (newFirstUpdate === null) { - // This is the first skipped update. It will be the first update in - // the new list. - newFirstUpdate = update; // Since this is the first update that was skipped, the current result - // is the new base state. - newBaseState = resultState; - } // Since this update will remain in the list, update the remaining - // expiration time. + dependencies.firstContext = null; + } + } + } + function readContext(context, observedBits) { + { + // This warning would fire if you read context inside a Hook like useMemo. + // Unlike the class check below, it's not enforced in production for perf. + if (isDisallowedContextReadInDEV) { + error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().'); + } + } + if (lastContextWithAllBitsObserved === context) ; else if (observedBits === false || observedBits === 0) ; else { + var resolvedObservedBits; // Avoid deopting on observable arguments or heterogeneous types. - if (newExpirationTime < updateExpirationTime) { - newExpirationTime = updateExpirationTime; + if (typeof observedBits !== 'number' || observedBits === MAX_SIGNED_31_BIT_INT) { + // Observe all updates. + lastContextWithAllBitsObserved = context; + resolvedObservedBits = MAX_SIGNED_31_BIT_INT; + } else { + resolvedObservedBits = observedBits; } - } else { - // This update does have sufficient priority. - // Mark the event time of this update as relevant to this render pass. - // TODO: This should ideally use the true event time of this update rather than - // its priority which is a derived and not reverseable value. - // TODO: We should skip this update if it was already committed but currently - // we have no way of detecting the difference between a committed and suspended - // update here. - markRenderEventTimeAndConfig(updateExpirationTime, update.suspenseConfig); // Process it and compute a new result. - resultState = getStateFromUpdate(workInProgress, queue, update, resultState, props, instance); - var callback = update.callback; + var contextItem = { + context: context, + observedBits: resolvedObservedBits, + next: null + }; - if (callback !== null) { - workInProgress.effectTag |= Callback; // Set this to null, in case it was mutated during an aborted render. + if (lastContextDependency === null) { + if (!(currentlyRenderingFiber !== null)) { + { + throw Error( "Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo()." ); + } + } // This is the first dependency for this component. Create a new list. - update.nextEffect = null; - if (queue.lastEffect === null) { - queue.firstEffect = queue.lastEffect = update; - } else { - queue.lastEffect.nextEffect = update; - queue.lastEffect = update; - } + lastContextDependency = contextItem; + currentlyRenderingFiber.dependencies = { + expirationTime: NoWork, + firstContext: contextItem, + responders: null + }; + } else { + // Append a new context item. + lastContextDependency = lastContextDependency.next = contextItem; } - } // Continue to the next update. + } + return context._currentValue ; + } + + var UpdateState = 0; + var ReplaceState = 1; + var ForceUpdate = 2; + var CaptureUpdate = 3; // Global state that is reset at the beginning of calling `processUpdateQueue`. + // It should only be read right after calling `processUpdateQueue`, via + // `checkHasForceUpdateAfterProcessing`. - update = update.next; - } // Separately, iterate though the list of captured updates. + var hasForceUpdate = false; + var didWarnUpdateInsideUpdate; + var currentlyProcessingQueue; + { + didWarnUpdateInsideUpdate = false; + currentlyProcessingQueue = null; + } - var newFirstCapturedUpdate = null; - update = queue.firstCapturedUpdate; + function initializeUpdateQueue(fiber) { + var queue = { + baseState: fiber.memoizedState, + baseQueue: null, + shared: { + pending: null + }, + effects: null + }; + fiber.updateQueue = queue; + } + function cloneUpdateQueue(current, workInProgress) { + // Clone the update queue from current. Unless it's already a clone. + var queue = workInProgress.updateQueue; + var currentQueue = current.updateQueue; + + if (queue === currentQueue) { + var clone = { + baseState: currentQueue.baseState, + baseQueue: currentQueue.baseQueue, + shared: currentQueue.shared, + effects: currentQueue.effects + }; + workInProgress.updateQueue = clone; + } + } + function createUpdate(expirationTime, suspenseConfig) { + var update = { + expirationTime: expirationTime, + suspenseConfig: suspenseConfig, + tag: UpdateState, + payload: null, + callback: null, + next: null + }; + update.next = update; - while (update !== null) { - var _updateExpirationTime = update.expirationTime; + { + update.priority = getCurrentPriorityLevel(); + } - if (_updateExpirationTime < renderExpirationTime) { - // This update does not have sufficient priority. Skip it. - if (newFirstCapturedUpdate === null) { - // This is the first skipped captured update. It will be the first - // update in the new list. - newFirstCapturedUpdate = update; // If this is the first update that was skipped, the current result is - // the new base state. + return update; + } + function enqueueUpdate(fiber, update) { + var updateQueue = fiber.updateQueue; - if (newFirstUpdate === null) { - newBaseState = resultState; - } - } // Since this update will remain in the list, update the remaining - // expiration time. + if (updateQueue === null) { + // Only occurs if the fiber has been unmounted. + return; + } + var sharedQueue = updateQueue.shared; + var pending = sharedQueue.pending; - if (newExpirationTime < _updateExpirationTime) { - newExpirationTime = _updateExpirationTime; - } + if (pending === null) { + // This is the first update. Create a circular list. + update.next = update; } else { - // This update does have sufficient priority. Process it and compute - // a new result. - resultState = getStateFromUpdate(workInProgress, queue, update, resultState, props, instance); - var _callback = update.callback; + update.next = pending.next; + pending.next = update; + } - if (_callback !== null) { - workInProgress.effectTag |= Callback; // Set this to null, in case it was mutated during an aborted render. + sharedQueue.pending = update; - update.nextEffect = null; + { + if (currentlyProcessingQueue === sharedQueue && !didWarnUpdateInsideUpdate) { + error('An update (setState, replaceState, or forceUpdate) was scheduled ' + 'from inside an update function. Update functions should be pure, ' + 'with zero side-effects. Consider using componentDidUpdate or a ' + 'callback.'); - if (queue.lastCapturedEffect === null) { - queue.firstCapturedEffect = queue.lastCapturedEffect = update; - } else { - queue.lastCapturedEffect.nextEffect = update; - queue.lastCapturedEffect = update; - } + didWarnUpdateInsideUpdate = true; } } - - update = update.next; } + function enqueueCapturedUpdate(workInProgress, update) { + var current = workInProgress.alternate; - if (newFirstUpdate === null) { - queue.lastUpdate = null; - } + if (current !== null) { + // Ensure the work-in-progress queue is a clone + cloneUpdateQueue(current, workInProgress); + } // Captured updates go only on the work-in-progress queue. - if (newFirstCapturedUpdate === null) { - queue.lastCapturedUpdate = null; - } else { - workInProgress.effectTag |= Callback; - } - if (newFirstUpdate === null && newFirstCapturedUpdate === null) { - // We processed every update, without skipping. That means the new base - // state is the same as the result state. - newBaseState = resultState; + var queue = workInProgress.updateQueue; // Append the update to the end of the list. + + var last = queue.baseQueue; + + if (last === null) { + queue.baseQueue = update.next = update; + update.next = update; + } else { + update.next = last.next; + last.next = update; + } } - queue.baseState = newBaseState; - queue.firstUpdate = newFirstUpdate; - queue.firstCapturedUpdate = newFirstCapturedUpdate; // Set the remaining expiration time to be whatever is remaining in the queue. - // This should be fine because the only two other things that contribute to - // expiration time are props and context. We're already in the middle of the - // begin phase by the time we start processing the queue, so we've already - // dealt with the props. Context in components that specify - // shouldComponentUpdate is tricky; but we'll have to account for - // that regardless. + function getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) { + switch (update.tag) { + case ReplaceState: + { + var payload = update.payload; - markUnprocessedUpdateTime(newExpirationTime); - workInProgress.expirationTime = newExpirationTime; - workInProgress.memoizedState = resultState; + if (typeof payload === 'function') { + // Updater function + { + enterDisallowedContextReadInDEV(); - { - currentlyProcessingQueue = null; - } -} + if ( workInProgress.mode & StrictMode) { + payload.call(instance, prevState, nextProps); + } + } -function callCallback(callback, context) { - if (!(typeof callback === 'function')) { - { - throw Error("Invalid argument passed as callback. Expected a function. Instead received: " + callback); - } - } + var nextState = payload.call(instance, prevState, nextProps); - callback.call(context); -} + { + exitDisallowedContextReadInDEV(); + } -function resetHasForceUpdateBeforeProcessing() { - hasForceUpdate = false; -} -function checkHasForceUpdateAfterProcessing() { - return hasForceUpdate; -} -function commitUpdateQueue(finishedWork, finishedQueue, instance, renderExpirationTime) { - // If the finished render included captured updates, and there are still - // lower priority updates left over, we need to keep the captured updates - // in the queue so that they are rebased and not dropped once we process the - // queue again at the lower priority. - if (finishedQueue.firstCapturedUpdate !== null) { - // Join the captured update list to the end of the normal list. - if (finishedQueue.lastUpdate !== null) { - finishedQueue.lastUpdate.next = finishedQueue.firstCapturedUpdate; - finishedQueue.lastUpdate = finishedQueue.lastCapturedUpdate; - } // Clear the list of captured updates. + return nextState; + } // State object - finishedQueue.firstCapturedUpdate = finishedQueue.lastCapturedUpdate = null; - } // Commit the effects + return payload; + } + case CaptureUpdate: + { + workInProgress.effectTag = workInProgress.effectTag & ~ShouldCapture | DidCapture; + } + // Intentional fallthrough - commitUpdateEffects(finishedQueue.firstEffect, instance); - finishedQueue.firstEffect = finishedQueue.lastEffect = null; - commitUpdateEffects(finishedQueue.firstCapturedEffect, instance); - finishedQueue.firstCapturedEffect = finishedQueue.lastCapturedEffect = null; -} + case UpdateState: + { + var _payload = update.payload; + var partialState; -function commitUpdateEffects(effect, instance) { - while (effect !== null) { - var callback = effect.callback; + if (typeof _payload === 'function') { + // Updater function + { + enterDisallowedContextReadInDEV(); - if (callback !== null) { - effect.callback = null; - callCallback(callback, instance); - } - - effect = effect.nextEffect; - } -} - -var ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig; -function requestCurrentSuspenseConfig() { - return ReactCurrentBatchConfig.suspense; -} - -var fakeInternalInstance = {}; -var isArray$1 = Array.isArray; // React.Component uses a shared frozen object by default. -// We'll use it to determine whether we need to initialize legacy refs. - -var emptyRefsObject = new React.Component().refs; -var didWarnAboutStateAssignmentForComponent; -var didWarnAboutUninitializedState; -var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate; -var didWarnAboutLegacyLifecyclesAndDerivedState; -var didWarnAboutUndefinedDerivedState; -var warnOnUndefinedDerivedState; -var warnOnInvalidCallback$1; -var didWarnAboutDirectlyAssigningPropsToState; -var didWarnAboutContextTypeAndContextTypes; -var didWarnAboutInvalidateContextType; - -{ - didWarnAboutStateAssignmentForComponent = new Set(); - didWarnAboutUninitializedState = new Set(); - didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set(); - didWarnAboutLegacyLifecyclesAndDerivedState = new Set(); - didWarnAboutDirectlyAssigningPropsToState = new Set(); - didWarnAboutUndefinedDerivedState = new Set(); - didWarnAboutContextTypeAndContextTypes = new Set(); - didWarnAboutInvalidateContextType = new Set(); - var didWarnOnInvalidCallback = new Set(); - - warnOnInvalidCallback$1 = function (callback, callerName) { - if (callback === null || typeof callback === 'function') { - return; - } + if ( workInProgress.mode & StrictMode) { + _payload.call(instance, prevState, nextProps); + } + } - var key = callerName + "_" + callback; + partialState = _payload.call(instance, prevState, nextProps); - if (!didWarnOnInvalidCallback.has(key)) { - didWarnOnInvalidCallback.add(key); - warningWithoutStack$1(false, '%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback); - } - }; + { + exitDisallowedContextReadInDEV(); + } + } else { + // Partial state object + partialState = _payload; + } - warnOnUndefinedDerivedState = function (type, partialState) { - if (partialState === undefined) { - var componentName = getComponentName(type) || 'Component'; + if (partialState === null || partialState === undefined) { + // Null and undefined are treated as no-ops. + return prevState; + } // Merge the partial state and the previous state. - if (!didWarnAboutUndefinedDerivedState.has(componentName)) { - didWarnAboutUndefinedDerivedState.add(componentName); - warningWithoutStack$1(false, '%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName); - } - } - }; // This is so gross but it's at least non-critical and can be removed if - // it causes problems. This is meant to give a nicer error message for - // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component, - // ...)) which otherwise throws a "_processChildContext is not a function" - // exception. + return _assign({}, prevState, partialState); + } - Object.defineProperty(fakeInternalInstance, '_processChildContext', { - enumerable: false, - value: function () { - { + case ForceUpdate: { - throw Error("_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal)."); + hasForceUpdate = true; + return prevState; } - } } - }); - Object.freeze(fakeInternalInstance); -} -function applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) { - var prevState = workInProgress.memoizedState; - - { - if (debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) { - // Invoke the function an extra time to help detect side-effects. - getDerivedStateFromProps(nextProps, prevState); - } + return prevState; } - var partialState = getDerivedStateFromProps(nextProps, prevState); - - { - warnOnUndefinedDerivedState(ctor, partialState); - } // Merge the partial state and the previous state. + function processUpdateQueue(workInProgress, props, instance, renderExpirationTime) { + // This is always non-null on a ClassComponent or HostRoot + var queue = workInProgress.updateQueue; + hasForceUpdate = false; + { + currentlyProcessingQueue = queue.shared; + } // The last rebase update that is NOT part of the base state. - var memoizedState = partialState === null || partialState === undefined ? prevState : _assign({}, prevState, partialState); - workInProgress.memoizedState = memoizedState; // Once the update queue is empty, persist the derived state onto the - // base state. - var updateQueue = workInProgress.updateQueue; + var baseQueue = queue.baseQueue; // The last pending update that hasn't been processed yet. - if (updateQueue !== null && workInProgress.expirationTime === NoWork) { - updateQueue.baseState = memoizedState; - } -} -var classComponentUpdater = { - isMounted: isMounted, - enqueueSetState: function (inst, payload, callback) { - var fiber = get(inst); - var currentTime = requestCurrentTimeForUpdate(); - var suspenseConfig = requestCurrentSuspenseConfig(); - var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig); - var update = createUpdate(expirationTime, suspenseConfig); - update.payload = payload; + var pendingQueue = queue.shared.pending; - if (callback !== undefined && callback !== null) { - { - warnOnInvalidCallback$1(callback, 'setState'); + if (pendingQueue !== null) { + // We have new updates that haven't been processed yet. + // We'll add them to the base queue. + if (baseQueue !== null) { + // Merge the pending queue and the base queue. + var baseFirst = baseQueue.next; + var pendingFirst = pendingQueue.next; + baseQueue.next = pendingFirst; + pendingQueue.next = baseFirst; } - update.callback = callback; - } + baseQueue = pendingQueue; + queue.shared.pending = null; // TODO: Pass `current` as argument - enqueueUpdate(fiber, update); - scheduleWork(fiber, expirationTime); - }, - enqueueReplaceState: function (inst, payload, callback) { - var fiber = get(inst); - var currentTime = requestCurrentTimeForUpdate(); - var suspenseConfig = requestCurrentSuspenseConfig(); - var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig); - var update = createUpdate(expirationTime, suspenseConfig); - update.tag = ReplaceState; - update.payload = payload; + var current = workInProgress.alternate; - if (callback !== undefined && callback !== null) { - { - warnOnInvalidCallback$1(callback, 'replaceState'); + if (current !== null) { + var currentQueue = current.updateQueue; + + if (currentQueue !== null) { + currentQueue.baseQueue = pendingQueue; + } } + } // These values may change as we process the queue. - update.callback = callback; - } - enqueueUpdate(fiber, update); - scheduleWork(fiber, expirationTime); - }, - enqueueForceUpdate: function (inst, callback) { - var fiber = get(inst); - var currentTime = requestCurrentTimeForUpdate(); - var suspenseConfig = requestCurrentSuspenseConfig(); - var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig); - var update = createUpdate(expirationTime, suspenseConfig); - update.tag = ForceUpdate; + if (baseQueue !== null) { + var first = baseQueue.next; // Iterate through the list of updates to compute the result. - if (callback !== undefined && callback !== null) { - { - warnOnInvalidCallback$1(callback, 'forceUpdate'); - } - - update.callback = callback; - } - - enqueueUpdate(fiber, update); - scheduleWork(fiber, expirationTime); - } -}; - -function checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) { - var instance = workInProgress.stateNode; - - if (typeof instance.shouldComponentUpdate === 'function') { - startPhaseTimer(workInProgress, 'shouldComponentUpdate'); - var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext); - stopPhaseTimer(); - - { - !(shouldUpdate !== undefined) ? warningWithoutStack$1(false, '%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', getComponentName(ctor) || 'Component') : void 0; - } + var newState = queue.baseState; + var newExpirationTime = NoWork; + var newBaseState = null; + var newBaseQueueFirst = null; + var newBaseQueueLast = null; - return shouldUpdate; - } - - if (ctor.prototype && ctor.prototype.isPureReactComponent) { - return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState); - } + if (first !== null) { + var update = first; - return true; -} + do { + var updateExpirationTime = update.expirationTime; + + if (updateExpirationTime < renderExpirationTime) { + // Priority is insufficient. Skip this update. If this is the first + // skipped update, the previous update/state is the new base + // update/state. + var clone = { + expirationTime: update.expirationTime, + suspenseConfig: update.suspenseConfig, + tag: update.tag, + payload: update.payload, + callback: update.callback, + next: null + }; -function checkClassInstance(workInProgress, ctor, newProps) { - var instance = workInProgress.stateNode; + if (newBaseQueueLast === null) { + newBaseQueueFirst = newBaseQueueLast = clone; + newBaseState = newState; + } else { + newBaseQueueLast = newBaseQueueLast.next = clone; + } // Update the remaining priority in the queue. - { - var name = getComponentName(ctor) || 'Component'; - var renderPresent = instance.render; - if (!renderPresent) { - if (ctor.prototype && typeof ctor.prototype.render === 'function') { - warningWithoutStack$1(false, '%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name); - } else { - warningWithoutStack$1(false, '%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name); - } - } + if (updateExpirationTime > newExpirationTime) { + newExpirationTime = updateExpirationTime; + } + } else { + // This update does have sufficient priority. + if (newBaseQueueLast !== null) { + var _clone = { + expirationTime: Sync, + // This update is going to be committed so we never want uncommit it. + suspenseConfig: update.suspenseConfig, + tag: update.tag, + payload: update.payload, + callback: update.callback, + next: null + }; + newBaseQueueLast = newBaseQueueLast.next = _clone; + } // Mark the event time of this update as relevant to this render pass. + // TODO: This should ideally use the true event time of this update rather than + // its priority which is a derived and not reverseable value. + // TODO: We should skip this update if it was already committed but currently + // we have no way of detecting the difference between a committed and suspended + // update here. + + + markRenderEventTimeAndConfig(updateExpirationTime, update.suspenseConfig); // Process this update. + + newState = getStateFromUpdate(workInProgress, queue, update, newState, props, instance); + var callback = update.callback; + + if (callback !== null) { + workInProgress.effectTag |= Callback; + var effects = queue.effects; + + if (effects === null) { + queue.effects = [update]; + } else { + effects.push(update); + } + } + } - var noGetInitialStateOnES6 = !instance.getInitialState || instance.getInitialState.isReactClassApproved || instance.state; - !noGetInitialStateOnES6 ? warningWithoutStack$1(false, 'getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', name) : void 0; - var noGetDefaultPropsOnES6 = !instance.getDefaultProps || instance.getDefaultProps.isReactClassApproved; - !noGetDefaultPropsOnES6 ? warningWithoutStack$1(false, 'getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', name) : void 0; - var noInstancePropTypes = !instance.propTypes; - !noInstancePropTypes ? warningWithoutStack$1(false, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name) : void 0; - var noInstanceContextType = !instance.contextType; - !noInstanceContextType ? warningWithoutStack$1(false, 'contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name) : void 0; + update = update.next; - if (disableLegacyContext) { - if (ctor.childContextTypes) { - warningWithoutStack$1(false, '%s uses the legacy childContextTypes API which is no longer supported. ' + 'Use React.createContext() instead.', name); - } + if (update === null || update === first) { + pendingQueue = queue.shared.pending; - if (ctor.contextTypes) { - warningWithoutStack$1(false, '%s uses the legacy contextTypes API which is no longer supported. ' + 'Use React.createContext() with static contextType instead.', name); + if (pendingQueue === null) { + break; + } else { + // An update was scheduled from inside a reducer. Add the new + // pending updates to the end of the list and keep processing. + update = baseQueue.next = pendingQueue.next; + pendingQueue.next = first; + queue.baseQueue = baseQueue = pendingQueue; + queue.shared.pending = null; + } + } + } while (true); } - } else { - var noInstanceContextTypes = !instance.contextTypes; - !noInstanceContextTypes ? warningWithoutStack$1(false, 'contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name) : void 0; - if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) { - didWarnAboutContextTypeAndContextTypes.add(ctor); - warningWithoutStack$1(false, '%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name); + if (newBaseQueueLast === null) { + newBaseState = newState; + } else { + newBaseQueueLast.next = newBaseQueueFirst; } - } - var noComponentShouldUpdate = typeof instance.componentShouldUpdate !== 'function'; - !noComponentShouldUpdate ? warningWithoutStack$1(false, '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', name) : void 0; + queue.baseState = newBaseState; + queue.baseQueue = newBaseQueueLast; // Set the remaining expiration time to be whatever is remaining in the queue. + // This should be fine because the only two other things that contribute to + // expiration time are props and context. We're already in the middle of the + // begin phase by the time we start processing the queue, so we've already + // dealt with the props. Context in components that specify + // shouldComponentUpdate is tricky; but we'll have to account for + // that regardless. - if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') { - warningWithoutStack$1(false, '%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentName(ctor) || 'A pure component'); + markUnprocessedUpdateTime(newExpirationTime); + workInProgress.expirationTime = newExpirationTime; + workInProgress.memoizedState = newState; } - var noComponentDidUnmount = typeof instance.componentDidUnmount !== 'function'; - !noComponentDidUnmount ? warningWithoutStack$1(false, '%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name) : void 0; - var noComponentDidReceiveProps = typeof instance.componentDidReceiveProps !== 'function'; - !noComponentDidReceiveProps ? warningWithoutStack$1(false, '%s has a method called ' + 'componentDidReceiveProps(). But there is no such lifecycle method. ' + 'If you meant to update the state in response to changing props, ' + 'use componentWillReceiveProps(). If you meant to fetch data or ' + 'run side-effects or mutations after React has updated the UI, use componentDidUpdate().', name) : void 0; - var noComponentWillRecieveProps = typeof instance.componentWillRecieveProps !== 'function'; - !noComponentWillRecieveProps ? warningWithoutStack$1(false, '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name) : void 0; - var noUnsafeComponentWillRecieveProps = typeof instance.UNSAFE_componentWillRecieveProps !== 'function'; - !noUnsafeComponentWillRecieveProps ? warningWithoutStack$1(false, '%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name) : void 0; - var hasMutatedProps = instance.props !== newProps; - !(instance.props === undefined || !hasMutatedProps) ? warningWithoutStack$1(false, '%s(...): When calling super() in `%s`, make sure to pass ' + "up the same props that your component's constructor was passed.", name, name) : void 0; - var noInstanceDefaultProps = !instance.defaultProps; - !noInstanceDefaultProps ? warningWithoutStack$1(false, 'Setting defaultProps as an instance property on %s is not supported and will be ignored.' + ' Instead, define defaultProps as a static property on %s.', name, name) : void 0; - - if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) { - didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor); - warningWithoutStack$1(false, '%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentName(ctor)); + { + currentlyProcessingQueue = null; } + } - var noInstanceGetDerivedStateFromProps = typeof instance.getDerivedStateFromProps !== 'function'; - !noInstanceGetDerivedStateFromProps ? warningWithoutStack$1(false, '%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name) : void 0; - var noInstanceGetDerivedStateFromCatch = typeof instance.getDerivedStateFromError !== 'function'; - !noInstanceGetDerivedStateFromCatch ? warningWithoutStack$1(false, '%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name) : void 0; - var noStaticGetSnapshotBeforeUpdate = typeof ctor.getSnapshotBeforeUpdate !== 'function'; - !noStaticGetSnapshotBeforeUpdate ? warningWithoutStack$1(false, '%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name) : void 0; - var _state = instance.state; - - if (_state && (typeof _state !== 'object' || isArray$1(_state))) { - warningWithoutStack$1(false, '%s.state: must be set to an object or null', name); + function callCallback(callback, context) { + if (!(typeof callback === 'function')) { + { + throw Error( "Invalid argument passed as callback. Expected a function. Instead received: " + callback ); + } } - if (typeof instance.getChildContext === 'function') { - !(typeof ctor.childContextTypes === 'object') ? warningWithoutStack$1(false, '%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name) : void 0; - } + callback.call(context); } -} - -function adoptClassInstance(workInProgress, instance) { - instance.updater = classComponentUpdater; - workInProgress.stateNode = instance; // The instance needs access to the fiber so that it can schedule updates - - set(instance, workInProgress); - { - instance._reactInternalInstance = fakeInternalInstance; + function resetHasForceUpdateBeforeProcessing() { + hasForceUpdate = false; + } + function checkHasForceUpdateAfterProcessing() { + return hasForceUpdate; } -} + function commitUpdateQueue(finishedWork, finishedQueue, instance) { + // Commit the effects + var effects = finishedQueue.effects; + finishedQueue.effects = null; -function constructClassInstance(workInProgress, ctor, props, renderExpirationTime) { - var isLegacyContextConsumer = false; - var unmaskedContext = emptyContextObject; - var context = emptyContextObject; - var contextType = ctor.contextType; + if (effects !== null) { + for (var i = 0; i < effects.length; i++) { + var effect = effects[i]; + var callback = effect.callback; - { - if ('contextType' in ctor) { - var isValid = // Allow null for conditional declaration - contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a <Context.Consumer> - - if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) { - didWarnAboutInvalidateContextType.add(ctor); - var addendum = ''; - - if (contextType === undefined) { - addendum = ' However, it is set to undefined. ' + 'This can be caused by a typo or by mixing up named and default imports. ' + 'This can also happen due to a circular dependency, so ' + 'try moving the createContext() call to a separate file.'; - } else if (typeof contextType !== 'object') { - addendum = ' However, it is set to a ' + typeof contextType + '.'; - } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) { - addendum = ' Did you accidentally pass the Context.Provider instead?'; - } else if (contextType._context !== undefined) { - // <Context.Consumer> - addendum = ' Did you accidentally pass the Context.Consumer instead?'; - } else { - addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.'; + if (callback !== null) { + effect.callback = null; + callCallback(callback, instance); } - - warningWithoutStack$1(false, '%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentName(ctor) || 'Component', addendum); } } } - if (typeof contextType === 'object' && contextType !== null) { - context = readContext(contextType); - } else if (!disableLegacyContext) { - unmaskedContext = getUnmaskedContext(workInProgress, ctor, true); - var contextTypes = ctor.contextTypes; - isLegacyContextConsumer = contextTypes !== null && contextTypes !== undefined; - context = isLegacyContextConsumer ? getMaskedContext(workInProgress, unmaskedContext) : emptyContextObject; - } // Instantiate twice to help detect side-effects. - - - { - if (debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) { - new ctor(props, context); // eslint-disable-line no-new - } + var ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig; + function requestCurrentSuspenseConfig() { + return ReactCurrentBatchConfig.suspense; } - var instance = new ctor(props, context); - var state = workInProgress.memoizedState = instance.state !== null && instance.state !== undefined ? instance.state : null; - adoptClassInstance(workInProgress, instance); + var fakeInternalInstance = {}; + var isArray = Array.isArray; // React.Component uses a shared frozen object by default. + // We'll use it to determine whether we need to initialize legacy refs. - { - if (typeof ctor.getDerivedStateFromProps === 'function' && state === null) { - var componentName = getComponentName(ctor) || 'Component'; + var emptyRefsObject = new React.Component().refs; + var didWarnAboutStateAssignmentForComponent; + var didWarnAboutUninitializedState; + var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate; + var didWarnAboutLegacyLifecyclesAndDerivedState; + var didWarnAboutUndefinedDerivedState; + var warnOnUndefinedDerivedState; + var warnOnInvalidCallback; + var didWarnAboutDirectlyAssigningPropsToState; + var didWarnAboutContextTypeAndContextTypes; + var didWarnAboutInvalidateContextType; - if (!didWarnAboutUninitializedState.has(componentName)) { - didWarnAboutUninitializedState.add(componentName); - warningWithoutStack$1(false, '`%s` uses `getDerivedStateFromProps` but its initial state is ' + '%s. This is not recommended. Instead, define the initial state by ' + 'assigning an object to `this.state` in the constructor of `%s`. ' + 'This ensures that `getDerivedStateFromProps` arguments have a consistent shape.', componentName, instance.state === null ? 'null' : 'undefined', componentName); + { + didWarnAboutStateAssignmentForComponent = new Set(); + didWarnAboutUninitializedState = new Set(); + didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set(); + didWarnAboutLegacyLifecyclesAndDerivedState = new Set(); + didWarnAboutDirectlyAssigningPropsToState = new Set(); + didWarnAboutUndefinedDerivedState = new Set(); + didWarnAboutContextTypeAndContextTypes = new Set(); + didWarnAboutInvalidateContextType = new Set(); + var didWarnOnInvalidCallback = new Set(); + + warnOnInvalidCallback = function (callback, callerName) { + if (callback === null || typeof callback === 'function') { + return; } - } // If new component APIs are defined, "unsafe" lifecycles won't be called. - // Warn about these lifecycles if they are present. - // Don't warn about react-lifecycles-compat polyfilled methods though. + var key = callerName + "_" + callback; - if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') { - var foundWillMountName = null; - var foundWillReceivePropsName = null; - var foundWillUpdateName = null; - - if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) { - foundWillMountName = 'componentWillMount'; - } else if (typeof instance.UNSAFE_componentWillMount === 'function') { - foundWillMountName = 'UNSAFE_componentWillMount'; - } - - if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) { - foundWillReceivePropsName = 'componentWillReceiveProps'; - } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') { - foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps'; - } + if (!didWarnOnInvalidCallback.has(key)) { + didWarnOnInvalidCallback.add(key); - if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) { - foundWillUpdateName = 'componentWillUpdate'; - } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') { - foundWillUpdateName = 'UNSAFE_componentWillUpdate'; + error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback); } + }; - if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) { - var _componentName = getComponentName(ctor) || 'Component'; + warnOnUndefinedDerivedState = function (type, partialState) { + if (partialState === undefined) { + var componentName = getComponentName(type) || 'Component'; - var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()'; + if (!didWarnAboutUndefinedDerivedState.has(componentName)) { + didWarnAboutUndefinedDerivedState.add(componentName); - if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) { - didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName); - warningWithoutStack$1(false, 'Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n' + '%s uses %s but also contains the following legacy lifecycles:%s%s%s\n\n' + 'The above lifecycles should be removed. Learn more about this warning here:\n' + 'https://fb.me/react-unsafe-component-lifecycles', _componentName, newApiName, foundWillMountName !== null ? "\n " + foundWillMountName : '', foundWillReceivePropsName !== null ? "\n " + foundWillReceivePropsName : '', foundWillUpdateName !== null ? "\n " + foundWillUpdateName : ''); + error('%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName); } } - } - } // Cache unmasked context so we can avoid recreating masked context unless necessary. - // ReactFiberContext usually updates this cache but can't for newly-created instances. + }; // This is so gross but it's at least non-critical and can be removed if + // it causes problems. This is meant to give a nicer error message for + // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component, + // ...)) which otherwise throws a "_processChildContext is not a function" + // exception. - if (isLegacyContextConsumer) { - cacheContext(workInProgress, unmaskedContext, context); + Object.defineProperty(fakeInternalInstance, '_processChildContext', { + enumerable: false, + value: function () { + { + { + throw Error( "_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal)." ); + } + } + } + }); + Object.freeze(fakeInternalInstance); } - return instance; -} - -function callComponentWillMount(workInProgress, instance) { - startPhaseTimer(workInProgress, 'componentWillMount'); - var oldState = instance.state; - - if (typeof instance.componentWillMount === 'function') { - instance.componentWillMount(); - } + function applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) { + var prevState = workInProgress.memoizedState; - if (typeof instance.UNSAFE_componentWillMount === 'function') { - instance.UNSAFE_componentWillMount(); - } + { + if ( workInProgress.mode & StrictMode) { + // Invoke the function an extra time to help detect side-effects. + getDerivedStateFromProps(nextProps, prevState); + } + } - stopPhaseTimer(); + var partialState = getDerivedStateFromProps(nextProps, prevState); - if (oldState !== instance.state) { { - warningWithoutStack$1(false, '%s.componentWillMount(): Assigning directly to this.state is ' + "deprecated (except inside a component's " + 'constructor). Use setState instead.', getComponentName(workInProgress.type) || 'Component'); - } + warnOnUndefinedDerivedState(ctor, partialState); + } // Merge the partial state and the previous state. - classComponentUpdater.enqueueReplaceState(instance, instance.state, null); - } -} -function callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) { - var oldState = instance.state; - startPhaseTimer(workInProgress, 'componentWillReceiveProps'); + var memoizedState = partialState === null || partialState === undefined ? prevState : _assign({}, prevState, partialState); + workInProgress.memoizedState = memoizedState; // Once the update queue is empty, persist the derived state onto the + // base state. - if (typeof instance.componentWillReceiveProps === 'function') { - instance.componentWillReceiveProps(newProps, nextContext); + if (workInProgress.expirationTime === NoWork) { + // Queue is always non-null for classes + var updateQueue = workInProgress.updateQueue; + updateQueue.baseState = memoizedState; + } } + var classComponentUpdater = { + isMounted: isMounted, + enqueueSetState: function (inst, payload, callback) { + var fiber = get(inst); + var currentTime = requestCurrentTimeForUpdate(); + var suspenseConfig = requestCurrentSuspenseConfig(); + var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig); + var update = createUpdate(expirationTime, suspenseConfig); + update.payload = payload; - if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') { - instance.UNSAFE_componentWillReceiveProps(newProps, nextContext); - } + if (callback !== undefined && callback !== null) { + { + warnOnInvalidCallback(callback, 'setState'); + } - stopPhaseTimer(); + update.callback = callback; + } - if (instance.state !== oldState) { - { - var componentName = getComponentName(workInProgress.type) || 'Component'; + enqueueUpdate(fiber, update); + scheduleWork(fiber, expirationTime); + }, + enqueueReplaceState: function (inst, payload, callback) { + var fiber = get(inst); + var currentTime = requestCurrentTimeForUpdate(); + var suspenseConfig = requestCurrentSuspenseConfig(); + var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig); + var update = createUpdate(expirationTime, suspenseConfig); + update.tag = ReplaceState; + update.payload = payload; + + if (callback !== undefined && callback !== null) { + { + warnOnInvalidCallback(callback, 'replaceState'); + } - if (!didWarnAboutStateAssignmentForComponent.has(componentName)) { - didWarnAboutStateAssignmentForComponent.add(componentName); - warningWithoutStack$1(false, '%s.componentWillReceiveProps(): Assigning directly to ' + "this.state is deprecated (except inside a component's " + 'constructor). Use setState instead.', componentName); + update.callback = callback; } - } - classComponentUpdater.enqueueReplaceState(instance, instance.state, null); - } -} // Invokes the mount life-cycles on a previously never rendered instance. + enqueueUpdate(fiber, update); + scheduleWork(fiber, expirationTime); + }, + enqueueForceUpdate: function (inst, callback) { + var fiber = get(inst); + var currentTime = requestCurrentTimeForUpdate(); + var suspenseConfig = requestCurrentSuspenseConfig(); + var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig); + var update = createUpdate(expirationTime, suspenseConfig); + update.tag = ForceUpdate; + + if (callback !== undefined && callback !== null) { + { + warnOnInvalidCallback(callback, 'forceUpdate'); + } + update.callback = callback; + } -function mountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) { - { - checkClassInstance(workInProgress, ctor, newProps); - } + enqueueUpdate(fiber, update); + scheduleWork(fiber, expirationTime); + } + }; - var instance = workInProgress.stateNode; - instance.props = newProps; - instance.state = workInProgress.memoizedState; - instance.refs = emptyRefsObject; - var contextType = ctor.contextType; + function checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) { + var instance = workInProgress.stateNode; - if (typeof contextType === 'object' && contextType !== null) { - instance.context = readContext(contextType); - } else if (disableLegacyContext) { - instance.context = emptyContextObject; - } else { - var unmaskedContext = getUnmaskedContext(workInProgress, ctor, true); - instance.context = getMaskedContext(workInProgress, unmaskedContext); - } + if (typeof instance.shouldComponentUpdate === 'function') { + { + if ( workInProgress.mode & StrictMode) { + // Invoke the function an extra time to help detect side-effects. + instance.shouldComponentUpdate(newProps, newState, nextContext); + } + } - { - if (instance.state === newProps) { - var componentName = getComponentName(ctor) || 'Component'; + startPhaseTimer(workInProgress, 'shouldComponentUpdate'); + var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext); + stopPhaseTimer(); - if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) { - didWarnAboutDirectlyAssigningPropsToState.add(componentName); - warningWithoutStack$1(false, '%s: It is not recommended to assign props directly to state ' + "because updates to props won't be reflected in state. " + 'In most cases, it is better to use props directly.', componentName); + { + if (shouldUpdate === undefined) { + error('%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', getComponentName(ctor) || 'Component'); + } } - } - if (workInProgress.mode & StrictMode) { - ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance); + return shouldUpdate; } - if (warnAboutDeprecatedLifecycles) { - ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance); + if (ctor.prototype && ctor.prototype.isPureReactComponent) { + return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState); } - } - - var updateQueue = workInProgress.updateQueue; - if (updateQueue !== null) { - processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime); - instance.state = workInProgress.memoizedState; + return true; } - var getDerivedStateFromProps = ctor.getDerivedStateFromProps; - - if (typeof getDerivedStateFromProps === 'function') { - applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps); - instance.state = workInProgress.memoizedState; - } // In order to support react-lifecycles-compat polyfilled components, - // Unsafe lifecycles should not be invoked for components using the new APIs. + function checkClassInstance(workInProgress, ctor, newProps) { + var instance = workInProgress.stateNode; + { + var name = getComponentName(ctor) || 'Component'; + var renderPresent = instance.render; - if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) { - callComponentWillMount(workInProgress, instance); // If we had additional state updates during this life-cycle, let's - // process them now. + if (!renderPresent) { + if (ctor.prototype && typeof ctor.prototype.render === 'function') { + error('%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name); + } else { + error('%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name); + } + } - updateQueue = workInProgress.updateQueue; + if (instance.getInitialState && !instance.getInitialState.isReactClassApproved && !instance.state) { + error('getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', name); + } - if (updateQueue !== null) { - processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime); - instance.state = workInProgress.memoizedState; - } - } + if (instance.getDefaultProps && !instance.getDefaultProps.isReactClassApproved) { + error('getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', name); + } - if (typeof instance.componentDidMount === 'function') { - workInProgress.effectTag |= Update; - } -} + if (instance.propTypes) { + error('propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name); + } -function resumeMountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) { - var instance = workInProgress.stateNode; - var oldProps = workInProgress.memoizedProps; - instance.props = oldProps; - var oldContext = instance.context; - var contextType = ctor.contextType; - var nextContext = emptyContextObject; + if (instance.contextType) { + error('contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name); + } - if (typeof contextType === 'object' && contextType !== null) { - nextContext = readContext(contextType); - } else if (!disableLegacyContext) { - var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true); - nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext); - } + { + if (instance.contextTypes) { + error('contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name); + } - var getDerivedStateFromProps = ctor.getDerivedStateFromProps; - var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what - // ever the previously attempted to render - not the "current". However, - // during componentDidUpdate we pass the "current" props. - // In order to support react-lifecycles-compat polyfilled components, - // Unsafe lifecycles should not be invoked for components using the new APIs. + if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) { + didWarnAboutContextTypeAndContextTypes.add(ctor); - if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) { - if (oldProps !== newProps || oldContext !== nextContext) { - callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext); - } - } + error('%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name); + } + } - resetHasForceUpdateBeforeProcessing(); - var oldState = workInProgress.memoizedState; - var newState = instance.state = oldState; - var updateQueue = workInProgress.updateQueue; + if (typeof instance.componentShouldUpdate === 'function') { + error('%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', name); + } - if (updateQueue !== null) { - processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime); - newState = workInProgress.memoizedState; - } + if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') { + error('%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentName(ctor) || 'A pure component'); + } - if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) { - // If an update was already in progress, we should schedule an Update - // effect even though we're bailing out, so that cWU/cDU are called. - if (typeof instance.componentDidMount === 'function') { - workInProgress.effectTag |= Update; - } + if (typeof instance.componentDidUnmount === 'function') { + error('%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name); + } - return false; - } + if (typeof instance.componentDidReceiveProps === 'function') { + error('%s has a method called ' + 'componentDidReceiveProps(). But there is no such lifecycle method. ' + 'If you meant to update the state in response to changing props, ' + 'use componentWillReceiveProps(). If you meant to fetch data or ' + 'run side-effects or mutations after React has updated the UI, use componentDidUpdate().', name); + } - if (typeof getDerivedStateFromProps === 'function') { - applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps); - newState = workInProgress.memoizedState; - } + if (typeof instance.componentWillRecieveProps === 'function') { + error('%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name); + } - var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext); + if (typeof instance.UNSAFE_componentWillRecieveProps === 'function') { + error('%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name); + } - if (shouldUpdate) { - // In order to support react-lifecycles-compat polyfilled components, - // Unsafe lifecycles should not be invoked for components using the new APIs. - if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) { - startPhaseTimer(workInProgress, 'componentWillMount'); + var hasMutatedProps = instance.props !== newProps; - if (typeof instance.componentWillMount === 'function') { - instance.componentWillMount(); + if (instance.props !== undefined && hasMutatedProps) { + error('%s(...): When calling super() in `%s`, make sure to pass ' + "up the same props that your component's constructor was passed.", name, name); } - if (typeof instance.UNSAFE_componentWillMount === 'function') { - instance.UNSAFE_componentWillMount(); + if (instance.defaultProps) { + error('Setting defaultProps as an instance property on %s is not supported and will be ignored.' + ' Instead, define defaultProps as a static property on %s.', name, name); } - stopPhaseTimer(); - } - - if (typeof instance.componentDidMount === 'function') { - workInProgress.effectTag |= Update; - } - } else { - // If an update was already in progress, we should schedule an Update - // effect even though we're bailing out, so that cWU/cDU are called. - if (typeof instance.componentDidMount === 'function') { - workInProgress.effectTag |= Update; - } // If shouldComponentUpdate returned false, we should still update the - // memoized state to indicate that this work can be reused. + if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) { + didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor); + error('%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentName(ctor)); + } - workInProgress.memoizedProps = newProps; - workInProgress.memoizedState = newState; - } // Update the existing instance's state, props, and context pointers even - // if shouldComponentUpdate returns false. + if (typeof instance.getDerivedStateFromProps === 'function') { + error('%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name); + } + if (typeof instance.getDerivedStateFromError === 'function') { + error('%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name); + } - instance.props = newProps; - instance.state = newState; - instance.context = nextContext; - return shouldUpdate; -} // Invokes the update life-cycles and returns false if it shouldn't rerender. + if (typeof ctor.getSnapshotBeforeUpdate === 'function') { + error('%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name); + } + var _state = instance.state; -function updateClassInstance(current, workInProgress, ctor, newProps, renderExpirationTime) { - var instance = workInProgress.stateNode; - var oldProps = workInProgress.memoizedProps; - instance.props = workInProgress.type === workInProgress.elementType ? oldProps : resolveDefaultProps(workInProgress.type, oldProps); - var oldContext = instance.context; - var contextType = ctor.contextType; - var nextContext = emptyContextObject; + if (_state && (typeof _state !== 'object' || isArray(_state))) { + error('%s.state: must be set to an object or null', name); + } - if (typeof contextType === 'object' && contextType !== null) { - nextContext = readContext(contextType); - } else if (!disableLegacyContext) { - var nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true); - nextContext = getMaskedContext(workInProgress, nextUnmaskedContext); + if (typeof instance.getChildContext === 'function' && typeof ctor.childContextTypes !== 'object') { + error('%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name); + } + } } - var getDerivedStateFromProps = ctor.getDerivedStateFromProps; - var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what - // ever the previously attempted to render - not the "current". However, - // during componentDidUpdate we pass the "current" props. - // In order to support react-lifecycles-compat polyfilled components, - // Unsafe lifecycles should not be invoked for components using the new APIs. + function adoptClassInstance(workInProgress, instance) { + instance.updater = classComponentUpdater; + workInProgress.stateNode = instance; // The instance needs access to the fiber so that it can schedule updates + + set(instance, workInProgress); - if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) { - if (oldProps !== newProps || oldContext !== nextContext) { - callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext); + { + instance._reactInternalInstance = fakeInternalInstance; } } - resetHasForceUpdateBeforeProcessing(); - var oldState = workInProgress.memoizedState; - var newState = instance.state = oldState; - var updateQueue = workInProgress.updateQueue; + function constructClassInstance(workInProgress, ctor, props) { + var isLegacyContextConsumer = false; + var unmaskedContext = emptyContextObject; + var context = emptyContextObject; + var contextType = ctor.contextType; - if (updateQueue !== null) { - processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime); - newState = workInProgress.memoizedState; - } + { + if ('contextType' in ctor) { + var isValid = // Allow null for conditional declaration + contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a <Context.Consumer> + + if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) { + didWarnAboutInvalidateContextType.add(ctor); + var addendum = ''; + + if (contextType === undefined) { + addendum = ' However, it is set to undefined. ' + 'This can be caused by a typo or by mixing up named and default imports. ' + 'This can also happen due to a circular dependency, so ' + 'try moving the createContext() call to a separate file.'; + } else if (typeof contextType !== 'object') { + addendum = ' However, it is set to a ' + typeof contextType + '.'; + } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) { + addendum = ' Did you accidentally pass the Context.Provider instead?'; + } else if (contextType._context !== undefined) { + // <Context.Consumer> + addendum = ' Did you accidentally pass the Context.Consumer instead?'; + } else { + addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.'; + } - if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) { - // If an update was already in progress, we should schedule an Update - // effect even though we're bailing out, so that cWU/cDU are called. - if (typeof instance.componentDidUpdate === 'function') { - if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) { - workInProgress.effectTag |= Update; + error('%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentName(ctor) || 'Component', addendum); + } } } - if (typeof instance.getSnapshotBeforeUpdate === 'function') { - if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) { - workInProgress.effectTag |= Snapshot; + if (typeof contextType === 'object' && contextType !== null) { + context = readContext(contextType); + } else { + unmaskedContext = getUnmaskedContext(workInProgress, ctor, true); + var contextTypes = ctor.contextTypes; + isLegacyContextConsumer = contextTypes !== null && contextTypes !== undefined; + context = isLegacyContextConsumer ? getMaskedContext(workInProgress, unmaskedContext) : emptyContextObject; + } // Instantiate twice to help detect side-effects. + + + { + if ( workInProgress.mode & StrictMode) { + new ctor(props, context); // eslint-disable-line no-new } } - return false; - } - - if (typeof getDerivedStateFromProps === 'function') { - applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps); - newState = workInProgress.memoizedState; - } + var instance = new ctor(props, context); + var state = workInProgress.memoizedState = instance.state !== null && instance.state !== undefined ? instance.state : null; + adoptClassInstance(workInProgress, instance); - var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext); + { + if (typeof ctor.getDerivedStateFromProps === 'function' && state === null) { + var componentName = getComponentName(ctor) || 'Component'; - if (shouldUpdate) { - // In order to support react-lifecycles-compat polyfilled components, - // Unsafe lifecycles should not be invoked for components using the new APIs. - if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === 'function' || typeof instance.componentWillUpdate === 'function')) { - startPhaseTimer(workInProgress, 'componentWillUpdate'); + if (!didWarnAboutUninitializedState.has(componentName)) { + didWarnAboutUninitializedState.add(componentName); - if (typeof instance.componentWillUpdate === 'function') { - instance.componentWillUpdate(newProps, newState, nextContext); - } + error('`%s` uses `getDerivedStateFromProps` but its initial state is ' + '%s. This is not recommended. Instead, define the initial state by ' + 'assigning an object to `this.state` in the constructor of `%s`. ' + 'This ensures that `getDerivedStateFromProps` arguments have a consistent shape.', componentName, instance.state === null ? 'null' : 'undefined', componentName); + } + } // If new component APIs are defined, "unsafe" lifecycles won't be called. + // Warn about these lifecycles if they are present. + // Don't warn about react-lifecycles-compat polyfilled methods though. - if (typeof instance.UNSAFE_componentWillUpdate === 'function') { - instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext); - } - stopPhaseTimer(); - } + if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') { + var foundWillMountName = null; + var foundWillReceivePropsName = null; + var foundWillUpdateName = null; - if (typeof instance.componentDidUpdate === 'function') { - workInProgress.effectTag |= Update; - } + if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) { + foundWillMountName = 'componentWillMount'; + } else if (typeof instance.UNSAFE_componentWillMount === 'function') { + foundWillMountName = 'UNSAFE_componentWillMount'; + } - if (typeof instance.getSnapshotBeforeUpdate === 'function') { - workInProgress.effectTag |= Snapshot; - } - } else { - // If an update was already in progress, we should schedule an Update - // effect even though we're bailing out, so that cWU/cDU are called. - if (typeof instance.componentDidUpdate === 'function') { - if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) { - workInProgress.effectTag |= Update; - } - } + if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) { + foundWillReceivePropsName = 'componentWillReceiveProps'; + } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') { + foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps'; + } - if (typeof instance.getSnapshotBeforeUpdate === 'function') { - if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) { - workInProgress.effectTag |= Snapshot; - } - } // If shouldComponentUpdate returned false, we should still update the - // memoized props/state to indicate that this work can be reused. + if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) { + foundWillUpdateName = 'componentWillUpdate'; + } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') { + foundWillUpdateName = 'UNSAFE_componentWillUpdate'; + } + if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) { + var _componentName = getComponentName(ctor) || 'Component'; - workInProgress.memoizedProps = newProps; - workInProgress.memoizedState = newState; - } // Update the existing instance's state, props, and context pointers even - // if shouldComponentUpdate returns false. + var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()'; + if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) { + didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName); - instance.props = newProps; - instance.state = newState; - instance.context = nextContext; - return shouldUpdate; -} + error('Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n' + '%s uses %s but also contains the following legacy lifecycles:%s%s%s\n\n' + 'The above lifecycles should be removed. Learn more about this warning here:\n' + 'https://fb.me/react-unsafe-component-lifecycles', _componentName, newApiName, foundWillMountName !== null ? "\n " + foundWillMountName : '', foundWillReceivePropsName !== null ? "\n " + foundWillReceivePropsName : '', foundWillUpdateName !== null ? "\n " + foundWillUpdateName : ''); + } + } + } + } // Cache unmasked context so we can avoid recreating masked context unless necessary. + // ReactFiberContext usually updates this cache but can't for newly-created instances. -var didWarnAboutMaps; -var didWarnAboutGenerators; -var didWarnAboutStringRefs; -var ownerHasKeyUseWarning; -var ownerHasFunctionTypeWarning; -var warnForMissingKey = function (child) {}; + if (isLegacyContextConsumer) { + cacheContext(workInProgress, unmaskedContext, context); + } -{ - didWarnAboutMaps = false; - didWarnAboutGenerators = false; - didWarnAboutStringRefs = {}; - /** - * Warn if there's no key explicitly set on dynamic arrays of children or - * object keys are not valid. This allows us to keep track of children between - * updates. - */ + return instance; + } - ownerHasKeyUseWarning = {}; - ownerHasFunctionTypeWarning = {}; + function callComponentWillMount(workInProgress, instance) { + startPhaseTimer(workInProgress, 'componentWillMount'); + var oldState = instance.state; - warnForMissingKey = function (child) { - if (child === null || typeof child !== 'object') { - return; + if (typeof instance.componentWillMount === 'function') { + instance.componentWillMount(); } - if (!child._store || child._store.validated || child.key != null) { - return; + if (typeof instance.UNSAFE_componentWillMount === 'function') { + instance.UNSAFE_componentWillMount(); } - if (!(typeof child._store === 'object')) { + stopPhaseTimer(); + + if (oldState !== instance.state) { { - throw Error("React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue."); + error('%s.componentWillMount(): Assigning directly to this.state is ' + "deprecated (except inside a component's " + 'constructor). Use setState instead.', getComponentName(workInProgress.type) || 'Component'); } + + classComponentUpdater.enqueueReplaceState(instance, instance.state, null); } + } - child._store.validated = true; - var currentComponentErrorInfo = 'Each child in a list should have a unique ' + '"key" prop. See https://fb.me/react-warning-keys for ' + 'more information.' + getCurrentFiberStackInDev(); + function callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) { + var oldState = instance.state; + startPhaseTimer(workInProgress, 'componentWillReceiveProps'); - if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { - return; + if (typeof instance.componentWillReceiveProps === 'function') { + instance.componentWillReceiveProps(newProps, nextContext); } - ownerHasKeyUseWarning[currentComponentErrorInfo] = true; - warning$1(false, 'Each child in a list should have a unique ' + '"key" prop. See https://fb.me/react-warning-keys for ' + 'more information.'); - }; -} + if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') { + instance.UNSAFE_componentWillReceiveProps(newProps, nextContext); + } -var isArray = Array.isArray; + stopPhaseTimer(); -function coerceRef(returnFiber, current$$1, element) { - var mixedRef = element.ref; + if (instance.state !== oldState) { + { + var componentName = getComponentName(workInProgress.type) || 'Component'; - if (mixedRef !== null && typeof mixedRef !== 'function' && typeof mixedRef !== 'object') { - { - // TODO: Clean this up once we turn on the string ref warning for - // everyone, because the strict mode case will no longer be relevant - if (returnFiber.mode & StrictMode || warnAboutStringRefs) { - var componentName = getComponentName(returnFiber.type) || 'Component'; - - if (!didWarnAboutStringRefs[componentName]) { - if (warnAboutStringRefs) { - warningWithoutStack$1(false, 'Component "%s" contains the string ref "%s". Support for string refs ' + 'will be removed in a future major release. We recommend using ' + 'useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref%s', componentName, mixedRef, getStackByFiberInDevAndProd(returnFiber)); - } else { - warningWithoutStack$1(false, 'A string ref, "%s", has been found within a strict mode tree. ' + 'String refs are a source of potential bugs and should be avoided. ' + 'We recommend using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref%s', mixedRef, getStackByFiberInDevAndProd(returnFiber)); - } + if (!didWarnAboutStateAssignmentForComponent.has(componentName)) { + didWarnAboutStateAssignmentForComponent.add(componentName); - didWarnAboutStringRefs[componentName] = true; + error('%s.componentWillReceiveProps(): Assigning directly to ' + "this.state is deprecated (except inside a component's " + 'constructor). Use setState instead.', componentName); } } + + classComponentUpdater.enqueueReplaceState(instance, instance.state, null); } + } // Invokes the mount life-cycles on a previously never rendered instance. - if (element._owner) { - var owner = element._owner; - var inst; - if (owner) { - var ownerFiber = owner; + function mountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) { + { + checkClassInstance(workInProgress, ctor, newProps); + } - if (!(ownerFiber.tag === ClassComponent)) { - { - throw Error("Function components cannot have refs. Did you mean to use React.forwardRef()?"); - } - } + var instance = workInProgress.stateNode; + instance.props = newProps; + instance.state = workInProgress.memoizedState; + instance.refs = emptyRefsObject; + initializeUpdateQueue(workInProgress); + var contextType = ctor.contextType; - inst = ownerFiber.stateNode; - } + if (typeof contextType === 'object' && contextType !== null) { + instance.context = readContext(contextType); + } else { + var unmaskedContext = getUnmaskedContext(workInProgress, ctor, true); + instance.context = getMaskedContext(workInProgress, unmaskedContext); + } - if (!inst) { - { - throw Error("Missing owner for string ref " + mixedRef + ". This error is likely caused by a bug in React. Please file an issue."); + { + if (instance.state === newProps) { + var componentName = getComponentName(ctor) || 'Component'; + + if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) { + didWarnAboutDirectlyAssigningPropsToState.add(componentName); + + error('%s: It is not recommended to assign props directly to state ' + "because updates to props won't be reflected in state. " + 'In most cases, it is better to use props directly.', componentName); } } - var stringRef = '' + mixedRef; // Check if previous string ref matches new string ref - - if (current$$1 !== null && current$$1.ref !== null && typeof current$$1.ref === 'function' && current$$1.ref._stringRef === stringRef) { - return current$$1.ref; + if (workInProgress.mode & StrictMode) { + ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance); } - var ref = function (value) { - var refs = inst.refs; + { + ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance); + } + } - if (refs === emptyRefsObject) { - // This is a lazy pooled frozen object, so we need to initialize. - refs = inst.refs = {}; - } + processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime); + instance.state = workInProgress.memoizedState; + var getDerivedStateFromProps = ctor.getDerivedStateFromProps; - if (value === null) { - delete refs[stringRef]; - } else { - refs[stringRef] = value; - } - }; - - ref._stringRef = stringRef; - return ref; - } else { - if (!(typeof mixedRef === 'string')) { - { - throw Error("Expected ref to be a function, a string, an object returned by React.createRef(), or null."); - } - } - - if (!element._owner) { - { - throw Error("Element ref was specified as a string (" + mixedRef + ") but no owner was set. This could happen for one of the following reasons:\n1. You may be adding a ref to a function component\n2. You may be adding a ref to a component that was not created inside a component's render method\n3. You have multiple copies of React loaded\nSee https://fb.me/react-refs-must-have-owner for more information."); - } - } - } - } + if (typeof getDerivedStateFromProps === 'function') { + applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps); + instance.state = workInProgress.memoizedState; + } // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. - return mixedRef; -} -function throwOnInvalidObjectType(returnFiber, newChild) { - if (returnFiber.type !== 'textarea') { - var addendum = ''; + if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) { + callComponentWillMount(workInProgress, instance); // If we had additional state updates during this life-cycle, let's + // process them now. - { - addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + getCurrentFiberStackInDev(); + processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime); + instance.state = workInProgress.memoizedState; } - { - { - throw Error("Objects are not valid as a React child (found: " + (Object.prototype.toString.call(newChild) === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : newChild) + ")." + addendum); - } + if (typeof instance.componentDidMount === 'function') { + workInProgress.effectTag |= Update; } } -} - -function warnOnFunctionType() { - var currentComponentErrorInfo = 'Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.' + getCurrentFiberStackInDev(); - - if (ownerHasFunctionTypeWarning[currentComponentErrorInfo]) { - return; - } - ownerHasFunctionTypeWarning[currentComponentErrorInfo] = true; - warning$1(false, 'Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.'); -} // This wrapper function exists because I expect to clone the code in each path -// to be able to optimize each path individually by branching early. This needs -// a compiler or we can do it manually. Helpers that don't need this branching -// live outside of this function. + function resumeMountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) { + var instance = workInProgress.stateNode; + var oldProps = workInProgress.memoizedProps; + instance.props = oldProps; + var oldContext = instance.context; + var contextType = ctor.contextType; + var nextContext = emptyContextObject; + + if (typeof contextType === 'object' && contextType !== null) { + nextContext = readContext(contextType); + } else { + var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true); + nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext); + } + var getDerivedStateFromProps = ctor.getDerivedStateFromProps; + var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what + // ever the previously attempted to render - not the "current". However, + // during componentDidUpdate we pass the "current" props. + // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. -function ChildReconciler(shouldTrackSideEffects) { - function deleteChild(returnFiber, childToDelete) { - if (!shouldTrackSideEffects) { - // Noop. - return; - } // Deletions are added in reversed order so we add it to the front. - // At this point, the return fiber's effect list is empty except for - // deletions, so we can just append the deletion to the list. The remaining - // effects aren't added until the complete phase. Once we implement - // resuming, this may not be true. + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) { + if (oldProps !== newProps || oldContext !== nextContext) { + callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext); + } + } + resetHasForceUpdateBeforeProcessing(); + var oldState = workInProgress.memoizedState; + var newState = instance.state = oldState; + processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime); + newState = workInProgress.memoizedState; - var last = returnFiber.lastEffect; + if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) { + // If an update was already in progress, we should schedule an Update + // effect even though we're bailing out, so that cWU/cDU are called. + if (typeof instance.componentDidMount === 'function') { + workInProgress.effectTag |= Update; + } - if (last !== null) { - last.nextEffect = childToDelete; - returnFiber.lastEffect = childToDelete; - } else { - returnFiber.firstEffect = returnFiber.lastEffect = childToDelete; + return false; } - childToDelete.nextEffect = null; - childToDelete.effectTag = Deletion; - } - - function deleteRemainingChildren(returnFiber, currentFirstChild) { - if (!shouldTrackSideEffects) { - // Noop. - return null; - } // TODO: For the shouldClone case, this could be micro-optimized a bit by - // assuming that after the first child we've already added everything. - + if (typeof getDerivedStateFromProps === 'function') { + applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps); + newState = workInProgress.memoizedState; + } - var childToDelete = currentFirstChild; + var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext); - while (childToDelete !== null) { - deleteChild(returnFiber, childToDelete); - childToDelete = childToDelete.sibling; - } + if (shouldUpdate) { + // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) { + startPhaseTimer(workInProgress, 'componentWillMount'); - return null; - } + if (typeof instance.componentWillMount === 'function') { + instance.componentWillMount(); + } - function mapRemainingChildren(returnFiber, currentFirstChild) { - // Add the remaining children to a temporary map so that we can find them by - // keys quickly. Implicit (null) keys get added to this set with their index - // instead. - var existingChildren = new Map(); - var existingChild = currentFirstChild; + if (typeof instance.UNSAFE_componentWillMount === 'function') { + instance.UNSAFE_componentWillMount(); + } - while (existingChild !== null) { - if (existingChild.key !== null) { - existingChildren.set(existingChild.key, existingChild); - } else { - existingChildren.set(existingChild.index, existingChild); + stopPhaseTimer(); } - existingChild = existingChild.sibling; - } - - return existingChildren; - } + if (typeof instance.componentDidMount === 'function') { + workInProgress.effectTag |= Update; + } + } else { + // If an update was already in progress, we should schedule an Update + // effect even though we're bailing out, so that cWU/cDU are called. + if (typeof instance.componentDidMount === 'function') { + workInProgress.effectTag |= Update; + } // If shouldComponentUpdate returned false, we should still update the + // memoized state to indicate that this work can be reused. - function useFiber(fiber, pendingProps, expirationTime) { - // We currently set sibling to null and index to 0 here because it is easy - // to forget to do before returning it. E.g. for the single child case. - var clone = createWorkInProgress(fiber, pendingProps, expirationTime); - clone.index = 0; - clone.sibling = null; - return clone; - } - function placeChild(newFiber, lastPlacedIndex, newIndex) { - newFiber.index = newIndex; + workInProgress.memoizedProps = newProps; + workInProgress.memoizedState = newState; + } // Update the existing instance's state, props, and context pointers even + // if shouldComponentUpdate returns false. - if (!shouldTrackSideEffects) { - // Noop. - return lastPlacedIndex; - } - var current$$1 = newFiber.alternate; + instance.props = newProps; + instance.state = newState; + instance.context = nextContext; + return shouldUpdate; + } // Invokes the update life-cycles and returns false if it shouldn't rerender. - if (current$$1 !== null) { - var oldIndex = current$$1.index; - if (oldIndex < lastPlacedIndex) { - // This is a move. - newFiber.effectTag = Placement; - return lastPlacedIndex; - } else { - // This item can stay in place. - return oldIndex; - } + function updateClassInstance(current, workInProgress, ctor, newProps, renderExpirationTime) { + var instance = workInProgress.stateNode; + cloneUpdateQueue(current, workInProgress); + var oldProps = workInProgress.memoizedProps; + instance.props = workInProgress.type === workInProgress.elementType ? oldProps : resolveDefaultProps(workInProgress.type, oldProps); + var oldContext = instance.context; + var contextType = ctor.contextType; + var nextContext = emptyContextObject; + + if (typeof contextType === 'object' && contextType !== null) { + nextContext = readContext(contextType); } else { - // This is an insertion. - newFiber.effectTag = Placement; - return lastPlacedIndex; - } - } - - function placeSingleChild(newFiber) { - // This is simpler for the single child case. We only need to do a - // placement for inserting new children. - if (shouldTrackSideEffects && newFiber.alternate === null) { - newFiber.effectTag = Placement; + var nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true); + nextContext = getMaskedContext(workInProgress, nextUnmaskedContext); } - return newFiber; - } + var getDerivedStateFromProps = ctor.getDerivedStateFromProps; + var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what + // ever the previously attempted to render - not the "current". However, + // during componentDidUpdate we pass the "current" props. + // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. - function updateTextNode(returnFiber, current$$1, textContent, expirationTime) { - if (current$$1 === null || current$$1.tag !== HostText) { - // Insert - var created = createFiberFromText(textContent, returnFiber.mode, expirationTime); - created.return = returnFiber; - return created; - } else { - // Update - var existing = useFiber(current$$1, textContent, expirationTime); - existing.return = returnFiber; - return existing; + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) { + if (oldProps !== newProps || oldContext !== nextContext) { + callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext); + } } - } - function updateElement(returnFiber, current$$1, element, expirationTime) { - if (current$$1 !== null && (current$$1.elementType === element.type || ( // Keep this check inline so it only runs on the false path: - isCompatibleFamilyForHotReloading(current$$1, element)))) { - // Move based on index - var existing = useFiber(current$$1, element.props, expirationTime); - existing.ref = coerceRef(returnFiber, current$$1, element); - existing.return = returnFiber; + resetHasForceUpdateBeforeProcessing(); + var oldState = workInProgress.memoizedState; + var newState = instance.state = oldState; + processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime); + newState = workInProgress.memoizedState; - { - existing._debugSource = element._source; - existing._debugOwner = element._owner; + if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) { + // If an update was already in progress, we should schedule an Update + // effect even though we're bailing out, so that cWU/cDU are called. + if (typeof instance.componentDidUpdate === 'function') { + if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) { + workInProgress.effectTag |= Update; + } } - return existing; - } else { - // Insert - var created = createFiberFromElement(element, returnFiber.mode, expirationTime); - created.ref = coerceRef(returnFiber, current$$1, element); - created.return = returnFiber; - return created; - } - } + if (typeof instance.getSnapshotBeforeUpdate === 'function') { + if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) { + workInProgress.effectTag |= Snapshot; + } + } - function updatePortal(returnFiber, current$$1, portal, expirationTime) { - if (current$$1 === null || current$$1.tag !== HostPortal || current$$1.stateNode.containerInfo !== portal.containerInfo || current$$1.stateNode.implementation !== portal.implementation) { - // Insert - var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime); - created.return = returnFiber; - return created; - } else { - // Update - var existing = useFiber(current$$1, portal.children || [], expirationTime); - existing.return = returnFiber; - return existing; + return false; } - } - function updateFragment(returnFiber, current$$1, fragment, expirationTime, key) { - if (current$$1 === null || current$$1.tag !== Fragment) { - // Insert - var created = createFiberFromFragment(fragment, returnFiber.mode, expirationTime, key); - created.return = returnFiber; - return created; - } else { - // Update - var existing = useFiber(current$$1, fragment, expirationTime); - existing.return = returnFiber; - return existing; + if (typeof getDerivedStateFromProps === 'function') { + applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps); + newState = workInProgress.memoizedState; } - } - function createChild(returnFiber, newChild, expirationTime) { - if (typeof newChild === 'string' || typeof newChild === 'number') { - // Text nodes don't have keys. If the previous node is implicitly keyed - // we can continue to replace it without aborting even if it is not a text - // node. - var created = createFiberFromText('' + newChild, returnFiber.mode, expirationTime); - created.return = returnFiber; - return created; - } + var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext); - if (typeof newChild === 'object' && newChild !== null) { - switch (newChild.$$typeof) { - case REACT_ELEMENT_TYPE: - { - var _created = createFiberFromElement(newChild, returnFiber.mode, expirationTime); + if (shouldUpdate) { + // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === 'function' || typeof instance.componentWillUpdate === 'function')) { + startPhaseTimer(workInProgress, 'componentWillUpdate'); - _created.ref = coerceRef(returnFiber, null, newChild); - _created.return = returnFiber; - return _created; - } + if (typeof instance.componentWillUpdate === 'function') { + instance.componentWillUpdate(newProps, newState, nextContext); + } - case REACT_PORTAL_TYPE: - { - var _created2 = createFiberFromPortal(newChild, returnFiber.mode, expirationTime); + if (typeof instance.UNSAFE_componentWillUpdate === 'function') { + instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext); + } - _created2.return = returnFiber; - return _created2; - } + stopPhaseTimer(); } - if (isArray(newChild) || getIteratorFn(newChild)) { - var _created3 = createFiberFromFragment(newChild, returnFiber.mode, expirationTime, null); + if (typeof instance.componentDidUpdate === 'function') { + workInProgress.effectTag |= Update; + } - _created3.return = returnFiber; - return _created3; + if (typeof instance.getSnapshotBeforeUpdate === 'function') { + workInProgress.effectTag |= Snapshot; + } + } else { + // If an update was already in progress, we should schedule an Update + // effect even though we're bailing out, so that cWU/cDU are called. + if (typeof instance.componentDidUpdate === 'function') { + if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) { + workInProgress.effectTag |= Update; + } } - throwOnInvalidObjectType(returnFiber, newChild); - } + if (typeof instance.getSnapshotBeforeUpdate === 'function') { + if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) { + workInProgress.effectTag |= Snapshot; + } + } // If shouldComponentUpdate returned false, we should still update the + // memoized props/state to indicate that this work can be reused. - { - if (typeof newChild === 'function') { - warnOnFunctionType(); - } - } - return null; - } + workInProgress.memoizedProps = newProps; + workInProgress.memoizedState = newState; + } // Update the existing instance's state, props, and context pointers even + // if shouldComponentUpdate returns false. - function updateSlot(returnFiber, oldFiber, newChild, expirationTime) { - // Update the fiber if the keys match, otherwise return null. - var key = oldFiber !== null ? oldFiber.key : null; - if (typeof newChild === 'string' || typeof newChild === 'number') { - // Text nodes don't have keys. If the previous node is implicitly keyed - // we can continue to replace it without aborting even if it is not a text - // node. - if (key !== null) { - return null; - } + instance.props = newProps; + instance.state = newState; + instance.context = nextContext; + return shouldUpdate; + } - return updateTextNode(returnFiber, oldFiber, '' + newChild, expirationTime); - } + var didWarnAboutMaps; + var didWarnAboutGenerators; + var didWarnAboutStringRefs; + var ownerHasKeyUseWarning; + var ownerHasFunctionTypeWarning; - if (typeof newChild === 'object' && newChild !== null) { - switch (newChild.$$typeof) { - case REACT_ELEMENT_TYPE: - { - if (newChild.key === key) { - if (newChild.type === REACT_FRAGMENT_TYPE) { - return updateFragment(returnFiber, oldFiber, newChild.props.children, expirationTime, key); - } + var warnForMissingKey = function (child) {}; - return updateElement(returnFiber, oldFiber, newChild, expirationTime); - } else { - return null; - } - } + { + didWarnAboutMaps = false; + didWarnAboutGenerators = false; + didWarnAboutStringRefs = {}; + /** + * Warn if there's no key explicitly set on dynamic arrays of children or + * object keys are not valid. This allows us to keep track of children between + * updates. + */ + + ownerHasKeyUseWarning = {}; + ownerHasFunctionTypeWarning = {}; + + warnForMissingKey = function (child) { + if (child === null || typeof child !== 'object') { + return; + } - case REACT_PORTAL_TYPE: - { - if (newChild.key === key) { - return updatePortal(returnFiber, oldFiber, newChild, expirationTime); - } else { - return null; - } - } + if (!child._store || child._store.validated || child.key != null) { + return; } - if (isArray(newChild) || getIteratorFn(newChild)) { - if (key !== null) { - return null; + if (!(typeof child._store === 'object')) { + { + throw Error( "React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue." ); } - - return updateFragment(returnFiber, oldFiber, newChild, expirationTime, null); } - throwOnInvalidObjectType(returnFiber, newChild); - } + child._store.validated = true; + var currentComponentErrorInfo = 'Each child in a list should have a unique ' + '"key" prop. See https://fb.me/react-warning-keys for ' + 'more information.' + getCurrentFiberStackInDev(); - { - if (typeof newChild === 'function') { - warnOnFunctionType(); + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; } - } - return null; + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; + + error('Each child in a list should have a unique ' + '"key" prop. See https://fb.me/react-warning-keys for ' + 'more information.'); + }; } - function updateFromMap(existingChildren, returnFiber, newIdx, newChild, expirationTime) { - if (typeof newChild === 'string' || typeof newChild === 'number') { - // Text nodes don't have keys, so we neither have to check the old nor - // new node for the key. If both are text nodes, they match. - var matchedFiber = existingChildren.get(newIdx) || null; - return updateTextNode(returnFiber, matchedFiber, '' + newChild, expirationTime); - } + var isArray$1 = Array.isArray; - if (typeof newChild === 'object' && newChild !== null) { - switch (newChild.$$typeof) { - case REACT_ELEMENT_TYPE: - { - var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null; + function coerceRef(returnFiber, current, element) { + var mixedRef = element.ref; - if (newChild.type === REACT_FRAGMENT_TYPE) { - return updateFragment(returnFiber, _matchedFiber, newChild.props.children, expirationTime, newChild.key); + if (mixedRef !== null && typeof mixedRef !== 'function' && typeof mixedRef !== 'object') { + { + // TODO: Clean this up once we turn on the string ref warning for + // everyone, because the strict mode case will no longer be relevant + if ((returnFiber.mode & StrictMode || warnAboutStringRefs) && // We warn in ReactElement.js if owner and self are equal for string refs + // because these cannot be automatically converted to an arrow function + // using a codemod. Therefore, we don't have to warn about string refs again. + !(element._owner && element._self && element._owner.stateNode !== element._self)) { + var componentName = getComponentName(returnFiber.type) || 'Component'; + + if (!didWarnAboutStringRefs[componentName]) { + { + error('A string ref, "%s", has been found within a strict mode tree. ' + 'String refs are a source of potential bugs and should be avoided. ' + 'We recommend using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref%s', mixedRef, getStackByFiberInDevAndProd(returnFiber)); } - return updateElement(returnFiber, _matchedFiber, newChild, expirationTime); - } - - case REACT_PORTAL_TYPE: - { - var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null; - - return updatePortal(returnFiber, _matchedFiber2, newChild, expirationTime); + didWarnAboutStringRefs[componentName] = true; } + } } - if (isArray(newChild) || getIteratorFn(newChild)) { - var _matchedFiber3 = existingChildren.get(newIdx) || null; + if (element._owner) { + var owner = element._owner; + var inst; - return updateFragment(returnFiber, _matchedFiber3, newChild, expirationTime, null); - } + if (owner) { + var ownerFiber = owner; - throwOnInvalidObjectType(returnFiber, newChild); - } + if (!(ownerFiber.tag === ClassComponent)) { + { + throw Error( "Function components cannot have string refs. We recommend using useRef() instead. Learn more about using refs safely here: https://fb.me/react-strict-mode-string-ref" ); + } + } - { - if (typeof newChild === 'function') { - warnOnFunctionType(); - } - } + inst = ownerFiber.stateNode; + } - return null; - } - /** - * Warns if there is a duplicate or missing key - */ + if (!inst) { + { + throw Error( "Missing owner for string ref " + mixedRef + ". This error is likely caused by a bug in React. Please file an issue." ); + } + } + var stringRef = '' + mixedRef; // Check if previous string ref matches new string ref - function warnOnInvalidKey(child, knownKeys) { - { - if (typeof child !== 'object' || child === null) { - return knownKeys; - } + if (current !== null && current.ref !== null && typeof current.ref === 'function' && current.ref._stringRef === stringRef) { + return current.ref; + } - switch (child.$$typeof) { - case REACT_ELEMENT_TYPE: - case REACT_PORTAL_TYPE: - warnForMissingKey(child); - var key = child.key; + var ref = function (value) { + var refs = inst.refs; - if (typeof key !== 'string') { - break; + if (refs === emptyRefsObject) { + // This is a lazy pooled frozen object, so we need to initialize. + refs = inst.refs = {}; } - if (knownKeys === null) { - knownKeys = new Set(); - knownKeys.add(key); - break; + if (value === null) { + delete refs[stringRef]; + } else { + refs[stringRef] = value; } + }; - if (!knownKeys.has(key)) { - knownKeys.add(key); - break; + ref._stringRef = stringRef; + return ref; + } else { + if (!(typeof mixedRef === 'string')) { + { + throw Error( "Expected ref to be a function, a string, an object returned by React.createRef(), or null." ); } + } - warning$1(false, 'Encountered two children with the same key, `%s`. ' + 'Keys should be unique so that components maintain their identity ' + 'across updates. Non-unique keys may cause children to be ' + 'duplicated and/or omitted — the behavior is unsupported and ' + 'could change in a future version.', key); - break; - - default: - break; + if (!element._owner) { + { + throw Error( "Element ref was specified as a string (" + mixedRef + ") but no owner was set. This could happen for one of the following reasons:\n1. You may be adding a ref to a function component\n2. You may be adding a ref to a component that was not created inside a component's render method\n3. You have multiple copies of React loaded\nSee https://fb.me/react-refs-must-have-owner for more information." ); + } + } } } - return knownKeys; + return mixedRef; } - function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, expirationTime) { - // This algorithm can't optimize by searching from both ends since we - // don't have backpointers on fibers. I'm trying to see how far we can get - // with that model. If it ends up not being worth the tradeoffs, we can - // add it later. - // Even with a two ended optimization, we'd want to optimize for the case - // where there are few changes and brute force the comparison instead of - // going for the Map. It'd like to explore hitting that path first in - // forward-only mode and only go for the Map once we notice that we need - // lots of look ahead. This doesn't handle reversal as well as two ended - // search but that's unusual. Besides, for the two ended optimization to - // work on Iterables, we'd need to copy the whole set. - // In this first iteration, we'll just live with hitting the bad case - // (adding everything to a Map) in for every insert/move. - // If you change this code, also update reconcileChildrenIterator() which - // uses the same algorithm. - { - // First, validate keys. - var knownKeys = null; + function throwOnInvalidObjectType(returnFiber, newChild) { + if (returnFiber.type !== 'textarea') { + var addendum = ''; + + { + addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + getCurrentFiberStackInDev(); + } - for (var i = 0; i < newChildren.length; i++) { - var child = newChildren[i]; - knownKeys = warnOnInvalidKey(child, knownKeys); + { + { + throw Error( "Objects are not valid as a React child (found: " + (Object.prototype.toString.call(newChild) === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : newChild) + ")." + addendum ); + } } } + } - var resultingFirstChild = null; - var previousNewFiber = null; - var oldFiber = currentFirstChild; - var lastPlacedIndex = 0; - var newIdx = 0; - var nextOldFiber = null; + function warnOnFunctionType() { + { + var currentComponentErrorInfo = 'Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.' + getCurrentFiberStackInDev(); - for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) { - if (oldFiber.index > newIdx) { - nextOldFiber = oldFiber; - oldFiber = null; - } else { - nextOldFiber = oldFiber.sibling; + if (ownerHasFunctionTypeWarning[currentComponentErrorInfo]) { + return; } - var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], expirationTime); + ownerHasFunctionTypeWarning[currentComponentErrorInfo] = true; - if (newFiber === null) { - // TODO: This breaks on empty slots like null children. That's - // unfortunate because it triggers the slow path all the time. We need - // a better way to communicate whether this was a miss or null, - // boolean, undefined, etc. - if (oldFiber === null) { - oldFiber = nextOldFiber; - } + error('Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.'); + } + } // This wrapper function exists because I expect to clone the code in each path + // to be able to optimize each path individually by branching early. This needs + // a compiler or we can do it manually. Helpers that don't need this branching + // live outside of this function. - break; - } - if (shouldTrackSideEffects) { - if (oldFiber && newFiber.alternate === null) { - // We matched the slot, but we didn't reuse the existing fiber, so we - // need to delete the existing child. - deleteChild(returnFiber, oldFiber); - } - } + function ChildReconciler(shouldTrackSideEffects) { + function deleteChild(returnFiber, childToDelete) { + if (!shouldTrackSideEffects) { + // Noop. + return; + } // Deletions are added in reversed order so we add it to the front. + // At this point, the return fiber's effect list is empty except for + // deletions, so we can just append the deletion to the list. The remaining + // effects aren't added until the complete phase. Once we implement + // resuming, this may not be true. + - lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx); + var last = returnFiber.lastEffect; - if (previousNewFiber === null) { - // TODO: Move out of the loop. This only happens for the first run. - resultingFirstChild = newFiber; + if (last !== null) { + last.nextEffect = childToDelete; + returnFiber.lastEffect = childToDelete; } else { - // TODO: Defer siblings if we're not at the right index for this slot. - // I.e. if we had null values before, then we want to defer this - // for each null value. However, we also don't want to call updateSlot - // with the previous one. - previousNewFiber.sibling = newFiber; + returnFiber.firstEffect = returnFiber.lastEffect = childToDelete; } - previousNewFiber = newFiber; - oldFiber = nextOldFiber; + childToDelete.nextEffect = null; + childToDelete.effectTag = Deletion; } - if (newIdx === newChildren.length) { - // We've reached the end of the new children. We can delete the rest. - deleteRemainingChildren(returnFiber, oldFiber); - return resultingFirstChild; - } + function deleteRemainingChildren(returnFiber, currentFirstChild) { + if (!shouldTrackSideEffects) { + // Noop. + return null; + } // TODO: For the shouldClone case, this could be micro-optimized a bit by + // assuming that after the first child we've already added everything. - if (oldFiber === null) { - // If we don't have any more existing children we can choose a fast path - // since the rest will all be insertions. - for (; newIdx < newChildren.length; newIdx++) { - var _newFiber = createChild(returnFiber, newChildren[newIdx], expirationTime); - if (_newFiber === null) { - continue; - } + var childToDelete = currentFirstChild; - lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx); + while (childToDelete !== null) { + deleteChild(returnFiber, childToDelete); + childToDelete = childToDelete.sibling; + } - if (previousNewFiber === null) { - // TODO: Move out of the loop. This only happens for the first run. - resultingFirstChild = _newFiber; + return null; + } + + function mapRemainingChildren(returnFiber, currentFirstChild) { + // Add the remaining children to a temporary map so that we can find them by + // keys quickly. Implicit (null) keys get added to this set with their index + // instead. + var existingChildren = new Map(); + var existingChild = currentFirstChild; + + while (existingChild !== null) { + if (existingChild.key !== null) { + existingChildren.set(existingChild.key, existingChild); } else { - previousNewFiber.sibling = _newFiber; + existingChildren.set(existingChild.index, existingChild); } - previousNewFiber = _newFiber; + existingChild = existingChild.sibling; } - return resultingFirstChild; - } // Add all children to a key map for quick lookups. + return existingChildren; + } + function useFiber(fiber, pendingProps) { + // We currently set sibling to null and index to 0 here because it is easy + // to forget to do before returning it. E.g. for the single child case. + var clone = createWorkInProgress(fiber, pendingProps); + clone.index = 0; + clone.sibling = null; + return clone; + } - var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves. + function placeChild(newFiber, lastPlacedIndex, newIndex) { + newFiber.index = newIndex; - for (; newIdx < newChildren.length; newIdx++) { - var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], expirationTime); + if (!shouldTrackSideEffects) { + // Noop. + return lastPlacedIndex; + } - if (_newFiber2 !== null) { - if (shouldTrackSideEffects) { - if (_newFiber2.alternate !== null) { - // The new fiber is a work in progress, but if there exists a - // current, that means that we reused the fiber. We need to delete - // it from the child list so that we don't add it to the deletion - // list. - existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key); - } - } + var current = newFiber.alternate; - lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx); + if (current !== null) { + var oldIndex = current.index; - if (previousNewFiber === null) { - resultingFirstChild = _newFiber2; + if (oldIndex < lastPlacedIndex) { + // This is a move. + newFiber.effectTag = Placement; + return lastPlacedIndex; } else { - previousNewFiber.sibling = _newFiber2; + // This item can stay in place. + return oldIndex; } + } else { + // This is an insertion. + newFiber.effectTag = Placement; + return lastPlacedIndex; + } + } - previousNewFiber = _newFiber2; + function placeSingleChild(newFiber) { + // This is simpler for the single child case. We only need to do a + // placement for inserting new children. + if (shouldTrackSideEffects && newFiber.alternate === null) { + newFiber.effectTag = Placement; } + + return newFiber; } - if (shouldTrackSideEffects) { - // Any existing children that weren't consumed above were deleted. We need - // to add them to the deletion list. - existingChildren.forEach(function (child) { - return deleteChild(returnFiber, child); - }); - } - - return resultingFirstChild; - } - - function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, expirationTime) { - // This is the same implementation as reconcileChildrenArray(), - // but using the iterator instead. - var iteratorFn = getIteratorFn(newChildrenIterable); - - if (!(typeof iteratorFn === 'function')) { - { - throw Error("An object is not an iterable. This error is likely caused by a bug in React. Please file an issue."); + function updateTextNode(returnFiber, current, textContent, expirationTime) { + if (current === null || current.tag !== HostText) { + // Insert + var created = createFiberFromText(textContent, returnFiber.mode, expirationTime); + created.return = returnFiber; + return created; + } else { + // Update + var existing = useFiber(current, textContent); + existing.return = returnFiber; + return existing; } } - { - // We don't support rendering Generators because it's a mutation. - // See https://github.com/facebook/react/issues/12995 - if (typeof Symbol === 'function' && // $FlowFixMe Flow doesn't know about toStringTag - newChildrenIterable[Symbol.toStringTag] === 'Generator') { - !didWarnAboutGenerators ? warning$1(false, 'Using Generators as children is unsupported and will likely yield ' + 'unexpected results because enumerating a generator mutates it. ' + 'You may convert it to an array with `Array.from()` or the ' + '`[...spread]` operator before rendering. Keep in mind ' + 'you might need to polyfill these features for older browsers.') : void 0; - didWarnAboutGenerators = true; - } // Warn about using Maps as children - - - if (newChildrenIterable.entries === iteratorFn) { - !didWarnAboutMaps ? warning$1(false, 'Using Maps as children is unsupported and will likely yield ' + 'unexpected results. Convert it to a sequence/iterable of keyed ' + 'ReactElements instead.') : void 0; - didWarnAboutMaps = true; - } // First, validate keys. - // We'll get a different iterator later for the main pass. + function updateElement(returnFiber, current, element, expirationTime) { + if (current !== null) { + if (current.elementType === element.type || ( // Keep this check inline so it only runs on the false path: + isCompatibleFamilyForHotReloading(current, element) )) { + // Move based on index + var existing = useFiber(current, element.props); + existing.ref = coerceRef(returnFiber, current, element); + existing.return = returnFiber; + { + existing._debugSource = element._source; + existing._debugOwner = element._owner; + } - var _newChildren = iteratorFn.call(newChildrenIterable); + return existing; + } + } // Insert - if (_newChildren) { - var knownKeys = null; - var _step = _newChildren.next(); + var created = createFiberFromElement(element, returnFiber.mode, expirationTime); + created.ref = coerceRef(returnFiber, current, element); + created.return = returnFiber; + return created; + } - for (; !_step.done; _step = _newChildren.next()) { - var child = _step.value; - knownKeys = warnOnInvalidKey(child, knownKeys); - } + function updatePortal(returnFiber, current, portal, expirationTime) { + if (current === null || current.tag !== HostPortal || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) { + // Insert + var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime); + created.return = returnFiber; + return created; + } else { + // Update + var existing = useFiber(current, portal.children || []); + existing.return = returnFiber; + return existing; } } - var newChildren = iteratorFn.call(newChildrenIterable); - - if (!(newChildren != null)) { - { - throw Error("An iterable object provided no iterator."); + function updateFragment(returnFiber, current, fragment, expirationTime, key) { + if (current === null || current.tag !== Fragment) { + // Insert + var created = createFiberFromFragment(fragment, returnFiber.mode, expirationTime, key); + created.return = returnFiber; + return created; + } else { + // Update + var existing = useFiber(current, fragment); + existing.return = returnFiber; + return existing; } } - var resultingFirstChild = null; - var previousNewFiber = null; - var oldFiber = currentFirstChild; - var lastPlacedIndex = 0; - var newIdx = 0; - var nextOldFiber = null; - var step = newChildren.next(); - - for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) { - if (oldFiber.index > newIdx) { - nextOldFiber = oldFiber; - oldFiber = null; - } else { - nextOldFiber = oldFiber.sibling; + function createChild(returnFiber, newChild, expirationTime) { + if (typeof newChild === 'string' || typeof newChild === 'number') { + // Text nodes don't have keys. If the previous node is implicitly keyed + // we can continue to replace it without aborting even if it is not a text + // node. + var created = createFiberFromText('' + newChild, returnFiber.mode, expirationTime); + created.return = returnFiber; + return created; } - var newFiber = updateSlot(returnFiber, oldFiber, step.value, expirationTime); + if (typeof newChild === 'object' && newChild !== null) { + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: + { + var _created = createFiberFromElement(newChild, returnFiber.mode, expirationTime); + + _created.ref = coerceRef(returnFiber, null, newChild); + _created.return = returnFiber; + return _created; + } + + case REACT_PORTAL_TYPE: + { + var _created2 = createFiberFromPortal(newChild, returnFiber.mode, expirationTime); - if (newFiber === null) { - // TODO: This breaks on empty slots like null children. That's - // unfortunate because it triggers the slow path all the time. We need - // a better way to communicate whether this was a miss or null, - // boolean, undefined, etc. - if (oldFiber === null) { - oldFiber = nextOldFiber; + _created2.return = returnFiber; + return _created2; + } } - break; + if (isArray$1(newChild) || getIteratorFn(newChild)) { + var _created3 = createFiberFromFragment(newChild, returnFiber.mode, expirationTime, null); + + _created3.return = returnFiber; + return _created3; + } + + throwOnInvalidObjectType(returnFiber, newChild); } - if (shouldTrackSideEffects) { - if (oldFiber && newFiber.alternate === null) { - // We matched the slot, but we didn't reuse the existing fiber, so we - // need to delete the existing child. - deleteChild(returnFiber, oldFiber); + { + if (typeof newChild === 'function') { + warnOnFunctionType(); } } - lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx); + return null; + } - if (previousNewFiber === null) { - // TODO: Move out of the loop. This only happens for the first run. - resultingFirstChild = newFiber; - } else { - // TODO: Defer siblings if we're not at the right index for this slot. - // I.e. if we had null values before, then we want to defer this - // for each null value. However, we also don't want to call updateSlot - // with the previous one. - previousNewFiber.sibling = newFiber; + function updateSlot(returnFiber, oldFiber, newChild, expirationTime) { + // Update the fiber if the keys match, otherwise return null. + var key = oldFiber !== null ? oldFiber.key : null; + + if (typeof newChild === 'string' || typeof newChild === 'number') { + // Text nodes don't have keys. If the previous node is implicitly keyed + // we can continue to replace it without aborting even if it is not a text + // node. + if (key !== null) { + return null; + } + + return updateTextNode(returnFiber, oldFiber, '' + newChild, expirationTime); } - previousNewFiber = newFiber; - oldFiber = nextOldFiber; - } + if (typeof newChild === 'object' && newChild !== null) { + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: + { + if (newChild.key === key) { + if (newChild.type === REACT_FRAGMENT_TYPE) { + return updateFragment(returnFiber, oldFiber, newChild.props.children, expirationTime, key); + } - if (step.done) { - // We've reached the end of the new children. We can delete the rest. - deleteRemainingChildren(returnFiber, oldFiber); - return resultingFirstChild; - } + return updateElement(returnFiber, oldFiber, newChild, expirationTime); + } else { + return null; + } + } - if (oldFiber === null) { - // If we don't have any more existing children we can choose a fast path - // since the rest will all be insertions. - for (; !step.done; newIdx++, step = newChildren.next()) { - var _newFiber3 = createChild(returnFiber, step.value, expirationTime); + case REACT_PORTAL_TYPE: + { + if (newChild.key === key) { + return updatePortal(returnFiber, oldFiber, newChild, expirationTime); + } else { + return null; + } + } + } - if (_newFiber3 === null) { - continue; + if (isArray$1(newChild) || getIteratorFn(newChild)) { + if (key !== null) { + return null; + } + + return updateFragment(returnFiber, oldFiber, newChild, expirationTime, null); } - lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx); + throwOnInvalidObjectType(returnFiber, newChild); + } - if (previousNewFiber === null) { - // TODO: Move out of the loop. This only happens for the first run. - resultingFirstChild = _newFiber3; - } else { - previousNewFiber.sibling = _newFiber3; + { + if (typeof newChild === 'function') { + warnOnFunctionType(); } + } + + return null; + } - previousNewFiber = _newFiber3; + function updateFromMap(existingChildren, returnFiber, newIdx, newChild, expirationTime) { + if (typeof newChild === 'string' || typeof newChild === 'number') { + // Text nodes don't have keys, so we neither have to check the old nor + // new node for the key. If both are text nodes, they match. + var matchedFiber = existingChildren.get(newIdx) || null; + return updateTextNode(returnFiber, matchedFiber, '' + newChild, expirationTime); } - return resultingFirstChild; - } // Add all children to a key map for quick lookups. + if (typeof newChild === 'object' && newChild !== null) { + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: + { + var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null; + if (newChild.type === REACT_FRAGMENT_TYPE) { + return updateFragment(returnFiber, _matchedFiber, newChild.props.children, expirationTime, newChild.key); + } - var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves. + return updateElement(returnFiber, _matchedFiber, newChild, expirationTime); + } - for (; !step.done; newIdx++, step = newChildren.next()) { - var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, expirationTime); + case REACT_PORTAL_TYPE: + { + var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null; - if (_newFiber4 !== null) { - if (shouldTrackSideEffects) { - if (_newFiber4.alternate !== null) { - // The new fiber is a work in progress, but if there exists a - // current, that means that we reused the fiber. We need to delete - // it from the child list so that we don't add it to the deletion - // list. - existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key); - } + return updatePortal(returnFiber, _matchedFiber2, newChild, expirationTime); + } } - lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx); + if (isArray$1(newChild) || getIteratorFn(newChild)) { + var _matchedFiber3 = existingChildren.get(newIdx) || null; - if (previousNewFiber === null) { - resultingFirstChild = _newFiber4; - } else { - previousNewFiber.sibling = _newFiber4; + return updateFragment(returnFiber, _matchedFiber3, newChild, expirationTime, null); } - previousNewFiber = _newFiber4; + throwOnInvalidObjectType(returnFiber, newChild); } - } - if (shouldTrackSideEffects) { - // Any existing children that weren't consumed above were deleted. We need - // to add them to the deletion list. - existingChildren.forEach(function (child) { - return deleteChild(returnFiber, child); - }); + { + if (typeof newChild === 'function') { + warnOnFunctionType(); + } + } + + return null; } + /** + * Warns if there is a duplicate or missing key + */ - return resultingFirstChild; - } - function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, expirationTime) { - // There's no need to check for keys on text nodes since we don't have a - // way to define them. - if (currentFirstChild !== null && currentFirstChild.tag === HostText) { - // We already have an existing node so let's just update it and delete - // the rest. - deleteRemainingChildren(returnFiber, currentFirstChild.sibling); - var existing = useFiber(currentFirstChild, textContent, expirationTime); - existing.return = returnFiber; - return existing; - } // The existing first child is not a text node so we need to create one - // and delete the existing ones. + function warnOnInvalidKey(child, knownKeys) { + { + if (typeof child !== 'object' || child === null) { + return knownKeys; + } + switch (child.$$typeof) { + case REACT_ELEMENT_TYPE: + case REACT_PORTAL_TYPE: + warnForMissingKey(child); + var key = child.key; - deleteRemainingChildren(returnFiber, currentFirstChild); - var created = createFiberFromText(textContent, returnFiber.mode, expirationTime); - created.return = returnFiber; - return created; - } + if (typeof key !== 'string') { + break; + } - function reconcileSingleElement(returnFiber, currentFirstChild, element, expirationTime) { - var key = element.key; - var child = currentFirstChild; + if (knownKeys === null) { + knownKeys = new Set(); + knownKeys.add(key); + break; + } - while (child !== null) { - // TODO: If key === null and child.key === null, then this only applies to - // the first item in the list. - if (child.key === key) { - if (child.tag === Fragment ? element.type === REACT_FRAGMENT_TYPE : child.elementType === element.type || ( // Keep this check inline so it only runs on the false path: - isCompatibleFamilyForHotReloading(child, element))) { - deleteRemainingChildren(returnFiber, child.sibling); - var existing = useFiber(child, element.type === REACT_FRAGMENT_TYPE ? element.props.children : element.props, expirationTime); - existing.ref = coerceRef(returnFiber, child, element); - existing.return = returnFiber; + if (!knownKeys.has(key)) { + knownKeys.add(key); + break; + } - { - existing._debugSource = element._source; - existing._debugOwner = element._owner; - } + error('Encountered two children with the same key, `%s`. ' + 'Keys should be unique so that components maintain their identity ' + 'across updates. Non-unique keys may cause children to be ' + 'duplicated and/or omitted — the behavior is unsupported and ' + 'could change in a future version.', key); - return existing; - } else { - deleteRemainingChildren(returnFiber, child); - break; + break; } - } else { - deleteChild(returnFiber, child); } - child = child.sibling; + return knownKeys; } - if (element.type === REACT_FRAGMENT_TYPE) { - var created = createFiberFromFragment(element.props.children, returnFiber.mode, expirationTime, element.key); - created.return = returnFiber; - return created; - } else { - var _created4 = createFiberFromElement(element, returnFiber.mode, expirationTime); + function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, expirationTime) { + // This algorithm can't optimize by searching from both ends since we + // don't have backpointers on fibers. I'm trying to see how far we can get + // with that model. If it ends up not being worth the tradeoffs, we can + // add it later. + // Even with a two ended optimization, we'd want to optimize for the case + // where there are few changes and brute force the comparison instead of + // going for the Map. It'd like to explore hitting that path first in + // forward-only mode and only go for the Map once we notice that we need + // lots of look ahead. This doesn't handle reversal as well as two ended + // search but that's unusual. Besides, for the two ended optimization to + // work on Iterables, we'd need to copy the whole set. + // In this first iteration, we'll just live with hitting the bad case + // (adding everything to a Map) in for every insert/move. + // If you change this code, also update reconcileChildrenIterator() which + // uses the same algorithm. + { + // First, validate keys. + var knownKeys = null; - _created4.ref = coerceRef(returnFiber, currentFirstChild, element); - _created4.return = returnFiber; - return _created4; - } - } + for (var i = 0; i < newChildren.length; i++) { + var child = newChildren[i]; + knownKeys = warnOnInvalidKey(child, knownKeys); + } + } - function reconcileSinglePortal(returnFiber, currentFirstChild, portal, expirationTime) { - var key = portal.key; - var child = currentFirstChild; + var resultingFirstChild = null; + var previousNewFiber = null; + var oldFiber = currentFirstChild; + var lastPlacedIndex = 0; + var newIdx = 0; + var nextOldFiber = null; - while (child !== null) { - // TODO: If key === null and child.key === null, then this only applies to - // the first item in the list. - if (child.key === key) { - if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) { - deleteRemainingChildren(returnFiber, child.sibling); - var existing = useFiber(child, portal.children || [], expirationTime); - existing.return = returnFiber; - return existing; + for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) { + if (oldFiber.index > newIdx) { + nextOldFiber = oldFiber; + oldFiber = null; } else { - deleteRemainingChildren(returnFiber, child); - break; + nextOldFiber = oldFiber.sibling; } - } else { - deleteChild(returnFiber, child); - } - child = child.sibling; - } - - var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime); - created.return = returnFiber; - return created; - } // This API will tag the children with the side-effect of the reconciliation - // itself. They will be added to the side-effect list as we pass through the - // children and the parent. + var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], expirationTime); + if (newFiber === null) { + // TODO: This breaks on empty slots like null children. That's + // unfortunate because it triggers the slow path all the time. We need + // a better way to communicate whether this was a miss or null, + // boolean, undefined, etc. + if (oldFiber === null) { + oldFiber = nextOldFiber; + } - function reconcileChildFibers(returnFiber, currentFirstChild, newChild, expirationTime) { - // This function is not recursive. - // If the top level item is an array, we treat it as a set of children, - // not as a fragment. Nested arrays on the other hand will be treated as - // fragment nodes. Recursion happens at the normal flow. - // Handle top level unkeyed fragments as if they were arrays. - // This leads to an ambiguity between <>{[...]}</> and <>...</>. - // We treat the ambiguous cases above the same. - var isUnkeyedTopLevelFragment = typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null; + break; + } - if (isUnkeyedTopLevelFragment) { - newChild = newChild.props.children; - } // Handle object types + if (shouldTrackSideEffects) { + if (oldFiber && newFiber.alternate === null) { + // We matched the slot, but we didn't reuse the existing fiber, so we + // need to delete the existing child. + deleteChild(returnFiber, oldFiber); + } + } + lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx); - var isObject = typeof newChild === 'object' && newChild !== null; + if (previousNewFiber === null) { + // TODO: Move out of the loop. This only happens for the first run. + resultingFirstChild = newFiber; + } else { + // TODO: Defer siblings if we're not at the right index for this slot. + // I.e. if we had null values before, then we want to defer this + // for each null value. However, we also don't want to call updateSlot + // with the previous one. + previousNewFiber.sibling = newFiber; + } - if (isObject) { - switch (newChild.$$typeof) { - case REACT_ELEMENT_TYPE: - return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, expirationTime)); + previousNewFiber = newFiber; + oldFiber = nextOldFiber; + } - case REACT_PORTAL_TYPE: - return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, expirationTime)); + if (newIdx === newChildren.length) { + // We've reached the end of the new children. We can delete the rest. + deleteRemainingChildren(returnFiber, oldFiber); + return resultingFirstChild; } - } - if (typeof newChild === 'string' || typeof newChild === 'number') { - return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, expirationTime)); - } + if (oldFiber === null) { + // If we don't have any more existing children we can choose a fast path + // since the rest will all be insertions. + for (; newIdx < newChildren.length; newIdx++) { + var _newFiber = createChild(returnFiber, newChildren[newIdx], expirationTime); - if (isArray(newChild)) { - return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, expirationTime); - } + if (_newFiber === null) { + continue; + } - if (getIteratorFn(newChild)) { - return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, expirationTime); - } + lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx); - if (isObject) { - throwOnInvalidObjectType(returnFiber, newChild); - } + if (previousNewFiber === null) { + // TODO: Move out of the loop. This only happens for the first run. + resultingFirstChild = _newFiber; + } else { + previousNewFiber.sibling = _newFiber; + } - { - if (typeof newChild === 'function') { - warnOnFunctionType(); - } - } + previousNewFiber = _newFiber; + } - if (typeof newChild === 'undefined' && !isUnkeyedTopLevelFragment) { - // If the new child is undefined, and the return fiber is a composite - // component, throw an error. If Fiber return types are disabled, - // we already threw above. - switch (returnFiber.tag) { - case ClassComponent: - { - { - var instance = returnFiber.stateNode; + return resultingFirstChild; + } // Add all children to a key map for quick lookups. - if (instance.render._isMockFunction) { - // We allow auto-mocks to proceed as if they're returning null. - break; - } + + var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves. + + for (; newIdx < newChildren.length; newIdx++) { + var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], expirationTime); + + if (_newFiber2 !== null) { + if (shouldTrackSideEffects) { + if (_newFiber2.alternate !== null) { + // The new fiber is a work in progress, but if there exists a + // current, that means that we reused the fiber. We need to delete + // it from the child list so that we don't add it to the deletion + // list. + existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key); } } - // Intentionally fall through to the next case, which handles both - // functions and classes - // eslint-disable-next-lined no-fallthrough - case FunctionComponent: - { - var Component = returnFiber.type; + lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx); - { - { - throw Error((Component.displayName || Component.name || 'Component') + "(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null."); - } - } + if (previousNewFiber === null) { + resultingFirstChild = _newFiber2; + } else { + previousNewFiber.sibling = _newFiber2; } + + previousNewFiber = _newFiber2; + } } - } // Remaining cases are all treated as empty. + if (shouldTrackSideEffects) { + // Any existing children that weren't consumed above were deleted. We need + // to add them to the deletion list. + existingChildren.forEach(function (child) { + return deleteChild(returnFiber, child); + }); + } - return deleteRemainingChildren(returnFiber, currentFirstChild); - } + return resultingFirstChild; + } - return reconcileChildFibers; -} + function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, expirationTime) { + // This is the same implementation as reconcileChildrenArray(), + // but using the iterator instead. + var iteratorFn = getIteratorFn(newChildrenIterable); -var reconcileChildFibers = ChildReconciler(true); -var mountChildFibers = ChildReconciler(false); -function cloneChildFibers(current$$1, workInProgress) { - if (!(current$$1 === null || workInProgress.child === current$$1.child)) { - { - throw Error("Resuming work not yet implemented."); - } - } + if (!(typeof iteratorFn === 'function')) { + { + throw Error( "An object is not an iterable. This error is likely caused by a bug in React. Please file an issue." ); + } + } - if (workInProgress.child === null) { - return; - } + { + // We don't support rendering Generators because it's a mutation. + // See https://github.com/facebook/react/issues/12995 + if (typeof Symbol === 'function' && // $FlowFixMe Flow doesn't know about toStringTag + newChildrenIterable[Symbol.toStringTag] === 'Generator') { + if (!didWarnAboutGenerators) { + error('Using Generators as children is unsupported and will likely yield ' + 'unexpected results because enumerating a generator mutates it. ' + 'You may convert it to an array with `Array.from()` or the ' + '`[...spread]` operator before rendering. Keep in mind ' + 'you might need to polyfill these features for older browsers.'); + } - var currentChild = workInProgress.child; - var newChild = createWorkInProgress(currentChild, currentChild.pendingProps, currentChild.expirationTime); - workInProgress.child = newChild; - newChild.return = workInProgress; + didWarnAboutGenerators = true; + } // Warn about using Maps as children - while (currentChild.sibling !== null) { - currentChild = currentChild.sibling; - newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps, currentChild.expirationTime); - newChild.return = workInProgress; - } - newChild.sibling = null; -} // Reset a workInProgress child set to prepare it for a second pass. + if (newChildrenIterable.entries === iteratorFn) { + if (!didWarnAboutMaps) { + error('Using Maps as children is unsupported and will likely yield ' + 'unexpected results. Convert it to a sequence/iterable of keyed ' + 'ReactElements instead.'); + } -function resetChildFibers(workInProgress, renderExpirationTime) { - var child = workInProgress.child; + didWarnAboutMaps = true; + } // First, validate keys. + // We'll get a different iterator later for the main pass. - while (child !== null) { - resetWorkInProgress(child, renderExpirationTime); - child = child.sibling; - } -} -var NO_CONTEXT = {}; -var contextStackCursor$1 = createCursor(NO_CONTEXT); -var contextFiberStackCursor = createCursor(NO_CONTEXT); -var rootInstanceStackCursor = createCursor(NO_CONTEXT); + var _newChildren = iteratorFn.call(newChildrenIterable); -function requiredContext(c) { - if (!(c !== NO_CONTEXT)) { - { - throw Error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."); - } - } - - return c; -} - -function getRootHostContainer() { - var rootInstance = requiredContext(rootInstanceStackCursor.current); - return rootInstance; -} - -function pushHostContainer(fiber, nextRootInstance) { - // Push current root instance onto the stack; - // This allows us to reset root when portals are popped. - push(rootInstanceStackCursor, nextRootInstance, fiber); // Track the context and the Fiber that provided it. - // This enables us to pop only Fibers that provide unique contexts. - - push(contextFiberStackCursor, fiber, fiber); // Finally, we need to push the host context to the stack. - // However, we can't just call getRootHostContext() and push it because - // we'd have a different number of entries on the stack depending on - // whether getRootHostContext() throws somewhere in renderer code or not. - // So we push an empty value first. This lets us safely unwind on errors. - - push(contextStackCursor$1, NO_CONTEXT, fiber); - var nextRootContext = getRootHostContext(nextRootInstance); // Now that we know this function doesn't throw, replace it. - - pop(contextStackCursor$1, fiber); - push(contextStackCursor$1, nextRootContext, fiber); -} - -function popHostContainer(fiber) { - pop(contextStackCursor$1, fiber); - pop(contextFiberStackCursor, fiber); - pop(rootInstanceStackCursor, fiber); -} - -function getHostContext() { - var context = requiredContext(contextStackCursor$1.current); - return context; -} - -function pushHostContext(fiber) { - var rootInstance = requiredContext(rootInstanceStackCursor.current); - var context = requiredContext(contextStackCursor$1.current); - var nextContext = getChildHostContext(context, fiber.type, rootInstance); // Don't push this Fiber's context unless it's unique. - - if (context === nextContext) { - return; - } // Track the context and the Fiber that provided it. - // This enables us to pop only Fibers that provide unique contexts. - - - push(contextFiberStackCursor, fiber, fiber); - push(contextStackCursor$1, nextContext, fiber); -} - -function popHostContext(fiber) { - // Do not pop unless this Fiber provided the current context. - // pushHostContext() only pushes Fibers that provide unique contexts. - if (contextFiberStackCursor.current !== fiber) { - return; - } - - pop(contextStackCursor$1, fiber); - pop(contextFiberStackCursor, fiber); -} - -var DefaultSuspenseContext = 0; // The Suspense Context is split into two parts. The lower bits is -// inherited deeply down the subtree. The upper bits only affect -// this immediate suspense boundary and gets reset each new -// boundary or suspense list. - -var SubtreeSuspenseContextMask = 1; // Subtree Flags: -// InvisibleParentSuspenseContext indicates that one of our parent Suspense -// boundaries is not currently showing visible main content. -// Either because it is already showing a fallback or is not mounted at all. -// We can use this to determine if it is desirable to trigger a fallback at -// the parent. If not, then we might need to trigger undesirable boundaries -// and/or suspend the commit to avoid hiding the parent content. - -var InvisibleParentSuspenseContext = 1; // Shallow Flags: -// ForceSuspenseFallback can be used by SuspenseList to force newly added -// items into their fallback state during one of the render passes. - -var ForceSuspenseFallback = 2; -var suspenseStackCursor = createCursor(DefaultSuspenseContext); -function hasSuspenseContext(parentContext, flag) { - return (parentContext & flag) !== 0; -} -function setDefaultShallowSuspenseContext(parentContext) { - return parentContext & SubtreeSuspenseContextMask; -} -function setShallowSuspenseContext(parentContext, shallowContext) { - return parentContext & SubtreeSuspenseContextMask | shallowContext; -} -function addSubtreeSuspenseContext(parentContext, subtreeContext) { - return parentContext | subtreeContext; -} -function pushSuspenseContext(fiber, newContext) { - push(suspenseStackCursor, newContext, fiber); -} -function popSuspenseContext(fiber) { - pop(suspenseStackCursor, fiber); -} - -function shouldCaptureSuspense(workInProgress, hasInvisibleParent) { - // If it was the primary children that just suspended, capture and render the - // fallback. Otherwise, don't capture and bubble to the next boundary. - var nextState = workInProgress.memoizedState; - - if (nextState !== null) { - if (nextState.dehydrated !== null) { - // A dehydrated boundary always captures. - return true; - } + if (_newChildren) { + var knownKeys = null; - return false; - } + var _step = _newChildren.next(); - var props = workInProgress.memoizedProps; // In order to capture, the Suspense component must have a fallback prop. + for (; !_step.done; _step = _newChildren.next()) { + var child = _step.value; + knownKeys = warnOnInvalidKey(child, knownKeys); + } + } + } - if (props.fallback === undefined) { - return false; - } // Regular boundaries always capture. + var newChildren = iteratorFn.call(newChildrenIterable); + if (!(newChildren != null)) { + { + throw Error( "An iterable object provided no iterator." ); + } + } - if (props.unstable_avoidThisFallback !== true) { - return true; - } // If it's a boundary we should avoid, then we prefer to bubble up to the - // parent boundary if it is currently invisible. + var resultingFirstChild = null; + var previousNewFiber = null; + var oldFiber = currentFirstChild; + var lastPlacedIndex = 0; + var newIdx = 0; + var nextOldFiber = null; + var step = newChildren.next(); + for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) { + if (oldFiber.index > newIdx) { + nextOldFiber = oldFiber; + oldFiber = null; + } else { + nextOldFiber = oldFiber.sibling; + } - if (hasInvisibleParent) { - return false; - } // If the parent is not able to handle it, we must handle it. + var newFiber = updateSlot(returnFiber, oldFiber, step.value, expirationTime); + if (newFiber === null) { + // TODO: This breaks on empty slots like null children. That's + // unfortunate because it triggers the slow path all the time. We need + // a better way to communicate whether this was a miss or null, + // boolean, undefined, etc. + if (oldFiber === null) { + oldFiber = nextOldFiber; + } - return true; -} -function findFirstSuspended(row) { - var node = row; + break; + } - while (node !== null) { - if (node.tag === SuspenseComponent) { - var state = node.memoizedState; + if (shouldTrackSideEffects) { + if (oldFiber && newFiber.alternate === null) { + // We matched the slot, but we didn't reuse the existing fiber, so we + // need to delete the existing child. + deleteChild(returnFiber, oldFiber); + } + } - if (state !== null) { - var dehydrated = state.dehydrated; + lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx); - if (dehydrated === null || isSuspenseInstancePending(dehydrated) || isSuspenseInstanceFallback(dehydrated)) { - return node; + if (previousNewFiber === null) { + // TODO: Move out of the loop. This only happens for the first run. + resultingFirstChild = newFiber; + } else { + // TODO: Defer siblings if we're not at the right index for this slot. + // I.e. if we had null values before, then we want to defer this + // for each null value. However, we also don't want to call updateSlot + // with the previous one. + previousNewFiber.sibling = newFiber; } + + previousNewFiber = newFiber; + oldFiber = nextOldFiber; } - } else if (node.tag === SuspenseListComponent && // revealOrder undefined can't be trusted because it don't - // keep track of whether it suspended or not. - node.memoizedProps.revealOrder !== undefined) { - var didSuspend = (node.effectTag & DidCapture) !== NoEffect; - if (didSuspend) { - return node; + if (step.done) { + // We've reached the end of the new children. We can delete the rest. + deleteRemainingChildren(returnFiber, oldFiber); + return resultingFirstChild; } - } else if (node.child !== null) { - node.child.return = node; - node = node.child; - continue; - } - if (node === row) { - return null; - } + if (oldFiber === null) { + // If we don't have any more existing children we can choose a fast path + // since the rest will all be insertions. + for (; !step.done; newIdx++, step = newChildren.next()) { + var _newFiber3 = createChild(returnFiber, step.value, expirationTime); - while (node.sibling === null) { - if (node.return === null || node.return === row) { - return null; - } + if (_newFiber3 === null) { + continue; + } - node = node.return; - } + lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx); - node.sibling.return = node.return; - node = node.sibling; - } + if (previousNewFiber === null) { + // TODO: Move out of the loop. This only happens for the first run. + resultingFirstChild = _newFiber3; + } else { + previousNewFiber.sibling = _newFiber3; + } - return null; -} + previousNewFiber = _newFiber3; + } -var emptyObject = {}; -var isArray$2 = Array.isArray; -function createResponderInstance(responder, responderProps, responderState, fiber) { - return { - fiber: fiber, - props: responderProps, - responder: responder, - rootEventTypes: null, - state: responderState - }; -} + return resultingFirstChild; + } // Add all children to a key map for quick lookups. -function mountEventResponder$1(responder, responderProps, fiber, respondersMap, rootContainerInstance) { - var responderState = emptyObject; - var getInitialState = responder.getInitialState; - if (getInitialState !== null) { - responderState = getInitialState(responderProps); - } + var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves. - var responderInstance = createResponderInstance(responder, responderProps, responderState, fiber); + for (; !step.done; newIdx++, step = newChildren.next()) { + var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, expirationTime); + + if (_newFiber4 !== null) { + if (shouldTrackSideEffects) { + if (_newFiber4.alternate !== null) { + // The new fiber is a work in progress, but if there exists a + // current, that means that we reused the fiber. We need to delete + // it from the child list so that we don't add it to the deletion + // list. + existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key); + } + } - if (!rootContainerInstance) { - var node = fiber; + lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx); - while (node !== null) { - var tag = node.tag; + if (previousNewFiber === null) { + resultingFirstChild = _newFiber4; + } else { + previousNewFiber.sibling = _newFiber4; + } - if (tag === HostComponent) { - rootContainerInstance = node.stateNode; - break; - } else if (tag === HostRoot) { - rootContainerInstance = node.stateNode.containerInfo; - break; + previousNewFiber = _newFiber4; + } } - node = node.return; - } - } - - mountResponderInstance(responder, responderInstance, responderProps, responderState, rootContainerInstance); - respondersMap.set(responder, responderInstance); -} - -function updateEventListener(listener, fiber, visistedResponders, respondersMap, rootContainerInstance) { - var responder; - var props; - - if (listener) { - responder = listener.responder; - props = listener.props; - } + if (shouldTrackSideEffects) { + // Any existing children that weren't consumed above were deleted. We need + // to add them to the deletion list. + existingChildren.forEach(function (child) { + return deleteChild(returnFiber, child); + }); + } - if (!(responder && responder.$$typeof === REACT_RESPONDER_TYPE)) { - { - throw Error("An invalid value was used as an event listener. Expect one or many event listeners created via React.unstable_useResponder()."); + return resultingFirstChild; } - } - var listenerProps = props; + function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, expirationTime) { + // There's no need to check for keys on text nodes since we don't have a + // way to define them. + if (currentFirstChild !== null && currentFirstChild.tag === HostText) { + // We already have an existing node so let's just update it and delete + // the rest. + deleteRemainingChildren(returnFiber, currentFirstChild.sibling); + var existing = useFiber(currentFirstChild, textContent); + existing.return = returnFiber; + return existing; + } // The existing first child is not a text node so we need to create one + // and delete the existing ones. - if (visistedResponders.has(responder)) { - // show warning - { - warning$1(false, 'Duplicate event responder "%s" found in event listeners. ' + 'Event listeners passed to elements cannot use the same event responder more than once.', responder.displayName); + + deleteRemainingChildren(returnFiber, currentFirstChild); + var created = createFiberFromText(textContent, returnFiber.mode, expirationTime); + created.return = returnFiber; + return created; } - return; - } + function reconcileSingleElement(returnFiber, currentFirstChild, element, expirationTime) { + var key = element.key; + var child = currentFirstChild; - visistedResponders.add(responder); - var responderInstance = respondersMap.get(responder); + while (child !== null) { + // TODO: If key === null and child.key === null, then this only applies to + // the first item in the list. + if (child.key === key) { + switch (child.tag) { + case Fragment: + { + if (element.type === REACT_FRAGMENT_TYPE) { + deleteRemainingChildren(returnFiber, child.sibling); + var existing = useFiber(child, element.props.children); + existing.return = returnFiber; + + { + existing._debugSource = element._source; + existing._debugOwner = element._owner; + } - if (responderInstance === undefined) { - // Mount (happens in either complete or commit phase) - mountEventResponder$1(responder, listenerProps, fiber, respondersMap, rootContainerInstance); - } else { - // Update (happens during commit phase only) - responderInstance.props = listenerProps; - responderInstance.fiber = fiber; - } -} + return existing; + } -function updateEventListeners(listeners, fiber, rootContainerInstance) { - var visistedResponders = new Set(); - var dependencies = fiber.dependencies; + break; + } - if (listeners != null) { - if (dependencies === null) { - dependencies = fiber.dependencies = { - expirationTime: NoWork, - firstContext: null, - responders: new Map() - }; - } + case Block: - var respondersMap = dependencies.responders; + // We intentionally fallthrough here if enableBlocksAPI is not on. + // eslint-disable-next-lined no-fallthrough - if (respondersMap === null) { - respondersMap = new Map(); - } + default: + { + if (child.elementType === element.type || ( // Keep this check inline so it only runs on the false path: + isCompatibleFamilyForHotReloading(child, element) )) { + deleteRemainingChildren(returnFiber, child.sibling); - if (isArray$2(listeners)) { - for (var i = 0, length = listeners.length; i < length; i++) { - var listener = listeners[i]; - updateEventListener(listener, fiber, visistedResponders, respondersMap, rootContainerInstance); - } - } else { - updateEventListener(listeners, fiber, visistedResponders, respondersMap, rootContainerInstance); - } - } + var _existing3 = useFiber(child, element.props); - if (dependencies !== null) { - var _respondersMap = dependencies.responders; + _existing3.ref = coerceRef(returnFiber, child, element); + _existing3.return = returnFiber; - if (_respondersMap !== null) { - // Unmount - var mountedResponders = Array.from(_respondersMap.keys()); + { + _existing3._debugSource = element._source; + _existing3._debugOwner = element._owner; + } - for (var _i = 0, _length = mountedResponders.length; _i < _length; _i++) { - var mountedResponder = mountedResponders[_i]; + return _existing3; + } - if (!visistedResponders.has(mountedResponder)) { - var responderInstance = _respondersMap.get(mountedResponder); + break; + } + } // Didn't match. - unmountResponderInstance(responderInstance); - _respondersMap.delete(mountedResponder); + deleteRemainingChildren(returnFiber, child); + break; + } else { + deleteChild(returnFiber, child); } + + child = child.sibling; } - } - } -} -function createResponderListener(responder, props) { - var eventResponderListener = { - responder: responder, - props: props - }; - { - Object.freeze(eventResponderListener); - } - - return eventResponderListener; -} - -var NoEffect$1 = -/* */ -0; -var UnmountSnapshot = -/* */ -2; -var UnmountMutation = -/* */ -4; -var MountMutation = -/* */ -8; -var UnmountLayout = -/* */ -16; -var MountLayout = -/* */ -32; -var MountPassive = -/* */ -64; -var UnmountPassive = -/* */ -128; - -var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher; -var ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig; -var didWarnAboutMismatchedHooksForComponent; - -{ - didWarnAboutMismatchedHooksForComponent = new Set(); -} - -// These are set right before calling the component. -var renderExpirationTime$1 = NoWork; // The work-in-progress fiber. I've named it differently to distinguish it from -// the work-in-progress hook. - -var currentlyRenderingFiber$1 = null; // Hooks are stored as a linked list on the fiber's memoizedState field. The -// current hook list is the list that belongs to the current fiber. The -// work-in-progress hook list is a new list that will be added to the -// work-in-progress fiber. - -var currentHook = null; -var nextCurrentHook = null; -var firstWorkInProgressHook = null; -var workInProgressHook = null; -var nextWorkInProgressHook = null; -var remainingExpirationTime = NoWork; -var componentUpdateQueue = null; -var sideEffectTag = 0; // Updates scheduled during render will trigger an immediate re-render at the -// end of the current pass. We can't store these updates on the normal queue, -// because if the work is aborted, they should be discarded. Because this is -// a relatively rare case, we also don't want to add an additional field to -// either the hook or queue object types. So we store them in a lazily create -// map of queue -> render-phase updates, which are discarded once the component -// completes without re-rendering. -// Whether an update was scheduled during the currently executing render pass. - -var didScheduleRenderPhaseUpdate = false; // Lazily created map of render-phase updates - -var renderPhaseUpdates = null; // Counter to prevent infinite loops. - -var numberOfReRenders = 0; -var RE_RENDER_LIMIT = 25; // In DEV, this is the name of the currently executing primitive hook - -var currentHookNameInDev = null; // In DEV, this list ensures that hooks are called in the same order between renders. -// The list stores the order of hooks used during the initial render (mount). -// Subsequent renders (updates) reference this list. - -var hookTypesDev = null; -var hookTypesUpdateIndexDev = -1; // In DEV, this tracks whether currently rendering component needs to ignore -// the dependencies for Hooks that need them (e.g. useEffect or useMemo). -// When true, such Hooks will always be "remounted". Only used during hot reload. - -var ignorePreviousDependencies = false; - -function mountHookTypesDev() { - { - var hookName = currentHookNameInDev; + if (element.type === REACT_FRAGMENT_TYPE) { + var created = createFiberFromFragment(element.props.children, returnFiber.mode, expirationTime, element.key); + created.return = returnFiber; + return created; + } else { + var _created4 = createFiberFromElement(element, returnFiber.mode, expirationTime); - if (hookTypesDev === null) { - hookTypesDev = [hookName]; - } else { - hookTypesDev.push(hookName); + _created4.ref = coerceRef(returnFiber, currentFirstChild, element); + _created4.return = returnFiber; + return _created4; + } } - } -} -function updateHookTypesDev() { - { - var hookName = currentHookNameInDev; + function reconcileSinglePortal(returnFiber, currentFirstChild, portal, expirationTime) { + var key = portal.key; + var child = currentFirstChild; - if (hookTypesDev !== null) { - hookTypesUpdateIndexDev++; + while (child !== null) { + // TODO: If key === null and child.key === null, then this only applies to + // the first item in the list. + if (child.key === key) { + if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) { + deleteRemainingChildren(returnFiber, child.sibling); + var existing = useFiber(child, portal.children || []); + existing.return = returnFiber; + return existing; + } else { + deleteRemainingChildren(returnFiber, child); + break; + } + } else { + deleteChild(returnFiber, child); + } - if (hookTypesDev[hookTypesUpdateIndexDev] !== hookName) { - warnOnHookMismatchInDev(hookName); + child = child.sibling; } - } - } -} -function checkDepsAreArrayDev(deps) { - { - if (deps !== undefined && deps !== null && !Array.isArray(deps)) { - // Verify deps, but only on mount to avoid extra checks. - // It's unlikely their type would change as usually you define them inline. - warning$1(false, '%s received a final argument that is not an array (instead, received `%s`). When ' + 'specified, the final argument must be an array.', currentHookNameInDev, typeof deps); - } - } -} + var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime); + created.return = returnFiber; + return created; + } // This API will tag the children with the side-effect of the reconciliation + // itself. They will be added to the side-effect list as we pass through the + // children and the parent. -function warnOnHookMismatchInDev(currentHookName) { - { - var componentName = getComponentName(currentlyRenderingFiber$1.type); - if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) { - didWarnAboutMismatchedHooksForComponent.add(componentName); + function reconcileChildFibers(returnFiber, currentFirstChild, newChild, expirationTime) { + // This function is not recursive. + // If the top level item is an array, we treat it as a set of children, + // not as a fragment. Nested arrays on the other hand will be treated as + // fragment nodes. Recursion happens at the normal flow. + // Handle top level unkeyed fragments as if they were arrays. + // This leads to an ambiguity between <>{[...]}</> and <>...</>. + // We treat the ambiguous cases above the same. + var isUnkeyedTopLevelFragment = typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null; - if (hookTypesDev !== null) { - var table = ''; - var secondColumnStart = 30; + if (isUnkeyedTopLevelFragment) { + newChild = newChild.props.children; + } // Handle object types - for (var i = 0; i <= hookTypesUpdateIndexDev; i++) { - var oldHookName = hookTypesDev[i]; - var newHookName = i === hookTypesUpdateIndexDev ? currentHookName : oldHookName; - var row = i + 1 + ". " + oldHookName; // Extra space so second column lines up - // lol @ IE not supporting String#repeat - while (row.length < secondColumnStart) { - row += ' '; - } + var isObject = typeof newChild === 'object' && newChild !== null; - row += newHookName + '\n'; - table += row; - } + if (isObject) { + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: + return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, expirationTime)); - warning$1(false, 'React has detected a change in the order of Hooks called by %s. ' + 'This will lead to bugs and errors if not fixed. ' + 'For more information, read the Rules of Hooks: https://fb.me/rules-of-hooks\n\n' + ' Previous render Next render\n' + ' ------------------------------------------------------\n' + '%s' + ' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n', componentName, table); + case REACT_PORTAL_TYPE: + return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, expirationTime)); + } } - } - } -} - -function throwInvalidHookError() { - { - { - throw Error("Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem."); - } - } -} -function areHookInputsEqual(nextDeps, prevDeps) { - { - if (ignorePreviousDependencies) { - // Only true when this component is being hot reloaded. - return false; - } - } + if (typeof newChild === 'string' || typeof newChild === 'number') { + return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, expirationTime)); + } - if (prevDeps === null) { - { - warning$1(false, '%s received a final argument during this render, but not during ' + 'the previous render. Even though the final argument is optional, ' + 'its type cannot change between renders.', currentHookNameInDev); - } + if (isArray$1(newChild)) { + return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, expirationTime); + } - return false; - } + if (getIteratorFn(newChild)) { + return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, expirationTime); + } - { - // Don't bother comparing lengths in prod because these arrays should be - // passed inline. - if (nextDeps.length !== prevDeps.length) { - warning$1(false, 'The final argument passed to %s changed size between renders. The ' + 'order and size of this array must remain constant.\n\n' + 'Previous: %s\n' + 'Incoming: %s', currentHookNameInDev, "[" + prevDeps.join(', ') + "]", "[" + nextDeps.join(', ') + "]"); - } - } + if (isObject) { + throwOnInvalidObjectType(returnFiber, newChild); + } - for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) { - if (is$1(nextDeps[i], prevDeps[i])) { - continue; - } + { + if (typeof newChild === 'function') { + warnOnFunctionType(); + } + } - return false; - } + if (typeof newChild === 'undefined' && !isUnkeyedTopLevelFragment) { + // If the new child is undefined, and the return fiber is a composite + // component, throw an error. If Fiber return types are disabled, + // we already threw above. + switch (returnFiber.tag) { + case ClassComponent: + { + { + var instance = returnFiber.stateNode; - return true; -} + if (instance.render._isMockFunction) { + // We allow auto-mocks to proceed as if they're returning null. + break; + } + } + } + // Intentionally fall through to the next case, which handles both + // functions and classes + // eslint-disable-next-lined no-fallthrough -function renderWithHooks(current, workInProgress, Component, props, refOrContext, nextRenderExpirationTime) { - renderExpirationTime$1 = nextRenderExpirationTime; - currentlyRenderingFiber$1 = workInProgress; - nextCurrentHook = current !== null ? current.memoizedState : null; + case FunctionComponent: + { + var Component = returnFiber.type; - { - hookTypesDev = current !== null ? current._debugHookTypes : null; - hookTypesUpdateIndexDev = -1; // Used for hot reloading: - - ignorePreviousDependencies = current !== null && current.type !== workInProgress.type; - } // The following should have already been reset - // currentHook = null; - // workInProgressHook = null; - // remainingExpirationTime = NoWork; - // componentUpdateQueue = null; - // didScheduleRenderPhaseUpdate = false; - // renderPhaseUpdates = null; - // numberOfReRenders = 0; - // sideEffectTag = 0; - // TODO Warn if no hooks are used at all during mount, then some are used during update. - // Currently we will identify the update render as a mount because nextCurrentHook === null. - // This is tricky because it's valid for certain types of components (e.g. React.lazy) - // Using nextCurrentHook to differentiate between mount/update only works if at least one stateful hook is used. - // Non-stateful hooks (e.g. context) don't get added to memoizedState, - // so nextCurrentHook would be null during updates and mounts. + { + { + throw Error( (Component.displayName || Component.name || 'Component') + "(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null." ); + } + } + } + } + } // Remaining cases are all treated as empty. - { - if (nextCurrentHook !== null) { - ReactCurrentDispatcher$1.current = HooksDispatcherOnUpdateInDEV; - } else if (hookTypesDev !== null) { - // This dispatcher handles an edge case where a component is updating, - // but no stateful hooks have been used. - // We want to match the production code behavior (which will use HooksDispatcherOnMount), - // but with the extra DEV validation to ensure hooks ordering hasn't changed. - // This dispatcher does that. - ReactCurrentDispatcher$1.current = HooksDispatcherOnMountWithHookTypesInDEV; - } else { - ReactCurrentDispatcher$1.current = HooksDispatcherOnMountInDEV; + return deleteRemainingChildren(returnFiber, currentFirstChild); } - } - - var children = Component(props, refOrContext); - - if (didScheduleRenderPhaseUpdate) { - do { - didScheduleRenderPhaseUpdate = false; - numberOfReRenders += 1; - { - // Even when hot reloading, allow dependencies to stabilize - // after first render to prevent infinite render phase updates. - ignorePreviousDependencies = false; - } // Start over from the beginning of the list - - - nextCurrentHook = current !== null ? current.memoizedState : null; - nextWorkInProgressHook = firstWorkInProgressHook; - currentHook = null; - workInProgressHook = null; - componentUpdateQueue = null; + return reconcileChildFibers; + } + var reconcileChildFibers = ChildReconciler(true); + var mountChildFibers = ChildReconciler(false); + function cloneChildFibers(current, workInProgress) { + if (!(current === null || workInProgress.child === current.child)) { { - // Also validate hook order for cascading updates. - hookTypesUpdateIndexDev = -1; + throw Error( "Resuming work not yet implemented." ); } + } - ReactCurrentDispatcher$1.current = HooksDispatcherOnUpdateInDEV; - children = Component(props, refOrContext); - } while (didScheduleRenderPhaseUpdate); - - renderPhaseUpdates = null; - numberOfReRenders = 0; - } // We can assume the previous dispatcher is always this one, since we set it - // at the beginning of the render phase and there's no re-entrancy. - - - ReactCurrentDispatcher$1.current = ContextOnlyDispatcher; - var renderedWork = currentlyRenderingFiber$1; - renderedWork.memoizedState = firstWorkInProgressHook; - renderedWork.expirationTime = remainingExpirationTime; - renderedWork.updateQueue = componentUpdateQueue; - renderedWork.effectTag |= sideEffectTag; - - { - renderedWork._debugHookTypes = hookTypesDev; - } // This check uses currentHook so that it works the same in DEV and prod bundles. - // hookTypesDev could catch more cases (e.g. context) but only in DEV bundles. + if (workInProgress.child === null) { + return; + } + var currentChild = workInProgress.child; + var newChild = createWorkInProgress(currentChild, currentChild.pendingProps); + workInProgress.child = newChild; + newChild.return = workInProgress; - var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null; - renderExpirationTime$1 = NoWork; - currentlyRenderingFiber$1 = null; - currentHook = null; - nextCurrentHook = null; - firstWorkInProgressHook = null; - workInProgressHook = null; - nextWorkInProgressHook = null; + while (currentChild.sibling !== null) { + currentChild = currentChild.sibling; + newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps); + newChild.return = workInProgress; + } - { - currentHookNameInDev = null; - hookTypesDev = null; - hookTypesUpdateIndexDev = -1; - } + newChild.sibling = null; + } // Reset a workInProgress child set to prepare it for a second pass. - remainingExpirationTime = NoWork; - componentUpdateQueue = null; - sideEffectTag = 0; // These were reset above - // didScheduleRenderPhaseUpdate = false; - // renderPhaseUpdates = null; - // numberOfReRenders = 0; + function resetChildFibers(workInProgress, renderExpirationTime) { + var child = workInProgress.child; - if (!!didRenderTooFewHooks) { - { - throw Error("Rendered fewer hooks than expected. This may be caused by an accidental early return statement."); + while (child !== null) { + resetWorkInProgress(child, renderExpirationTime); + child = child.sibling; } } - return children; -} -function bailoutHooks(current, workInProgress, expirationTime) { - workInProgress.updateQueue = current.updateQueue; - workInProgress.effectTag &= ~(Passive | Update); - - if (current.expirationTime <= expirationTime) { - current.expirationTime = NoWork; - } -} -function resetHooks() { - // We can assume the previous dispatcher is always this one, since we set it - // at the beginning of the render phase and there's no re-entrancy. - ReactCurrentDispatcher$1.current = ContextOnlyDispatcher; // This is used to reset the state of this module when a component throws. - // It's also called inside mountIndeterminateComponent if we determine the - // component is a module-style component. - - renderExpirationTime$1 = NoWork; - currentlyRenderingFiber$1 = null; - currentHook = null; - nextCurrentHook = null; - firstWorkInProgressHook = null; - workInProgressHook = null; - nextWorkInProgressHook = null; - - { - hookTypesDev = null; - hookTypesUpdateIndexDev = -1; - currentHookNameInDev = null; - } - - remainingExpirationTime = NoWork; - componentUpdateQueue = null; - sideEffectTag = 0; - didScheduleRenderPhaseUpdate = false; - renderPhaseUpdates = null; - numberOfReRenders = 0; -} - -function mountWorkInProgressHook() { - var hook = { - memoizedState: null, - baseState: null, - queue: null, - baseUpdate: null, - next: null - }; + var NO_CONTEXT = {}; + var contextStackCursor$1 = createCursor(NO_CONTEXT); + var contextFiberStackCursor = createCursor(NO_CONTEXT); + var rootInstanceStackCursor = createCursor(NO_CONTEXT); - if (workInProgressHook === null) { - // This is the first hook in the list - firstWorkInProgressHook = workInProgressHook = hook; - } else { - // Append to the end of the list - workInProgressHook = workInProgressHook.next = hook; - } - - return workInProgressHook; -} - -function updateWorkInProgressHook() { - // This function is used both for updates and for re-renders triggered by a - // render phase update. It assumes there is either a current hook we can - // clone, or a work-in-progress hook from a previous render pass that we can - // use as a base. When we reach the end of the base list, we must switch to - // the dispatcher used for mounts. - if (nextWorkInProgressHook !== null) { - // There's already a work-in-progress. Reuse it. - workInProgressHook = nextWorkInProgressHook; - nextWorkInProgressHook = workInProgressHook.next; - currentHook = nextCurrentHook; - nextCurrentHook = currentHook !== null ? currentHook.next : null; - } else { - // Clone from the current hook. - if (!(nextCurrentHook !== null)) { + function requiredContext(c) { + if (!(c !== NO_CONTEXT)) { { - throw Error("Rendered more hooks than during the previous render."); + throw Error( "Expected host context to exist. This error is likely caused by a bug in React. Please file an issue." ); } } - currentHook = nextCurrentHook; - var newHook = { - memoizedState: currentHook.memoizedState, - baseState: currentHook.baseState, - queue: currentHook.queue, - baseUpdate: currentHook.baseUpdate, - next: null - }; - - if (workInProgressHook === null) { - // This is the first hook in the list. - workInProgressHook = firstWorkInProgressHook = newHook; - } else { - // Append to the end of the list. - workInProgressHook = workInProgressHook.next = newHook; - } + return c; + } - nextCurrentHook = currentHook.next; + function getRootHostContainer() { + var rootInstance = requiredContext(rootInstanceStackCursor.current); + return rootInstance; } - return workInProgressHook; -} + function pushHostContainer(fiber, nextRootInstance) { + // Push current root instance onto the stack; + // This allows us to reset root when portals are popped. + push(rootInstanceStackCursor, nextRootInstance, fiber); // Track the context and the Fiber that provided it. + // This enables us to pop only Fibers that provide unique contexts. -function createFunctionComponentUpdateQueue() { - return { - lastEffect: null - }; -} + push(contextFiberStackCursor, fiber, fiber); // Finally, we need to push the host context to the stack. + // However, we can't just call getRootHostContext() and push it because + // we'd have a different number of entries on the stack depending on + // whether getRootHostContext() throws somewhere in renderer code or not. + // So we push an empty value first. This lets us safely unwind on errors. -function basicStateReducer(state, action) { - return typeof action === 'function' ? action(state) : action; -} + push(contextStackCursor$1, NO_CONTEXT, fiber); + var nextRootContext = getRootHostContext(nextRootInstance); // Now that we know this function doesn't throw, replace it. -function mountReducer(reducer, initialArg, init) { - var hook = mountWorkInProgressHook(); - var initialState; + pop(contextStackCursor$1, fiber); + push(contextStackCursor$1, nextRootContext, fiber); + } - if (init !== undefined) { - initialState = init(initialArg); - } else { - initialState = initialArg; + function popHostContainer(fiber) { + pop(contextStackCursor$1, fiber); + pop(contextFiberStackCursor, fiber); + pop(rootInstanceStackCursor, fiber); } - hook.memoizedState = hook.baseState = initialState; - var queue = hook.queue = { - last: null, - dispatch: null, - lastRenderedReducer: reducer, - lastRenderedState: initialState - }; - var dispatch = queue.dispatch = dispatchAction.bind(null, // Flow doesn't know this is non-null, but we do. - currentlyRenderingFiber$1, queue); - return [hook.memoizedState, dispatch]; -} + function getHostContext() { + var context = requiredContext(contextStackCursor$1.current); + return context; + } -function updateReducer(reducer, initialArg, init) { - var hook = updateWorkInProgressHook(); - var queue = hook.queue; + function pushHostContext(fiber) { + var rootInstance = requiredContext(rootInstanceStackCursor.current); + var context = requiredContext(contextStackCursor$1.current); + var nextContext = getChildHostContext(context, fiber.type); // Don't push this Fiber's context unless it's unique. - if (!(queue !== null)) { - { - throw Error("Should have a queue. This is likely a bug in React. Please file an issue."); - } - } + if (context === nextContext) { + return; + } // Track the context and the Fiber that provided it. + // This enables us to pop only Fibers that provide unique contexts. - queue.lastRenderedReducer = reducer; - if (numberOfReRenders > 0) { - // This is a re-render. Apply the new render phase updates to the previous - // work-in-progress hook. - var _dispatch = queue.dispatch; + push(contextFiberStackCursor, fiber, fiber); + push(contextStackCursor$1, nextContext, fiber); + } - if (renderPhaseUpdates !== null) { - // Render phase updates are stored in a map of queue -> linked list - var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue); + function popHostContext(fiber) { + // Do not pop unless this Fiber provided the current context. + // pushHostContext() only pushes Fibers that provide unique contexts. + if (contextFiberStackCursor.current !== fiber) { + return; + } - if (firstRenderPhaseUpdate !== undefined) { - renderPhaseUpdates.delete(queue); - var newState = hook.memoizedState; - var update = firstRenderPhaseUpdate; + pop(contextStackCursor$1, fiber); + pop(contextFiberStackCursor, fiber); + } - do { - // Process this render phase update. We don't have to check the - // priority because it will always be the same as the current - // render's. - var action = update.action; - newState = reducer(newState, action); - update = update.next; - } while (update !== null); // Mark that the fiber performed work, but only if the new state is - // different from the current state. + var DefaultSuspenseContext = 0; // The Suspense Context is split into two parts. The lower bits is + // inherited deeply down the subtree. The upper bits only affect + // this immediate suspense boundary and gets reset each new + // boundary or suspense list. + var SubtreeSuspenseContextMask = 1; // Subtree Flags: + // InvisibleParentSuspenseContext indicates that one of our parent Suspense + // boundaries is not currently showing visible main content. + // Either because it is already showing a fallback or is not mounted at all. + // We can use this to determine if it is desirable to trigger a fallback at + // the parent. If not, then we might need to trigger undesirable boundaries + // and/or suspend the commit to avoid hiding the parent content. - if (!is$1(newState, hook.memoizedState)) { - markWorkInProgressReceivedUpdate(); - } + var InvisibleParentSuspenseContext = 1; // Shallow Flags: + // ForceSuspenseFallback can be used by SuspenseList to force newly added + // items into their fallback state during one of the render passes. - hook.memoizedState = newState; // Don't persist the state accumulated from the render phase updates to - // the base state unless the queue is empty. - // TODO: Not sure if this is the desired semantics, but it's what we - // do for gDSFP. I can't remember why. + var ForceSuspenseFallback = 2; + var suspenseStackCursor = createCursor(DefaultSuspenseContext); + function hasSuspenseContext(parentContext, flag) { + return (parentContext & flag) !== 0; + } + function setDefaultShallowSuspenseContext(parentContext) { + return parentContext & SubtreeSuspenseContextMask; + } + function setShallowSuspenseContext(parentContext, shallowContext) { + return parentContext & SubtreeSuspenseContextMask | shallowContext; + } + function addSubtreeSuspenseContext(parentContext, subtreeContext) { + return parentContext | subtreeContext; + } + function pushSuspenseContext(fiber, newContext) { + push(suspenseStackCursor, newContext, fiber); + } + function popSuspenseContext(fiber) { + pop(suspenseStackCursor, fiber); + } - if (hook.baseUpdate === queue.last) { - hook.baseState = newState; - } + function shouldCaptureSuspense(workInProgress, hasInvisibleParent) { + // If it was the primary children that just suspended, capture and render the + // fallback. Otherwise, don't capture and bubble to the next boundary. + var nextState = workInProgress.memoizedState; - queue.lastRenderedState = newState; - return [newState, _dispatch]; + if (nextState !== null) { + if (nextState.dehydrated !== null) { + // A dehydrated boundary always captures. + return true; } - } - return [hook.memoizedState, _dispatch]; - } // The last update in the entire queue + return false; + } + var props = workInProgress.memoizedProps; // In order to capture, the Suspense component must have a fallback prop. - var last = queue.last; // The last update that is part of the base state. + if (props.fallback === undefined) { + return false; + } // Regular boundaries always capture. - var baseUpdate = hook.baseUpdate; - var baseState = hook.baseState; // Find the first unprocessed update. - var first; + if (props.unstable_avoidThisFallback !== true) { + return true; + } // If it's a boundary we should avoid, then we prefer to bubble up to the + // parent boundary if it is currently invisible. - if (baseUpdate !== null) { - if (last !== null) { - // For the first update, the queue is a circular linked list where - // `queue.last.next = queue.first`. Once the first update commits, and - // the `baseUpdate` is no longer empty, we can unravel the list. - last.next = null; - } - first = baseUpdate.next; - } else { - first = last !== null ? last.next : null; - } + if (hasInvisibleParent) { + return false; + } // If the parent is not able to handle it, we must handle it. - if (first !== null) { - var _newState = baseState; - var newBaseState = null; - var newBaseUpdate = null; - var prevUpdate = baseUpdate; - var _update = first; - var didSkip = false; - do { - var updateExpirationTime = _update.expirationTime; + return true; + } + function findFirstSuspended(row) { + var node = row; - if (updateExpirationTime < renderExpirationTime$1) { - // Priority is insufficient. Skip this update. If this is the first - // skipped update, the previous update/state is the new base - // update/state. - if (!didSkip) { - didSkip = true; - newBaseUpdate = prevUpdate; - newBaseState = _newState; - } // Update the remaining priority in the queue. + while (node !== null) { + if (node.tag === SuspenseComponent) { + var state = node.memoizedState; + if (state !== null) { + var dehydrated = state.dehydrated; - if (updateExpirationTime > remainingExpirationTime) { - remainingExpirationTime = updateExpirationTime; - markUnprocessedUpdateTime(remainingExpirationTime); + if (dehydrated === null || isSuspenseInstancePending(dehydrated) || isSuspenseInstanceFallback(dehydrated)) { + return node; + } } - } else { - // This update does have sufficient priority. - // Mark the event time of this update as relevant to this render pass. - // TODO: This should ideally use the true event time of this update rather than - // its priority which is a derived and not reverseable value. - // TODO: We should skip this update if it was already committed but currently - // we have no way of detecting the difference between a committed and suspended - // update here. - markRenderEventTimeAndConfig(updateExpirationTime, _update.suspenseConfig); // Process this update. - - if (_update.eagerReducer === reducer) { - // If this update was processed eagerly, and its reducer matches the - // current reducer, we can use the eagerly computed state. - _newState = _update.eagerState; - } else { - var _action = _update.action; - _newState = reducer(_newState, _action); + } else if (node.tag === SuspenseListComponent && // revealOrder undefined can't be trusted because it don't + // keep track of whether it suspended or not. + node.memoizedProps.revealOrder !== undefined) { + var didSuspend = (node.effectTag & DidCapture) !== NoEffect; + + if (didSuspend) { + return node; } + } else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; } - prevUpdate = _update; - _update = _update.next; - } while (_update !== null && _update !== first); + if (node === row) { + return null; + } - if (!didSkip) { - newBaseUpdate = prevUpdate; - newBaseState = _newState; - } // Mark that the fiber performed work, but only if the new state is - // different from the current state. + while (node.sibling === null) { + if (node.return === null || node.return === row) { + return null; + } + node = node.return; + } - if (!is$1(_newState, hook.memoizedState)) { - markWorkInProgressReceivedUpdate(); + node.sibling.return = node.return; + node = node.sibling; } - hook.memoizedState = _newState; - hook.baseUpdate = newBaseUpdate; - hook.baseState = newBaseState; - queue.lastRenderedState = _newState; + return null; } - var dispatch = queue.dispatch; - return [hook.memoizedState, dispatch]; -} + function createDeprecatedResponderListener(responder, props) { + var eventResponderListener = { + responder: responder, + props: props + }; -function mountState(initialState) { - var hook = mountWorkInProgressHook(); + { + Object.freeze(eventResponderListener); + } - if (typeof initialState === 'function') { - initialState = initialState(); + return eventResponderListener; } - hook.memoizedState = hook.baseState = initialState; - var queue = hook.queue = { - last: null, - dispatch: null, - lastRenderedReducer: basicStateReducer, - lastRenderedState: initialState - }; - var dispatch = queue.dispatch = dispatchAction.bind(null, // Flow doesn't know this is non-null, but we do. - currentlyRenderingFiber$1, queue); - return [hook.memoizedState, dispatch]; -} - -function updateState(initialState) { - return updateReducer(basicStateReducer, initialState); -} - -function pushEffect(tag, create, destroy, deps) { - var effect = { - tag: tag, - create: create, - destroy: destroy, - deps: deps, - // Circular - next: null - }; - - if (componentUpdateQueue === null) { - componentUpdateQueue = createFunctionComponentUpdateQueue(); - componentUpdateQueue.lastEffect = effect.next = effect; - } else { - var lastEffect = componentUpdateQueue.lastEffect; - - if (lastEffect === null) { - componentUpdateQueue.lastEffect = effect.next = effect; - } else { - var firstEffect = lastEffect.next; - lastEffect.next = effect; - effect.next = firstEffect; - componentUpdateQueue.lastEffect = effect; - } - } + var HasEffect = + /* */ + 1; // Represents the phase in which the effect (not the clean-up) fires. - return effect; -} + var Layout = + /* */ + 2; + var Passive$1 = + /* */ + 4; -function mountRef(initialValue) { - var hook = mountWorkInProgressHook(); - var ref = { - current: initialValue - }; + var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher, + ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig; + var didWarnAboutMismatchedHooksForComponent; { - Object.seal(ref); + didWarnAboutMismatchedHooksForComponent = new Set(); } - hook.memoizedState = ref; - return ref; -} + // These are set right before calling the component. + var renderExpirationTime = NoWork; // The work-in-progress fiber. I've named it differently to distinguish it from + // the work-in-progress hook. -function updateRef(initialValue) { - var hook = updateWorkInProgressHook(); - return hook.memoizedState; -} + var currentlyRenderingFiber$1 = null; // Hooks are stored as a linked list on the fiber's memoizedState field. The + // current hook list is the list that belongs to the current fiber. The + // work-in-progress hook list is a new list that will be added to the + // work-in-progress fiber. -function mountEffectImpl(fiberEffectTag, hookEffectTag, create, deps) { - var hook = mountWorkInProgressHook(); - var nextDeps = deps === undefined ? null : deps; - sideEffectTag |= fiberEffectTag; - hook.memoizedState = pushEffect(hookEffectTag, create, undefined, nextDeps); -} + var currentHook = null; + var workInProgressHook = null; // Whether an update was scheduled at any point during the render phase. This + // does not get reset if we do another render pass; only when we're completely + // finished evaluating this component. This is an optimization so we know + // whether we need to clear render phase updates after a throw. -function updateEffectImpl(fiberEffectTag, hookEffectTag, create, deps) { - var hook = updateWorkInProgressHook(); - var nextDeps = deps === undefined ? null : deps; - var destroy = undefined; + var didScheduleRenderPhaseUpdate = false; + var RE_RENDER_LIMIT = 25; // In DEV, this is the name of the currently executing primitive hook - if (currentHook !== null) { - var prevEffect = currentHook.memoizedState; - destroy = prevEffect.destroy; + var currentHookNameInDev = null; // In DEV, this list ensures that hooks are called in the same order between renders. + // The list stores the order of hooks used during the initial render (mount). + // Subsequent renders (updates) reference this list. - if (nextDeps !== null) { - var prevDeps = prevEffect.deps; + var hookTypesDev = null; + var hookTypesUpdateIndexDev = -1; // In DEV, this tracks whether currently rendering component needs to ignore + // the dependencies for Hooks that need them (e.g. useEffect or useMemo). + // When true, such Hooks will always be "remounted". Only used during hot reload. - if (areHookInputsEqual(nextDeps, prevDeps)) { - pushEffect(NoEffect$1, create, destroy, nextDeps); - return; + var ignorePreviousDependencies = false; + + function mountHookTypesDev() { + { + var hookName = currentHookNameInDev; + + if (hookTypesDev === null) { + hookTypesDev = [hookName]; + } else { + hookTypesDev.push(hookName); } } } - sideEffectTag |= fiberEffectTag; - hook.memoizedState = pushEffect(hookEffectTag, create, destroy, nextDeps); -} + function updateHookTypesDev() { + { + var hookName = currentHookNameInDev; + + if (hookTypesDev !== null) { + hookTypesUpdateIndexDev++; -function mountEffect(create, deps) { - { - // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests - if ('undefined' !== typeof jest) { - warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1); + if (hookTypesDev[hookTypesUpdateIndexDev] !== hookName) { + warnOnHookMismatchInDev(hookName); + } + } } } - return mountEffectImpl(Update | Passive, UnmountPassive | MountPassive, create, deps); -} - -function updateEffect(create, deps) { - { - // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests - if ('undefined' !== typeof jest) { - warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1); + function checkDepsAreArrayDev(deps) { + { + if (deps !== undefined && deps !== null && !Array.isArray(deps)) { + // Verify deps, but only on mount to avoid extra checks. + // It's unlikely their type would change as usually you define them inline. + error('%s received a final argument that is not an array (instead, received `%s`). When ' + 'specified, the final argument must be an array.', currentHookNameInDev, typeof deps); + } } } - return updateEffectImpl(Update | Passive, UnmountPassive | MountPassive, create, deps); -} + function warnOnHookMismatchInDev(currentHookName) { + { + var componentName = getComponentName(currentlyRenderingFiber$1.type); -function mountLayoutEffect(create, deps) { - return mountEffectImpl(Update, UnmountMutation | MountLayout, create, deps); -} + if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) { + didWarnAboutMismatchedHooksForComponent.add(componentName); -function updateLayoutEffect(create, deps) { - return updateEffectImpl(Update, UnmountMutation | MountLayout, create, deps); -} + if (hookTypesDev !== null) { + var table = ''; + var secondColumnStart = 30; -function imperativeHandleEffect(create, ref) { - if (typeof ref === 'function') { - var refCallback = ref; + for (var i = 0; i <= hookTypesUpdateIndexDev; i++) { + var oldHookName = hookTypesDev[i]; + var newHookName = i === hookTypesUpdateIndexDev ? currentHookName : oldHookName; + var row = i + 1 + ". " + oldHookName; // Extra space so second column lines up + // lol @ IE not supporting String#repeat - var _inst = create(); + while (row.length < secondColumnStart) { + row += ' '; + } - refCallback(_inst); - return function () { - refCallback(null); - }; - } else if (ref !== null && ref !== undefined) { - var refObject = ref; + row += newHookName + '\n'; + table += row; + } - { - !refObject.hasOwnProperty('current') ? warning$1(false, 'Expected useImperativeHandle() first argument to either be a ' + 'ref callback or React.createRef() object. Instead received: %s.', 'an object with keys {' + Object.keys(refObject).join(', ') + '}') : void 0; + error('React has detected a change in the order of Hooks called by %s. ' + 'This will lead to bugs and errors if not fixed. ' + 'For more information, read the Rules of Hooks: https://fb.me/rules-of-hooks\n\n' + ' Previous render Next render\n' + ' ------------------------------------------------------\n' + '%s' + ' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n', componentName, table); + } + } } + } - var _inst2 = create(); - - refObject.current = _inst2; - return function () { - refObject.current = null; - }; + function throwInvalidHookError() { + { + { + throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem." ); + } + } } -} -function mountImperativeHandle(ref, create, deps) { - { - !(typeof create === 'function') ? warning$1(false, 'Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null') : void 0; - } // TODO: If deps are provided, should we skip comparing the ref itself? + function areHookInputsEqual(nextDeps, prevDeps) { + { + if (ignorePreviousDependencies) { + // Only true when this component is being hot reloaded. + return false; + } + } - - var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null; - return mountEffectImpl(Update, UnmountMutation | MountLayout, imperativeHandleEffect.bind(null, create, ref), effectDeps); -} - -function updateImperativeHandle(ref, create, deps) { - { - !(typeof create === 'function') ? warning$1(false, 'Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null') : void 0; - } // TODO: If deps are provided, should we skip comparing the ref itself? - - - var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null; - return updateEffectImpl(Update, UnmountMutation | MountLayout, imperativeHandleEffect.bind(null, create, ref), effectDeps); -} - -function mountDebugValue(value, formatterFn) {// This hook is normally a no-op. - // The react-debug-hooks package injects its own implementation - // so that e.g. DevTools can display custom hook values. -} - -var updateDebugValue = mountDebugValue; - -function mountCallback(callback, deps) { - var hook = mountWorkInProgressHook(); - var nextDeps = deps === undefined ? null : deps; - hook.memoizedState = [callback, nextDeps]; - return callback; -} - -function updateCallback(callback, deps) { - var hook = updateWorkInProgressHook(); - var nextDeps = deps === undefined ? null : deps; - var prevState = hook.memoizedState; - - if (prevState !== null) { - if (nextDeps !== null) { - var prevDeps = prevState[1]; - - if (areHookInputsEqual(nextDeps, prevDeps)) { - return prevState[0]; + if (prevDeps === null) { + { + error('%s received a final argument during this render, but not during ' + 'the previous render. Even though the final argument is optional, ' + 'its type cannot change between renders.', currentHookNameInDev); } - } - } - - hook.memoizedState = [callback, nextDeps]; - return callback; -} -function mountMemo(nextCreate, deps) { - var hook = mountWorkInProgressHook(); - var nextDeps = deps === undefined ? null : deps; - var nextValue = nextCreate(); - hook.memoizedState = [nextValue, nextDeps]; - return nextValue; -} - -function updateMemo(nextCreate, deps) { - var hook = updateWorkInProgressHook(); - var nextDeps = deps === undefined ? null : deps; - var prevState = hook.memoizedState; - - if (prevState !== null) { - // Assume these are defined. If they're not, areHookInputsEqual will warn. - if (nextDeps !== null) { - var prevDeps = prevState[1]; - - if (areHookInputsEqual(nextDeps, prevDeps)) { - return prevState[0]; - } + return false; } - } - - var nextValue = nextCreate(); - hook.memoizedState = [nextValue, nextDeps]; - return nextValue; -} - -function mountDeferredValue(value, config) { - var _mountState = mountState(value), - prevValue = _mountState[0], - setValue = _mountState[1]; - - mountEffect(function () { - unstable_next(function () { - var previousConfig = ReactCurrentBatchConfig$1.suspense; - ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config; - - try { - setValue(value); - } finally { - ReactCurrentBatchConfig$1.suspense = previousConfig; - } - }); - }, [value, config]); - return prevValue; -} - -function updateDeferredValue(value, config) { - var _updateState = updateState(value), - prevValue = _updateState[0], - setValue = _updateState[1]; - - updateEffect(function () { - unstable_next(function () { - var previousConfig = ReactCurrentBatchConfig$1.suspense; - ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config; - try { - setValue(value); - } finally { - ReactCurrentBatchConfig$1.suspense = previousConfig; - } - }); - }, [value, config]); - return prevValue; -} - -function mountTransition(config) { - var _mountState2 = mountState(false), - isPending = _mountState2[0], - setPending = _mountState2[1]; - - var startTransition = mountCallback(function (callback) { - setPending(true); - unstable_next(function () { - var previousConfig = ReactCurrentBatchConfig$1.suspense; - ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config; - - try { - setPending(false); - callback(); - } finally { - ReactCurrentBatchConfig$1.suspense = previousConfig; + { + // Don't bother comparing lengths in prod because these arrays should be + // passed inline. + if (nextDeps.length !== prevDeps.length) { + error('The final argument passed to %s changed size between renders. The ' + 'order and size of this array must remain constant.\n\n' + 'Previous: %s\n' + 'Incoming: %s', currentHookNameInDev, "[" + prevDeps.join(', ') + "]", "[" + nextDeps.join(', ') + "]"); } - }); - }, [config, isPending]); - return [startTransition, isPending]; -} - -function updateTransition(config) { - var _updateState2 = updateState(false), - isPending = _updateState2[0], - setPending = _updateState2[1]; - - var startTransition = updateCallback(function (callback) { - setPending(true); - unstable_next(function () { - var previousConfig = ReactCurrentBatchConfig$1.suspense; - ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config; + } - try { - setPending(false); - callback(); - } finally { - ReactCurrentBatchConfig$1.suspense = previousConfig; + for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) { + if (objectIs(nextDeps[i], prevDeps[i])) { + continue; } - }); - }, [config, isPending]); - return [startTransition, isPending]; -} -function dispatchAction(fiber, queue, action) { - if (!(numberOfReRenders < RE_RENDER_LIMIT)) { - { - throw Error("Too many re-renders. React limits the number of renders to prevent an infinite loop."); + return false; } - } - { - !(typeof arguments[3] !== 'function') ? warning$1(false, "State updates from the useState() and useReducer() Hooks don't support the " + 'second callback argument. To execute a side effect after ' + 'rendering, declare it in the component body with useEffect().') : void 0; + return true; } - var alternate = fiber.alternate; - - if (fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1) { - // This is a render phase update. Stash it in a lazily-created map of - // queue -> linked list of updates. After this render pass, we'll restart - // and apply the stashed updates on top of the work-in-progress hook. - didScheduleRenderPhaseUpdate = true; - var update = { - expirationTime: renderExpirationTime$1, - suspenseConfig: null, - action: action, - eagerReducer: null, - eagerState: null, - next: null - }; + function renderWithHooks(current, workInProgress, Component, props, secondArg, nextRenderExpirationTime) { + renderExpirationTime = nextRenderExpirationTime; + currentlyRenderingFiber$1 = workInProgress; { - update.priority = getCurrentPriorityLevel(); - } + hookTypesDev = current !== null ? current._debugHookTypes : null; + hookTypesUpdateIndexDev = -1; // Used for hot reloading: - if (renderPhaseUpdates === null) { - renderPhaseUpdates = new Map(); + ignorePreviousDependencies = current !== null && current.type !== workInProgress.type; } - var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue); - - if (firstRenderPhaseUpdate === undefined) { - renderPhaseUpdates.set(queue, update); - } else { - // Append the update to the end of the list. - var lastRenderPhaseUpdate = firstRenderPhaseUpdate; - - while (lastRenderPhaseUpdate.next !== null) { - lastRenderPhaseUpdate = lastRenderPhaseUpdate.next; - } - - lastRenderPhaseUpdate.next = update; - } - } else { - var currentTime = requestCurrentTimeForUpdate(); - var suspenseConfig = requestCurrentSuspenseConfig(); - var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig); - var _update2 = { - expirationTime: expirationTime, - suspenseConfig: suspenseConfig, - action: action, - eagerReducer: null, - eagerState: null, - next: null - }; + workInProgress.memoizedState = null; + workInProgress.updateQueue = null; + workInProgress.expirationTime = NoWork; // The following should have already been reset + // currentHook = null; + // workInProgressHook = null; + // didScheduleRenderPhaseUpdate = false; + // TODO Warn if no hooks are used at all during mount, then some are used during update. + // Currently we will identify the update render as a mount because memoizedState === null. + // This is tricky because it's valid for certain types of components (e.g. React.lazy) + // Using memoizedState to differentiate between mount/update only works if at least one stateful hook is used. + // Non-stateful hooks (e.g. context) don't get added to memoizedState, + // so memoizedState would be null during updates and mounts. { - _update2.priority = getCurrentPriorityLevel(); - } // Append the update to the end of the list. - - - var last = queue.last; - - if (last === null) { - // This is the first update. Create a circular list. - _update2.next = _update2; - } else { - var first = last.next; - - if (first !== null) { - // Still circular. - _update2.next = first; + if (current !== null && current.memoizedState !== null) { + ReactCurrentDispatcher.current = HooksDispatcherOnUpdateInDEV; + } else if (hookTypesDev !== null) { + // This dispatcher handles an edge case where a component is updating, + // but no stateful hooks have been used. + // We want to match the production code behavior (which will use HooksDispatcherOnMount), + // but with the extra DEV validation to ensure hooks ordering hasn't changed. + // This dispatcher does that. + ReactCurrentDispatcher.current = HooksDispatcherOnMountWithHookTypesInDEV; + } else { + ReactCurrentDispatcher.current = HooksDispatcherOnMountInDEV; } - - last.next = _update2; } - queue.last = _update2; - - if (fiber.expirationTime === NoWork && (alternate === null || alternate.expirationTime === NoWork)) { - // The queue is currently empty, which means we can eagerly compute the - // next state before entering the render phase. If the new state is the - // same as the current state, we may be able to bail out entirely. - var lastRenderedReducer = queue.lastRenderedReducer; + var children = Component(props, secondArg); // Check if there was a render phase update - if (lastRenderedReducer !== null) { - var prevDispatcher; + if (workInProgress.expirationTime === renderExpirationTime) { + // Keep rendering in a loop for as long as render phase updates continue to + // be scheduled. Use a counter to prevent infinite loops. + var numberOfReRenders = 0; - { - prevDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; - } + do { + workInProgress.expirationTime = NoWork; - try { - var currentState = queue.lastRenderedState; - var eagerState = lastRenderedReducer(currentState, action); // Stash the eagerly computed state, and the reducer used to compute - // it, on the update object. If the reducer hasn't changed by the - // time we enter the render phase, then the eager state can be used - // without calling the reducer again. - - _update2.eagerReducer = lastRenderedReducer; - _update2.eagerState = eagerState; - - if (is$1(eagerState, currentState)) { - // Fast path. We can bail out without scheduling React to re-render. - // It's still possible that we'll need to rebase this update later, - // if the component re-renders for a different reason and by that - // time the reducer has changed. - return; - } - } catch (error) {// Suppress the error. It will throw again in the render phase. - } finally { + if (!(numberOfReRenders < RE_RENDER_LIMIT)) { { - ReactCurrentDispatcher$1.current = prevDispatcher; + throw Error( "Too many re-renders. React limits the number of renders to prevent an infinite loop." ); } } - } - } - - { - // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests - if ('undefined' !== typeof jest) { - warnIfNotScopedWithMatchingAct(fiber); - warnIfNotCurrentlyActingUpdatesInDev(fiber); - } - } - - scheduleWork(fiber, expirationTime); - } -} - -var ContextOnlyDispatcher = { - readContext: readContext, - useCallback: throwInvalidHookError, - useContext: throwInvalidHookError, - useEffect: throwInvalidHookError, - useImperativeHandle: throwInvalidHookError, - useLayoutEffect: throwInvalidHookError, - useMemo: throwInvalidHookError, - useReducer: throwInvalidHookError, - useRef: throwInvalidHookError, - useState: throwInvalidHookError, - useDebugValue: throwInvalidHookError, - useResponder: throwInvalidHookError, - useDeferredValue: throwInvalidHookError, - useTransition: throwInvalidHookError -}; -var HooksDispatcherOnMountInDEV = null; -var HooksDispatcherOnMountWithHookTypesInDEV = null; -var HooksDispatcherOnUpdateInDEV = null; -var InvalidNestedHooksDispatcherOnMountInDEV = null; -var InvalidNestedHooksDispatcherOnUpdateInDEV = null; - -{ - var warnInvalidContextAccess = function () { - warning$1(false, 'Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().'); - }; - var warnInvalidHookAccess = function () { - warning$1(false, 'Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. ' + 'You can only call Hooks at the top level of your React function. ' + 'For more information, see ' + 'https://fb.me/rules-of-hooks'); - }; + numberOfReRenders += 1; - HooksDispatcherOnMountInDEV = { - readContext: function (context, observedBits) { - return readContext(context, observedBits); - }, - useCallback: function (callback, deps) { - currentHookNameInDev = 'useCallback'; - mountHookTypesDev(); - checkDepsAreArrayDev(deps); - return mountCallback(callback, deps); - }, - useContext: function (context, observedBits) { - currentHookNameInDev = 'useContext'; - mountHookTypesDev(); - return readContext(context, observedBits); - }, - useEffect: function (create, deps) { - currentHookNameInDev = 'useEffect'; - mountHookTypesDev(); - checkDepsAreArrayDev(deps); - return mountEffect(create, deps); - }, - useImperativeHandle: function (ref, create, deps) { - currentHookNameInDev = 'useImperativeHandle'; - mountHookTypesDev(); - checkDepsAreArrayDev(deps); - return mountImperativeHandle(ref, create, deps); - }, - useLayoutEffect: function (create, deps) { - currentHookNameInDev = 'useLayoutEffect'; - mountHookTypesDev(); - checkDepsAreArrayDev(deps); - return mountLayoutEffect(create, deps); - }, - useMemo: function (create, deps) { - currentHookNameInDev = 'useMemo'; - mountHookTypesDev(); - checkDepsAreArrayDev(deps); - var prevDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + { + // Even when hot reloading, allow dependencies to stabilize + // after first render to prevent infinite render phase updates. + ignorePreviousDependencies = false; + } // Start over from the beginning of the list - try { - return mountMemo(create, deps); - } finally { - ReactCurrentDispatcher$1.current = prevDispatcher; - } - }, - useReducer: function (reducer, initialArg, init) { - currentHookNameInDev = 'useReducer'; - mountHookTypesDev(); - var prevDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; - try { - return mountReducer(reducer, initialArg, init); - } finally { - ReactCurrentDispatcher$1.current = prevDispatcher; - } - }, - useRef: function (initialValue) { - currentHookNameInDev = 'useRef'; - mountHookTypesDev(); - return mountRef(initialValue); - }, - useState: function (initialState) { - currentHookNameInDev = 'useState'; - mountHookTypesDev(); - var prevDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + currentHook = null; + workInProgressHook = null; + workInProgress.updateQueue = null; - try { - return mountState(initialState); - } finally { - ReactCurrentDispatcher$1.current = prevDispatcher; - } - }, - useDebugValue: function (value, formatterFn) { - currentHookNameInDev = 'useDebugValue'; - mountHookTypesDev(); - return mountDebugValue(value, formatterFn); - }, - useResponder: function (responder, props) { - currentHookNameInDev = 'useResponder'; - mountHookTypesDev(); - return createResponderListener(responder, props); - }, - useDeferredValue: function (value, config) { - currentHookNameInDev = 'useDeferredValue'; - mountHookTypesDev(); - return mountDeferredValue(value, config); - }, - useTransition: function (config) { - currentHookNameInDev = 'useTransition'; - mountHookTypesDev(); - return mountTransition(config); - } - }; - HooksDispatcherOnMountWithHookTypesInDEV = { - readContext: function (context, observedBits) { - return readContext(context, observedBits); - }, - useCallback: function (callback, deps) { - currentHookNameInDev = 'useCallback'; - updateHookTypesDev(); - return mountCallback(callback, deps); - }, - useContext: function (context, observedBits) { - currentHookNameInDev = 'useContext'; - updateHookTypesDev(); - return readContext(context, observedBits); - }, - useEffect: function (create, deps) { - currentHookNameInDev = 'useEffect'; - updateHookTypesDev(); - return mountEffect(create, deps); - }, - useImperativeHandle: function (ref, create, deps) { - currentHookNameInDev = 'useImperativeHandle'; - updateHookTypesDev(); - return mountImperativeHandle(ref, create, deps); - }, - useLayoutEffect: function (create, deps) { - currentHookNameInDev = 'useLayoutEffect'; - updateHookTypesDev(); - return mountLayoutEffect(create, deps); - }, - useMemo: function (create, deps) { - currentHookNameInDev = 'useMemo'; - updateHookTypesDev(); - var prevDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; - - try { - return mountMemo(create, deps); - } finally { - ReactCurrentDispatcher$1.current = prevDispatcher; - } - }, - useReducer: function (reducer, initialArg, init) { - currentHookNameInDev = 'useReducer'; - updateHookTypesDev(); - var prevDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + { + // Also validate hook order for cascading updates. + hookTypesUpdateIndexDev = -1; + } - try { - return mountReducer(reducer, initialArg, init); - } finally { - ReactCurrentDispatcher$1.current = prevDispatcher; - } - }, - useRef: function (initialValue) { - currentHookNameInDev = 'useRef'; - updateHookTypesDev(); - return mountRef(initialValue); - }, - useState: function (initialState) { - currentHookNameInDev = 'useState'; - updateHookTypesDev(); - var prevDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + ReactCurrentDispatcher.current = HooksDispatcherOnRerenderInDEV ; + children = Component(props, secondArg); + } while (workInProgress.expirationTime === renderExpirationTime); + } // We can assume the previous dispatcher is always this one, since we set it + // at the beginning of the render phase and there's no re-entrancy. - try { - return mountState(initialState); - } finally { - ReactCurrentDispatcher$1.current = prevDispatcher; - } - }, - useDebugValue: function (value, formatterFn) { - currentHookNameInDev = 'useDebugValue'; - updateHookTypesDev(); - return mountDebugValue(value, formatterFn); - }, - useResponder: function (responder, props) { - currentHookNameInDev = 'useResponder'; - updateHookTypesDev(); - return createResponderListener(responder, props); - }, - useDeferredValue: function (value, config) { - currentHookNameInDev = 'useDeferredValue'; - updateHookTypesDev(); - return mountDeferredValue(value, config); - }, - useTransition: function (config) { - currentHookNameInDev = 'useTransition'; - updateHookTypesDev(); - return mountTransition(config); - } - }; - HooksDispatcherOnUpdateInDEV = { - readContext: function (context, observedBits) { - return readContext(context, observedBits); - }, - useCallback: function (callback, deps) { - currentHookNameInDev = 'useCallback'; - updateHookTypesDev(); - return updateCallback(callback, deps); - }, - useContext: function (context, observedBits) { - currentHookNameInDev = 'useContext'; - updateHookTypesDev(); - return readContext(context, observedBits); - }, - useEffect: function (create, deps) { - currentHookNameInDev = 'useEffect'; - updateHookTypesDev(); - return updateEffect(create, deps); - }, - useImperativeHandle: function (ref, create, deps) { - currentHookNameInDev = 'useImperativeHandle'; - updateHookTypesDev(); - return updateImperativeHandle(ref, create, deps); - }, - useLayoutEffect: function (create, deps) { - currentHookNameInDev = 'useLayoutEffect'; - updateHookTypesDev(); - return updateLayoutEffect(create, deps); - }, - useMemo: function (create, deps) { - currentHookNameInDev = 'useMemo'; - updateHookTypesDev(); - var prevDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; - try { - return updateMemo(create, deps); - } finally { - ReactCurrentDispatcher$1.current = prevDispatcher; - } - }, - useReducer: function (reducer, initialArg, init) { - currentHookNameInDev = 'useReducer'; - updateHookTypesDev(); - var prevDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + ReactCurrentDispatcher.current = ContextOnlyDispatcher; - try { - return updateReducer(reducer, initialArg, init); - } finally { - ReactCurrentDispatcher$1.current = prevDispatcher; - } - }, - useRef: function (initialValue) { - currentHookNameInDev = 'useRef'; - updateHookTypesDev(); - return updateRef(initialValue); - }, - useState: function (initialState) { - currentHookNameInDev = 'useState'; - updateHookTypesDev(); - var prevDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; - - try { - return updateState(initialState); - } finally { - ReactCurrentDispatcher$1.current = prevDispatcher; - } - }, - useDebugValue: function (value, formatterFn) { - currentHookNameInDev = 'useDebugValue'; - updateHookTypesDev(); - return updateDebugValue(value, formatterFn); - }, - useResponder: function (responder, props) { - currentHookNameInDev = 'useResponder'; - updateHookTypesDev(); - return createResponderListener(responder, props); - }, - useDeferredValue: function (value, config) { - currentHookNameInDev = 'useDeferredValue'; - updateHookTypesDev(); - return updateDeferredValue(value, config); - }, - useTransition: function (config) { - currentHookNameInDev = 'useTransition'; - updateHookTypesDev(); - return updateTransition(config); - } - }; - InvalidNestedHooksDispatcherOnMountInDEV = { - readContext: function (context, observedBits) { - warnInvalidContextAccess(); - return readContext(context, observedBits); - }, - useCallback: function (callback, deps) { - currentHookNameInDev = 'useCallback'; - warnInvalidHookAccess(); - mountHookTypesDev(); - return mountCallback(callback, deps); - }, - useContext: function (context, observedBits) { - currentHookNameInDev = 'useContext'; - warnInvalidHookAccess(); - mountHookTypesDev(); - return readContext(context, observedBits); - }, - useEffect: function (create, deps) { - currentHookNameInDev = 'useEffect'; - warnInvalidHookAccess(); - mountHookTypesDev(); - return mountEffect(create, deps); - }, - useImperativeHandle: function (ref, create, deps) { - currentHookNameInDev = 'useImperativeHandle'; - warnInvalidHookAccess(); - mountHookTypesDev(); - return mountImperativeHandle(ref, create, deps); - }, - useLayoutEffect: function (create, deps) { - currentHookNameInDev = 'useLayoutEffect'; - warnInvalidHookAccess(); - mountHookTypesDev(); - return mountLayoutEffect(create, deps); - }, - useMemo: function (create, deps) { - currentHookNameInDev = 'useMemo'; - warnInvalidHookAccess(); - mountHookTypesDev(); - var prevDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + { + workInProgress._debugHookTypes = hookTypesDev; + } // This check uses currentHook so that it works the same in DEV and prod bundles. + // hookTypesDev could catch more cases (e.g. context) but only in DEV bundles. - try { - return mountMemo(create, deps); - } finally { - ReactCurrentDispatcher$1.current = prevDispatcher; - } - }, - useReducer: function (reducer, initialArg, init) { - currentHookNameInDev = 'useReducer'; - warnInvalidHookAccess(); - mountHookTypesDev(); - var prevDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; - try { - return mountReducer(reducer, initialArg, init); - } finally { - ReactCurrentDispatcher$1.current = prevDispatcher; - } - }, - useRef: function (initialValue) { - currentHookNameInDev = 'useRef'; - warnInvalidHookAccess(); - mountHookTypesDev(); - return mountRef(initialValue); - }, - useState: function (initialState) { - currentHookNameInDev = 'useState'; - warnInvalidHookAccess(); - mountHookTypesDev(); - var prevDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null; + renderExpirationTime = NoWork; + currentlyRenderingFiber$1 = null; + currentHook = null; + workInProgressHook = null; - try { - return mountState(initialState); - } finally { - ReactCurrentDispatcher$1.current = prevDispatcher; - } - }, - useDebugValue: function (value, formatterFn) { - currentHookNameInDev = 'useDebugValue'; - warnInvalidHookAccess(); - mountHookTypesDev(); - return mountDebugValue(value, formatterFn); - }, - useResponder: function (responder, props) { - currentHookNameInDev = 'useResponder'; - warnInvalidHookAccess(); - mountHookTypesDev(); - return createResponderListener(responder, props); - }, - useDeferredValue: function (value, config) { - currentHookNameInDev = 'useDeferredValue'; - warnInvalidHookAccess(); - mountHookTypesDev(); - return mountDeferredValue(value, config); - }, - useTransition: function (config) { - currentHookNameInDev = 'useTransition'; - warnInvalidHookAccess(); - mountHookTypesDev(); - return mountTransition(config); + { + currentHookNameInDev = null; + hookTypesDev = null; + hookTypesUpdateIndexDev = -1; } - }; - InvalidNestedHooksDispatcherOnUpdateInDEV = { - readContext: function (context, observedBits) { - warnInvalidContextAccess(); - return readContext(context, observedBits); - }, - useCallback: function (callback, deps) { - currentHookNameInDev = 'useCallback'; - warnInvalidHookAccess(); - updateHookTypesDev(); - return updateCallback(callback, deps); - }, - useContext: function (context, observedBits) { - currentHookNameInDev = 'useContext'; - warnInvalidHookAccess(); - updateHookTypesDev(); - return readContext(context, observedBits); - }, - useEffect: function (create, deps) { - currentHookNameInDev = 'useEffect'; - warnInvalidHookAccess(); - updateHookTypesDev(); - return updateEffect(create, deps); - }, - useImperativeHandle: function (ref, create, deps) { - currentHookNameInDev = 'useImperativeHandle'; - warnInvalidHookAccess(); - updateHookTypesDev(); - return updateImperativeHandle(ref, create, deps); - }, - useLayoutEffect: function (create, deps) { - currentHookNameInDev = 'useLayoutEffect'; - warnInvalidHookAccess(); - updateHookTypesDev(); - return updateLayoutEffect(create, deps); - }, - useMemo: function (create, deps) { - currentHookNameInDev = 'useMemo'; - warnInvalidHookAccess(); - updateHookTypesDev(); - var prevDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; - - try { - return updateMemo(create, deps); - } finally { - ReactCurrentDispatcher$1.current = prevDispatcher; - } - }, - useReducer: function (reducer, initialArg, init) { - currentHookNameInDev = 'useReducer'; - warnInvalidHookAccess(); - updateHookTypesDev(); - var prevDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; - try { - return updateReducer(reducer, initialArg, init); - } finally { - ReactCurrentDispatcher$1.current = prevDispatcher; - } - }, - useRef: function (initialValue) { - currentHookNameInDev = 'useRef'; - warnInvalidHookAccess(); - updateHookTypesDev(); - return updateRef(initialValue); - }, - useState: function (initialState) { - currentHookNameInDev = 'useState'; - warnInvalidHookAccess(); - updateHookTypesDev(); - var prevDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + didScheduleRenderPhaseUpdate = false; - try { - return updateState(initialState); - } finally { - ReactCurrentDispatcher$1.current = prevDispatcher; + if (!!didRenderTooFewHooks) { + { + throw Error( "Rendered fewer hooks than expected. This may be caused by an accidental early return statement." ); } - }, - useDebugValue: function (value, formatterFn) { - currentHookNameInDev = 'useDebugValue'; - warnInvalidHookAccess(); - updateHookTypesDev(); - return updateDebugValue(value, formatterFn); - }, - useResponder: function (responder, props) { - currentHookNameInDev = 'useResponder'; - warnInvalidHookAccess(); - updateHookTypesDev(); - return createResponderListener(responder, props); - }, - useDeferredValue: function (value, config) { - currentHookNameInDev = 'useDeferredValue'; - warnInvalidHookAccess(); - updateHookTypesDev(); - return updateDeferredValue(value, config); - }, - useTransition: function (config) { - currentHookNameInDev = 'useTransition'; - warnInvalidHookAccess(); - updateHookTypesDev(); - return updateTransition(config); } - }; -} - -// CommonJS interop named imports. - -var now$1 = unstable_now; -var commitTime = 0; -var profilerStartTime = -1; - -function getCommitTime() { - return commitTime; -} - -function recordCommitTime() { - if (!enableProfilerTimer) { - return; - } - - commitTime = now$1(); -} -function startProfilerTimer(fiber) { - if (!enableProfilerTimer) { - return; + return children; } + function bailoutHooks(current, workInProgress, expirationTime) { + workInProgress.updateQueue = current.updateQueue; + workInProgress.effectTag &= ~(Passive | Update); - profilerStartTime = now$1(); - - if (fiber.actualStartTime < 0) { - fiber.actualStartTime = now$1(); - } -} - -function stopProfilerTimerIfRunning(fiber) { - if (!enableProfilerTimer) { - return; + if (current.expirationTime <= expirationTime) { + current.expirationTime = NoWork; + } } + function resetHooksAfterThrow() { + // We can assume the previous dispatcher is always this one, since we set it + // at the beginning of the render phase and there's no re-entrancy. + ReactCurrentDispatcher.current = ContextOnlyDispatcher; - profilerStartTime = -1; -} + if (didScheduleRenderPhaseUpdate) { + // There were render phase updates. These are only valid for this render + // phase, which we are now aborting. Remove the updates from the queues so + // they do not persist to the next render. Do not remove updates from hooks + // that weren't processed. + // + // Only reset the updates from the queue if it has a clone. If it does + // not have a clone, that means it wasn't processed, and the updates were + // scheduled before we entered the render phase. + var hook = currentlyRenderingFiber$1.memoizedState; -function stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) { - if (!enableProfilerTimer) { - return; - } + while (hook !== null) { + var queue = hook.queue; - if (profilerStartTime >= 0) { - var elapsedTime = now$1() - profilerStartTime; - fiber.actualDuration += elapsedTime; + if (queue !== null) { + queue.pending = null; + } - if (overrideBaseTime) { - fiber.selfBaseDuration = elapsedTime; + hook = hook.next; + } } - profilerStartTime = -1; - } -} - -// This may have been an insertion or a hydration. + renderExpirationTime = NoWork; + currentlyRenderingFiber$1 = null; + currentHook = null; + workInProgressHook = null; -var hydrationParentFiber = null; -var nextHydratableInstance = null; -var isHydrating = false; + { + hookTypesDev = null; + hookTypesUpdateIndexDev = -1; + currentHookNameInDev = null; + } -function warnIfHydrating() { - { - !!isHydrating ? warning$1(false, 'We should not be hydrating here. This is a bug in React. Please file a bug.') : void 0; + didScheduleRenderPhaseUpdate = false; } -} -function enterHydrationState(fiber) { - if (!supportsHydration) { - return false; - } + function mountWorkInProgressHook() { + var hook = { + memoizedState: null, + baseState: null, + baseQueue: null, + queue: null, + next: null + }; - var parentInstance = fiber.stateNode.containerInfo; - nextHydratableInstance = getFirstHydratableChild(parentInstance); - hydrationParentFiber = fiber; - isHydrating = true; - return true; -} + if (workInProgressHook === null) { + // This is the first hook in the list + currentlyRenderingFiber$1.memoizedState = workInProgressHook = hook; + } else { + // Append to the end of the list + workInProgressHook = workInProgressHook.next = hook; + } -function reenterHydrationStateFromDehydratedSuspenseInstance(fiber, suspenseInstance) { - if (!supportsHydration) { - return false; + return workInProgressHook; } - nextHydratableInstance = getNextHydratableSibling(suspenseInstance); - popToNextHostParent(fiber); - isHydrating = true; - return true; -} + function updateWorkInProgressHook() { + // This function is used both for updates and for re-renders triggered by a + // render phase update. It assumes there is either a current hook we can + // clone, or a work-in-progress hook from a previous render pass that we can + // use as a base. When we reach the end of the base list, we must switch to + // the dispatcher used for mounts. + var nextCurrentHook; -function deleteHydratableInstance(returnFiber, instance) { - { - switch (returnFiber.tag) { - case HostRoot: - didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance); - break; + if (currentHook === null) { + var current = currentlyRenderingFiber$1.alternate; - case HostComponent: - didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance); - break; + if (current !== null) { + nextCurrentHook = current.memoizedState; + } else { + nextCurrentHook = null; + } + } else { + nextCurrentHook = currentHook.next; } - } - - var childToDelete = createFiberFromHostInstanceForDeletion(); - childToDelete.stateNode = instance; - childToDelete.return = returnFiber; - childToDelete.effectTag = Deletion; // This might seem like it belongs on progressedFirstDeletion. However, - // these children are not part of the reconciliation list of children. - // Even if we abort and rereconcile the children, that will try to hydrate - // again and the nodes are still in the host tree so these will be - // recreated. - if (returnFiber.lastEffect !== null) { - returnFiber.lastEffect.nextEffect = childToDelete; - returnFiber.lastEffect = childToDelete; - } else { - returnFiber.firstEffect = returnFiber.lastEffect = childToDelete; - } -} + var nextWorkInProgressHook; -function insertNonHydratedInstance(returnFiber, fiber) { - fiber.effectTag = fiber.effectTag & ~Hydrating | Placement; + if (workInProgressHook === null) { + nextWorkInProgressHook = currentlyRenderingFiber$1.memoizedState; + } else { + nextWorkInProgressHook = workInProgressHook.next; + } - { - switch (returnFiber.tag) { - case HostRoot: + if (nextWorkInProgressHook !== null) { + // There's already a work-in-progress. Reuse it. + workInProgressHook = nextWorkInProgressHook; + nextWorkInProgressHook = workInProgressHook.next; + currentHook = nextCurrentHook; + } else { + // Clone from the current hook. + if (!(nextCurrentHook !== null)) { { - var parentContainer = returnFiber.stateNode.containerInfo; - - switch (fiber.tag) { - case HostComponent: - var type = fiber.type; - var props = fiber.pendingProps; - didNotFindHydratableContainerInstance(parentContainer, type, props); - break; - - case HostText: - var text = fiber.pendingProps; - didNotFindHydratableContainerTextInstance(parentContainer, text); - break; - - case SuspenseComponent: - - break; - } - - break; + throw Error( "Rendered more hooks than during the previous render." ); } + } - case HostComponent: - { - var parentType = returnFiber.type; - var parentProps = returnFiber.memoizedProps; - var parentInstance = returnFiber.stateNode; + currentHook = nextCurrentHook; + var newHook = { + memoizedState: currentHook.memoizedState, + baseState: currentHook.baseState, + baseQueue: currentHook.baseQueue, + queue: currentHook.queue, + next: null + }; + + if (workInProgressHook === null) { + // This is the first hook in the list. + currentlyRenderingFiber$1.memoizedState = workInProgressHook = newHook; + } else { + // Append to the end of the list. + workInProgressHook = workInProgressHook.next = newHook; + } + } - switch (fiber.tag) { - case HostComponent: - var _type = fiber.type; - var _props = fiber.pendingProps; - didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type, _props); - break; + return workInProgressHook; + } - case HostText: - var _text = fiber.pendingProps; - didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text); - break; + function createFunctionComponentUpdateQueue() { + return { + lastEffect: null + }; + } - case SuspenseComponent: - didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance); - break; - } + function basicStateReducer(state, action) { + // $FlowFixMe: Flow doesn't like mixed types + return typeof action === 'function' ? action(state) : action; + } - break; - } + function mountReducer(reducer, initialArg, init) { + var hook = mountWorkInProgressHook(); + var initialState; - default: - return; + if (init !== undefined) { + initialState = init(initialArg); + } else { + initialState = initialArg; } + + hook.memoizedState = hook.baseState = initialState; + var queue = hook.queue = { + pending: null, + dispatch: null, + lastRenderedReducer: reducer, + lastRenderedState: initialState + }; + var dispatch = queue.dispatch = dispatchAction.bind(null, currentlyRenderingFiber$1, queue); + return [hook.memoizedState, dispatch]; } -} -function tryHydrate(fiber, nextInstance) { - switch (fiber.tag) { - case HostComponent: + function updateReducer(reducer, initialArg, init) { + var hook = updateWorkInProgressHook(); + var queue = hook.queue; + + if (!(queue !== null)) { { - var type = fiber.type; - var props = fiber.pendingProps; - var instance = canHydrateInstance(nextInstance, type, props); + throw Error( "Should have a queue. This is likely a bug in React. Please file an issue." ); + } + } - if (instance !== null) { - fiber.stateNode = instance; - return true; - } + queue.lastRenderedReducer = reducer; + var current = currentHook; // The last rebase update that is NOT part of the base state. - return false; + var baseQueue = current.baseQueue; // The last pending update that hasn't been processed yet. + + var pendingQueue = queue.pending; + + if (pendingQueue !== null) { + // We have new updates that haven't been processed yet. + // We'll add them to the base queue. + if (baseQueue !== null) { + // Merge the pending queue and the base queue. + var baseFirst = baseQueue.next; + var pendingFirst = pendingQueue.next; + baseQueue.next = pendingFirst; + pendingQueue.next = baseFirst; } - case HostText: - { - var text = fiber.pendingProps; - var textInstance = canHydrateTextInstance(nextInstance, text); + current.baseQueue = baseQueue = pendingQueue; + queue.pending = null; + } - if (textInstance !== null) { - fiber.stateNode = textInstance; - return true; - } + if (baseQueue !== null) { + // We have a queue to process. + var first = baseQueue.next; + var newState = current.baseState; + var newBaseState = null; + var newBaseQueueFirst = null; + var newBaseQueueLast = null; + var update = first; - return false; - } + do { + var updateExpirationTime = update.expirationTime; + + if (updateExpirationTime < renderExpirationTime) { + // Priority is insufficient. Skip this update. If this is the first + // skipped update, the previous update/state is the new base + // update/state. + var clone = { + expirationTime: update.expirationTime, + suspenseConfig: update.suspenseConfig, + action: update.action, + eagerReducer: update.eagerReducer, + eagerState: update.eagerState, + next: null + }; - case SuspenseComponent: - { - if (enableSuspenseServerRenderer) { - var suspenseInstance = canHydrateSuspenseInstance(nextInstance); + if (newBaseQueueLast === null) { + newBaseQueueFirst = newBaseQueueLast = clone; + newBaseState = newState; + } else { + newBaseQueueLast = newBaseQueueLast.next = clone; + } // Update the remaining priority in the queue. - if (suspenseInstance !== null) { - var suspenseState = { - dehydrated: suspenseInstance, - retryTime: Never - }; - fiber.memoizedState = suspenseState; // Store the dehydrated fragment as a child fiber. - // This simplifies the code for getHostSibling and deleting nodes, - // since it doesn't have to consider all Suspense boundaries and - // check if they're dehydrated ones or not. - - var dehydratedFragment = createFiberFromDehydratedFragment(suspenseInstance); - dehydratedFragment.return = fiber; - fiber.child = dehydratedFragment; - return true; - } - } - return false; - } + if (updateExpirationTime > currentlyRenderingFiber$1.expirationTime) { + currentlyRenderingFiber$1.expirationTime = updateExpirationTime; + markUnprocessedUpdateTime(updateExpirationTime); + } + } else { + // This update does have sufficient priority. + if (newBaseQueueLast !== null) { + var _clone = { + expirationTime: Sync, + // This update is going to be committed so we never want uncommit it. + suspenseConfig: update.suspenseConfig, + action: update.action, + eagerReducer: update.eagerReducer, + eagerState: update.eagerState, + next: null + }; + newBaseQueueLast = newBaseQueueLast.next = _clone; + } // Mark the event time of this update as relevant to this render pass. + // TODO: This should ideally use the true event time of this update rather than + // its priority which is a derived and not reverseable value. + // TODO: We should skip this update if it was already committed but currently + // we have no way of detecting the difference between a committed and suspended + // update here. - default: - return false; - } -} -function tryToClaimNextHydratableInstance(fiber) { - if (!isHydrating) { - return; - } + markRenderEventTimeAndConfig(updateExpirationTime, update.suspenseConfig); // Process this update. - var nextInstance = nextHydratableInstance; + if (update.eagerReducer === reducer) { + // If this update was processed eagerly, and its reducer matches the + // current reducer, we can use the eagerly computed state. + newState = update.eagerState; + } else { + var action = update.action; + newState = reducer(newState, action); + } + } - if (!nextInstance) { - // Nothing to hydrate. Make it an insertion. - insertNonHydratedInstance(hydrationParentFiber, fiber); - isHydrating = false; - hydrationParentFiber = fiber; - return; - } + update = update.next; + } while (update !== null && update !== first); - var firstAttemptedInstance = nextInstance; + if (newBaseQueueLast === null) { + newBaseState = newState; + } else { + newBaseQueueLast.next = newBaseQueueFirst; + } // Mark that the fiber performed work, but only if the new state is + // different from the current state. - if (!tryHydrate(fiber, nextInstance)) { - // If we can't hydrate this instance let's try the next one. - // We use this as a heuristic. It's based on intuition and not data so it - // might be flawed or unnecessary. - nextInstance = getNextHydratableSibling(firstAttemptedInstance); - if (!nextInstance || !tryHydrate(fiber, nextInstance)) { - // Nothing to hydrate. Make it an insertion. - insertNonHydratedInstance(hydrationParentFiber, fiber); - isHydrating = false; - hydrationParentFiber = fiber; - return; - } // We matched the next one, we'll now assume that the first one was - // superfluous and we'll delete it. Since we can't eagerly delete it - // we'll have to schedule a deletion. To do that, this node needs a dummy - // fiber associated with it. + if (!objectIs(newState, hook.memoizedState)) { + markWorkInProgressReceivedUpdate(); + } + hook.memoizedState = newState; + hook.baseState = newBaseState; + hook.baseQueue = newBaseQueueLast; + queue.lastRenderedState = newState; + } - deleteHydratableInstance(hydrationParentFiber, firstAttemptedInstance); + var dispatch = queue.dispatch; + return [hook.memoizedState, dispatch]; } - hydrationParentFiber = fiber; - nextHydratableInstance = getFirstHydratableChild(nextInstance); -} + function rerenderReducer(reducer, initialArg, init) { + var hook = updateWorkInProgressHook(); + var queue = hook.queue; -function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) { - if (!supportsHydration) { - { + if (!(queue !== null)) { { - throw Error("Expected prepareToHydrateHostInstance() to never be called. This error is likely caused by a bug in React. Please file an issue."); + throw Error( "Should have a queue. This is likely a bug in React. Please file an issue." ); } } - } - var instance = fiber.stateNode; - var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber); // TODO: Type this specific to this type of component. - - fiber.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there - // is a new ref we mark this as an update. + queue.lastRenderedReducer = reducer; // This is a re-render. Apply the new render phase updates to the previous + // work-in-progress hook. - if (updatePayload !== null) { - return true; - } + var dispatch = queue.dispatch; + var lastRenderPhaseUpdate = queue.pending; + var newState = hook.memoizedState; - return false; -} + if (lastRenderPhaseUpdate !== null) { + // The queue doesn't persist past this render pass. + queue.pending = null; + var firstRenderPhaseUpdate = lastRenderPhaseUpdate.next; + var update = firstRenderPhaseUpdate; -function prepareToHydrateHostTextInstance(fiber) { - if (!supportsHydration) { - { - { - throw Error("Expected prepareToHydrateHostTextInstance() to never be called. This error is likely caused by a bug in React. Please file an issue."); - } - } - } + do { + // Process this render phase update. We don't have to check the + // priority because it will always be the same as the current + // render's. + var action = update.action; + newState = reducer(newState, action); + update = update.next; + } while (update !== firstRenderPhaseUpdate); // Mark that the fiber performed work, but only if the new state is + // different from the current state. - var textInstance = fiber.stateNode; - var textContent = fiber.memoizedProps; - var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber); - { - if (shouldUpdate) { - // We assume that prepareToHydrateHostTextInstance is called in a context where the - // hydration parent is the parent host component of this host text. - var returnFiber = hydrationParentFiber; + if (!objectIs(newState, hook.memoizedState)) { + markWorkInProgressReceivedUpdate(); + } - if (returnFiber !== null) { - switch (returnFiber.tag) { - case HostRoot: - { - var parentContainer = returnFiber.stateNode.containerInfo; - didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent); - break; - } + hook.memoizedState = newState; // Don't persist the state accumulated from the render phase updates to + // the base state unless the queue is empty. + // TODO: Not sure if this is the desired semantics, but it's what we + // do for gDSFP. I can't remember why. - case HostComponent: - { - var parentType = returnFiber.type; - var parentProps = returnFiber.memoizedProps; - var parentInstance = returnFiber.stateNode; - didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent); - break; - } - } + if (hook.baseQueue === null) { + hook.baseState = newState; } + + queue.lastRenderedState = newState; } + + return [newState, dispatch]; } - return shouldUpdate; -} + function mountState(initialState) { + var hook = mountWorkInProgressHook(); -function prepareToHydrateHostSuspenseInstance(fiber) { - if (!supportsHydration) { - { - { - throw Error("Expected prepareToHydrateHostSuspenseInstance() to never be called. This error is likely caused by a bug in React. Please file an issue."); - } + if (typeof initialState === 'function') { + // $FlowFixMe: Flow doesn't like mixed types + initialState = initialState(); } + + hook.memoizedState = hook.baseState = initialState; + var queue = hook.queue = { + pending: null, + dispatch: null, + lastRenderedReducer: basicStateReducer, + lastRenderedState: initialState + }; + var dispatch = queue.dispatch = dispatchAction.bind(null, currentlyRenderingFiber$1, queue); + return [hook.memoizedState, dispatch]; } - var suspenseState = fiber.memoizedState; - var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null; + function updateState(initialState) { + return updateReducer(basicStateReducer); + } - if (!suspenseInstance) { - { - throw Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue."); - } + function rerenderState(initialState) { + return rerenderReducer(basicStateReducer); } - hydrateSuspenseInstance(suspenseInstance, fiber); -} + function pushEffect(tag, create, destroy, deps) { + var effect = { + tag: tag, + create: create, + destroy: destroy, + deps: deps, + // Circular + next: null + }; + var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue; -function skipPastDehydratedSuspenseInstance(fiber) { - if (!supportsHydration) { - { - { - throw Error("Expected skipPastDehydratedSuspenseInstance() to never be called. This error is likely caused by a bug in React. Please file an issue."); + if (componentUpdateQueue === null) { + componentUpdateQueue = createFunctionComponentUpdateQueue(); + currentlyRenderingFiber$1.updateQueue = componentUpdateQueue; + componentUpdateQueue.lastEffect = effect.next = effect; + } else { + var lastEffect = componentUpdateQueue.lastEffect; + + if (lastEffect === null) { + componentUpdateQueue.lastEffect = effect.next = effect; + } else { + var firstEffect = lastEffect.next; + lastEffect.next = effect; + effect.next = firstEffect; + componentUpdateQueue.lastEffect = effect; } } + + return effect; } - var suspenseState = fiber.memoizedState; - var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null; + function mountRef(initialValue) { + var hook = mountWorkInProgressHook(); + var ref = { + current: initialValue + }; - if (!suspenseInstance) { { - throw Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue."); + Object.seal(ref); } - } - - return getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance); -} -function popToNextHostParent(fiber) { - var parent = fiber.return; - - while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== SuspenseComponent) { - parent = parent.return; - } - - hydrationParentFiber = parent; -} - -function popHydrationState(fiber) { - if (!supportsHydration) { - return false; + hook.memoizedState = ref; + return ref; } - if (fiber !== hydrationParentFiber) { - // We're deeper than the current hydration context, inside an inserted - // tree. - return false; + function updateRef(initialValue) { + var hook = updateWorkInProgressHook(); + return hook.memoizedState; } - if (!isHydrating) { - // If we're not currently hydrating but we're in a hydration context, then - // we were an insertion and now need to pop up reenter hydration of our - // siblings. - popToNextHostParent(fiber); - isHydrating = true; - return false; + function mountEffectImpl(fiberEffectTag, hookEffectTag, create, deps) { + var hook = mountWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + currentlyRenderingFiber$1.effectTag |= fiberEffectTag; + hook.memoizedState = pushEffect(HasEffect | hookEffectTag, create, undefined, nextDeps); } - var type = fiber.type; // If we have any remaining hydratable nodes, we need to delete them now. - // We only do this deeper than head and body since they tend to have random - // other nodes in them. We also ignore components with pure text content in - // side of them. - // TODO: Better heuristic. + function updateEffectImpl(fiberEffectTag, hookEffectTag, create, deps) { + var hook = updateWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + var destroy = undefined; - if (fiber.tag !== HostComponent || type !== 'head' && type !== 'body' && !shouldSetTextContent(type, fiber.memoizedProps)) { - var nextInstance = nextHydratableInstance; + if (currentHook !== null) { + var prevEffect = currentHook.memoizedState; + destroy = prevEffect.destroy; - while (nextInstance) { - deleteHydratableInstance(fiber, nextInstance); - nextInstance = getNextHydratableSibling(nextInstance); - } - } - - popToNextHostParent(fiber); - - if (fiber.tag === SuspenseComponent) { - nextHydratableInstance = skipPastDehydratedSuspenseInstance(fiber); - } else { - nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null; - } - - return true; -} - -function resetHydrationState() { - if (!supportsHydration) { - return; - } - - hydrationParentFiber = null; - nextHydratableInstance = null; - isHydrating = false; -} - -var ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner; -var didReceiveUpdate = false; -var didWarnAboutBadClass; -var didWarnAboutModulePatternComponent; -var didWarnAboutContextTypeOnFunctionComponent; -var didWarnAboutGetDerivedStateOnFunctionComponent; -var didWarnAboutFunctionRefs; -var didWarnAboutReassigningProps; -var didWarnAboutMaxDuration; -var didWarnAboutRevealOrder; -var didWarnAboutTailOptions; -var didWarnAboutDefaultPropsOnFunctionComponent; - -{ - didWarnAboutBadClass = {}; - didWarnAboutModulePatternComponent = {}; - didWarnAboutContextTypeOnFunctionComponent = {}; - didWarnAboutGetDerivedStateOnFunctionComponent = {}; - didWarnAboutFunctionRefs = {}; - didWarnAboutReassigningProps = false; - didWarnAboutMaxDuration = false; - didWarnAboutRevealOrder = {}; - didWarnAboutTailOptions = {}; - didWarnAboutDefaultPropsOnFunctionComponent = {}; -} - -function reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime) { - if (current$$1 === null) { - // If this is a fresh new component that hasn't been rendered yet, we - // won't update its child set by applying minimal side-effects. Instead, - // we will add them all to the child before it gets rendered. That means - // we can optimize this reconciliation pass by not tracking side-effects. - workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime); - } else { - // If the current child is the same as the work in progress, it means that - // we haven't yet started any work on these children. Therefore, we use - // the clone algorithm to create a copy of all the current children. - // If we had any progressed work already, that is invalid at this point so - // let's throw it out. - workInProgress.child = reconcileChildFibers(workInProgress, current$$1.child, nextChildren, renderExpirationTime); - } -} - -function forceUnmountCurrentAndReconcile(current$$1, workInProgress, nextChildren, renderExpirationTime) { - // This function is fork of reconcileChildren. It's used in cases where we - // want to reconcile without matching against the existing set. This has the - // effect of all current children being unmounted; even if the type and key - // are the same, the old child is unmounted and a new child is created. - // - // To do this, we're going to go through the reconcile algorithm twice. In - // the first pass, we schedule a deletion for all the current children by - // passing null. - workInProgress.child = reconcileChildFibers(workInProgress, current$$1.child, null, renderExpirationTime); // In the second pass, we mount the new children. The trick here is that we - // pass null in place of where we usually pass the current child set. This has - // the effect of remounting all children regardless of whether their their - // identity matches. - - workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime); -} - -function updateForwardRef(current$$1, workInProgress, Component, nextProps, renderExpirationTime) { - // TODO: current can be non-null here even if the component - // hasn't yet mounted. This happens after the first render suspends. - // We'll need to figure out if this is fine or can cause issues. - { - if (workInProgress.type !== workInProgress.elementType) { - // Lazy component props can't be validated in createElement - // because they're only guaranteed to be resolved here. - var innerPropTypes = Component.propTypes; + if (nextDeps !== null) { + var prevDeps = prevEffect.deps; - if (innerPropTypes) { - checkPropTypes_1(innerPropTypes, nextProps, // Resolved props - 'prop', getComponentName(Component), getCurrentFiberStackInDev); + if (areHookInputsEqual(nextDeps, prevDeps)) { + pushEffect(hookEffectTag, create, destroy, nextDeps); + return; + } } } - } - var render = Component.render; - var ref = workInProgress.ref; // The rest is a fork of updateFunctionComponent - - var nextChildren; - prepareToReadContext(workInProgress, renderExpirationTime); - - { - ReactCurrentOwner$3.current = workInProgress; - setCurrentPhase('render'); - nextChildren = renderWithHooks(current$$1, workInProgress, render, nextProps, ref, renderExpirationTime); + currentlyRenderingFiber$1.effectTag |= fiberEffectTag; + hook.memoizedState = pushEffect(HasEffect | hookEffectTag, create, destroy, nextDeps); + } - if (debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) { - // Only double-render components with Hooks - if (workInProgress.memoizedState !== null) { - nextChildren = renderWithHooks(current$$1, workInProgress, render, nextProps, ref, renderExpirationTime); + function mountEffect(create, deps) { + { + // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests + if ('undefined' !== typeof jest) { + warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1); } } - setCurrentPhase(null); + return mountEffectImpl(Update | Passive, Passive$1, create, deps); } - if (current$$1 !== null && !didReceiveUpdate) { - bailoutHooks(current$$1, workInProgress, renderExpirationTime); - return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime); - } // React DevTools reads this flag. - + function updateEffect(create, deps) { + { + // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests + if ('undefined' !== typeof jest) { + warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1); + } + } - workInProgress.effectTag |= PerformedWork; - reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime); - return workInProgress.child; -} + return updateEffectImpl(Update | Passive, Passive$1, create, deps); + } -function updateMemoComponent(current$$1, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) { - if (current$$1 === null) { - var type = Component.type; + function mountLayoutEffect(create, deps) { + return mountEffectImpl(Update, Layout, create, deps); + } - if (isSimpleFunctionComponent(type) && Component.compare === null && // SimpleMemoComponent codepath doesn't resolve outer props either. - Component.defaultProps === undefined) { - var resolvedType = type; + function updateLayoutEffect(create, deps) { + return updateEffectImpl(Update, Layout, create, deps); + } - { - resolvedType = resolveFunctionForHotReloading(type); - } // If this is a plain function component without default props, - // and with only the default shallow comparison, we upgrade it - // to a SimpleMemoComponent to allow fast path updates. + function imperativeHandleEffect(create, ref) { + if (typeof ref === 'function') { + var refCallback = ref; + var _inst = create(); - workInProgress.tag = SimpleMemoComponent; - workInProgress.type = resolvedType; + refCallback(_inst); + return function () { + refCallback(null); + }; + } else if (ref !== null && ref !== undefined) { + var refObject = ref; { - validateFunctionComponentInDev(workInProgress, type); + if (!refObject.hasOwnProperty('current')) { + error('Expected useImperativeHandle() first argument to either be a ' + 'ref callback or React.createRef() object. Instead received: %s.', 'an object with keys {' + Object.keys(refObject).join(', ') + '}'); + } } - return updateSimpleMemoComponent(current$$1, workInProgress, resolvedType, nextProps, updateExpirationTime, renderExpirationTime); + var _inst2 = create(); + + refObject.current = _inst2; + return function () { + refObject.current = null; + }; } + } + function mountImperativeHandle(ref, create, deps) { { - var innerPropTypes = type.propTypes; - - if (innerPropTypes) { - // Inner memo component props aren't currently validated in createElement. - // We could move it there, but we'd still need this for lazy code path. - checkPropTypes_1(innerPropTypes, nextProps, // Resolved props - 'prop', getComponentName(type), getCurrentFiberStackInDev); + if (typeof create !== 'function') { + error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null'); } - } + } // TODO: If deps are provided, should we skip comparing the ref itself? + - var child = createFiberFromTypeAndProps(Component.type, null, nextProps, null, workInProgress.mode, renderExpirationTime); - child.ref = workInProgress.ref; - child.return = workInProgress; - workInProgress.child = child; - return child; + var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null; + return mountEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps); } - { - var _type = Component.type; - var _innerPropTypes = _type.propTypes; + function updateImperativeHandle(ref, create, deps) { + { + if (typeof create !== 'function') { + error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null'); + } + } // TODO: If deps are provided, should we skip comparing the ref itself? - if (_innerPropTypes) { - // Inner memo component props aren't currently validated in createElement. - // We could move it there, but we'd still need this for lazy code path. - checkPropTypes_1(_innerPropTypes, nextProps, // Resolved props - 'prop', getComponentName(_type), getCurrentFiberStackInDev); - } + + var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null; + return updateEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps); } - var currentChild = current$$1.child; // This is always exactly one child + function mountDebugValue(value, formatterFn) {// This hook is normally a no-op. + // The react-debug-hooks package injects its own implementation + // so that e.g. DevTools can display custom hook values. + } - if (updateExpirationTime < renderExpirationTime) { - // This will be the props with resolved defaultProps, - // unlike current.memoizedProps which will be the unresolved ones. - var prevProps = currentChild.memoizedProps; // Default to shallow comparison + var updateDebugValue = mountDebugValue; - var compare = Component.compare; - compare = compare !== null ? compare : shallowEqual; + function mountCallback(callback, deps) { + var hook = mountWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + hook.memoizedState = [callback, nextDeps]; + return callback; + } - if (compare(prevProps, nextProps) && current$$1.ref === workInProgress.ref) { - return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime); - } - } // React DevTools reads this flag. + function updateCallback(callback, deps) { + var hook = updateWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + var prevState = hook.memoizedState; + if (prevState !== null) { + if (nextDeps !== null) { + var prevDeps = prevState[1]; - workInProgress.effectTag |= PerformedWork; - var newChild = createWorkInProgress(currentChild, nextProps, renderExpirationTime); - newChild.ref = workInProgress.ref; - newChild.return = workInProgress; - workInProgress.child = newChild; - return newChild; -} + if (areHookInputsEqual(nextDeps, prevDeps)) { + return prevState[0]; + } + } + } -function updateSimpleMemoComponent(current$$1, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) { - // TODO: current can be non-null here even if the component - // hasn't yet mounted. This happens when the inner render suspends. - // We'll need to figure out if this is fine or can cause issues. - { - if (workInProgress.type !== workInProgress.elementType) { - // Lazy component props can't be validated in createElement - // because they're only guaranteed to be resolved here. - var outerMemoType = workInProgress.elementType; + hook.memoizedState = [callback, nextDeps]; + return callback; + } - if (outerMemoType.$$typeof === REACT_LAZY_TYPE) { - // We warn when you define propTypes on lazy() - // so let's just skip over it to find memo() outer wrapper. - // Inner props for memo are validated later. - outerMemoType = refineResolvedLazyComponent(outerMemoType); - } + function mountMemo(nextCreate, deps) { + var hook = mountWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + var nextValue = nextCreate(); + hook.memoizedState = [nextValue, nextDeps]; + return nextValue; + } - var outerPropTypes = outerMemoType && outerMemoType.propTypes; + function updateMemo(nextCreate, deps) { + var hook = updateWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + var prevState = hook.memoizedState; - if (outerPropTypes) { - checkPropTypes_1(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps) - 'prop', getComponentName(outerMemoType), getCurrentFiberStackInDev); - } // Inner propTypes will be validated in the function component path. + if (prevState !== null) { + // Assume these are defined. If they're not, areHookInputsEqual will warn. + if (nextDeps !== null) { + var prevDeps = prevState[1]; + if (areHookInputsEqual(nextDeps, prevDeps)) { + return prevState[0]; + } + } } + + var nextValue = nextCreate(); + hook.memoizedState = [nextValue, nextDeps]; + return nextValue; } - if (current$$1 !== null) { - var prevProps = current$$1.memoizedProps; + function mountDeferredValue(value, config) { + var _mountState = mountState(value), + prevValue = _mountState[0], + setValue = _mountState[1]; - if (shallowEqual(prevProps, nextProps) && current$$1.ref === workInProgress.ref && ( // Prevent bailout if the implementation changed due to hot reload: - workInProgress.type === current$$1.type)) { - didReceiveUpdate = false; + mountEffect(function () { + var previousConfig = ReactCurrentBatchConfig$1.suspense; + ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config; - if (updateExpirationTime < renderExpirationTime) { - return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime); + try { + setValue(value); + } finally { + ReactCurrentBatchConfig$1.suspense = previousConfig; } - } + }, [value, config]); + return prevValue; } - return updateFunctionComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime); -} + function updateDeferredValue(value, config) { + var _updateState = updateState(), + prevValue = _updateState[0], + setValue = _updateState[1]; -function updateFragment(current$$1, workInProgress, renderExpirationTime) { - var nextChildren = workInProgress.pendingProps; - reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime); - return workInProgress.child; -} - -function updateMode(current$$1, workInProgress, renderExpirationTime) { - var nextChildren = workInProgress.pendingProps.children; - reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime); - return workInProgress.child; -} + updateEffect(function () { + var previousConfig = ReactCurrentBatchConfig$1.suspense; + ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config; -function updateProfiler(current$$1, workInProgress, renderExpirationTime) { - if (enableProfilerTimer) { - workInProgress.effectTag |= Update; + try { + setValue(value); + } finally { + ReactCurrentBatchConfig$1.suspense = previousConfig; + } + }, [value, config]); + return prevValue; } - var nextProps = workInProgress.pendingProps; - var nextChildren = nextProps.children; - reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime); - return workInProgress.child; -} + function rerenderDeferredValue(value, config) { + var _rerenderState = rerenderState(), + prevValue = _rerenderState[0], + setValue = _rerenderState[1]; -function markRef(current$$1, workInProgress) { - var ref = workInProgress.ref; + updateEffect(function () { + var previousConfig = ReactCurrentBatchConfig$1.suspense; + ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config; - if (current$$1 === null && ref !== null || current$$1 !== null && current$$1.ref !== ref) { - // Schedule a Ref effect - workInProgress.effectTag |= Ref; + try { + setValue(value); + } finally { + ReactCurrentBatchConfig$1.suspense = previousConfig; + } + }, [value, config]); + return prevValue; } -} -function updateFunctionComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime) { - { - if (workInProgress.type !== workInProgress.elementType) { - // Lazy component props can't be validated in createElement - // because they're only guaranteed to be resolved here. - var innerPropTypes = Component.propTypes; + function startTransition(setPending, config, callback) { + var priorityLevel = getCurrentPriorityLevel(); + runWithPriority$1(priorityLevel < UserBlockingPriority$1 ? UserBlockingPriority$1 : priorityLevel, function () { + setPending(true); + }); + runWithPriority$1(priorityLevel > NormalPriority ? NormalPriority : priorityLevel, function () { + var previousConfig = ReactCurrentBatchConfig$1.suspense; + ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config; - if (innerPropTypes) { - checkPropTypes_1(innerPropTypes, nextProps, // Resolved props - 'prop', getComponentName(Component), getCurrentFiberStackInDev); + try { + setPending(false); + callback(); + } finally { + ReactCurrentBatchConfig$1.suspense = previousConfig; } - } + }); } - var context; + function mountTransition(config) { + var _mountState2 = mountState(false), + isPending = _mountState2[0], + setPending = _mountState2[1]; - if (!disableLegacyContext) { - var unmaskedContext = getUnmaskedContext(workInProgress, Component, true); - context = getMaskedContext(workInProgress, unmaskedContext); + var start = mountCallback(startTransition.bind(null, setPending, config), [setPending, config]); + return [start, isPending]; } - var nextChildren; - prepareToReadContext(workInProgress, renderExpirationTime); + function updateTransition(config) { + var _updateState2 = updateState(), + isPending = _updateState2[0], + setPending = _updateState2[1]; - { - ReactCurrentOwner$3.current = workInProgress; - setCurrentPhase('render'); - nextChildren = renderWithHooks(current$$1, workInProgress, Component, nextProps, context, renderExpirationTime); + var start = updateCallback(startTransition.bind(null, setPending, config), [setPending, config]); + return [start, isPending]; + } - if (debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) { - // Only double-render components with Hooks - if (workInProgress.memoizedState !== null) { - nextChildren = renderWithHooks(current$$1, workInProgress, Component, nextProps, context, renderExpirationTime); - } - } + function rerenderTransition(config) { + var _rerenderState2 = rerenderState(), + isPending = _rerenderState2[0], + setPending = _rerenderState2[1]; - setCurrentPhase(null); + var start = updateCallback(startTransition.bind(null, setPending, config), [setPending, config]); + return [start, isPending]; } - if (current$$1 !== null && !didReceiveUpdate) { - bailoutHooks(current$$1, workInProgress, renderExpirationTime); - return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime); - } // React DevTools reads this flag. + function dispatchAction(fiber, queue, action) { + { + if (typeof arguments[3] === 'function') { + error("State updates from the useState() and useReducer() Hooks don't support the " + 'second callback argument. To execute a side effect after ' + 'rendering, declare it in the component body with useEffect().'); + } + } + + var currentTime = requestCurrentTimeForUpdate(); + var suspenseConfig = requestCurrentSuspenseConfig(); + var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig); + var update = { + expirationTime: expirationTime, + suspenseConfig: suspenseConfig, + action: action, + eagerReducer: null, + eagerState: null, + next: null + }; + { + update.priority = getCurrentPriorityLevel(); + } // Append the update to the end of the list. - workInProgress.effectTag |= PerformedWork; - reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime); - return workInProgress.child; -} -function updateClassComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime) { - { - if (workInProgress.type !== workInProgress.elementType) { - // Lazy component props can't be validated in createElement - // because they're only guaranteed to be resolved here. - var innerPropTypes = Component.propTypes; + var pending = queue.pending; - if (innerPropTypes) { - checkPropTypes_1(innerPropTypes, nextProps, // Resolved props - 'prop', getComponentName(Component), getCurrentFiberStackInDev); - } + if (pending === null) { + // This is the first update. Create a circular list. + update.next = update; + } else { + update.next = pending.next; + pending.next = update; } - } // Push context providers early to prevent context stack mismatches. - // During mounting we don't know the child context yet as the instance doesn't exist. - // We will invalidate the child context in finishClassComponent() right after rendering. + queue.pending = update; + var alternate = fiber.alternate; - var hasContext; - - if (isContextProvider(Component)) { - hasContext = true; - pushContextProvider(workInProgress); - } else { - hasContext = false; - } + if (fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1) { + // This is a render phase update. Stash it in a lazily-created map of + // queue -> linked list of updates. After this render pass, we'll restart + // and apply the stashed updates on top of the work-in-progress hook. + didScheduleRenderPhaseUpdate = true; + update.expirationTime = renderExpirationTime; + currentlyRenderingFiber$1.expirationTime = renderExpirationTime; + } else { + if (fiber.expirationTime === NoWork && (alternate === null || alternate.expirationTime === NoWork)) { + // The queue is currently empty, which means we can eagerly compute the + // next state before entering the render phase. If the new state is the + // same as the current state, we may be able to bail out entirely. + var lastRenderedReducer = queue.lastRenderedReducer; - prepareToReadContext(workInProgress, renderExpirationTime); - var instance = workInProgress.stateNode; - var shouldUpdate; + if (lastRenderedReducer !== null) { + var prevDispatcher; - if (instance === null) { - if (current$$1 !== null) { - // An class component without an instance only mounts if it suspended - // inside a non- concurrent tree, in an inconsistent state. We want to - // tree it like a new mount, even though an empty version of it already - // committed. Disconnect the alternate pointers. - current$$1.alternate = null; - workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect + { + prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + } - workInProgress.effectTag |= Placement; - } // In the initial pass we might need to construct the instance. + try { + var currentState = queue.lastRenderedState; + var eagerState = lastRenderedReducer(currentState, action); // Stash the eagerly computed state, and the reducer used to compute + // it, on the update object. If the reducer hasn't changed by the + // time we enter the render phase, then the eager state can be used + // without calling the reducer again. + + update.eagerReducer = lastRenderedReducer; + update.eagerState = eagerState; + + if (objectIs(eagerState, currentState)) { + // Fast path. We can bail out without scheduling React to re-render. + // It's still possible that we'll need to rebase this update later, + // if the component re-renders for a different reason and by that + // time the reducer has changed. + return; + } + } catch (error) {// Suppress the error. It will throw again in the render phase. + } finally { + { + ReactCurrentDispatcher.current = prevDispatcher; + } + } + } + } + { + // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests + if ('undefined' !== typeof jest) { + warnIfNotScopedWithMatchingAct(fiber); + warnIfNotCurrentlyActingUpdatesInDev(fiber); + } + } - constructClassInstance(workInProgress, Component, nextProps, renderExpirationTime); - mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime); - shouldUpdate = true; - } else if (current$$1 === null) { - // In a resume, we'll already have an instance we can reuse. - shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderExpirationTime); - } else { - shouldUpdate = updateClassInstance(current$$1, workInProgress, Component, nextProps, renderExpirationTime); + scheduleWork(fiber, expirationTime); + } } - var nextUnitOfWork = finishClassComponent(current$$1, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime); + var ContextOnlyDispatcher = { + readContext: readContext, + useCallback: throwInvalidHookError, + useContext: throwInvalidHookError, + useEffect: throwInvalidHookError, + useImperativeHandle: throwInvalidHookError, + useLayoutEffect: throwInvalidHookError, + useMemo: throwInvalidHookError, + useReducer: throwInvalidHookError, + useRef: throwInvalidHookError, + useState: throwInvalidHookError, + useDebugValue: throwInvalidHookError, + useResponder: throwInvalidHookError, + useDeferredValue: throwInvalidHookError, + useTransition: throwInvalidHookError + }; + var HooksDispatcherOnMountInDEV = null; + var HooksDispatcherOnMountWithHookTypesInDEV = null; + var HooksDispatcherOnUpdateInDEV = null; + var HooksDispatcherOnRerenderInDEV = null; + var InvalidNestedHooksDispatcherOnMountInDEV = null; + var InvalidNestedHooksDispatcherOnUpdateInDEV = null; + var InvalidNestedHooksDispatcherOnRerenderInDEV = null; { - var inst = workInProgress.stateNode; + var warnInvalidContextAccess = function () { + error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().'); + }; - if (inst.props !== nextProps) { - !didWarnAboutReassigningProps ? warning$1(false, 'It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentName(workInProgress.type) || 'a component') : void 0; - didWarnAboutReassigningProps = true; - } - } + var warnInvalidHookAccess = function () { + error('Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. ' + 'You can only call Hooks at the top level of your React function. ' + 'For more information, see ' + 'https://fb.me/rules-of-hooks'); + }; - return nextUnitOfWork; -} + HooksDispatcherOnMountInDEV = { + readContext: function (context, observedBits) { + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + mountHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV; -function finishClassComponent(current$$1, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime) { - // Refs should update even if shouldComponentUpdate returns false - markRef(current$$1, workInProgress); - var didCaptureError = (workInProgress.effectTag & DidCapture) !== NoEffect; + try { + return mountMemo(create, deps); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV; - if (!shouldUpdate && !didCaptureError) { - // Context providers should defer to sCU for rendering - if (hasContext) { - invalidateContextProvider(workInProgress, Component, false); - } + try { + return mountReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + mountHookTypesDev(); + return mountRef(initialValue); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV; - return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime); - } + try { + return mountState(initialState); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + mountHookTypesDev(); + return mountDebugValue(); + }, + useResponder: function (responder, props) { + currentHookNameInDev = 'useResponder'; + mountHookTypesDev(); + return createDeprecatedResponderListener(responder, props); + }, + useDeferredValue: function (value, config) { + currentHookNameInDev = 'useDeferredValue'; + mountHookTypesDev(); + return mountDeferredValue(value, config); + }, + useTransition: function (config) { + currentHookNameInDev = 'useTransition'; + mountHookTypesDev(); + return mountTransition(config); + } + }; + HooksDispatcherOnMountWithHookTypesInDEV = { + readContext: function (context, observedBits) { + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + updateHookTypesDev(); + return mountCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + updateHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + updateHookTypesDev(); + return mountEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + updateHookTypesDev(); + return mountImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + updateHookTypesDev(); + return mountLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV; - var instance = workInProgress.stateNode; // Rerender + try { + return mountMemo(create, deps); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV; - ReactCurrentOwner$3.current = workInProgress; - var nextChildren; + try { + return mountReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + updateHookTypesDev(); + return mountRef(initialValue); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV; - if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') { - // If we captured an error, but getDerivedStateFrom catch is not defined, - // unmount all the children. componentDidCatch will schedule an update to - // re-render a fallback. This is temporary until we migrate everyone to - // the new API. - // TODO: Warn in a future release. - nextChildren = null; + try { + return mountState(initialState); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + updateHookTypesDev(); + return mountDebugValue(); + }, + useResponder: function (responder, props) { + currentHookNameInDev = 'useResponder'; + updateHookTypesDev(); + return createDeprecatedResponderListener(responder, props); + }, + useDeferredValue: function (value, config) { + currentHookNameInDev = 'useDeferredValue'; + updateHookTypesDev(); + return mountDeferredValue(value, config); + }, + useTransition: function (config) { + currentHookNameInDev = 'useTransition'; + updateHookTypesDev(); + return mountTransition(config); + } + }; + HooksDispatcherOnUpdateInDEV = { + readContext: function (context, observedBits) { + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + updateHookTypesDev(); + return updateCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + updateHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + updateHookTypesDev(); + return updateEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + updateHookTypesDev(); + return updateImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + updateHookTypesDev(); + return updateLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV; - if (enableProfilerTimer) { - stopProfilerTimerIfRunning(workInProgress); - } - } else { - { - setCurrentPhase('render'); - nextChildren = instance.render(); + try { + return updateMemo(create, deps); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV; - if (debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) { - instance.render(); - } + try { + return updateReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + updateHookTypesDev(); + return updateRef(); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV; - setCurrentPhase(null); - } - } // React DevTools reads this flag. + try { + return updateState(initialState); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + updateHookTypesDev(); + return updateDebugValue(); + }, + useResponder: function (responder, props) { + currentHookNameInDev = 'useResponder'; + updateHookTypesDev(); + return createDeprecatedResponderListener(responder, props); + }, + useDeferredValue: function (value, config) { + currentHookNameInDev = 'useDeferredValue'; + updateHookTypesDev(); + return updateDeferredValue(value, config); + }, + useTransition: function (config) { + currentHookNameInDev = 'useTransition'; + updateHookTypesDev(); + return updateTransition(config); + } + }; + HooksDispatcherOnRerenderInDEV = { + readContext: function (context, observedBits) { + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + updateHookTypesDev(); + return updateCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + updateHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + updateHookTypesDev(); + return updateEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + updateHookTypesDev(); + return updateImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + updateHookTypesDev(); + return updateLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV; + try { + return updateMemo(create, deps); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV; - workInProgress.effectTag |= PerformedWork; + try { + return rerenderReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + updateHookTypesDev(); + return updateRef(); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV; - if (current$$1 !== null && didCaptureError) { - // If we're recovering from an error, reconcile without reusing any of - // the existing children. Conceptually, the normal children and the children - // that are shown on error are two different sets, so we shouldn't reuse - // normal children even if their identities match. - forceUnmountCurrentAndReconcile(current$$1, workInProgress, nextChildren, renderExpirationTime); - } else { - reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime); - } // Memoize state using the values we just used to render. - // TODO: Restructure so we never read values from the instance. + try { + return rerenderState(initialState); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + updateHookTypesDev(); + return updateDebugValue(); + }, + useResponder: function (responder, props) { + currentHookNameInDev = 'useResponder'; + updateHookTypesDev(); + return createDeprecatedResponderListener(responder, props); + }, + useDeferredValue: function (value, config) { + currentHookNameInDev = 'useDeferredValue'; + updateHookTypesDev(); + return rerenderDeferredValue(value, config); + }, + useTransition: function (config) { + currentHookNameInDev = 'useTransition'; + updateHookTypesDev(); + return rerenderTransition(config); + } + }; + InvalidNestedHooksDispatcherOnMountInDEV = { + readContext: function (context, observedBits) { + warnInvalidContextAccess(); + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + warnInvalidHookAccess(); + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV; + try { + return mountMemo(create, deps); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + warnInvalidHookAccess(); + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV; - workInProgress.memoizedState = instance.state; // The context might have changed so we need to recalculate it. + try { + return mountReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountRef(initialValue); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + warnInvalidHookAccess(); + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV; - if (hasContext) { - invalidateContextProvider(workInProgress, Component, true); - } + try { + return mountState(initialState); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountDebugValue(); + }, + useResponder: function (responder, props) { + currentHookNameInDev = 'useResponder'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return createDeprecatedResponderListener(responder, props); + }, + useDeferredValue: function (value, config) { + currentHookNameInDev = 'useDeferredValue'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountDeferredValue(value, config); + }, + useTransition: function (config) { + currentHookNameInDev = 'useTransition'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountTransition(config); + } + }; + InvalidNestedHooksDispatcherOnUpdateInDEV = { + readContext: function (context, observedBits) { + warnInvalidContextAccess(); + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV; - return workInProgress.child; -} + try { + return updateMemo(create, deps); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV; -function pushHostRootContext(workInProgress) { - var root = workInProgress.stateNode; + try { + return updateReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateRef(); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV; - if (root.pendingContext) { - pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context); - } else if (root.context) { - // Should always be set - pushTopLevelContextObject(workInProgress, root.context, false); - } + try { + return updateState(initialState); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateDebugValue(); + }, + useResponder: function (responder, props) { + currentHookNameInDev = 'useResponder'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return createDeprecatedResponderListener(responder, props); + }, + useDeferredValue: function (value, config) { + currentHookNameInDev = 'useDeferredValue'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateDeferredValue(value, config); + }, + useTransition: function (config) { + currentHookNameInDev = 'useTransition'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateTransition(config); + } + }; + InvalidNestedHooksDispatcherOnRerenderInDEV = { + readContext: function (context, observedBits) { + warnInvalidContextAccess(); + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV; - pushHostContainer(workInProgress, root.containerInfo); -} + try { + return updateMemo(create, deps); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV; -function updateHostRoot(current$$1, workInProgress, renderExpirationTime) { - pushHostRootContext(workInProgress); - var updateQueue = workInProgress.updateQueue; + try { + return rerenderReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateRef(); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV; - if (!(updateQueue !== null)) { - { - throw Error("If the root does not have an updateQueue, we should have already bailed out. This error is likely caused by a bug in React. Please file an issue."); - } + try { + return rerenderState(initialState); + } finally { + ReactCurrentDispatcher.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateDebugValue(); + }, + useResponder: function (responder, props) { + currentHookNameInDev = 'useResponder'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return createDeprecatedResponderListener(responder, props); + }, + useDeferredValue: function (value, config) { + currentHookNameInDev = 'useDeferredValue'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return rerenderDeferredValue(value, config); + }, + useTransition: function (config) { + currentHookNameInDev = 'useTransition'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return rerenderTransition(config); + } + }; } - var nextProps = workInProgress.pendingProps; - var prevState = workInProgress.memoizedState; - var prevChildren = prevState !== null ? prevState.element : null; - processUpdateQueue(workInProgress, updateQueue, nextProps, null, renderExpirationTime); - var nextState = workInProgress.memoizedState; // Caution: React DevTools currently depends on this property - // being called "element". - - var nextChildren = nextState.element; + var now$1 = unstable_now; + var commitTime = 0; + var profilerStartTime = -1; - if (nextChildren === prevChildren) { - // If the state is the same as before, that's a bailout because we had - // no work that expires at this time. - resetHydrationState(); - return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime); + function getCommitTime() { + return commitTime; } - var root = workInProgress.stateNode; + function recordCommitTime() { - if (root.hydrate && enterHydrationState(workInProgress)) { - // If we don't have any current children this might be the first pass. - // We always try to hydrate. If this isn't a hydration pass there won't - // be any children to hydrate which is effectively the same thing as - // not hydrating. - var child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime); - workInProgress.child = child; - var node = child; - - while (node) { - // Mark each child as hydrating. This is a fast path to know whether this - // tree is part of a hydrating tree. This is used to determine if a child - // node has fully mounted yet, and for scheduling event replaying. - // Conceptually this is similar to Placement in that a new subtree is - // inserted into the React tree here. It just happens to not need DOM - // mutations because it already exists. - node.effectTag = node.effectTag & ~Placement | Hydrating; - node = node.sibling; - } - } else { - // Otherwise reset hydration state in case we aborted and resumed another - // root. - reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime); - resetHydrationState(); + commitTime = now$1(); } - return workInProgress.child; -} + function startProfilerTimer(fiber) { -function updateHostComponent(current$$1, workInProgress, renderExpirationTime) { - pushHostContext(workInProgress); + profilerStartTime = now$1(); - if (current$$1 === null) { - tryToClaimNextHydratableInstance(workInProgress); + if (fiber.actualStartTime < 0) { + fiber.actualStartTime = now$1(); + } } - var type = workInProgress.type; - var nextProps = workInProgress.pendingProps; - var prevProps = current$$1 !== null ? current$$1.memoizedProps : null; - var nextChildren = nextProps.children; - var isDirectTextChild = shouldSetTextContent(type, nextProps); + function stopProfilerTimerIfRunning(fiber) { - if (isDirectTextChild) { - // We special case a direct text child of a host node. This is a common - // case. We won't handle it as a reified child. We will instead handle - // this in the host environment that also have access to this prop. That - // avoids allocating another HostText fiber and traversing it. - nextChildren = null; - } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) { - // If we're switching from a direct text child to a normal child, or to - // empty, we need to schedule the text content to be reset. - workInProgress.effectTag |= ContentReset; + profilerStartTime = -1; } - markRef(current$$1, workInProgress); // Check the host config to see if the children are offscreen/hidden. + function stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) { - if (workInProgress.mode & ConcurrentMode && renderExpirationTime !== Never && shouldDeprioritizeSubtree(type, nextProps)) { - if (enableSchedulerTracing) { - markSpawnedWork(Never); - } // Schedule this fiber to re-render at offscreen priority. Then bailout. + if (profilerStartTime >= 0) { + var elapsedTime = now$1() - profilerStartTime; + fiber.actualDuration += elapsedTime; + if (overrideBaseTime) { + fiber.selfBaseDuration = elapsedTime; + } - workInProgress.expirationTime = workInProgress.childExpirationTime = Never; - return null; + profilerStartTime = -1; + } } - reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime); - return workInProgress.child; -} - -function updateHostText(current$$1, workInProgress) { - if (current$$1 === null) { - tryToClaimNextHydratableInstance(workInProgress); - } // Nothing to do here. This is terminal. We'll do the completion step - // immediately after. + // This may have been an insertion or a hydration. + var hydrationParentFiber = null; + var nextHydratableInstance = null; + var isHydrating = false; - return null; -} + function enterHydrationState(fiber) { -function mountLazyComponent(_current, workInProgress, elementType, updateExpirationTime, renderExpirationTime) { - if (_current !== null) { - // An lazy component only mounts if it suspended inside a non- - // concurrent tree, in an inconsistent state. We want to treat it like - // a new mount, even though an empty version of it already committed. - // Disconnect the alternate pointers. - _current.alternate = null; - workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect - - workInProgress.effectTag |= Placement; + var parentInstance = fiber.stateNode.containerInfo; + nextHydratableInstance = getFirstHydratableChild(parentInstance); + hydrationParentFiber = fiber; + isHydrating = true; + return true; } - var props = workInProgress.pendingProps; // We can't start a User Timing measurement with correct label yet. - // Cancel and resume right after we know the tag. - - cancelWorkTimer(workInProgress); - var Component = readLazyComponentType(elementType); // Store the unwrapped component in the type. - - workInProgress.type = Component; - var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component); - startWorkTimer(workInProgress); - var resolvedProps = resolveDefaultProps(Component, props); - var child; - - switch (resolvedTag) { - case FunctionComponent: - { - { - validateFunctionComponentInDev(workInProgress, Component); - workInProgress.type = Component = resolveFunctionForHotReloading(Component); - } + function deleteHydratableInstance(returnFiber, instance) { + { + switch (returnFiber.tag) { + case HostRoot: + didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance); + break; - child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime); - break; + case HostComponent: + didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance); + break; } + } - case ClassComponent: - { - { - workInProgress.type = Component = resolveClassForHotReloading(Component); - } + var childToDelete = createFiberFromHostInstanceForDeletion(); + childToDelete.stateNode = instance; + childToDelete.return = returnFiber; + childToDelete.effectTag = Deletion; // This might seem like it belongs on progressedFirstDeletion. However, + // these children are not part of the reconciliation list of children. + // Even if we abort and rereconcile the children, that will try to hydrate + // again and the nodes are still in the host tree so these will be + // recreated. - child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime); - break; - } + if (returnFiber.lastEffect !== null) { + returnFiber.lastEffect.nextEffect = childToDelete; + returnFiber.lastEffect = childToDelete; + } else { + returnFiber.firstEffect = returnFiber.lastEffect = childToDelete; + } + } - case ForwardRef: - { - { - workInProgress.type = Component = resolveForwardRefForHotReloading(Component); - } + function insertNonHydratedInstance(returnFiber, fiber) { + fiber.effectTag = fiber.effectTag & ~Hydrating | Placement; - child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderExpirationTime); - break; - } + { + switch (returnFiber.tag) { + case HostRoot: + { + var parentContainer = returnFiber.stateNode.containerInfo; - case MemoComponent: - { - { - if (workInProgress.type !== workInProgress.elementType) { - var outerPropTypes = Component.propTypes; + switch (fiber.tag) { + case HostComponent: + var type = fiber.type; + var props = fiber.pendingProps; + didNotFindHydratableContainerInstance(parentContainer, type); + break; - if (outerPropTypes) { - checkPropTypes_1(outerPropTypes, resolvedProps, // Resolved for outer only - 'prop', getComponentName(Component), getCurrentFiberStackInDev); + case HostText: + var text = fiber.pendingProps; + didNotFindHydratableContainerTextInstance(parentContainer, text); + break; } + + break; } - } - child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too - updateExpirationTime, renderExpirationTime); - break; - } + case HostComponent: + { + var parentType = returnFiber.type; + var parentProps = returnFiber.memoizedProps; + var parentInstance = returnFiber.stateNode; - default: - { - var hint = ''; + switch (fiber.tag) { + case HostComponent: + var _type = fiber.type; + var _props = fiber.pendingProps; + didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type); + break; - { - if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) { - hint = ' Did you wrap a component in React.lazy() more than once?'; - } - } // This message intentionally doesn't mention ForwardRef or MemoComponent - // because the fact that it's a separate type of work is an - // implementation detail. + case HostText: + var _text = fiber.pendingProps; + didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text); + break; + case SuspenseComponent: + didNotFindHydratableSuspenseInstance(parentType, parentProps); + break; + } - { - { - throw Error("Element type is invalid. Received a promise that resolves to: " + Component + ". Lazy element type must resolve to a class or function." + hint); + break; } - } + + default: + return; } + } } - return child; -} - -function mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderExpirationTime) { - if (_current !== null) { - // An incomplete component only mounts if it suspended inside a non- - // concurrent tree, in an inconsistent state. We want to treat it like - // a new mount, even though an empty version of it already committed. - // Disconnect the alternate pointers. - _current.alternate = null; - workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect - - workInProgress.effectTag |= Placement; - } // Promote the fiber to a class and try rendering again. - + function tryHydrate(fiber, nextInstance) { + switch (fiber.tag) { + case HostComponent: + { + var type = fiber.type; + var props = fiber.pendingProps; + var instance = canHydrateInstance(nextInstance, type); - workInProgress.tag = ClassComponent; // The rest of this function is a fork of `updateClassComponent` - // Push context providers early to prevent context stack mismatches. - // During mounting we don't know the child context yet as the instance doesn't exist. - // We will invalidate the child context in finishClassComponent() right after rendering. + if (instance !== null) { + fiber.stateNode = instance; + return true; + } - var hasContext; + return false; + } - if (isContextProvider(Component)) { - hasContext = true; - pushContextProvider(workInProgress); - } else { - hasContext = false; - } + case HostText: + { + var text = fiber.pendingProps; + var textInstance = canHydrateTextInstance(nextInstance, text); - prepareToReadContext(workInProgress, renderExpirationTime); - constructClassInstance(workInProgress, Component, nextProps, renderExpirationTime); - mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime); - return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime); -} + if (textInstance !== null) { + fiber.stateNode = textInstance; + return true; + } -function mountIndeterminateComponent(_current, workInProgress, Component, renderExpirationTime) { - if (_current !== null) { - // An indeterminate component only mounts if it suspended inside a non- - // concurrent tree, in an inconsistent state. We want to treat it like - // a new mount, even though an empty version of it already committed. - // Disconnect the alternate pointers. - _current.alternate = null; - workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect + return false; + } - workInProgress.effectTag |= Placement; - } + case SuspenseComponent: + { - var props = workInProgress.pendingProps; - var context; + return false; + } - if (!disableLegacyContext) { - var unmaskedContext = getUnmaskedContext(workInProgress, Component, false); - context = getMaskedContext(workInProgress, unmaskedContext); + default: + return false; + } } - prepareToReadContext(workInProgress, renderExpirationTime); - var value; - - { - if (Component.prototype && typeof Component.prototype.render === 'function') { - var componentName = getComponentName(Component) || 'Unknown'; - - if (!didWarnAboutBadClass[componentName]) { - warningWithoutStack$1(false, "The <%s /> component appears to have a render method, but doesn't extend React.Component. " + 'This is likely to cause errors. Change %s to extend React.Component instead.', componentName, componentName); - didWarnAboutBadClass[componentName] = true; - } + function tryToClaimNextHydratableInstance(fiber) { + if (!isHydrating) { + return; } - if (workInProgress.mode & StrictMode) { - ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null); + var nextInstance = nextHydratableInstance; + + if (!nextInstance) { + // Nothing to hydrate. Make it an insertion. + insertNonHydratedInstance(hydrationParentFiber, fiber); + isHydrating = false; + hydrationParentFiber = fiber; + return; } - ReactCurrentOwner$3.current = workInProgress; - value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime); - } // React DevTools reads this flag. + var firstAttemptedInstance = nextInstance; + if (!tryHydrate(fiber, nextInstance)) { + // If we can't hydrate this instance let's try the next one. + // We use this as a heuristic. It's based on intuition and not data so it + // might be flawed or unnecessary. + nextInstance = getNextHydratableSibling(firstAttemptedInstance); - workInProgress.effectTag |= PerformedWork; + if (!nextInstance || !tryHydrate(fiber, nextInstance)) { + // Nothing to hydrate. Make it an insertion. + insertNonHydratedInstance(hydrationParentFiber, fiber); + isHydrating = false; + hydrationParentFiber = fiber; + return; + } // We matched the next one, we'll now assume that the first one was + // superfluous and we'll delete it. Since we can't eagerly delete it + // we'll have to schedule a deletion. To do that, this node needs a dummy + // fiber associated with it. - if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) { - { - var _componentName = getComponentName(Component) || 'Unknown'; - if (!didWarnAboutModulePatternComponent[_componentName]) { - warningWithoutStack$1(false, 'The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName, _componentName, _componentName); - didWarnAboutModulePatternComponent[_componentName] = true; - } - } // Proceed under the assumption that this is a class instance + deleteHydratableInstance(hydrationParentFiber, firstAttemptedInstance); + } + hydrationParentFiber = fiber; + nextHydratableInstance = getFirstHydratableChild(nextInstance); + } - workInProgress.tag = ClassComponent; // Throw out any hooks that were used. + function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) { - resetHooks(); // Push context providers early to prevent context stack mismatches. - // During mounting we don't know the child context yet as the instance doesn't exist. - // We will invalidate the child context in finishClassComponent() right after rendering. + var instance = fiber.stateNode; + var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber); // TODO: Type this specific to this type of component. - var hasContext = false; + fiber.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there + // is a new ref we mark this as an update. - if (isContextProvider(Component)) { - hasContext = true; - pushContextProvider(workInProgress); - } else { - hasContext = false; + if (updatePayload !== null) { + return true; } - workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null; - var getDerivedStateFromProps = Component.getDerivedStateFromProps; + return false; + } - if (typeof getDerivedStateFromProps === 'function') { - applyDerivedStateFromProps(workInProgress, Component, getDerivedStateFromProps, props); - } + function prepareToHydrateHostTextInstance(fiber) { - adoptClassInstance(workInProgress, value); - mountClassInstance(workInProgress, Component, props, renderExpirationTime); - return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime); - } else { - // Proceed under the assumption that this is a function component - workInProgress.tag = FunctionComponent; + var textInstance = fiber.stateNode; + var textContent = fiber.memoizedProps; + var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber); { - if (disableLegacyContext && Component.contextTypes) { - warningWithoutStack$1(false, '%s uses the legacy contextTypes API which is no longer supported. ' + 'Use React.createContext() with React.useContext() instead.', getComponentName(Component) || 'Unknown'); - } + if (shouldUpdate) { + // We assume that prepareToHydrateHostTextInstance is called in a context where the + // hydration parent is the parent host component of this host text. + var returnFiber = hydrationParentFiber; + + if (returnFiber !== null) { + switch (returnFiber.tag) { + case HostRoot: + { + var parentContainer = returnFiber.stateNode.containerInfo; + didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent); + break; + } - if (debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) { - // Only double-render components with Hooks - if (workInProgress.memoizedState !== null) { - value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime); + case HostComponent: + { + var parentType = returnFiber.type; + var parentProps = returnFiber.memoizedProps; + var parentInstance = returnFiber.stateNode; + didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent); + break; + } + } } } } - reconcileChildren(null, workInProgress, value, renderExpirationTime); - - { - validateFunctionComponentInDev(workInProgress, Component); - } - - return workInProgress.child; - } -} - -function validateFunctionComponentInDev(workInProgress, Component) { - if (Component) { - !!Component.childContextTypes ? warningWithoutStack$1(false, '%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component') : void 0; + return shouldUpdate; } - if (workInProgress.ref !== null) { - var info = ''; - var ownerName = getCurrentFiberOwnerNameInDevOrNull(); - - if (ownerName) { - info += '\n\nCheck the render method of `' + ownerName + '`.'; - } + function skipPastDehydratedSuspenseInstance(fiber) { - var warningKey = ownerName || workInProgress._debugID || ''; - var debugSource = workInProgress._debugSource; + var suspenseState = fiber.memoizedState; + var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null; - if (debugSource) { - warningKey = debugSource.fileName + ':' + debugSource.lineNumber; + if (!suspenseInstance) { + { + throw Error( "Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue." ); + } } - if (!didWarnAboutFunctionRefs[warningKey]) { - didWarnAboutFunctionRefs[warningKey] = true; - warning$1(false, 'Function components cannot be given refs. ' + 'Attempts to access this ref will fail. ' + 'Did you mean to use React.forwardRef()?%s', info); - } + return getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance); } - if (warnAboutDefaultPropsOnFunctionComponents && Component.defaultProps !== undefined) { - var componentName = getComponentName(Component) || 'Unknown'; + function popToNextHostParent(fiber) { + var parent = fiber.return; - if (!didWarnAboutDefaultPropsOnFunctionComponent[componentName]) { - warningWithoutStack$1(false, '%s: Support for defaultProps will be removed from function components ' + 'in a future major release. Use JavaScript default parameters instead.', componentName); - didWarnAboutDefaultPropsOnFunctionComponent[componentName] = true; + while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== SuspenseComponent) { + parent = parent.return; } + + hydrationParentFiber = parent; } - if (typeof Component.getDerivedStateFromProps === 'function') { - var _componentName2 = getComponentName(Component) || 'Unknown'; + function popHydrationState(fiber) { - if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName2]) { - warningWithoutStack$1(false, '%s: Function components do not support getDerivedStateFromProps.', _componentName2); - didWarnAboutGetDerivedStateOnFunctionComponent[_componentName2] = true; + if (fiber !== hydrationParentFiber) { + // We're deeper than the current hydration context, inside an inserted + // tree. + return false; } - } - - if (typeof Component.contextType === 'object' && Component.contextType !== null) { - var _componentName3 = getComponentName(Component) || 'Unknown'; - if (!didWarnAboutContextTypeOnFunctionComponent[_componentName3]) { - warningWithoutStack$1(false, '%s: Function components do not support contextType.', _componentName3); - didWarnAboutContextTypeOnFunctionComponent[_componentName3] = true; + if (!isHydrating) { + // If we're not currently hydrating but we're in a hydration context, then + // we were an insertion and now need to pop up reenter hydration of our + // siblings. + popToNextHostParent(fiber); + isHydrating = true; + return false; } - } -} -var SUSPENDED_MARKER = { - dehydrated: null, - retryTime: NoWork -}; + var type = fiber.type; // If we have any remaining hydratable nodes, we need to delete them now. + // We only do this deeper than head and body since they tend to have random + // other nodes in them. We also ignore components with pure text content in + // side of them. + // TODO: Better heuristic. + + if (fiber.tag !== HostComponent || type !== 'head' && type !== 'body' && !shouldSetTextContent(type, fiber.memoizedProps)) { + var nextInstance = nextHydratableInstance; -function shouldRemainOnFallback(suspenseContext, current$$1, workInProgress) { - // If the context is telling us that we should show a fallback, and we're not - // already showing content, then we should show the fallback instead. - return hasSuspenseContext(suspenseContext, ForceSuspenseFallback) && (current$$1 === null || current$$1.memoizedState !== null); -} + while (nextInstance) { + deleteHydratableInstance(fiber, nextInstance); + nextInstance = getNextHydratableSibling(nextInstance); + } + } -function updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime) { - var mode = workInProgress.mode; - var nextProps = workInProgress.pendingProps; // This is used by DevTools to force a boundary to suspend. + popToNextHostParent(fiber); - { - if (shouldSuspend(workInProgress)) { - workInProgress.effectTag |= DidCapture; + if (fiber.tag === SuspenseComponent) { + nextHydratableInstance = skipPastDehydratedSuspenseInstance(fiber); + } else { + nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null; } + + return true; } - var suspenseContext = suspenseStackCursor.current; - var nextDidTimeout = false; - var didSuspend = (workInProgress.effectTag & DidCapture) !== NoEffect; + function resetHydrationState() { - if (didSuspend || shouldRemainOnFallback(suspenseContext, current$$1, workInProgress)) { - // Something in this boundary's subtree already suspended. Switch to - // rendering the fallback children. - nextDidTimeout = true; - workInProgress.effectTag &= ~DidCapture; - } else { - // Attempting the main content - if (current$$1 === null || current$$1.memoizedState !== null) { - // This is a new mount or this boundary is already showing a fallback state. - // Mark this subtree context as having at least one invisible parent that could - // handle the fallback state. - // Boundaries without fallbacks or should be avoided are not considered since - // they cannot handle preferred fallback states. - if (nextProps.fallback !== undefined && nextProps.unstable_avoidThisFallback !== true) { - suspenseContext = addSubtreeSuspenseContext(suspenseContext, InvisibleParentSuspenseContext); - } - } + hydrationParentFiber = null; + nextHydratableInstance = null; + isHydrating = false; } - suspenseContext = setDefaultShallowSuspenseContext(suspenseContext); - pushSuspenseContext(workInProgress, suspenseContext); + var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner; + var didReceiveUpdate = false; + var didWarnAboutBadClass; + var didWarnAboutModulePatternComponent; + var didWarnAboutContextTypeOnFunctionComponent; + var didWarnAboutGetDerivedStateOnFunctionComponent; + var didWarnAboutFunctionRefs; + var didWarnAboutReassigningProps; + var didWarnAboutRevealOrder; + var didWarnAboutTailOptions; { - if ('maxDuration' in nextProps) { - if (!didWarnAboutMaxDuration) { - didWarnAboutMaxDuration = true; - warning$1(false, 'maxDuration has been removed from React. ' + 'Remove the maxDuration prop.'); - } - } - } // This next part is a bit confusing. If the children timeout, we switch to - // showing the fallback children in place of the "primary" children. - // However, we don't want to delete the primary children because then their - // state will be lost (both the React state and the host state, e.g. - // uncontrolled form inputs). Instead we keep them mounted and hide them. - // Both the fallback children AND the primary children are rendered at the - // same time. Once the primary children are un-suspended, we can delete - // the fallback children — don't need to preserve their state. - // - // The two sets of children are siblings in the host environment, but - // semantically, for purposes of reconciliation, they are two separate sets. - // So we store them using two fragment fibers. - // - // However, we want to avoid allocating extra fibers for every placeholder. - // They're only necessary when the children time out, because that's the - // only time when both sets are mounted. - // - // So, the extra fragment fibers are only used if the children time out. - // Otherwise, we render the primary children directly. This requires some - // custom reconciliation logic to preserve the state of the primary - // children. It's essentially a very basic form of re-parenting. + didWarnAboutBadClass = {}; + didWarnAboutModulePatternComponent = {}; + didWarnAboutContextTypeOnFunctionComponent = {}; + didWarnAboutGetDerivedStateOnFunctionComponent = {}; + didWarnAboutFunctionRefs = {}; + didWarnAboutReassigningProps = false; + didWarnAboutRevealOrder = {}; + didWarnAboutTailOptions = {}; + } + function reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime) { + if (current === null) { + // If this is a fresh new component that hasn't been rendered yet, we + // won't update its child set by applying minimal side-effects. Instead, + // we will add them all to the child before it gets rendered. That means + // we can optimize this reconciliation pass by not tracking side-effects. + workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime); + } else { + // If the current child is the same as the work in progress, it means that + // we haven't yet started any work on these children. Therefore, we use + // the clone algorithm to create a copy of all the current children. + // If we had any progressed work already, that is invalid at this point so + // let's throw it out. + workInProgress.child = reconcileChildFibers(workInProgress, current.child, nextChildren, renderExpirationTime); + } + } - if (current$$1 === null) { - // If we're currently hydrating, try to hydrate this boundary. - // But only if this has a fallback. - if (nextProps.fallback !== undefined) { - tryToClaimNextHydratableInstance(workInProgress); // This could've been a dehydrated suspense component. + function forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderExpirationTime) { + // This function is fork of reconcileChildren. It's used in cases where we + // want to reconcile without matching against the existing set. This has the + // effect of all current children being unmounted; even if the type and key + // are the same, the old child is unmounted and a new child is created. + // + // To do this, we're going to go through the reconcile algorithm twice. In + // the first pass, we schedule a deletion for all the current children by + // passing null. + workInProgress.child = reconcileChildFibers(workInProgress, current.child, null, renderExpirationTime); // In the second pass, we mount the new children. The trick here is that we + // pass null in place of where we usually pass the current child set. This has + // the effect of remounting all children regardless of whether their + // identities match. - if (enableSuspenseServerRenderer) { - var suspenseState = workInProgress.memoizedState; + workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime); + } - if (suspenseState !== null) { - var dehydrated = suspenseState.dehydrated; + function updateForwardRef(current, workInProgress, Component, nextProps, renderExpirationTime) { + // TODO: current can be non-null here even if the component + // hasn't yet mounted. This happens after the first render suspends. + // We'll need to figure out if this is fine or can cause issues. + { + if (workInProgress.type !== workInProgress.elementType) { + // Lazy component props can't be validated in createElement + // because they're only guaranteed to be resolved here. + var innerPropTypes = Component.propTypes; - if (dehydrated !== null) { - return mountDehydratedSuspenseComponent(workInProgress, dehydrated, renderExpirationTime); - } + if (innerPropTypes) { + checkPropTypes_1(innerPropTypes, nextProps, // Resolved props + 'prop', getComponentName(Component), getCurrentFiberStackInDev); } } - } // This is the initial mount. This branch is pretty simple because there's - // no previous state that needs to be preserved. + } + var render = Component.render; + var ref = workInProgress.ref; // The rest is a fork of updateFunctionComponent - if (nextDidTimeout) { - // Mount separate fragments for primary and fallback children. - var nextFallbackChildren = nextProps.fallback; - var primaryChildFragment = createFiberFromFragment(null, mode, NoWork, null); - primaryChildFragment.return = workInProgress; + var nextChildren; + prepareToReadContext(workInProgress, renderExpirationTime); - if ((workInProgress.mode & BlockingMode) === NoMode) { - // Outside of blocking mode, we commit the effects from the - // partially completed, timed-out tree, too. - var progressedState = workInProgress.memoizedState; - var progressedPrimaryChild = progressedState !== null ? workInProgress.child.child : workInProgress.child; - primaryChildFragment.child = progressedPrimaryChild; - var progressedChild = progressedPrimaryChild; + { + ReactCurrentOwner$1.current = workInProgress; + setIsRendering(true); + nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderExpirationTime); - while (progressedChild !== null) { - progressedChild.return = primaryChildFragment; - progressedChild = progressedChild.sibling; + if ( workInProgress.mode & StrictMode) { + // Only double-render components with Hooks + if (workInProgress.memoizedState !== null) { + nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderExpirationTime); } } - var fallbackChildFragment = createFiberFromFragment(nextFallbackChildren, mode, renderExpirationTime, null); - fallbackChildFragment.return = workInProgress; - primaryChildFragment.sibling = fallbackChildFragment; // Skip the primary children, and continue working on the - // fallback children. - - workInProgress.memoizedState = SUSPENDED_MARKER; - workInProgress.child = primaryChildFragment; - return fallbackChildFragment; - } else { - // Mount the primary children without an intermediate fragment fiber. - var nextPrimaryChildren = nextProps.children; - workInProgress.memoizedState = null; - return workInProgress.child = mountChildFibers(workInProgress, null, nextPrimaryChildren, renderExpirationTime); + setIsRendering(false); } - } else { - // This is an update. This branch is more complicated because we need to - // ensure the state of the primary children is preserved. - var prevState = current$$1.memoizedState; - if (prevState !== null) { - if (enableSuspenseServerRenderer) { - var _dehydrated = prevState.dehydrated; - - if (_dehydrated !== null) { - if (!didSuspend) { - return updateDehydratedSuspenseComponent(current$$1, workInProgress, _dehydrated, prevState, renderExpirationTime); - } else if (workInProgress.memoizedState !== null) { - // Something suspended and we should still be in dehydrated mode. - // Leave the existing child in place. - workInProgress.child = current$$1.child; // The dehydrated completion pass expects this flag to be there - // but the normal suspense pass doesn't. - - workInProgress.effectTag |= DidCapture; - return null; - } else { - // Suspended but we should no longer be in dehydrated mode. - // Therefore we now have to render the fallback. Wrap the children - // in a fragment fiber to keep them separate from the fallback - // children. - var _nextFallbackChildren = nextProps.fallback; + if (current !== null && !didReceiveUpdate) { + bailoutHooks(current, workInProgress, renderExpirationTime); + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime); + } // React DevTools reads this flag. - var _primaryChildFragment = createFiberFromFragment( // It shouldn't matter what the pending props are because we aren't - // going to render this fragment. - null, mode, NoWork, null); - _primaryChildFragment.return = workInProgress; // This is always null since we never want the previous child - // that we're not going to hydrate. + workInProgress.effectTag |= PerformedWork; + reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime); + return workInProgress.child; + } - _primaryChildFragment.child = null; + function updateMemoComponent(current, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) { + if (current === null) { + var type = Component.type; - if ((workInProgress.mode & BlockingMode) === NoMode) { - // Outside of blocking mode, we commit the effects from the - // partially completed, timed-out tree, too. - var _progressedChild = _primaryChildFragment.child = workInProgress.child; + if (isSimpleFunctionComponent(type) && Component.compare === null && // SimpleMemoComponent codepath doesn't resolve outer props either. + Component.defaultProps === undefined) { + var resolvedType = type; - while (_progressedChild !== null) { - _progressedChild.return = _primaryChildFragment; - _progressedChild = _progressedChild.sibling; - } - } else { - // We will have dropped the effect list which contains the deletion. - // We need to reconcile to delete the current child. - reconcileChildFibers(workInProgress, current$$1.child, null, renderExpirationTime); - } // Because primaryChildFragment is a new fiber that we're inserting as the - // parent of a new tree, we need to set its treeBaseDuration. + { + resolvedType = resolveFunctionForHotReloading(type); + } // If this is a plain function component without default props, + // and with only the default shallow comparison, we upgrade it + // to a SimpleMemoComponent to allow fast path updates. - if (enableProfilerTimer && workInProgress.mode & ProfileMode) { - // treeBaseDuration is the sum of all the child tree base durations. - var treeBaseDuration = 0; - var hiddenChild = _primaryChildFragment.child; + workInProgress.tag = SimpleMemoComponent; + workInProgress.type = resolvedType; - while (hiddenChild !== null) { - treeBaseDuration += hiddenChild.treeBaseDuration; - hiddenChild = hiddenChild.sibling; - } + { + validateFunctionComponentInDev(workInProgress, type); + } - _primaryChildFragment.treeBaseDuration = treeBaseDuration; - } // Create a fragment from the fallback children, too. + return updateSimpleMemoComponent(current, workInProgress, resolvedType, nextProps, updateExpirationTime, renderExpirationTime); + } + { + var innerPropTypes = type.propTypes; - var _fallbackChildFragment = createFiberFromFragment(_nextFallbackChildren, mode, renderExpirationTime, null); + if (innerPropTypes) { + // Inner memo component props aren't currently validated in createElement. + // We could move it there, but we'd still need this for lazy code path. + checkPropTypes_1(innerPropTypes, nextProps, // Resolved props + 'prop', getComponentName(type), getCurrentFiberStackInDev); + } + } - _fallbackChildFragment.return = workInProgress; - _primaryChildFragment.sibling = _fallbackChildFragment; - _fallbackChildFragment.effectTag |= Placement; - _primaryChildFragment.childExpirationTime = NoWork; - workInProgress.memoizedState = SUSPENDED_MARKER; - workInProgress.child = _primaryChildFragment; // Skip the primary children, and continue working on the - // fallback children. + var child = createFiberFromTypeAndProps(Component.type, null, nextProps, null, workInProgress.mode, renderExpirationTime); + child.ref = workInProgress.ref; + child.return = workInProgress; + workInProgress.child = child; + return child; + } - return _fallbackChildFragment; - } - } - } // The current tree already timed out. That means each child set is - // wrapped in a fragment fiber. + { + var _type = Component.type; + var _innerPropTypes = _type.propTypes; + if (_innerPropTypes) { + // Inner memo component props aren't currently validated in createElement. + // We could move it there, but we'd still need this for lazy code path. + checkPropTypes_1(_innerPropTypes, nextProps, // Resolved props + 'prop', getComponentName(_type), getCurrentFiberStackInDev); + } + } - var currentPrimaryChildFragment = current$$1.child; - var currentFallbackChildFragment = currentPrimaryChildFragment.sibling; + var currentChild = current.child; // This is always exactly one child - if (nextDidTimeout) { - // Still timed out. Reuse the current primary children by cloning - // its fragment. We're going to skip over these entirely. - var _nextFallbackChildren2 = nextProps.fallback; + if (updateExpirationTime < renderExpirationTime) { + // This will be the props with resolved defaultProps, + // unlike current.memoizedProps which will be the unresolved ones. + var prevProps = currentChild.memoizedProps; // Default to shallow comparison - var _primaryChildFragment2 = createWorkInProgress(currentPrimaryChildFragment, currentPrimaryChildFragment.pendingProps, NoWork); + var compare = Component.compare; + compare = compare !== null ? compare : shallowEqual; - _primaryChildFragment2.return = workInProgress; + if (compare(prevProps, nextProps) && current.ref === workInProgress.ref) { + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime); + } + } // React DevTools reads this flag. - if ((workInProgress.mode & BlockingMode) === NoMode) { - // Outside of blocking mode, we commit the effects from the - // partially completed, timed-out tree, too. - var _progressedState = workInProgress.memoizedState; - var _progressedPrimaryChild = _progressedState !== null ? workInProgress.child.child : workInProgress.child; + workInProgress.effectTag |= PerformedWork; + var newChild = createWorkInProgress(currentChild, nextProps); + newChild.ref = workInProgress.ref; + newChild.return = workInProgress; + workInProgress.child = newChild; + return newChild; + } - if (_progressedPrimaryChild !== currentPrimaryChildFragment.child) { - _primaryChildFragment2.child = _progressedPrimaryChild; - var _progressedChild2 = _progressedPrimaryChild; + function updateSimpleMemoComponent(current, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) { + // TODO: current can be non-null here even if the component + // hasn't yet mounted. This happens when the inner render suspends. + // We'll need to figure out if this is fine or can cause issues. + { + if (workInProgress.type !== workInProgress.elementType) { + // Lazy component props can't be validated in createElement + // because they're only guaranteed to be resolved here. + var outerMemoType = workInProgress.elementType; - while (_progressedChild2 !== null) { - _progressedChild2.return = _primaryChildFragment2; - _progressedChild2 = _progressedChild2.sibling; - } - } - } // Because primaryChildFragment is a new fiber that we're inserting as the - // parent of a new tree, we need to set its treeBaseDuration. + if (outerMemoType.$$typeof === REACT_LAZY_TYPE) { + // We warn when you define propTypes on lazy() + // so let's just skip over it to find memo() outer wrapper. + // Inner props for memo are validated later. + outerMemoType = refineResolvedLazyComponent(outerMemoType); + } + var outerPropTypes = outerMemoType && outerMemoType.propTypes; - if (enableProfilerTimer && workInProgress.mode & ProfileMode) { - // treeBaseDuration is the sum of all the child tree base durations. - var _treeBaseDuration = 0; - var _hiddenChild = _primaryChildFragment2.child; + if (outerPropTypes) { + checkPropTypes_1(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps) + 'prop', getComponentName(outerMemoType), getCurrentFiberStackInDev); + } // Inner propTypes will be validated in the function component path. - while (_hiddenChild !== null) { - _treeBaseDuration += _hiddenChild.treeBaseDuration; - _hiddenChild = _hiddenChild.sibling; - } + } + } - _primaryChildFragment2.treeBaseDuration = _treeBaseDuration; - } // Clone the fallback child fragment, too. These we'll continue - // working on. + if (current !== null) { + var prevProps = current.memoizedProps; + if (shallowEqual(prevProps, nextProps) && current.ref === workInProgress.ref && ( // Prevent bailout if the implementation changed due to hot reload. + workInProgress.type === current.type )) { + didReceiveUpdate = false; - var _fallbackChildFragment2 = createWorkInProgress(currentFallbackChildFragment, _nextFallbackChildren2, currentFallbackChildFragment.expirationTime); + if (updateExpirationTime < renderExpirationTime) { + // The pending update priority was cleared at the beginning of + // beginWork. We're about to bail out, but there might be additional + // updates at a lower priority. Usually, the priority level of the + // remaining updates is accumlated during the evaluation of the + // component (i.e. when processing the update queue). But since since + // we're bailing out early *without* evaluating the component, we need + // to account for it here, too. Reset to the value of the current fiber. + // NOTE: This only applies to SimpleMemoComponent, not MemoComponent, + // because a MemoComponent fiber does not have hooks or an update queue; + // rather, it wraps around an inner component, which may or may not + // contains hooks. + // TODO: Move the reset at in beginWork out of the common path so that + // this is no longer necessary. + workInProgress.expirationTime = current.expirationTime; + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime); + } + } + } - _fallbackChildFragment2.return = workInProgress; - _primaryChildFragment2.sibling = _fallbackChildFragment2; - _primaryChildFragment2.childExpirationTime = NoWork; // Skip the primary children, and continue working on the - // fallback children. + return updateFunctionComponent(current, workInProgress, Component, nextProps, renderExpirationTime); + } - workInProgress.memoizedState = SUSPENDED_MARKER; - workInProgress.child = _primaryChildFragment2; - return _fallbackChildFragment2; - } else { - // No longer suspended. Switch back to showing the primary children, - // and remove the intermediate fragment fiber. - var _nextPrimaryChildren = nextProps.children; - var currentPrimaryChild = currentPrimaryChildFragment.child; - var primaryChild = reconcileChildFibers(workInProgress, currentPrimaryChild, _nextPrimaryChildren, renderExpirationTime); // If this render doesn't suspend, we need to delete the fallback - // children. Wait until the complete phase, after we've confirmed the - // fallback is no longer needed. - // TODO: Would it be better to store the fallback fragment on - // the stateNode? - // Continue rendering the children, like we normally do. + function updateFragment(current, workInProgress, renderExpirationTime) { + var nextChildren = workInProgress.pendingProps; + reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime); + return workInProgress.child; + } - workInProgress.memoizedState = null; - return workInProgress.child = primaryChild; - } - } else { - // The current tree has not already timed out. That means the primary - // children are not wrapped in a fragment fiber. - var _currentPrimaryChild = current$$1.child; + function updateMode(current, workInProgress, renderExpirationTime) { + var nextChildren = workInProgress.pendingProps.children; + reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime); + return workInProgress.child; + } - if (nextDidTimeout) { - // Timed out. Wrap the children in a fragment fiber to keep them - // separate from the fallback children. - var _nextFallbackChildren3 = nextProps.fallback; + function updateProfiler(current, workInProgress, renderExpirationTime) { + { + workInProgress.effectTag |= Update; + } - var _primaryChildFragment3 = createFiberFromFragment( // It shouldn't matter what the pending props are because we aren't - // going to render this fragment. - null, mode, NoWork, null); + var nextProps = workInProgress.pendingProps; + var nextChildren = nextProps.children; + reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime); + return workInProgress.child; + } - _primaryChildFragment3.return = workInProgress; - _primaryChildFragment3.child = _currentPrimaryChild; + function markRef(current, workInProgress) { + var ref = workInProgress.ref; - if (_currentPrimaryChild !== null) { - _currentPrimaryChild.return = _primaryChildFragment3; - } // Even though we're creating a new fiber, there are no new children, - // because we're reusing an already mounted tree. So we don't need to - // schedule a placement. - // primaryChildFragment.effectTag |= Placement; + if (current === null && ref !== null || current !== null && current.ref !== ref) { + // Schedule a Ref effect + workInProgress.effectTag |= Ref; + } + } + function updateFunctionComponent(current, workInProgress, Component, nextProps, renderExpirationTime) { + { + if (workInProgress.type !== workInProgress.elementType) { + // Lazy component props can't be validated in createElement + // because they're only guaranteed to be resolved here. + var innerPropTypes = Component.propTypes; - if ((workInProgress.mode & BlockingMode) === NoMode) { - // Outside of blocking mode, we commit the effects from the - // partially completed, timed-out tree, too. - var _progressedState2 = workInProgress.memoizedState; + if (innerPropTypes) { + checkPropTypes_1(innerPropTypes, nextProps, // Resolved props + 'prop', getComponentName(Component), getCurrentFiberStackInDev); + } + } + } - var _progressedPrimaryChild2 = _progressedState2 !== null ? workInProgress.child.child : workInProgress.child; + var context; - _primaryChildFragment3.child = _progressedPrimaryChild2; - var _progressedChild3 = _progressedPrimaryChild2; + { + var unmaskedContext = getUnmaskedContext(workInProgress, Component, true); + context = getMaskedContext(workInProgress, unmaskedContext); + } - while (_progressedChild3 !== null) { - _progressedChild3.return = _primaryChildFragment3; - _progressedChild3 = _progressedChild3.sibling; - } - } // Because primaryChildFragment is a new fiber that we're inserting as the - // parent of a new tree, we need to set its treeBaseDuration. + var nextChildren; + prepareToReadContext(workInProgress, renderExpirationTime); + { + ReactCurrentOwner$1.current = workInProgress; + setIsRendering(true); + nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderExpirationTime); - if (enableProfilerTimer && workInProgress.mode & ProfileMode) { - // treeBaseDuration is the sum of all the child tree base durations. - var _treeBaseDuration2 = 0; - var _hiddenChild2 = _primaryChildFragment3.child; + if ( workInProgress.mode & StrictMode) { + // Only double-render components with Hooks + if (workInProgress.memoizedState !== null) { + nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderExpirationTime); + } + } - while (_hiddenChild2 !== null) { - _treeBaseDuration2 += _hiddenChild2.treeBaseDuration; - _hiddenChild2 = _hiddenChild2.sibling; - } + setIsRendering(false); + } - _primaryChildFragment3.treeBaseDuration = _treeBaseDuration2; - } // Create a fragment from the fallback children, too. + if (current !== null && !didReceiveUpdate) { + bailoutHooks(current, workInProgress, renderExpirationTime); + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime); + } // React DevTools reads this flag. - var _fallbackChildFragment3 = createFiberFromFragment(_nextFallbackChildren3, mode, renderExpirationTime, null); + workInProgress.effectTag |= PerformedWork; + reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime); + return workInProgress.child; + } - _fallbackChildFragment3.return = workInProgress; - _primaryChildFragment3.sibling = _fallbackChildFragment3; - _fallbackChildFragment3.effectTag |= Placement; - _primaryChildFragment3.childExpirationTime = NoWork; // Skip the primary children, and continue working on the - // fallback children. + function updateClassComponent(current, workInProgress, Component, nextProps, renderExpirationTime) { + { + if (workInProgress.type !== workInProgress.elementType) { + // Lazy component props can't be validated in createElement + // because they're only guaranteed to be resolved here. + var innerPropTypes = Component.propTypes; - workInProgress.memoizedState = SUSPENDED_MARKER; - workInProgress.child = _primaryChildFragment3; - return _fallbackChildFragment3; - } else { - // Still haven't timed out. Continue rendering the children, like we - // normally do. - workInProgress.memoizedState = null; - var _nextPrimaryChildren2 = nextProps.children; - return workInProgress.child = reconcileChildFibers(workInProgress, _currentPrimaryChild, _nextPrimaryChildren2, renderExpirationTime); + if (innerPropTypes) { + checkPropTypes_1(innerPropTypes, nextProps, // Resolved props + 'prop', getComponentName(Component), getCurrentFiberStackInDev); + } } + } // Push context providers early to prevent context stack mismatches. + // During mounting we don't know the child context yet as the instance doesn't exist. + // We will invalidate the child context in finishClassComponent() right after rendering. + + + var hasContext; + + if (isContextProvider(Component)) { + hasContext = true; + pushContextProvider(workInProgress); + } else { + hasContext = false; } - } -} -function retrySuspenseComponentWithoutHydrating(current$$1, workInProgress, renderExpirationTime) { - // We're now not suspended nor dehydrated. - workInProgress.memoizedState = null; // Retry with the full children. + prepareToReadContext(workInProgress, renderExpirationTime); + var instance = workInProgress.stateNode; + var shouldUpdate; - var nextProps = workInProgress.pendingProps; - var nextChildren = nextProps.children; // This will ensure that the children get Placement effects and - // that the old child gets a Deletion effect. - // We could also call forceUnmountCurrentAndReconcile. + if (instance === null) { + if (current !== null) { + // A class component without an instance only mounts if it suspended + // inside a non-concurrent tree, in an inconsistent state. We want to + // treat it like a new mount, even though an empty version of it already + // committed. Disconnect the alternate pointers. + current.alternate = null; + workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect + + workInProgress.effectTag |= Placement; + } // In the initial pass we might need to construct the instance. + + + constructClassInstance(workInProgress, Component, nextProps); + mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime); + shouldUpdate = true; + } else if (current === null) { + // In a resume, we'll already have an instance we can reuse. + shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderExpirationTime); + } else { + shouldUpdate = updateClassInstance(current, workInProgress, Component, nextProps, renderExpirationTime); + } - reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime); - return workInProgress.child; -} + var nextUnitOfWork = finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime); -function mountDehydratedSuspenseComponent(workInProgress, suspenseInstance, renderExpirationTime) { - // During the first pass, we'll bail out and not drill into the children. - // Instead, we'll leave the content in place and try to hydrate it later. - if ((workInProgress.mode & BlockingMode) === NoMode) { { - warning$1(false, 'Cannot hydrate Suspense in legacy mode. Switch from ' + 'ReactDOM.hydrate(element, container) to ' + 'ReactDOM.createBlockingRoot(container, { hydrate: true })' + '.render(element) or remove the Suspense components from ' + 'the server rendered components.'); - } - - workInProgress.expirationTime = Sync; - } else if (isSuspenseInstanceFallback(suspenseInstance)) { - // This is a client-only boundary. Since we won't get any content from the server - // for this, we need to schedule that at a higher priority based on when it would - // have timed out. In theory we could render it in this pass but it would have the - // wrong priority associated with it and will prevent hydration of parent path. - // Instead, we'll leave work left on it to render it in a separate commit. - // TODO This time should be the time at which the server rendered response that is - // a parent to this boundary was displayed. However, since we currently don't have - // a protocol to transfer that time, we'll just estimate it by using the current - // time. This will mean that Suspense timeouts are slightly shifted to later than - // they should be. - var serverDisplayTime = requestCurrentTimeForUpdate(); // Schedule a normal pri update to render this content. - - var newExpirationTime = computeAsyncExpiration(serverDisplayTime); - - if (enableSchedulerTracing) { - markSpawnedWork(newExpirationTime); - } - - workInProgress.expirationTime = newExpirationTime; - } else { - // We'll continue hydrating the rest at offscreen priority since we'll already - // be showing the right content coming from the server, it is no rush. - workInProgress.expirationTime = Never; - - if (enableSchedulerTracing) { - markSpawnedWork(Never); - } - } - - return null; -} - -function updateDehydratedSuspenseComponent(current$$1, workInProgress, suspenseInstance, suspenseState, renderExpirationTime) { - // We should never be hydrating at this point because it is the first pass, - // but after we've already committed once. - warnIfHydrating(); - - if ((workInProgress.mode & BlockingMode) === NoMode) { - return retrySuspenseComponentWithoutHydrating(current$$1, workInProgress, renderExpirationTime); - } - - if (isSuspenseInstanceFallback(suspenseInstance)) { - // This boundary is in a permanent fallback state. In this case, we'll never - // get an update and we'll never be able to hydrate the final content. Let's just try the - // client side render instead. - return retrySuspenseComponentWithoutHydrating(current$$1, workInProgress, renderExpirationTime); - } // We use childExpirationTime to indicate that a child might depend on context, so if - // any context has changed, we need to treat is as if the input might have changed. - - - var hasContextChanged$$1 = current$$1.childExpirationTime >= renderExpirationTime; - - if (didReceiveUpdate || hasContextChanged$$1) { - // This boundary has changed since the first render. This means that we are now unable to - // hydrate it. We might still be able to hydrate it using an earlier expiration time, if - // we are rendering at lower expiration than sync. - if (renderExpirationTime < Sync) { - if (suspenseState.retryTime <= renderExpirationTime) { - // This render is even higher pri than we've seen before, let's try again - // at even higher pri. - var attemptHydrationAtExpirationTime = renderExpirationTime + 1; - suspenseState.retryTime = attemptHydrationAtExpirationTime; - scheduleWork(current$$1, attemptHydrationAtExpirationTime); // TODO: Early abort this render. - } else {// We have already tried to ping at a higher priority than we're rendering with - // so if we got here, we must have failed to hydrate at those levels. We must - // now give up. Instead, we're going to delete the whole subtree and instead inject - // a new real Suspense boundary to take its place, which may render content - // or fallback. This might suspend for a while and if it does we might still have - // an opportunity to hydrate before this pass commits. - } - } // If we have scheduled higher pri work above, this will probably just abort the render - // since we now have higher priority work, but in case it doesn't, we need to prepare to - // render something, if we time out. Even if that requires us to delete everything and - // skip hydration. - // Delay having to do this as long as the suspense timeout allows us. - - - renderDidSuspendDelayIfPossible(); - return retrySuspenseComponentWithoutHydrating(current$$1, workInProgress, renderExpirationTime); - } else if (isSuspenseInstancePending(suspenseInstance)) { - // This component is still pending more data from the server, so we can't hydrate its - // content. We treat it as if this component suspended itself. It might seem as if - // we could just try to render it client-side instead. However, this will perform a - // lot of unnecessary work and is unlikely to complete since it often will suspend - // on missing data anyway. Additionally, the server might be able to render more - // than we can on the client yet. In that case we'd end up with more fallback states - // on the client than if we just leave it alone. If the server times out or errors - // these should update this boundary to the permanent Fallback state instead. - // Mark it as having captured (i.e. suspended). - workInProgress.effectTag |= DidCapture; // Leave the child in place. I.e. the dehydrated fragment. - - workInProgress.child = current$$1.child; // Register a callback to retry this boundary once the server has sent the result. - - registerSuspenseInstanceRetry(suspenseInstance, retryDehydratedSuspenseBoundary.bind(null, current$$1)); - return null; - } else { - // This is the first attempt. - reenterHydrationStateFromDehydratedSuspenseInstance(workInProgress, suspenseInstance); - var nextProps = workInProgress.pendingProps; - var nextChildren = nextProps.children; - var child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime); - var node = child; + var inst = workInProgress.stateNode; - while (node) { - // Mark each child as hydrating. This is a fast path to know whether this - // tree is part of a hydrating tree. This is used to determine if a child - // node has fully mounted yet, and for scheduling event replaying. - // Conceptually this is similar to Placement in that a new subtree is - // inserted into the React tree here. It just happens to not need DOM - // mutations because it already exists. - node.effectTag |= Hydrating; - node = node.sibling; + if (inst.props !== nextProps) { + if (!didWarnAboutReassigningProps) { + error('It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentName(workInProgress.type) || 'a component'); + } + + didWarnAboutReassigningProps = true; + } } - workInProgress.child = child; - return workInProgress.child; + return nextUnitOfWork; } -} -function scheduleWorkOnFiber(fiber, renderExpirationTime) { - if (fiber.expirationTime < renderExpirationTime) { - fiber.expirationTime = renderExpirationTime; - } + function finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime) { + // Refs should update even if shouldComponentUpdate returns false + markRef(current, workInProgress); + var didCaptureError = (workInProgress.effectTag & DidCapture) !== NoEffect; - var alternate = fiber.alternate; + if (!shouldUpdate && !didCaptureError) { + // Context providers should defer to sCU for rendering + if (hasContext) { + invalidateContextProvider(workInProgress, Component, false); + } - if (alternate !== null && alternate.expirationTime < renderExpirationTime) { - alternate.expirationTime = renderExpirationTime; - } + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime); + } - scheduleWorkOnParentPath(fiber.return, renderExpirationTime); -} + var instance = workInProgress.stateNode; // Rerender -function propagateSuspenseContextChange(workInProgress, firstChild, renderExpirationTime) { - // Mark any Suspense boundaries with fallbacks as having work to do. - // If they were previously forced into fallbacks, they may now be able - // to unblock. - var node = firstChild; + ReactCurrentOwner$1.current = workInProgress; + var nextChildren; - while (node !== null) { - if (node.tag === SuspenseComponent) { - var state = node.memoizedState; + if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') { + // If we captured an error, but getDerivedStateFromError is not defined, + // unmount all the children. componentDidCatch will schedule an update to + // re-render a fallback. This is temporary until we migrate everyone to + // the new API. + // TODO: Warn in a future release. + nextChildren = null; - if (state !== null) { - scheduleWorkOnFiber(node, renderExpirationTime); + { + stopProfilerTimerIfRunning(); } - } else if (node.tag === SuspenseListComponent) { - // If the tail is hidden there might not be an Suspense boundaries - // to schedule work on. In this case we have to schedule it on the - // list itself. - // We don't have to traverse to the children of the list since - // the list will propagate the change when it rerenders. - scheduleWorkOnFiber(node, renderExpirationTime); - } else if (node.child !== null) { - node.child.return = node; - node = node.child; - continue; - } + } else { + { + setIsRendering(true); + nextChildren = instance.render(); - if (node === workInProgress) { - return; - } + if ( workInProgress.mode & StrictMode) { + instance.render(); + } - while (node.sibling === null) { - if (node.return === null || node.return === workInProgress) { - return; + setIsRendering(false); } + } // React DevTools reads this flag. - node = node.return; - } - node.sibling.return = node.return; - node = node.sibling; - } -} + workInProgress.effectTag |= PerformedWork; + + if (current !== null && didCaptureError) { + // If we're recovering from an error, reconcile without reusing any of + // the existing children. Conceptually, the normal children and the children + // that are shown on error are two different sets, so we shouldn't reuse + // normal children even if their identities match. + forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderExpirationTime); + } else { + reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime); + } // Memoize state using the values we just used to render. + // TODO: Restructure so we never read values from the instance. -function findLastContentRow(firstChild) { - // This is going to find the last row among these children that is already - // showing content on the screen, as opposed to being in fallback state or - // new. If a row has multiple Suspense boundaries, any of them being in the - // fallback state, counts as the whole row being in a fallback state. - // Note that the "rows" will be workInProgress, but any nested children - // will still be current since we haven't rendered them yet. The mounted - // order may not be the same as the new order. We use the new order. - var row = firstChild; - var lastContentRow = null; - while (row !== null) { - var currentRow = row.alternate; // New rows can't be content rows. + workInProgress.memoizedState = instance.state; // The context might have changed so we need to recalculate it. - if (currentRow !== null && findFirstSuspended(currentRow) === null) { - lastContentRow = row; + if (hasContext) { + invalidateContextProvider(workInProgress, Component, true); } - row = row.sibling; + return workInProgress.child; } - return lastContentRow; -} + function pushHostRootContext(workInProgress) { + var root = workInProgress.stateNode; -function validateRevealOrder(revealOrder) { - { - if (revealOrder !== undefined && revealOrder !== 'forwards' && revealOrder !== 'backwards' && revealOrder !== 'together' && !didWarnAboutRevealOrder[revealOrder]) { - didWarnAboutRevealOrder[revealOrder] = true; - - if (typeof revealOrder === 'string') { - switch (revealOrder.toLowerCase()) { - case 'together': - case 'forwards': - case 'backwards': - { - warning$1(false, '"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'Use lowercase "%s" instead.', revealOrder, revealOrder.toLowerCase()); - break; - } + if (root.pendingContext) { + pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context); + } else if (root.context) { + // Should always be set + pushTopLevelContextObject(workInProgress, root.context, false); + } - case 'forward': - case 'backward': - { - warning$1(false, '"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'React uses the -s suffix in the spelling. Use "%ss" instead.', revealOrder, revealOrder.toLowerCase()); - break; - } + pushHostContainer(workInProgress, root.containerInfo); + } - default: - warning$1(false, '"%s" is not a supported revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder); - break; - } - } else { - warning$1(false, '%s is not a supported value for revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder); + function updateHostRoot(current, workInProgress, renderExpirationTime) { + pushHostRootContext(workInProgress); + var updateQueue = workInProgress.updateQueue; + + if (!(current !== null && updateQueue !== null)) { + { + throw Error( "If the root does not have an updateQueue, we should have already bailed out. This error is likely caused by a bug in React. Please file an issue." ); } } - } -} -function validateTailOptions(tailMode, revealOrder) { - { - if (tailMode !== undefined && !didWarnAboutTailOptions[tailMode]) { - if (tailMode !== 'collapsed' && tailMode !== 'hidden') { - didWarnAboutTailOptions[tailMode] = true; - warning$1(false, '"%s" is not a supported value for tail on <SuspenseList />. ' + 'Did you mean "collapsed" or "hidden"?', tailMode); - } else if (revealOrder !== 'forwards' && revealOrder !== 'backwards') { - didWarnAboutTailOptions[tailMode] = true; - warning$1(false, '<SuspenseList tail="%s" /> is only valid if revealOrder is ' + '"forwards" or "backwards". ' + 'Did you mean to specify revealOrder="forwards"?', tailMode); + var nextProps = workInProgress.pendingProps; + var prevState = workInProgress.memoizedState; + var prevChildren = prevState !== null ? prevState.element : null; + cloneUpdateQueue(current, workInProgress); + processUpdateQueue(workInProgress, nextProps, null, renderExpirationTime); + var nextState = workInProgress.memoizedState; // Caution: React DevTools currently depends on this property + // being called "element". + + var nextChildren = nextState.element; + + if (nextChildren === prevChildren) { + // If the state is the same as before, that's a bailout because we had + // no work that expires at this time. + resetHydrationState(); + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime); + } + + var root = workInProgress.stateNode; + + if (root.hydrate && enterHydrationState(workInProgress)) { + // If we don't have any current children this might be the first pass. + // We always try to hydrate. If this isn't a hydration pass there won't + // be any children to hydrate which is effectively the same thing as + // not hydrating. + var child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime); + workInProgress.child = child; + var node = child; + + while (node) { + // Mark each child as hydrating. This is a fast path to know whether this + // tree is part of a hydrating tree. This is used to determine if a child + // node has fully mounted yet, and for scheduling event replaying. + // Conceptually this is similar to Placement in that a new subtree is + // inserted into the React tree here. It just happens to not need DOM + // mutations because it already exists. + node.effectTag = node.effectTag & ~Placement | Hydrating; + node = node.sibling; } + } else { + // Otherwise reset hydration state in case we aborted and resumed another + // root. + reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime); + resetHydrationState(); } + + return workInProgress.child; } -} -function validateSuspenseListNestedChild(childSlot, index) { - { - var isArray = Array.isArray(childSlot); - var isIterable = !isArray && typeof getIteratorFn(childSlot) === 'function'; + function updateHostComponent(current, workInProgress, renderExpirationTime) { + pushHostContext(workInProgress); - if (isArray || isIterable) { - var type = isArray ? 'array' : 'iterable'; - warning$1(false, 'A nested %s was passed to row #%s in <SuspenseList />. Wrap it in ' + 'an additional SuspenseList to configure its revealOrder: ' + '<SuspenseList revealOrder=...> ... ' + '<SuspenseList revealOrder=...>{%s}</SuspenseList> ... ' + '</SuspenseList>', type, index, type); - return false; + if (current === null) { + tryToClaimNextHydratableInstance(workInProgress); } - } - return true; -} + var type = workInProgress.type; + var nextProps = workInProgress.pendingProps; + var prevProps = current !== null ? current.memoizedProps : null; + var nextChildren = nextProps.children; + var isDirectTextChild = shouldSetTextContent(type, nextProps); -function validateSuspenseListChildren(children, revealOrder) { - { - if ((revealOrder === 'forwards' || revealOrder === 'backwards') && children !== undefined && children !== null && children !== false) { - if (Array.isArray(children)) { - for (var i = 0; i < children.length; i++) { - if (!validateSuspenseListNestedChild(children[i], i)) { - return; - } - } - } else { - var iteratorFn = getIteratorFn(children); + if (isDirectTextChild) { + // We special case a direct text child of a host node. This is a common + // case. We won't handle it as a reified child. We will instead handle + // this in the host environment that also has access to this prop. That + // avoids allocating another HostText fiber and traversing it. + nextChildren = null; + } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) { + // If we're switching from a direct text child to a normal child, or to + // empty, we need to schedule the text content to be reset. + workInProgress.effectTag |= ContentReset; + } - if (typeof iteratorFn === 'function') { - var childrenIterator = iteratorFn.call(children); + markRef(current, workInProgress); // Check the host config to see if the children are offscreen/hidden. - if (childrenIterator) { - var step = childrenIterator.next(); - var _i = 0; + if (workInProgress.mode & ConcurrentMode && renderExpirationTime !== Never && shouldDeprioritizeSubtree(type, nextProps)) { + { + markSpawnedWork(Never); + } // Schedule this fiber to re-render at offscreen priority. Then bailout. - for (; !step.done; step = childrenIterator.next()) { - if (!validateSuspenseListNestedChild(step.value, _i)) { - return; - } - _i++; - } - } - } else { - warning$1(false, 'A single row was passed to a <SuspenseList revealOrder="%s" />. ' + 'This is not useful since it needs multiple rows. ' + 'Did you mean to pass multiple children or an array?', revealOrder); - } - } + workInProgress.expirationTime = workInProgress.childExpirationTime = Never; + return null; } + + reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime); + return workInProgress.child; } -} -function initSuspenseListRenderState(workInProgress, isBackwards, tail, lastContentRow, tailMode, lastEffectBeforeRendering) { - var renderState = workInProgress.memoizedState; + function updateHostText(current, workInProgress) { + if (current === null) { + tryToClaimNextHydratableInstance(workInProgress); + } // Nothing to do here. This is terminal. We'll do the completion step + // immediately after. - if (renderState === null) { - workInProgress.memoizedState = { - isBackwards: isBackwards, - rendering: null, - last: lastContentRow, - tail: tail, - tailExpiration: 0, - tailMode: tailMode, - lastEffect: lastEffectBeforeRendering - }; - } else { - // We can reuse the existing object from previous renders. - renderState.isBackwards = isBackwards; - renderState.rendering = null; - renderState.last = lastContentRow; - renderState.tail = tail; - renderState.tailExpiration = 0; - renderState.tailMode = tailMode; - renderState.lastEffect = lastEffectBeforeRendering; - } -} // This can end up rendering this component multiple passes. -// The first pass splits the children fibers into two sets. A head and tail. -// We first render the head. If anything is in fallback state, we do another -// pass through beginWork to rerender all children (including the tail) with -// the force suspend context. If the first render didn't have anything in -// in fallback state. Then we render each row in the tail one-by-one. -// That happens in the completeWork phase without going back to beginWork. - - -function updateSuspenseListComponent(current$$1, workInProgress, renderExpirationTime) { - var nextProps = workInProgress.pendingProps; - var revealOrder = nextProps.revealOrder; - var tailMode = nextProps.tail; - var newChildren = nextProps.children; - validateRevealOrder(revealOrder); - validateTailOptions(tailMode, revealOrder); - validateSuspenseListChildren(newChildren, revealOrder); - reconcileChildren(current$$1, workInProgress, newChildren, renderExpirationTime); - var suspenseContext = suspenseStackCursor.current; - var shouldForceFallback = hasSuspenseContext(suspenseContext, ForceSuspenseFallback); - - if (shouldForceFallback) { - suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback); - workInProgress.effectTag |= DidCapture; - } else { - var didSuspendBefore = current$$1 !== null && (current$$1.effectTag & DidCapture) !== NoEffect; - - if (didSuspendBefore) { - // If we previously forced a fallback, we need to schedule work - // on any nested boundaries to let them know to try to render - // again. This is the same as context updating. - propagateSuspenseContextChange(workInProgress, workInProgress.child, renderExpirationTime); - } - suspenseContext = setDefaultShallowSuspenseContext(suspenseContext); + return null; } - pushSuspenseContext(workInProgress, suspenseContext); + function mountLazyComponent(_current, workInProgress, elementType, updateExpirationTime, renderExpirationTime) { + if (_current !== null) { + // A lazy component only mounts if it suspended inside a non- + // concurrent tree, in an inconsistent state. We want to treat it like + // a new mount, even though an empty version of it already committed. + // Disconnect the alternate pointers. + _current.alternate = null; + workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect + + workInProgress.effectTag |= Placement; + } - if ((workInProgress.mode & BlockingMode) === NoMode) { - // Outside of blocking mode, SuspenseList doesn't work so we just - // use make it a noop by treating it as the default revealOrder. - workInProgress.memoizedState = null; - } else { - switch (revealOrder) { - case 'forwards': - { - var lastContentRow = findLastContentRow(workInProgress.child); - var tail; + var props = workInProgress.pendingProps; // We can't start a User Timing measurement with correct label yet. + // Cancel and resume right after we know the tag. - if (lastContentRow === null) { - // The whole list is part of the tail. - // TODO: We could fast path by just rendering the tail now. - tail = workInProgress.child; - workInProgress.child = null; - } else { - // Disconnect the tail rows after the content row. - // We're going to render them separately later. - tail = lastContentRow.sibling; - lastContentRow.sibling = null; - } + cancelWorkTimer(workInProgress); + var Component = readLazyComponentType(elementType); // Store the unwrapped component in the type. - initSuspenseListRenderState(workInProgress, false, // isBackwards - tail, lastContentRow, tailMode, workInProgress.lastEffect); - break; - } + workInProgress.type = Component; + var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component); + startWorkTimer(workInProgress); + var resolvedProps = resolveDefaultProps(Component, props); + var child; - case 'backwards': + switch (resolvedTag) { + case FunctionComponent: { - // We're going to find the first row that has existing content. - // At the same time we're going to reverse the list of everything - // we pass in the meantime. That's going to be our tail in reverse - // order. - var _tail = null; - var row = workInProgress.child; - workInProgress.child = null; - - while (row !== null) { - var currentRow = row.alternate; // New rows can't be content rows. - - if (currentRow !== null && findFirstSuspended(currentRow) === null) { - // This is the beginning of the main content. - workInProgress.child = row; - break; - } + { + validateFunctionComponentInDev(workInProgress, Component); + workInProgress.type = Component = resolveFunctionForHotReloading(Component); + } - var nextRow = row.sibling; - row.sibling = _tail; - _tail = row; - row = nextRow; - } // TODO: If workInProgress.child is null, we can continue on the tail immediately. + child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime); + return child; + } + case ClassComponent: + { + { + workInProgress.type = Component = resolveClassForHotReloading(Component); + } - initSuspenseListRenderState(workInProgress, true, // isBackwards - _tail, null, // last - tailMode, workInProgress.lastEffect); - break; + child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime); + return child; } - case 'together': + case ForwardRef: { - initSuspenseListRenderState(workInProgress, false, // isBackwards - null, // tail - null, // last - undefined, workInProgress.lastEffect); - break; + { + workInProgress.type = Component = resolveForwardRefForHotReloading(Component); + } + + child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderExpirationTime); + return child; } - default: + case MemoComponent: { - // The default reveal order is the same as not having - // a boundary. - workInProgress.memoizedState = null; + { + if (workInProgress.type !== workInProgress.elementType) { + var outerPropTypes = Component.propTypes; + + if (outerPropTypes) { + checkPropTypes_1(outerPropTypes, resolvedProps, // Resolved for outer only + 'prop', getComponentName(Component), getCurrentFiberStackInDev); + } + } + } + + child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too + updateExpirationTime, renderExpirationTime); + return child; } } - } - return workInProgress.child; -} + var hint = ''; -function updatePortalComponent(current$$1, workInProgress, renderExpirationTime) { - pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo); - var nextChildren = workInProgress.pendingProps; + { + if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) { + hint = ' Did you wrap a component in React.lazy() more than once?'; + } + } // This message intentionally doesn't mention ForwardRef or MemoComponent + // because the fact that it's a separate type of work is an + // implementation detail. - if (current$$1 === null) { - // Portals are special because we don't append the children during mount - // but at commit. Therefore we need to track insertions which the normal - // flow doesn't do during mount. This doesn't happen at the root because - // the root always starts with a "current" with a null child. - // TODO: Consider unifying this with how the root works. - workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime); - } else { - reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime); + + { + { + throw Error( "Element type is invalid. Received a promise that resolves to: " + Component + ". Lazy element type must resolve to a class or function." + hint ); + } + } } - return workInProgress.child; -} + function mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderExpirationTime) { + if (_current !== null) { + // An incomplete component only mounts if it suspended inside a non- + // concurrent tree, in an inconsistent state. We want to treat it like + // a new mount, even though an empty version of it already committed. + // Disconnect the alternate pointers. + _current.alternate = null; + workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect + + workInProgress.effectTag |= Placement; + } // Promote the fiber to a class and try rendering again. + -function updateContextProvider(current$$1, workInProgress, renderExpirationTime) { - var providerType = workInProgress.type; - var context = providerType._context; - var newProps = workInProgress.pendingProps; - var oldProps = workInProgress.memoizedProps; - var newValue = newProps.value; + workInProgress.tag = ClassComponent; // The rest of this function is a fork of `updateClassComponent` + // Push context providers early to prevent context stack mismatches. + // During mounting we don't know the child context yet as the instance doesn't exist. + // We will invalidate the child context in finishClassComponent() right after rendering. - { - var providerPropTypes = workInProgress.type.propTypes; + var hasContext; - if (providerPropTypes) { - checkPropTypes_1(providerPropTypes, newProps, 'prop', 'Context.Provider', getCurrentFiberStackInDev); + if (isContextProvider(Component)) { + hasContext = true; + pushContextProvider(workInProgress); + } else { + hasContext = false; } + + prepareToReadContext(workInProgress, renderExpirationTime); + constructClassInstance(workInProgress, Component, nextProps); + mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime); + return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime); } - pushProvider(workInProgress, newValue); + function mountIndeterminateComponent(_current, workInProgress, Component, renderExpirationTime) { + if (_current !== null) { + // An indeterminate component only mounts if it suspended inside a non- + // concurrent tree, in an inconsistent state. We want to treat it like + // a new mount, even though an empty version of it already committed. + // Disconnect the alternate pointers. + _current.alternate = null; + workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect - if (oldProps !== null) { - var oldValue = oldProps.value; - var changedBits = calculateChangedBits(context, newValue, oldValue); + workInProgress.effectTag |= Placement; + } - if (changedBits === 0) { - // No change. Bailout early if children are the same. - if (oldProps.children === newProps.children && !hasContextChanged()) { - return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime); - } - } else { - // The context value changed. Search for matching consumers and schedule - // them to update. - propagateContextChange(workInProgress, context, changedBits, renderExpirationTime); + var props = workInProgress.pendingProps; + var context; + + { + var unmaskedContext = getUnmaskedContext(workInProgress, Component, false); + context = getMaskedContext(workInProgress, unmaskedContext); } - } - var newChildren = newProps.children; - reconcileChildren(current$$1, workInProgress, newChildren, renderExpirationTime); - return workInProgress.child; -} + prepareToReadContext(workInProgress, renderExpirationTime); + var value; -var hasWarnedAboutUsingContextAsConsumer = false; + { + if (Component.prototype && typeof Component.prototype.render === 'function') { + var componentName = getComponentName(Component) || 'Unknown'; -function updateContextConsumer(current$$1, workInProgress, renderExpirationTime) { - var context = workInProgress.type; // The logic below for Context differs depending on PROD or DEV mode. In - // DEV mode, we create a separate object for Context.Consumer that acts - // like a proxy to Context. This proxy object adds unnecessary code in PROD - // so we use the old behaviour (Context.Consumer references Context) to - // reduce size and overhead. The separate object references context via - // a property called "_context", which also gives us the ability to check - // in DEV mode if this property exists or not and warn if it does not. + if (!didWarnAboutBadClass[componentName]) { + error("The <%s /> component appears to have a render method, but doesn't extend React.Component. " + 'This is likely to cause errors. Change %s to extend React.Component instead.', componentName, componentName); - { - if (context._context === undefined) { - // This may be because it's a Context (rather than a Consumer). - // Or it may be because it's older React where they're the same thing. - // We only want to warn if we're sure it's a new React. - if (context !== context.Consumer) { - if (!hasWarnedAboutUsingContextAsConsumer) { - hasWarnedAboutUsingContextAsConsumer = true; - warning$1(false, 'Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?'); + didWarnAboutBadClass[componentName] = true; } } - } else { - context = context._context; - } - } - var newProps = workInProgress.pendingProps; - var render = newProps.children; + if (workInProgress.mode & StrictMode) { + ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null); + } - { - !(typeof render === 'function') ? warningWithoutStack$1(false, 'A context consumer was rendered with multiple children, or a child ' + "that isn't a function. A context consumer expects a single child " + 'that is a function. If you did pass a function, make sure there ' + 'is no trailing or leading whitespace around it.') : void 0; - } + setIsRendering(true); + ReactCurrentOwner$1.current = workInProgress; + value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime); + setIsRendering(false); + } // React DevTools reads this flag. - prepareToReadContext(workInProgress, renderExpirationTime); - var newValue = readContext(context, newProps.unstable_observedBits); - var newChildren; - { - ReactCurrentOwner$3.current = workInProgress; - setCurrentPhase('render'); - newChildren = render(newValue); - setCurrentPhase(null); - } // React DevTools reads this flag. + workInProgress.effectTag |= PerformedWork; + if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) { + { + var _componentName = getComponentName(Component) || 'Unknown'; - workInProgress.effectTag |= PerformedWork; - reconcileChildren(current$$1, workInProgress, newChildren, renderExpirationTime); - return workInProgress.child; -} + if (!didWarnAboutModulePatternComponent[_componentName]) { + error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName, _componentName, _componentName); -function updateFundamentalComponent$1(current$$1, workInProgress, renderExpirationTime) { - var fundamentalImpl = workInProgress.type.impl; + didWarnAboutModulePatternComponent[_componentName] = true; + } + } // Proceed under the assumption that this is a class instance - if (fundamentalImpl.reconcileChildren === false) { - return null; - } - var nextProps = workInProgress.pendingProps; - var nextChildren = nextProps.children; - reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime); - return workInProgress.child; -} + workInProgress.tag = ClassComponent; // Throw out any hooks that were used. -function updateScopeComponent(current$$1, workInProgress, renderExpirationTime) { - var nextProps = workInProgress.pendingProps; - var nextChildren = nextProps.children; - reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime); - return workInProgress.child; -} + workInProgress.memoizedState = null; + workInProgress.updateQueue = null; // Push context providers early to prevent context stack mismatches. + // During mounting we don't know the child context yet as the instance doesn't exist. + // We will invalidate the child context in finishClassComponent() right after rendering. -function markWorkInProgressReceivedUpdate() { - didReceiveUpdate = true; -} + var hasContext = false; -function bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime) { - cancelWorkTimer(workInProgress); + if (isContextProvider(Component)) { + hasContext = true; + pushContextProvider(workInProgress); + } else { + hasContext = false; + } - if (current$$1 !== null) { - // Reuse previous dependencies - workInProgress.dependencies = current$$1.dependencies; - } + workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null; + initializeUpdateQueue(workInProgress); + var getDerivedStateFromProps = Component.getDerivedStateFromProps; - if (enableProfilerTimer) { - // Don't update "base" render times for bailouts. - stopProfilerTimerIfRunning(workInProgress); - } + if (typeof getDerivedStateFromProps === 'function') { + applyDerivedStateFromProps(workInProgress, Component, getDerivedStateFromProps, props); + } + + adoptClassInstance(workInProgress, value); + mountClassInstance(workInProgress, Component, props, renderExpirationTime); + return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime); + } else { + // Proceed under the assumption that this is a function component + workInProgress.tag = FunctionComponent; - var updateExpirationTime = workInProgress.expirationTime; + { - if (updateExpirationTime !== NoWork) { - markUnprocessedUpdateTime(updateExpirationTime); - } // Check if the children have any pending work. + if ( workInProgress.mode & StrictMode) { + // Only double-render components with Hooks + if (workInProgress.memoizedState !== null) { + value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime); + } + } + } + reconcileChildren(null, workInProgress, value, renderExpirationTime); - var childExpirationTime = workInProgress.childExpirationTime; + { + validateFunctionComponentInDev(workInProgress, Component); + } - if (childExpirationTime < renderExpirationTime) { - // The children don't have any work either. We can skip them. - // TODO: Once we add back resuming, we should check if the children are - // a work-in-progress set. If so, we need to transfer their effects. - return null; - } else { - // This fiber doesn't have work, but its subtree does. Clone the child - // fibers and continue. - cloneChildFibers(current$$1, workInProgress); - return workInProgress.child; + return workInProgress.child; + } } -} -function remountFiber(current$$1, oldWorkInProgress, newWorkInProgress) { - { - var returnFiber = oldWorkInProgress.return; + function validateFunctionComponentInDev(workInProgress, Component) { + { + if (Component) { + if (Component.childContextTypes) { + error('%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component'); + } + } - if (returnFiber === null) { - throw new Error('Cannot swap the root fiber.'); - } // Disconnect from the old current. - // It will get deleted. + if (workInProgress.ref !== null) { + var info = ''; + var ownerName = getCurrentFiberOwnerNameInDevOrNull(); + if (ownerName) { + info += '\n\nCheck the render method of `' + ownerName + '`.'; + } - current$$1.alternate = null; - oldWorkInProgress.alternate = null; // Connect to the new tree. + var warningKey = ownerName || workInProgress._debugID || ''; + var debugSource = workInProgress._debugSource; - newWorkInProgress.index = oldWorkInProgress.index; - newWorkInProgress.sibling = oldWorkInProgress.sibling; - newWorkInProgress.return = oldWorkInProgress.return; - newWorkInProgress.ref = oldWorkInProgress.ref; // Replace the child/sibling pointers above it. + if (debugSource) { + warningKey = debugSource.fileName + ':' + debugSource.lineNumber; + } - if (oldWorkInProgress === returnFiber.child) { - returnFiber.child = newWorkInProgress; - } else { - var prevSibling = returnFiber.child; + if (!didWarnAboutFunctionRefs[warningKey]) { + didWarnAboutFunctionRefs[warningKey] = true; - if (prevSibling === null) { - throw new Error('Expected parent to have a child.'); + error('Function components cannot be given refs. ' + 'Attempts to access this ref will fail. ' + 'Did you mean to use React.forwardRef()?%s', info); + } } - while (prevSibling.sibling !== oldWorkInProgress) { - prevSibling = prevSibling.sibling; + if (typeof Component.getDerivedStateFromProps === 'function') { + var _componentName2 = getComponentName(Component) || 'Unknown'; - if (prevSibling === null) { - throw new Error('Expected to find the previous sibling.'); + if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName2]) { + error('%s: Function components do not support getDerivedStateFromProps.', _componentName2); + + didWarnAboutGetDerivedStateOnFunctionComponent[_componentName2] = true; } } - prevSibling.sibling = newWorkInProgress; - } // Delete the old fiber and place the new one. - // Since the old fiber is disconnected, we have to schedule it manually. - + if (typeof Component.contextType === 'object' && Component.contextType !== null) { + var _componentName3 = getComponentName(Component) || 'Unknown'; - var last = returnFiber.lastEffect; + if (!didWarnAboutContextTypeOnFunctionComponent[_componentName3]) { + error('%s: Function components do not support contextType.', _componentName3); - if (last !== null) { - last.nextEffect = current$$1; - returnFiber.lastEffect = current$$1; - } else { - returnFiber.firstEffect = returnFiber.lastEffect = current$$1; + didWarnAboutContextTypeOnFunctionComponent[_componentName3] = true; + } + } } - - current$$1.nextEffect = null; - current$$1.effectTag = Deletion; - newWorkInProgress.effectTag |= Placement; // Restart work from the new fiber. - - return newWorkInProgress; } -} -function beginWork$1(current$$1, workInProgress, renderExpirationTime) { - var updateExpirationTime = workInProgress.expirationTime; + var SUSPENDED_MARKER = { + dehydrated: null, + retryTime: NoWork + }; - { - if (workInProgress._debugNeedsRemount && current$$1 !== null) { - // This will restart the begin phase with a new fiber. - return remountFiber(current$$1, workInProgress, createFiberFromTypeAndProps(workInProgress.type, workInProgress.key, workInProgress.pendingProps, workInProgress._debugOwner || null, workInProgress.mode, workInProgress.expirationTime)); - } + function shouldRemainOnFallback(suspenseContext, current, workInProgress) { + // If the context is telling us that we should show a fallback, and we're not + // already showing content, then we should show the fallback instead. + return hasSuspenseContext(suspenseContext, ForceSuspenseFallback) && (current === null || current.memoizedState !== null); } - if (current$$1 !== null) { - var oldProps = current$$1.memoizedProps; - var newProps = workInProgress.pendingProps; - - if (oldProps !== newProps || hasContextChanged() || ( // Force a re-render if the implementation changed due to hot reload: - workInProgress.type !== current$$1.type)) { - // If props or context changed, mark the fiber as having performed work. - // This may be unset if the props are determined to be equal later (memo). - didReceiveUpdate = true; - } else if (updateExpirationTime < renderExpirationTime) { - didReceiveUpdate = false; // This fiber does not have any pending work. Bailout without entering - // the begin phase. There's still some bookkeeping we that needs to be done - // in this optimized path, mostly pushing stuff onto the stack. - - switch (workInProgress.tag) { - case HostRoot: - pushHostRootContext(workInProgress); - resetHydrationState(); - break; + function updateSuspenseComponent(current, workInProgress, renderExpirationTime) { + var mode = workInProgress.mode; + var nextProps = workInProgress.pendingProps; // This is used by DevTools to force a boundary to suspend. - case HostComponent: - pushHostContext(workInProgress); + { + if (shouldSuspend(workInProgress)) { + workInProgress.effectTag |= DidCapture; + } + } - if (workInProgress.mode & ConcurrentMode && renderExpirationTime !== Never && shouldDeprioritizeSubtree(workInProgress.type, newProps)) { - if (enableSchedulerTracing) { - markSpawnedWork(Never); - } // Schedule this fiber to re-render at offscreen priority. Then bailout. + var suspenseContext = suspenseStackCursor.current; + var nextDidTimeout = false; + var didSuspend = (workInProgress.effectTag & DidCapture) !== NoEffect; + if (didSuspend || shouldRemainOnFallback(suspenseContext, current)) { + // Something in this boundary's subtree already suspended. Switch to + // rendering the fallback children. + nextDidTimeout = true; + workInProgress.effectTag &= ~DidCapture; + } else { + // Attempting the main content + if (current === null || current.memoizedState !== null) { + // This is a new mount or this boundary is already showing a fallback state. + // Mark this subtree context as having at least one invisible parent that could + // handle the fallback state. + // Boundaries without fallbacks or should be avoided are not considered since + // they cannot handle preferred fallback states. + if (nextProps.fallback !== undefined && nextProps.unstable_avoidThisFallback !== true) { + suspenseContext = addSubtreeSuspenseContext(suspenseContext, InvisibleParentSuspenseContext); + } + } + } - workInProgress.expirationTime = workInProgress.childExpirationTime = Never; - return null; - } + suspenseContext = setDefaultShallowSuspenseContext(suspenseContext); + pushSuspenseContext(workInProgress, suspenseContext); // This next part is a bit confusing. If the children timeout, we switch to + // showing the fallback children in place of the "primary" children. + // However, we don't want to delete the primary children because then their + // state will be lost (both the React state and the host state, e.g. + // uncontrolled form inputs). Instead we keep them mounted and hide them. + // Both the fallback children AND the primary children are rendered at the + // same time. Once the primary children are un-suspended, we can delete + // the fallback children — don't need to preserve their state. + // + // The two sets of children are siblings in the host environment, but + // semantically, for purposes of reconciliation, they are two separate sets. + // So we store them using two fragment fibers. + // + // However, we want to avoid allocating extra fibers for every placeholder. + // They're only necessary when the children time out, because that's the + // only time when both sets are mounted. + // + // So, the extra fragment fibers are only used if the children time out. + // Otherwise, we render the primary children directly. This requires some + // custom reconciliation logic to preserve the state of the primary + // children. It's essentially a very basic form of re-parenting. - break; + if (current === null) { + // If we're currently hydrating, try to hydrate this boundary. + // But only if this has a fallback. + if (nextProps.fallback !== undefined) { + tryToClaimNextHydratableInstance(workInProgress); // This could've been a dehydrated suspense component. + } // This is the initial mount. This branch is pretty simple because there's + // no previous state that needs to be preserved. - case ClassComponent: - { - var Component = workInProgress.type; - if (isContextProvider(Component)) { - pushContextProvider(workInProgress); - } + if (nextDidTimeout) { + // Mount separate fragments for primary and fallback children. + var nextFallbackChildren = nextProps.fallback; + var primaryChildFragment = createFiberFromFragment(null, mode, NoWork, null); + primaryChildFragment.return = workInProgress; - break; + if ((workInProgress.mode & BlockingMode) === NoMode) { + // Outside of blocking mode, we commit the effects from the + // partially completed, timed-out tree, too. + var progressedState = workInProgress.memoizedState; + var progressedPrimaryChild = progressedState !== null ? workInProgress.child.child : workInProgress.child; + primaryChildFragment.child = progressedPrimaryChild; + var progressedChild = progressedPrimaryChild; + + while (progressedChild !== null) { + progressedChild.return = primaryChildFragment; + progressedChild = progressedChild.sibling; } + } - case HostPortal: - pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo); - break; - - case ContextProvider: - { - var newValue = workInProgress.memoizedProps.value; - pushProvider(workInProgress, newValue); - break; - } + var fallbackChildFragment = createFiberFromFragment(nextFallbackChildren, mode, renderExpirationTime, null); + fallbackChildFragment.return = workInProgress; + primaryChildFragment.sibling = fallbackChildFragment; // Skip the primary children, and continue working on the + // fallback children. - case Profiler: - if (enableProfilerTimer) { - // Profiler should only call onRender when one of its descendants actually rendered. - var hasChildWork = workInProgress.childExpirationTime >= renderExpirationTime; + workInProgress.memoizedState = SUSPENDED_MARKER; + workInProgress.child = primaryChildFragment; + return fallbackChildFragment; + } else { + // Mount the primary children without an intermediate fragment fiber. + var nextPrimaryChildren = nextProps.children; + workInProgress.memoizedState = null; + return workInProgress.child = mountChildFibers(workInProgress, null, nextPrimaryChildren, renderExpirationTime); + } + } else { + // This is an update. This branch is more complicated because we need to + // ensure the state of the primary children is preserved. + var prevState = current.memoizedState; - if (hasChildWork) { - workInProgress.effectTag |= Update; - } - } + if (prevState !== null) { + // wrapped in a fragment fiber. - break; - case SuspenseComponent: - { - var state = workInProgress.memoizedState; + var currentPrimaryChildFragment = current.child; + var currentFallbackChildFragment = currentPrimaryChildFragment.sibling; - if (state !== null) { - if (enableSuspenseServerRenderer) { - if (state.dehydrated !== null) { - pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // We know that this component will suspend again because if it has - // been unsuspended it has committed as a resolved Suspense component. - // If it needs to be retried, it should have work scheduled on it. + if (nextDidTimeout) { + // Still timed out. Reuse the current primary children by cloning + // its fragment. We're going to skip over these entirely. + var _nextFallbackChildren2 = nextProps.fallback; - workInProgress.effectTag |= DidCapture; - break; - } - } // If this boundary is currently timed out, we need to decide - // whether to retry the primary children, or to skip over it and - // go straight to the fallback. Check the priority of the primary - // child fragment. + var _primaryChildFragment2 = createWorkInProgress(currentPrimaryChildFragment, currentPrimaryChildFragment.pendingProps); + _primaryChildFragment2.return = workInProgress; - var primaryChildFragment = workInProgress.child; - var primaryChildExpirationTime = primaryChildFragment.childExpirationTime; + if ((workInProgress.mode & BlockingMode) === NoMode) { + // Outside of blocking mode, we commit the effects from the + // partially completed, timed-out tree, too. + var _progressedState = workInProgress.memoizedState; - if (primaryChildExpirationTime !== NoWork && primaryChildExpirationTime >= renderExpirationTime) { - // The primary children have pending work. Use the normal path - // to attempt to render the primary children again. - return updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime); - } else { - pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // The primary children do not have pending work with sufficient - // priority. Bailout. + var _progressedPrimaryChild = _progressedState !== null ? workInProgress.child.child : workInProgress.child; - var child = bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime); + if (_progressedPrimaryChild !== currentPrimaryChildFragment.child) { + _primaryChildFragment2.child = _progressedPrimaryChild; + var _progressedChild2 = _progressedPrimaryChild; - if (child !== null) { - // The fallback children have pending work. Skip over the - // primary children and work on the fallback. - return child.sibling; - } else { - return null; - } + while (_progressedChild2 !== null) { + _progressedChild2.return = _primaryChildFragment2; + _progressedChild2 = _progressedChild2.sibling; } - } else { - pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); } + } // Because primaryChildFragment is a new fiber that we're inserting as the + // parent of a new tree, we need to set its treeBaseDuration. - break; - } - - case SuspenseListComponent: - { - var didSuspendBefore = (current$$1.effectTag & DidCapture) !== NoEffect; - - var _hasChildWork = workInProgress.childExpirationTime >= renderExpirationTime; - if (didSuspendBefore) { - if (_hasChildWork) { - // If something was in fallback state last time, and we have all the - // same children then we're still in progressive loading state. - // Something might get unblocked by state updates or retries in the - // tree which will affect the tail. So we need to use the normal - // path to compute the correct tail. - return updateSuspenseListComponent(current$$1, workInProgress, renderExpirationTime); - } // If none of the children had any work, that means that none of - // them got retried so they'll still be blocked in the same way - // as before. We can fast bail out. + if ( workInProgress.mode & ProfileMode) { + // treeBaseDuration is the sum of all the child tree base durations. + var _treeBaseDuration = 0; + var _hiddenChild = _primaryChildFragment2.child; + while (_hiddenChild !== null) { + _treeBaseDuration += _hiddenChild.treeBaseDuration; + _hiddenChild = _hiddenChild.sibling; + } - workInProgress.effectTag |= DidCapture; - } // If nothing suspended before and we're rendering the same children, - // then the tail doesn't matter. Anything new that suspends will work - // in the "together" mode, so we can continue from the state we had. + _primaryChildFragment2.treeBaseDuration = _treeBaseDuration; + } // Clone the fallback child fragment, too. These we'll continue + // working on. - var renderState = workInProgress.memoizedState; + var _fallbackChildFragment2 = createWorkInProgress(currentFallbackChildFragment, _nextFallbackChildren2); - if (renderState !== null) { - // Reset to the "together" mode in case we've started a different - // update in the past but didn't complete it. - renderState.rendering = null; - renderState.tail = null; - } + _fallbackChildFragment2.return = workInProgress; + _primaryChildFragment2.sibling = _fallbackChildFragment2; + _primaryChildFragment2.childExpirationTime = NoWork; // Skip the primary children, and continue working on the + // fallback children. - pushSuspenseContext(workInProgress, suspenseStackCursor.current); + workInProgress.memoizedState = SUSPENDED_MARKER; + workInProgress.child = _primaryChildFragment2; + return _fallbackChildFragment2; + } else { + // No longer suspended. Switch back to showing the primary children, + // and remove the intermediate fragment fiber. + var _nextPrimaryChildren = nextProps.children; + var currentPrimaryChild = currentPrimaryChildFragment.child; + var primaryChild = reconcileChildFibers(workInProgress, currentPrimaryChild, _nextPrimaryChildren, renderExpirationTime); // If this render doesn't suspend, we need to delete the fallback + // children. Wait until the complete phase, after we've confirmed the + // fallback is no longer needed. + // TODO: Would it be better to store the fallback fragment on + // the stateNode? + // Continue rendering the children, like we normally do. - if (_hasChildWork) { - break; - } else { - // If none of the children had any work, that means that none of - // them got retried so they'll still be blocked in the same way - // as before. We can fast bail out. - return null; - } - } - } + workInProgress.memoizedState = null; + return workInProgress.child = primaryChild; + } + } else { + // The current tree has not already timed out. That means the primary + // children are not wrapped in a fragment fiber. + var _currentPrimaryChild = current.child; - return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime); - } else { - // An update was scheduled on this fiber, but there are no new props - // nor legacy context. Set this to false. If an update queue or context - // consumer produces a changed value, it will set this to true. Otherwise, - // the component will assume the children have not changed and bail out. - didReceiveUpdate = false; - } - } else { - didReceiveUpdate = false; - } // Before entering the begin phase, clear the expiration time. + if (nextDidTimeout) { + // Timed out. Wrap the children in a fragment fiber to keep them + // separate from the fallback children. + var _nextFallbackChildren3 = nextProps.fallback; + var _primaryChildFragment3 = createFiberFromFragment( // It shouldn't matter what the pending props are because we aren't + // going to render this fragment. + null, mode, NoWork, null); - workInProgress.expirationTime = NoWork; + _primaryChildFragment3.return = workInProgress; + _primaryChildFragment3.child = _currentPrimaryChild; - switch (workInProgress.tag) { - case IndeterminateComponent: - { - return mountIndeterminateComponent(current$$1, workInProgress, workInProgress.type, renderExpirationTime); - } + if (_currentPrimaryChild !== null) { + _currentPrimaryChild.return = _primaryChildFragment3; + } // Even though we're creating a new fiber, there are no new children, + // because we're reusing an already mounted tree. So we don't need to + // schedule a placement. + // primaryChildFragment.effectTag |= Placement; - case LazyComponent: - { - var elementType = workInProgress.elementType; - return mountLazyComponent(current$$1, workInProgress, elementType, updateExpirationTime, renderExpirationTime); - } - case FunctionComponent: - { - var _Component = workInProgress.type; - var unresolvedProps = workInProgress.pendingProps; - var resolvedProps = workInProgress.elementType === _Component ? unresolvedProps : resolveDefaultProps(_Component, unresolvedProps); - return updateFunctionComponent(current$$1, workInProgress, _Component, resolvedProps, renderExpirationTime); - } + if ((workInProgress.mode & BlockingMode) === NoMode) { + // Outside of blocking mode, we commit the effects from the + // partially completed, timed-out tree, too. + var _progressedState2 = workInProgress.memoizedState; - case ClassComponent: - { - var _Component2 = workInProgress.type; - var _unresolvedProps = workInProgress.pendingProps; + var _progressedPrimaryChild2 = _progressedState2 !== null ? workInProgress.child.child : workInProgress.child; - var _resolvedProps = workInProgress.elementType === _Component2 ? _unresolvedProps : resolveDefaultProps(_Component2, _unresolvedProps); + _primaryChildFragment3.child = _progressedPrimaryChild2; + var _progressedChild3 = _progressedPrimaryChild2; - return updateClassComponent(current$$1, workInProgress, _Component2, _resolvedProps, renderExpirationTime); - } + while (_progressedChild3 !== null) { + _progressedChild3.return = _primaryChildFragment3; + _progressedChild3 = _progressedChild3.sibling; + } + } // Because primaryChildFragment is a new fiber that we're inserting as the + // parent of a new tree, we need to set its treeBaseDuration. - case HostRoot: - return updateHostRoot(current$$1, workInProgress, renderExpirationTime); - case HostComponent: - return updateHostComponent(current$$1, workInProgress, renderExpirationTime); + if ( workInProgress.mode & ProfileMode) { + // treeBaseDuration is the sum of all the child tree base durations. + var _treeBaseDuration2 = 0; + var _hiddenChild2 = _primaryChildFragment3.child; - case HostText: - return updateHostText(current$$1, workInProgress); + while (_hiddenChild2 !== null) { + _treeBaseDuration2 += _hiddenChild2.treeBaseDuration; + _hiddenChild2 = _hiddenChild2.sibling; + } - case SuspenseComponent: - return updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime); + _primaryChildFragment3.treeBaseDuration = _treeBaseDuration2; + } // Create a fragment from the fallback children, too. - case HostPortal: - return updatePortalComponent(current$$1, workInProgress, renderExpirationTime); - case ForwardRef: - { - var type = workInProgress.type; - var _unresolvedProps2 = workInProgress.pendingProps; + var _fallbackChildFragment3 = createFiberFromFragment(_nextFallbackChildren3, mode, renderExpirationTime, null); - var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2); + _fallbackChildFragment3.return = workInProgress; + _primaryChildFragment3.sibling = _fallbackChildFragment3; + _fallbackChildFragment3.effectTag |= Placement; + _primaryChildFragment3.childExpirationTime = NoWork; // Skip the primary children, and continue working on the + // fallback children. - return updateForwardRef(current$$1, workInProgress, type, _resolvedProps2, renderExpirationTime); + workInProgress.memoizedState = SUSPENDED_MARKER; + workInProgress.child = _primaryChildFragment3; + return _fallbackChildFragment3; + } else { + // Still haven't timed out. Continue rendering the children, like we + // normally do. + workInProgress.memoizedState = null; + var _nextPrimaryChildren2 = nextProps.children; + return workInProgress.child = reconcileChildFibers(workInProgress, _currentPrimaryChild, _nextPrimaryChildren2, renderExpirationTime); + } } + } + } - case Fragment: - return updateFragment(current$$1, workInProgress, renderExpirationTime); - - case Mode: - return updateMode(current$$1, workInProgress, renderExpirationTime); + function scheduleWorkOnFiber(fiber, renderExpirationTime) { + if (fiber.expirationTime < renderExpirationTime) { + fiber.expirationTime = renderExpirationTime; + } - case Profiler: - return updateProfiler(current$$1, workInProgress, renderExpirationTime); + var alternate = fiber.alternate; - case ContextProvider: - return updateContextProvider(current$$1, workInProgress, renderExpirationTime); + if (alternate !== null && alternate.expirationTime < renderExpirationTime) { + alternate.expirationTime = renderExpirationTime; + } - case ContextConsumer: - return updateContextConsumer(current$$1, workInProgress, renderExpirationTime); + scheduleWorkOnParentPath(fiber.return, renderExpirationTime); + } - case MemoComponent: - { - var _type2 = workInProgress.type; - var _unresolvedProps3 = workInProgress.pendingProps; // Resolve outer props first, then resolve inner props. + function propagateSuspenseContextChange(workInProgress, firstChild, renderExpirationTime) { + // Mark any Suspense boundaries with fallbacks as having work to do. + // If they were previously forced into fallbacks, they may now be able + // to unblock. + var node = firstChild; - var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3); + while (node !== null) { + if (node.tag === SuspenseComponent) { + var state = node.memoizedState; + + if (state !== null) { + scheduleWorkOnFiber(node, renderExpirationTime); + } + } else if (node.tag === SuspenseListComponent) { + // If the tail is hidden there might not be an Suspense boundaries + // to schedule work on. In this case we have to schedule it on the + // list itself. + // We don't have to traverse to the children of the list since + // the list will propagate the change when it rerenders. + scheduleWorkOnFiber(node, renderExpirationTime); + } else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } - { - if (workInProgress.type !== workInProgress.elementType) { - var outerPropTypes = _type2.propTypes; + if (node === workInProgress) { + return; + } - if (outerPropTypes) { - checkPropTypes_1(outerPropTypes, _resolvedProps3, // Resolved for outer only - 'prop', getComponentName(_type2), getCurrentFiberStackInDev); - } - } + while (node.sibling === null) { + if (node.return === null || node.return === workInProgress) { + return; } - _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3); - return updateMemoComponent(current$$1, workInProgress, _type2, _resolvedProps3, updateExpirationTime, renderExpirationTime); + node = node.return; } - case SimpleMemoComponent: - { - return updateSimpleMemoComponent(current$$1, workInProgress, workInProgress.type, workInProgress.pendingProps, updateExpirationTime, renderExpirationTime); - } + node.sibling.return = node.return; + node = node.sibling; + } + } - case IncompleteClassComponent: - { - var _Component3 = workInProgress.type; - var _unresolvedProps4 = workInProgress.pendingProps; + function findLastContentRow(firstChild) { + // This is going to find the last row among these children that is already + // showing content on the screen, as opposed to being in fallback state or + // new. If a row has multiple Suspense boundaries, any of them being in the + // fallback state, counts as the whole row being in a fallback state. + // Note that the "rows" will be workInProgress, but any nested children + // will still be current since we haven't rendered them yet. The mounted + // order may not be the same as the new order. We use the new order. + var row = firstChild; + var lastContentRow = null; - var _resolvedProps4 = workInProgress.elementType === _Component3 ? _unresolvedProps4 : resolveDefaultProps(_Component3, _unresolvedProps4); + while (row !== null) { + var currentRow = row.alternate; // New rows can't be content rows. - return mountIncompleteClassComponent(current$$1, workInProgress, _Component3, _resolvedProps4, renderExpirationTime); + if (currentRow !== null && findFirstSuspended(currentRow) === null) { + lastContentRow = row; } - case SuspenseListComponent: - { - return updateSuspenseListComponent(current$$1, workInProgress, renderExpirationTime); - } + row = row.sibling; + } - case FundamentalComponent: - { - if (enableFundamentalAPI) { - return updateFundamentalComponent$1(current$$1, workInProgress, renderExpirationTime); - } + return lastContentRow; + } - break; - } + function validateRevealOrder(revealOrder) { + { + if (revealOrder !== undefined && revealOrder !== 'forwards' && revealOrder !== 'backwards' && revealOrder !== 'together' && !didWarnAboutRevealOrder[revealOrder]) { + didWarnAboutRevealOrder[revealOrder] = true; + + if (typeof revealOrder === 'string') { + switch (revealOrder.toLowerCase()) { + case 'together': + case 'forwards': + case 'backwards': + { + error('"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'Use lowercase "%s" instead.', revealOrder, revealOrder.toLowerCase()); - case ScopeComponent: - { - if (enableScopeAPI) { - return updateScopeComponent(current$$1, workInProgress, renderExpirationTime); - } + break; + } - break; + case 'forward': + case 'backward': + { + error('"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'React uses the -s suffix in the spelling. Use "%ss" instead.', revealOrder, revealOrder.toLowerCase()); + + break; + } + + default: + error('"%s" is not a supported revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder); + + break; + } + } else { + error('%s is not a supported value for revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder); + } } + } } - { + function validateTailOptions(tailMode, revealOrder) { { - throw Error("Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in React. Please file an issue."); + if (tailMode !== undefined && !didWarnAboutTailOptions[tailMode]) { + if (tailMode !== 'collapsed' && tailMode !== 'hidden') { + didWarnAboutTailOptions[tailMode] = true; + + error('"%s" is not a supported value for tail on <SuspenseList />. ' + 'Did you mean "collapsed" or "hidden"?', tailMode); + } else if (revealOrder !== 'forwards' && revealOrder !== 'backwards') { + didWarnAboutTailOptions[tailMode] = true; + + error('<SuspenseList tail="%s" /> is only valid if revealOrder is ' + '"forwards" or "backwards". ' + 'Did you mean to specify revealOrder="forwards"?', tailMode); + } + } } } -} -function createFundamentalStateInstance(currentFiber, props, impl, state) { - return { - currentFiber: currentFiber, - impl: impl, - instance: null, - prevProps: null, - props: props, - state: state - }; -} + function validateSuspenseListNestedChild(childSlot, index) { + { + var isArray = Array.isArray(childSlot); + var isIterable = !isArray && typeof getIteratorFn(childSlot) === 'function'; -function isFiberSuspenseAndTimedOut(fiber) { - return fiber.tag === SuspenseComponent && fiber.memoizedState !== null; -} + if (isArray || isIterable) { + var type = isArray ? 'array' : 'iterable'; -function getSuspenseFallbackChild(fiber) { - return fiber.child.sibling.child; -} + error('A nested %s was passed to row #%s in <SuspenseList />. Wrap it in ' + 'an additional SuspenseList to configure its revealOrder: ' + '<SuspenseList revealOrder=...> ... ' + '<SuspenseList revealOrder=...>{%s}</SuspenseList> ... ' + '</SuspenseList>', type, index, type); -var emptyObject$1 = {}; + return false; + } + } -function collectScopedNodes(node, fn, scopedNodes) { - if (enableScopeAPI) { - if (node.tag === HostComponent) { - var _type = node.type, - memoizedProps = node.memoizedProps, - stateNode = node.stateNode; + return true; + } - var _instance = getPublicInstance(stateNode); + function validateSuspenseListChildren(children, revealOrder) { + { + if ((revealOrder === 'forwards' || revealOrder === 'backwards') && children !== undefined && children !== null && children !== false) { + if (Array.isArray(children)) { + for (var i = 0; i < children.length; i++) { + if (!validateSuspenseListNestedChild(children[i], i)) { + return; + } + } + } else { + var iteratorFn = getIteratorFn(children); - if (_instance !== null && fn(_type, memoizedProps || emptyObject$1, _instance) === true) { - scopedNodes.push(_instance); - } - } + if (typeof iteratorFn === 'function') { + var childrenIterator = iteratorFn.call(children); - var child = node.child; + if (childrenIterator) { + var step = childrenIterator.next(); + var _i = 0; - if (isFiberSuspenseAndTimedOut(node)) { - child = getSuspenseFallbackChild(node); - } + for (; !step.done; step = childrenIterator.next()) { + if (!validateSuspenseListNestedChild(step.value, _i)) { + return; + } - if (child !== null) { - collectScopedNodesFromChildren(child, fn, scopedNodes); + _i++; + } + } + } else { + error('A single row was passed to a <SuspenseList revealOrder="%s" />. ' + 'This is not useful since it needs multiple rows. ' + 'Did you mean to pass multiple children or an array?', revealOrder); + } + } + } } } -} -function collectFirstScopedNode(node, fn) { - if (enableScopeAPI) { - if (node.tag === HostComponent) { - var _type2 = node.type, - memoizedProps = node.memoizedProps, - stateNode = node.stateNode; + function initSuspenseListRenderState(workInProgress, isBackwards, tail, lastContentRow, tailMode, lastEffectBeforeRendering) { + var renderState = workInProgress.memoizedState; - var _instance2 = getPublicInstance(stateNode); + if (renderState === null) { + workInProgress.memoizedState = { + isBackwards: isBackwards, + rendering: null, + renderingStartTime: 0, + last: lastContentRow, + tail: tail, + tailExpiration: 0, + tailMode: tailMode, + lastEffect: lastEffectBeforeRendering + }; + } else { + // We can reuse the existing object from previous renders. + renderState.isBackwards = isBackwards; + renderState.rendering = null; + renderState.renderingStartTime = 0; + renderState.last = lastContentRow; + renderState.tail = tail; + renderState.tailExpiration = 0; + renderState.tailMode = tailMode; + renderState.lastEffect = lastEffectBeforeRendering; + } + } // This can end up rendering this component multiple passes. + // The first pass splits the children fibers into two sets. A head and tail. + // We first render the head. If anything is in fallback state, we do another + // pass through beginWork to rerender all children (including the tail) with + // the force suspend context. If the first render didn't have anything in + // in fallback state. Then we render each row in the tail one-by-one. + // That happens in the completeWork phase without going back to beginWork. + + + function updateSuspenseListComponent(current, workInProgress, renderExpirationTime) { + var nextProps = workInProgress.pendingProps; + var revealOrder = nextProps.revealOrder; + var tailMode = nextProps.tail; + var newChildren = nextProps.children; + validateRevealOrder(revealOrder); + validateTailOptions(tailMode, revealOrder); + validateSuspenseListChildren(newChildren, revealOrder); + reconcileChildren(current, workInProgress, newChildren, renderExpirationTime); + var suspenseContext = suspenseStackCursor.current; + var shouldForceFallback = hasSuspenseContext(suspenseContext, ForceSuspenseFallback); + + if (shouldForceFallback) { + suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback); + workInProgress.effectTag |= DidCapture; + } else { + var didSuspendBefore = current !== null && (current.effectTag & DidCapture) !== NoEffect; - if (_instance2 !== null && fn(_type2, memoizedProps, _instance2) === true) { - return _instance2; + if (didSuspendBefore) { + // If we previously forced a fallback, we need to schedule work + // on any nested boundaries to let them know to try to render + // again. This is the same as context updating. + propagateSuspenseContextChange(workInProgress, workInProgress.child, renderExpirationTime); } + + suspenseContext = setDefaultShallowSuspenseContext(suspenseContext); } - var child = node.child; + pushSuspenseContext(workInProgress, suspenseContext); + + if ((workInProgress.mode & BlockingMode) === NoMode) { + // Outside of blocking mode, SuspenseList doesn't work so we just + // use make it a noop by treating it as the default revealOrder. + workInProgress.memoizedState = null; + } else { + switch (revealOrder) { + case 'forwards': + { + var lastContentRow = findLastContentRow(workInProgress.child); + var tail; + + if (lastContentRow === null) { + // The whole list is part of the tail. + // TODO: We could fast path by just rendering the tail now. + tail = workInProgress.child; + workInProgress.child = null; + } else { + // Disconnect the tail rows after the content row. + // We're going to render them separately later. + tail = lastContentRow.sibling; + lastContentRow.sibling = null; + } + + initSuspenseListRenderState(workInProgress, false, // isBackwards + tail, lastContentRow, tailMode, workInProgress.lastEffect); + break; + } - if (isFiberSuspenseAndTimedOut(node)) { - child = getSuspenseFallbackChild(node); - } + case 'backwards': + { + // We're going to find the first row that has existing content. + // At the same time we're going to reverse the list of everything + // we pass in the meantime. That's going to be our tail in reverse + // order. + var _tail = null; + var row = workInProgress.child; + workInProgress.child = null; - if (child !== null) { - return collectFirstScopedNodeFromChildren(child, fn); - } - } + while (row !== null) { + var currentRow = row.alternate; // New rows can't be content rows. - return null; -} + if (currentRow !== null && findFirstSuspended(currentRow) === null) { + // This is the beginning of the main content. + workInProgress.child = row; + break; + } -function collectScopedNodesFromChildren(startingChild, fn, scopedNodes) { - var child = startingChild; + var nextRow = row.sibling; + row.sibling = _tail; + _tail = row; + row = nextRow; + } // TODO: If workInProgress.child is null, we can continue on the tail immediately. - while (child !== null) { - collectScopedNodes(child, fn, scopedNodes); - child = child.sibling; - } -} -function collectFirstScopedNodeFromChildren(startingChild, fn) { - var child = startingChild; + initSuspenseListRenderState(workInProgress, true, // isBackwards + _tail, null, // last + tailMode, workInProgress.lastEffect); + break; + } - while (child !== null) { - var scopedNode = collectFirstScopedNode(child, fn); + case 'together': + { + initSuspenseListRenderState(workInProgress, false, // isBackwards + null, // tail + null, // last + undefined, workInProgress.lastEffect); + break; + } - if (scopedNode !== null) { - return scopedNode; + default: + { + // The default reveal order is the same as not having + // a boundary. + workInProgress.memoizedState = null; + } + } } - child = child.sibling; + return workInProgress.child; } - return null; -} - -function collectNearestScopeMethods(node, scope, childrenScopes) { - if (isValidScopeNode(node, scope)) { - childrenScopes.push(node.stateNode.methods); - } else { - var child = node.child; - - if (isFiberSuspenseAndTimedOut(node)) { - child = getSuspenseFallbackChild(node); - } + function updatePortalComponent(current, workInProgress, renderExpirationTime) { + pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo); + var nextChildren = workInProgress.pendingProps; - if (child !== null) { - collectNearestChildScopeMethods(child, scope, childrenScopes); + if (current === null) { + // Portals are special because we don't append the children during mount + // but at commit. Therefore we need to track insertions which the normal + // flow doesn't do during mount. This doesn't happen at the root because + // the root always starts with a "current" with a null child. + // TODO: Consider unifying this with how the root works. + workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime); + } else { + reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime); } - } -} - -function collectNearestChildScopeMethods(startingChild, scope, childrenScopes) { - var child = startingChild; - while (child !== null) { - collectNearestScopeMethods(child, scope, childrenScopes); - child = child.sibling; + return workInProgress.child; } -} -function isValidScopeNode(node, scope) { - return node.tag === ScopeComponent && node.type === scope && node.stateNode !== null; -} + function updateContextProvider(current, workInProgress, renderExpirationTime) { + var providerType = workInProgress.type; + var context = providerType._context; + var newProps = workInProgress.pendingProps; + var oldProps = workInProgress.memoizedProps; + var newValue = newProps.value; -function createScopeMethods(scope, instance) { - return { - getChildren: function () { - var currentFiber = instance.fiber; - var child = currentFiber.child; - var childrenScopes = []; + { + var providerPropTypes = workInProgress.type.propTypes; - if (child !== null) { - collectNearestChildScopeMethods(child, scope, childrenScopes); + if (providerPropTypes) { + checkPropTypes_1(providerPropTypes, newProps, 'prop', 'Context.Provider', getCurrentFiberStackInDev); } + } - return childrenScopes.length === 0 ? null : childrenScopes; - }, - getChildrenFromRoot: function () { - var currentFiber = instance.fiber; - var node = currentFiber; + pushProvider(workInProgress, newValue); - while (node !== null) { - var parent = node.return; + if (oldProps !== null) { + var oldValue = oldProps.value; + var changedBits = calculateChangedBits(context, newValue, oldValue); - if (parent === null) { - break; + if (changedBits === 0) { + // No change. Bailout early if children are the same. + if (oldProps.children === newProps.children && !hasContextChanged()) { + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime); } + } else { + // The context value changed. Search for matching consumers and schedule + // them to update. + propagateContextChange(workInProgress, context, changedBits, renderExpirationTime); + } + } - node = parent; + var newChildren = newProps.children; + reconcileChildren(current, workInProgress, newChildren, renderExpirationTime); + return workInProgress.child; + } - if (node.tag === ScopeComponent && node.type === scope) { - break; - } - } + var hasWarnedAboutUsingContextAsConsumer = false; - var childrenScopes = []; - collectNearestChildScopeMethods(node.child, scope, childrenScopes); - return childrenScopes.length === 0 ? null : childrenScopes; - }, - getParent: function () { - var node = instance.fiber.return; + function updateContextConsumer(current, workInProgress, renderExpirationTime) { + var context = workInProgress.type; // The logic below for Context differs depending on PROD or DEV mode. In + // DEV mode, we create a separate object for Context.Consumer that acts + // like a proxy to Context. This proxy object adds unnecessary code in PROD + // so we use the old behaviour (Context.Consumer references Context) to + // reduce size and overhead. The separate object references context via + // a property called "_context", which also gives us the ability to check + // in DEV mode if this property exists or not and warn if it does not. - while (node !== null) { - if (node.tag === ScopeComponent && node.type === scope) { - return node.stateNode.methods; + { + if (context._context === undefined) { + // This may be because it's a Context (rather than a Consumer). + // Or it may be because it's older React where they're the same thing. + // We only want to warn if we're sure it's a new React. + if (context !== context.Consumer) { + if (!hasWarnedAboutUsingContextAsConsumer) { + hasWarnedAboutUsingContextAsConsumer = true; + + error('Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?'); + } } - - node = node.return; + } else { + context = context._context; } + } - return null; - }, - getProps: function () { - var currentFiber = instance.fiber; - return currentFiber.memoizedProps; - }, - queryAllNodes: function (fn) { - var currentFiber = instance.fiber; - var child = currentFiber.child; - var scopedNodes = []; + var newProps = workInProgress.pendingProps; + var render = newProps.children; - if (child !== null) { - collectScopedNodesFromChildren(child, fn, scopedNodes); + { + if (typeof render !== 'function') { + error('A context consumer was rendered with multiple children, or a child ' + "that isn't a function. A context consumer expects a single child " + 'that is a function. If you did pass a function, make sure there ' + 'is no trailing or leading whitespace around it.'); } + } - return scopedNodes.length === 0 ? null : scopedNodes; - }, - queryFirstNode: function (fn) { - var currentFiber = instance.fiber; - var child = currentFiber.child; - - if (child !== null) { - return collectFirstScopedNodeFromChildren(child, fn); - } + prepareToReadContext(workInProgress, renderExpirationTime); + var newValue = readContext(context, newProps.unstable_observedBits); + var newChildren; - return null; - }, - containsNode: function (node) { - var fiber = getInstanceFromNode$2(node); + { + ReactCurrentOwner$1.current = workInProgress; + setIsRendering(true); + newChildren = render(newValue); + setIsRendering(false); + } // React DevTools reads this flag. - while (fiber !== null) { - if (fiber.tag === ScopeComponent && fiber.type === scope && fiber.stateNode === instance) { - return true; - } - fiber = fiber.return; - } + workInProgress.effectTag |= PerformedWork; + reconcileChildren(current, workInProgress, newChildren, renderExpirationTime); + return workInProgress.child; + } - return false; - } - }; -} - -function markUpdate(workInProgress) { - // Tag the fiber with an update effect. This turns a Placement into - // a PlacementAndUpdate. - workInProgress.effectTag |= Update; -} - -function markRef$1(workInProgress) { - workInProgress.effectTag |= Ref; -} - -var appendAllChildren; -var updateHostContainer; -var updateHostComponent$1; -var updateHostText$1; - -if (supportsMutation) { - // Mutation mode - appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) { - // We only have the top Fiber that was created but we need recurse down its - // children to find all the terminal nodes. - var node = workInProgress.child; + function markWorkInProgressReceivedUpdate() { + didReceiveUpdate = true; + } - while (node !== null) { - if (node.tag === HostComponent || node.tag === HostText) { - appendInitialChild(parent, node.stateNode); - } else if (enableFundamentalAPI && node.tag === FundamentalComponent) { - appendInitialChild(parent, node.stateNode.instance); - } else if (node.tag === HostPortal) {// If we have a portal child, then we don't want to traverse - // down its children. Instead, we'll get insertions from each child in - // the portal directly. - } else if (node.child !== null) { - node.child.return = node; - node = node.child; - continue; - } + function bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime) { + cancelWorkTimer(workInProgress); - if (node === workInProgress) { - return; - } + if (current !== null) { + // Reuse previous dependencies + workInProgress.dependencies = current.dependencies; + } - while (node.sibling === null) { - if (node.return === null || node.return === workInProgress) { - return; - } + { + // Don't update "base" render times for bailouts. + stopProfilerTimerIfRunning(); + } - node = node.return; - } + var updateExpirationTime = workInProgress.expirationTime; - node.sibling.return = node.return; - node = node.sibling; - } - }; + if (updateExpirationTime !== NoWork) { + markUnprocessedUpdateTime(updateExpirationTime); + } // Check if the children have any pending work. - updateHostContainer = function (workInProgress) {// Noop - }; - updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) { - // If we have an alternate, that means this is an update and we need to - // schedule a side-effect to do the updates. - var oldProps = current.memoizedProps; + var childExpirationTime = workInProgress.childExpirationTime; - if (oldProps === newProps) { - // In mutation mode, this is sufficient for a bailout because - // we won't touch this node even if children changed. - return; - } // If we get updated because one of our children updated, we don't - // have newProps so we'll have to reuse them. - // TODO: Split the update API as separate for the props vs. children. - // Even better would be if children weren't special cased at all tho. + if (childExpirationTime < renderExpirationTime) { + // The children don't have any work either. We can skip them. + // TODO: Once we add back resuming, we should check if the children are + // a work-in-progress set. If so, we need to transfer their effects. + return null; + } else { + // This fiber doesn't have work, but its subtree does. Clone the child + // fibers and continue. + cloneChildFibers(current, workInProgress); + return workInProgress.child; + } + } + function remountFiber(current, oldWorkInProgress, newWorkInProgress) { + { + var returnFiber = oldWorkInProgress.return; - var instance = workInProgress.stateNode; - var currentHostContext = getHostContext(); // TODO: Experiencing an error where oldProps is null. Suggests a host - // component is hitting the resume path. Figure out why. Possibly - // related to `hidden`. + if (returnFiber === null) { + throw new Error('Cannot swap the root fiber.'); + } // Disconnect from the old current. + // It will get deleted. - var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext); // TODO: Type this specific to this type of component. - workInProgress.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there - // is a new ref we mark this as an update. All the work is done in commitWork. + current.alternate = null; + oldWorkInProgress.alternate = null; // Connect to the new tree. - if (updatePayload) { - markUpdate(workInProgress); - } - }; + newWorkInProgress.index = oldWorkInProgress.index; + newWorkInProgress.sibling = oldWorkInProgress.sibling; + newWorkInProgress.return = oldWorkInProgress.return; + newWorkInProgress.ref = oldWorkInProgress.ref; // Replace the child/sibling pointers above it. - updateHostText$1 = function (current, workInProgress, oldText, newText) { - // If the text differs, mark it as an update. All the work in done in commitWork. - if (oldText !== newText) { - markUpdate(workInProgress); - } - }; -} else if (supportsPersistence) { - // Persistent host tree mode - appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) { - // We only have the top Fiber that was created but we need recurse down its - // children to find all the terminal nodes. - var node = workInProgress.child; + if (oldWorkInProgress === returnFiber.child) { + returnFiber.child = newWorkInProgress; + } else { + var prevSibling = returnFiber.child; - while (node !== null) { - // eslint-disable-next-line no-labels - branches: if (node.tag === HostComponent) { - var instance = node.stateNode; - - if (needsVisibilityToggle && isHidden) { - // This child is inside a timed out tree. Hide it. - var props = node.memoizedProps; - var type = node.type; - instance = cloneHiddenInstance(instance, type, props, node); - } - - appendInitialChild(parent, instance); - } else if (node.tag === HostText) { - var _instance = node.stateNode; - - if (needsVisibilityToggle && isHidden) { - // This child is inside a timed out tree. Hide it. - var text = node.memoizedProps; - _instance = cloneHiddenTextInstance(_instance, text, node); - } - - appendInitialChild(parent, _instance); - } else if (enableFundamentalAPI && node.tag === FundamentalComponent) { - var _instance2 = node.stateNode.instance; - - if (needsVisibilityToggle && isHidden) { - // This child is inside a timed out tree. Hide it. - var _props = node.memoizedProps; - var _type = node.type; - _instance2 = cloneHiddenInstance(_instance2, _type, _props, node); - } - - appendInitialChild(parent, _instance2); - } else if (node.tag === HostPortal) {// If we have a portal child, then we don't want to traverse - // down its children. Instead, we'll get insertions from each child in - // the portal directly. - } else if (node.tag === SuspenseComponent) { - if ((node.effectTag & Update) !== NoEffect) { - // Need to toggle the visibility of the primary children. - var newIsHidden = node.memoizedState !== null; - - if (newIsHidden) { - var primaryChildParent = node.child; - - if (primaryChildParent !== null) { - if (primaryChildParent.child !== null) { - primaryChildParent.child.return = primaryChildParent; - appendAllChildren(parent, primaryChildParent, true, newIsHidden); - } + if (prevSibling === null) { + throw new Error('Expected parent to have a child.'); + } - var fallbackChildParent = primaryChildParent.sibling; + while (prevSibling.sibling !== oldWorkInProgress) { + prevSibling = prevSibling.sibling; - if (fallbackChildParent !== null) { - fallbackChildParent.return = node; - node = fallbackChildParent; - continue; - } - } + if (prevSibling === null) { + throw new Error('Expected to find the previous sibling.'); } } - if (node.child !== null) { - // Continue traversing like normal - node.child.return = node; - node = node.child; - continue; - } - } else if (node.child !== null) { - node.child.return = node; - node = node.child; - continue; - } // $FlowFixMe This is correct but Flow is confused by the labeled break. + prevSibling.sibling = newWorkInProgress; + } // Delete the old fiber and place the new one. + // Since the old fiber is disconnected, we have to schedule it manually. - node = node; + var last = returnFiber.lastEffect; - if (node === workInProgress) { - return; + if (last !== null) { + last.nextEffect = current; + returnFiber.lastEffect = current; + } else { + returnFiber.firstEffect = returnFiber.lastEffect = current; } - while (node.sibling === null) { - if (node.return === null || node.return === workInProgress) { - return; - } + current.nextEffect = null; + current.effectTag = Deletion; + newWorkInProgress.effectTag |= Placement; // Restart work from the new fiber. - node = node.return; - } + return newWorkInProgress; + } + } - node.sibling.return = node.return; - node = node.sibling; + function beginWork(current, workInProgress, renderExpirationTime) { + var updateExpirationTime = workInProgress.expirationTime; + + { + if (workInProgress._debugNeedsRemount && current !== null) { + // This will restart the begin phase with a new fiber. + return remountFiber(current, workInProgress, createFiberFromTypeAndProps(workInProgress.type, workInProgress.key, workInProgress.pendingProps, workInProgress._debugOwner || null, workInProgress.mode, workInProgress.expirationTime)); + } } - }; // An unfortunate fork of appendAllChildren because we have two different parent types. + if (current !== null) { + var oldProps = current.memoizedProps; + var newProps = workInProgress.pendingProps; - var appendAllChildrenToContainer = function (containerChildSet, workInProgress, needsVisibilityToggle, isHidden) { - // We only have the top Fiber that was created but we need recurse down its - // children to find all the terminal nodes. - var node = workInProgress.child; + if (oldProps !== newProps || hasContextChanged() || ( // Force a re-render if the implementation changed due to hot reload: + workInProgress.type !== current.type )) { + // If props or context changed, mark the fiber as having performed work. + // This may be unset if the props are determined to be equal later (memo). + didReceiveUpdate = true; + } else if (updateExpirationTime < renderExpirationTime) { + didReceiveUpdate = false; // This fiber does not have any pending work. Bailout without entering + // the begin phase. There's still some bookkeeping we that needs to be done + // in this optimized path, mostly pushing stuff onto the stack. - while (node !== null) { - // eslint-disable-next-line no-labels - branches: if (node.tag === HostComponent) { - var instance = node.stateNode; - - if (needsVisibilityToggle && isHidden) { - // This child is inside a timed out tree. Hide it. - var props = node.memoizedProps; - var type = node.type; - instance = cloneHiddenInstance(instance, type, props, node); - } - - appendChildToContainerChildSet(containerChildSet, instance); - } else if (node.tag === HostText) { - var _instance3 = node.stateNode; - - if (needsVisibilityToggle && isHidden) { - // This child is inside a timed out tree. Hide it. - var text = node.memoizedProps; - _instance3 = cloneHiddenTextInstance(_instance3, text, node); - } - - appendChildToContainerChildSet(containerChildSet, _instance3); - } else if (enableFundamentalAPI && node.tag === FundamentalComponent) { - var _instance4 = node.stateNode.instance; - - if (needsVisibilityToggle && isHidden) { - // This child is inside a timed out tree. Hide it. - var _props2 = node.memoizedProps; - var _type2 = node.type; - _instance4 = cloneHiddenInstance(_instance4, _type2, _props2, node); - } - - appendChildToContainerChildSet(containerChildSet, _instance4); - } else if (node.tag === HostPortal) {// If we have a portal child, then we don't want to traverse - // down its children. Instead, we'll get insertions from each child in - // the portal directly. - } else if (node.tag === SuspenseComponent) { - if ((node.effectTag & Update) !== NoEffect) { - // Need to toggle the visibility of the primary children. - var newIsHidden = node.memoizedState !== null; - - if (newIsHidden) { - var primaryChildParent = node.child; - - if (primaryChildParent !== null) { - if (primaryChildParent.child !== null) { - primaryChildParent.child.return = primaryChildParent; - appendAllChildrenToContainer(containerChildSet, primaryChildParent, true, newIsHidden); - } + switch (workInProgress.tag) { + case HostRoot: + pushHostRootContext(workInProgress); + resetHydrationState(); + break; - var fallbackChildParent = primaryChildParent.sibling; + case HostComponent: + pushHostContext(workInProgress); - if (fallbackChildParent !== null) { - fallbackChildParent.return = node; - node = fallbackChildParent; - continue; - } - } - } - } + if (workInProgress.mode & ConcurrentMode && renderExpirationTime !== Never && shouldDeprioritizeSubtree(workInProgress.type, newProps)) { + { + markSpawnedWork(Never); + } // Schedule this fiber to re-render at offscreen priority. Then bailout. - if (node.child !== null) { - // Continue traversing like normal - node.child.return = node; - node = node.child; - continue; - } - } else if (node.child !== null) { - node.child.return = node; - node = node.child; - continue; - } // $FlowFixMe This is correct but Flow is confused by the labeled break. + workInProgress.expirationTime = workInProgress.childExpirationTime = Never; + return null; + } - node = node; + break; - if (node === workInProgress) { - return; - } + case ClassComponent: + { + var Component = workInProgress.type; - while (node.sibling === null) { - if (node.return === null || node.return === workInProgress) { - return; - } + if (isContextProvider(Component)) { + pushContextProvider(workInProgress); + } - node = node.return; - } + break; + } - node.sibling.return = node.return; - node = node.sibling; - } - }; + case HostPortal: + pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo); + break; - updateHostContainer = function (workInProgress) { - var portalOrRoot = workInProgress.stateNode; - var childrenUnchanged = workInProgress.firstEffect === null; + case ContextProvider: + { + var newValue = workInProgress.memoizedProps.value; + pushProvider(workInProgress, newValue); + break; + } - if (childrenUnchanged) {// No changes, just reuse the existing instance. - } else { - var container = portalOrRoot.containerInfo; - var newChildSet = createContainerChildSet(container); // If children might have changed, we have to add them all to the set. + case Profiler: + { + // Profiler should only call onRender when one of its descendants actually rendered. + var hasChildWork = workInProgress.childExpirationTime >= renderExpirationTime; - appendAllChildrenToContainer(newChildSet, workInProgress, false, false); - portalOrRoot.pendingChildren = newChildSet; // Schedule an update on the container to swap out the container. + if (hasChildWork) { + workInProgress.effectTag |= Update; + } + } - markUpdate(workInProgress); - finalizeContainerChildren(container, newChildSet); - } - }; + break; - updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) { - var currentInstance = current.stateNode; - var oldProps = current.memoizedProps; // If there are no effects associated with this node, then none of our children had any updates. - // This guarantees that we can reuse all of them. + case SuspenseComponent: + { + var state = workInProgress.memoizedState; - var childrenUnchanged = workInProgress.firstEffect === null; + if (state !== null) { + // whether to retry the primary children, or to skip over it and + // go straight to the fallback. Check the priority of the primary + // child fragment. - if (childrenUnchanged && oldProps === newProps) { - // No changes, just reuse the existing instance. - // Note that this might release a previous clone. - workInProgress.stateNode = currentInstance; - return; - } - var recyclableInstance = workInProgress.stateNode; - var currentHostContext = getHostContext(); - var updatePayload = null; + var primaryChildFragment = workInProgress.child; + var primaryChildExpirationTime = primaryChildFragment.childExpirationTime; - if (oldProps !== newProps) { - updatePayload = prepareUpdate(recyclableInstance, type, oldProps, newProps, rootContainerInstance, currentHostContext); - } + if (primaryChildExpirationTime !== NoWork && primaryChildExpirationTime >= renderExpirationTime) { + // The primary children have pending work. Use the normal path + // to attempt to render the primary children again. + return updateSuspenseComponent(current, workInProgress, renderExpirationTime); + } else { + pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // The primary children do not have pending work with sufficient + // priority. Bailout. - if (childrenUnchanged && updatePayload === null) { - // No changes, just reuse the existing instance. - // Note that this might release a previous clone. - workInProgress.stateNode = currentInstance; - return; - } + var child = bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime); - var newInstance = cloneInstance(currentInstance, updatePayload, type, oldProps, newProps, workInProgress, childrenUnchanged, recyclableInstance); + if (child !== null) { + // The fallback children have pending work. Skip over the + // primary children and work on the fallback. + return child.sibling; + } else { + return null; + } + } + } else { + pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); + } - if (finalizeInitialChildren(newInstance, type, newProps, rootContainerInstance, currentHostContext)) { - markUpdate(workInProgress); - } + break; + } - workInProgress.stateNode = newInstance; + case SuspenseListComponent: + { + var didSuspendBefore = (current.effectTag & DidCapture) !== NoEffect; - if (childrenUnchanged) { - // If there are no other effects in this tree, we need to flag this node as having one. - // Even though we're not going to use it for anything. - // Otherwise parents won't know that there are new children to propagate upwards. - markUpdate(workInProgress); - } else { - // If children might have changed, we have to add them all to the set. - appendAllChildren(newInstance, workInProgress, false, false); - } - }; + var _hasChildWork = workInProgress.childExpirationTime >= renderExpirationTime; - updateHostText$1 = function (current, workInProgress, oldText, newText) { - if (oldText !== newText) { - // If the text content differs, we'll create a new text instance for it. - var rootContainerInstance = getRootHostContainer(); - var currentHostContext = getHostContext(); - workInProgress.stateNode = createTextInstance(newText, rootContainerInstance, currentHostContext, workInProgress); // We'll have to mark it as having an effect, even though we won't use the effect for anything. - // This lets the parents know that at least one of their children has changed. + if (didSuspendBefore) { + if (_hasChildWork) { + // If something was in fallback state last time, and we have all the + // same children then we're still in progressive loading state. + // Something might get unblocked by state updates or retries in the + // tree which will affect the tail. So we need to use the normal + // path to compute the correct tail. + return updateSuspenseListComponent(current, workInProgress, renderExpirationTime); + } // If none of the children had any work, that means that none of + // them got retried so they'll still be blocked in the same way + // as before. We can fast bail out. - markUpdate(workInProgress); - } - }; -} else { - // No host operations - updateHostContainer = function (workInProgress) {// Noop - }; - updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {// Noop - }; + workInProgress.effectTag |= DidCapture; + } // If nothing suspended before and we're rendering the same children, + // then the tail doesn't matter. Anything new that suspends will work + // in the "together" mode, so we can continue from the state we had. - updateHostText$1 = function (current, workInProgress, oldText, newText) {// Noop - }; -} -function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) { - switch (renderState.tailMode) { - case 'hidden': - { - // Any insertions at the end of the tail list after this point - // should be invisible. If there are already mounted boundaries - // anything before them are not considered for collapsing. - // Therefore we need to go through the whole tail to find if - // there are any. - var tailNode = renderState.tail; - var lastTailNode = null; - - while (tailNode !== null) { - if (tailNode.alternate !== null) { - lastTailNode = tailNode; - } + var renderState = workInProgress.memoizedState; - tailNode = tailNode.sibling; - } // Next we're simply going to delete all insertions after the - // last rendered item. + if (renderState !== null) { + // Reset to the "together" mode in case we've started a different + // update in the past but didn't complete it. + renderState.rendering = null; + renderState.tail = null; + } + pushSuspenseContext(workInProgress, suspenseStackCursor.current); - if (lastTailNode === null) { - // All remaining items in the tail are insertions. - renderState.tail = null; - } else { - // Detach the insertion after the last node that was already - // inserted. - lastTailNode.sibling = null; + if (_hasChildWork) { + break; + } else { + // If none of the children had any work, that means that none of + // them got retried so they'll still be blocked in the same way + // as before. We can fast bail out. + return null; + } + } } - break; + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime); + } else { + // An update was scheduled on this fiber, but there are no new props + // nor legacy context. Set this to false. If an update queue or context + // consumer produces a changed value, it will set this to true. Otherwise, + // the component will assume the children have not changed and bail out. + didReceiveUpdate = false; } + } else { + didReceiveUpdate = false; + } // Before entering the begin phase, clear pending update priority. + // TODO: This assumes that we're about to evaluate the component and process + // the update queue. However, there's an exception: SimpleMemoComponent + // sometimes bails out later in the begin phase. This indicates that we should + // move this assignment out of the common path and into each branch. - case 'collapsed': - { - // Any insertions at the end of the tail list after this point - // should be invisible. If there are already mounted boundaries - // anything before them are not considered for collapsing. - // Therefore we need to go through the whole tail to find if - // there are any. - var _tailNode = renderState.tail; - var _lastTailNode = null; - - while (_tailNode !== null) { - if (_tailNode.alternate !== null) { - _lastTailNode = _tailNode; - } - _tailNode = _tailNode.sibling; - } // Next we're simply going to delete all insertions after the - // last rendered item. + workInProgress.expirationTime = NoWork; + switch (workInProgress.tag) { + case IndeterminateComponent: + { + return mountIndeterminateComponent(current, workInProgress, workInProgress.type, renderExpirationTime); + } - if (_lastTailNode === null) { - // All remaining items in the tail are insertions. - if (!hasRenderedATailFallback && renderState.tail !== null) { - // We suspended during the head. We want to show at least one - // row at the tail. So we'll keep on and cut off the rest. - renderState.tail.sibling = null; - } else { - renderState.tail = null; - } - } else { - // Detach the insertion after the last node that was already - // inserted. - _lastTailNode.sibling = null; + case LazyComponent: + { + var elementType = workInProgress.elementType; + return mountLazyComponent(current, workInProgress, elementType, updateExpirationTime, renderExpirationTime); + } + + case FunctionComponent: + { + var _Component = workInProgress.type; + var unresolvedProps = workInProgress.pendingProps; + var resolvedProps = workInProgress.elementType === _Component ? unresolvedProps : resolveDefaultProps(_Component, unresolvedProps); + return updateFunctionComponent(current, workInProgress, _Component, resolvedProps, renderExpirationTime); } - break; - } - } -} + case ClassComponent: + { + var _Component2 = workInProgress.type; + var _unresolvedProps = workInProgress.pendingProps; + + var _resolvedProps = workInProgress.elementType === _Component2 ? _unresolvedProps : resolveDefaultProps(_Component2, _unresolvedProps); -function completeWork(current, workInProgress, renderExpirationTime) { - var newProps = workInProgress.pendingProps; + return updateClassComponent(current, workInProgress, _Component2, _resolvedProps, renderExpirationTime); + } - switch (workInProgress.tag) { - case IndeterminateComponent: - break; + case HostRoot: + return updateHostRoot(current, workInProgress, renderExpirationTime); - case LazyComponent: - break; + case HostComponent: + return updateHostComponent(current, workInProgress, renderExpirationTime); - case SimpleMemoComponent: - case FunctionComponent: - break; + case HostText: + return updateHostText(current, workInProgress); - case ClassComponent: - { - var Component = workInProgress.type; + case SuspenseComponent: + return updateSuspenseComponent(current, workInProgress, renderExpirationTime); - if (isContextProvider(Component)) { - popContext(workInProgress); - } + case HostPortal: + return updatePortalComponent(current, workInProgress, renderExpirationTime); - break; - } + case ForwardRef: + { + var type = workInProgress.type; + var _unresolvedProps2 = workInProgress.pendingProps; - case HostRoot: - { - popHostContainer(workInProgress); - popTopLevelContextObject(workInProgress); - var fiberRoot = workInProgress.stateNode; + var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2); - if (fiberRoot.pendingContext) { - fiberRoot.context = fiberRoot.pendingContext; - fiberRoot.pendingContext = null; + return updateForwardRef(current, workInProgress, type, _resolvedProps2, renderExpirationTime); } - if (current === null || current.child === null) { - // If we hydrated, pop so that we can delete any remaining children - // that weren't hydrated. - var wasHydrated = popHydrationState(workInProgress); + case Fragment: + return updateFragment(current, workInProgress, renderExpirationTime); - if (wasHydrated) { - // If we hydrated, then we'll need to schedule an update for - // the commit side-effects on the root. - markUpdate(workInProgress); - } - } + case Mode: + return updateMode(current, workInProgress, renderExpirationTime); - updateHostContainer(workInProgress); - break; - } + case Profiler: + return updateProfiler(current, workInProgress, renderExpirationTime); - case HostComponent: - { - popHostContext(workInProgress); - var rootContainerInstance = getRootHostContainer(); - var type = workInProgress.type; + case ContextProvider: + return updateContextProvider(current, workInProgress, renderExpirationTime); + + case ContextConsumer: + return updateContextConsumer(current, workInProgress, renderExpirationTime); + + case MemoComponent: + { + var _type2 = workInProgress.type; + var _unresolvedProps3 = workInProgress.pendingProps; // Resolve outer props first, then resolve inner props. - if (current !== null && workInProgress.stateNode != null) { - updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance); + var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3); - if (enableFlareAPI) { - var prevListeners = current.memoizedProps.listeners; - var nextListeners = newProps.listeners; + { + if (workInProgress.type !== workInProgress.elementType) { + var outerPropTypes = _type2.propTypes; - if (prevListeners !== nextListeners) { - markUpdate(workInProgress); + if (outerPropTypes) { + checkPropTypes_1(outerPropTypes, _resolvedProps3, // Resolved for outer only + 'prop', getComponentName(_type2), getCurrentFiberStackInDev); + } } } - if (current.ref !== workInProgress.ref) { - markRef$1(workInProgress); - } - } else { - if (!newProps) { - if (!(workInProgress.stateNode !== null)) { - { - throw Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue."); - } - } // This can happen when we abort work. + _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3); + return updateMemoComponent(current, workInProgress, _type2, _resolvedProps3, updateExpirationTime, renderExpirationTime); + } + case SimpleMemoComponent: + { + return updateSimpleMemoComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, updateExpirationTime, renderExpirationTime); + } - break; - } + case IncompleteClassComponent: + { + var _Component3 = workInProgress.type; + var _unresolvedProps4 = workInProgress.pendingProps; - var currentHostContext = getHostContext(); // TODO: Move createInstance to beginWork and keep it on a context - // "stack" as the parent. Then append children as we go in beginWork - // or completeWork depending on we want to add then top->down or - // bottom->up. Top->down is faster in IE11. + var _resolvedProps4 = workInProgress.elementType === _Component3 ? _unresolvedProps4 : resolveDefaultProps(_Component3, _unresolvedProps4); - var _wasHydrated = popHydrationState(workInProgress); + return mountIncompleteClassComponent(current, workInProgress, _Component3, _resolvedProps4, renderExpirationTime); + } - if (_wasHydrated) { - // TODO: Move this and createInstance step into the beginPhase - // to consolidate. - if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) { - // If changes to the hydrated node needs to be applied at the - // commit-phase we mark this as such. - markUpdate(workInProgress); - } + case SuspenseListComponent: + { + return updateSuspenseListComponent(current, workInProgress, renderExpirationTime); + } + } + + { + { + throw Error( "Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in React. Please file an issue." ); + } + } + } - if (enableFlareAPI) { - var listeners = newProps.listeners; + function markUpdate(workInProgress) { + // Tag the fiber with an update effect. This turns a Placement into + // a PlacementAndUpdate. + workInProgress.effectTag |= Update; + } - if (listeners != null) { - updateEventListeners(listeners, workInProgress, rootContainerInstance); - } - } - } else { - var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress); - appendAllChildren(instance, workInProgress, false, false); // This needs to be set before we mount Flare event listeners + function markRef$1(workInProgress) { + workInProgress.effectTag |= Ref; + } - workInProgress.stateNode = instance; + var appendAllChildren; + var updateHostContainer; + var updateHostComponent$1; + var updateHostText$1; - if (enableFlareAPI) { - var _listeners = newProps.listeners; + { + // Mutation mode + appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) { + // We only have the top Fiber that was created but we need recurse down its + // children to find all the terminal nodes. + var node = workInProgress.child; - if (_listeners != null) { - updateEventListeners(_listeners, workInProgress, rootContainerInstance); - } - } // Certain renderers require commit-time effects for initial mount. - // (eg DOM renderer supports auto-focus for certain elements). - // Make sure such renderers get scheduled for later work. + while (node !== null) { + if (node.tag === HostComponent || node.tag === HostText) { + appendInitialChild(parent, node.stateNode); + } else if (node.tag === HostPortal) ; else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + if (node === workInProgress) { + return; + } - if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance, currentHostContext)) { - markUpdate(workInProgress); - } + while (node.sibling === null) { + if (node.return === null || node.return === workInProgress) { + return; } - if (workInProgress.ref !== null) { - // If there is a ref on a host node we need to schedule a callback - markRef$1(workInProgress); - } + node = node.return; } - break; + node.sibling.return = node.return; + node = node.sibling; } + }; - case HostText: - { - var newText = newProps; + updateHostContainer = function (workInProgress) {// Noop + }; - if (current && workInProgress.stateNode != null) { - var oldText = current.memoizedProps; // If we have an alternate, that means this is an update and we need - // to schedule a side-effect to do the updates. + updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) { + // If we have an alternate, that means this is an update and we need to + // schedule a side-effect to do the updates. + var oldProps = current.memoizedProps; - updateHostText$1(current, workInProgress, oldText, newText); - } else { - if (typeof newText !== 'string') { - if (!(workInProgress.stateNode !== null)) { - { - throw Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue."); - } - } // This can happen when we abort work. + if (oldProps === newProps) { + // In mutation mode, this is sufficient for a bailout because + // we won't touch this node even if children changed. + return; + } // If we get updated because one of our children updated, we don't + // have newProps so we'll have to reuse them. + // TODO: Split the update API as separate for the props vs. children. + // Even better would be if children weren't special cased at all tho. - } - var _rootContainerInstance = getRootHostContainer(); + var instance = workInProgress.stateNode; + var currentHostContext = getHostContext(); // TODO: Experiencing an error where oldProps is null. Suggests a host + // component is hitting the resume path. Figure out why. Possibly + // related to `hidden`. - var _currentHostContext = getHostContext(); + var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext); // TODO: Type this specific to this type of component. - var _wasHydrated2 = popHydrationState(workInProgress); + workInProgress.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there + // is a new ref we mark this as an update. All the work is done in commitWork. - if (_wasHydrated2) { - if (prepareToHydrateHostTextInstance(workInProgress)) { - markUpdate(workInProgress); - } - } else { - workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress); - } - } + if (updatePayload) { + markUpdate(workInProgress); + } + }; - break; + updateHostText$1 = function (current, workInProgress, oldText, newText) { + // If the text differs, mark it as an update. All the work in done in commitWork. + if (oldText !== newText) { + markUpdate(workInProgress); } + }; + } - case ForwardRef: - break; + function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) { + switch (renderState.tailMode) { + case 'hidden': + { + // Any insertions at the end of the tail list after this point + // should be invisible. If there are already mounted boundaries + // anything before them are not considered for collapsing. + // Therefore we need to go through the whole tail to find if + // there are any. + var tailNode = renderState.tail; + var lastTailNode = null; + + while (tailNode !== null) { + if (tailNode.alternate !== null) { + lastTailNode = tailNode; + } - case SuspenseComponent: - { - popSuspenseContext(workInProgress); - var nextState = workInProgress.memoizedState; + tailNode = tailNode.sibling; + } // Next we're simply going to delete all insertions after the + // last rendered item. - if (enableSuspenseServerRenderer) { - if (nextState !== null && nextState.dehydrated !== null) { - if (current === null) { - var _wasHydrated3 = popHydrationState(workInProgress); - if (!_wasHydrated3) { - { - throw Error("A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React."); - } - } + if (lastTailNode === null) { + // All remaining items in the tail are insertions. + renderState.tail = null; + } else { + // Detach the insertion after the last node that was already + // inserted. + lastTailNode.sibling = null; + } - prepareToHydrateHostSuspenseInstance(workInProgress); + break; + } - if (enableSchedulerTracing) { - markSpawnedWork(Never); - } + case 'collapsed': + { + // Any insertions at the end of the tail list after this point + // should be invisible. If there are already mounted boundaries + // anything before them are not considered for collapsing. + // Therefore we need to go through the whole tail to find if + // there are any. + var _tailNode = renderState.tail; + var _lastTailNode = null; + + while (_tailNode !== null) { + if (_tailNode.alternate !== null) { + _lastTailNode = _tailNode; + } - return null; - } else { - // We should never have been in a hydration state if we didn't have a current. - // However, in some of those paths, we might have reentered a hydration state - // and then we might be inside a hydration state. In that case, we'll need to - // exit out of it. - resetHydrationState(); - - if ((workInProgress.effectTag & DidCapture) === NoEffect) { - // This boundary did not suspend so it's now hydrated and unsuspended. - workInProgress.memoizedState = null; - } // If nothing suspended, we need to schedule an effect to mark this boundary - // as having hydrated so events know that they're free be invoked. - // It's also a signal to replay events and the suspense callback. - // If something suspended, schedule an effect to attach retry listeners. - // So we might as well always mark this. + _tailNode = _tailNode.sibling; + } // Next we're simply going to delete all insertions after the + // last rendered item. - workInProgress.effectTag |= Update; - return null; + if (_lastTailNode === null) { + // All remaining items in the tail are insertions. + if (!hasRenderedATailFallback && renderState.tail !== null) { + // We suspended during the head. We want to show at least one + // row at the tail. So we'll keep on and cut off the rest. + renderState.tail.sibling = null; + } else { + renderState.tail = null; } + } else { + // Detach the insertion after the last node that was already + // inserted. + _lastTailNode.sibling = null; } + + break; } + } + } - if ((workInProgress.effectTag & DidCapture) !== NoEffect) { - // Something suspended. Re-render with the fallback children. - workInProgress.expirationTime = renderExpirationTime; // Do not reset the effect list. + function completeWork(current, workInProgress, renderExpirationTime) { + var newProps = workInProgress.pendingProps; - return workInProgress; - } + switch (workInProgress.tag) { + case IndeterminateComponent: + case LazyComponent: + case SimpleMemoComponent: + case FunctionComponent: + case ForwardRef: + case Fragment: + case Mode: + case Profiler: + case ContextConsumer: + case MemoComponent: + return null; - var nextDidTimeout = nextState !== null; - var prevDidTimeout = false; + case ClassComponent: + { + var Component = workInProgress.type; - if (current === null) { - if (workInProgress.memoizedProps.fallback !== undefined) { - popHydrationState(workInProgress); + if (isContextProvider(Component)) { + popContext(workInProgress); } - } else { - var prevState = current.memoizedState; - prevDidTimeout = prevState !== null; - - if (!nextDidTimeout && prevState !== null) { - // We just switched from the fallback to the normal children. - // Delete the fallback. - // TODO: Would it be better to store the fallback fragment on - // the stateNode during the begin phase? - var currentFallbackChild = current.child.sibling; - - if (currentFallbackChild !== null) { - // Deletions go at the beginning of the return fiber's effect list - var first = workInProgress.firstEffect; - - if (first !== null) { - workInProgress.firstEffect = currentFallbackChild; - currentFallbackChild.nextEffect = first; - } else { - workInProgress.firstEffect = workInProgress.lastEffect = currentFallbackChild; - currentFallbackChild.nextEffect = null; - } - currentFallbackChild.effectTag = Deletion; - } - } + return null; } - if (nextDidTimeout && !prevDidTimeout) { - // If this subtreee is running in blocking mode we can suspend, - // otherwise we won't suspend. - // TODO: This will still suspend a synchronous tree if anything - // in the concurrent tree already suspended during this render. - // This is a known bug. - if ((workInProgress.mode & BlockingMode) !== NoMode) { - // TODO: Move this back to throwException because this is too late - // if this is a large tree which is common for initial loads. We - // don't know if we should restart a render or not until we get - // this marker, and this is too late. - // If this render already had a ping or lower pri updates, - // and this is the first time we know we're going to suspend we - // should be able to immediately restart from within throwException. - var hasInvisibleChildContext = current === null && workInProgress.memoizedProps.unstable_avoidThisFallback !== true; - - if (hasInvisibleChildContext || hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext)) { - // If this was in an invisible tree or a new render, then showing - // this boundary is ok. - renderDidSuspend(); - } else { - // Otherwise, we're going to have to hide content so we should - // suspend for longer if possible. - renderDidSuspendDelayIfPossible(); - } - } - } + case HostRoot: + { + popHostContainer(workInProgress); + popTopLevelContextObject(workInProgress); + var fiberRoot = workInProgress.stateNode; - if (supportsPersistence) { - // TODO: Only schedule updates if not prevDidTimeout. - if (nextDidTimeout) { - // If this boundary just timed out, schedule an effect to attach a - // retry listener to the proimse. This flag is also used to hide the - // primary children. - workInProgress.effectTag |= Update; + if (fiberRoot.pendingContext) { + fiberRoot.context = fiberRoot.pendingContext; + fiberRoot.pendingContext = null; } - } - if (supportsMutation) { - // TODO: Only schedule updates if these values are non equal, i.e. it changed. - if (nextDidTimeout || prevDidTimeout) { - // If this boundary just timed out, schedule an effect to attach a - // retry listener to the proimse. This flag is also used to hide the - // primary children. In mutation mode, we also need the flag to - // *unhide* children that were previously hidden, so check if the - // is currently timed out, too. - workInProgress.effectTag |= Update; + if (current === null || current.child === null) { + // If we hydrated, pop so that we can delete any remaining children + // that weren't hydrated. + var wasHydrated = popHydrationState(workInProgress); + + if (wasHydrated) { + // If we hydrated, then we'll need to schedule an update for + // the commit side-effects on the root. + markUpdate(workInProgress); + } } - } - if (enableSuspenseCallback && workInProgress.updateQueue !== null && workInProgress.memoizedProps.suspenseCallback != null) { - // Always notify the callback - workInProgress.effectTag |= Update; + updateHostContainer(workInProgress); + return null; } - break; - } + case HostComponent: + { + popHostContext(workInProgress); + var rootContainerInstance = getRootHostContainer(); + var type = workInProgress.type; - case Fragment: - break; + if (current !== null && workInProgress.stateNode != null) { + updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance); - case Mode: - break; + if (current.ref !== workInProgress.ref) { + markRef$1(workInProgress); + } + } else { + if (!newProps) { + if (!(workInProgress.stateNode !== null)) { + { + throw Error( "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue." ); + } + } // This can happen when we abort work. - case Profiler: - break; - case HostPortal: - popHostContainer(workInProgress); - updateHostContainer(workInProgress); - break; + return null; + } - case ContextProvider: - // Pop provider fiber - popProvider(workInProgress); - break; + var currentHostContext = getHostContext(); // TODO: Move createInstance to beginWork and keep it on a context + // "stack" as the parent. Then append children as we go in beginWork + // or completeWork depending on whether we want to add them top->down or + // bottom->up. Top->down is faster in IE11. - case ContextConsumer: - break; + var _wasHydrated = popHydrationState(workInProgress); - case MemoComponent: - break; + if (_wasHydrated) { + // TODO: Move this and createInstance step into the beginPhase + // to consolidate. + if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) { + // If changes to the hydrated node need to be applied at the + // commit-phase we mark this as such. + markUpdate(workInProgress); + } + } else { + var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress); + appendAllChildren(instance, workInProgress, false, false); // This needs to be set before we mount Flare event listeners - case IncompleteClassComponent: - { - // Same as class component case. I put it down here so that the tags are - // sequential to ensure this switch is compiled to a jump table. - var _Component = workInProgress.type; + workInProgress.stateNode = instance; + // (eg DOM renderer supports auto-focus for certain elements). + // Make sure such renderers get scheduled for later work. - if (isContextProvider(_Component)) { - popContext(workInProgress); - } - break; - } + if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance)) { + markUpdate(workInProgress); + } + } - case SuspenseListComponent: - { - popSuspenseContext(workInProgress); - var renderState = workInProgress.memoizedState; + if (workInProgress.ref !== null) { + // If there is a ref on a host node we need to schedule a callback + markRef$1(workInProgress); + } + } - if (renderState === null) { - // We're running in the default, "independent" mode. We don't do anything - // in this mode. - break; + return null; } - var didSuspendAlready = (workInProgress.effectTag & DidCapture) !== NoEffect; - var renderedTail = renderState.rendering; - - if (renderedTail === null) { - // We just rendered the head. - if (!didSuspendAlready) { - // This is the first pass. We need to figure out if anything is still - // suspended in the rendered set. - // If new content unsuspended, but there's still some content that - // didn't. Then we need to do a second pass that forces everything - // to keep showing their fallbacks. - // We might be suspended if something in this render pass suspended, or - // something in the previous committed pass suspended. Otherwise, - // there's no chance so we can skip the expensive call to - // findFirstSuspended. - var cannotBeSuspended = renderHasNotSuspendedYet() && (current === null || (current.effectTag & DidCapture) === NoEffect); - - if (!cannotBeSuspended) { - var row = workInProgress.child; - - while (row !== null) { - var suspended = findFirstSuspended(row); - - if (suspended !== null) { - didSuspendAlready = true; - workInProgress.effectTag |= DidCapture; - cutOffTailIfNeeded(renderState, false); // If this is a newly suspended tree, it might not get committed as - // part of the second pass. In that case nothing will subscribe to - // its thennables. Instead, we'll transfer its thennables to the - // SuspenseList so that it can retry if they resolve. - // There might be multiple of these in the list but since we're - // going to wait for all of them anyway, it doesn't really matter - // which ones gets to ping. In theory we could get clever and keep - // track of how many dependencies remain but it gets tricky because - // in the meantime, we can add/remove/change items and dependencies. - // We might bail out of the loop before finding any but that - // doesn't matter since that means that the other boundaries that - // we did find already has their listeners attached. - - var newThennables = suspended.updateQueue; - - if (newThennables !== null) { - workInProgress.updateQueue = newThennables; - workInProgress.effectTag |= Update; - } // Rerender the whole list, but this time, we'll force fallbacks - // to stay in place. - // Reset the effect list before doing the second pass since that's now invalid. - - - if (renderState.lastEffect === null) { - workInProgress.firstEffect = null; - } - - workInProgress.lastEffect = renderState.lastEffect; // Reset the child fibers to their original state. + case HostText: + { + var newText = newProps; - resetChildFibers(workInProgress, renderExpirationTime); // Set up the Suspense Context to force suspense and immediately - // rerender the children. + if (current && workInProgress.stateNode != null) { + var oldText = current.memoizedProps; // If we have an alternate, that means this is an update and we need + // to schedule a side-effect to do the updates. - pushSuspenseContext(workInProgress, setShallowSuspenseContext(suspenseStackCursor.current, ForceSuspenseFallback)); - return workInProgress.child; + updateHostText$1(current, workInProgress, oldText, newText); + } else { + if (typeof newText !== 'string') { + if (!(workInProgress.stateNode !== null)) { + { + throw Error( "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue." ); } + } // This can happen when we abort work. - row = row.sibling; - } } - } else { - cutOffTailIfNeeded(renderState, false); - } // Next we're going to render the tail. - } else { - // Append the rendered row to the child list. - if (!didSuspendAlready) { - var _suspended = findFirstSuspended(renderedTail); + var _rootContainerInstance = getRootHostContainer(); - if (_suspended !== null) { - workInProgress.effectTag |= DidCapture; - didSuspendAlready = true; // Ensure we transfer the update queue to the parent so that it doesn't - // get lost if this row ends up dropped during a second pass. + var _currentHostContext = getHostContext(); - var _newThennables = _suspended.updateQueue; + var _wasHydrated2 = popHydrationState(workInProgress); - if (_newThennables !== null) { - workInProgress.updateQueue = _newThennables; - workInProgress.effectTag |= Update; + if (_wasHydrated2) { + if (prepareToHydrateHostTextInstance(workInProgress)) { + markUpdate(workInProgress); } + } else { + workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress); + } + } - cutOffTailIfNeeded(renderState, true); // This might have been modified. + return null; + } - if (renderState.tail === null && renderState.tailMode === 'hidden' && !renderedTail.alternate) { - // We need to delete the row we just rendered. - // Reset the effect list to what it was before we rendered this - // child. The nested children have already appended themselves. - var lastEffect = workInProgress.lastEffect = renderState.lastEffect; // Remove any effects that were appended after this point. + case SuspenseComponent: + { + popSuspenseContext(workInProgress); + var nextState = workInProgress.memoizedState; - if (lastEffect !== null) { - lastEffect.nextEffect = null; - } // We're done. + if ((workInProgress.effectTag & DidCapture) !== NoEffect) { + // Something suspended. Re-render with the fallback children. + workInProgress.expirationTime = renderExpirationTime; // Do not reset the effect list. + return workInProgress; + } - return null; - } - } else if (now() > renderState.tailExpiration && renderExpirationTime > Never) { - // We have now passed our CPU deadline and we'll just give up further - // attempts to render the main content and only render fallbacks. - // The assumption is that this is usually faster. - workInProgress.effectTag |= DidCapture; - didSuspendAlready = true; - cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this - // to get it started back up to attempt the next item. If we can show - // them, then they really have the same priority as this render. - // So we'll pick it back up the very next render pass once we've had - // an opportunity to yield for paint. - - var nextPriority = renderExpirationTime - 1; - workInProgress.expirationTime = workInProgress.childExpirationTime = nextPriority; - - if (enableSchedulerTracing) { - markSpawnedWork(nextPriority); + var nextDidTimeout = nextState !== null; + var prevDidTimeout = false; + + if (current === null) { + if (workInProgress.memoizedProps.fallback !== undefined) { + popHydrationState(workInProgress); + } + } else { + var prevState = current.memoizedState; + prevDidTimeout = prevState !== null; + + if (!nextDidTimeout && prevState !== null) { + // We just switched from the fallback to the normal children. + // Delete the fallback. + // TODO: Would it be better to store the fallback fragment on + // the stateNode during the begin phase? + var currentFallbackChild = current.child.sibling; + + if (currentFallbackChild !== null) { + // Deletions go at the beginning of the return fiber's effect list + var first = workInProgress.firstEffect; + + if (first !== null) { + workInProgress.firstEffect = currentFallbackChild; + currentFallbackChild.nextEffect = first; + } else { + workInProgress.firstEffect = workInProgress.lastEffect = currentFallbackChild; + currentFallbackChild.nextEffect = null; + } + + currentFallbackChild.effectTag = Deletion; } } } - if (renderState.isBackwards) { - // The effect list of the backwards tail will have been added - // to the end. This breaks the guarantee that life-cycles fire in - // sibling order but that isn't a strong guarantee promised by React. - // Especially since these might also just pop in during future commits. - // Append to the beginning of the list. - renderedTail.sibling = workInProgress.child; - workInProgress.child = renderedTail; - } else { - var previousSibling = renderState.last; - - if (previousSibling !== null) { - previousSibling.sibling = renderedTail; - } else { - workInProgress.child = renderedTail; + if (nextDidTimeout && !prevDidTimeout) { + // If this subtreee is running in blocking mode we can suspend, + // otherwise we won't suspend. + // TODO: This will still suspend a synchronous tree if anything + // in the concurrent tree already suspended during this render. + // This is a known bug. + if ((workInProgress.mode & BlockingMode) !== NoMode) { + // TODO: Move this back to throwException because this is too late + // if this is a large tree which is common for initial loads. We + // don't know if we should restart a render or not until we get + // this marker, and this is too late. + // If this render already had a ping or lower pri updates, + // and this is the first time we know we're going to suspend we + // should be able to immediately restart from within throwException. + var hasInvisibleChildContext = current === null && workInProgress.memoizedProps.unstable_avoidThisFallback !== true; + + if (hasInvisibleChildContext || hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext)) { + // If this was in an invisible tree or a new render, then showing + // this boundary is ok. + renderDidSuspend(); + } else { + // Otherwise, we're going to have to hide content so we should + // suspend for longer if possible. + renderDidSuspendDelayIfPossible(); + } } + } - renderState.last = renderedTail; + { + // TODO: Only schedule updates if these values are non equal, i.e. it changed. + if (nextDidTimeout || prevDidTimeout) { + // If this boundary just timed out, schedule an effect to attach a + // retry listener to the promise. This flag is also used to hide the + // primary children. In mutation mode, we also need the flag to + // *unhide* children that were previously hidden, so check if this + // is currently timed out, too. + workInProgress.effectTag |= Update; + } } - } - if (renderState.tail !== null) { - // We still have tail rows to render. - if (renderState.tailExpiration === 0) { - // Heuristic for how long we're willing to spend rendering rows - // until we just give up and show what we have so far. - var TAIL_EXPIRATION_TIMEOUT_MS = 500; - renderState.tailExpiration = now() + TAIL_EXPIRATION_TIMEOUT_MS; - } // Pop a row. + return null; + } + case HostPortal: + popHostContainer(workInProgress); + updateHostContainer(workInProgress); + return null; - var next = renderState.tail; - renderState.rendering = next; - renderState.tail = next.sibling; - renderState.lastEffect = workInProgress.lastEffect; - next.sibling = null; // Restore the context. - // TODO: We can probably just avoid popping it instead and only - // setting it the first time we go from not suspended to suspended. + case ContextProvider: + // Pop provider fiber + popProvider(workInProgress); + return null; - var suspenseContext = suspenseStackCursor.current; + case IncompleteClassComponent: + { + // Same as class component case. I put it down here so that the tags are + // sequential to ensure this switch is compiled to a jump table. + var _Component = workInProgress.type; - if (didSuspendAlready) { - suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback); - } else { - suspenseContext = setDefaultShallowSuspenseContext(suspenseContext); + if (isContextProvider(_Component)) { + popContext(workInProgress); } - pushSuspenseContext(workInProgress, suspenseContext); // Do a pass over the next row. - - return next; + return null; } - break; - } - - case FundamentalComponent: - { - if (enableFundamentalAPI) { - var fundamentalImpl = workInProgress.type.impl; - var fundamentalInstance = workInProgress.stateNode; + case SuspenseListComponent: + { + popSuspenseContext(workInProgress); + var renderState = workInProgress.memoizedState; - if (fundamentalInstance === null) { - var getInitialState = fundamentalImpl.getInitialState; - var fundamentalState; + if (renderState === null) { + // We're running in the default, "independent" mode. + // We don't do anything in this mode. + return null; + } - if (getInitialState !== undefined) { - fundamentalState = getInitialState(newProps); - } + var didSuspendAlready = (workInProgress.effectTag & DidCapture) !== NoEffect; + var renderedTail = renderState.rendering; + + if (renderedTail === null) { + // We just rendered the head. + if (!didSuspendAlready) { + // This is the first pass. We need to figure out if anything is still + // suspended in the rendered set. + // If new content unsuspended, but there's still some content that + // didn't. Then we need to do a second pass that forces everything + // to keep showing their fallbacks. + // We might be suspended if something in this render pass suspended, or + // something in the previous committed pass suspended. Otherwise, + // there's no chance so we can skip the expensive call to + // findFirstSuspended. + var cannotBeSuspended = renderHasNotSuspendedYet() && (current === null || (current.effectTag & DidCapture) === NoEffect); + + if (!cannotBeSuspended) { + var row = workInProgress.child; + + while (row !== null) { + var suspended = findFirstSuspended(row); + + if (suspended !== null) { + didSuspendAlready = true; + workInProgress.effectTag |= DidCapture; + cutOffTailIfNeeded(renderState, false); // If this is a newly suspended tree, it might not get committed as + // part of the second pass. In that case nothing will subscribe to + // its thennables. Instead, we'll transfer its thennables to the + // SuspenseList so that it can retry if they resolve. + // There might be multiple of these in the list but since we're + // going to wait for all of them anyway, it doesn't really matter + // which ones gets to ping. In theory we could get clever and keep + // track of how many dependencies remain but it gets tricky because + // in the meantime, we can add/remove/change items and dependencies. + // We might bail out of the loop before finding any but that + // doesn't matter since that means that the other boundaries that + // we did find already has their listeners attached. + + var newThennables = suspended.updateQueue; + + if (newThennables !== null) { + workInProgress.updateQueue = newThennables; + workInProgress.effectTag |= Update; + } // Rerender the whole list, but this time, we'll force fallbacks + // to stay in place. + // Reset the effect list before doing the second pass since that's now invalid. + + + if (renderState.lastEffect === null) { + workInProgress.firstEffect = null; + } - fundamentalInstance = workInProgress.stateNode = createFundamentalStateInstance(workInProgress, newProps, fundamentalImpl, fundamentalState || {}); + workInProgress.lastEffect = renderState.lastEffect; // Reset the child fibers to their original state. - var _instance5 = getFundamentalComponentInstance(fundamentalInstance); + resetChildFibers(workInProgress, renderExpirationTime); // Set up the Suspense Context to force suspense and immediately + // rerender the children. - fundamentalInstance.instance = _instance5; + pushSuspenseContext(workInProgress, setShallowSuspenseContext(suspenseStackCursor.current, ForceSuspenseFallback)); + return workInProgress.child; + } - if (fundamentalImpl.reconcileChildren === false) { - return null; - } + row = row.sibling; + } + } + } else { + cutOffTailIfNeeded(renderState, false); + } // Next we're going to render the tail. - appendAllChildren(_instance5, workInProgress, false, false); - mountFundamentalComponent(fundamentalInstance); } else { - // We fire update in commit phase - var prevProps = fundamentalInstance.props; - fundamentalInstance.prevProps = prevProps; - fundamentalInstance.props = newProps; - fundamentalInstance.currentFiber = workInProgress; + // Append the rendered row to the child list. + if (!didSuspendAlready) { + var _suspended = findFirstSuspended(renderedTail); - if (supportsPersistence) { - var _instance6 = cloneFundamentalInstance(fundamentalInstance); + if (_suspended !== null) { + workInProgress.effectTag |= DidCapture; + didSuspendAlready = true; // Ensure we transfer the update queue to the parent so that it doesn't + // get lost if this row ends up dropped during a second pass. - fundamentalInstance.instance = _instance6; - appendAllChildren(_instance6, workInProgress, false, false); - } + var _newThennables = _suspended.updateQueue; - var shouldUpdate = shouldUpdateFundamentalComponent(fundamentalInstance); + if (_newThennables !== null) { + workInProgress.updateQueue = _newThennables; + workInProgress.effectTag |= Update; + } - if (shouldUpdate) { - markUpdate(workInProgress); - } - } - } + cutOffTailIfNeeded(renderState, true); // This might have been modified. - break; - } + if (renderState.tail === null && renderState.tailMode === 'hidden' && !renderedTail.alternate) { + // We need to delete the row we just rendered. + // Reset the effect list to what it was before we rendered this + // child. The nested children have already appended themselves. + var lastEffect = workInProgress.lastEffect = renderState.lastEffect; // Remove any effects that were appended after this point. - case ScopeComponent: - { - if (enableScopeAPI) { - if (current === null) { - var _type3 = workInProgress.type; - var scopeInstance = { - fiber: workInProgress, - methods: null - }; - workInProgress.stateNode = scopeInstance; - scopeInstance.methods = createScopeMethods(_type3, scopeInstance); + if (lastEffect !== null) { + lastEffect.nextEffect = null; + } // We're done. - if (enableFlareAPI) { - var _listeners2 = newProps.listeners; - if (_listeners2 != null) { - var _rootContainerInstance2 = getRootHostContainer(); + return null; + } + } else if ( // The time it took to render last row is greater than time until + // the expiration. + now() * 2 - renderState.renderingStartTime > renderState.tailExpiration && renderExpirationTime > Never) { + // We have now passed our CPU deadline and we'll just give up further + // attempts to render the main content and only render fallbacks. + // The assumption is that this is usually faster. + workInProgress.effectTag |= DidCapture; + didSuspendAlready = true; + cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this + // to get it started back up to attempt the next item. If we can show + // them, then they really have the same priority as this render. + // So we'll pick it back up the very next render pass once we've had + // an opportunity to yield for paint. + + var nextPriority = renderExpirationTime - 1; + workInProgress.expirationTime = workInProgress.childExpirationTime = nextPriority; - updateEventListeners(_listeners2, workInProgress, _rootContainerInstance2); + { + markSpawnedWork(nextPriority); + } } } - if (workInProgress.ref !== null) { - markRef$1(workInProgress); - markUpdate(workInProgress); - } - } else { - if (enableFlareAPI) { - var _prevListeners = current.memoizedProps.listeners; - var _nextListeners = newProps.listeners; - - if (_prevListeners !== _nextListeners || workInProgress.ref !== null) { - markUpdate(workInProgress); - } + if (renderState.isBackwards) { + // The effect list of the backwards tail will have been added + // to the end. This breaks the guarantee that life-cycles fire in + // sibling order but that isn't a strong guarantee promised by React. + // Especially since these might also just pop in during future commits. + // Append to the beginning of the list. + renderedTail.sibling = workInProgress.child; + workInProgress.child = renderedTail; } else { - if (workInProgress.ref !== null) { - markUpdate(workInProgress); + var previousSibling = renderState.last; + + if (previousSibling !== null) { + previousSibling.sibling = renderedTail; + } else { + workInProgress.child = renderedTail; } + + renderState.last = renderedTail; } + } - if (current.ref !== workInProgress.ref) { - markRef$1(workInProgress); + if (renderState.tail !== null) { + // We still have tail rows to render. + if (renderState.tailExpiration === 0) { + // Heuristic for how long we're willing to spend rendering rows + // until we just give up and show what we have so far. + var TAIL_EXPIRATION_TIMEOUT_MS = 500; + renderState.tailExpiration = now() + TAIL_EXPIRATION_TIMEOUT_MS; // TODO: This is meant to mimic the train model or JND but this + // is a per component value. It should really be since the start + // of the total render or last commit. Consider using something like + // globalMostRecentFallbackTime. That doesn't account for being + // suspended for part of the time or when it's a new render. + // It should probably use a global start time value instead. + } // Pop a row. + + + var next = renderState.tail; + renderState.rendering = next; + renderState.tail = next.sibling; + renderState.lastEffect = workInProgress.lastEffect; + renderState.renderingStartTime = now(); + next.sibling = null; // Restore the context. + // TODO: We can probably just avoid popping it instead and only + // setting it the first time we go from not suspended to suspended. + + var suspenseContext = suspenseStackCursor.current; + + if (didSuspendAlready) { + suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback); + } else { + suspenseContext = setDefaultShallowSuspenseContext(suspenseContext); } + + pushSuspenseContext(workInProgress, suspenseContext); // Do a pass over the next row. + + return next; } - } - break; - } + return null; + } + } - default: + { { - { - throw Error("Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in React. Please file an issue."); - } + throw Error( "Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in React. Please file an issue." ); } - + } } - return null; -} + function unwindWork(workInProgress, renderExpirationTime) { + switch (workInProgress.tag) { + case ClassComponent: + { + var Component = workInProgress.type; -function unwindWork(workInProgress, renderExpirationTime) { - switch (workInProgress.tag) { - case ClassComponent: - { - var Component = workInProgress.type; + if (isContextProvider(Component)) { + popContext(workInProgress); + } - if (isContextProvider(Component)) { - popContext(workInProgress); - } + var effectTag = workInProgress.effectTag; - var effectTag = workInProgress.effectTag; + if (effectTag & ShouldCapture) { + workInProgress.effectTag = effectTag & ~ShouldCapture | DidCapture; + return workInProgress; + } - if (effectTag & ShouldCapture) { - workInProgress.effectTag = effectTag & ~ShouldCapture | DidCapture; - return workInProgress; + return null; } - return null; - } - - case HostRoot: - { - popHostContainer(workInProgress); - popTopLevelContextObject(workInProgress); - var _effectTag = workInProgress.effectTag; + case HostRoot: + { + popHostContainer(workInProgress); + popTopLevelContextObject(workInProgress); + var _effectTag = workInProgress.effectTag; - if (!((_effectTag & DidCapture) === NoEffect)) { - { - throw Error("The root failed to unmount after an error. This is likely a bug in React. Please file an issue."); + if (!((_effectTag & DidCapture) === NoEffect)) { + { + throw Error( "The root failed to unmount after an error. This is likely a bug in React. Please file an issue." ); + } } - } - workInProgress.effectTag = _effectTag & ~ShouldCapture | DidCapture; - return workInProgress; - } + workInProgress.effectTag = _effectTag & ~ShouldCapture | DidCapture; + return workInProgress; + } - case HostComponent: - { - // TODO: popHydrationState - popHostContext(workInProgress); - return null; - } + case HostComponent: + { + // TODO: popHydrationState + popHostContext(workInProgress); + return null; + } - case SuspenseComponent: - { - popSuspenseContext(workInProgress); + case SuspenseComponent: + { + popSuspenseContext(workInProgress); - if (enableSuspenseServerRenderer) { - var suspenseState = workInProgress.memoizedState; + var _effectTag2 = workInProgress.effectTag; - if (suspenseState !== null && suspenseState.dehydrated !== null) { - if (!(workInProgress.alternate !== null)) { - { - throw Error("Threw in newly mounted dehydrated component. This is likely a bug in React. Please file an issue."); - } - } + if (_effectTag2 & ShouldCapture) { + workInProgress.effectTag = _effectTag2 & ~ShouldCapture | DidCapture; // Captured a suspense effect. Re-render the boundary. - resetHydrationState(); + return workInProgress; } - } - var _effectTag2 = workInProgress.effectTag; + return null; + } - if (_effectTag2 & ShouldCapture) { - workInProgress.effectTag = _effectTag2 & ~ShouldCapture | DidCapture; // Captured a suspense effect. Re-render the boundary. + case SuspenseListComponent: + { + popSuspenseContext(workInProgress); // SuspenseList doesn't actually catch anything. It should've been + // caught by a nested boundary. If not, it should bubble through. - return workInProgress; + return null; } + case HostPortal: + popHostContainer(workInProgress); return null; - } - - case SuspenseListComponent: - { - popSuspenseContext(workInProgress); // SuspenseList doesn't actually catch anything. It should've been - // caught by a nested boundary. If not, it should bubble through. + case ContextProvider: + popProvider(workInProgress); return null; - } - case HostPortal: - popHostContainer(workInProgress); - return null; + default: + return null; + } + } - case ContextProvider: - popProvider(workInProgress); - return null; + function unwindInterruptedWork(interruptedWork) { + switch (interruptedWork.tag) { + case ClassComponent: + { + var childContextTypes = interruptedWork.type.childContextTypes; - default: - return null; - } -} + if (childContextTypes !== null && childContextTypes !== undefined) { + popContext(interruptedWork); + } -function unwindInterruptedWork(interruptedWork) { - switch (interruptedWork.tag) { - case ClassComponent: - { - var childContextTypes = interruptedWork.type.childContextTypes; + break; + } - if (childContextTypes !== null && childContextTypes !== undefined) { - popContext(interruptedWork); + case HostRoot: + { + popHostContainer(interruptedWork); + popTopLevelContextObject(interruptedWork); + break; } - break; - } + case HostComponent: + { + popHostContext(interruptedWork); + break; + } - case HostRoot: - { + case HostPortal: popHostContainer(interruptedWork); - popTopLevelContextObject(interruptedWork); break; - } - case HostComponent: - { - popHostContext(interruptedWork); + case SuspenseComponent: + popSuspenseContext(interruptedWork); break; - } - - case HostPortal: - popHostContainer(interruptedWork); - break; - case SuspenseComponent: - popSuspenseContext(interruptedWork); - break; - - case SuspenseListComponent: - popSuspenseContext(interruptedWork); - break; - - case ContextProvider: - popProvider(interruptedWork); - break; + case SuspenseListComponent: + popSuspenseContext(interruptedWork); + break; - default: - break; + case ContextProvider: + popProvider(interruptedWork); + break; + } } -} - -function createCapturedValue(value, source) { - // If the value is an error, call this function immediately after it is thrown - // so the stack is accurate. - return { - value: value, - source: source, - stack: getStackByFiberInDevAndProd(source) - }; -} -// This module is forked in different environments. -// By default, return `true` to log errors to the console. -// Forks can return `false` if this isn't desirable. -function showErrorDialog(capturedError) { - return true; -} - -function logCapturedError(capturedError) { - var logError = showErrorDialog(capturedError); // Allow injected showErrorDialog() to prevent default console.error logging. - // This enables renderers like ReactNative to better manage redbox behavior. - - if (logError === false) { - return; + function createCapturedValue(value, source) { + // If the value is an error, call this function immediately after it is thrown + // so the stack is accurate. + return { + value: value, + source: source, + stack: getStackByFiberInDevAndProd(source) + }; } - var error = capturedError.error; + function logCapturedError(capturedError) { - { - var componentName = capturedError.componentName, - componentStack = capturedError.componentStack, - errorBoundaryName = capturedError.errorBoundaryName, - errorBoundaryFound = capturedError.errorBoundaryFound, - willRetry = capturedError.willRetry; // Browsers support silencing uncaught errors by calling - // `preventDefault()` in window `error` handler. - // We record this information as an expando on the error. - - if (error != null && error._suppressLogging) { - if (errorBoundaryFound && willRetry) { - // The error is recoverable and was silenced. - // Ignore it and don't print the stack addendum. - // This is handy for testing error boundaries without noise. - return; - } // The error is fatal. Since the silencing might have - // been accidental, we'll surface it anyway. - // However, the browser would have silenced the original error - // so we'll print it first, and then print the stack addendum. + var error = capturedError.error; + + { + var componentName = capturedError.componentName, + componentStack = capturedError.componentStack, + errorBoundaryName = capturedError.errorBoundaryName, + errorBoundaryFound = capturedError.errorBoundaryFound, + willRetry = capturedError.willRetry; // Browsers support silencing uncaught errors by calling + // `preventDefault()` in window `error` handler. + // We record this information as an expando on the error. + + if (error != null && error._suppressLogging) { + if (errorBoundaryFound && willRetry) { + // The error is recoverable and was silenced. + // Ignore it and don't print the stack addendum. + // This is handy for testing error boundaries without noise. + return; + } // The error is fatal. Since the silencing might have + // been accidental, we'll surface it anyway. + // However, the browser would have silenced the original error + // so we'll print it first, and then print the stack addendum. - console.error(error); // For a more detailed description of this block, see: - // https://github.com/facebook/react/pull/13384 - } + console['error'](error); // Don't transform to our wrapper + // For a more detailed description of this block, see: + // https://github.com/facebook/react/pull/13384 + } - var componentNameMessage = componentName ? "The above error occurred in the <" + componentName + "> component:" : 'The above error occurred in one of your React components:'; - var errorBoundaryMessage; // errorBoundaryFound check is sufficient; errorBoundaryName check is to satisfy Flow. + var componentNameMessage = componentName ? "The above error occurred in the <" + componentName + "> component:" : 'The above error occurred in one of your React components:'; + var errorBoundaryMessage; // errorBoundaryFound check is sufficient; errorBoundaryName check is to satisfy Flow. - if (errorBoundaryFound && errorBoundaryName) { - if (willRetry) { - errorBoundaryMessage = "React will try to recreate this component tree from scratch " + ("using the error boundary you provided, " + errorBoundaryName + "."); + if (errorBoundaryFound && errorBoundaryName) { + if (willRetry) { + errorBoundaryMessage = "React will try to recreate this component tree from scratch " + ("using the error boundary you provided, " + errorBoundaryName + "."); + } else { + errorBoundaryMessage = "This error was initially handled by the error boundary " + errorBoundaryName + ".\n" + "Recreating the tree from scratch failed so React will unmount the tree."; + } } else { - errorBoundaryMessage = "This error was initially handled by the error boundary " + errorBoundaryName + ".\n" + "Recreating the tree from scratch failed so React will unmount the tree."; + errorBoundaryMessage = 'Consider adding an error boundary to your tree to customize error handling behavior.\n' + 'Visit https://fb.me/react-error-boundaries to learn more about error boundaries.'; } - } else { - errorBoundaryMessage = 'Consider adding an error boundary to your tree to customize error handling behavior.\n' + 'Visit https://fb.me/react-error-boundaries to learn more about error boundaries.'; - } - var combinedMessage = "" + componentNameMessage + componentStack + "\n\n" + ("" + errorBoundaryMessage); // In development, we provide our own message with just the component stack. - // We don't include the original error message and JS stack because the browser - // has already printed it. Even if the application swallows the error, it is still - // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils. + var combinedMessage = "" + componentNameMessage + componentStack + "\n\n" + ("" + errorBoundaryMessage); // In development, we provide our own message with just the component stack. + // We don't include the original error message and JS stack because the browser + // has already printed it. Even if the application swallows the error, it is still + // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils. - console.error(combinedMessage); + console['error'](combinedMessage); // Don't transform to our wrapper + } } -} -var didWarnAboutUndefinedSnapshotBeforeUpdate = null; + var didWarnAboutUndefinedSnapshotBeforeUpdate = null; -{ - didWarnAboutUndefinedSnapshotBeforeUpdate = new Set(); -} + { + didWarnAboutUndefinedSnapshotBeforeUpdate = new Set(); + } -var PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set; -function logError(boundary, errorInfo) { - var source = errorInfo.source; - var stack = errorInfo.stack; + var PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set; + function logError(boundary, errorInfo) { + var source = errorInfo.source; + var stack = errorInfo.stack; - if (stack === null && source !== null) { - stack = getStackByFiberInDevAndProd(source); - } + if (stack === null && source !== null) { + stack = getStackByFiberInDevAndProd(source); + } - var capturedError = { - componentName: source !== null ? getComponentName(source.type) : null, - componentStack: stack !== null ? stack : '', - error: errorInfo.value, - errorBoundary: null, - errorBoundaryName: null, - errorBoundaryFound: false, - willRetry: false - }; + var capturedError = { + componentName: source !== null ? getComponentName(source.type) : null, + componentStack: stack !== null ? stack : '', + error: errorInfo.value, + errorBoundary: null, + errorBoundaryName: null, + errorBoundaryFound: false, + willRetry: false + }; - if (boundary !== null && boundary.tag === ClassComponent) { - capturedError.errorBoundary = boundary.stateNode; - capturedError.errorBoundaryName = getComponentName(boundary.type); - capturedError.errorBoundaryFound = true; - capturedError.willRetry = true; - } - - try { - logCapturedError(capturedError); - } catch (e) { - // This method must not throw, or React internal state will get messed up. - // If console.error is overridden, or logCapturedError() shows a dialog that throws, - // we want to report this error outside of the normal stack as a last resort. - // https://github.com/facebook/react/issues/13188 - setTimeout(function () { - throw e; - }); + if (boundary !== null && boundary.tag === ClassComponent) { + capturedError.errorBoundary = boundary.stateNode; + capturedError.errorBoundaryName = getComponentName(boundary.type); + capturedError.errorBoundaryFound = true; + capturedError.willRetry = true; + } + + try { + logCapturedError(capturedError); + } catch (e) { + // This method must not throw, or React internal state will get messed up. + // If console.error is overridden, or logCapturedError() shows a dialog that throws, + // we want to report this error outside of the normal stack as a last resort. + // https://github.com/facebook/react/issues/13188 + setTimeout(function () { + throw e; + }); + } } -} -var callComponentWillUnmountWithTimer = function (current$$1, instance) { - startPhaseTimer(current$$1, 'componentWillUnmount'); - instance.props = current$$1.memoizedProps; - instance.state = current$$1.memoizedState; - instance.componentWillUnmount(); - stopPhaseTimer(); -}; // Capture errors so they don't interrupt unmounting. + var callComponentWillUnmountWithTimer = function (current, instance) { + startPhaseTimer(current, 'componentWillUnmount'); + instance.props = current.memoizedProps; + instance.state = current.memoizedState; + instance.componentWillUnmount(); + stopPhaseTimer(); + }; // Capture errors so they don't interrupt unmounting. -function safelyCallComponentWillUnmount(current$$1, instance) { - { - invokeGuardedCallback(null, callComponentWillUnmountWithTimer, null, current$$1, instance); + function safelyCallComponentWillUnmount(current, instance) { + { + invokeGuardedCallback(null, callComponentWillUnmountWithTimer, null, current, instance); - if (hasCaughtError()) { - var unmountError = clearCaughtError(); - captureCommitPhaseError(current$$1, unmountError); + if (hasCaughtError()) { + var unmountError = clearCaughtError(); + captureCommitPhaseError(current, unmountError); + } } } -} -function safelyDetachRef(current$$1) { - var ref = current$$1.ref; + function safelyDetachRef(current) { + var ref = current.ref; - if (ref !== null) { - if (typeof ref === 'function') { - { - invokeGuardedCallback(null, ref, null, null); + if (ref !== null) { + if (typeof ref === 'function') { + { + invokeGuardedCallback(null, ref, null, null); - if (hasCaughtError()) { - var refError = clearCaughtError(); - captureCommitPhaseError(current$$1, refError); + if (hasCaughtError()) { + var refError = clearCaughtError(); + captureCommitPhaseError(current, refError); + } } + } else { + ref.current = null; } - } else { - ref.current = null; } } -} -function safelyCallDestroy(current$$1, destroy) { - { - invokeGuardedCallback(null, destroy, null); + function safelyCallDestroy(current, destroy) { + { + invokeGuardedCallback(null, destroy, null); - if (hasCaughtError()) { - var error = clearCaughtError(); - captureCommitPhaseError(current$$1, error); + if (hasCaughtError()) { + var error = clearCaughtError(); + captureCommitPhaseError(current, error); + } } } -} -function commitBeforeMutationLifeCycles(current$$1, finishedWork) { - switch (finishedWork.tag) { - case FunctionComponent: - case ForwardRef: - case SimpleMemoComponent: - { - commitHookEffectList(UnmountSnapshot, NoEffect$1, finishedWork); - return; - } + function commitBeforeMutationLifeCycles(current, finishedWork) { + switch (finishedWork.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: + case Block: + { + return; + } - case ClassComponent: - { - if (finishedWork.effectTag & Snapshot) { - if (current$$1 !== null) { - var prevProps = current$$1.memoizedProps; - var prevState = current$$1.memoizedState; - startPhaseTimer(finishedWork, 'getSnapshotBeforeUpdate'); - var instance = finishedWork.stateNode; // We could update instance props and state here, - // but instead we rely on them being set during last render. - // TODO: revisit this when we implement resuming. + case ClassComponent: + { + if (finishedWork.effectTag & Snapshot) { + if (current !== null) { + var prevProps = current.memoizedProps; + var prevState = current.memoizedState; + startPhaseTimer(finishedWork, 'getSnapshotBeforeUpdate'); + var instance = finishedWork.stateNode; // We could update instance props and state here, + // but instead we rely on them being set during last render. + // TODO: revisit this when we implement resuming. - { - if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { - !(instance.props === finishedWork.memoizedProps) ? warning$1(false, 'Expected %s props to match memoized props before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0; - !(instance.state === finishedWork.memoizedState) ? warning$1(false, 'Expected %s state to match memoized state before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0; + { + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { + if (instance.props !== finishedWork.memoizedProps) { + error('Expected %s props to match memoized props before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + + if (instance.state !== finishedWork.memoizedState) { + error('Expected %s state to match memoized state before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + } } - } - var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState); + var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState); - { - var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate; + { + var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate; + + if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) { + didWarnSet.add(finishedWork.type); - if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) { - didWarnSet.add(finishedWork.type); - warningWithoutStack$1(false, '%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentName(finishedWork.type)); + error('%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentName(finishedWork.type)); + } } - } - instance.__reactInternalSnapshotBeforeUpdate = snapshot; - stopPhaseTimer(); + instance.__reactInternalSnapshotBeforeUpdate = snapshot; + stopPhaseTimer(); + } } + + return; } + case HostRoot: + case HostComponent: + case HostText: + case HostPortal: + case IncompleteClassComponent: + // Nothing to do for these component types return; - } - - case HostRoot: - case HostComponent: - case HostText: - case HostPortal: - case IncompleteClassComponent: - // Nothing to do for these component types - return; + } - default: + { { - { - { - throw Error("This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue."); - } - } + throw Error( "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." ); } + } } -} -function commitHookEffectList(unmountTag, mountTag, finishedWork) { - var updateQueue = finishedWork.updateQueue; - var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null; + function commitHookEffectListUnmount(tag, finishedWork) { + var updateQueue = finishedWork.updateQueue; + var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null; - if (lastEffect !== null) { - var firstEffect = lastEffect.next; - var effect = firstEffect; + if (lastEffect !== null) { + var firstEffect = lastEffect.next; + var effect = firstEffect; - do { - if ((effect.tag & unmountTag) !== NoEffect$1) { - // Unmount - var destroy = effect.destroy; - effect.destroy = undefined; + do { + if ((effect.tag & tag) === tag) { + // Unmount + var destroy = effect.destroy; + effect.destroy = undefined; - if (destroy !== undefined) { - destroy(); + if (destroy !== undefined) { + destroy(); + } } - } - if ((effect.tag & mountTag) !== NoEffect$1) { - // Mount - var create = effect.create; - effect.destroy = create(); + effect = effect.next; + } while (effect !== firstEffect); + } + } + + function commitHookEffectListMount(tag, finishedWork) { + var updateQueue = finishedWork.updateQueue; + var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null; - { - var _destroy = effect.destroy; + if (lastEffect !== null) { + var firstEffect = lastEffect.next; + var effect = firstEffect; + + do { + if ((effect.tag & tag) === tag) { + // Mount + var create = effect.create; + effect.destroy = create(); - if (_destroy !== undefined && typeof _destroy !== 'function') { - var addendum = void 0; + { + var destroy = effect.destroy; - if (_destroy === null) { - addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).'; - } else if (typeof _destroy.then === 'function') { - addendum = '\n\nIt looks like you wrote useEffect(async () => ...) or returned a Promise. ' + 'Instead, write the async function inside your effect ' + 'and call it immediately:\n\n' + 'useEffect(() => {\n' + ' async function fetchData() {\n' + ' // You can await here\n' + ' const response = await MyAPI.getData(someId);\n' + ' // ...\n' + ' }\n' + ' fetchData();\n' + "}, [someId]); // Or [] if effect doesn't need props or state\n\n" + 'Learn more about data fetching with Hooks: https://fb.me/react-hooks-data-fetching'; - } else { - addendum = ' You returned: ' + _destroy; - } + if (destroy !== undefined && typeof destroy !== 'function') { + var addendum = void 0; - warningWithoutStack$1(false, 'An effect function must not return anything besides a function, ' + 'which is used for clean-up.%s%s', addendum, getStackByFiberInDevAndProd(finishedWork)); + if (destroy === null) { + addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).'; + } else if (typeof destroy.then === 'function') { + addendum = '\n\nIt looks like you wrote useEffect(async () => ...) or returned a Promise. ' + 'Instead, write the async function inside your effect ' + 'and call it immediately:\n\n' + 'useEffect(() => {\n' + ' async function fetchData() {\n' + ' // You can await here\n' + ' const response = await MyAPI.getData(someId);\n' + ' // ...\n' + ' }\n' + ' fetchData();\n' + "}, [someId]); // Or [] if effect doesn't need props or state\n\n" + 'Learn more about data fetching with Hooks: https://fb.me/react-hooks-data-fetching'; + } else { + addendum = ' You returned: ' + destroy; + } + + error('An effect function must not return anything besides a function, ' + 'which is used for clean-up.%s%s', addendum, getStackByFiberInDevAndProd(finishedWork)); + } } } - } - effect = effect.next; - } while (effect !== firstEffect); + effect = effect.next; + } while (effect !== firstEffect); + } + } + + function commitPassiveHookEffects(finishedWork) { + if ((finishedWork.effectTag & Passive) !== NoEffect) { + switch (finishedWork.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: + case Block: + { + // TODO (#17945) We should call all passive destroy functions (for all fibers) + // before calling any create functions. The current approach only serializes + // these for a single fiber. + commitHookEffectListUnmount(Passive$1 | HasEffect, finishedWork); + commitHookEffectListMount(Passive$1 | HasEffect, finishedWork); + break; + } + } + } } -} -function commitPassiveHookEffects(finishedWork) { - if ((finishedWork.effectTag & Passive) !== NoEffect) { + function commitLifeCycles(finishedRoot, current, finishedWork, committedExpirationTime) { switch (finishedWork.tag) { case FunctionComponent: case ForwardRef: case SimpleMemoComponent: + case Block: { - commitHookEffectList(UnmountPassive, NoEffect$1, finishedWork); - commitHookEffectList(NoEffect$1, MountPassive, finishedWork); - break; + // At this point layout effects have already been destroyed (during mutation phase). + // This is done to prevent sibling component effects from interfering with each other, + // e.g. a destroy function in one component should never override a ref set + // by a create function in another component during the same commit. + commitHookEffectListMount(Layout | HasEffect, finishedWork); + + return; } - default: - break; - } - } -} + case ClassComponent: + { + var instance = finishedWork.stateNode; -function commitLifeCycles(finishedRoot, current$$1, finishedWork, committedExpirationTime) { - switch (finishedWork.tag) { - case FunctionComponent: - case ForwardRef: - case SimpleMemoComponent: - { - commitHookEffectList(UnmountLayout, MountLayout, finishedWork); - break; - } + if (finishedWork.effectTag & Update) { + if (current === null) { + startPhaseTimer(finishedWork, 'componentDidMount'); // We could update instance props and state here, + // but instead we rely on them being set during last render. + // TODO: revisit this when we implement resuming. + + { + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { + if (instance.props !== finishedWork.memoizedProps) { + error('Expected %s props to match memoized props before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + + if (instance.state !== finishedWork.memoizedState) { + error('Expected %s state to match memoized state before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + } + } - case ClassComponent: - { - var instance = finishedWork.stateNode; + instance.componentDidMount(); + stopPhaseTimer(); + } else { + var prevProps = finishedWork.elementType === finishedWork.type ? current.memoizedProps : resolveDefaultProps(finishedWork.type, current.memoizedProps); + var prevState = current.memoizedState; + startPhaseTimer(finishedWork, 'componentDidUpdate'); // We could update instance props and state here, + // but instead we rely on them being set during last render. + // TODO: revisit this when we implement resuming. - if (finishedWork.effectTag & Update) { - if (current$$1 === null) { - startPhaseTimer(finishedWork, 'componentDidMount'); // We could update instance props and state here, - // but instead we rely on them being set during last render. - // TODO: revisit this when we implement resuming. + { + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { + if (instance.props !== finishedWork.memoizedProps) { + error('Expected %s props to match memoized props before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } - { - if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { - !(instance.props === finishedWork.memoizedProps) ? warning$1(false, 'Expected %s props to match memoized props before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0; - !(instance.state === finishedWork.memoizedState) ? warning$1(false, 'Expected %s state to match memoized state before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0; + if (instance.state !== finishedWork.memoizedState) { + error('Expected %s state to match memoized state before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + } } + + instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate); + stopPhaseTimer(); } + } - instance.componentDidMount(); - stopPhaseTimer(); - } else { - var prevProps = finishedWork.elementType === finishedWork.type ? current$$1.memoizedProps : resolveDefaultProps(finishedWork.type, current$$1.memoizedProps); - var prevState = current$$1.memoizedState; - startPhaseTimer(finishedWork, 'componentDidUpdate'); // We could update instance props and state here, - // but instead we rely on them being set during last render. - // TODO: revisit this when we implement resuming. + var updateQueue = finishedWork.updateQueue; + if (updateQueue !== null) { { if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { - !(instance.props === finishedWork.memoizedProps) ? warning$1(false, 'Expected %s props to match memoized props before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0; - !(instance.state === finishedWork.memoizedState) ? warning$1(false, 'Expected %s state to match memoized state before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0; - } - } - - instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate); - stopPhaseTimer(); - } - } + if (instance.props !== finishedWork.memoizedProps) { + error('Expected %s props to match memoized props before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } - var updateQueue = finishedWork.updateQueue; + if (instance.state !== finishedWork.memoizedState) { + error('Expected %s state to match memoized state before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + } + } // We could update instance props and state here, + // but instead we rely on them being set during last render. + // TODO: revisit this when we implement resuming. - if (updateQueue !== null) { - { - if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { - !(instance.props === finishedWork.memoizedProps) ? warning$1(false, 'Expected %s props to match memoized props before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0; - !(instance.state === finishedWork.memoizedState) ? warning$1(false, 'Expected %s state to match memoized state before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0; - } - } // We could update instance props and state here, - // but instead we rely on them being set during last render. - // TODO: revisit this when we implement resuming. + commitUpdateQueue(finishedWork, updateQueue, instance); + } - commitUpdateQueue(finishedWork, updateQueue, instance, committedExpirationTime); + return; } - return; - } - - case HostRoot: - { - var _updateQueue = finishedWork.updateQueue; + case HostRoot: + { + var _updateQueue = finishedWork.updateQueue; - if (_updateQueue !== null) { - var _instance = null; + if (_updateQueue !== null) { + var _instance = null; - if (finishedWork.child !== null) { - switch (finishedWork.child.tag) { - case HostComponent: - _instance = getPublicInstance(finishedWork.child.stateNode); - break; + if (finishedWork.child !== null) { + switch (finishedWork.child.tag) { + case HostComponent: + _instance = getPublicInstance(finishedWork.child.stateNode); + break; - case ClassComponent: - _instance = finishedWork.child.stateNode; - break; + case ClassComponent: + _instance = finishedWork.child.stateNode; + break; + } } + + commitUpdateQueue(finishedWork, _updateQueue, _instance); } - commitUpdateQueue(finishedWork, _updateQueue, _instance, committedExpirationTime); + return; } - return; - } - - case HostComponent: - { - var _instance2 = finishedWork.stateNode; // Renderers may schedule work to be done after host components are mounted - // (eg DOM renderer may schedule auto-focus for inputs and form controls). - // These effects should only be committed when components are first mounted, - // aka when there is no current/alternate. + case HostComponent: + { + var _instance2 = finishedWork.stateNode; // Renderers may schedule work to be done after host components are mounted + // (eg DOM renderer may schedule auto-focus for inputs and form controls). + // These effects should only be committed when components are first mounted, + // aka when there is no current/alternate. + + if (current === null && finishedWork.effectTag & Update) { + var type = finishedWork.type; + var props = finishedWork.memoizedProps; + commitMount(_instance2, type, props); + } - if (current$$1 === null && finishedWork.effectTag & Update) { - var type = finishedWork.type; - var props = finishedWork.memoizedProps; - commitMount(_instance2, type, props, finishedWork); + return; } - return; - } - - case HostText: - { - // We have no life-cycles associated with text. - return; - } + case HostText: + { + // We have no life-cycles associated with text. + return; + } - case HostPortal: - { - // We have no life-cycles associated with portals. - return; - } + case HostPortal: + { + // We have no life-cycles associated with portals. + return; + } - case Profiler: - { - if (enableProfilerTimer) { - var onRender = finishedWork.memoizedProps.onRender; + case Profiler: + { + { + var onRender = finishedWork.memoizedProps.onRender; - if (typeof onRender === 'function') { - if (enableSchedulerTracing) { - onRender(finishedWork.memoizedProps.id, current$$1 === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime(), finishedRoot.memoizedInteractions); - } else { - onRender(finishedWork.memoizedProps.id, current$$1 === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime()); + if (typeof onRender === 'function') { + { + onRender(finishedWork.memoizedProps.id, current === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime(), finishedRoot.memoizedInteractions); + } } } + + return; } - return; - } + case SuspenseComponent: + { + commitSuspenseHydrationCallbacks(finishedRoot, finishedWork); + return; + } - case SuspenseComponent: - { - commitSuspenseHydrationCallbacks(finishedRoot, finishedWork); + case SuspenseListComponent: + case IncompleteClassComponent: + case FundamentalComponent: + case ScopeComponent: return; - } - - case SuspenseListComponent: - case IncompleteClassComponent: - case FundamentalComponent: - case ScopeComponent: - return; + } - default: + { { - { - { - throw Error("This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue."); - } - } + throw Error( "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." ); } + } } -} -function hideOrUnhideAllChildren(finishedWork, isHidden) { - if (supportsMutation) { - // We only have the top Fiber that was inserted but we need to recurse down its - // children to find all the terminal nodes. - var node = finishedWork; + function hideOrUnhideAllChildren(finishedWork, isHidden) { + { + // We only have the top Fiber that was inserted but we need to recurse down its + // children to find all the terminal nodes. + var node = finishedWork; - while (true) { - if (node.tag === HostComponent) { - var instance = node.stateNode; + while (true) { + if (node.tag === HostComponent) { + var instance = node.stateNode; - if (isHidden) { - hideInstance(instance); - } else { - unhideInstance(node.stateNode, node.memoizedProps); + if (isHidden) { + hideInstance(instance); + } else { + unhideInstance(node.stateNode, node.memoizedProps); + } + } else if (node.tag === HostText) { + var _instance3 = node.stateNode; + + if (isHidden) { + hideTextInstance(_instance3); + } else { + unhideTextInstance(_instance3, node.memoizedProps); + } + } else if (node.tag === SuspenseComponent && node.memoizedState !== null && node.memoizedState.dehydrated === null) { + // Found a nested Suspense component that timed out. Skip over the + // primary child fragment, which should remain hidden. + var fallbackChildFragment = node.child.sibling; + fallbackChildFragment.return = node; + node = fallbackChildFragment; + continue; + } else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; } - } else if (node.tag === HostText) { - var _instance3 = node.stateNode; - if (isHidden) { - hideTextInstance(_instance3); - } else { - unhideTextInstance(_instance3, node.memoizedProps); - } - } else if (node.tag === SuspenseComponent && node.memoizedState !== null && node.memoizedState.dehydrated === null) { - // Found a nested Suspense component that timed out. Skip over the - // primary child fragment, which should remain hidden. - var fallbackChildFragment = node.child.sibling; - fallbackChildFragment.return = node; - node = fallbackChildFragment; - continue; - } else if (node.child !== null) { - node.child.return = node; - node = node.child; - continue; - } + if (node === finishedWork) { + return; + } - if (node === finishedWork) { - return; - } + while (node.sibling === null) { + if (node.return === null || node.return === finishedWork) { + return; + } - while (node.sibling === null) { - if (node.return === null || node.return === finishedWork) { - return; + node = node.return; } - node = node.return; + node.sibling.return = node.return; + node = node.sibling; } - - node.sibling.return = node.return; - node = node.sibling; } } -} - -function commitAttachRef(finishedWork) { - var ref = finishedWork.ref; - if (ref !== null) { - var instance = finishedWork.stateNode; - var instanceToUse; + function commitAttachRef(finishedWork) { + var ref = finishedWork.ref; - switch (finishedWork.tag) { - case HostComponent: - instanceToUse = getPublicInstance(instance); - break; - - default: - instanceToUse = instance; - } // Moved outside to ensure DCE works with this flag + if (ref !== null) { + var instance = finishedWork.stateNode; + var instanceToUse; + switch (finishedWork.tag) { + case HostComponent: + instanceToUse = getPublicInstance(instance); + break; - if (enableScopeAPI && finishedWork.tag === ScopeComponent) { - instanceToUse = instance.methods; - } + default: + instanceToUse = instance; + } // Moved outside to ensure DCE works with this flag - if (typeof ref === 'function') { - ref(instanceToUse); - } else { - { - if (!ref.hasOwnProperty('current')) { - warningWithoutStack$1(false, 'Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().%s', getComponentName(finishedWork.type), getStackByFiberInDevAndProd(finishedWork)); + if (typeof ref === 'function') { + ref(instanceToUse); + } else { + { + if (!ref.hasOwnProperty('current')) { + error('Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().%s', getComponentName(finishedWork.type), getStackByFiberInDevAndProd(finishedWork)); + } } - } - ref.current = instanceToUse; + ref.current = instanceToUse; + } } } -} -function commitDetachRef(current$$1) { - var currentRef = current$$1.ref; + function commitDetachRef(current) { + var currentRef = current.ref; - if (currentRef !== null) { - if (typeof currentRef === 'function') { - currentRef(null); - } else { - currentRef.current = null; + if (currentRef !== null) { + if (typeof currentRef === 'function') { + currentRef(null); + } else { + currentRef.current = null; + } } - } -} // User-originating errors (lifecycles and refs) should not interrupt -// deletion, so don't let them throw. Host-originating errors should -// interrupt deletion, so it's okay + } // User-originating errors (lifecycles and refs) should not interrupt + // deletion, so don't let them throw. Host-originating errors should + // interrupt deletion, so it's okay -function commitUnmount(finishedRoot, current$$1, renderPriorityLevel) { - onCommitUnmount(current$$1); + function commitUnmount(finishedRoot, current, renderPriorityLevel) { + onCommitUnmount(current); - switch (current$$1.tag) { - case FunctionComponent: - case ForwardRef: - case MemoComponent: - case SimpleMemoComponent: - { - var updateQueue = current$$1.updateQueue; - - if (updateQueue !== null) { - var lastEffect = updateQueue.lastEffect; - - if (lastEffect !== null) { - var firstEffect = lastEffect.next; // When the owner fiber is deleted, the destroy function of a passive - // effect hook is called during the synchronous commit phase. This is - // a concession to implementation complexity. Calling it in the - // passive effect phase (like they usually are, when dependencies - // change during an update) would require either traversing the - // children of the deleted fiber again, or including unmount effects - // as part of the fiber effect list. - // - // Because this is during the sync commit phase, we need to change - // the priority. - // - // TODO: Reconsider this implementation trade off. + switch (current.tag) { + case FunctionComponent: + case ForwardRef: + case MemoComponent: + case SimpleMemoComponent: + case Block: + { + var updateQueue = current.updateQueue; - var priorityLevel = renderPriorityLevel > NormalPriority ? NormalPriority : renderPriorityLevel; - runWithPriority$2(priorityLevel, function () { - var effect = firstEffect; + if (updateQueue !== null) { + var lastEffect = updateQueue.lastEffect; - do { - var destroy = effect.destroy; + if (lastEffect !== null) { + var firstEffect = lastEffect.next; - if (destroy !== undefined) { - safelyCallDestroy(current$$1, destroy); - } + { + // When the owner fiber is deleted, the destroy function of a passive + // effect hook is called during the synchronous commit phase. This is + // a concession to implementation complexity. Calling it in the + // passive effect phase (like they usually are, when dependencies + // change during an update) would require either traversing the + // children of the deleted fiber again, or including unmount effects + // as part of the fiber effect list. + // + // Because this is during the sync commit phase, we need to change + // the priority. + // + // TODO: Reconsider this implementation trade off. + var priorityLevel = renderPriorityLevel > NormalPriority ? NormalPriority : renderPriorityLevel; + runWithPriority$1(priorityLevel, function () { + var effect = firstEffect; + + do { + var _destroy = effect.destroy; + + if (_destroy !== undefined) { + safelyCallDestroy(current, _destroy); + } - effect = effect.next; - } while (effect !== firstEffect); - }); + effect = effect.next; + } while (effect !== firstEffect); + }); + } + } } - } - - break; - } - - case ClassComponent: - { - safelyDetachRef(current$$1); - var instance = current$$1.stateNode; - if (typeof instance.componentWillUnmount === 'function') { - safelyCallComponentWillUnmount(current$$1, instance); + return; } - return; - } - - case HostComponent: - { - if (enableFlareAPI) { - var dependencies = current$$1.dependencies; - - if (dependencies !== null) { - var respondersMap = dependencies.responders; - - if (respondersMap !== null) { - var responderInstances = Array.from(respondersMap.values()); - - for (var i = 0, length = responderInstances.length; i < length; i++) { - var responderInstance = responderInstances[i]; - unmountResponderInstance(responderInstance); - } + case ClassComponent: + { + safelyDetachRef(current); + var instance = current.stateNode; - dependencies.responders = null; - } + if (typeof instance.componentWillUnmount === 'function') { + safelyCallComponentWillUnmount(current, instance); } - } - - safelyDetachRef(current$$1); - return; - } - case HostPortal: - { - // TODO: this is recursive. - // We are also not using this parent because - // the portal will get pushed immediately. - if (supportsMutation) { - unmountHostComponents(finishedRoot, current$$1, renderPriorityLevel); - } else if (supportsPersistence) { - emptyPortalContainer(current$$1); + return; } - return; - } + case HostComponent: + { - case FundamentalComponent: - { - if (enableFundamentalAPI) { - var fundamentalInstance = current$$1.stateNode; + safelyDetachRef(current); + return; + } - if (fundamentalInstance !== null) { - unmountFundamentalComponent(fundamentalInstance); - current$$1.stateNode = null; + case HostPortal: + { + // TODO: this is recursive. + // We are also not using this parent because + // the portal will get pushed immediately. + { + unmountHostComponents(finishedRoot, current, renderPriorityLevel); } + + return; } - return; - } + case FundamentalComponent: + { - case DehydratedFragment: - { - if (enableSuspenseCallback) { - var hydrationCallbacks = finishedRoot.hydrationCallbacks; + return; + } - if (hydrationCallbacks !== null) { - var onDeleted = hydrationCallbacks.onDeleted; + case DehydratedFragment: + { - if (onDeleted) { - onDeleted(current$$1.stateNode); - } - } + return; } - return; - } + case ScopeComponent: + { - case ScopeComponent: - { - if (enableScopeAPI) { - safelyDetachRef(current$$1); + return; } - } + } } -} - -function commitNestedUnmounts(finishedRoot, root, renderPriorityLevel) { - // While we're inside a removed host node we don't want to call - // removeChild on the inner nodes because they're removed by the top - // call anyway. We also want to call componentWillUnmount on all - // composites before this host node is removed from the tree. Therefore - // we do an inner loop while we're still inside the host node. - var node = root; - while (true) { - commitUnmount(finishedRoot, node, renderPriorityLevel); // Visit children because they may contain more composite or host nodes. - // Skip portals because commitUnmount() currently visits them recursively. + function commitNestedUnmounts(finishedRoot, root, renderPriorityLevel) { + // While we're inside a removed host node we don't want to call + // removeChild on the inner nodes because they're removed by the top + // call anyway. We also want to call componentWillUnmount on all + // composites before this host node is removed from the tree. Therefore + // we do an inner loop while we're still inside the host node. + var node = root; - if (node.child !== null && ( // If we use mutation we drill down into portals using commitUnmount above. - // If we don't use mutation we drill down into portals here instead. - !supportsMutation || node.tag !== HostPortal)) { - node.child.return = node; - node = node.child; - continue; - } + while (true) { + commitUnmount(finishedRoot, node, renderPriorityLevel); // Visit children because they may contain more composite or host nodes. + // Skip portals because commitUnmount() currently visits them recursively. - if (node === root) { - return; - } + if (node.child !== null && ( // If we use mutation we drill down into portals using commitUnmount above. + // If we don't use mutation we drill down into portals here instead. + node.tag !== HostPortal)) { + node.child.return = node; + node = node.child; + continue; + } - while (node.sibling === null) { - if (node.return === null || node.return === root) { + if (node === root) { return; } - node = node.return; - } - - node.sibling.return = node.return; - node = node.sibling; - } -} - -function detachFiber(current$$1) { - var alternate = current$$1.alternate; // Cut off the return pointers to disconnect it from the tree. Ideally, we - // should clear the child pointer of the parent alternate to let this - // get GC:ed but we don't know which for sure which parent is the current - // one so we'll settle for GC:ing the subtree of this child. This child - // itself will be GC:ed when the parent updates the next time. + while (node.sibling === null) { + if (node.return === null || node.return === root) { + return; + } - current$$1.return = null; - current$$1.child = null; - current$$1.memoizedState = null; - current$$1.updateQueue = null; - current$$1.dependencies = null; - current$$1.alternate = null; - current$$1.firstEffect = null; - current$$1.lastEffect = null; - current$$1.pendingProps = null; - current$$1.memoizedProps = null; + node = node.return; + } - if (alternate !== null) { - detachFiber(alternate); + node.sibling.return = node.return; + node = node.sibling; + } } -} -function emptyPortalContainer(current$$1) { - if (!supportsPersistence) { - return; - } + function detachFiber(current) { + var alternate = current.alternate; // Cut off the return pointers to disconnect it from the tree. Ideally, we + // should clear the child pointer of the parent alternate to let this + // get GC:ed but we don't know which for sure which parent is the current + // one so we'll settle for GC:ing the subtree of this child. This child + // itself will be GC:ed when the parent updates the next time. - var portal = current$$1.stateNode; - var containerInfo = portal.containerInfo; - var emptyChildSet = createContainerChildSet(containerInfo); - replaceContainerChildren(containerInfo, emptyChildSet); -} + current.return = null; + current.child = null; + current.memoizedState = null; + current.updateQueue = null; + current.dependencies = null; + current.alternate = null; + current.firstEffect = null; + current.lastEffect = null; + current.pendingProps = null; + current.memoizedProps = null; + current.stateNode = null; -function commitContainer(finishedWork) { - if (!supportsPersistence) { - return; + if (alternate !== null) { + detachFiber(alternate); + } } - switch (finishedWork.tag) { - case ClassComponent: - case HostComponent: - case HostText: - case FundamentalComponent: - { - return; - } - - case HostRoot: - case HostPortal: - { - var portalOrRoot = finishedWork.stateNode; - var containerInfo = portalOrRoot.containerInfo, - pendingChildren = portalOrRoot.pendingChildren; - replaceContainerChildren(containerInfo, pendingChildren); - return; - } + function getHostParentFiber(fiber) { + var parent = fiber.return; - default: - { - { - { - throw Error("This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue."); - } - } + while (parent !== null) { + if (isHostParent(parent)) { + return parent; } - } -} -function getHostParentFiber(fiber) { - var parent = fiber.return; - - while (parent !== null) { - if (isHostParent(parent)) { - return parent; - } - - parent = parent.return; - } + parent = parent.return; + } - { { - throw Error("Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue."); + { + throw Error( "Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue." ); + } } } -} -function isHostParent(fiber) { - return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal; -} + function isHostParent(fiber) { + return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal; + } -function getHostSibling(fiber) { - // We're going to search forward into the tree until we find a sibling host - // node. Unfortunately, if multiple insertions are done in a row we have to - // search past them. This leads to exponential search for the next sibling. - // TODO: Find a more efficient way to do this. - var node = fiber; + function getHostSibling(fiber) { + // We're going to search forward into the tree until we find a sibling host + // node. Unfortunately, if multiple insertions are done in a row we have to + // search past them. This leads to exponential search for the next sibling. + // TODO: Find a more efficient way to do this. + var node = fiber; - siblings: while (true) { - // If we didn't find anything, let's try the next sibling. - while (node.sibling === null) { - if (node.return === null || isHostParent(node.return)) { - // If we pop out of the root or hit the parent the fiber we are the - // last sibling. - return null; - } + siblings: while (true) { + // If we didn't find anything, let's try the next sibling. + while (node.sibling === null) { + if (node.return === null || isHostParent(node.return)) { + // If we pop out of the root or hit the parent the fiber we are the + // last sibling. + return null; + } - node = node.return; - } + node = node.return; + } - node.sibling.return = node.return; - node = node.sibling; + node.sibling.return = node.return; + node = node.sibling; - while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedFragment) { - // If it is not host node and, we might have a host node inside it. - // Try to search down until we find one. - if (node.effectTag & Placement) { - // If we don't have a child, try the siblings instead. - continue siblings; - } // If we don't have a child, try the siblings instead. - // We also skip portals because they are not part of this host tree. + while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedFragment) { + // If it is not host node and, we might have a host node inside it. + // Try to search down until we find one. + if (node.effectTag & Placement) { + // If we don't have a child, try the siblings instead. + continue siblings; + } // If we don't have a child, try the siblings instead. + // We also skip portals because they are not part of this host tree. - if (node.child === null || node.tag === HostPortal) { - continue siblings; - } else { - node.child.return = node; - node = node.child; - } - } // Check if this host node is stable or about to be placed. + if (node.child === null || node.tag === HostPortal) { + continue siblings; + } else { + node.child.return = node; + node = node.child; + } + } // Check if this host node is stable or about to be placed. - if (!(node.effectTag & Placement)) { - // Found it! - return node.stateNode; + if (!(node.effectTag & Placement)) { + // Found it! + return node.stateNode; + } } } -} -function commitPlacement(finishedWork) { - if (!supportsMutation) { - return; - } // Recursively insert all host nodes into the parent. + function commitPlacement(finishedWork) { - var parentFiber = getHostParentFiber(finishedWork); // Note: these two variables *must* always be updated together. + var parentFiber = getHostParentFiber(finishedWork); // Note: these two variables *must* always be updated together. - var parent; - var isContainer; - var parentStateNode = parentFiber.stateNode; + var parent; + var isContainer; + var parentStateNode = parentFiber.stateNode; - switch (parentFiber.tag) { - case HostComponent: - parent = parentStateNode; - isContainer = false; - break; + switch (parentFiber.tag) { + case HostComponent: + parent = parentStateNode; + isContainer = false; + break; - case HostRoot: - parent = parentStateNode.containerInfo; - isContainer = true; - break; + case HostRoot: + parent = parentStateNode.containerInfo; + isContainer = true; + break; - case HostPortal: - parent = parentStateNode.containerInfo; - isContainer = true; - break; + case HostPortal: + parent = parentStateNode.containerInfo; + isContainer = true; + break; - case FundamentalComponent: - if (enableFundamentalAPI) { - parent = parentStateNode.instance; - isContainer = false; - } + case FundamentalComponent: - // eslint-disable-next-line-no-fallthrough + // eslint-disable-next-line-no-fallthrough - default: - { + default: { - throw Error("Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue."); + { + throw Error( "Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue." ); + } } - } - } + } - if (parentFiber.effectTag & ContentReset) { - // Reset the text content of the parent before doing any insertions - resetTextContent(parent); // Clear ContentReset from the effect tag + if (parentFiber.effectTag & ContentReset) { + // Reset the text content of the parent before doing any insertions + resetTextContent(parent); // Clear ContentReset from the effect tag - parentFiber.effectTag &= ~ContentReset; - } + parentFiber.effectTag &= ~ContentReset; + } - var before = getHostSibling(finishedWork); // We only have the top Fiber that was inserted but we need to recurse down its - // children to find all the terminal nodes. + var before = getHostSibling(finishedWork); // We only have the top Fiber that was inserted but we need to recurse down its + // children to find all the terminal nodes. - var node = finishedWork; + if (isContainer) { + insertOrAppendPlacementNodeIntoContainer(finishedWork, before, parent); + } else { + insertOrAppendPlacementNode(finishedWork, before, parent); + } + } - while (true) { - var isHost = node.tag === HostComponent || node.tag === HostText; + function insertOrAppendPlacementNodeIntoContainer(node, before, parent) { + var tag = node.tag; + var isHost = tag === HostComponent || tag === HostText; - if (isHost || enableFundamentalAPI && node.tag === FundamentalComponent) { + if (isHost || enableFundamentalAPI ) { var stateNode = isHost ? node.stateNode : node.stateNode.instance; if (before) { - if (isContainer) { - insertInContainerBefore(parent, stateNode, before); - } else { - insertBefore(parent, stateNode, before); - } + insertInContainerBefore(parent, stateNode, before); } else { - if (isContainer) { - appendChildToContainer(parent, stateNode); - } else { - appendChild(parent, stateNode); - } + appendChildToContainer(parent, stateNode); } - } else if (node.tag === HostPortal) {// If the insertion itself is a portal, then we don't want to traverse - // down its children. Instead, we'll get insertions from each child in - // the portal directly. - } else if (node.child !== null) { - node.child.return = node; - node = node.child; - continue; - } + } else if (tag === HostPortal) ; else { + var child = node.child; - if (node === finishedWork) { - return; - } + if (child !== null) { + insertOrAppendPlacementNodeIntoContainer(child, before, parent); + var sibling = child.sibling; - while (node.sibling === null) { - if (node.return === null || node.return === finishedWork) { - return; + while (sibling !== null) { + insertOrAppendPlacementNodeIntoContainer(sibling, before, parent); + sibling = sibling.sibling; + } } - - node = node.return; } - - node.sibling.return = node.return; - node = node.sibling; } -} -function unmountHostComponents(finishedRoot, current$$1, renderPriorityLevel) { - // We only have the top Fiber that was deleted but we need to recurse down its - // children to find all the terminal nodes. - var node = current$$1; // Each iteration, currentParent is populated with node's host parent if not - // currentParentIsValid. + function insertOrAppendPlacementNode(node, before, parent) { + var tag = node.tag; + var isHost = tag === HostComponent || tag === HostText; - var currentParentIsValid = false; // Note: these two variables *must* always be updated together. + if (isHost || enableFundamentalAPI ) { + var stateNode = isHost ? node.stateNode : node.stateNode.instance; - var currentParent; - var currentParentIsContainer; + if (before) { + insertBefore(parent, stateNode, before); + } else { + appendChild(parent, stateNode); + } + } else if (tag === HostPortal) ; else { + var child = node.child; - while (true) { - if (!currentParentIsValid) { - var parent = node.return; + if (child !== null) { + insertOrAppendPlacementNode(child, before, parent); + var sibling = child.sibling; - findParent: while (true) { - if (!(parent !== null)) { - { - throw Error("Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue."); - } + while (sibling !== null) { + insertOrAppendPlacementNode(sibling, before, parent); + sibling = sibling.sibling; } + } + } + } - var parentStateNode = parent.stateNode; + function unmountHostComponents(finishedRoot, current, renderPriorityLevel) { + // We only have the top Fiber that was deleted but we need to recurse down its + // children to find all the terminal nodes. + var node = current; // Each iteration, currentParent is populated with node's host parent if not + // currentParentIsValid. - switch (parent.tag) { - case HostComponent: - currentParent = parentStateNode; - currentParentIsContainer = false; - break findParent; + var currentParentIsValid = false; // Note: these two variables *must* always be updated together. - case HostRoot: - currentParent = parentStateNode.containerInfo; - currentParentIsContainer = true; - break findParent; + var currentParent; + var currentParentIsContainer; - case HostPortal: - currentParent = parentStateNode.containerInfo; - currentParentIsContainer = true; - break findParent; + while (true) { + if (!currentParentIsValid) { + var parent = node.return; - case FundamentalComponent: - if (enableFundamentalAPI) { - currentParent = parentStateNode.instance; - currentParentIsContainer = false; + findParent: while (true) { + if (!(parent !== null)) { + { + throw Error( "Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue." ); } + } - } + var parentStateNode = parent.stateNode; - parent = parent.return; - } + switch (parent.tag) { + case HostComponent: + currentParent = parentStateNode; + currentParentIsContainer = false; + break findParent; - currentParentIsValid = true; - } + case HostRoot: + currentParent = parentStateNode.containerInfo; + currentParentIsContainer = true; + break findParent; - if (node.tag === HostComponent || node.tag === HostText) { - commitNestedUnmounts(finishedRoot, node, renderPriorityLevel); // After all the children have unmounted, it is now safe to remove the - // node from the tree. + case HostPortal: + currentParent = parentStateNode.containerInfo; + currentParentIsContainer = true; + break findParent; - if (currentParentIsContainer) { - removeChildFromContainer(currentParent, node.stateNode); - } else { - removeChild(currentParent, node.stateNode); - } // Don't visit children because we already visited them. + } - } else if (enableFundamentalAPI && node.tag === FundamentalComponent) { - var fundamentalNode = node.stateNode.instance; - commitNestedUnmounts(finishedRoot, node, renderPriorityLevel); // After all the children have unmounted, it is now safe to remove the - // node from the tree. + parent = parent.return; + } - if (currentParentIsContainer) { - removeChildFromContainer(currentParent, fundamentalNode); - } else { - removeChild(currentParent, fundamentalNode); + currentParentIsValid = true; } - } else if (enableSuspenseServerRenderer && node.tag === DehydratedFragment) { - if (enableSuspenseCallback) { - var hydrationCallbacks = finishedRoot.hydrationCallbacks; - if (hydrationCallbacks !== null) { - var onDeleted = hydrationCallbacks.onDeleted; + if (node.tag === HostComponent || node.tag === HostText) { + commitNestedUnmounts(finishedRoot, node, renderPriorityLevel); // After all the children have unmounted, it is now safe to remove the + // node from the tree. - if (onDeleted) { - onDeleted(node.stateNode); - } - } - } // Delete the dehydrated suspense boundary and all of its content. + if (currentParentIsContainer) { + removeChildFromContainer(currentParent, node.stateNode); + } else { + removeChild(currentParent, node.stateNode); + } // Don't visit children because we already visited them. + } else if (node.tag === HostPortal) { + if (node.child !== null) { + // When we go into a portal, it becomes the parent to remove from. + // We will reassign it back when we pop the portal on the way up. + currentParent = node.stateNode.containerInfo; + currentParentIsContainer = true; // Visit children because portals might contain host components. - if (currentParentIsContainer) { - clearSuspenseBoundaryFromContainer(currentParent, node.stateNode); + node.child.return = node; + node = node.child; + continue; + } } else { - clearSuspenseBoundary(currentParent, node.stateNode); - } - } else if (node.tag === HostPortal) { - if (node.child !== null) { - // When we go into a portal, it becomes the parent to remove from. - // We will reassign it back when we pop the portal on the way up. - currentParent = node.stateNode.containerInfo; - currentParentIsContainer = true; // Visit children because portals might contain host components. - - node.child.return = node; - node = node.child; - continue; - } - } else { - commitUnmount(finishedRoot, node, renderPriorityLevel); // Visit children because we may find more host components below. + commitUnmount(finishedRoot, node, renderPriorityLevel); // Visit children because we may find more host components below. - if (node.child !== null) { - node.child.return = node; - node = node.child; - continue; + if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } } - } - - if (node === current$$1) { - return; - } - while (node.sibling === null) { - if (node.return === null || node.return === current$$1) { + if (node === current) { return; } - node = node.return; + while (node.sibling === null) { + if (node.return === null || node.return === current) { + return; + } - if (node.tag === HostPortal) { - // When we go out of the portal, we need to restore the parent. - // Since we don't keep a stack of them, we will search for it. - currentParentIsValid = false; + node = node.return; + + if (node.tag === HostPortal) { + // When we go out of the portal, we need to restore the parent. + // Since we don't keep a stack of them, we will search for it. + currentParentIsValid = false; + } } - } - node.sibling.return = node.return; - node = node.sibling; + node.sibling.return = node.return; + node = node.sibling; + } } -} -function commitDeletion(finishedRoot, current$$1, renderPriorityLevel) { - if (supportsMutation) { - // Recursively delete all host nodes from the parent. - // Detach refs and call componentWillUnmount() on the whole subtree. - unmountHostComponents(finishedRoot, current$$1, renderPriorityLevel); - } else { - // Detach refs and call componentWillUnmount() on the whole subtree. - commitNestedUnmounts(finishedRoot, current$$1, renderPriorityLevel); + function commitDeletion(finishedRoot, current, renderPriorityLevel) { + { + // Recursively delete all host nodes from the parent. + // Detach refs and call componentWillUnmount() on the whole subtree. + unmountHostComponents(finishedRoot, current, renderPriorityLevel); + } + + detachFiber(current); } - detachFiber(current$$1); -} + function commitWork(current, finishedWork) { -function commitWork(current$$1, finishedWork) { - if (!supportsMutation) { switch (finishedWork.tag) { case FunctionComponent: case ForwardRef: case MemoComponent: case SimpleMemoComponent: + case Block: { - // Note: We currently never use MountMutation, but useLayout uses - // UnmountMutation. - commitHookEffectList(UnmountMutation, MountMutation, finishedWork); + // Layout effects are destroyed during the mutation phase so that all + // destroy functions for all fibers are called before any create functions. + // This prevents sibling component effects from interfering with each other, + // e.g. a destroy function in one component should never override a ref set + // by a create function in another component during the same commit. + commitHookEffectListUnmount(Layout | HasEffect, finishedWork); return; } - case Profiler: + case ClassComponent: { return; } - case SuspenseComponent: + case HostComponent: { - commitSuspenseComponent(finishedWork); - attachSuspenseRetryListeners(finishedWork); - return; - } + var instance = finishedWork.stateNode; - case SuspenseListComponent: - { - attachSuspenseRetryListeners(finishedWork); - return; - } + if (instance != null) { + // Commit the work prepared earlier. + var newProps = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps + // as the newProps. The updatePayload will contain the real change in + // this case. - case HostRoot: - { - if (supportsHydration) { - var root = finishedWork.stateNode; + var oldProps = current !== null ? current.memoizedProps : newProps; + var type = finishedWork.type; // TODO: Type the updateQueue to be specific to host components. - if (root.hydrate) { - // We've just hydrated. No need to hydrate again. - root.hydrate = false; - commitHydratedContainer(root.containerInfo); + var updatePayload = finishedWork.updateQueue; + finishedWork.updateQueue = null; + + if (updatePayload !== null) { + commitUpdate(instance, updatePayload, type, oldProps, newProps); } } - break; + return; } - } - - commitContainer(finishedWork); - return; - } - - switch (finishedWork.tag) { - case FunctionComponent: - case ForwardRef: - case MemoComponent: - case SimpleMemoComponent: - { - // Note: We currently never use MountMutation, but useLayout uses - // UnmountMutation. - commitHookEffectList(UnmountMutation, MountMutation, finishedWork); - return; - } - - case ClassComponent: - { - return; - } - case HostComponent: - { - var instance = finishedWork.stateNode; + case HostText: + { + if (!(finishedWork.stateNode !== null)) { + { + throw Error( "This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue." ); + } + } - if (instance != null) { - // Commit the work prepared earlier. - var newProps = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps + var textInstance = finishedWork.stateNode; + var newText = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps // as the newProps. The updatePayload will contain the real change in // this case. - var oldProps = current$$1 !== null ? current$$1.memoizedProps : newProps; - var type = finishedWork.type; // TODO: Type the updateQueue to be specific to host components. - - var updatePayload = finishedWork.updateQueue; - finishedWork.updateQueue = null; - - if (updatePayload !== null) { - commitUpdate(instance, updatePayload, type, oldProps, newProps, finishedWork); - } + var oldText = current !== null ? current.memoizedProps : newText; + commitTextUpdate(textInstance, oldText, newText); + return; + } - if (enableFlareAPI) { - var prevListeners = oldProps.listeners; - var nextListeners = newProps.listeners; + case HostRoot: + { + { + var _root = finishedWork.stateNode; - if (prevListeners !== nextListeners) { - updateEventListeners(nextListeners, finishedWork, null); + if (_root.hydrate) { + // We've just hydrated. No need to hydrate again. + _root.hydrate = false; + commitHydratedContainer(_root.containerInfo); } } - } - - return; - } - case HostText: - { - if (!(finishedWork.stateNode !== null)) { - { - throw Error("This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue."); - } + return; } - var textInstance = finishedWork.stateNode; - var newText = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps - // as the newProps. The updatePayload will contain the real change in - // this case. - - var oldText = current$$1 !== null ? current$$1.memoizedProps : newText; - commitTextUpdate(textInstance, oldText, newText); - return; - } - - case HostRoot: - { - if (supportsHydration) { - var _root = finishedWork.stateNode; - - if (_root.hydrate) { - // We've just hydrated. No need to hydrate again. - _root.hydrate = false; - commitHydratedContainer(_root.containerInfo); - } + case Profiler: + { + return; } - return; - } - - case Profiler: - { - return; - } - - case SuspenseComponent: - { - commitSuspenseComponent(finishedWork); - attachSuspenseRetryListeners(finishedWork); - return; - } - - case SuspenseListComponent: - { - attachSuspenseRetryListeners(finishedWork); - return; - } - - case IncompleteClassComponent: - { - return; - } - - case FundamentalComponent: - { - if (enableFundamentalAPI) { - var fundamentalInstance = finishedWork.stateNode; - updateFundamentalComponent(fundamentalInstance); + case SuspenseComponent: + { + commitSuspenseComponent(finishedWork); + attachSuspenseRetryListeners(finishedWork); + return; } - return; - } - - case ScopeComponent: - { - if (enableScopeAPI) { - var scopeInstance = finishedWork.stateNode; - scopeInstance.fiber = finishedWork; - - if (enableFlareAPI) { - var _newProps = finishedWork.memoizedProps; - - var _oldProps = current$$1 !== null ? current$$1.memoizedProps : _newProps; - - var _prevListeners = _oldProps.listeners; - var _nextListeners = _newProps.listeners; - - if (_prevListeners !== _nextListeners) { - updateEventListeners(_nextListeners, finishedWork, null); - } - } + case SuspenseListComponent: + { + attachSuspenseRetryListeners(finishedWork); + return; } - return; - } - - default: - { + case IncompleteClassComponent: { - { - throw Error("This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue."); - } + return; } - } - } -} - -function commitSuspenseComponent(finishedWork) { - var newState = finishedWork.memoizedState; - var newDidTimeout; - var primaryChildParent = finishedWork; - - if (newState === null) { - newDidTimeout = false; - } else { - newDidTimeout = true; - primaryChildParent = finishedWork.child; - markCommitTimeOfFallback(); - } + } - if (supportsMutation && primaryChildParent !== null) { - hideOrUnhideAllChildren(primaryChildParent, newDidTimeout); + { + { + throw Error( "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." ); + } + } } - if (enableSuspenseCallback && newState !== null) { - var suspenseCallback = finishedWork.memoizedProps.suspenseCallback; + function commitSuspenseComponent(finishedWork) { + var newState = finishedWork.memoizedState; + var newDidTimeout; + var primaryChildParent = finishedWork; - if (typeof suspenseCallback === 'function') { - var thenables = finishedWork.updateQueue; - - if (thenables !== null) { - suspenseCallback(new Set(thenables)); - } + if (newState === null) { + newDidTimeout = false; } else { - if (suspenseCallback !== undefined) { - warning$1(false, 'Unexpected type for suspenseCallback.'); - } + newDidTimeout = true; + primaryChildParent = finishedWork.child; + markCommitTimeOfFallback(); } - } -} -function commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) { - if (!supportsHydration) { - return; + if ( primaryChildParent !== null) { + hideOrUnhideAllChildren(primaryChildParent, newDidTimeout); + } } - var newState = finishedWork.memoizedState; - - if (newState === null) { - var current$$1 = finishedWork.alternate; + function commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) { - if (current$$1 !== null) { - var prevState = current$$1.memoizedState; - - if (prevState !== null) { - var suspenseInstance = prevState.dehydrated; + var newState = finishedWork.memoizedState; - if (suspenseInstance !== null) { - commitHydratedSuspenseInstance(suspenseInstance); + if (newState === null) { + var current = finishedWork.alternate; - if (enableSuspenseCallback) { - var hydrationCallbacks = finishedRoot.hydrationCallbacks; + if (current !== null) { + var prevState = current.memoizedState; - if (hydrationCallbacks !== null) { - var onHydrated = hydrationCallbacks.onHydrated; + if (prevState !== null) { + var suspenseInstance = prevState.dehydrated; - if (onHydrated) { - onHydrated(suspenseInstance); - } - } + if (suspenseInstance !== null) { + commitHydratedSuspenseInstance(suspenseInstance); } } } } } -} -function attachSuspenseRetryListeners(finishedWork) { - // If this boundary just timed out, then it will have a set of thenables. - // For each thenable, attach a listener so that when it resolves, React - // attempts to re-render the boundary in the primary (pre-timeout) state. - var thenables = finishedWork.updateQueue; + function attachSuspenseRetryListeners(finishedWork) { + // If this boundary just timed out, then it will have a set of thenables. + // For each thenable, attach a listener so that when it resolves, React + // attempts to re-render the boundary in the primary (pre-timeout) state. + var thenables = finishedWork.updateQueue; - if (thenables !== null) { - finishedWork.updateQueue = null; - var retryCache = finishedWork.stateNode; + if (thenables !== null) { + finishedWork.updateQueue = null; + var retryCache = finishedWork.stateNode; - if (retryCache === null) { - retryCache = finishedWork.stateNode = new PossiblyWeakSet(); - } + if (retryCache === null) { + retryCache = finishedWork.stateNode = new PossiblyWeakSet(); + } - thenables.forEach(function (thenable) { - // Memoize using the boundary fiber to prevent redundant listeners. - var retry = resolveRetryThenable.bind(null, finishedWork, thenable); + thenables.forEach(function (thenable) { + // Memoize using the boundary fiber to prevent redundant listeners. + var retry = resolveRetryThenable.bind(null, finishedWork, thenable); - if (!retryCache.has(thenable)) { - if (enableSchedulerTracing) { - if (thenable.__reactDoNotTraceInteractions !== true) { - retry = unstable_wrap(retry); + if (!retryCache.has(thenable)) { + { + if (thenable.__reactDoNotTraceInteractions !== true) { + retry = unstable_wrap(retry); + } } - } - - retryCache.add(thenable); - thenable.then(retry, retry); - } - }); - } -} -function commitResetTextContent(current$$1) { - if (!supportsMutation) { - return; + retryCache.add(thenable); + thenable.then(retry, retry); + } + }); + } } - resetTextContent(current$$1.stateNode); -} + function commitResetTextContent(current) { -var PossiblyWeakMap$1 = typeof WeakMap === 'function' ? WeakMap : Map; - -function createRootErrorUpdate(fiber, errorInfo, expirationTime) { - var update = createUpdate(expirationTime, null); // Unmount the root by rendering null. - - update.tag = CaptureUpdate; // Caution: React DevTools currently depends on this property - // being called "element". - - update.payload = { - element: null - }; - var error = errorInfo.value; + resetTextContent(current.stateNode); + } - update.callback = function () { - onUncaughtError(error); - logError(fiber, errorInfo); - }; + var PossiblyWeakMap$1 = typeof WeakMap === 'function' ? WeakMap : Map; - return update; -} + function createRootErrorUpdate(fiber, errorInfo, expirationTime) { + var update = createUpdate(expirationTime, null); // Unmount the root by rendering null. -function createClassErrorUpdate(fiber, errorInfo, expirationTime) { - var update = createUpdate(expirationTime, null); - update.tag = CaptureUpdate; - var getDerivedStateFromError = fiber.type.getDerivedStateFromError; + update.tag = CaptureUpdate; // Caution: React DevTools currently depends on this property + // being called "element". - if (typeof getDerivedStateFromError === 'function') { + update.payload = { + element: null + }; var error = errorInfo.value; - update.payload = function () { + update.callback = function () { + onUncaughtError(error); logError(fiber, errorInfo); - return getDerivedStateFromError(error); }; - } - var inst = fiber.stateNode; + return update; + } - if (inst !== null && typeof inst.componentDidCatch === 'function') { - update.callback = function callback() { - { - markFailedErrorBoundaryForHotReloading(fiber); - } + function createClassErrorUpdate(fiber, errorInfo, expirationTime) { + var update = createUpdate(expirationTime, null); + update.tag = CaptureUpdate; + var getDerivedStateFromError = fiber.type.getDerivedStateFromError; - if (typeof getDerivedStateFromError !== 'function') { - // To preserve the preexisting retry behavior of error boundaries, - // we keep track of which ones already failed during this batch. - // This gets reset before we yield back to the browser. - // TODO: Warn in strict mode if getDerivedStateFromError is - // not defined. - markLegacyErrorBoundaryAsFailed(this); // Only log here if componentDidCatch is the only error boundary method defined + if (typeof getDerivedStateFromError === 'function') { + var error$1 = errorInfo.value; + update.payload = function () { logError(fiber, errorInfo); - } + return getDerivedStateFromError(error$1); + }; + } - var error = errorInfo.value; - var stack = errorInfo.stack; - this.componentDidCatch(error, { - componentStack: stack !== null ? stack : '' - }); + var inst = fiber.stateNode; + + if (inst !== null && typeof inst.componentDidCatch === 'function') { + update.callback = function callback() { + { + markFailedErrorBoundaryForHotReloading(fiber); + } - { if (typeof getDerivedStateFromError !== 'function') { - // If componentDidCatch is the only error boundary method defined, - // then it needs to call setState to recover from errors. - // If no state update is scheduled then the boundary will swallow the error. - !(fiber.expirationTime === Sync) ? warningWithoutStack$1(false, '%s: Error boundaries should implement getDerivedStateFromError(). ' + 'In that method, return a state update to display an error message or fallback UI.', getComponentName(fiber.type) || 'Unknown') : void 0; + // To preserve the preexisting retry behavior of error boundaries, + // we keep track of which ones already failed during this batch. + // This gets reset before we yield back to the browser. + // TODO: Warn in strict mode if getDerivedStateFromError is + // not defined. + markLegacyErrorBoundaryAsFailed(this); // Only log here if componentDidCatch is the only error boundary method defined + + logError(fiber, errorInfo); } - } - }; - } else { - update.callback = function () { - markFailedErrorBoundaryForHotReloading(fiber); - }; - } - return update; -} + var error$1 = errorInfo.value; + var stack = errorInfo.stack; + this.componentDidCatch(error$1, { + componentStack: stack !== null ? stack : '' + }); + + { + if (typeof getDerivedStateFromError !== 'function') { + // If componentDidCatch is the only error boundary method defined, + // then it needs to call setState to recover from errors. + // If no state update is scheduled then the boundary will swallow the error. + if (fiber.expirationTime !== Sync) { + error('%s: Error boundaries should implement getDerivedStateFromError(). ' + 'In that method, return a state update to display an error message or fallback UI.', getComponentName(fiber.type) || 'Unknown'); + } + } + } + }; + } else { + update.callback = function () { + markFailedErrorBoundaryForHotReloading(fiber); + }; + } -function attachPingListener(root, renderExpirationTime, thenable) { - // Attach a listener to the promise to "ping" the root and retry. But - // only if one does not already exist for the current render expiration - // time (which acts like a "thread ID" here). - var pingCache = root.pingCache; - var threadIDs; + return update; + } - if (pingCache === null) { - pingCache = root.pingCache = new PossiblyWeakMap$1(); - threadIDs = new Set(); - pingCache.set(thenable, threadIDs); - } else { - threadIDs = pingCache.get(thenable); + function attachPingListener(root, renderExpirationTime, thenable) { + // Attach a listener to the promise to "ping" the root and retry. But + // only if one does not already exist for the current render expiration + // time (which acts like a "thread ID" here). + var pingCache = root.pingCache; + var threadIDs; - if (threadIDs === undefined) { + if (pingCache === null) { + pingCache = root.pingCache = new PossiblyWeakMap$1(); threadIDs = new Set(); pingCache.set(thenable, threadIDs); + } else { + threadIDs = pingCache.get(thenable); + + if (threadIDs === undefined) { + threadIDs = new Set(); + pingCache.set(thenable, threadIDs); + } } - } - if (!threadIDs.has(renderExpirationTime)) { - // Memoize using the thread ID to prevent redundant listeners. - threadIDs.add(renderExpirationTime); - var ping = pingSuspendedRoot.bind(null, root, thenable, renderExpirationTime); - thenable.then(ping, ping); + if (!threadIDs.has(renderExpirationTime)) { + // Memoize using the thread ID to prevent redundant listeners. + threadIDs.add(renderExpirationTime); + var ping = pingSuspendedRoot.bind(null, root, thenable, renderExpirationTime); + thenable.then(ping, ping); + } } -} -function throwException(root, returnFiber, sourceFiber, value, renderExpirationTime) { - // The source fiber did not complete. - sourceFiber.effectTag |= Incomplete; // Its effect list is no longer valid. + function throwException(root, returnFiber, sourceFiber, value, renderExpirationTime) { + // The source fiber did not complete. + sourceFiber.effectTag |= Incomplete; // Its effect list is no longer valid. - sourceFiber.firstEffect = sourceFiber.lastEffect = null; + sourceFiber.firstEffect = sourceFiber.lastEffect = null; - if (value !== null && typeof value === 'object' && typeof value.then === 'function') { - // This is a thenable. - var thenable = value; - checkForWrongSuspensePriorityInDEV(sourceFiber); - var hasInvisibleParentBoundary = hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext); // Schedule the nearest Suspense to re-render the timed out view. + if (value !== null && typeof value === 'object' && typeof value.then === 'function') { + // This is a thenable. + var thenable = value; - var _workInProgress = returnFiber; + if ((sourceFiber.mode & BlockingMode) === NoMode) { + // Reset the memoizedState to what it was before we attempted + // to render it. + var currentSource = sourceFiber.alternate; - do { - if (_workInProgress.tag === SuspenseComponent && shouldCaptureSuspense(_workInProgress, hasInvisibleParentBoundary)) { - // Found the nearest boundary. - // Stash the promise on the boundary fiber. If the boundary times out, we'll - // attach another listener to flip the boundary back to its normal state. - var thenables = _workInProgress.updateQueue; - - if (thenables === null) { - var updateQueue = new Set(); - updateQueue.add(thenable); - _workInProgress.updateQueue = updateQueue; + if (currentSource) { + sourceFiber.updateQueue = currentSource.updateQueue; + sourceFiber.memoizedState = currentSource.memoizedState; + sourceFiber.expirationTime = currentSource.expirationTime; } else { - thenables.add(thenable); - } // If the boundary is outside of blocking mode, we should *not* - // suspend the commit. Pretend as if the suspended component rendered - // null and keep rendering. In the commit phase, we'll schedule a - // subsequent synchronous update to re-render the Suspense. - // - // Note: It doesn't matter whether the component that suspended was - // inside a blocking mode tree. If the Suspense is outside of it, we - // should *not* suspend the commit. + sourceFiber.updateQueue = null; + sourceFiber.memoizedState = null; + } + } + var hasInvisibleParentBoundary = hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext); // Schedule the nearest Suspense to re-render the timed out view. - if ((_workInProgress.mode & BlockingMode) === NoMode) { - _workInProgress.effectTag |= DidCapture; // We're going to commit this fiber even though it didn't complete. - // But we shouldn't call any lifecycle methods or callbacks. Remove - // all lifecycle effect tags. + var _workInProgress = returnFiber; - sourceFiber.effectTag &= ~(LifecycleEffectMask | Incomplete); + do { + if (_workInProgress.tag === SuspenseComponent && shouldCaptureSuspense(_workInProgress, hasInvisibleParentBoundary)) { + // Found the nearest boundary. + // Stash the promise on the boundary fiber. If the boundary times out, we'll + // attach another listener to flip the boundary back to its normal state. + var thenables = _workInProgress.updateQueue; + + if (thenables === null) { + var updateQueue = new Set(); + updateQueue.add(thenable); + _workInProgress.updateQueue = updateQueue; + } else { + thenables.add(thenable); + } // If the boundary is outside of blocking mode, we should *not* + // suspend the commit. Pretend as if the suspended component rendered + // null and keep rendering. In the commit phase, we'll schedule a + // subsequent synchronous update to re-render the Suspense. + // + // Note: It doesn't matter whether the component that suspended was + // inside a blocking mode tree. If the Suspense is outside of it, we + // should *not* suspend the commit. - if (sourceFiber.tag === ClassComponent) { - var currentSourceFiber = sourceFiber.alternate; - if (currentSourceFiber === null) { - // This is a new mount. Change the tag so it's not mistaken for a - // completed class component. For example, we should not call - // componentWillUnmount if it is deleted. - sourceFiber.tag = IncompleteClassComponent; - } else { - // When we try rendering again, we should not reuse the current fiber, - // since it's known to be in an inconsistent state. Use a force update to - // prevent a bail out. - var update = createUpdate(Sync, null); - update.tag = ForceUpdate; - enqueueUpdate(sourceFiber, update); - } - } // The source fiber did not complete. Mark it with Sync priority to - // indicate that it still has pending work. + if ((_workInProgress.mode & BlockingMode) === NoMode) { + _workInProgress.effectTag |= DidCapture; // We're going to commit this fiber even though it didn't complete. + // But we shouldn't call any lifecycle methods or callbacks. Remove + // all lifecycle effect tags. + sourceFiber.effectTag &= ~(LifecycleEffectMask | Incomplete); - sourceFiber.expirationTime = Sync; // Exit without suspending. + if (sourceFiber.tag === ClassComponent) { + var currentSourceFiber = sourceFiber.alternate; - return; - } // Confirmed that the boundary is in a concurrent mode tree. Continue - // with the normal suspend path. - // - // After this we'll use a set of heuristics to determine whether this - // render pass will run to completion or restart or "suspend" the commit. - // The actual logic for this is spread out in different places. - // - // This first principle is that if we're going to suspend when we complete - // a root, then we should also restart if we get an update or ping that - // might unsuspend it, and vice versa. The only reason to suspend is - // because you think you might want to restart before committing. However, - // it doesn't make sense to restart only while in the period we're suspended. - // - // Restarting too aggressively is also not good because it starves out any - // intermediate loading state. So we use heuristics to determine when. - // Suspense Heuristics - // - // If nothing threw a Promise or all the same fallbacks are already showing, - // then don't suspend/restart. - // - // If this is an initial render of a new tree of Suspense boundaries and - // those trigger a fallback, then don't suspend/restart. We want to ensure - // that we can show the initial loading state as quickly as possible. - // - // If we hit a "Delayed" case, such as when we'd switch from content back into - // a fallback, then we should always suspend/restart. SuspenseConfig applies to - // this case. If none is defined, JND is used instead. - // - // If we're already showing a fallback and it gets "retried", allowing us to show - // another level, but there's still an inner boundary that would show a fallback, - // then we suspend/restart for 500ms since the last time we showed a fallback - // anywhere in the tree. This effectively throttles progressive loading into a - // consistent train of commits. This also gives us an opportunity to restart to - // get to the completed state slightly earlier. - // - // If there's ambiguity due to batching it's resolved in preference of: - // 1) "delayed", 2) "initial render", 3) "retry". - // - // We want to ensure that a "busy" state doesn't get force committed. We want to - // ensure that new initial loading states can commit as soon as possible. + if (currentSourceFiber === null) { + // This is a new mount. Change the tag so it's not mistaken for a + // completed class component. For example, we should not call + // componentWillUnmount if it is deleted. + sourceFiber.tag = IncompleteClassComponent; + } else { + // When we try rendering again, we should not reuse the current fiber, + // since it's known to be in an inconsistent state. Use a force update to + // prevent a bail out. + var update = createUpdate(Sync, null); + update.tag = ForceUpdate; + enqueueUpdate(sourceFiber, update); + } + } // The source fiber did not complete. Mark it with Sync priority to + // indicate that it still has pending work. - attachPingListener(root, renderExpirationTime, thenable); - _workInProgress.effectTag |= ShouldCapture; - _workInProgress.expirationTime = renderExpirationTime; - return; - } // This boundary already captured during this render. Continue to the next - // boundary. + sourceFiber.expirationTime = Sync; // Exit without suspending. + return; + } // Confirmed that the boundary is in a concurrent mode tree. Continue + // with the normal suspend path. + // + // After this we'll use a set of heuristics to determine whether this + // render pass will run to completion or restart or "suspend" the commit. + // The actual logic for this is spread out in different places. + // + // This first principle is that if we're going to suspend when we complete + // a root, then we should also restart if we get an update or ping that + // might unsuspend it, and vice versa. The only reason to suspend is + // because you think you might want to restart before committing. However, + // it doesn't make sense to restart only while in the period we're suspended. + // + // Restarting too aggressively is also not good because it starves out any + // intermediate loading state. So we use heuristics to determine when. + // Suspense Heuristics + // + // If nothing threw a Promise or all the same fallbacks are already showing, + // then don't suspend/restart. + // + // If this is an initial render of a new tree of Suspense boundaries and + // those trigger a fallback, then don't suspend/restart. We want to ensure + // that we can show the initial loading state as quickly as possible. + // + // If we hit a "Delayed" case, such as when we'd switch from content back into + // a fallback, then we should always suspend/restart. SuspenseConfig applies to + // this case. If none is defined, JND is used instead. + // + // If we're already showing a fallback and it gets "retried", allowing us to show + // another level, but there's still an inner boundary that would show a fallback, + // then we suspend/restart for 500ms since the last time we showed a fallback + // anywhere in the tree. This effectively throttles progressive loading into a + // consistent train of commits. This also gives us an opportunity to restart to + // get to the completed state slightly earlier. + // + // If there's ambiguity due to batching it's resolved in preference of: + // 1) "delayed", 2) "initial render", 3) "retry". + // + // We want to ensure that a "busy" state doesn't get force committed. We want to + // ensure that new initial loading states can commit as soon as possible. - _workInProgress = _workInProgress.return; - } while (_workInProgress !== null); // No boundary was found. Fallthrough to error mode. - // TODO: Use invariant so the message is stripped in prod? + attachPingListener(root, renderExpirationTime, thenable); + _workInProgress.effectTag |= ShouldCapture; + _workInProgress.expirationTime = renderExpirationTime; + return; + } // This boundary already captured during this render. Continue to the next + // boundary. - value = new Error((getComponentName(sourceFiber.type) || 'A React component') + ' suspended while rendering, but no fallback UI was specified.\n' + '\n' + 'Add a <Suspense fallback=...> component higher in the tree to ' + 'provide a loading indicator or placeholder to display.' + getStackByFiberInDevAndProd(sourceFiber)); - } // We didn't find a boundary that could handle this type of exception. Start - // over and traverse parent path again, this time treating the exception - // as an error. + _workInProgress = _workInProgress.return; + } while (_workInProgress !== null); // No boundary was found. Fallthrough to error mode. + // TODO: Use invariant so the message is stripped in prod? - renderDidError(); - value = createCapturedValue(value, sourceFiber); - var workInProgress = returnFiber; - do { - switch (workInProgress.tag) { - case HostRoot: - { - var _errorInfo = value; - workInProgress.effectTag |= ShouldCapture; - workInProgress.expirationTime = renderExpirationTime; + value = new Error((getComponentName(sourceFiber.type) || 'A React component') + ' suspended while rendering, but no fallback UI was specified.\n' + '\n' + 'Add a <Suspense fallback=...> component higher in the tree to ' + 'provide a loading indicator or placeholder to display.' + getStackByFiberInDevAndProd(sourceFiber)); + } // We didn't find a boundary that could handle this type of exception. Start + // over and traverse parent path again, this time treating the exception + // as an error. - var _update = createRootErrorUpdate(workInProgress, _errorInfo, renderExpirationTime); - enqueueCapturedUpdate(workInProgress, _update); - return; - } + renderDidError(); + value = createCapturedValue(value, sourceFiber); + var workInProgress = returnFiber; - case ClassComponent: - // Capture and retry - var errorInfo = value; - var ctor = workInProgress.type; - var instance = workInProgress.stateNode; + do { + switch (workInProgress.tag) { + case HostRoot: + { + var _errorInfo = value; + workInProgress.effectTag |= ShouldCapture; + workInProgress.expirationTime = renderExpirationTime; - if ((workInProgress.effectTag & DidCapture) === NoEffect && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) { - workInProgress.effectTag |= ShouldCapture; - workInProgress.expirationTime = renderExpirationTime; // Schedule the error boundary to re-render using updated state + var _update = createRootErrorUpdate(workInProgress, _errorInfo, renderExpirationTime); - var _update2 = createClassErrorUpdate(workInProgress, errorInfo, renderExpirationTime); + enqueueCapturedUpdate(workInProgress, _update); + return; + } - enqueueCapturedUpdate(workInProgress, _update2); - return; - } + case ClassComponent: + // Capture and retry + var errorInfo = value; + var ctor = workInProgress.type; + var instance = workInProgress.stateNode; - break; + if ((workInProgress.effectTag & DidCapture) === NoEffect && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) { + workInProgress.effectTag |= ShouldCapture; + workInProgress.expirationTime = renderExpirationTime; // Schedule the error boundary to re-render using updated state - default: - break; - } + var _update2 = createClassErrorUpdate(workInProgress, errorInfo, renderExpirationTime); - workInProgress = workInProgress.return; - } while (workInProgress !== null); -} - -var ceil = Math.ceil; -var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; -var ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner; -var IsSomeRendererActing = ReactSharedInternals.IsSomeRendererActing; -var NoContext = -/* */ -0; -var BatchedContext = -/* */ -1; -var EventContext = -/* */ -2; -var DiscreteEventContext = -/* */ -4; -var LegacyUnbatchedContext = -/* */ -8; -var RenderContext = -/* */ -16; -var CommitContext = -/* */ -32; -var RootIncomplete = 0; -var RootFatalErrored = 1; -var RootErrored = 2; -var RootSuspended = 3; -var RootSuspendedWithDelay = 4; -var RootCompleted = 5; -// Describes where we are in the React execution stack -var executionContext = NoContext; // The root we're working on - -var workInProgressRoot = null; // The fiber we're working on - -var workInProgress = null; // The expiration time we're rendering - -var renderExpirationTime = NoWork; // Whether to root completed, errored, suspended, etc. - -var workInProgressRootExitStatus = RootIncomplete; // A fatal error, if one is thrown - -var workInProgressRootFatalError = null; // Most recent event time among processed updates during this render. -// This is conceptually a time stamp but expressed in terms of an ExpirationTime -// because we deal mostly with expiration times in the hot path, so this avoids -// the conversion happening in the hot path. - -var workInProgressRootLatestProcessedExpirationTime = Sync; -var workInProgressRootLatestSuspenseTimeout = Sync; -var workInProgressRootCanSuspendUsingConfig = null; // The work left over by components that were visited during this render. Only -// includes unprocessed updates, not work in bailed out children. - -var workInProgressRootNextUnprocessedUpdateTime = NoWork; // If we're pinged while rendering we don't always restart immediately. -// This flag determines if it might be worthwhile to restart if an opportunity -// happens latere. - -var workInProgressRootHasPendingPing = false; // The most recent time we committed a fallback. This lets us ensure a train -// model where we don't commit new loading states in too quick succession. - -var globalMostRecentFallbackTime = 0; -var FALLBACK_THROTTLE_MS = 500; -var nextEffect = null; -var hasUncaughtError = false; -var firstUncaughtError = null; -var legacyErrorBoundariesThatAlreadyFailed = null; -var rootDoesHavePassiveEffects = false; -var rootWithPendingPassiveEffects = null; -var pendingPassiveEffectsRenderPriority = NoPriority; -var pendingPassiveEffectsExpirationTime = NoWork; -var rootsWithPendingDiscreteUpdates = null; // Use these to prevent an infinite loop of nested updates - -var NESTED_UPDATE_LIMIT = 50; -var nestedUpdateCount = 0; -var rootWithNestedUpdates = null; -var NESTED_PASSIVE_UPDATE_LIMIT = 50; -var nestedPassiveUpdateCount = 0; -var interruptedBy = null; // Marks the need to reschedule pending interactions at these expiration times -// during the commit phase. This enables them to be traced across components -// that spawn new work during render. E.g. hidden boundaries, suspended SSR -// hydration or SuspenseList. - -var spawnedWorkDuringRender = null; // Expiration times are computed by adding to the current time (the start -// time). However, if two updates are scheduled within the same event, we -// should treat their start times as simultaneous, even if the actual clock -// time has advanced between the first and second call. -// In other words, because expiration times determine how updates are batched, -// we want all updates of like priority that occur within the same event to -// receive the same expiration time. Otherwise we get tearing. - -var currentEventTime = NoWork; -function requestCurrentTimeForUpdate() { - if ((executionContext & (RenderContext | CommitContext)) !== NoContext) { - // We're inside React, so it's fine to read the actual time. - return msToExpirationTime(now()); - } // We're not inside React, so we may be in the middle of a browser event. + enqueueCapturedUpdate(workInProgress, _update2); + return; + } + break; + } - if (currentEventTime !== NoWork) { - // Use the same start time for all updates until we enter React again. + workInProgress = workInProgress.return; + } while (workInProgress !== null); + } + + var ceil = Math.ceil; + var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher, + ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner, + IsSomeRendererActing = ReactSharedInternals.IsSomeRendererActing; + var NoContext = + /* */ + 0; + var BatchedContext = + /* */ + 1; + var EventContext = + /* */ + 2; + var DiscreteEventContext = + /* */ + 4; + var LegacyUnbatchedContext = + /* */ + 8; + var RenderContext = + /* */ + 16; + var CommitContext = + /* */ + 32; + var RootIncomplete = 0; + var RootFatalErrored = 1; + var RootErrored = 2; + var RootSuspended = 3; + var RootSuspendedWithDelay = 4; + var RootCompleted = 5; + // Describes where we are in the React execution stack + var executionContext = NoContext; // The root we're working on + + var workInProgressRoot = null; // The fiber we're working on + + var workInProgress = null; // The expiration time we're rendering + + var renderExpirationTime$1 = NoWork; // Whether to root completed, errored, suspended, etc. + + var workInProgressRootExitStatus = RootIncomplete; // A fatal error, if one is thrown + + var workInProgressRootFatalError = null; // Most recent event time among processed updates during this render. + // This is conceptually a time stamp but expressed in terms of an ExpirationTime + // because we deal mostly with expiration times in the hot path, so this avoids + // the conversion happening in the hot path. + + var workInProgressRootLatestProcessedExpirationTime = Sync; + var workInProgressRootLatestSuspenseTimeout = Sync; + var workInProgressRootCanSuspendUsingConfig = null; // The work left over by components that were visited during this render. Only + // includes unprocessed updates, not work in bailed out children. + + var workInProgressRootNextUnprocessedUpdateTime = NoWork; // If we're pinged while rendering we don't always restart immediately. + // This flag determines if it might be worthwhile to restart if an opportunity + // happens latere. + + var workInProgressRootHasPendingPing = false; // The most recent time we committed a fallback. This lets us ensure a train + // model where we don't commit new loading states in too quick succession. + + var globalMostRecentFallbackTime = 0; + var FALLBACK_THROTTLE_MS = 500; + var nextEffect = null; + var hasUncaughtError = false; + var firstUncaughtError = null; + var legacyErrorBoundariesThatAlreadyFailed = null; + var rootDoesHavePassiveEffects = false; + var rootWithPendingPassiveEffects = null; + var pendingPassiveEffectsRenderPriority = NoPriority; + var pendingPassiveEffectsExpirationTime = NoWork; + var rootsWithPendingDiscreteUpdates = null; // Use these to prevent an infinite loop of nested updates + + var NESTED_UPDATE_LIMIT = 50; + var nestedUpdateCount = 0; + var rootWithNestedUpdates = null; + var NESTED_PASSIVE_UPDATE_LIMIT = 50; + var nestedPassiveUpdateCount = 0; + var interruptedBy = null; // Marks the need to reschedule pending interactions at these expiration times + // during the commit phase. This enables them to be traced across components + // that spawn new work during render. E.g. hidden boundaries, suspended SSR + // hydration or SuspenseList. + + var spawnedWorkDuringRender = null; // Expiration times are computed by adding to the current time (the start + // time). However, if two updates are scheduled within the same event, we + // should treat their start times as simultaneous, even if the actual clock + // time has advanced between the first and second call. + // In other words, because expiration times determine how updates are batched, + // we want all updates of like priority that occur within the same event to + // receive the same expiration time. Otherwise we get tearing. + + var currentEventTime = NoWork; + function requestCurrentTimeForUpdate() { + if ((executionContext & (RenderContext | CommitContext)) !== NoContext) { + // We're inside React, so it's fine to read the actual time. + return msToExpirationTime(now()); + } // We're not inside React, so we may be in the middle of a browser event. + + + if (currentEventTime !== NoWork) { + // Use the same start time for all updates until we enter React again. + return currentEventTime; + } // This is the first update since React yielded. Compute a new start time. + + + currentEventTime = msToExpirationTime(now()); return currentEventTime; - } // This is the first update since React yielded. Compute a new start time. - - - currentEventTime = msToExpirationTime(now()); - return currentEventTime; -} -function getCurrentTime() { - return msToExpirationTime(now()); -} -function computeExpirationForFiber(currentTime, fiber, suspenseConfig) { - var mode = fiber.mode; - - if ((mode & BlockingMode) === NoMode) { - return Sync; } + function getCurrentTime() { + return msToExpirationTime(now()); + } + function computeExpirationForFiber(currentTime, fiber, suspenseConfig) { + var mode = fiber.mode; + + if ((mode & BlockingMode) === NoMode) { + return Sync; + } - var priorityLevel = getCurrentPriorityLevel(); + var priorityLevel = getCurrentPriorityLevel(); - if ((mode & ConcurrentMode) === NoMode) { - return priorityLevel === ImmediatePriority ? Sync : Batched; - } + if ((mode & ConcurrentMode) === NoMode) { + return priorityLevel === ImmediatePriority ? Sync : Batched; + } - if ((executionContext & RenderContext) !== NoContext) { - // Use whatever time we're already rendering - // TODO: Should there be a way to opt out, like with `runWithPriority`? - return renderExpirationTime; - } + if ((executionContext & RenderContext) !== NoContext) { + // Use whatever time we're already rendering + // TODO: Should there be a way to opt out, like with `runWithPriority`? + return renderExpirationTime$1; + } - var expirationTime; + var expirationTime; - if (suspenseConfig !== null) { - // Compute an expiration time based on the Suspense timeout. - expirationTime = computeSuspenseExpiration(currentTime, suspenseConfig.timeoutMs | 0 || LOW_PRIORITY_EXPIRATION); - } else { - // Compute an expiration time based on the Scheduler priority. - switch (priorityLevel) { - case ImmediatePriority: - expirationTime = Sync; - break; + if (suspenseConfig !== null) { + // Compute an expiration time based on the Suspense timeout. + expirationTime = computeSuspenseExpiration(currentTime, suspenseConfig.timeoutMs | 0 || LOW_PRIORITY_EXPIRATION); + } else { + // Compute an expiration time based on the Scheduler priority. + switch (priorityLevel) { + case ImmediatePriority: + expirationTime = Sync; + break; - case UserBlockingPriority$2: - // TODO: Rename this to computeUserBlockingExpiration - expirationTime = computeInteractiveExpiration(currentTime); - break; + case UserBlockingPriority$1: + // TODO: Rename this to computeUserBlockingExpiration + expirationTime = computeInteractiveExpiration(currentTime); + break; - case NormalPriority: - case LowPriority: - // TODO: Handle LowPriority - // TODO: Rename this to... something better. - expirationTime = computeAsyncExpiration(currentTime); - break; + case NormalPriority: + case LowPriority: + // TODO: Handle LowPriority + // TODO: Rename this to... something better. + expirationTime = computeAsyncExpiration(currentTime); + break; - case IdlePriority: - expirationTime = Idle; - break; + case IdlePriority: + expirationTime = Idle; + break; - default: - { + default: { - throw Error("Expected a valid priority level"); + { + throw Error( "Expected a valid priority level" ); + } } - } - } - } // If we're in the middle of rendering a tree, do not update at the same - // expiration time that is already rendering. - // TODO: We shouldn't have to do this if the update is on a different root. - // Refactor computeExpirationForFiber + scheduleUpdate so we have access to - // the root when we check for this condition. + } + } // If we're in the middle of rendering a tree, do not update at the same + // expiration time that is already rendering. + // TODO: We shouldn't have to do this if the update is on a different root. + // Refactor computeExpirationForFiber + scheduleUpdate so we have access to + // the root when we check for this condition. - if (workInProgressRoot !== null && expirationTime === renderExpirationTime) { - // This is a trick to move this update into a separate batch - expirationTime -= 1; + if (workInProgressRoot !== null && expirationTime === renderExpirationTime$1) { + // This is a trick to move this update into a separate batch + expirationTime -= 1; + } + + return expirationTime; } + function scheduleUpdateOnFiber(fiber, expirationTime) { + checkForNestedUpdates(); + warnAboutRenderPhaseUpdatesInDEV(fiber); + var root = markUpdateTimeFromFiberToRoot(fiber, expirationTime); - return expirationTime; -} -function scheduleUpdateOnFiber(fiber, expirationTime) { - checkForNestedUpdates(); - warnAboutInvalidUpdatesOnClassComponentsInDEV(fiber); - var root = markUpdateTimeFromFiberToRoot(fiber, expirationTime); + if (root === null) { + warnAboutUpdateOnUnmountedFiberInDEV(fiber); + return; + } - if (root === null) { - warnAboutUpdateOnUnmountedFiberInDEV(fiber); - return; - } + checkForInterruption(fiber, expirationTime); + recordScheduleUpdate(); // TODO: computeExpirationForFiber also reads the priority. Pass the + // priority as an argument to that function and this one. - checkForInterruption(fiber, expirationTime); - recordScheduleUpdate(); // TODO: computeExpirationForFiber also reads the priority. Pass the - // priority as an argument to that function and this one. + var priorityLevel = getCurrentPriorityLevel(); - var priorityLevel = getCurrentPriorityLevel(); + if (expirationTime === Sync) { + if ( // Check if we're inside unbatchedUpdates + (executionContext & LegacyUnbatchedContext) !== NoContext && // Check if we're not already rendering + (executionContext & (RenderContext | CommitContext)) === NoContext) { + // Register pending interactions on the root to avoid losing traced interaction data. + schedulePendingInteractions(root, expirationTime); // This is a legacy edge case. The initial mount of a ReactDOM.render-ed + // root inside of batchedUpdates should be synchronous, but layout updates + // should be deferred until the end of the batch. - if (expirationTime === Sync) { - if ( // Check if we're inside unbatchedUpdates - (executionContext & LegacyUnbatchedContext) !== NoContext && // Check if we're not already rendering - (executionContext & (RenderContext | CommitContext)) === NoContext) { - // Register pending interactions on the root to avoid losing traced interaction data. - schedulePendingInteractions(root, expirationTime); // This is a legacy edge case. The initial mount of a ReactDOM.render-ed - // root inside of batchedUpdates should be synchronous, but layout updates - // should be deferred until the end of the batch. + performSyncWorkOnRoot(root); + } else { + ensureRootIsScheduled(root); + schedulePendingInteractions(root, expirationTime); - performSyncWorkOnRoot(root); + if (executionContext === NoContext) { + // Flush the synchronous work now, unless we're already working or inside + // a batch. This is intentionally inside scheduleUpdateOnFiber instead of + // scheduleCallbackForFiber to preserve the ability to schedule a callback + // without immediately flushing it. We only do this for user-initiated + // updates, to preserve historical behavior of legacy mode. + flushSyncCallbackQueue(); + } + } } else { ensureRootIsScheduled(root); schedulePendingInteractions(root, expirationTime); - - if (executionContext === NoContext) { - // Flush the synchronous work now, unless we're already working or inside - // a batch. This is intentionally inside scheduleUpdateOnFiber instead of - // scheduleCallbackForFiber to preserve the ability to schedule a callback - // without immediately flushing it. We only do this for user-initiated - // updates, to preserve historical behavior of legacy mode. - flushSyncCallbackQueue(); - } } - } else { - ensureRootIsScheduled(root); - schedulePendingInteractions(root, expirationTime); - } - if ((executionContext & DiscreteEventContext) !== NoContext && ( // Only updates at user-blocking priority or greater are considered - // discrete, even inside a discrete event. - priorityLevel === UserBlockingPriority$2 || priorityLevel === ImmediatePriority)) { - // This is the result of a discrete event. Track the lowest priority - // discrete update per root so we can flush them early, if needed. - if (rootsWithPendingDiscreteUpdates === null) { - rootsWithPendingDiscreteUpdates = new Map([[root, expirationTime]]); - } else { - var lastDiscreteTime = rootsWithPendingDiscreteUpdates.get(root); + if ((executionContext & DiscreteEventContext) !== NoContext && ( // Only updates at user-blocking priority or greater are considered + // discrete, even inside a discrete event. + priorityLevel === UserBlockingPriority$1 || priorityLevel === ImmediatePriority)) { + // This is the result of a discrete event. Track the lowest priority + // discrete update per root so we can flush them early, if needed. + if (rootsWithPendingDiscreteUpdates === null) { + rootsWithPendingDiscreteUpdates = new Map([[root, expirationTime]]); + } else { + var lastDiscreteTime = rootsWithPendingDiscreteUpdates.get(root); - if (lastDiscreteTime === undefined || lastDiscreteTime > expirationTime) { - rootsWithPendingDiscreteUpdates.set(root, expirationTime); + if (lastDiscreteTime === undefined || lastDiscreteTime > expirationTime) { + rootsWithPendingDiscreteUpdates.set(root, expirationTime); + } } } } -} -var scheduleWork = scheduleUpdateOnFiber; // This is split into a separate function so we can mark a fiber with pending -// work without treating it as a typical update that originates from an event; -// e.g. retrying a Suspense boundary isn't an update, but it does schedule work -// on a fiber. + var scheduleWork = scheduleUpdateOnFiber; // This is split into a separate function so we can mark a fiber with pending + // work without treating it as a typical update that originates from an event; + // e.g. retrying a Suspense boundary isn't an update, but it does schedule work + // on a fiber. -function markUpdateTimeFromFiberToRoot(fiber, expirationTime) { - // Update the source fiber's expiration time - if (fiber.expirationTime < expirationTime) { - fiber.expirationTime = expirationTime; - } + function markUpdateTimeFromFiberToRoot(fiber, expirationTime) { + // Update the source fiber's expiration time + if (fiber.expirationTime < expirationTime) { + fiber.expirationTime = expirationTime; + } - var alternate = fiber.alternate; + var alternate = fiber.alternate; - if (alternate !== null && alternate.expirationTime < expirationTime) { - alternate.expirationTime = expirationTime; - } // Walk the parent path to the root and update the child expiration time. + if (alternate !== null && alternate.expirationTime < expirationTime) { + alternate.expirationTime = expirationTime; + } // Walk the parent path to the root and update the child expiration time. - var node = fiber.return; - var root = null; + var node = fiber.return; + var root = null; - if (node === null && fiber.tag === HostRoot) { - root = fiber.stateNode; - } else { - while (node !== null) { - alternate = node.alternate; + if (node === null && fiber.tag === HostRoot) { + root = fiber.stateNode; + } else { + while (node !== null) { + alternate = node.alternate; - if (node.childExpirationTime < expirationTime) { - node.childExpirationTime = expirationTime; + if (node.childExpirationTime < expirationTime) { + node.childExpirationTime = expirationTime; - if (alternate !== null && alternate.childExpirationTime < expirationTime) { + if (alternate !== null && alternate.childExpirationTime < expirationTime) { + alternate.childExpirationTime = expirationTime; + } + } else if (alternate !== null && alternate.childExpirationTime < expirationTime) { alternate.childExpirationTime = expirationTime; } - } else if (alternate !== null && alternate.childExpirationTime < expirationTime) { - alternate.childExpirationTime = expirationTime; - } - if (node.return === null && node.tag === HostRoot) { - root = node.stateNode; - break; - } + if (node.return === null && node.tag === HostRoot) { + root = node.stateNode; + break; + } - node = node.return; + node = node.return; + } } - } - if (root !== null) { - if (workInProgressRoot === root) { - // Received an update to a tree that's in the middle of rendering. Mark - // that's unprocessed work on this root. - markUnprocessedUpdateTime(expirationTime); + if (root !== null) { + if (workInProgressRoot === root) { + // Received an update to a tree that's in the middle of rendering. Mark + // that's unprocessed work on this root. + markUnprocessedUpdateTime(expirationTime); - if (workInProgressRootExitStatus === RootSuspendedWithDelay) { - // The root already suspended with a delay, which means this render - // definitely won't finish. Since we have a new update, let's mark it as - // suspended now, right before marking the incoming update. This has the - // effect of interrupting the current render and switching to the update. - // TODO: This happens to work when receiving an update during the render - // phase, because of the trick inside computeExpirationForFiber to - // subtract 1 from `renderExpirationTime` to move it into a - // separate bucket. But we should probably model it with an exception, - // using the same mechanism we use to force hydration of a subtree. - // TODO: This does not account for low pri updates that were already - // scheduled before the root started rendering. Need to track the next - // pending expiration time (perhaps by backtracking the return path) and - // then trigger a restart in the `renderDidSuspendDelayIfPossible` path. - markRootSuspendedAtTime(root, renderExpirationTime); - } - } // Mark that the root has a pending update. + if (workInProgressRootExitStatus === RootSuspendedWithDelay) { + // The root already suspended with a delay, which means this render + // definitely won't finish. Since we have a new update, let's mark it as + // suspended now, right before marking the incoming update. This has the + // effect of interrupting the current render and switching to the update. + // TODO: This happens to work when receiving an update during the render + // phase, because of the trick inside computeExpirationForFiber to + // subtract 1 from `renderExpirationTime` to move it into a + // separate bucket. But we should probably model it with an exception, + // using the same mechanism we use to force hydration of a subtree. + // TODO: This does not account for low pri updates that were already + // scheduled before the root started rendering. Need to track the next + // pending expiration time (perhaps by backtracking the return path) and + // then trigger a restart in the `renderDidSuspendDelayIfPossible` path. + markRootSuspendedAtTime(root, renderExpirationTime$1); + } + } // Mark that the root has a pending update. - markRootUpdatedAtTime(root, expirationTime); - } + markRootUpdatedAtTime(root, expirationTime); + } - return root; -} + return root; + } -function getNextRootExpirationTimeToWorkOn(root) { - // Determines the next expiration time that the root should render, taking - // into account levels that may be suspended, or levels that may have - // received a ping. - var lastExpiredTime = root.lastExpiredTime; + function getNextRootExpirationTimeToWorkOn(root) { + // Determines the next expiration time that the root should render, taking + // into account levels that may be suspended, or levels that may have + // received a ping. + var lastExpiredTime = root.lastExpiredTime; - if (lastExpiredTime !== NoWork) { - return lastExpiredTime; - } // "Pending" refers to any update that hasn't committed yet, including if it - // suspended. The "suspended" range is therefore a subset. + if (lastExpiredTime !== NoWork) { + return lastExpiredTime; + } // "Pending" refers to any update that hasn't committed yet, including if it + // suspended. The "suspended" range is therefore a subset. - var firstPendingTime = root.firstPendingTime; + var firstPendingTime = root.firstPendingTime; - if (!isRootSuspendedAtTime(root, firstPendingTime)) { - // The highest priority pending time is not suspended. Let's work on that. - return firstPendingTime; - } // If the first pending time is suspended, check if there's a lower priority - // pending level that we know about. Or check if we received a ping. Work - // on whichever is higher priority. + if (!isRootSuspendedAtTime(root, firstPendingTime)) { + // The highest priority pending time is not suspended. Let's work on that. + return firstPendingTime; + } // If the first pending time is suspended, check if there's a lower priority + // pending level that we know about. Or check if we received a ping. Work + // on whichever is higher priority. - var lastPingedTime = root.lastPingedTime; - var nextKnownPendingLevel = root.nextKnownPendingLevel; - return lastPingedTime > nextKnownPendingLevel ? lastPingedTime : nextKnownPendingLevel; -} // Use this function to schedule a task for a root. There's only one task per -// root; if a task was already scheduled, we'll check to make sure the -// expiration time of the existing task is the same as the expiration time of -// the next level that the root has work on. This function is called on every -// update, and right before exiting a task. + var lastPingedTime = root.lastPingedTime; + var nextKnownPendingLevel = root.nextKnownPendingLevel; + var nextLevel = lastPingedTime > nextKnownPendingLevel ? lastPingedTime : nextKnownPendingLevel; + if ( nextLevel <= Idle && firstPendingTime !== nextLevel) { + // Don't work on Idle/Never priority unless everything else is committed. + return NoWork; + } -function ensureRootIsScheduled(root) { - var lastExpiredTime = root.lastExpiredTime; + return nextLevel; + } // Use this function to schedule a task for a root. There's only one task per + // root; if a task was already scheduled, we'll check to make sure the + // expiration time of the existing task is the same as the expiration time of + // the next level that the root has work on. This function is called on every + // update, and right before exiting a task. - if (lastExpiredTime !== NoWork) { - // Special case: Expired work should flush synchronously. - root.callbackExpirationTime = Sync; - root.callbackPriority = ImmediatePriority; - root.callbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root)); - return; - } - var expirationTime = getNextRootExpirationTimeToWorkOn(root); - var existingCallbackNode = root.callbackNode; + function ensureRootIsScheduled(root) { + var lastExpiredTime = root.lastExpiredTime; - if (expirationTime === NoWork) { - // There's nothing to work on. - if (existingCallbackNode !== null) { - root.callbackNode = null; - root.callbackExpirationTime = NoWork; - root.callbackPriority = NoPriority; + if (lastExpiredTime !== NoWork) { + // Special case: Expired work should flush synchronously. + root.callbackExpirationTime = Sync; + root.callbackPriority = ImmediatePriority; + root.callbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root)); + return; } - return; - } // TODO: If this is an update, we already read the current time. Pass the - // time as an argument. - - - var currentTime = requestCurrentTimeForUpdate(); - var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime); // If there's an existing render task, confirm it has the correct priority and - // expiration time. Otherwise, we'll cancel it and schedule a new one. + var expirationTime = getNextRootExpirationTimeToWorkOn(root); + var existingCallbackNode = root.callbackNode; - if (existingCallbackNode !== null) { - var existingCallbackPriority = root.callbackPriority; - var existingCallbackExpirationTime = root.callbackExpirationTime; + if (expirationTime === NoWork) { + // There's nothing to work on. + if (existingCallbackNode !== null) { + root.callbackNode = null; + root.callbackExpirationTime = NoWork; + root.callbackPriority = NoPriority; + } - if ( // Callback must have the exact same expiration time. - existingCallbackExpirationTime === expirationTime && // Callback must have greater or equal priority. - existingCallbackPriority >= priorityLevel) { - // Existing callback is sufficient. return; - } // Need to schedule a new task. - // TODO: Instead of scheduling a new task, we should be able to change the - // priority of the existing one. - + } // TODO: If this is an update, we already read the current time. Pass the + // time as an argument. - cancelCallback(existingCallbackNode); - } - root.callbackExpirationTime = expirationTime; - root.callbackPriority = priorityLevel; - var callbackNode; + var currentTime = requestCurrentTimeForUpdate(); + var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime); // If there's an existing render task, confirm it has the correct priority and + // expiration time. Otherwise, we'll cancel it and schedule a new one. - if (expirationTime === Sync) { - // Sync React callbacks are scheduled on a special internal queue - callbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root)); - } else if (disableSchedulerTimeoutBasedOnReactExpirationTime) { - callbackNode = scheduleCallback(priorityLevel, performConcurrentWorkOnRoot.bind(null, root)); - } else { - callbackNode = scheduleCallback(priorityLevel, performConcurrentWorkOnRoot.bind(null, root), // Compute a task timeout based on the expiration time. This also affects - // ordering because tasks are processed in timeout order. - { - timeout: expirationTimeToMs(expirationTime) - now() - }); - } + if (existingCallbackNode !== null) { + var existingCallbackPriority = root.callbackPriority; + var existingCallbackExpirationTime = root.callbackExpirationTime; - root.callbackNode = callbackNode; -} // This is the entry point for every concurrent task, i.e. anything that -// goes through Scheduler. + if ( // Callback must have the exact same expiration time. + existingCallbackExpirationTime === expirationTime && // Callback must have greater or equal priority. + existingCallbackPriority >= priorityLevel) { + // Existing callback is sufficient. + return; + } // Need to schedule a new task. + // TODO: Instead of scheduling a new task, we should be able to change the + // priority of the existing one. -function performConcurrentWorkOnRoot(root, didTimeout) { - // Since we know we're in a React event, we can clear the current - // event time. The next update will compute a new event time. - currentEventTime = NoWork; + cancelCallback(existingCallbackNode); + } - if (didTimeout) { - // The render task took too long to complete. Mark the current time as - // expired to synchronously render all expired work in a single batch. - var currentTime = requestCurrentTimeForUpdate(); - markRootExpiredAtTime(root, currentTime); // This will schedule a synchronous callback. + root.callbackExpirationTime = expirationTime; + root.callbackPriority = priorityLevel; + var callbackNode; - ensureRootIsScheduled(root); - return null; - } // Determine the next expiration time to work on, using the fields stored - // on the root. + if (expirationTime === Sync) { + // Sync React callbacks are scheduled on a special internal queue + callbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root)); + } else { + callbackNode = scheduleCallback(priorityLevel, performConcurrentWorkOnRoot.bind(null, root), // Compute a task timeout based on the expiration time. This also affects + // ordering because tasks are processed in timeout order. + { + timeout: expirationTimeToMs(expirationTime) - now() + }); + } + root.callbackNode = callbackNode; + } // This is the entry point for every concurrent task, i.e. anything that + // goes through Scheduler. - var expirationTime = getNextRootExpirationTimeToWorkOn(root); - if (expirationTime !== NoWork) { - var originalCallbackNode = root.callbackNode; + function performConcurrentWorkOnRoot(root, didTimeout) { + // Since we know we're in a React event, we can clear the current + // event time. The next update will compute a new event time. + currentEventTime = NoWork; - if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) { - { - throw Error("Should not already be working."); - } - } + if (didTimeout) { + // The render task took too long to complete. Mark the current time as + // expired to synchronously render all expired work in a single batch. + var currentTime = requestCurrentTimeForUpdate(); + markRootExpiredAtTime(root, currentTime); // This will schedule a synchronous callback. - flushPassiveEffects(); // If the root or expiration time have changed, throw out the existing stack - // and prepare a fresh one. Otherwise we'll continue where we left off. + ensureRootIsScheduled(root); + return null; + } // Determine the next expiration time to work on, using the fields stored + // on the root. - if (root !== workInProgressRoot || expirationTime !== renderExpirationTime) { - prepareFreshStack(root, expirationTime); - startWorkOnPendingInteractions(root, expirationTime); - } // If we have a work-in-progress fiber, it means there's still work to do - // in this root. + var expirationTime = getNextRootExpirationTimeToWorkOn(root); - if (workInProgress !== null) { - var prevExecutionContext = executionContext; - executionContext |= RenderContext; - var prevDispatcher = pushDispatcher(root); - var prevInteractions = pushInteractions(root); - startWorkLoopTimer(workInProgress); + if (expirationTime !== NoWork) { + var originalCallbackNode = root.callbackNode; - do { - try { - workLoopConcurrent(); - break; - } catch (thrownValue) { - handleError(root, thrownValue); + if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) { + { + throw Error( "Should not already be working." ); } - } while (true); - - resetContextDependencies(); - executionContext = prevExecutionContext; - popDispatcher(prevDispatcher); - - if (enableSchedulerTracing) { - popInteractions(prevInteractions); } - if (workInProgressRootExitStatus === RootFatalErrored) { - var fatalError = workInProgressRootFatalError; - stopInterruptedWorkLoopTimer(); + flushPassiveEffects(); // If the root or expiration time have changed, throw out the existing stack + // and prepare a fresh one. Otherwise we'll continue where we left off. + + if (root !== workInProgressRoot || expirationTime !== renderExpirationTime$1) { prepareFreshStack(root, expirationTime); - markRootSuspendedAtTime(root, expirationTime); - ensureRootIsScheduled(root); - throw fatalError; - } + startWorkOnPendingInteractions(root, expirationTime); + } // If we have a work-in-progress fiber, it means there's still work to do + // in this root. + + + if (workInProgress !== null) { + var prevExecutionContext = executionContext; + executionContext |= RenderContext; + var prevDispatcher = pushDispatcher(); + var prevInteractions = pushInteractions(root); + startWorkLoopTimer(workInProgress); + + do { + try { + workLoopConcurrent(); + break; + } catch (thrownValue) { + handleError(root, thrownValue); + } + } while (true); - if (workInProgress !== null) { - // There's still work left over. Exit without committing. - stopInterruptedWorkLoopTimer(); - } else { - // We now have a consistent tree. The next step is either to commit it, - // or, if something suspended, wait to commit it after a timeout. - stopFinishedWorkLoopTimer(); - var finishedWork = root.finishedWork = root.current.alternate; - root.finishedExpirationTime = expirationTime; - finishConcurrentRender(root, finishedWork, workInProgressRootExitStatus, expirationTime); - } + resetContextDependencies(); + executionContext = prevExecutionContext; + popDispatcher(prevDispatcher); - ensureRootIsScheduled(root); + { + popInteractions(prevInteractions); + } + + if (workInProgressRootExitStatus === RootFatalErrored) { + var fatalError = workInProgressRootFatalError; + stopInterruptedWorkLoopTimer(); + prepareFreshStack(root, expirationTime); + markRootSuspendedAtTime(root, expirationTime); + ensureRootIsScheduled(root); + throw fatalError; + } + + if (workInProgress !== null) { + // There's still work left over. Exit without committing. + stopInterruptedWorkLoopTimer(); + } else { + // We now have a consistent tree. The next step is either to commit it, + // or, if something suspended, wait to commit it after a timeout. + stopFinishedWorkLoopTimer(); + var finishedWork = root.finishedWork = root.current.alternate; + root.finishedExpirationTime = expirationTime; + finishConcurrentRender(root, finishedWork, workInProgressRootExitStatus, expirationTime); + } + + ensureRootIsScheduled(root); - if (root.callbackNode === originalCallbackNode) { - // The task node scheduled for this root is the same one that's - // currently executed. Need to return a continuation. - return performConcurrentWorkOnRoot.bind(null, root); + if (root.callbackNode === originalCallbackNode) { + // The task node scheduled for this root is the same one that's + // currently executed. Need to return a continuation. + return performConcurrentWorkOnRoot.bind(null, root); + } } } - } - return null; -} + return null; + } -function finishConcurrentRender(root, finishedWork, exitStatus, expirationTime) { - // Set this to null to indicate there's no in-progress render. - workInProgressRoot = null; + function finishConcurrentRender(root, finishedWork, exitStatus, expirationTime) { + // Set this to null to indicate there's no in-progress render. + workInProgressRoot = null; - switch (exitStatus) { - case RootIncomplete: - case RootFatalErrored: - { + switch (exitStatus) { + case RootIncomplete: + case RootFatalErrored: { { - throw Error("Root did not complete. This is a bug in React."); + { + throw Error( "Root did not complete. This is a bug in React." ); + } } } - } - // Flow knows about invariant, so it complains if I add a break - // statement, but eslint doesn't know about invariant, so it complains - // if I do. eslint-disable-next-line no-fallthrough + // Flow knows about invariant, so it complains if I add a break + // statement, but eslint doesn't know about invariant, so it complains + // if I do. eslint-disable-next-line no-fallthrough - case RootErrored: - { - // If this was an async render, the error may have happened due to - // a mutation in a concurrent event. Try rendering one more time, - // synchronously, to see if the error goes away. If there are - // lower priority updates, let's include those, too, in case they - // fix the inconsistency. Render at Idle to include all updates. - // If it was Idle or Never or some not-yet-invented time, render - // at that time. - markRootExpiredAtTime(root, expirationTime > Idle ? Idle : expirationTime); // We assume that this second render pass will be synchronous - // and therefore not hit this path again. + case RootErrored: + { + // If this was an async render, the error may have happened due to + // a mutation in a concurrent event. Try rendering one more time, + // synchronously, to see if the error goes away. If there are + // lower priority updates, let's include those, too, in case they + // fix the inconsistency. Render at Idle to include all updates. + // If it was Idle or Never or some not-yet-invented time, render + // at that time. + markRootExpiredAtTime(root, expirationTime > Idle ? Idle : expirationTime); // We assume that this second render pass will be synchronous + // and therefore not hit this path again. - break; - } + break; + } - case RootSuspended: - { - markRootSuspendedAtTime(root, expirationTime); - var lastSuspendedTime = root.lastSuspendedTime; + case RootSuspended: + { + markRootSuspendedAtTime(root, expirationTime); + var lastSuspendedTime = root.lastSuspendedTime; + + if (expirationTime === lastSuspendedTime) { + root.nextKnownPendingLevel = getRemainingExpirationTime(finishedWork); + } // We have an acceptable loading state. We need to figure out if we + // should immediately commit it or wait a bit. + // If we have processed new updates during this render, we may now + // have a new loading state ready. We want to ensure that we commit + // that as soon as possible. + + + var hasNotProcessedNewUpdates = workInProgressRootLatestProcessedExpirationTime === Sync; + + if (hasNotProcessedNewUpdates && // do not delay if we're inside an act() scope + !( IsThisRendererActing.current)) { + // If we have not processed any new updates during this pass, then + // this is either a retry of an existing fallback state or a + // hidden tree. Hidden trees shouldn't be batched with other work + // and after that's fixed it can only be a retry. We're going to + // throttle committing retries so that we don't show too many + // loading states too quickly. + var msUntilTimeout = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now(); // Don't bother with a very short suspense time. + + if (msUntilTimeout > 10) { + if (workInProgressRootHasPendingPing) { + var lastPingedTime = root.lastPingedTime; + + if (lastPingedTime === NoWork || lastPingedTime >= expirationTime) { + // This render was pinged but we didn't get to restart + // earlier so try restarting now instead. + root.lastPingedTime = expirationTime; + prepareFreshStack(root, expirationTime); + break; + } + } - if (expirationTime === lastSuspendedTime) { - root.nextKnownPendingLevel = getRemainingExpirationTime(finishedWork); - } + var nextTime = getNextRootExpirationTimeToWorkOn(root); + + if (nextTime !== NoWork && nextTime !== expirationTime) { + // There's additional work on this root. + break; + } + + if (lastSuspendedTime !== NoWork && lastSuspendedTime !== expirationTime) { + // We should prefer to render the fallback of at the last + // suspended level. Ping the last suspended level to try + // rendering it again. + root.lastPingedTime = lastSuspendedTime; + break; + } // The render is suspended, it hasn't timed out, and there's no + // lower priority work to do. Instead of committing the fallback + // immediately, wait for more data to arrive. + + + root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), msUntilTimeout); + break; + } + } // The work expired. Commit immediately. - flushSuspensePriorityWarningInDEV(); // We have an acceptable loading state. We need to figure out if we - // should immediately commit it or wait a bit. - // If we have processed new updates during this render, we may now - // have a new loading state ready. We want to ensure that we commit - // that as soon as possible. - var hasNotProcessedNewUpdates = workInProgressRootLatestProcessedExpirationTime === Sync; + commitRoot(root); + break; + } + + case RootSuspendedWithDelay: + { + markRootSuspendedAtTime(root, expirationTime); + var _lastSuspendedTime = root.lastSuspendedTime; - if (hasNotProcessedNewUpdates && // do not delay if we're inside an act() scope - !(true && flushSuspenseFallbacksInTests && IsThisRendererActing.current)) { - // If we have not processed any new updates during this pass, then - // this is either a retry of an existing fallback state or a - // hidden tree. Hidden trees shouldn't be batched with other work - // and after that's fixed it can only be a retry. We're going to - // throttle committing retries so that we don't show too many - // loading states too quickly. - var msUntilTimeout = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now(); // Don't bother with a very short suspense time. + if (expirationTime === _lastSuspendedTime) { + root.nextKnownPendingLevel = getRemainingExpirationTime(finishedWork); + } - if (msUntilTimeout > 10) { + if ( // do not delay if we're inside an act() scope + !( IsThisRendererActing.current)) { + // We're suspended in a state that should be avoided. We'll try to + // avoid committing it for as long as the timeouts let us. if (workInProgressRootHasPendingPing) { - var lastPingedTime = root.lastPingedTime; + var _lastPingedTime = root.lastPingedTime; - if (lastPingedTime === NoWork || lastPingedTime >= expirationTime) { - // This render was pinged but we didn't get to restart - // earlier so try restarting now instead. + if (_lastPingedTime === NoWork || _lastPingedTime >= expirationTime) { + // This render was pinged but we didn't get to restart earlier + // so try restarting now instead. root.lastPingedTime = expirationTime; prepareFreshStack(root, expirationTime); break; } } - var nextTime = getNextRootExpirationTimeToWorkOn(root); + var _nextTime = getNextRootExpirationTimeToWorkOn(root); - if (nextTime !== NoWork && nextTime !== expirationTime) { + if (_nextTime !== NoWork && _nextTime !== expirationTime) { // There's additional work on this root. break; } - if (lastSuspendedTime !== NoWork && lastSuspendedTime !== expirationTime) { + if (_lastSuspendedTime !== NoWork && _lastSuspendedTime !== expirationTime) { // We should prefer to render the fallback of at the last // suspended level. Ping the last suspended level to try // rendering it again. - root.lastPingedTime = lastSuspendedTime; + root.lastPingedTime = _lastSuspendedTime; break; - } // The render is suspended, it hasn't timed out, and there's no - // lower priority work to do. Instead of committing the fallback - // immediately, wait for more data to arrive. - - - root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), msUntilTimeout); - break; - } - } // The work expired. Commit immediately. - - - commitRoot(root); - break; - } + } - case RootSuspendedWithDelay: - { - markRootSuspendedAtTime(root, expirationTime); - var _lastSuspendedTime = root.lastSuspendedTime; + var _msUntilTimeout; + + if (workInProgressRootLatestSuspenseTimeout !== Sync) { + // We have processed a suspense config whose expiration time we + // can use as the timeout. + _msUntilTimeout = expirationTimeToMs(workInProgressRootLatestSuspenseTimeout) - now(); + } else if (workInProgressRootLatestProcessedExpirationTime === Sync) { + // This should never normally happen because only new updates + // cause delayed states, so we should have processed something. + // However, this could also happen in an offscreen tree. + _msUntilTimeout = 0; + } else { + // If we don't have a suspense config, we're going to use a + // heuristic to determine how long we can suspend. + var eventTimeMs = inferTimeFromExpirationTime(workInProgressRootLatestProcessedExpirationTime); + var currentTimeMs = now(); + var timeUntilExpirationMs = expirationTimeToMs(expirationTime) - currentTimeMs; + var timeElapsed = currentTimeMs - eventTimeMs; + + if (timeElapsed < 0) { + // We get this wrong some time since we estimate the time. + timeElapsed = 0; + } - if (expirationTime === _lastSuspendedTime) { - root.nextKnownPendingLevel = getRemainingExpirationTime(finishedWork); - } + _msUntilTimeout = jnd(timeElapsed) - timeElapsed; // Clamp the timeout to the expiration time. TODO: Once the + // event time is exact instead of inferred from expiration time + // we don't need this. - flushSuspensePriorityWarningInDEV(); + if (timeUntilExpirationMs < _msUntilTimeout) { + _msUntilTimeout = timeUntilExpirationMs; + } + } // Don't bother with a very short suspense time. - if ( // do not delay if we're inside an act() scope - !(true && flushSuspenseFallbacksInTests && IsThisRendererActing.current)) { - // We're suspended in a state that should be avoided. We'll try to - // avoid committing it for as long as the timeouts let us. - if (workInProgressRootHasPendingPing) { - var _lastPingedTime = root.lastPingedTime; - if (_lastPingedTime === NoWork || _lastPingedTime >= expirationTime) { - // This render was pinged but we didn't get to restart earlier - // so try restarting now instead. - root.lastPingedTime = expirationTime; - prepareFreshStack(root, expirationTime); + if (_msUntilTimeout > 10) { + // The render is suspended, it hasn't timed out, and there's no + // lower priority work to do. Instead of committing the fallback + // immediately, wait for more data to arrive. + root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout); break; } - } - - var _nextTime = getNextRootExpirationTimeToWorkOn(root); + } // The work expired. Commit immediately. - if (_nextTime !== NoWork && _nextTime !== expirationTime) { - // There's additional work on this root. - break; - } - - if (_lastSuspendedTime !== NoWork && _lastSuspendedTime !== expirationTime) { - // We should prefer to render the fallback of at the last - // suspended level. Ping the last suspended level to try - // rendering it again. - root.lastPingedTime = _lastSuspendedTime; - break; - } - - var _msUntilTimeout; - - if (workInProgressRootLatestSuspenseTimeout !== Sync) { - // We have processed a suspense config whose expiration time we - // can use as the timeout. - _msUntilTimeout = expirationTimeToMs(workInProgressRootLatestSuspenseTimeout) - now(); - } else if (workInProgressRootLatestProcessedExpirationTime === Sync) { - // This should never normally happen because only new updates - // cause delayed states, so we should have processed something. - // However, this could also happen in an offscreen tree. - _msUntilTimeout = 0; - } else { - // If we don't have a suspense config, we're going to use a - // heuristic to determine how long we can suspend. - var eventTimeMs = inferTimeFromExpirationTime(workInProgressRootLatestProcessedExpirationTime); - var currentTimeMs = now(); - var timeUntilExpirationMs = expirationTimeToMs(expirationTime) - currentTimeMs; - var timeElapsed = currentTimeMs - eventTimeMs; - - if (timeElapsed < 0) { - // We get this wrong some time since we estimate the time. - timeElapsed = 0; - } - _msUntilTimeout = jnd(timeElapsed) - timeElapsed; // Clamp the timeout to the expiration time. TODO: Once the - // event time is exact instead of inferred from expiration time - // we don't need this. + commitRoot(root); + break; + } - if (timeUntilExpirationMs < _msUntilTimeout) { - _msUntilTimeout = timeUntilExpirationMs; + case RootCompleted: + { + // The work completed. Ready to commit. + if ( // do not delay if we're inside an act() scope + !( IsThisRendererActing.current) && workInProgressRootLatestProcessedExpirationTime !== Sync && workInProgressRootCanSuspendUsingConfig !== null) { + // If we have exceeded the minimum loading delay, which probably + // means we have shown a spinner already, we might have to suspend + // a bit longer to ensure that the spinner is shown for + // enough time. + var _msUntilTimeout2 = computeMsUntilSuspenseLoadingDelay(workInProgressRootLatestProcessedExpirationTime, expirationTime, workInProgressRootCanSuspendUsingConfig); + + if (_msUntilTimeout2 > 10) { + markRootSuspendedAtTime(root, expirationTime); + root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout2); + break; } - } // Don't bother with a very short suspense time. - - - if (_msUntilTimeout > 10) { - // The render is suspended, it hasn't timed out, and there's no - // lower priority work to do. Instead of committing the fallback - // immediately, wait for more data to arrive. - root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout); - break; } - } // The work expired. Commit immediately. - - commitRoot(root); - break; - } - - case RootCompleted: - { - // The work completed. Ready to commit. - if ( // do not delay if we're inside an act() scope - !(true && flushSuspenseFallbacksInTests && IsThisRendererActing.current) && workInProgressRootLatestProcessedExpirationTime !== Sync && workInProgressRootCanSuspendUsingConfig !== null) { - // If we have exceeded the minimum loading delay, which probably - // means we have shown a spinner already, we might have to suspend - // a bit longer to ensure that the spinner is shown for - // enough time. - var _msUntilTimeout2 = computeMsUntilSuspenseLoadingDelay(workInProgressRootLatestProcessedExpirationTime, expirationTime, workInProgressRootCanSuspendUsingConfig); - - if (_msUntilTimeout2 > 10) { - markRootSuspendedAtTime(root, expirationTime); - root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout2); - break; - } + commitRoot(root); + break; } - commitRoot(root); - break; - } - - default: - { + default: { { - throw Error("Unknown root exit status."); + { + throw Error( "Unknown root exit status." ); + } } } - } - } -} // This is the entry point for synchronous tasks that don't go -// through Scheduler + } + } // This is the entry point for synchronous tasks that don't go + // through Scheduler -function performSyncWorkOnRoot(root) { - // Check if there's expired work on this root. Otherwise, render at Sync. - var lastExpiredTime = root.lastExpiredTime; - var expirationTime = lastExpiredTime !== NoWork ? lastExpiredTime : Sync; + function performSyncWorkOnRoot(root) { + // Check if there's expired work on this root. Otherwise, render at Sync. + var lastExpiredTime = root.lastExpiredTime; + var expirationTime = lastExpiredTime !== NoWork ? lastExpiredTime : Sync; - if (root.finishedExpirationTime === expirationTime) { - // There's already a pending commit at this expiration time. - // TODO: This is poorly factored. This case only exists for the - // batch.commit() API. - commitRoot(root); - } else { if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) { { - throw Error("Should not already be working."); + throw Error( "Should not already be working." ); } } flushPassiveEffects(); // If the root or expiration time have changed, throw out the existing stack // and prepare a fresh one. Otherwise we'll continue where we left off. - if (root !== workInProgressRoot || expirationTime !== renderExpirationTime) { + if (root !== workInProgressRoot || expirationTime !== renderExpirationTime$1) { prepareFreshStack(root, expirationTime); startWorkOnPendingInteractions(root, expirationTime); } // If we have a work-in-progress fiber, it means there's still work to do @@ -24407,7 +21882,7 @@ function performSyncWorkOnRoot(root) { if (workInProgress !== null) { var prevExecutionContext = executionContext; executionContext |= RenderContext; - var prevDispatcher = pushDispatcher(root); + var prevDispatcher = pushDispatcher(); var prevInteractions = pushInteractions(root); startWorkLoopTimer(workInProgress); @@ -24424,7 +21899,7 @@ function performSyncWorkOnRoot(root) { executionContext = prevExecutionContext; popDispatcher(prevDispatcher); - if (enableSchedulerTracing) { + { popInteractions(prevInteractions); } @@ -24441,7 +21916,7 @@ function performSyncWorkOnRoot(root) { // This is a sync render, so we should have finished the whole tree. { { - throw Error("Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue."); + throw Error( "Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue." ); } } } else { @@ -24450,2176 +21925,1953 @@ function performSyncWorkOnRoot(root) { stopFinishedWorkLoopTimer(); root.finishedWork = root.current.alternate; root.finishedExpirationTime = expirationTime; - finishSyncRender(root, workInProgressRootExitStatus, expirationTime); + finishSyncRender(root); } // Before exiting, make sure there's a callback scheduled for the next // pending level. ensureRootIsScheduled(root); } + + return null; } - return null; -} + function finishSyncRender(root) { + // Set this to null to indicate there's no in-progress render. + workInProgressRoot = null; + commitRoot(root); + } + function flushDiscreteUpdates() { + // TODO: Should be able to flush inside batchedUpdates, but not inside `act`. + // However, `act` uses `batchedUpdates`, so there's no way to distinguish + // those two cases. Need to fix this before exposing flushDiscreteUpdates + // as a public API. + if ((executionContext & (BatchedContext | RenderContext | CommitContext)) !== NoContext) { + { + if ((executionContext & RenderContext) !== NoContext) { + error('unstable_flushDiscreteUpdates: Cannot flush updates when React is ' + 'already rendering.'); + } + } // We're already rendering, so we can't synchronously flush pending work. + // This is probably a nested event dispatch triggered by a lifecycle/effect, + // like `el.focus()`. Exit. -function finishSyncRender(root, exitStatus, expirationTime) { - // Set this to null to indicate there's no in-progress render. - workInProgressRoot = null; - { - if (exitStatus === RootSuspended || exitStatus === RootSuspendedWithDelay) { - flushSuspensePriorityWarningInDEV(); + return; } - } - - commitRoot(root); -} -function flushRoot(root, expirationTime) { - markRootExpiredAtTime(root, expirationTime); - ensureRootIsScheduled(root); + flushPendingDiscreteUpdates(); // If the discrete updates scheduled passive effects, flush them now so that + // they fire before the next serial event. - if ((executionContext & (RenderContext | CommitContext)) === NoContext) { - flushSyncCallbackQueue(); + flushPassiveEffects(); + } + function syncUpdates(fn, a, b, c) { + return runWithPriority$1(ImmediatePriority, fn.bind(null, a, b, c)); } -} -function flushDiscreteUpdates() { - // TODO: Should be able to flush inside batchedUpdates, but not inside `act`. - // However, `act` uses `batchedUpdates`, so there's no way to distinguish - // those two cases. Need to fix this before exposing flushDiscreteUpdates - // as a public API. - if ((executionContext & (BatchedContext | RenderContext | CommitContext)) !== NoContext) { - if (true && (executionContext & RenderContext) !== NoContext) { - warning$1(false, 'unstable_flushDiscreteUpdates: Cannot flush updates when React is ' + 'already rendering.'); - } // We're already rendering, so we can't synchronously flush pending work. - // This is probably a nested event dispatch triggered by a lifecycle/effect, - // like `el.focus()`. Exit. - - - return; - } - - flushPendingDiscreteUpdates(); // If the discrete updates scheduled passive effects, flush them now so that - // they fire before the next serial event. - - flushPassiveEffects(); -} - -function syncUpdates(fn, a, b, c) { - return runWithPriority$2(ImmediatePriority, fn.bind(null, a, b, c)); -} - -function flushPendingDiscreteUpdates() { - if (rootsWithPendingDiscreteUpdates !== null) { - // For each root with pending discrete updates, schedule a callback to - // immediately flush them. - var roots = rootsWithPendingDiscreteUpdates; - rootsWithPendingDiscreteUpdates = null; - roots.forEach(function (expirationTime, root) { - markRootExpiredAtTime(root, expirationTime); - ensureRootIsScheduled(root); - }); // Now flush the immediate queue. - flushSyncCallbackQueue(); + function flushPendingDiscreteUpdates() { + if (rootsWithPendingDiscreteUpdates !== null) { + // For each root with pending discrete updates, schedule a callback to + // immediately flush them. + var roots = rootsWithPendingDiscreteUpdates; + rootsWithPendingDiscreteUpdates = null; + roots.forEach(function (expirationTime, root) { + markRootExpiredAtTime(root, expirationTime); + ensureRootIsScheduled(root); + }); // Now flush the immediate queue. + + flushSyncCallbackQueue(); + } } -} -function batchedUpdates$1(fn, a) { - var prevExecutionContext = executionContext; - executionContext |= BatchedContext; + function batchedUpdates$1(fn, a) { + var prevExecutionContext = executionContext; + executionContext |= BatchedContext; - try { - return fn(a); - } finally { - executionContext = prevExecutionContext; + try { + return fn(a); + } finally { + executionContext = prevExecutionContext; - if (executionContext === NoContext) { - // Flush the immediate callbacks that were scheduled during this batch - flushSyncCallbackQueue(); + if (executionContext === NoContext) { + // Flush the immediate callbacks that were scheduled during this batch + flushSyncCallbackQueue(); + } } } -} -function batchedEventUpdates$1(fn, a) { - var prevExecutionContext = executionContext; - executionContext |= EventContext; + function batchedEventUpdates$1(fn, a) { + var prevExecutionContext = executionContext; + executionContext |= EventContext; - try { - return fn(a); - } finally { - executionContext = prevExecutionContext; + try { + return fn(a); + } finally { + executionContext = prevExecutionContext; - if (executionContext === NoContext) { - // Flush the immediate callbacks that were scheduled during this batch - flushSyncCallbackQueue(); + if (executionContext === NoContext) { + // Flush the immediate callbacks that were scheduled during this batch + flushSyncCallbackQueue(); + } } } -} -function discreteUpdates$1(fn, a, b, c) { - var prevExecutionContext = executionContext; - executionContext |= DiscreteEventContext; + function discreteUpdates$1(fn, a, b, c, d) { + var prevExecutionContext = executionContext; + executionContext |= DiscreteEventContext; - try { - // Should this - return runWithPriority$2(UserBlockingPriority$2, fn.bind(null, a, b, c)); - } finally { - executionContext = prevExecutionContext; + try { + // Should this + return runWithPriority$1(UserBlockingPriority$1, fn.bind(null, a, b, c, d)); + } finally { + executionContext = prevExecutionContext; - if (executionContext === NoContext) { - // Flush the immediate callbacks that were scheduled during this batch - flushSyncCallbackQueue(); + if (executionContext === NoContext) { + // Flush the immediate callbacks that were scheduled during this batch + flushSyncCallbackQueue(); + } } } -} -function unbatchedUpdates(fn, a) { - var prevExecutionContext = executionContext; - executionContext &= ~BatchedContext; - executionContext |= LegacyUnbatchedContext; + function unbatchedUpdates(fn, a) { + var prevExecutionContext = executionContext; + executionContext &= ~BatchedContext; + executionContext |= LegacyUnbatchedContext; - try { - return fn(a); - } finally { - executionContext = prevExecutionContext; + try { + return fn(a); + } finally { + executionContext = prevExecutionContext; - if (executionContext === NoContext) { - // Flush the immediate callbacks that were scheduled during this batch - flushSyncCallbackQueue(); + if (executionContext === NoContext) { + // Flush the immediate callbacks that were scheduled during this batch + flushSyncCallbackQueue(); + } } } -} -function flushSync(fn, a) { - if ((executionContext & (RenderContext | CommitContext)) !== NoContext) { - { + function flushSync(fn, a) { + if ((executionContext & (RenderContext | CommitContext)) !== NoContext) { { - throw Error("flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering."); + { + throw Error( "flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering." ); + } } } - } - - var prevExecutionContext = executionContext; - executionContext |= BatchedContext; - try { - return runWithPriority$2(ImmediatePriority, fn.bind(null, a)); - } finally { - executionContext = prevExecutionContext; // Flush the immediate callbacks that were scheduled during this batch. - // Note that this will happen even if batchedUpdates is higher up - // the stack. - - flushSyncCallbackQueue(); - } -} -function flushControlled(fn) { - var prevExecutionContext = executionContext; - executionContext |= BatchedContext; + var prevExecutionContext = executionContext; + executionContext |= BatchedContext; - try { - runWithPriority$2(ImmediatePriority, fn); - } finally { - executionContext = prevExecutionContext; + try { + return runWithPriority$1(ImmediatePriority, fn.bind(null, a)); + } finally { + executionContext = prevExecutionContext; // Flush the immediate callbacks that were scheduled during this batch. + // Note that this will happen even if batchedUpdates is higher up + // the stack. - if (executionContext === NoContext) { - // Flush the immediate callbacks that were scheduled during this batch flushSyncCallbackQueue(); } } -} -function prepareFreshStack(root, expirationTime) { - root.finishedWork = null; - root.finishedExpirationTime = NoWork; - var timeoutHandle = root.timeoutHandle; + function prepareFreshStack(root, expirationTime) { + root.finishedWork = null; + root.finishedExpirationTime = NoWork; + var timeoutHandle = root.timeoutHandle; - if (timeoutHandle !== noTimeout) { - // The root previous suspended and scheduled a timeout to commit a fallback - // state. Now that we have additional work, cancel the timeout. - root.timeoutHandle = noTimeout; // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above + if (timeoutHandle !== noTimeout) { + // The root previous suspended and scheduled a timeout to commit a fallback + // state. Now that we have additional work, cancel the timeout. + root.timeoutHandle = noTimeout; // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above - cancelTimeout(timeoutHandle); - } + cancelTimeout(timeoutHandle); + } - if (workInProgress !== null) { - var interruptedWork = workInProgress.return; + if (workInProgress !== null) { + var interruptedWork = workInProgress.return; - while (interruptedWork !== null) { - unwindInterruptedWork(interruptedWork); - interruptedWork = interruptedWork.return; + while (interruptedWork !== null) { + unwindInterruptedWork(interruptedWork); + interruptedWork = interruptedWork.return; + } } - } - workInProgressRoot = root; - workInProgress = createWorkInProgress(root.current, null, expirationTime); - renderExpirationTime = expirationTime; - workInProgressRootExitStatus = RootIncomplete; - workInProgressRootFatalError = null; - workInProgressRootLatestProcessedExpirationTime = Sync; - workInProgressRootLatestSuspenseTimeout = Sync; - workInProgressRootCanSuspendUsingConfig = null; - workInProgressRootNextUnprocessedUpdateTime = NoWork; - workInProgressRootHasPendingPing = false; + workInProgressRoot = root; + workInProgress = createWorkInProgress(root.current, null); + renderExpirationTime$1 = expirationTime; + workInProgressRootExitStatus = RootIncomplete; + workInProgressRootFatalError = null; + workInProgressRootLatestProcessedExpirationTime = Sync; + workInProgressRootLatestSuspenseTimeout = Sync; + workInProgressRootCanSuspendUsingConfig = null; + workInProgressRootNextUnprocessedUpdateTime = NoWork; + workInProgressRootHasPendingPing = false; - if (enableSchedulerTracing) { - spawnedWorkDuringRender = null; - } + { + spawnedWorkDuringRender = null; + } - { - ReactStrictModeWarnings.discardPendingWarnings(); - componentsThatTriggeredHighPriSuspend = null; + { + ReactStrictModeWarnings.discardPendingWarnings(); + } } -} - -function handleError(root, thrownValue) { - do { - try { - // Reset module-level state that was set during the render phase. - resetContextDependencies(); - resetHooks(); - resetCurrentFiber(); - if (workInProgress === null || workInProgress.return === null) { - // Expected to be working on a non-root fiber. This is a fatal error - // because there's no ancestor that can handle it; the root is - // supposed to capture all errors that weren't caught by an error - // boundary. - workInProgressRootExitStatus = RootFatalErrored; - workInProgressRootFatalError = thrownValue; - return null; - } + function handleError(root, thrownValue) { + do { + try { + // Reset module-level state that was set during the render phase. + resetContextDependencies(); + resetHooksAfterThrow(); + resetCurrentFiber(); + + if (workInProgress === null || workInProgress.return === null) { + // Expected to be working on a non-root fiber. This is a fatal error + // because there's no ancestor that can handle it; the root is + // supposed to capture all errors that weren't caught by an error + // boundary. + workInProgressRootExitStatus = RootFatalErrored; + workInProgressRootFatalError = thrownValue; // Set `workInProgress` to null. This represents advancing to the next + // sibling, or the parent if there are no siblings. But since the root + // has no siblings nor a parent, we set it to null. Usually this is + // handled by `completeUnitOfWork` or `unwindWork`, but since we're + // interntionally not calling those, we need set it here. + // TODO: Consider calling `unwindWork` to pop the contexts. + + workInProgress = null; + return null; + } - if (enableProfilerTimer && workInProgress.mode & ProfileMode) { - // Record the time spent rendering before an error was thrown. This - // avoids inaccurate Profiler durations in the case of a - // suspended render. - stopProfilerTimerIfRunningAndRecordDelta(workInProgress, true); - } + if (enableProfilerTimer && workInProgress.mode & ProfileMode) { + // Record the time spent rendering before an error was thrown. This + // avoids inaccurate Profiler durations in the case of a + // suspended render. + stopProfilerTimerIfRunningAndRecordDelta(workInProgress, true); + } - throwException(root, workInProgress.return, workInProgress, thrownValue, renderExpirationTime); - workInProgress = completeUnitOfWork(workInProgress); - } catch (yetAnotherThrownValue) { - // Something in the return path also threw. - thrownValue = yetAnotherThrownValue; - continue; - } // Return to the normal work loop. + throwException(root, workInProgress.return, workInProgress, thrownValue, renderExpirationTime$1); + workInProgress = completeUnitOfWork(workInProgress); + } catch (yetAnotherThrownValue) { + // Something in the return path also threw. + thrownValue = yetAnotherThrownValue; + continue; + } // Return to the normal work loop. - return; - } while (true); -} + return; + } while (true); + } -function pushDispatcher(root) { - var prevDispatcher = ReactCurrentDispatcher.current; - ReactCurrentDispatcher.current = ContextOnlyDispatcher; + function pushDispatcher(root) { + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = ContextOnlyDispatcher; - if (prevDispatcher === null) { - // The React isomorphic package does not include a default dispatcher. - // Instead the first renderer will lazily attach one, in order to give - // nicer error messages. - return ContextOnlyDispatcher; - } else { - return prevDispatcher; + if (prevDispatcher === null) { + // The React isomorphic package does not include a default dispatcher. + // Instead the first renderer will lazily attach one, in order to give + // nicer error messages. + return ContextOnlyDispatcher; + } else { + return prevDispatcher; + } } -} - -function popDispatcher(prevDispatcher) { - ReactCurrentDispatcher.current = prevDispatcher; -} -function pushInteractions(root) { - if (enableSchedulerTracing) { - var prevInteractions = __interactionsRef.current; - __interactionsRef.current = root.memoizedInteractions; - return prevInteractions; + function popDispatcher(prevDispatcher) { + ReactCurrentDispatcher$1.current = prevDispatcher; } - return null; -} + function pushInteractions(root) { + { + var prevInteractions = __interactionsRef.current; + __interactionsRef.current = root.memoizedInteractions; + return prevInteractions; + } + } -function popInteractions(prevInteractions) { - if (enableSchedulerTracing) { - __interactionsRef.current = prevInteractions; + function popInteractions(prevInteractions) { + { + __interactionsRef.current = prevInteractions; + } } -} -function markCommitTimeOfFallback() { - globalMostRecentFallbackTime = now(); -} -function markRenderEventTimeAndConfig(expirationTime, suspenseConfig) { - if (expirationTime < workInProgressRootLatestProcessedExpirationTime && expirationTime > Idle) { - workInProgressRootLatestProcessedExpirationTime = expirationTime; + function markCommitTimeOfFallback() { + globalMostRecentFallbackTime = now(); } + function markRenderEventTimeAndConfig(expirationTime, suspenseConfig) { + if (expirationTime < workInProgressRootLatestProcessedExpirationTime && expirationTime > Idle) { + workInProgressRootLatestProcessedExpirationTime = expirationTime; + } - if (suspenseConfig !== null) { - if (expirationTime < workInProgressRootLatestSuspenseTimeout && expirationTime > Idle) { - workInProgressRootLatestSuspenseTimeout = expirationTime; // Most of the time we only have one config and getting wrong is not bad. + if (suspenseConfig !== null) { + if (expirationTime < workInProgressRootLatestSuspenseTimeout && expirationTime > Idle) { + workInProgressRootLatestSuspenseTimeout = expirationTime; // Most of the time we only have one config and getting wrong is not bad. - workInProgressRootCanSuspendUsingConfig = suspenseConfig; + workInProgressRootCanSuspendUsingConfig = suspenseConfig; + } } } -} -function markUnprocessedUpdateTime(expirationTime) { - if (expirationTime > workInProgressRootNextUnprocessedUpdateTime) { - workInProgressRootNextUnprocessedUpdateTime = expirationTime; + function markUnprocessedUpdateTime(expirationTime) { + if (expirationTime > workInProgressRootNextUnprocessedUpdateTime) { + workInProgressRootNextUnprocessedUpdateTime = expirationTime; + } } -} -function renderDidSuspend() { - if (workInProgressRootExitStatus === RootIncomplete) { - workInProgressRootExitStatus = RootSuspended; + function renderDidSuspend() { + if (workInProgressRootExitStatus === RootIncomplete) { + workInProgressRootExitStatus = RootSuspended; + } } -} -function renderDidSuspendDelayIfPossible() { - if (workInProgressRootExitStatus === RootIncomplete || workInProgressRootExitStatus === RootSuspended) { - workInProgressRootExitStatus = RootSuspendedWithDelay; - } // Check if there's a lower priority update somewhere else in the tree. + function renderDidSuspendDelayIfPossible() { + if (workInProgressRootExitStatus === RootIncomplete || workInProgressRootExitStatus === RootSuspended) { + workInProgressRootExitStatus = RootSuspendedWithDelay; + } // Check if there's a lower priority update somewhere else in the tree. - if (workInProgressRootNextUnprocessedUpdateTime !== NoWork && workInProgressRoot !== null) { - // Mark the current render as suspended, and then mark that there's a - // pending update. - // TODO: This should immediately interrupt the current render, instead - // of waiting until the next time we yield. - markRootSuspendedAtTime(workInProgressRoot, renderExpirationTime); - markRootUpdatedAtTime(workInProgressRoot, workInProgressRootNextUnprocessedUpdateTime); - } -} -function renderDidError() { - if (workInProgressRootExitStatus !== RootCompleted) { - workInProgressRootExitStatus = RootErrored; + if (workInProgressRootNextUnprocessedUpdateTime !== NoWork && workInProgressRoot !== null) { + // Mark the current render as suspended, and then mark that there's a + // pending update. + // TODO: This should immediately interrupt the current render, instead + // of waiting until the next time we yield. + markRootSuspendedAtTime(workInProgressRoot, renderExpirationTime$1); + markRootUpdatedAtTime(workInProgressRoot, workInProgressRootNextUnprocessedUpdateTime); + } } -} // Called during render to determine if anything has suspended. -// Returns false if we're not sure. - -function renderHasNotSuspendedYet() { - // If something errored or completed, we can't really be sure, - // so those are false. - return workInProgressRootExitStatus === RootIncomplete; -} - -function inferTimeFromExpirationTime(expirationTime) { - // We don't know exactly when the update was scheduled, but we can infer an - // approximate start time from the expiration time. - var earliestExpirationTimeMs = expirationTimeToMs(expirationTime); - return earliestExpirationTimeMs - LOW_PRIORITY_EXPIRATION; -} - -function inferTimeFromExpirationTimeWithSuspenseConfig(expirationTime, suspenseConfig) { - // We don't know exactly when the update was scheduled, but we can infer an - // approximate start time from the expiration time by subtracting the timeout - // that was added to the event time. - var earliestExpirationTimeMs = expirationTimeToMs(expirationTime); - return earliestExpirationTimeMs - (suspenseConfig.timeoutMs | 0 || LOW_PRIORITY_EXPIRATION); -} // The work loop is an extremely hot path. Tell Closure not to inline it. - -/** @noinline */ + function renderDidError() { + if (workInProgressRootExitStatus !== RootCompleted) { + workInProgressRootExitStatus = RootErrored; + } + } // Called during render to determine if anything has suspended. + // Returns false if we're not sure. + function renderHasNotSuspendedYet() { + // If something errored or completed, we can't really be sure, + // so those are false. + return workInProgressRootExitStatus === RootIncomplete; + } -function workLoopSync() { - // Already timed out, so perform work without checking if we need to yield. - while (workInProgress !== null) { - workInProgress = performUnitOfWork(workInProgress); + function inferTimeFromExpirationTime(expirationTime) { + // We don't know exactly when the update was scheduled, but we can infer an + // approximate start time from the expiration time. + var earliestExpirationTimeMs = expirationTimeToMs(expirationTime); + return earliestExpirationTimeMs - LOW_PRIORITY_EXPIRATION; } -} -/** @noinline */ + function inferTimeFromExpirationTimeWithSuspenseConfig(expirationTime, suspenseConfig) { + // We don't know exactly when the update was scheduled, but we can infer an + // approximate start time from the expiration time by subtracting the timeout + // that was added to the event time. + var earliestExpirationTimeMs = expirationTimeToMs(expirationTime); + return earliestExpirationTimeMs - (suspenseConfig.timeoutMs | 0 || LOW_PRIORITY_EXPIRATION); + } // The work loop is an extremely hot path. Tell Closure not to inline it. -function workLoopConcurrent() { - // Perform work until Scheduler asks us to yield - while (workInProgress !== null && !shouldYield()) { - workInProgress = performUnitOfWork(workInProgress); - } -} + /** @noinline */ -function performUnitOfWork(unitOfWork) { - // The current, flushed, state of this fiber is the alternate. Ideally - // nothing should rely on this, but relying on it here means that we don't - // need an additional field on the work in progress. - var current$$1 = unitOfWork.alternate; - startWorkTimer(unitOfWork); - setCurrentFiber(unitOfWork); - var next; - if (enableProfilerTimer && (unitOfWork.mode & ProfileMode) !== NoMode) { - startProfilerTimer(unitOfWork); - next = beginWork$$1(current$$1, unitOfWork, renderExpirationTime); - stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true); - } else { - next = beginWork$$1(current$$1, unitOfWork, renderExpirationTime); + function workLoopSync() { + // Already timed out, so perform work without checking if we need to yield. + while (workInProgress !== null) { + workInProgress = performUnitOfWork(workInProgress); + } } + /** @noinline */ - resetCurrentFiber(); - unitOfWork.memoizedProps = unitOfWork.pendingProps; - if (next === null) { - // If this doesn't spawn new work, complete the current work. - next = completeUnitOfWork(unitOfWork); + function workLoopConcurrent() { + // Perform work until Scheduler asks us to yield + while (workInProgress !== null && !shouldYield()) { + workInProgress = performUnitOfWork(workInProgress); + } } - ReactCurrentOwner$2.current = null; - return next; -} - -function completeUnitOfWork(unitOfWork) { - // Attempt to complete the current unit of work, then move to the next - // sibling. If there are no more siblings, return to the parent fiber. - workInProgress = unitOfWork; - - do { + function performUnitOfWork(unitOfWork) { // The current, flushed, state of this fiber is the alternate. Ideally // nothing should rely on this, but relying on it here means that we don't // need an additional field on the work in progress. - var current$$1 = workInProgress.alternate; - var returnFiber = workInProgress.return; // Check if the work completed or if something threw. + var current = unitOfWork.alternate; + startWorkTimer(unitOfWork); + setCurrentFiber(unitOfWork); + var next; + + if ( (unitOfWork.mode & ProfileMode) !== NoMode) { + startProfilerTimer(unitOfWork); + next = beginWork$1(current, unitOfWork, renderExpirationTime$1); + stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true); + } else { + next = beginWork$1(current, unitOfWork, renderExpirationTime$1); + } - if ((workInProgress.effectTag & Incomplete) === NoEffect) { - setCurrentFiber(workInProgress); - var next = void 0; + resetCurrentFiber(); + unitOfWork.memoizedProps = unitOfWork.pendingProps; - if (!enableProfilerTimer || (workInProgress.mode & ProfileMode) === NoMode) { - next = completeWork(current$$1, workInProgress, renderExpirationTime); - } else { - startProfilerTimer(workInProgress); - next = completeWork(current$$1, workInProgress, renderExpirationTime); // Update render duration assuming we didn't error. + if (next === null) { + // If this doesn't spawn new work, complete the current work. + next = completeUnitOfWork(unitOfWork); + } - stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false); - } + ReactCurrentOwner$2.current = null; + return next; + } - stopWorkTimer(workInProgress); - resetCurrentFiber(); - resetChildExpirationTime(workInProgress); + function completeUnitOfWork(unitOfWork) { + // Attempt to complete the current unit of work, then move to the next + // sibling. If there are no more siblings, return to the parent fiber. + workInProgress = unitOfWork; - if (next !== null) { - // Completing this fiber spawned new work. Work on that next. - return next; - } + do { + // The current, flushed, state of this fiber is the alternate. Ideally + // nothing should rely on this, but relying on it here means that we don't + // need an additional field on the work in progress. + var current = workInProgress.alternate; + var returnFiber = workInProgress.return; // Check if the work completed or if something threw. + + if ((workInProgress.effectTag & Incomplete) === NoEffect) { + setCurrentFiber(workInProgress); + var next = void 0; + + if ( (workInProgress.mode & ProfileMode) === NoMode) { + next = completeWork(current, workInProgress, renderExpirationTime$1); + } else { + startProfilerTimer(workInProgress); + next = completeWork(current, workInProgress, renderExpirationTime$1); // Update render duration assuming we didn't error. - if (returnFiber !== null && // Do not append effects to parents if a sibling failed to complete - (returnFiber.effectTag & Incomplete) === NoEffect) { - // Append all the effects of the subtree and this fiber onto the effect - // list of the parent. The completion order of the children affects the - // side-effect order. - if (returnFiber.firstEffect === null) { - returnFiber.firstEffect = workInProgress.firstEffect; + stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false); } - if (workInProgress.lastEffect !== null) { - if (returnFiber.lastEffect !== null) { - returnFiber.lastEffect.nextEffect = workInProgress.firstEffect; + stopWorkTimer(workInProgress); + resetCurrentFiber(); + resetChildExpirationTime(workInProgress); + + if (next !== null) { + // Completing this fiber spawned new work. Work on that next. + return next; + } + + if (returnFiber !== null && // Do not append effects to parents if a sibling failed to complete + (returnFiber.effectTag & Incomplete) === NoEffect) { + // Append all the effects of the subtree and this fiber onto the effect + // list of the parent. The completion order of the children affects the + // side-effect order. + if (returnFiber.firstEffect === null) { + returnFiber.firstEffect = workInProgress.firstEffect; + } + + if (workInProgress.lastEffect !== null) { + if (returnFiber.lastEffect !== null) { + returnFiber.lastEffect.nextEffect = workInProgress.firstEffect; + } + + returnFiber.lastEffect = workInProgress.lastEffect; + } // If this fiber had side-effects, we append it AFTER the children's + // side-effects. We can perform certain side-effects earlier if needed, + // by doing multiple passes over the effect list. We don't want to + // schedule our own side-effect on our own list because if end up + // reusing children we'll schedule this effect onto itself since we're + // at the end. + + + var effectTag = workInProgress.effectTag; // Skip both NoWork and PerformedWork tags when creating the effect + // list. PerformedWork effect is read by React DevTools but shouldn't be + // committed. + + if (effectTag > PerformedWork) { + if (returnFiber.lastEffect !== null) { + returnFiber.lastEffect.nextEffect = workInProgress; + } else { + returnFiber.firstEffect = workInProgress; + } + + returnFiber.lastEffect = workInProgress; } + } + } else { + // This fiber did not complete because something threw. Pop values off + // the stack without entering the complete phase. If this is a boundary, + // capture values if possible. + var _next = unwindWork(workInProgress); // Because this fiber did not complete, don't reset its expiration time. - returnFiber.lastEffect = workInProgress.lastEffect; - } // If this fiber had side-effects, we append it AFTER the children's - // side-effects. We can perform certain side-effects earlier if needed, - // by doing multiple passes over the effect list. We don't want to - // schedule our own side-effect on our own list because if end up - // reusing children we'll schedule this effect onto itself since we're - // at the end. + if ( (workInProgress.mode & ProfileMode) !== NoMode) { + // Record the render duration for the fiber that errored. + stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false); // Include the time spent working on failed children before continuing. - var effectTag = workInProgress.effectTag; // Skip both NoWork and PerformedWork tags when creating the effect - // list. PerformedWork effect is read by React DevTools but shouldn't be - // committed. + var actualDuration = workInProgress.actualDuration; + var child = workInProgress.child; - if (effectTag > PerformedWork) { - if (returnFiber.lastEffect !== null) { - returnFiber.lastEffect.nextEffect = workInProgress; - } else { - returnFiber.firstEffect = workInProgress; + while (child !== null) { + actualDuration += child.actualDuration; + child = child.sibling; } - returnFiber.lastEffect = workInProgress; + workInProgress.actualDuration = actualDuration; } - } - } else { - // This fiber did not complete because something threw. Pop values off - // the stack without entering the complete phase. If this is a boundary, - // capture values if possible. - var _next = unwindWork(workInProgress, renderExpirationTime); // Because this fiber did not complete, don't reset its expiration time. - - if (enableProfilerTimer && (workInProgress.mode & ProfileMode) !== NoMode) { - // Record the render duration for the fiber that errored. - stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false); // Include the time spent working on failed children before continuing. - - var actualDuration = workInProgress.actualDuration; - var child = workInProgress.child; - - while (child !== null) { - actualDuration += child.actualDuration; - child = child.sibling; + if (_next !== null) { + // If completing this work spawned new work, do that next. We'll come + // back here again. + // Since we're restarting, remove anything that is not a host effect + // from the effect tag. + // TODO: The name stopFailedWorkTimer is misleading because Suspense + // also captures and restarts. + stopFailedWorkTimer(workInProgress); + _next.effectTag &= HostEffectMask; + return _next; } - workInProgress.actualDuration = actualDuration; - } + stopWorkTimer(workInProgress); - if (_next !== null) { - // If completing this work spawned new work, do that next. We'll come - // back here again. - // Since we're restarting, remove anything that is not a host effect - // from the effect tag. - // TODO: The name stopFailedWorkTimer is misleading because Suspense - // also captures and restarts. - stopFailedWorkTimer(workInProgress); - _next.effectTag &= HostEffectMask; - return _next; + if (returnFiber !== null) { + // Mark the parent fiber as incomplete and clear its effect list. + returnFiber.firstEffect = returnFiber.lastEffect = null; + returnFiber.effectTag |= Incomplete; + } } - stopWorkTimer(workInProgress); - - if (returnFiber !== null) { - // Mark the parent fiber as incomplete and clear its effect list. - returnFiber.firstEffect = returnFiber.lastEffect = null; - returnFiber.effectTag |= Incomplete; - } - } + var siblingFiber = workInProgress.sibling; - var siblingFiber = workInProgress.sibling; + if (siblingFiber !== null) { + // If there is more work to do in this returnFiber, do that next. + return siblingFiber; + } // Otherwise, return to the parent - if (siblingFiber !== null) { - // If there is more work to do in this returnFiber, do that next. - return siblingFiber; - } // Otherwise, return to the parent + workInProgress = returnFiber; + } while (workInProgress !== null); // We've reached the root. - workInProgress = returnFiber; - } while (workInProgress !== null); // We've reached the root. + if (workInProgressRootExitStatus === RootIncomplete) { + workInProgressRootExitStatus = RootCompleted; + } - if (workInProgressRootExitStatus === RootIncomplete) { - workInProgressRootExitStatus = RootCompleted; + return null; } - return null; -} + function getRemainingExpirationTime(fiber) { + var updateExpirationTime = fiber.expirationTime; + var childExpirationTime = fiber.childExpirationTime; + return updateExpirationTime > childExpirationTime ? updateExpirationTime : childExpirationTime; + } -function getRemainingExpirationTime(fiber) { - var updateExpirationTime = fiber.expirationTime; - var childExpirationTime = fiber.childExpirationTime; - return updateExpirationTime > childExpirationTime ? updateExpirationTime : childExpirationTime; -} + function resetChildExpirationTime(completedWork) { + if (renderExpirationTime$1 !== Never && completedWork.childExpirationTime === Never) { + // The children of this component are hidden. Don't bubble their + // expiration times. + return; + } -function resetChildExpirationTime(completedWork) { - if (renderExpirationTime !== Never && completedWork.childExpirationTime === Never) { - // The children of this component are hidden. Don't bubble their - // expiration times. - return; - } + var newChildExpirationTime = NoWork; // Bubble up the earliest expiration time. - var newChildExpirationTime = NoWork; // Bubble up the earliest expiration time. + if ( (completedWork.mode & ProfileMode) !== NoMode) { + // In profiling mode, resetChildExpirationTime is also used to reset + // profiler durations. + var actualDuration = completedWork.actualDuration; + var treeBaseDuration = completedWork.selfBaseDuration; // When a fiber is cloned, its actualDuration is reset to 0. This value will + // only be updated if work is done on the fiber (i.e. it doesn't bailout). + // When work is done, it should bubble to the parent's actualDuration. If + // the fiber has not been cloned though, (meaning no work was done), then + // this value will reflect the amount of time spent working on a previous + // render. In that case it should not bubble. We determine whether it was + // cloned by comparing the child pointer. - if (enableProfilerTimer && (completedWork.mode & ProfileMode) !== NoMode) { - // In profiling mode, resetChildExpirationTime is also used to reset - // profiler durations. - var actualDuration = completedWork.actualDuration; - var treeBaseDuration = completedWork.selfBaseDuration; // When a fiber is cloned, its actualDuration is reset to 0. This value will - // only be updated if work is done on the fiber (i.e. it doesn't bailout). - // When work is done, it should bubble to the parent's actualDuration. If - // the fiber has not been cloned though, (meaning no work was done), then - // this value will reflect the amount of time spent working on a previous - // render. In that case it should not bubble. We determine whether it was - // cloned by comparing the child pointer. + var shouldBubbleActualDurations = completedWork.alternate === null || completedWork.child !== completedWork.alternate.child; + var child = completedWork.child; - var shouldBubbleActualDurations = completedWork.alternate === null || completedWork.child !== completedWork.alternate.child; - var child = completedWork.child; + while (child !== null) { + var childUpdateExpirationTime = child.expirationTime; + var childChildExpirationTime = child.childExpirationTime; - while (child !== null) { - var childUpdateExpirationTime = child.expirationTime; - var childChildExpirationTime = child.childExpirationTime; + if (childUpdateExpirationTime > newChildExpirationTime) { + newChildExpirationTime = childUpdateExpirationTime; + } - if (childUpdateExpirationTime > newChildExpirationTime) { - newChildExpirationTime = childUpdateExpirationTime; - } + if (childChildExpirationTime > newChildExpirationTime) { + newChildExpirationTime = childChildExpirationTime; + } - if (childChildExpirationTime > newChildExpirationTime) { - newChildExpirationTime = childChildExpirationTime; - } + if (shouldBubbleActualDurations) { + actualDuration += child.actualDuration; + } - if (shouldBubbleActualDurations) { - actualDuration += child.actualDuration; + treeBaseDuration += child.treeBaseDuration; + child = child.sibling; } - treeBaseDuration += child.treeBaseDuration; - child = child.sibling; - } + completedWork.actualDuration = actualDuration; + completedWork.treeBaseDuration = treeBaseDuration; + } else { + var _child = completedWork.child; - completedWork.actualDuration = actualDuration; - completedWork.treeBaseDuration = treeBaseDuration; - } else { - var _child = completedWork.child; + while (_child !== null) { + var _childUpdateExpirationTime = _child.expirationTime; + var _childChildExpirationTime = _child.childExpirationTime; - while (_child !== null) { - var _childUpdateExpirationTime = _child.expirationTime; - var _childChildExpirationTime = _child.childExpirationTime; + if (_childUpdateExpirationTime > newChildExpirationTime) { + newChildExpirationTime = _childUpdateExpirationTime; + } - if (_childUpdateExpirationTime > newChildExpirationTime) { - newChildExpirationTime = _childUpdateExpirationTime; - } + if (_childChildExpirationTime > newChildExpirationTime) { + newChildExpirationTime = _childChildExpirationTime; + } - if (_childChildExpirationTime > newChildExpirationTime) { - newChildExpirationTime = _childChildExpirationTime; + _child = _child.sibling; } - - _child = _child.sibling; } - } - - completedWork.childExpirationTime = newChildExpirationTime; -} - -function commitRoot(root) { - var renderPriorityLevel = getCurrentPriorityLevel(); - runWithPriority$2(ImmediatePriority, commitRootImpl.bind(null, root, renderPriorityLevel)); - return null; -} - -function commitRootImpl(root, renderPriorityLevel) { - do { - // `flushPassiveEffects` will call `flushSyncUpdateQueue` at the end, which - // means `flushPassiveEffects` will sometimes result in additional - // passive effects. So we need to keep flushing in a loop until there are - // no more pending effects. - // TODO: Might be better if `flushPassiveEffects` did not automatically - // flush synchronous work at the end, to avoid factoring hazards like this. - flushPassiveEffects(); - } while (rootWithPendingPassiveEffects !== null); - flushRenderPhaseStrictModeWarningsInDEV(); - - if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) { - { - throw Error("Should not already be working."); - } + completedWork.childExpirationTime = newChildExpirationTime; } - var finishedWork = root.finishedWork; - var expirationTime = root.finishedExpirationTime; - - if (finishedWork === null) { + function commitRoot(root) { + var renderPriorityLevel = getCurrentPriorityLevel(); + runWithPriority$1(ImmediatePriority, commitRootImpl.bind(null, root, renderPriorityLevel)); return null; } - root.finishedWork = null; - root.finishedExpirationTime = NoWork; - - if (!(finishedWork !== root.current)) { - { - throw Error("Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue."); - } - } // commitRoot never returns a continuation; it always finishes synchronously. - // So we can clear these now to allow a new callback to be scheduled. - + function commitRootImpl(root, renderPriorityLevel) { + do { + // `flushPassiveEffects` will call `flushSyncUpdateQueue` at the end, which + // means `flushPassiveEffects` will sometimes result in additional + // passive effects. So we need to keep flushing in a loop until there are + // no more pending effects. + // TODO: Might be better if `flushPassiveEffects` did not automatically + // flush synchronous work at the end, to avoid factoring hazards like this. + flushPassiveEffects(); + } while (rootWithPendingPassiveEffects !== null); - root.callbackNode = null; - root.callbackExpirationTime = NoWork; - root.callbackPriority = NoPriority; - root.nextKnownPendingLevel = NoWork; - startCommitTimer(); // Update the first and last pending times on this root. The new first - // pending time is whatever is left on the root fiber. + flushRenderPhaseStrictModeWarningsInDEV(); - var remainingExpirationTimeBeforeCommit = getRemainingExpirationTime(finishedWork); - markRootFinishedAtTime(root, expirationTime, remainingExpirationTimeBeforeCommit); + if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) { + { + throw Error( "Should not already be working." ); + } + } - if (root === workInProgressRoot) { - // We can reset these now that they are finished. - workInProgressRoot = null; - workInProgress = null; - renderExpirationTime = NoWork; - } else {} // This indicates that the last root we worked on is not the same one that - // we're committing now. This most commonly happens when a suspended root - // times out. - // Get the list of effects. + var finishedWork = root.finishedWork; + var expirationTime = root.finishedExpirationTime; + if (finishedWork === null) { + return null; + } - var firstEffect; + root.finishedWork = null; + root.finishedExpirationTime = NoWork; - if (finishedWork.effectTag > PerformedWork) { - // A fiber's effect list consists only of its children, not itself. So if - // the root has an effect, we need to add it to the end of the list. The - // resulting list is the set that would belong to the root's parent, if it - // had one; that is, all the effects in the tree including the root. - if (finishedWork.lastEffect !== null) { - finishedWork.lastEffect.nextEffect = finishedWork; - firstEffect = finishedWork.firstEffect; + if (!(finishedWork !== root.current)) { + { + throw Error( "Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue." ); + } + } // commitRoot never returns a continuation; it always finishes synchronously. + // So we can clear these now to allow a new callback to be scheduled. + + + root.callbackNode = null; + root.callbackExpirationTime = NoWork; + root.callbackPriority = NoPriority; + root.nextKnownPendingLevel = NoWork; + startCommitTimer(); // Update the first and last pending times on this root. The new first + // pending time is whatever is left on the root fiber. + + var remainingExpirationTimeBeforeCommit = getRemainingExpirationTime(finishedWork); + markRootFinishedAtTime(root, expirationTime, remainingExpirationTimeBeforeCommit); + + if (root === workInProgressRoot) { + // We can reset these now that they are finished. + workInProgressRoot = null; + workInProgress = null; + renderExpirationTime$1 = NoWork; + } // This indicates that the last root we worked on is not the same one that + // we're committing now. This most commonly happens when a suspended root + // times out. + // Get the list of effects. + + + var firstEffect; + + if (finishedWork.effectTag > PerformedWork) { + // A fiber's effect list consists only of its children, not itself. So if + // the root has an effect, we need to add it to the end of the list. The + // resulting list is the set that would belong to the root's parent, if it + // had one; that is, all the effects in the tree including the root. + if (finishedWork.lastEffect !== null) { + finishedWork.lastEffect.nextEffect = finishedWork; + firstEffect = finishedWork.firstEffect; + } else { + firstEffect = finishedWork; + } } else { - firstEffect = finishedWork; + // There is no effect on the root. + firstEffect = finishedWork.firstEffect; } - } else { - // There is no effect on the root. - firstEffect = finishedWork.firstEffect; - } - if (firstEffect !== null) { - var prevExecutionContext = executionContext; - executionContext |= CommitContext; - var prevInteractions = pushInteractions(root); // Reset this to null before calling lifecycles + if (firstEffect !== null) { + var prevExecutionContext = executionContext; + executionContext |= CommitContext; + var prevInteractions = pushInteractions(root); // Reset this to null before calling lifecycles - ReactCurrentOwner$2.current = null; // The commit phase is broken into several sub-phases. We do a separate pass - // of the effect list for each phase: all mutation effects come before all - // layout effects, and so on. - // The first phase a "before mutation" phase. We use this phase to read the - // state of the host tree right before we mutate it. This is where - // getSnapshotBeforeUpdate is called. + ReactCurrentOwner$2.current = null; // The commit phase is broken into several sub-phases. We do a separate pass + // of the effect list for each phase: all mutation effects come before all + // layout effects, and so on. + // The first phase a "before mutation" phase. We use this phase to read the + // state of the host tree right before we mutate it. This is where + // getSnapshotBeforeUpdate is called. - startCommitSnapshotEffectsTimer(); - prepareForCommit(root.containerInfo); - nextEffect = firstEffect; + startCommitSnapshotEffectsTimer(); + prepareForCommit(root.containerInfo); + nextEffect = firstEffect; - do { - { - invokeGuardedCallback(null, commitBeforeMutationEffects, null); + do { + { + invokeGuardedCallback(null, commitBeforeMutationEffects, null); - if (hasCaughtError()) { - if (!(nextEffect !== null)) { - { - throw Error("Should be working on an effect."); + if (hasCaughtError()) { + if (!(nextEffect !== null)) { + { + throw Error( "Should be working on an effect." ); + } } - } - var error = clearCaughtError(); - captureCommitPhaseError(nextEffect, error); - nextEffect = nextEffect.nextEffect; + var error = clearCaughtError(); + captureCommitPhaseError(nextEffect, error); + nextEffect = nextEffect.nextEffect; + } } - } - } while (nextEffect !== null); + } while (nextEffect !== null); - stopCommitSnapshotEffectsTimer(); + stopCommitSnapshotEffectsTimer(); - if (enableProfilerTimer) { - // Mark the current commit time to be shared by all Profilers in this - // batch. This enables them to be grouped later. - recordCommitTime(); - } // The next phase is the mutation phase, where we mutate the host tree. + { + // Mark the current commit time to be shared by all Profilers in this + // batch. This enables them to be grouped later. + recordCommitTime(); + } // The next phase is the mutation phase, where we mutate the host tree. - startCommitHostEffectsTimer(); - nextEffect = firstEffect; + startCommitHostEffectsTimer(); + nextEffect = firstEffect; - do { - { - invokeGuardedCallback(null, commitMutationEffects, null, root, renderPriorityLevel); + do { + { + invokeGuardedCallback(null, commitMutationEffects, null, root, renderPriorityLevel); - if (hasCaughtError()) { - if (!(nextEffect !== null)) { - { - throw Error("Should be working on an effect."); + if (hasCaughtError()) { + if (!(nextEffect !== null)) { + { + throw Error( "Should be working on an effect." ); + } } - } - var _error = clearCaughtError(); + var _error = clearCaughtError(); - captureCommitPhaseError(nextEffect, _error); - nextEffect = nextEffect.nextEffect; + captureCommitPhaseError(nextEffect, _error); + nextEffect = nextEffect.nextEffect; + } } - } - } while (nextEffect !== null); + } while (nextEffect !== null); - stopCommitHostEffectsTimer(); - resetAfterCommit(root.containerInfo); // The work-in-progress tree is now the current tree. This must come after - // the mutation phase, so that the previous tree is still current during - // componentWillUnmount, but before the layout phase, so that the finished - // work is current during componentDidMount/Update. + stopCommitHostEffectsTimer(); + resetAfterCommit(root.containerInfo); // The work-in-progress tree is now the current tree. This must come after + // the mutation phase, so that the previous tree is still current during + // componentWillUnmount, but before the layout phase, so that the finished + // work is current during componentDidMount/Update. - root.current = finishedWork; // The next phase is the layout phase, where we call effects that read - // the host tree after it's been mutated. The idiomatic use case for this is - // layout, but class component lifecycles also fire here for legacy reasons. + root.current = finishedWork; // The next phase is the layout phase, where we call effects that read + // the host tree after it's been mutated. The idiomatic use case for this is + // layout, but class component lifecycles also fire here for legacy reasons. - startCommitLifeCyclesTimer(); - nextEffect = firstEffect; + startCommitLifeCyclesTimer(); + nextEffect = firstEffect; - do { - { - invokeGuardedCallback(null, commitLayoutEffects, null, root, expirationTime); + do { + { + invokeGuardedCallback(null, commitLayoutEffects, null, root, expirationTime); - if (hasCaughtError()) { - if (!(nextEffect !== null)) { - { - throw Error("Should be working on an effect."); + if (hasCaughtError()) { + if (!(nextEffect !== null)) { + { + throw Error( "Should be working on an effect." ); + } } - } - var _error2 = clearCaughtError(); + var _error2 = clearCaughtError(); - captureCommitPhaseError(nextEffect, _error2); - nextEffect = nextEffect.nextEffect; + captureCommitPhaseError(nextEffect, _error2); + nextEffect = nextEffect.nextEffect; + } } - } - } while (nextEffect !== null); + } while (nextEffect !== null); - stopCommitLifeCyclesTimer(); - nextEffect = null; // Tell Scheduler to yield at the end of the frame, so the browser has an - // opportunity to paint. + stopCommitLifeCyclesTimer(); + nextEffect = null; // Tell Scheduler to yield at the end of the frame, so the browser has an + // opportunity to paint. - requestPaint(); + requestPaint(); - if (enableSchedulerTracing) { - popInteractions(prevInteractions); - } + { + popInteractions(prevInteractions); + } - executionContext = prevExecutionContext; - } else { - // No effects. - root.current = finishedWork; // Measure these anyway so the flamegraph explicitly shows that there were - // no effects. - // TODO: Maybe there's a better way to report this. + executionContext = prevExecutionContext; + } else { + // No effects. + root.current = finishedWork; // Measure these anyway so the flamegraph explicitly shows that there were + // no effects. + // TODO: Maybe there's a better way to report this. - startCommitSnapshotEffectsTimer(); - stopCommitSnapshotEffectsTimer(); + startCommitSnapshotEffectsTimer(); + stopCommitSnapshotEffectsTimer(); - if (enableProfilerTimer) { - recordCommitTime(); - } + { + recordCommitTime(); + } - startCommitHostEffectsTimer(); - stopCommitHostEffectsTimer(); - startCommitLifeCyclesTimer(); - stopCommitLifeCyclesTimer(); - } + startCommitHostEffectsTimer(); + stopCommitHostEffectsTimer(); + startCommitLifeCyclesTimer(); + stopCommitLifeCyclesTimer(); + } - stopCommitTimer(); - var rootDidHavePassiveEffects = rootDoesHavePassiveEffects; + stopCommitTimer(); + var rootDidHavePassiveEffects = rootDoesHavePassiveEffects; - if (rootDoesHavePassiveEffects) { - // This commit has passive effects. Stash a reference to them. But don't - // schedule a callback until after flushing layout work. - rootDoesHavePassiveEffects = false; - rootWithPendingPassiveEffects = root; - pendingPassiveEffectsExpirationTime = expirationTime; - pendingPassiveEffectsRenderPriority = renderPriorityLevel; - } else { - // We are done with the effect chain at this point so let's clear the - // nextEffect pointers to assist with GC. If we have passive effects, we'll - // clear this in flushPassiveEffects. - nextEffect = firstEffect; + if (rootDoesHavePassiveEffects) { + // This commit has passive effects. Stash a reference to them. But don't + // schedule a callback until after flushing layout work. + rootDoesHavePassiveEffects = false; + rootWithPendingPassiveEffects = root; + pendingPassiveEffectsExpirationTime = expirationTime; + pendingPassiveEffectsRenderPriority = renderPriorityLevel; + } else { + // We are done with the effect chain at this point so let's clear the + // nextEffect pointers to assist with GC. If we have passive effects, we'll + // clear this in flushPassiveEffects. + nextEffect = firstEffect; - while (nextEffect !== null) { - var nextNextEffect = nextEffect.nextEffect; - nextEffect.nextEffect = null; - nextEffect = nextNextEffect; - } - } // Check if there's remaining work on this root + while (nextEffect !== null) { + var nextNextEffect = nextEffect.nextEffect; + nextEffect.nextEffect = null; + nextEffect = nextNextEffect; + } + } // Check if there's remaining work on this root - var remainingExpirationTime = root.firstPendingTime; + var remainingExpirationTime = root.firstPendingTime; - if (remainingExpirationTime !== NoWork) { - if (enableSchedulerTracing) { - if (spawnedWorkDuringRender !== null) { - var expirationTimes = spawnedWorkDuringRender; - spawnedWorkDuringRender = null; + if (remainingExpirationTime !== NoWork) { + { + if (spawnedWorkDuringRender !== null) { + var expirationTimes = spawnedWorkDuringRender; + spawnedWorkDuringRender = null; - for (var i = 0; i < expirationTimes.length; i++) { - scheduleInteractions(root, expirationTimes[i], root.memoizedInteractions); + for (var i = 0; i < expirationTimes.length; i++) { + scheduleInteractions(root, expirationTimes[i], root.memoizedInteractions); + } } - } - schedulePendingInteractions(root, remainingExpirationTime); + schedulePendingInteractions(root, remainingExpirationTime); + } + } else { + // If there's no remaining work, we can clear the set of already failed + // error boundaries. + legacyErrorBoundariesThatAlreadyFailed = null; } - } else { - // If there's no remaining work, we can clear the set of already failed - // error boundaries. - legacyErrorBoundariesThatAlreadyFailed = null; - } - if (enableSchedulerTracing) { - if (!rootDidHavePassiveEffects) { - // If there are no passive effects, then we can complete the pending interactions. - // Otherwise, we'll wait until after the passive effects are flushed. - // Wait to do this until after remaining work has been scheduled, - // so that we don't prematurely signal complete for interactions when there's e.g. hidden work. - finishPendingInteractions(root, expirationTime); + { + if (!rootDidHavePassiveEffects) { + // If there are no passive effects, then we can complete the pending interactions. + // Otherwise, we'll wait until after the passive effects are flushed. + // Wait to do this until after remaining work has been scheduled, + // so that we don't prematurely signal complete for interactions when there's e.g. hidden work. + finishPendingInteractions(root, expirationTime); + } } - } - if (remainingExpirationTime === Sync) { - // Count the number of times the root synchronously re-renders without - // finishing. If there are too many, it indicates an infinite update loop. - if (root === rootWithNestedUpdates) { - nestedUpdateCount++; + if (remainingExpirationTime === Sync) { + // Count the number of times the root synchronously re-renders without + // finishing. If there are too many, it indicates an infinite update loop. + if (root === rootWithNestedUpdates) { + nestedUpdateCount++; + } else { + nestedUpdateCount = 0; + rootWithNestedUpdates = root; + } } else { nestedUpdateCount = 0; - rootWithNestedUpdates = root; } - } else { - nestedUpdateCount = 0; - } - - onCommitRoot(finishedWork.stateNode, expirationTime); // Always call this before exiting `commitRoot`, to ensure that any - // additional work on this root is scheduled. - - ensureRootIsScheduled(root); - - if (hasUncaughtError) { - hasUncaughtError = false; - var _error3 = firstUncaughtError; - firstUncaughtError = null; - throw _error3; - } - - if ((executionContext & LegacyUnbatchedContext) !== NoContext) { - // This is a legacy edge case. We just committed the initial mount of - // a ReactDOM.render-ed root inside of batchedUpdates. The commit fired - // synchronously, but layout updates should be deferred until the end - // of the batch. - return null; - } // If layout work was scheduled, flush it now. + onCommitRoot(finishedWork.stateNode, expirationTime); // Always call this before exiting `commitRoot`, to ensure that any + // additional work on this root is scheduled. - flushSyncCallbackQueue(); - return null; -} - -function commitBeforeMutationEffects() { - while (nextEffect !== null) { - var effectTag = nextEffect.effectTag; + ensureRootIsScheduled(root); - if ((effectTag & Snapshot) !== NoEffect) { - setCurrentFiber(nextEffect); - recordEffect(); - var current$$1 = nextEffect.alternate; - commitBeforeMutationLifeCycles(current$$1, nextEffect); - resetCurrentFiber(); + if (hasUncaughtError) { + hasUncaughtError = false; + var _error3 = firstUncaughtError; + firstUncaughtError = null; + throw _error3; } - if ((effectTag & Passive) !== NoEffect) { - // If there are passive effects, schedule a callback to flush at - // the earliest opportunity. - if (!rootDoesHavePassiveEffects) { - rootDoesHavePassiveEffects = true; - scheduleCallback(NormalPriority, function () { - flushPassiveEffects(); - return null; - }); - } - } + if ((executionContext & LegacyUnbatchedContext) !== NoContext) { + // This is a legacy edge case. We just committed the initial mount of + // a ReactDOM.render-ed root inside of batchedUpdates. The commit fired + // synchronously, but layout updates should be deferred until the end + // of the batch. + return null; + } // If layout work was scheduled, flush it now. - nextEffect = nextEffect.nextEffect; + + flushSyncCallbackQueue(); + return null; } -} -function commitMutationEffects(root, renderPriorityLevel) { - // TODO: Should probably move the bulk of this function to commitWork. - while (nextEffect !== null) { - setCurrentFiber(nextEffect); - var effectTag = nextEffect.effectTag; + function commitBeforeMutationEffects() { + while (nextEffect !== null) { + var effectTag = nextEffect.effectTag; + + if ((effectTag & Snapshot) !== NoEffect) { + setCurrentFiber(nextEffect); + recordEffect(); + var current = nextEffect.alternate; + commitBeforeMutationLifeCycles(current, nextEffect); + resetCurrentFiber(); + } + + if ((effectTag & Passive) !== NoEffect) { + // If there are passive effects, schedule a callback to flush at + // the earliest opportunity. + if (!rootDoesHavePassiveEffects) { + rootDoesHavePassiveEffects = true; + scheduleCallback(NormalPriority, function () { + flushPassiveEffects(); + return null; + }); + } + } - if (effectTag & ContentReset) { - commitResetTextContent(nextEffect); + nextEffect = nextEffect.nextEffect; } + } - if (effectTag & Ref) { - var current$$1 = nextEffect.alternate; + function commitMutationEffects(root, renderPriorityLevel) { + // TODO: Should probably move the bulk of this function to commitWork. + while (nextEffect !== null) { + setCurrentFiber(nextEffect); + var effectTag = nextEffect.effectTag; - if (current$$1 !== null) { - commitDetachRef(current$$1); + if (effectTag & ContentReset) { + commitResetTextContent(nextEffect); } - } // The following switch statement is only concerned about placement, - // updates, and deletions. To avoid needing to add a case for every possible - // bitmap value, we remove the secondary effects from the effect tag and - // switch on that value. - - var primaryEffectTag = effectTag & (Placement | Update | Deletion | Hydrating); + if (effectTag & Ref) { + var current = nextEffect.alternate; - switch (primaryEffectTag) { - case Placement: - { - commitPlacement(nextEffect); // Clear the "placement" from effect tag so that we know that this is - // inserted, before any life-cycles like componentDidMount gets called. - // TODO: findDOMNode doesn't rely on this any more but isMounted does - // and isMounted is deprecated anyway so we should be able to kill this. - - nextEffect.effectTag &= ~Placement; - break; - } - - case PlacementAndUpdate: - { - // Placement - commitPlacement(nextEffect); // Clear the "placement" from effect tag so that we know that this is - // inserted, before any life-cycles like componentDidMount gets called. - - nextEffect.effectTag &= ~Placement; // Update - - var _current = nextEffect.alternate; - commitWork(_current, nextEffect); - break; - } - - case Hydrating: - { - nextEffect.effectTag &= ~Hydrating; - break; + if (current !== null) { + commitDetachRef(current); } + } // The following switch statement is only concerned about placement, + // updates, and deletions. To avoid needing to add a case for every possible + // bitmap value, we remove the secondary effects from the effect tag and + // switch on that value. - case HydratingAndUpdate: - { - nextEffect.effectTag &= ~Hydrating; // Update - var _current2 = nextEffect.alternate; - commitWork(_current2, nextEffect); - break; - } + var primaryEffectTag = effectTag & (Placement | Update | Deletion | Hydrating); - case Update: - { - var _current3 = nextEffect.alternate; - commitWork(_current3, nextEffect); - break; - } + switch (primaryEffectTag) { + case Placement: + { + commitPlacement(nextEffect); // Clear the "placement" from effect tag so that we know that this is + // inserted, before any life-cycles like componentDidMount gets called. + // TODO: findDOMNode doesn't rely on this any more but isMounted does + // and isMounted is deprecated anyway so we should be able to kill this. - case Deletion: - { - commitDeletion(root, nextEffect, renderPriorityLevel); - break; - } - } // TODO: Only record a mutation effect if primaryEffectTag is non-zero. + nextEffect.effectTag &= ~Placement; + break; + } + case PlacementAndUpdate: + { + // Placement + commitPlacement(nextEffect); // Clear the "placement" from effect tag so that we know that this is + // inserted, before any life-cycles like componentDidMount gets called. - recordEffect(); - resetCurrentFiber(); - nextEffect = nextEffect.nextEffect; - } -} + nextEffect.effectTag &= ~Placement; // Update -function commitLayoutEffects(root, committedExpirationTime) { - // TODO: Should probably move the bulk of this function to commitWork. - while (nextEffect !== null) { - setCurrentFiber(nextEffect); - var effectTag = nextEffect.effectTag; + var _current = nextEffect.alternate; + commitWork(_current, nextEffect); + break; + } - if (effectTag & (Update | Callback)) { - recordEffect(); - var current$$1 = nextEffect.alternate; - commitLifeCycles(root, current$$1, nextEffect, committedExpirationTime); - } + case Hydrating: + { + nextEffect.effectTag &= ~Hydrating; + break; + } - if (effectTag & Ref) { - recordEffect(); - commitAttachRef(nextEffect); - } + case HydratingAndUpdate: + { + nextEffect.effectTag &= ~Hydrating; // Update - resetCurrentFiber(); - nextEffect = nextEffect.nextEffect; - } -} + var _current2 = nextEffect.alternate; + commitWork(_current2, nextEffect); + break; + } -function flushPassiveEffects() { - if (pendingPassiveEffectsRenderPriority !== NoPriority) { - var priorityLevel = pendingPassiveEffectsRenderPriority > NormalPriority ? NormalPriority : pendingPassiveEffectsRenderPriority; - pendingPassiveEffectsRenderPriority = NoPriority; - return runWithPriority$2(priorityLevel, flushPassiveEffectsImpl); - } -} + case Update: + { + var _current3 = nextEffect.alternate; + commitWork(_current3, nextEffect); + break; + } -function flushPassiveEffectsImpl() { - if (rootWithPendingPassiveEffects === null) { - return false; - } + case Deletion: + { + commitDeletion(root, nextEffect, renderPriorityLevel); + break; + } + } // TODO: Only record a mutation effect if primaryEffectTag is non-zero. - var root = rootWithPendingPassiveEffects; - var expirationTime = pendingPassiveEffectsExpirationTime; - rootWithPendingPassiveEffects = null; - pendingPassiveEffectsExpirationTime = NoWork; - if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) { - { - throw Error("Cannot flush passive effects while already rendering."); + recordEffect(); + resetCurrentFiber(); + nextEffect = nextEffect.nextEffect; } } - var prevExecutionContext = executionContext; - executionContext |= CommitContext; - var prevInteractions = pushInteractions(root); // Note: This currently assumes there are no passive effects on the root - // fiber, because the root is not part of its own effect list. This could - // change in the future. - - var effect = root.current.firstEffect; - - while (effect !== null) { - { - setCurrentFiber(effect); - invokeGuardedCallback(null, commitPassiveHookEffects, null, effect); + function commitLayoutEffects(root, committedExpirationTime) { + // TODO: Should probably move the bulk of this function to commitWork. + while (nextEffect !== null) { + setCurrentFiber(nextEffect); + var effectTag = nextEffect.effectTag; - if (hasCaughtError()) { - if (!(effect !== null)) { - { - throw Error("Should be working on an effect."); - } - } + if (effectTag & (Update | Callback)) { + recordEffect(); + var current = nextEffect.alternate; + commitLifeCycles(root, current, nextEffect); + } - var error = clearCaughtError(); - captureCommitPhaseError(effect, error); + if (effectTag & Ref) { + recordEffect(); + commitAttachRef(nextEffect); } resetCurrentFiber(); + nextEffect = nextEffect.nextEffect; } - - var nextNextEffect = effect.nextEffect; // Remove nextEffect pointer to assist GC - - effect.nextEffect = null; - effect = nextNextEffect; } - if (enableSchedulerTracing) { - popInteractions(prevInteractions); - finishPendingInteractions(root, expirationTime); + function flushPassiveEffects() { + if (pendingPassiveEffectsRenderPriority !== NoPriority) { + var priorityLevel = pendingPassiveEffectsRenderPriority > NormalPriority ? NormalPriority : pendingPassiveEffectsRenderPriority; + pendingPassiveEffectsRenderPriority = NoPriority; + return runWithPriority$1(priorityLevel, flushPassiveEffectsImpl); + } } - executionContext = prevExecutionContext; - flushSyncCallbackQueue(); // If additional passive effects were scheduled, increment a counter. If this - // exceeds the limit, we'll fire a warning. - - nestedPassiveUpdateCount = rootWithPendingPassiveEffects === null ? 0 : nestedPassiveUpdateCount + 1; - return true; -} - -function isAlreadyFailedLegacyErrorBoundary(instance) { - return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance); -} -function markLegacyErrorBoundaryAsFailed(instance) { - if (legacyErrorBoundariesThatAlreadyFailed === null) { - legacyErrorBoundariesThatAlreadyFailed = new Set([instance]); - } else { - legacyErrorBoundariesThatAlreadyFailed.add(instance); - } -} + function flushPassiveEffectsImpl() { + if (rootWithPendingPassiveEffects === null) { + return false; + } -function prepareToThrowUncaughtError(error) { - if (!hasUncaughtError) { - hasUncaughtError = true; - firstUncaughtError = error; - } -} + var root = rootWithPendingPassiveEffects; + var expirationTime = pendingPassiveEffectsExpirationTime; + rootWithPendingPassiveEffects = null; + pendingPassiveEffectsExpirationTime = NoWork; -var onUncaughtError = prepareToThrowUncaughtError; + if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) { + { + throw Error( "Cannot flush passive effects while already rendering." ); + } + } -function captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) { - var errorInfo = createCapturedValue(error, sourceFiber); - var update = createRootErrorUpdate(rootFiber, errorInfo, Sync); - enqueueUpdate(rootFiber, update); - var root = markUpdateTimeFromFiberToRoot(rootFiber, Sync); + var prevExecutionContext = executionContext; + executionContext |= CommitContext; + var prevInteractions = pushInteractions(root); - if (root !== null) { - ensureRootIsScheduled(root); - schedulePendingInteractions(root, Sync); - } -} + { + // Note: This currently assumes there are no passive effects on the root fiber + // because the root is not part of its own effect list. + // This could change in the future. + var _effect2 = root.current.firstEffect; -function captureCommitPhaseError(sourceFiber, error) { - if (sourceFiber.tag === HostRoot) { - // Error was thrown at the root. There is no parent, so the root - // itself should capture it. - captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error); - return; - } + while (_effect2 !== null) { + { + setCurrentFiber(_effect2); + invokeGuardedCallback(null, commitPassiveHookEffects, null, _effect2); - var fiber = sourceFiber.return; + if (hasCaughtError()) { + if (!(_effect2 !== null)) { + { + throw Error( "Should be working on an effect." ); + } + } - while (fiber !== null) { - if (fiber.tag === HostRoot) { - captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error); - return; - } else if (fiber.tag === ClassComponent) { - var ctor = fiber.type; - var instance = fiber.stateNode; + var _error5 = clearCaughtError(); - if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) { - var errorInfo = createCapturedValue(error, sourceFiber); - var update = createClassErrorUpdate(fiber, errorInfo, // TODO: This is always sync - Sync); - enqueueUpdate(fiber, update); - var root = markUpdateTimeFromFiberToRoot(fiber, Sync); + captureCommitPhaseError(_effect2, _error5); + } - if (root !== null) { - ensureRootIsScheduled(root); - schedulePendingInteractions(root, Sync); + resetCurrentFiber(); } - return; + var nextNextEffect = _effect2.nextEffect; // Remove nextEffect pointer to assist GC + + _effect2.nextEffect = null; + _effect2 = nextNextEffect; } } - fiber = fiber.return; - } -} -function pingSuspendedRoot(root, thenable, suspendedTime) { - var pingCache = root.pingCache; + { + popInteractions(prevInteractions); + finishPendingInteractions(root, expirationTime); + } + + executionContext = prevExecutionContext; + flushSyncCallbackQueue(); // If additional passive effects were scheduled, increment a counter. If this + // exceeds the limit, we'll fire a warning. - if (pingCache !== null) { - // The thenable resolved, so we no longer need to memoize, because it will - // never be thrown again. - pingCache.delete(thenable); + nestedPassiveUpdateCount = rootWithPendingPassiveEffects === null ? 0 : nestedPassiveUpdateCount + 1; + return true; } - if (workInProgressRoot === root && renderExpirationTime === suspendedTime) { - // Received a ping at the same priority level at which we're currently - // rendering. We might want to restart this render. This should mirror - // the logic of whether or not a root suspends once it completes. - // TODO: If we're rendering sync either due to Sync, Batched or expired, - // we should probably never restart. - // If we're suspended with delay, we'll always suspend so we can always - // restart. If we're suspended without any updates, it might be a retry. - // If it's early in the retry we can restart. We can't know for sure - // whether we'll eventually process an update during this render pass, - // but it's somewhat unlikely that we get to a ping before that, since - // getting to the root most update is usually very fast. - if (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && workInProgressRootLatestProcessedExpirationTime === Sync && now() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS) { - // Restart from the root. Don't need to schedule a ping because - // we're already working on this tree. - prepareFreshStack(root, renderExpirationTime); + function isAlreadyFailedLegacyErrorBoundary(instance) { + return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance); + } + function markLegacyErrorBoundaryAsFailed(instance) { + if (legacyErrorBoundariesThatAlreadyFailed === null) { + legacyErrorBoundariesThatAlreadyFailed = new Set([instance]); } else { - // Even though we can't restart right now, we might get an - // opportunity later. So we mark this render as having a ping. - workInProgressRootHasPendingPing = true; + legacyErrorBoundariesThatAlreadyFailed.add(instance); } + } - return; + function prepareToThrowUncaughtError(error) { + if (!hasUncaughtError) { + hasUncaughtError = true; + firstUncaughtError = error; + } } - if (!isRootSuspendedAtTime(root, suspendedTime)) { - // The root is no longer suspended at this time. - return; + var onUncaughtError = prepareToThrowUncaughtError; + + function captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) { + var errorInfo = createCapturedValue(error, sourceFiber); + var update = createRootErrorUpdate(rootFiber, errorInfo, Sync); + enqueueUpdate(rootFiber, update); + var root = markUpdateTimeFromFiberToRoot(rootFiber, Sync); + + if (root !== null) { + ensureRootIsScheduled(root); + schedulePendingInteractions(root, Sync); + } } - var lastPingedTime = root.lastPingedTime; + function captureCommitPhaseError(sourceFiber, error) { + if (sourceFiber.tag === HostRoot) { + // Error was thrown at the root. There is no parent, so the root + // itself should capture it. + captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error); + return; + } - if (lastPingedTime !== NoWork && lastPingedTime < suspendedTime) { - // There's already a lower priority ping scheduled. - return; - } // Mark the time at which this ping was scheduled. + var fiber = sourceFiber.return; + while (fiber !== null) { + if (fiber.tag === HostRoot) { + captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error); + return; + } else if (fiber.tag === ClassComponent) { + var ctor = fiber.type; + var instance = fiber.stateNode; + + if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) { + var errorInfo = createCapturedValue(error, sourceFiber); + var update = createClassErrorUpdate(fiber, errorInfo, // TODO: This is always sync + Sync); + enqueueUpdate(fiber, update); + var root = markUpdateTimeFromFiberToRoot(fiber, Sync); + + if (root !== null) { + ensureRootIsScheduled(root); + schedulePendingInteractions(root, Sync); + } - root.lastPingedTime = suspendedTime; + return; + } + } - if (root.finishedExpirationTime === suspendedTime) { - // If there's a pending fallback waiting to commit, throw it away. - root.finishedExpirationTime = NoWork; - root.finishedWork = null; + fiber = fiber.return; + } } + function pingSuspendedRoot(root, thenable, suspendedTime) { + var pingCache = root.pingCache; + + if (pingCache !== null) { + // The thenable resolved, so we no longer need to memoize, because it will + // never be thrown again. + pingCache.delete(thenable); + } + + if (workInProgressRoot === root && renderExpirationTime$1 === suspendedTime) { + // Received a ping at the same priority level at which we're currently + // rendering. We might want to restart this render. This should mirror + // the logic of whether or not a root suspends once it completes. + // TODO: If we're rendering sync either due to Sync, Batched or expired, + // we should probably never restart. + // If we're suspended with delay, we'll always suspend so we can always + // restart. If we're suspended without any updates, it might be a retry. + // If it's early in the retry we can restart. We can't know for sure + // whether we'll eventually process an update during this render pass, + // but it's somewhat unlikely that we get to a ping before that, since + // getting to the root most update is usually very fast. + if (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && workInProgressRootLatestProcessedExpirationTime === Sync && now() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS) { + // Restart from the root. Don't need to schedule a ping because + // we're already working on this tree. + prepareFreshStack(root, renderExpirationTime$1); + } else { + // Even though we can't restart right now, we might get an + // opportunity later. So we mark this render as having a ping. + workInProgressRootHasPendingPing = true; + } - ensureRootIsScheduled(root); - schedulePendingInteractions(root, suspendedTime); -} - -function retryTimedOutBoundary(boundaryFiber, retryTime) { - // The boundary fiber (a Suspense component or SuspenseList component) - // previously was rendered in its fallback state. One of the promises that - // suspended it has resolved, which means at least part of the tree was - // likely unblocked. Try rendering again, at a new expiration time. - if (retryTime === NoWork) { - var suspenseConfig = null; // Retries don't carry over the already committed update. + return; + } - var currentTime = requestCurrentTimeForUpdate(); - retryTime = computeExpirationForFiber(currentTime, boundaryFiber, suspenseConfig); - } // TODO: Special case idle priority? + if (!isRootSuspendedAtTime(root, suspendedTime)) { + // The root is no longer suspended at this time. + return; + } + var lastPingedTime = root.lastPingedTime; - var root = markUpdateTimeFromFiberToRoot(boundaryFiber, retryTime); + if (lastPingedTime !== NoWork && lastPingedTime < suspendedTime) { + // There's already a lower priority ping scheduled. + return; + } // Mark the time at which this ping was scheduled. - if (root !== null) { - ensureRootIsScheduled(root); - schedulePendingInteractions(root, retryTime); - } -} -function retryDehydratedSuspenseBoundary(boundaryFiber) { - var suspenseState = boundaryFiber.memoizedState; - var retryTime = NoWork; + root.lastPingedTime = suspendedTime; - if (suspenseState !== null) { - retryTime = suspenseState.retryTime; + ensureRootIsScheduled(root); + schedulePendingInteractions(root, suspendedTime); } - retryTimedOutBoundary(boundaryFiber, retryTime); -} -function resolveRetryThenable(boundaryFiber, thenable) { - var retryTime = NoWork; // Default + function retryTimedOutBoundary(boundaryFiber, retryTime) { + // The boundary fiber (a Suspense component or SuspenseList component) + // previously was rendered in its fallback state. One of the promises that + // suspended it has resolved, which means at least part of the tree was + // likely unblocked. Try rendering again, at a new expiration time. + if (retryTime === NoWork) { + var suspenseConfig = null; // Retries don't carry over the already committed update. - var retryCache; + var currentTime = requestCurrentTimeForUpdate(); + retryTime = computeExpirationForFiber(currentTime, boundaryFiber, suspenseConfig); + } // TODO: Special case idle priority? - if (enableSuspenseServerRenderer) { - switch (boundaryFiber.tag) { - case SuspenseComponent: - retryCache = boundaryFiber.stateNode; - var suspenseState = boundaryFiber.memoizedState; - if (suspenseState !== null) { - retryTime = suspenseState.retryTime; - } + var root = markUpdateTimeFromFiberToRoot(boundaryFiber, retryTime); - break; + if (root !== null) { + ensureRootIsScheduled(root); + schedulePendingInteractions(root, retryTime); + } + } + function resolveRetryThenable(boundaryFiber, thenable) { + var retryTime = NoWork; // Default - case SuspenseListComponent: - retryCache = boundaryFiber.stateNode; - break; + var retryCache; - default: - { - { - throw Error("Pinged unknown suspense boundary type. This is probably a bug in React."); - } - } + { + retryCache = boundaryFiber.stateNode; + } + if (retryCache !== null) { + // The thenable resolved, so we no longer need to memoize, because it will + // never be thrown again. + retryCache.delete(thenable); } - } else { - retryCache = boundaryFiber.stateNode; - } - if (retryCache !== null) { - // The thenable resolved, so we no longer need to memoize, because it will - // never be thrown again. - retryCache.delete(thenable); + retryTimedOutBoundary(boundaryFiber, retryTime); + } // Computes the next Just Noticeable Difference (JND) boundary. + // The theory is that a person can't tell the difference between small differences in time. + // Therefore, if we wait a bit longer than necessary that won't translate to a noticeable + // difference in the experience. However, waiting for longer might mean that we can avoid + // showing an intermediate loading state. The longer we have already waited, the harder it + // is to tell small differences in time. Therefore, the longer we've already waited, + // the longer we can wait additionally. At some point we have to give up though. + // We pick a train model where the next boundary commits at a consistent schedule. + // These particular numbers are vague estimates. We expect to adjust them based on research. + + function jnd(timeElapsed) { + return timeElapsed < 120 ? 120 : timeElapsed < 480 ? 480 : timeElapsed < 1080 ? 1080 : timeElapsed < 1920 ? 1920 : timeElapsed < 3000 ? 3000 : timeElapsed < 4320 ? 4320 : ceil(timeElapsed / 1960) * 1960; } - retryTimedOutBoundary(boundaryFiber, retryTime); -} // Computes the next Just Noticeable Difference (JND) boundary. -// The theory is that a person can't tell the difference between small differences in time. -// Therefore, if we wait a bit longer than necessary that won't translate to a noticeable -// difference in the experience. However, waiting for longer might mean that we can avoid -// showing an intermediate loading state. The longer we have already waited, the harder it -// is to tell small differences in time. Therefore, the longer we've already waited, -// the longer we can wait additionally. At some point we have to give up though. -// We pick a train model where the next boundary commits at a consistent schedule. -// These particular numbers are vague estimates. We expect to adjust them based on research. + function computeMsUntilSuspenseLoadingDelay(mostRecentEventTime, committedExpirationTime, suspenseConfig) { + var busyMinDurationMs = suspenseConfig.busyMinDurationMs | 0; -function jnd(timeElapsed) { - return timeElapsed < 120 ? 120 : timeElapsed < 480 ? 480 : timeElapsed < 1080 ? 1080 : timeElapsed < 1920 ? 1920 : timeElapsed < 3000 ? 3000 : timeElapsed < 4320 ? 4320 : ceil(timeElapsed / 1960) * 1960; -} + if (busyMinDurationMs <= 0) { + return 0; + } -function computeMsUntilSuspenseLoadingDelay(mostRecentEventTime, committedExpirationTime, suspenseConfig) { - var busyMinDurationMs = suspenseConfig.busyMinDurationMs | 0; + var busyDelayMs = suspenseConfig.busyDelayMs | 0; // Compute the time until this render pass would expire. - if (busyMinDurationMs <= 0) { - return 0; - } + var currentTimeMs = now(); + var eventTimeMs = inferTimeFromExpirationTimeWithSuspenseConfig(mostRecentEventTime, suspenseConfig); + var timeElapsed = currentTimeMs - eventTimeMs; - var busyDelayMs = suspenseConfig.busyDelayMs | 0; // Compute the time until this render pass would expire. + if (timeElapsed <= busyDelayMs) { + // If we haven't yet waited longer than the initial delay, we don't + // have to wait any additional time. + return 0; + } - var currentTimeMs = now(); - var eventTimeMs = inferTimeFromExpirationTimeWithSuspenseConfig(mostRecentEventTime, suspenseConfig); - var timeElapsed = currentTimeMs - eventTimeMs; + var msUntilTimeout = busyDelayMs + busyMinDurationMs - timeElapsed; // This is the value that is passed to `setTimeout`. - if (timeElapsed <= busyDelayMs) { - // If we haven't yet waited longer than the initial delay, we don't - // have to wait any additional time. - return 0; + return msUntilTimeout; } - var msUntilTimeout = busyDelayMs + busyMinDurationMs - timeElapsed; // This is the value that is passed to `setTimeout`. - - return msUntilTimeout; -} - -function checkForNestedUpdates() { - if (nestedUpdateCount > NESTED_UPDATE_LIMIT) { - nestedUpdateCount = 0; - rootWithNestedUpdates = null; + function checkForNestedUpdates() { + if (nestedUpdateCount > NESTED_UPDATE_LIMIT) { + nestedUpdateCount = 0; + rootWithNestedUpdates = null; - { { - throw Error("Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops."); + { + throw Error( "Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops." ); + } } } - } - { - if (nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT) { - nestedPassiveUpdateCount = 0; - warning$1(false, 'Maximum update depth exceeded. This can happen when a component ' + "calls setState inside useEffect, but useEffect either doesn't " + 'have a dependency array, or one of the dependencies changes on ' + 'every render.'); + { + if (nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT) { + nestedPassiveUpdateCount = 0; + + error('Maximum update depth exceeded. This can happen when a component ' + "calls setState inside useEffect, but useEffect either doesn't " + 'have a dependency array, or one of the dependencies changes on ' + 'every render.'); + } } } -} -function flushRenderPhaseStrictModeWarningsInDEV() { - { - ReactStrictModeWarnings.flushLegacyContextWarning(); + function flushRenderPhaseStrictModeWarningsInDEV() { + { + ReactStrictModeWarnings.flushLegacyContextWarning(); - if (warnAboutDeprecatedLifecycles) { - ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings(); + { + ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings(); + } } } -} -function stopFinishedWorkLoopTimer() { - var didCompleteRoot = true; - stopWorkLoopTimer(interruptedBy, didCompleteRoot); - interruptedBy = null; -} + function stopFinishedWorkLoopTimer() { + var didCompleteRoot = true; + stopWorkLoopTimer(interruptedBy, didCompleteRoot); + interruptedBy = null; + } -function stopInterruptedWorkLoopTimer() { - // TODO: Track which fiber caused the interruption. - var didCompleteRoot = false; - stopWorkLoopTimer(interruptedBy, didCompleteRoot); - interruptedBy = null; -} + function stopInterruptedWorkLoopTimer() { + // TODO: Track which fiber caused the interruption. + var didCompleteRoot = false; + stopWorkLoopTimer(interruptedBy, didCompleteRoot); + interruptedBy = null; + } -function checkForInterruption(fiberThatReceivedUpdate, updateExpirationTime) { - if (enableUserTimingAPI && workInProgressRoot !== null && updateExpirationTime > renderExpirationTime) { - interruptedBy = fiberThatReceivedUpdate; + function checkForInterruption(fiberThatReceivedUpdate, updateExpirationTime) { + if ( workInProgressRoot !== null && updateExpirationTime > renderExpirationTime$1) { + interruptedBy = fiberThatReceivedUpdate; + } } -} -var didWarnStateUpdateForUnmountedComponent = null; + var didWarnStateUpdateForUnmountedComponent = null; -function warnAboutUpdateOnUnmountedFiberInDEV(fiber) { - { - var tag = fiber.tag; + function warnAboutUpdateOnUnmountedFiberInDEV(fiber) { + { + var tag = fiber.tag; - if (tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent) { - // Only warn for user-defined components, not internal ones like Suspense. - return; - } // We show the whole stack but dedupe on the top component's name because - // the problematic code almost always lies inside that component. + if (tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent && tag !== Block) { + // Only warn for user-defined components, not internal ones like Suspense. + return; + } + // the problematic code almost always lies inside that component. - var componentName = getComponentName(fiber.type) || 'ReactComponent'; + var componentName = getComponentName(fiber.type) || 'ReactComponent'; - if (didWarnStateUpdateForUnmountedComponent !== null) { - if (didWarnStateUpdateForUnmountedComponent.has(componentName)) { - return; + if (didWarnStateUpdateForUnmountedComponent !== null) { + if (didWarnStateUpdateForUnmountedComponent.has(componentName)) { + return; + } + + didWarnStateUpdateForUnmountedComponent.add(componentName); + } else { + didWarnStateUpdateForUnmountedComponent = new Set([componentName]); } - didWarnStateUpdateForUnmountedComponent.add(componentName); - } else { - didWarnStateUpdateForUnmountedComponent = new Set([componentName]); + error("Can't perform a React state update on an unmounted component. This " + 'is a no-op, but it indicates a memory leak in your application. To ' + 'fix, cancel all subscriptions and asynchronous tasks in %s.%s', tag === ClassComponent ? 'the componentWillUnmount method' : 'a useEffect cleanup function', getStackByFiberInDevAndProd(fiber)); } - - warningWithoutStack$1(false, "Can't perform a React state update on an unmounted component. This " + 'is a no-op, but it indicates a memory leak in your application. To ' + 'fix, cancel all subscriptions and asynchronous tasks in %s.%s', tag === ClassComponent ? 'the componentWillUnmount method' : 'a useEffect cleanup function', getStackByFiberInDevAndProd(fiber)); } -} -var beginWork$$1; + var beginWork$1; -if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) { - var dummyFiber = null; + { + var dummyFiber = null; - beginWork$$1 = function (current$$1, unitOfWork, expirationTime) { - // If a component throws an error, we replay it again in a synchronously - // dispatched event, so that the debugger will treat it as an uncaught - // error See ReactErrorUtils for more information. - // Before entering the begin phase, copy the work-in-progress onto a dummy - // fiber. If beginWork throws, we'll use this to reset the state. - var originalWorkInProgressCopy = assignFiberPropertiesInDEV(dummyFiber, unitOfWork); + beginWork$1 = function (current, unitOfWork, expirationTime) { + // If a component throws an error, we replay it again in a synchronously + // dispatched event, so that the debugger will treat it as an uncaught + // error See ReactErrorUtils for more information. + // Before entering the begin phase, copy the work-in-progress onto a dummy + // fiber. If beginWork throws, we'll use this to reset the state. + var originalWorkInProgressCopy = assignFiberPropertiesInDEV(dummyFiber, unitOfWork); - try { - return beginWork$1(current$$1, unitOfWork, expirationTime); - } catch (originalError) { - if (originalError !== null && typeof originalError === 'object' && typeof originalError.then === 'function') { - // Don't replay promises. Treat everything else like an error. - throw originalError; - } // Keep this code in sync with handleError; any changes here must have - // corresponding changes there. + try { + return beginWork(current, unitOfWork, expirationTime); + } catch (originalError) { + if (originalError !== null && typeof originalError === 'object' && typeof originalError.then === 'function') { + // Don't replay promises. Treat everything else like an error. + throw originalError; + } // Keep this code in sync with handleError; any changes here must have + // corresponding changes there. - resetContextDependencies(); - resetHooks(); // Don't reset current debug fiber, since we're about to work on the - // same fiber again. - // Unwind the failed stack frame + resetContextDependencies(); + resetHooksAfterThrow(); // Don't reset current debug fiber, since we're about to work on the + // same fiber again. + // Unwind the failed stack frame - unwindInterruptedWork(unitOfWork); // Restore the original properties of the fiber. + unwindInterruptedWork(unitOfWork); // Restore the original properties of the fiber. - assignFiberPropertiesInDEV(unitOfWork, originalWorkInProgressCopy); + assignFiberPropertiesInDEV(unitOfWork, originalWorkInProgressCopy); - if (enableProfilerTimer && unitOfWork.mode & ProfileMode) { - // Reset the profiler timer. - startProfilerTimer(unitOfWork); - } // Run beginWork again. + if ( unitOfWork.mode & ProfileMode) { + // Reset the profiler timer. + startProfilerTimer(unitOfWork); + } // Run beginWork again. - invokeGuardedCallback(null, beginWork$1, null, current$$1, unitOfWork, expirationTime); + invokeGuardedCallback(null, beginWork, null, current, unitOfWork, expirationTime); - if (hasCaughtError()) { - var replayError = clearCaughtError(); // `invokeGuardedCallback` sometimes sets an expando `_suppressLogging`. - // Rethrow this error instead of the original one. + if (hasCaughtError()) { + var replayError = clearCaughtError(); // `invokeGuardedCallback` sometimes sets an expando `_suppressLogging`. + // Rethrow this error instead of the original one. - throw replayError; - } else { - // This branch is reachable if the render phase is impure. - throw originalError; + throw replayError; + } else { + // This branch is reachable if the render phase is impure. + throw originalError; + } } - } - }; -} else { - beginWork$$1 = beginWork$1; -} + }; + } -var didWarnAboutUpdateInRender = false; -var didWarnAboutUpdateInGetChildContext = false; + var didWarnAboutUpdateInRender = false; + var didWarnAboutUpdateInRenderForAnotherComponent; -function warnAboutInvalidUpdatesOnClassComponentsInDEV(fiber) { { - if (fiber.tag === ClassComponent) { - switch (phase) { - case 'getChildContext': - if (didWarnAboutUpdateInGetChildContext) { - return; - } + didWarnAboutUpdateInRenderForAnotherComponent = new Set(); + } - warningWithoutStack$1(false, 'setState(...): Cannot call setState() inside getChildContext()'); - didWarnAboutUpdateInGetChildContext = true; - break; + function warnAboutRenderPhaseUpdatesInDEV(fiber) { + { + if (isRendering && (executionContext & RenderContext) !== NoContext) { + switch (fiber.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: + { + var renderingComponentName = workInProgress && getComponentName(workInProgress.type) || 'Unknown'; // Dedupe by the rendering component because it's the one that needs to be fixed. - case 'render': - if (didWarnAboutUpdateInRender) { - return; - } + var dedupeKey = renderingComponentName; - warningWithoutStack$1(false, 'Cannot update during an existing state transition (such as ' + 'within `render`). Render methods should be a pure function of ' + 'props and state.'); - didWarnAboutUpdateInRender = true; - break; + if (!didWarnAboutUpdateInRenderForAnotherComponent.has(dedupeKey)) { + didWarnAboutUpdateInRenderForAnotherComponent.add(dedupeKey); + var setStateComponentName = getComponentName(fiber.type) || 'Unknown'; + + error('Cannot update a component (`%s`) while rendering a ' + 'different component (`%s`). To locate the bad setState() call inside `%s`, ' + 'follow the stack trace as described in https://fb.me/setstate-in-render', setStateComponentName, renderingComponentName, renderingComponentName); + } + + break; + } + + case ClassComponent: + { + if (!didWarnAboutUpdateInRender) { + error('Cannot update during an existing state transition (such as ' + 'within `render`). Render methods should be a pure ' + 'function of props and state.'); + + didWarnAboutUpdateInRender = true; + } + + break; + } + } } } - } -} // a 'shared' variable that changes when act() opens/closes in tests. + } // a 'shared' variable that changes when act() opens/closes in tests. -var IsThisRendererActing = { - current: false -}; -function warnIfNotScopedWithMatchingAct(fiber) { - { - if (warnsIfNotActing === true && IsSomeRendererActing.current === true && IsThisRendererActing.current !== true) { - warningWithoutStack$1(false, "It looks like you're using the wrong act() around your test interactions.\n" + 'Be sure to use the matching version of act() corresponding to your renderer:\n\n' + '// for react-dom:\n' + "import {act} from 'react-dom/test-utils';\n" + '// ...\n' + 'act(() => ...);\n\n' + '// for react-test-renderer:\n' + "import TestRenderer from 'react-test-renderer';\n" + 'const {act} = TestRenderer;\n' + '// ...\n' + 'act(() => ...);' + '%s', getStackByFiberInDevAndProd(fiber)); + var IsThisRendererActing = { + current: false + }; + function warnIfNotScopedWithMatchingAct(fiber) { + { + if ( IsSomeRendererActing.current === true && IsThisRendererActing.current !== true) { + error("It looks like you're using the wrong act() around your test interactions.\n" + 'Be sure to use the matching version of act() corresponding to your renderer:\n\n' + '// for react-dom:\n' + "import {act} from 'react-dom/test-utils';\n" + '// ...\n' + 'act(() => ...);\n\n' + '// for react-test-renderer:\n' + "import TestRenderer from 'react-test-renderer';\n" + 'const {act} = TestRenderer;\n' + '// ...\n' + 'act(() => ...);' + '%s', getStackByFiberInDevAndProd(fiber)); + } } } -} -function warnIfNotCurrentlyActingEffectsInDEV(fiber) { - { - if (warnsIfNotActing === true && (fiber.mode & StrictMode) !== NoMode && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) { - warningWithoutStack$1(false, 'An update to %s ran an effect, but was not wrapped in act(...).\n\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\n\n' + 'act(() => {\n' + ' /* fire events that update state */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see " + 'in the browser.' + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber)); + function warnIfNotCurrentlyActingEffectsInDEV(fiber) { + { + if ( (fiber.mode & StrictMode) !== NoMode && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) { + error('An update to %s ran an effect, but was not wrapped in act(...).\n\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\n\n' + 'act(() => {\n' + ' /* fire events that update state */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see " + 'in the browser.' + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber)); + } } } -} -function warnIfNotCurrentlyActingUpdatesInDEV(fiber) { - { - if (warnsIfNotActing === true && executionContext === NoContext && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) { - warningWithoutStack$1(false, 'An update to %s inside a test was not wrapped in act(...).\n\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\n\n' + 'act(() => {\n' + ' /* fire events that update state */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see " + 'in the browser.' + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber)); + function warnIfNotCurrentlyActingUpdatesInDEV(fiber) { + { + if ( executionContext === NoContext && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) { + error('An update to %s inside a test was not wrapped in act(...).\n\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\n\n' + 'act(() => {\n' + ' /* fire events that update state */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see " + 'in the browser.' + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber)); + } } } -} -var warnIfNotCurrentlyActingUpdatesInDev = warnIfNotCurrentlyActingUpdatesInDEV; // In tests, we want to enforce a mocked scheduler. + var warnIfNotCurrentlyActingUpdatesInDev = warnIfNotCurrentlyActingUpdatesInDEV; // In tests, we want to enforce a mocked scheduler. -var didWarnAboutUnmockedScheduler = false; // TODO Before we release concurrent mode, revisit this and decide whether a mocked -// scheduler is the actual recommendation. The alternative could be a testing build, -// a new lib, or whatever; we dunno just yet. This message is for early adopters -// to get their tests right. + var didWarnAboutUnmockedScheduler = false; // TODO Before we release concurrent mode, revisit this and decide whether a mocked + // scheduler is the actual recommendation. The alternative could be a testing build, + // a new lib, or whatever; we dunno just yet. This message is for early adopters + // to get their tests right. -function warnIfUnmockedScheduler(fiber) { - { - if (didWarnAboutUnmockedScheduler === false && unstable_flushAllWithoutAsserting === undefined) { - if (fiber.mode & BlockingMode || fiber.mode & ConcurrentMode) { - didWarnAboutUnmockedScheduler = true; - warningWithoutStack$1(false, 'In Concurrent or Sync modes, the "scheduler" module needs to be mocked ' + 'to guarantee consistent behaviour across tests and browsers. ' + 'For example, with jest: \n' + "jest.mock('scheduler', () => require('scheduler/unstable_mock'));\n\n" + 'For more info, visit https://fb.me/react-mock-scheduler'); - } else if (warnAboutUnmockedScheduler === true) { - didWarnAboutUnmockedScheduler = true; - warningWithoutStack$1(false, 'Starting from React v17, the "scheduler" module will need to be mocked ' + 'to guarantee consistent behaviour across tests and browsers. ' + 'For example, with jest: \n' + "jest.mock('scheduler', () => require('scheduler/unstable_mock'));\n\n" + 'For more info, visit https://fb.me/react-mock-scheduler'); + function warnIfUnmockedScheduler(fiber) { + { + if (didWarnAboutUnmockedScheduler === false && unstable_flushAllWithoutAsserting === undefined) { + if (fiber.mode & BlockingMode || fiber.mode & ConcurrentMode) { + didWarnAboutUnmockedScheduler = true; + + error('In Concurrent or Sync modes, the "scheduler" module needs to be mocked ' + 'to guarantee consistent behaviour across tests and browsers. ' + 'For example, with jest: \n' + "jest.mock('scheduler', () => require('scheduler/unstable_mock'));\n\n" + 'For more info, visit https://fb.me/react-mock-scheduler'); + } } } } -} -var componentsThatTriggeredHighPriSuspend = null; -function checkForWrongSuspensePriorityInDEV(sourceFiber) { - { - var currentPriorityLevel = getCurrentPriorityLevel(); - - if ((sourceFiber.mode & ConcurrentMode) !== NoEffect && (currentPriorityLevel === UserBlockingPriority$2 || currentPriorityLevel === ImmediatePriority)) { - var workInProgressNode = sourceFiber; - - while (workInProgressNode !== null) { - // Add the component that triggered the suspense - var current$$1 = workInProgressNode.alternate; - - if (current$$1 !== null) { - // TODO: warn component that triggers the high priority - // suspend is the HostRoot - switch (workInProgressNode.tag) { - case ClassComponent: - // Loop through the component's update queue and see whether the component - // has triggered any high priority updates - var updateQueue = current$$1.updateQueue; - - if (updateQueue !== null) { - var update = updateQueue.firstUpdate; - - while (update !== null) { - var priorityLevel = update.priority; - - if (priorityLevel === UserBlockingPriority$2 || priorityLevel === ImmediatePriority) { - if (componentsThatTriggeredHighPriSuspend === null) { - componentsThatTriggeredHighPriSuspend = new Set([getComponentName(workInProgressNode.type)]); - } else { - componentsThatTriggeredHighPriSuspend.add(getComponentName(workInProgressNode.type)); - } - break; - } - - update = update.next; - } - } - - break; - - case FunctionComponent: - case ForwardRef: - case SimpleMemoComponent: - if (workInProgressNode.memoizedState !== null && workInProgressNode.memoizedState.baseUpdate !== null) { - var _update = workInProgressNode.memoizedState.baseUpdate; // Loop through the functional component's memoized state to see whether - // the component has triggered any high pri updates - - while (_update !== null) { - var priority = _update.priority; - - if (priority === UserBlockingPriority$2 || priority === ImmediatePriority) { - if (componentsThatTriggeredHighPriSuspend === null) { - componentsThatTriggeredHighPriSuspend = new Set([getComponentName(workInProgressNode.type)]); - } else { - componentsThatTriggeredHighPriSuspend.add(getComponentName(workInProgressNode.type)); - } + function computeThreadID(root, expirationTime) { + // Interaction threads are unique per root and expiration time. + return expirationTime * 1000 + root.interactionThreadID; + } - break; - } + function markSpawnedWork(expirationTime) { - if (_update.next === workInProgressNode.memoizedState.baseUpdate) { - break; - } + if (spawnedWorkDuringRender === null) { + spawnedWorkDuringRender = [expirationTime]; + } else { + spawnedWorkDuringRender.push(expirationTime); + } + } - _update = _update.next; - } - } + function scheduleInteractions(root, expirationTime, interactions) { - break; + if (interactions.size > 0) { + var pendingInteractionMap = root.pendingInteractionMap; + var pendingInteractions = pendingInteractionMap.get(expirationTime); - default: - break; + if (pendingInteractions != null) { + interactions.forEach(function (interaction) { + if (!pendingInteractions.has(interaction)) { + // Update the pending async work count for previously unscheduled interaction. + interaction.__count++; } - } - workInProgressNode = workInProgressNode.return; + pendingInteractions.add(interaction); + }); + } else { + pendingInteractionMap.set(expirationTime, new Set(interactions)); // Update the pending async work count for the current interactions. + + interactions.forEach(function (interaction) { + interaction.__count++; + }); } - } - } -} -function flushSuspensePriorityWarningInDEV() { - { - if (componentsThatTriggeredHighPriSuspend !== null) { - var componentNames = []; - componentsThatTriggeredHighPriSuspend.forEach(function (name) { - return componentNames.push(name); - }); - componentsThatTriggeredHighPriSuspend = null; + var subscriber = __subscriberRef.current; - if (componentNames.length > 0) { - warningWithoutStack$1(false, '%s triggered a user-blocking update that suspended.' + '\n\n' + 'The fix is to split the update into multiple parts: a user-blocking ' + 'update to provide immediate feedback, and another update that ' + 'triggers the bulk of the changes.' + '\n\n' + 'Refer to the documentation for useTransition to learn how ' + 'to implement this pattern.', // TODO: Add link to React docs with more information, once it exists - componentNames.sort().join(', ')); + if (subscriber !== null) { + var threadID = computeThreadID(root, expirationTime); + subscriber.onWorkScheduled(interactions, threadID); } } } -} - -function computeThreadID(root, expirationTime) { - // Interaction threads are unique per root and expiration time. - return expirationTime * 1000 + root.interactionThreadID; -} -function markSpawnedWork(expirationTime) { - if (!enableSchedulerTracing) { - return; - } + function schedulePendingInteractions(root, expirationTime) { - if (spawnedWorkDuringRender === null) { - spawnedWorkDuringRender = [expirationTime]; - } else { - spawnedWorkDuringRender.push(expirationTime); + scheduleInteractions(root, expirationTime, __interactionsRef.current); } -} -function scheduleInteractions(root, expirationTime, interactions) { - if (!enableSchedulerTracing) { - return; - } + function startWorkOnPendingInteractions(root, expirationTime) { + // we can accurately attribute time spent working on it, And so that cascading + // work triggered during the render phase will be associated with it. - if (interactions.size > 0) { - var pendingInteractionMap = root.pendingInteractionMap; - var pendingInteractions = pendingInteractionMap.get(expirationTime); - if (pendingInteractions != null) { - interactions.forEach(function (interaction) { - if (!pendingInteractions.has(interaction)) { - // Update the pending async work count for previously unscheduled interaction. - interaction.__count++; - } + var interactions = new Set(); + root.pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) { + if (scheduledExpirationTime >= expirationTime) { + scheduledInteractions.forEach(function (interaction) { + return interactions.add(interaction); + }); + } + }); // Store the current set of interactions on the FiberRoot for a few reasons: + // We can re-use it in hot functions like performConcurrentWorkOnRoot() + // without having to recalculate it. We will also use it in commitWork() to + // pass to any Profiler onRender() hooks. This also provides DevTools with a + // way to access it when the onCommitRoot() hook is called. - pendingInteractions.add(interaction); - }); - } else { - pendingInteractionMap.set(expirationTime, new Set(interactions)); // Update the pending async work count for the current interactions. + root.memoizedInteractions = interactions; - interactions.forEach(function (interaction) { - interaction.__count++; - }); - } + if (interactions.size > 0) { + var subscriber = __subscriberRef.current; - var subscriber = __subscriberRef.current; + if (subscriber !== null) { + var threadID = computeThreadID(root, expirationTime); - if (subscriber !== null) { - var threadID = computeThreadID(root, expirationTime); - subscriber.onWorkScheduled(interactions, threadID); + try { + subscriber.onWorkStarted(interactions, threadID); + } catch (error) { + // If the subscriber throws, rethrow it in a separate task + scheduleCallback(ImmediatePriority, function () { + throw error; + }); + } + } } } -} - -function schedulePendingInteractions(root, expirationTime) { - // This is called when work is scheduled on a root. - // It associates the current interactions with the newly-scheduled expiration. - // They will be restored when that expiration is later committed. - if (!enableSchedulerTracing) { - return; - } - scheduleInteractions(root, expirationTime, __interactionsRef.current); -} + function finishPendingInteractions(root, committedExpirationTime) { -function startWorkOnPendingInteractions(root, expirationTime) { - // This is called when new work is started on a root. - if (!enableSchedulerTracing) { - return; - } // Determine which interactions this batch of work currently includes, So that - // we can accurately attribute time spent working on it, And so that cascading - // work triggered during the render phase will be associated with it. + var earliestRemainingTimeAfterCommit = root.firstPendingTime; + var subscriber; + try { + subscriber = __subscriberRef.current; - var interactions = new Set(); - root.pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) { - if (scheduledExpirationTime >= expirationTime) { - scheduledInteractions.forEach(function (interaction) { - return interactions.add(interaction); + if (subscriber !== null && root.memoizedInteractions.size > 0) { + var threadID = computeThreadID(root, committedExpirationTime); + subscriber.onWorkStopped(root.memoizedInteractions, threadID); + } + } catch (error) { + // If the subscriber throws, rethrow it in a separate task + scheduleCallback(ImmediatePriority, function () { + throw error; + }); + } finally { + // Clear completed interactions from the pending Map. + // Unless the render was suspended or cascading work was scheduled, + // In which case– leave pending interactions until the subsequent render. + var pendingInteractionMap = root.pendingInteractionMap; + pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) { + // Only decrement the pending interaction count if we're done. + // If there's still work at the current priority, + // That indicates that we are waiting for suspense data. + if (scheduledExpirationTime > earliestRemainingTimeAfterCommit) { + pendingInteractionMap.delete(scheduledExpirationTime); + scheduledInteractions.forEach(function (interaction) { + interaction.__count--; + + if (subscriber !== null && interaction.__count === 0) { + try { + subscriber.onInteractionScheduledWorkCompleted(interaction); + } catch (error) { + // If the subscriber throws, rethrow it in a separate task + scheduleCallback(ImmediatePriority, function () { + throw error; + }); + } + } + }); + } }); } - }); // Store the current set of interactions on the FiberRoot for a few reasons: - // We can re-use it in hot functions like performConcurrentWorkOnRoot() - // without having to recalculate it. We will also use it in commitWork() to - // pass to any Profiler onRender() hooks. This also provides DevTools with a - // way to access it when the onCommitRoot() hook is called. - - root.memoizedInteractions = interactions; + } - if (interactions.size > 0) { - var subscriber = __subscriberRef.current; + var onScheduleFiberRoot = null; + var onCommitFiberRoot = null; + var onCommitFiberUnmount = null; + var hasLoggedError = false; + var isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined'; + function injectInternals(internals) { + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') { + // No DevTools + return false; + } - if (subscriber !== null) { - var threadID = computeThreadID(root, expirationTime); + var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__; - try { - subscriber.onWorkStarted(interactions, threadID); - } catch (error) { - // If the subscriber throws, rethrow it in a separate task - scheduleCallback(ImmediatePriority, function () { - throw error; - }); - } + if (hook.isDisabled) { + // This isn't a real property on the hook, but it can be set to opt out + // of DevTools integration and associated warnings and logs. + // https://github.com/facebook/react/issues/3877 + return true; } - } -} - -function finishPendingInteractions(root, committedExpirationTime) { - if (!enableSchedulerTracing) { - return; - } - var earliestRemainingTimeAfterCommit = root.firstPendingTime; - var subscriber; + if (!hook.supportsFiber) { + { + error('The installed version of React DevTools is too old and will not work ' + 'with the current version of React. Please update React DevTools. ' + 'https://fb.me/react-devtools'); + } // DevTools exists, even though it doesn't support Fiber. - try { - subscriber = __subscriberRef.current; - if (subscriber !== null && root.memoizedInteractions.size > 0) { - var threadID = computeThreadID(root, committedExpirationTime); - subscriber.onWorkStopped(root.memoizedInteractions, threadID); + return true; } - } catch (error) { - // If the subscriber throws, rethrow it in a separate task - scheduleCallback(ImmediatePriority, function () { - throw error; - }); - } finally { - // Clear completed interactions from the pending Map. - // Unless the render was suspended or cascading work was scheduled, - // In which case– leave pending interactions until the subsequent render. - var pendingInteractionMap = root.pendingInteractionMap; - pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) { - // Only decrement the pending interaction count if we're done. - // If there's still work at the current priority, - // That indicates that we are waiting for suspense data. - if (scheduledExpirationTime > earliestRemainingTimeAfterCommit) { - pendingInteractionMap.delete(scheduledExpirationTime); - scheduledInteractions.forEach(function (interaction) { - interaction.__count--; - if (subscriber !== null && interaction.__count === 0) { + try { + var rendererID = hook.inject(internals); // We have successfully injected, so now it is safe to set up hooks. + + if (true) { + // Only used by Fast Refresh + if (typeof hook.onScheduleFiberRoot === 'function') { + onScheduleFiberRoot = function (root, children) { try { - subscriber.onInteractionScheduledWorkCompleted(interaction); - } catch (error) { - // If the subscriber throws, rethrow it in a separate task - scheduleCallback(ImmediatePriority, function () { - throw error; - }); + hook.onScheduleFiberRoot(rendererID, root, children); + } catch (err) { + if (true && !hasLoggedError) { + hasLoggedError = true; + + error('React instrumentation encountered an error: %s', err); + } } - } - }); + }; + } } - }); - } -} - -var onCommitFiberRoot = null; -var onCommitFiberUnmount = null; -var hasLoggedError = false; -var isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined'; -function injectInternals(internals) { - if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') { - // No DevTools - return false; - } - - var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__; - - if (hook.isDisabled) { - // This isn't a real property on the hook, but it can be set to opt out - // of DevTools integration and associated warnings and logs. - // https://github.com/facebook/react/issues/3877 - return true; - } - - if (!hook.supportsFiber) { - { - warningWithoutStack$1(false, 'The installed version of React DevTools is too old and will not work ' + 'with the current version of React. Please update React DevTools. ' + 'https://fb.me/react-devtools'); - } // DevTools exists, even though it doesn't support Fiber. - - - return true; - } - try { - var rendererID = hook.inject(internals); // We have successfully injected, so now it is safe to set up hooks. + onCommitFiberRoot = function (root, expirationTime) { + try { + var didError = (root.current.effectTag & DidCapture) === DidCapture; - onCommitFiberRoot = function (root, expirationTime) { - try { - var didError = (root.current.effectTag & DidCapture) === DidCapture; + if (enableProfilerTimer) { + var currentTime = getCurrentTime(); + var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime); + hook.onCommitFiberRoot(rendererID, root, priorityLevel, didError); + } else { + hook.onCommitFiberRoot(rendererID, root, undefined, didError); + } + } catch (err) { + if (true) { + if (!hasLoggedError) { + hasLoggedError = true; - if (enableProfilerTimer) { - var currentTime = getCurrentTime(); - var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime); - hook.onCommitFiberRoot(rendererID, root, priorityLevel, didError); - } else { - hook.onCommitFiberRoot(rendererID, root, undefined, didError); - } - } catch (err) { - if (true && !hasLoggedError) { - hasLoggedError = true; - warningWithoutStack$1(false, 'React DevTools encountered an error: %s', err); + error('React instrumentation encountered an error: %s', err); + } + } } - } - }; + }; - onCommitFiberUnmount = function (fiber) { - try { - hook.onCommitFiberUnmount(rendererID, fiber); - } catch (err) { - if (true && !hasLoggedError) { - hasLoggedError = true; - warningWithoutStack$1(false, 'React DevTools encountered an error: %s', err); + onCommitFiberUnmount = function (fiber) { + try { + hook.onCommitFiberUnmount(rendererID, fiber); + } catch (err) { + if (true) { + if (!hasLoggedError) { + hasLoggedError = true; + + error('React instrumentation encountered an error: %s', err); + } + } } + }; + } catch (err) { + // Catch all errors because it is unsafe to throw during initialization. + { + error('React instrumentation encountered an error: %s.', err); } - }; - } catch (err) { - // Catch all errors because it is unsafe to throw during initialization. - { - warningWithoutStack$1(false, 'React DevTools encountered an error: %s.', err); - } - } // DevTools exists - - - return true; -} -function onCommitRoot(root, expirationTime) { - if (typeof onCommitFiberRoot === 'function') { - onCommitFiberRoot(root, expirationTime); - } -} -function onCommitUnmount(fiber) { - if (typeof onCommitFiberUnmount === 'function') { - onCommitFiberUnmount(fiber); - } -} - -var hasBadMapPolyfill; - -{ - hasBadMapPolyfill = false; - - try { - var nonExtensibleObject = Object.preventExtensions({}); - var testMap = new Map([[nonExtensibleObject, null]]); - var testSet = new Set([nonExtensibleObject]); // This is necessary for Rollup to not consider these unused. - // https://github.com/rollup/rollup/issues/1771 - // TODO: we can remove these if Rollup fixes the bug. - - testMap.set(0, 0); - testSet.add(0); - } catch (e) { - // TODO: Consider warning about bad polyfills - hasBadMapPolyfill = true; - } -} - -var debugCounter = 1; - -function FiberNode(tag, pendingProps, key, mode) { - // Instance - this.tag = tag; - this.key = key; - this.elementType = null; - this.type = null; - this.stateNode = null; // Fiber - - this.return = null; - this.child = null; - this.sibling = null; - this.index = 0; - this.ref = null; - this.pendingProps = pendingProps; - this.memoizedProps = null; - this.updateQueue = null; - this.memoizedState = null; - this.dependencies = null; - this.mode = mode; // Effects - - this.effectTag = NoEffect; - this.nextEffect = null; - this.firstEffect = null; - this.lastEffect = null; - this.expirationTime = NoWork; - this.childExpirationTime = NoWork; - this.alternate = null; - - if (enableProfilerTimer) { - // Note: The following is done to avoid a v8 performance cliff. - // - // Initializing the fields below to smis and later updating them with - // double values will cause Fibers to end up having separate shapes. - // This behavior/bug has something to do with Object.preventExtension(). - // Fortunately this only impacts DEV builds. - // Unfortunately it makes React unusably slow for some applications. - // To work around this, initialize the fields below with doubles. - // - // Learn more about this here: - // https://github.com/facebook/react/issues/14365 - // https://bugs.chromium.org/p/v8/issues/detail?id=8538 - this.actualDuration = Number.NaN; - this.actualStartTime = Number.NaN; - this.selfBaseDuration = Number.NaN; - this.treeBaseDuration = Number.NaN; // It's okay to replace the initial doubles with smis after initialization. - // This won't trigger the performance cliff mentioned above, - // and it simplifies other profiler code (including DevTools). - - this.actualDuration = 0; - this.actualStartTime = -1; - this.selfBaseDuration = 0; - this.treeBaseDuration = 0; - } // This is normally DEV-only except www when it adds listeners. - // TODO: remove the User Timing integration in favor of Root Events. + } // DevTools exists - if (enableUserTimingAPI) { - this._debugID = debugCounter++; - this._debugIsCurrentlyTiming = false; + return true; + } + function onScheduleRoot(root, children) { + if (typeof onScheduleFiberRoot === 'function') { + onScheduleFiberRoot(root, children); + } + } + function onCommitRoot(root, expirationTime) { + if (typeof onCommitFiberRoot === 'function') { + onCommitFiberRoot(root, expirationTime); + } + } + function onCommitUnmount(fiber) { + if (typeof onCommitFiberUnmount === 'function') { + onCommitFiberUnmount(fiber); + } } + var hasBadMapPolyfill; + { - this._debugSource = null; - this._debugOwner = null; - this._debugNeedsRemount = false; - this._debugHookTypes = null; - - if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') { - Object.preventExtensions(this); - } - } -} // This is a constructor function, rather than a POJO constructor, still -// please ensure we do the following: -// 1) Nobody should add any instance methods on this. Instance methods can be -// more difficult to predict when they get optimized and they are almost -// never inlined properly in static compilers. -// 2) Nobody should rely on `instanceof Fiber` for type testing. We should -// always know when it is a fiber. -// 3) We might want to experiment with using numeric keys since they are easier -// to optimize in a non-JIT environment. -// 4) We can easily go from a constructor to a createFiber object literal if that -// is faster. -// 5) It should be easy to port this to a C struct and keep a C implementation -// compatible. - - -var createFiber = function (tag, pendingProps, key, mode) { - // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors - return new FiberNode(tag, pendingProps, key, mode); -}; - -function shouldConstruct(Component) { - var prototype = Component.prototype; - return !!(prototype && prototype.isReactComponent); -} - -function isSimpleFunctionComponent(type) { - return typeof type === 'function' && !shouldConstruct(type) && type.defaultProps === undefined; -} -function resolveLazyComponentTag(Component) { - if (typeof Component === 'function') { - return shouldConstruct(Component) ? ClassComponent : FunctionComponent; - } else if (Component !== undefined && Component !== null) { - var $$typeof = Component.$$typeof; - - if ($$typeof === REACT_FORWARD_REF_TYPE) { - return ForwardRef; - } - - if ($$typeof === REACT_MEMO_TYPE) { - return MemoComponent; - } - } - - return IndeterminateComponent; -} // This is used to create an alternate fiber to do work on. - -function createWorkInProgress(current, pendingProps, expirationTime) { - var workInProgress = current.alternate; - - if (workInProgress === null) { - // We use a double buffering pooling technique because we know that we'll - // only ever need at most two versions of a tree. We pool the "other" unused - // node that we're free to reuse. This is lazily created to avoid allocating - // extra objects for things that are never updated. It also allow us to - // reclaim the extra memory if needed. - workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode); - workInProgress.elementType = current.elementType; - workInProgress.type = current.type; - workInProgress.stateNode = current.stateNode; + hasBadMapPolyfill = false; + + try { + var nonExtensibleObject = Object.preventExtensions({}); + var testMap = new Map([[nonExtensibleObject, null]]); + var testSet = new Set([nonExtensibleObject]); // This is necessary for Rollup to not consider these unused. + // https://github.com/rollup/rollup/issues/1771 + // TODO: we can remove these if Rollup fixes the bug. + + testMap.set(0, 0); + testSet.add(0); + } catch (e) { + // TODO: Consider warning about bad polyfills + hasBadMapPolyfill = true; + } + } + + var debugCounter = 1; + + function FiberNode(tag, pendingProps, key, mode) { + // Instance + this.tag = tag; + this.key = key; + this.elementType = null; + this.type = null; + this.stateNode = null; // Fiber + + this.return = null; + this.child = null; + this.sibling = null; + this.index = 0; + this.ref = null; + this.pendingProps = pendingProps; + this.memoizedProps = null; + this.updateQueue = null; + this.memoizedState = null; + this.dependencies = null; + this.mode = mode; // Effects + + this.effectTag = NoEffect; + this.nextEffect = null; + this.firstEffect = null; + this.lastEffect = null; + this.expirationTime = NoWork; + this.childExpirationTime = NoWork; + this.alternate = null; { - // DEV-only fields - workInProgress._debugID = current._debugID; - workInProgress._debugSource = current._debugSource; - workInProgress._debugOwner = current._debugOwner; - workInProgress._debugHookTypes = current._debugHookTypes; - } + // Note: The following is done to avoid a v8 performance cliff. + // + // Initializing the fields below to smis and later updating them with + // double values will cause Fibers to end up having separate shapes. + // This behavior/bug has something to do with Object.preventExtension(). + // Fortunately this only impacts DEV builds. + // Unfortunately it makes React unusably slow for some applications. + // To work around this, initialize the fields below with doubles. + // + // Learn more about this here: + // https://github.com/facebook/react/issues/14365 + // https://bugs.chromium.org/p/v8/issues/detail?id=8538 + this.actualDuration = Number.NaN; + this.actualStartTime = Number.NaN; + this.selfBaseDuration = Number.NaN; + this.treeBaseDuration = Number.NaN; // It's okay to replace the initial doubles with smis after initialization. + // This won't trigger the performance cliff mentioned above, + // and it simplifies other profiler code (including DevTools). + + this.actualDuration = 0; + this.actualStartTime = -1; + this.selfBaseDuration = 0; + this.treeBaseDuration = 0; + } // This is normally DEV-only except www when it adds listeners. + // TODO: remove the User Timing integration in favor of Root Events. - workInProgress.alternate = current; - current.alternate = workInProgress; - } else { - workInProgress.pendingProps = pendingProps; // We already have an alternate. - // Reset the effect tag. - workInProgress.effectTag = NoEffect; // The effect list is no longer valid. + { + this._debugID = debugCounter++; + this._debugIsCurrentlyTiming = false; + } - workInProgress.nextEffect = null; - workInProgress.firstEffect = null; - workInProgress.lastEffect = null; + { + this._debugSource = null; + this._debugOwner = null; + this._debugNeedsRemount = false; + this._debugHookTypes = null; + + if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') { + Object.preventExtensions(this); + } + } + } // This is a constructor function, rather than a POJO constructor, still + // please ensure we do the following: + // 1) Nobody should add any instance methods on this. Instance methods can be + // more difficult to predict when they get optimized and they are almost + // never inlined properly in static compilers. + // 2) Nobody should rely on `instanceof Fiber` for type testing. We should + // always know when it is a fiber. + // 3) We might want to experiment with using numeric keys since they are easier + // to optimize in a non-JIT environment. + // 4) We can easily go from a constructor to a createFiber object literal if that + // is faster. + // 5) It should be easy to port this to a C struct and keep a C implementation + // compatible. + + + var createFiber = function (tag, pendingProps, key, mode) { + // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors + return new FiberNode(tag, pendingProps, key, mode); + }; - if (enableProfilerTimer) { - // We intentionally reset, rather than copy, actualDuration & actualStartTime. - // This prevents time from endlessly accumulating in new commits. - // This has the downside of resetting values for different priority renders, - // But works for yielding (the common case) and should support resuming. - workInProgress.actualDuration = 0; - workInProgress.actualStartTime = -1; - } + function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); + } + + function isSimpleFunctionComponent(type) { + return typeof type === 'function' && !shouldConstruct(type) && type.defaultProps === undefined; } + function resolveLazyComponentTag(Component) { + if (typeof Component === 'function') { + return shouldConstruct(Component) ? ClassComponent : FunctionComponent; + } else if (Component !== undefined && Component !== null) { + var $$typeof = Component.$$typeof; - workInProgress.childExpirationTime = current.childExpirationTime; - workInProgress.expirationTime = current.expirationTime; - workInProgress.child = current.child; - workInProgress.memoizedProps = current.memoizedProps; - workInProgress.memoizedState = current.memoizedState; - workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so - // it cannot be shared with the current fiber. + if ($$typeof === REACT_FORWARD_REF_TYPE) { + return ForwardRef; + } - var currentDependencies = current.dependencies; - workInProgress.dependencies = currentDependencies === null ? null : { - expirationTime: currentDependencies.expirationTime, - firstContext: currentDependencies.firstContext, - responders: currentDependencies.responders - }; // These will be overridden during the parent's reconciliation + if ($$typeof === REACT_MEMO_TYPE) { + return MemoComponent; + } + } - workInProgress.sibling = current.sibling; - workInProgress.index = current.index; - workInProgress.ref = current.ref; + return IndeterminateComponent; + } // This is used to create an alternate fiber to do work on. - if (enableProfilerTimer) { - workInProgress.selfBaseDuration = current.selfBaseDuration; - workInProgress.treeBaseDuration = current.treeBaseDuration; - } + function createWorkInProgress(current, pendingProps) { + var workInProgress = current.alternate; - { - workInProgress._debugNeedsRemount = current._debugNeedsRemount; + if (workInProgress === null) { + // We use a double buffering pooling technique because we know that we'll + // only ever need at most two versions of a tree. We pool the "other" unused + // node that we're free to reuse. This is lazily created to avoid allocating + // extra objects for things that are never updated. It also allow us to + // reclaim the extra memory if needed. + workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode); + workInProgress.elementType = current.elementType; + workInProgress.type = current.type; + workInProgress.stateNode = current.stateNode; - switch (workInProgress.tag) { - case IndeterminateComponent: - case FunctionComponent: - case SimpleMemoComponent: - workInProgress.type = resolveFunctionForHotReloading(current.type); - break; + { + // DEV-only fields + { + workInProgress._debugID = current._debugID; + } - case ClassComponent: - workInProgress.type = resolveClassForHotReloading(current.type); - break; + workInProgress._debugSource = current._debugSource; + workInProgress._debugOwner = current._debugOwner; + workInProgress._debugHookTypes = current._debugHookTypes; + } - case ForwardRef: - workInProgress.type = resolveForwardRefForHotReloading(current.type); - break; + workInProgress.alternate = current; + current.alternate = workInProgress; + } else { + workInProgress.pendingProps = pendingProps; // We already have an alternate. + // Reset the effect tag. - default: - break; - } - } + workInProgress.effectTag = NoEffect; // The effect list is no longer valid. - return workInProgress; -} // Used to reuse a Fiber for a second pass. - -function resetWorkInProgress(workInProgress, renderExpirationTime) { - // This resets the Fiber to what createFiber or createWorkInProgress would - // have set the values to before during the first pass. Ideally this wouldn't - // be necessary but unfortunately many code paths reads from the workInProgress - // when they should be reading from current and writing to workInProgress. - // We assume pendingProps, index, key, ref, return are still untouched to - // avoid doing another reconciliation. - // Reset the effect tag but keep any Placement tags, since that's something - // that child fiber is setting, not the reconciliation. - workInProgress.effectTag &= Placement; // The effect list is no longer valid. - - workInProgress.nextEffect = null; - workInProgress.firstEffect = null; - workInProgress.lastEffect = null; - var current = workInProgress.alternate; - - if (current === null) { - // Reset to createFiber's initial values. - workInProgress.childExpirationTime = NoWork; - workInProgress.expirationTime = renderExpirationTime; - workInProgress.child = null; - workInProgress.memoizedProps = null; - workInProgress.memoizedState = null; - workInProgress.updateQueue = null; - workInProgress.dependencies = null; + workInProgress.nextEffect = null; + workInProgress.firstEffect = null; + workInProgress.lastEffect = null; - if (enableProfilerTimer) { - // Note: We don't reset the actualTime counts. It's useful to accumulate - // actual time across multiple render passes. - workInProgress.selfBaseDuration = 0; - workInProgress.treeBaseDuration = 0; + { + // We intentionally reset, rather than copy, actualDuration & actualStartTime. + // This prevents time from endlessly accumulating in new commits. + // This has the downside of resetting values for different priority renders, + // But works for yielding (the common case) and should support resuming. + workInProgress.actualDuration = 0; + workInProgress.actualStartTime = -1; + } } - } else { - // Reset to the cloned values that createWorkInProgress would've. + workInProgress.childExpirationTime = current.childExpirationTime; workInProgress.expirationTime = current.expirationTime; workInProgress.child = current.child; @@ -26633,1309 +23885,1263 @@ function resetWorkInProgress(workInProgress, renderExpirationTime) { expirationTime: currentDependencies.expirationTime, firstContext: currentDependencies.firstContext, responders: currentDependencies.responders - }; + }; // These will be overridden during the parent's reconciliation - if (enableProfilerTimer) { - // Note: We don't reset the actualTime counts. It's useful to accumulate - // actual time across multiple render passes. + workInProgress.sibling = current.sibling; + workInProgress.index = current.index; + workInProgress.ref = current.ref; + + { workInProgress.selfBaseDuration = current.selfBaseDuration; workInProgress.treeBaseDuration = current.treeBaseDuration; } - } - return workInProgress; -} -function createHostRootFiber(tag) { - var mode; + { + workInProgress._debugNeedsRemount = current._debugNeedsRemount; + + switch (workInProgress.tag) { + case IndeterminateComponent: + case FunctionComponent: + case SimpleMemoComponent: + workInProgress.type = resolveFunctionForHotReloading(current.type); + break; - if (tag === ConcurrentRoot) { - mode = ConcurrentMode | BlockingMode | StrictMode; - } else if (tag === BlockingRoot) { - mode = BlockingMode | StrictMode; - } else { - mode = NoMode; - } + case ClassComponent: + workInProgress.type = resolveClassForHotReloading(current.type); + break; - if (enableProfilerTimer && isDevToolsPresent) { - // Always collect profile timings when DevTools are present. - // This enables DevTools to start capturing timing at any point– - // Without some nodes in the tree having empty base times. - mode |= ProfileMode; - } + case ForwardRef: + workInProgress.type = resolveForwardRefForHotReloading(current.type); + break; + } + } + + return workInProgress; + } // Used to reuse a Fiber for a second pass. - return createFiber(HostRoot, null, null, mode); -} -function createFiberFromTypeAndProps(type, // React$ElementType -key, pendingProps, owner, mode, expirationTime) { - var fiber; - var fiberTag = IndeterminateComponent; // The resolved type is set if we know what the final type will be. I.e. it's not lazy. + function resetWorkInProgress(workInProgress, renderExpirationTime) { + // This resets the Fiber to what createFiber or createWorkInProgress would + // have set the values to before during the first pass. Ideally this wouldn't + // be necessary but unfortunately many code paths reads from the workInProgress + // when they should be reading from current and writing to workInProgress. + // We assume pendingProps, index, key, ref, return are still untouched to + // avoid doing another reconciliation. + // Reset the effect tag but keep any Placement tags, since that's something + // that child fiber is setting, not the reconciliation. + workInProgress.effectTag &= Placement; // The effect list is no longer valid. - var resolvedType = type; + workInProgress.nextEffect = null; + workInProgress.firstEffect = null; + workInProgress.lastEffect = null; + var current = workInProgress.alternate; - if (typeof type === 'function') { - if (shouldConstruct(type)) { - fiberTag = ClassComponent; + if (current === null) { + // Reset to createFiber's initial values. + workInProgress.childExpirationTime = NoWork; + workInProgress.expirationTime = renderExpirationTime; + workInProgress.child = null; + workInProgress.memoizedProps = null; + workInProgress.memoizedState = null; + workInProgress.updateQueue = null; + workInProgress.dependencies = null; { - resolvedType = resolveClassForHotReloading(resolvedType); + // Note: We don't reset the actualTime counts. It's useful to accumulate + // actual time across multiple render passes. + workInProgress.selfBaseDuration = 0; + workInProgress.treeBaseDuration = 0; } } else { + // Reset to the cloned values that createWorkInProgress would've. + workInProgress.childExpirationTime = current.childExpirationTime; + workInProgress.expirationTime = current.expirationTime; + workInProgress.child = current.child; + workInProgress.memoizedProps = current.memoizedProps; + workInProgress.memoizedState = current.memoizedState; + workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so + // it cannot be shared with the current fiber. + + var currentDependencies = current.dependencies; + workInProgress.dependencies = currentDependencies === null ? null : { + expirationTime: currentDependencies.expirationTime, + firstContext: currentDependencies.firstContext, + responders: currentDependencies.responders + }; + { - resolvedType = resolveFunctionForHotReloading(resolvedType); + // Note: We don't reset the actualTime counts. It's useful to accumulate + // actual time across multiple render passes. + workInProgress.selfBaseDuration = current.selfBaseDuration; + workInProgress.treeBaseDuration = current.treeBaseDuration; } } - } else if (typeof type === 'string') { - fiberTag = HostComponent; - } else { - getTag: switch (type) { - case REACT_FRAGMENT_TYPE: - return createFiberFromFragment(pendingProps.children, mode, expirationTime, key); - case REACT_CONCURRENT_MODE_TYPE: - fiberTag = Mode; - mode |= ConcurrentMode | BlockingMode | StrictMode; - break; + return workInProgress; + } + function createHostRootFiber(tag) { + var mode; - case REACT_STRICT_MODE_TYPE: - fiberTag = Mode; - mode |= StrictMode; - break; + if (tag === ConcurrentRoot) { + mode = ConcurrentMode | BlockingMode | StrictMode; + } else if (tag === BlockingRoot) { + mode = BlockingMode | StrictMode; + } else { + mode = NoMode; + } - case REACT_PROFILER_TYPE: - return createFiberFromProfiler(pendingProps, mode, expirationTime, key); + if ( isDevToolsPresent) { + // Always collect profile timings when DevTools are present. + // This enables DevTools to start capturing timing at any point– + // Without some nodes in the tree having empty base times. + mode |= ProfileMode; + } - case REACT_SUSPENSE_TYPE: - return createFiberFromSuspense(pendingProps, mode, expirationTime, key); + return createFiber(HostRoot, null, null, mode); + } + function createFiberFromTypeAndProps(type, // React$ElementType + key, pendingProps, owner, mode, expirationTime) { + var fiber; + var fiberTag = IndeterminateComponent; // The resolved type is set if we know what the final type will be. I.e. it's not lazy. - case REACT_SUSPENSE_LIST_TYPE: - return createFiberFromSuspenseList(pendingProps, mode, expirationTime, key); + var resolvedType = type; - default: + if (typeof type === 'function') { + if (shouldConstruct(type)) { + fiberTag = ClassComponent; + + { + resolvedType = resolveClassForHotReloading(resolvedType); + } + } else { { - if (typeof type === 'object' && type !== null) { - switch (type.$$typeof) { - case REACT_PROVIDER_TYPE: - fiberTag = ContextProvider; - break getTag; + resolvedType = resolveFunctionForHotReloading(resolvedType); + } + } + } else if (typeof type === 'string') { + fiberTag = HostComponent; + } else { + getTag: switch (type) { + case REACT_FRAGMENT_TYPE: + return createFiberFromFragment(pendingProps.children, mode, expirationTime, key); - case REACT_CONTEXT_TYPE: - // This is a consumer - fiberTag = ContextConsumer; - break getTag; + case REACT_CONCURRENT_MODE_TYPE: + fiberTag = Mode; + mode |= ConcurrentMode | BlockingMode | StrictMode; + break; - case REACT_FORWARD_REF_TYPE: - fiberTag = ForwardRef; + case REACT_STRICT_MODE_TYPE: + fiberTag = Mode; + mode |= StrictMode; + break; - { - resolvedType = resolveForwardRefForHotReloading(resolvedType); - } + case REACT_PROFILER_TYPE: + return createFiberFromProfiler(pendingProps, mode, expirationTime, key); - break getTag; + case REACT_SUSPENSE_TYPE: + return createFiberFromSuspense(pendingProps, mode, expirationTime, key); - case REACT_MEMO_TYPE: - fiberTag = MemoComponent; - break getTag; + case REACT_SUSPENSE_LIST_TYPE: + return createFiberFromSuspenseList(pendingProps, mode, expirationTime, key); - case REACT_LAZY_TYPE: - fiberTag = LazyComponent; - resolvedType = null; - break getTag; + default: + { + if (typeof type === 'object' && type !== null) { + switch (type.$$typeof) { + case REACT_PROVIDER_TYPE: + fiberTag = ContextProvider; + break getTag; + + case REACT_CONTEXT_TYPE: + // This is a consumer + fiberTag = ContextConsumer; + break getTag; + + case REACT_FORWARD_REF_TYPE: + fiberTag = ForwardRef; + + { + resolvedType = resolveForwardRefForHotReloading(resolvedType); + } - case REACT_FUNDAMENTAL_TYPE: - if (enableFundamentalAPI) { - return createFiberFromFundamental(type, pendingProps, mode, expirationTime, key); - } + break getTag; - break; + case REACT_MEMO_TYPE: + fiberTag = MemoComponent; + break getTag; - case REACT_SCOPE_TYPE: - if (enableScopeAPI) { - return createFiberFromScope(type, pendingProps, mode, expirationTime, key); - } + case REACT_LAZY_TYPE: + fiberTag = LazyComponent; + resolvedType = null; + break getTag; + + case REACT_BLOCK_TYPE: + fiberTag = Block; + break getTag; + } } - } - var info = ''; + var info = ''; - { - if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { - info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and " + 'named imports.'; - } + { + if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { + info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and " + 'named imports.'; + } - var ownerName = owner ? getComponentName(owner.type) : null; + var ownerName = owner ? getComponentName(owner.type) : null; - if (ownerName) { - info += '\n\nCheck the render method of `' + ownerName + '`.'; + if (ownerName) { + info += '\n\nCheck the render method of `' + ownerName + '`.'; + } } - } - { { - throw Error("Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: " + (type == null ? type : typeof type) + "." + info); + { + throw Error( "Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: " + (type == null ? type : typeof type) + "." + info ); + } } } - } + } } - } - fiber = createFiber(fiberTag, pendingProps, key, mode); - fiber.elementType = type; - fiber.type = resolvedType; - fiber.expirationTime = expirationTime; - return fiber; -} -function createFiberFromElement(element, mode, expirationTime) { - var owner = null; - - { - owner = element._owner; + fiber = createFiber(fiberTag, pendingProps, key, mode); + fiber.elementType = type; + fiber.type = resolvedType; + fiber.expirationTime = expirationTime; + return fiber; } + function createFiberFromElement(element, mode, expirationTime) { + var owner = null; - var type = element.type; - var key = element.key; - var pendingProps = element.props; - var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, expirationTime); + { + owner = element._owner; + } - { - fiber._debugSource = element._source; - fiber._debugOwner = element._owner; - } - - return fiber; -} -function createFiberFromFragment(elements, mode, expirationTime, key) { - var fiber = createFiber(Fragment, elements, key, mode); - fiber.expirationTime = expirationTime; - return fiber; -} -function createFiberFromFundamental(fundamentalComponent, pendingProps, mode, expirationTime, key) { - var fiber = createFiber(FundamentalComponent, pendingProps, key, mode); - fiber.elementType = fundamentalComponent; - fiber.type = fundamentalComponent; - fiber.expirationTime = expirationTime; - return fiber; -} - -function createFiberFromScope(scope, pendingProps, mode, expirationTime, key) { - var fiber = createFiber(ScopeComponent, pendingProps, key, mode); - fiber.type = scope; - fiber.elementType = scope; - fiber.expirationTime = expirationTime; - return fiber; -} - -function createFiberFromProfiler(pendingProps, mode, expirationTime, key) { - { - if (typeof pendingProps.id !== 'string' || typeof pendingProps.onRender !== 'function') { - warningWithoutStack$1(false, 'Profiler must specify an "id" string and "onRender" function as props'); + var type = element.type; + var key = element.key; + var pendingProps = element.props; + var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, expirationTime); + + { + fiber._debugSource = element._source; + fiber._debugOwner = element._owner; } - } - var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode); // TODO: The Profiler fiber shouldn't have a type. It has a tag. + return fiber; + } + function createFiberFromFragment(elements, mode, expirationTime, key) { + var fiber = createFiber(Fragment, elements, key, mode); + fiber.expirationTime = expirationTime; + return fiber; + } - fiber.elementType = REACT_PROFILER_TYPE; - fiber.type = REACT_PROFILER_TYPE; - fiber.expirationTime = expirationTime; - return fiber; -} + function createFiberFromProfiler(pendingProps, mode, expirationTime, key) { + { + if (typeof pendingProps.id !== 'string' || typeof pendingProps.onRender !== 'function') { + error('Profiler must specify an "id" string and "onRender" function as props'); + } + } -function createFiberFromSuspense(pendingProps, mode, expirationTime, key) { - var fiber = createFiber(SuspenseComponent, pendingProps, key, mode); // TODO: The SuspenseComponent fiber shouldn't have a type. It has a tag. - // This needs to be fixed in getComponentName so that it relies on the tag - // instead. + var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode); // TODO: The Profiler fiber shouldn't have a type. It has a tag. - fiber.type = REACT_SUSPENSE_TYPE; - fiber.elementType = REACT_SUSPENSE_TYPE; - fiber.expirationTime = expirationTime; - return fiber; -} -function createFiberFromSuspenseList(pendingProps, mode, expirationTime, key) { - var fiber = createFiber(SuspenseListComponent, pendingProps, key, mode); + fiber.elementType = REACT_PROFILER_TYPE; + fiber.type = REACT_PROFILER_TYPE; + fiber.expirationTime = expirationTime; + return fiber; + } - { - // TODO: The SuspenseListComponent fiber shouldn't have a type. It has a tag. + function createFiberFromSuspense(pendingProps, mode, expirationTime, key) { + var fiber = createFiber(SuspenseComponent, pendingProps, key, mode); // TODO: The SuspenseComponent fiber shouldn't have a type. It has a tag. // This needs to be fixed in getComponentName so that it relies on the tag // instead. - fiber.type = REACT_SUSPENSE_LIST_TYPE; - } - - fiber.elementType = REACT_SUSPENSE_LIST_TYPE; - fiber.expirationTime = expirationTime; - return fiber; -} -function createFiberFromText(content, mode, expirationTime) { - var fiber = createFiber(HostText, content, null, mode); - fiber.expirationTime = expirationTime; - return fiber; -} -function createFiberFromHostInstanceForDeletion() { - var fiber = createFiber(HostComponent, null, null, NoMode); // TODO: These should not need a type. - - fiber.elementType = 'DELETED'; - fiber.type = 'DELETED'; - return fiber; -} -function createFiberFromDehydratedFragment(dehydratedNode) { - var fiber = createFiber(DehydratedFragment, null, null, NoMode); - fiber.stateNode = dehydratedNode; - return fiber; -} -function createFiberFromPortal(portal, mode, expirationTime) { - var pendingProps = portal.children !== null ? portal.children : []; - var fiber = createFiber(HostPortal, pendingProps, portal.key, mode); - fiber.expirationTime = expirationTime; - fiber.stateNode = { - containerInfo: portal.containerInfo, - pendingChildren: null, - // Used by persistent updates - implementation: portal.implementation - }; - return fiber; -} // Used for stashing WIP properties to replay failed work in DEV. - -function assignFiberPropertiesInDEV(target, source) { - if (target === null) { - // This Fiber's initial properties will always be overwritten. - // We only use a Fiber to ensure the same hidden class so DEV isn't slow. - target = createFiber(IndeterminateComponent, null, null, NoMode); - } // This is intentionally written as a list of all properties. - // We tried to use Object.assign() instead but this is called in - // the hottest path, and Object.assign() was too slow: - // https://github.com/facebook/react/issues/12502 - // This code is DEV-only so size is not a concern. - - - target.tag = source.tag; - target.key = source.key; - target.elementType = source.elementType; - target.type = source.type; - target.stateNode = source.stateNode; - target.return = source.return; - target.child = source.child; - target.sibling = source.sibling; - target.index = source.index; - target.ref = source.ref; - target.pendingProps = source.pendingProps; - target.memoizedProps = source.memoizedProps; - target.updateQueue = source.updateQueue; - target.memoizedState = source.memoizedState; - target.dependencies = source.dependencies; - target.mode = source.mode; - target.effectTag = source.effectTag; - target.nextEffect = source.nextEffect; - target.firstEffect = source.firstEffect; - target.lastEffect = source.lastEffect; - target.expirationTime = source.expirationTime; - target.childExpirationTime = source.childExpirationTime; - target.alternate = source.alternate; - - if (enableProfilerTimer) { - target.actualDuration = source.actualDuration; - target.actualStartTime = source.actualStartTime; - target.selfBaseDuration = source.selfBaseDuration; - target.treeBaseDuration = source.treeBaseDuration; - } - - target._debugID = source._debugID; - target._debugSource = source._debugSource; - target._debugOwner = source._debugOwner; - target._debugIsCurrentlyTiming = source._debugIsCurrentlyTiming; - target._debugNeedsRemount = source._debugNeedsRemount; - target._debugHookTypes = source._debugHookTypes; - return target; -} - -function FiberRootNode(containerInfo, tag, hydrate) { - this.tag = tag; - this.current = null; - this.containerInfo = containerInfo; - this.pendingChildren = null; - this.pingCache = null; - this.finishedExpirationTime = NoWork; - this.finishedWork = null; - this.timeoutHandle = noTimeout; - this.context = null; - this.pendingContext = null; - this.hydrate = hydrate; - this.callbackNode = null; - this.callbackPriority = NoPriority; - this.firstPendingTime = NoWork; - this.firstSuspendedTime = NoWork; - this.lastSuspendedTime = NoWork; - this.nextKnownPendingLevel = NoWork; - this.lastPingedTime = NoWork; - this.lastExpiredTime = NoWork; - - if (enableSchedulerTracing) { - this.interactionThreadID = unstable_getThreadID(); - this.memoizedInteractions = new Set(); - this.pendingInteractionMap = new Map(); - } - - if (enableSuspenseCallback) { - this.hydrationCallbacks = null; - } -} - -function createFiberRoot(containerInfo, tag, hydrate, hydrationCallbacks) { - var root = new FiberRootNode(containerInfo, tag, hydrate); - - if (enableSuspenseCallback) { - root.hydrationCallbacks = hydrationCallbacks; - } // Cyclic construction. This cheats the type system right now because - // stateNode is any. - - - var uninitializedFiber = createHostRootFiber(tag); - root.current = uninitializedFiber; - uninitializedFiber.stateNode = root; - return root; -} -function isRootSuspendedAtTime(root, expirationTime) { - var firstSuspendedTime = root.firstSuspendedTime; - var lastSuspendedTime = root.lastSuspendedTime; - return firstSuspendedTime !== NoWork && firstSuspendedTime >= expirationTime && lastSuspendedTime <= expirationTime; -} -function markRootSuspendedAtTime(root, expirationTime) { - var firstSuspendedTime = root.firstSuspendedTime; - var lastSuspendedTime = root.lastSuspendedTime; - - if (firstSuspendedTime < expirationTime) { - root.firstSuspendedTime = expirationTime; - } - - if (lastSuspendedTime > expirationTime || firstSuspendedTime === NoWork) { - root.lastSuspendedTime = expirationTime; - } - - if (expirationTime <= root.lastPingedTime) { - root.lastPingedTime = NoWork; - } - - if (expirationTime <= root.lastExpiredTime) { - root.lastExpiredTime = NoWork; - } -} -function markRootUpdatedAtTime(root, expirationTime) { - // Update the range of pending times - var firstPendingTime = root.firstPendingTime; - - if (expirationTime > firstPendingTime) { - root.firstPendingTime = expirationTime; - } // Update the range of suspended times. Treat everything lower priority or - // equal to this update as unsuspended. - - - var firstSuspendedTime = root.firstSuspendedTime; - - if (firstSuspendedTime !== NoWork) { - if (expirationTime >= firstSuspendedTime) { - // The entire suspended range is now unsuspended. - root.firstSuspendedTime = root.lastSuspendedTime = root.nextKnownPendingLevel = NoWork; - } else if (expirationTime >= root.lastSuspendedTime) { - root.lastSuspendedTime = expirationTime + 1; - } // This is a pending level. Check if it's higher priority than the next - // known pending level. + fiber.type = REACT_SUSPENSE_TYPE; + fiber.elementType = REACT_SUSPENSE_TYPE; + fiber.expirationTime = expirationTime; + return fiber; + } + function createFiberFromSuspenseList(pendingProps, mode, expirationTime, key) { + var fiber = createFiber(SuspenseListComponent, pendingProps, key, mode); - if (expirationTime > root.nextKnownPendingLevel) { - root.nextKnownPendingLevel = expirationTime; + { + // TODO: The SuspenseListComponent fiber shouldn't have a type. It has a tag. + // This needs to be fixed in getComponentName so that it relies on the tag + // instead. + fiber.type = REACT_SUSPENSE_LIST_TYPE; } - } -} -function markRootFinishedAtTime(root, finishedExpirationTime, remainingExpirationTime) { - // Update the range of pending times - root.firstPendingTime = remainingExpirationTime; // Update the range of suspended times. Treat everything higher priority or - // equal to this update as unsuspended. - if (finishedExpirationTime <= root.lastSuspendedTime) { - // The entire suspended range is now unsuspended. - root.firstSuspendedTime = root.lastSuspendedTime = root.nextKnownPendingLevel = NoWork; - } else if (finishedExpirationTime <= root.firstSuspendedTime) { - // Part of the suspended range is now unsuspended. Narrow the range to - // include everything between the unsuspended time (non-inclusive) and the - // last suspended time. - root.firstSuspendedTime = finishedExpirationTime - 1; + fiber.elementType = REACT_SUSPENSE_LIST_TYPE; + fiber.expirationTime = expirationTime; + return fiber; } - - if (finishedExpirationTime <= root.lastPingedTime) { - // Clear the pinged time - root.lastPingedTime = NoWork; + function createFiberFromText(content, mode, expirationTime) { + var fiber = createFiber(HostText, content, null, mode); + fiber.expirationTime = expirationTime; + return fiber; } + function createFiberFromHostInstanceForDeletion() { + var fiber = createFiber(HostComponent, null, null, NoMode); // TODO: These should not need a type. - if (finishedExpirationTime <= root.lastExpiredTime) { - // Clear the expired time - root.lastExpiredTime = NoWork; + fiber.elementType = 'DELETED'; + fiber.type = 'DELETED'; + return fiber; } -} -function markRootExpiredAtTime(root, expirationTime) { - var lastExpiredTime = root.lastExpiredTime; + function createFiberFromPortal(portal, mode, expirationTime) { + var pendingProps = portal.children !== null ? portal.children : []; + var fiber = createFiber(HostPortal, pendingProps, portal.key, mode); + fiber.expirationTime = expirationTime; + fiber.stateNode = { + containerInfo: portal.containerInfo, + pendingChildren: null, + // Used by persistent updates + implementation: portal.implementation + }; + return fiber; + } // Used for stashing WIP properties to replay failed work in DEV. + + function assignFiberPropertiesInDEV(target, source) { + if (target === null) { + // This Fiber's initial properties will always be overwritten. + // We only use a Fiber to ensure the same hidden class so DEV isn't slow. + target = createFiber(IndeterminateComponent, null, null, NoMode); + } // This is intentionally written as a list of all properties. + // We tried to use Object.assign() instead but this is called in + // the hottest path, and Object.assign() was too slow: + // https://github.com/facebook/react/issues/12502 + // This code is DEV-only so size is not a concern. + + + target.tag = source.tag; + target.key = source.key; + target.elementType = source.elementType; + target.type = source.type; + target.stateNode = source.stateNode; + target.return = source.return; + target.child = source.child; + target.sibling = source.sibling; + target.index = source.index; + target.ref = source.ref; + target.pendingProps = source.pendingProps; + target.memoizedProps = source.memoizedProps; + target.updateQueue = source.updateQueue; + target.memoizedState = source.memoizedState; + target.dependencies = source.dependencies; + target.mode = source.mode; + target.effectTag = source.effectTag; + target.nextEffect = source.nextEffect; + target.firstEffect = source.firstEffect; + target.lastEffect = source.lastEffect; + target.expirationTime = source.expirationTime; + target.childExpirationTime = source.childExpirationTime; + target.alternate = source.alternate; - if (lastExpiredTime === NoWork || lastExpiredTime > expirationTime) { - root.lastExpiredTime = expirationTime; - } -} + { + target.actualDuration = source.actualDuration; + target.actualStartTime = source.actualStartTime; + target.selfBaseDuration = source.selfBaseDuration; + target.treeBaseDuration = source.treeBaseDuration; + } -// This lets us hook into Fiber to debug what it's doing. -// See https://github.com/facebook/react/pull/8033. -// This is not part of the public API, not even for React DevTools. -// You may only inject a debugTool if you work on React Fiber itself. -var ReactFiberInstrumentation = { - debugTool: null -}; -var ReactFiberInstrumentation_1 = ReactFiberInstrumentation; + { + target._debugID = source._debugID; + } + + target._debugSource = source._debugSource; + target._debugOwner = source._debugOwner; + target._debugIsCurrentlyTiming = source._debugIsCurrentlyTiming; + target._debugNeedsRemount = source._debugNeedsRemount; + target._debugHookTypes = source._debugHookTypes; + return target; + } + + function FiberRootNode(containerInfo, tag, hydrate) { + this.tag = tag; + this.current = null; + this.containerInfo = containerInfo; + this.pendingChildren = null; + this.pingCache = null; + this.finishedExpirationTime = NoWork; + this.finishedWork = null; + this.timeoutHandle = noTimeout; + this.context = null; + this.pendingContext = null; + this.hydrate = hydrate; + this.callbackNode = null; + this.callbackPriority = NoPriority; + this.firstPendingTime = NoWork; + this.firstSuspendedTime = NoWork; + this.lastSuspendedTime = NoWork; + this.nextKnownPendingLevel = NoWork; + this.lastPingedTime = NoWork; + this.lastExpiredTime = NoWork; + + { + this.interactionThreadID = unstable_getThreadID(); + this.memoizedInteractions = new Set(); + this.pendingInteractionMap = new Map(); + } + } -var didWarnAboutNestedUpdates; -var didWarnAboutFindNodeInStrictMode; + function createFiberRoot(containerInfo, tag, hydrate, hydrationCallbacks) { + var root = new FiberRootNode(containerInfo, tag, hydrate); + // stateNode is any. -{ - didWarnAboutNestedUpdates = false; - didWarnAboutFindNodeInStrictMode = {}; -} -function getContextForSubtree(parentComponent) { - if (!parentComponent) { - return emptyContextObject; + var uninitializedFiber = createHostRootFiber(tag); + root.current = uninitializedFiber; + uninitializedFiber.stateNode = root; + initializeUpdateQueue(uninitializedFiber); + return root; + } + function isRootSuspendedAtTime(root, expirationTime) { + var firstSuspendedTime = root.firstSuspendedTime; + var lastSuspendedTime = root.lastSuspendedTime; + return firstSuspendedTime !== NoWork && firstSuspendedTime >= expirationTime && lastSuspendedTime <= expirationTime; } + function markRootSuspendedAtTime(root, expirationTime) { + var firstSuspendedTime = root.firstSuspendedTime; + var lastSuspendedTime = root.lastSuspendedTime; + + if (firstSuspendedTime < expirationTime) { + root.firstSuspendedTime = expirationTime; + } - var fiber = get(parentComponent); - var parentContext = findCurrentUnmaskedContext(fiber); + if (lastSuspendedTime > expirationTime || firstSuspendedTime === NoWork) { + root.lastSuspendedTime = expirationTime; + } - if (fiber.tag === ClassComponent) { - var Component = fiber.type; + if (expirationTime <= root.lastPingedTime) { + root.lastPingedTime = NoWork; + } - if (isContextProvider(Component)) { - return processChildContext(fiber, Component, parentContext); + if (expirationTime <= root.lastExpiredTime) { + root.lastExpiredTime = NoWork; } } + function markRootUpdatedAtTime(root, expirationTime) { + // Update the range of pending times + var firstPendingTime = root.firstPendingTime; - return parentContext; -} + if (expirationTime > firstPendingTime) { + root.firstPendingTime = expirationTime; + } // Update the range of suspended times. Treat everything lower priority or + // equal to this update as unsuspended. -function findHostInstance(component) { - var fiber = get(component); - if (fiber === undefined) { - if (typeof component.render === 'function') { - { - { - throw Error("Unable to find node on an unmounted component."); - } - } - } else { - { - { - throw Error("Argument appears to not be a ReactComponent. Keys: " + Object.keys(component)); - } + var firstSuspendedTime = root.firstSuspendedTime; + + if (firstSuspendedTime !== NoWork) { + if (expirationTime >= firstSuspendedTime) { + // The entire suspended range is now unsuspended. + root.firstSuspendedTime = root.lastSuspendedTime = root.nextKnownPendingLevel = NoWork; + } else if (expirationTime >= root.lastSuspendedTime) { + root.lastSuspendedTime = expirationTime + 1; + } // This is a pending level. Check if it's higher priority than the next + // known pending level. + + + if (expirationTime > root.nextKnownPendingLevel) { + root.nextKnownPendingLevel = expirationTime; } } } + function markRootFinishedAtTime(root, finishedExpirationTime, remainingExpirationTime) { + // Update the range of pending times + root.firstPendingTime = remainingExpirationTime; // Update the range of suspended times. Treat everything higher priority or + // equal to this update as unsuspended. + + if (finishedExpirationTime <= root.lastSuspendedTime) { + // The entire suspended range is now unsuspended. + root.firstSuspendedTime = root.lastSuspendedTime = root.nextKnownPendingLevel = NoWork; + } else if (finishedExpirationTime <= root.firstSuspendedTime) { + // Part of the suspended range is now unsuspended. Narrow the range to + // include everything between the unsuspended time (non-inclusive) and the + // last suspended time. + root.firstSuspendedTime = finishedExpirationTime - 1; + } - var hostFiber = findCurrentHostFiber(fiber); + if (finishedExpirationTime <= root.lastPingedTime) { + // Clear the pinged time + root.lastPingedTime = NoWork; + } - if (hostFiber === null) { - return null; + if (finishedExpirationTime <= root.lastExpiredTime) { + // Clear the expired time + root.lastExpiredTime = NoWork; + } + } + function markRootExpiredAtTime(root, expirationTime) { + var lastExpiredTime = root.lastExpiredTime; + + if (lastExpiredTime === NoWork || lastExpiredTime > expirationTime) { + root.lastExpiredTime = expirationTime; + } } - return hostFiber.stateNode; -} + var didWarnAboutNestedUpdates; + var didWarnAboutFindNodeInStrictMode; -function findHostInstanceWithWarning(component, methodName) { { - var fiber = get(component); + didWarnAboutNestedUpdates = false; + didWarnAboutFindNodeInStrictMode = {}; + } - if (fiber === undefined) { - if (typeof component.render === 'function') { - { + function getContextForSubtree(parentComponent) { + if (!parentComponent) { + return emptyContextObject; + } + + var fiber = get(parentComponent); + var parentContext = findCurrentUnmaskedContext(fiber); + + if (fiber.tag === ClassComponent) { + var Component = fiber.type; + + if (isContextProvider(Component)) { + return processChildContext(fiber, Component, parentContext); + } + } + + return parentContext; + } + + function findHostInstanceWithWarning(component, methodName) { + { + var fiber = get(component); + + if (fiber === undefined) { + if (typeof component.render === 'function') { { - throw Error("Unable to find node on an unmounted component."); + { + throw Error( "Unable to find node on an unmounted component." ); + } } - } - } else { - { + } else { { - throw Error("Argument appears to not be a ReactComponent. Keys: " + Object.keys(component)); + { + throw Error( "Argument appears to not be a ReactComponent. Keys: " + Object.keys(component) ); + } } } } - } - var hostFiber = findCurrentHostFiber(fiber); + var hostFiber = findCurrentHostFiber(fiber); - if (hostFiber === null) { - return null; - } + if (hostFiber === null) { + return null; + } - if (hostFiber.mode & StrictMode) { - var componentName = getComponentName(fiber.type) || 'Component'; + if (hostFiber.mode & StrictMode) { + var componentName = getComponentName(fiber.type) || 'Component'; - if (!didWarnAboutFindNodeInStrictMode[componentName]) { - didWarnAboutFindNodeInStrictMode[componentName] = true; + if (!didWarnAboutFindNodeInStrictMode[componentName]) { + didWarnAboutFindNodeInStrictMode[componentName] = true; - if (fiber.mode & StrictMode) { - warningWithoutStack$1(false, '%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which is inside StrictMode. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-find-node%s', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber)); - } else { - warningWithoutStack$1(false, '%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which renders StrictMode children. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-find-node%s', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber)); + if (fiber.mode & StrictMode) { + error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which is inside StrictMode. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-find-node%s', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber)); + } else { + error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which renders StrictMode children. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-find-node%s', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber)); + } } } - } - return hostFiber.stateNode; + return hostFiber.stateNode; + } } - return findHostInstance(component); -} - -function createContainer(containerInfo, tag, hydrate, hydrationCallbacks) { - return createFiberRoot(containerInfo, tag, hydrate, hydrationCallbacks); -} -function updateContainer(element, container, parentComponent, callback) { - var current$$1 = container.current; - var currentTime = requestCurrentTimeForUpdate(); - - { - // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests - if ('undefined' !== typeof jest) { - warnIfUnmockedScheduler(current$$1); - warnIfNotScopedWithMatchingAct(current$$1); - } + function createContainer(containerInfo, tag, hydrate, hydrationCallbacks) { + return createFiberRoot(containerInfo, tag, hydrate); } + function updateContainer(element, container, parentComponent, callback) { + { + onScheduleRoot(container, element); + } - var suspenseConfig = requestCurrentSuspenseConfig(); - var expirationTime = computeExpirationForFiber(currentTime, current$$1, suspenseConfig); + var current$1 = container.current; + var currentTime = requestCurrentTimeForUpdate(); - { - if (ReactFiberInstrumentation_1.debugTool) { - if (current$$1.alternate === null) { - ReactFiberInstrumentation_1.debugTool.onMountContainer(container); - } else if (element === null) { - ReactFiberInstrumentation_1.debugTool.onUnmountContainer(container); - } else { - ReactFiberInstrumentation_1.debugTool.onUpdateContainer(container); + { + // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests + if ('undefined' !== typeof jest) { + warnIfUnmockedScheduler(current$1); + warnIfNotScopedWithMatchingAct(current$1); } } - } - - var context = getContextForSubtree(parentComponent); - if (container.context === null) { - container.context = context; - } else { - container.pendingContext = context; - } + var suspenseConfig = requestCurrentSuspenseConfig(); + var expirationTime = computeExpirationForFiber(currentTime, current$1, suspenseConfig); + var context = getContextForSubtree(parentComponent); - { - if (phase === 'render' && current !== null && !didWarnAboutNestedUpdates) { - didWarnAboutNestedUpdates = true; - warningWithoutStack$1(false, 'Render methods should be a pure function of props and state; ' + 'triggering nested component updates from render is not allowed. ' + 'If necessary, trigger nested updates in componentDidUpdate.\n\n' + 'Check the render method of %s.', getComponentName(current.type) || 'Unknown'); + if (container.context === null) { + container.context = context; + } else { + container.pendingContext = context; } - } - var update = createUpdate(expirationTime, suspenseConfig); // Caution: React DevTools currently depends on this property - // being called "element". + { + if (isRendering && current !== null && !didWarnAboutNestedUpdates) { + didWarnAboutNestedUpdates = true; - update.payload = { - element: element - }; - callback = callback === undefined ? null : callback; + error('Render methods should be a pure function of props and state; ' + 'triggering nested component updates from render is not allowed. ' + 'If necessary, trigger nested updates in componentDidUpdate.\n\n' + 'Check the render method of %s.', getComponentName(current.type) || 'Unknown'); + } + } - if (callback !== null) { - !(typeof callback === 'function') ? warningWithoutStack$1(false, 'render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback) : void 0; - update.callback = callback; - } + var update = createUpdate(expirationTime, suspenseConfig); // Caution: React DevTools currently depends on this property + // being called "element". - enqueueUpdate(current$$1, update); - scheduleWork(current$$1, expirationTime); - return expirationTime; -} -function getPublicRootInstance(container) { - var containerFiber = container.current; + update.payload = { + element: element + }; + callback = callback === undefined ? null : callback; - if (!containerFiber.child) { - return null; - } + if (callback !== null) { + { + if (typeof callback !== 'function') { + error('render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback); + } + } - switch (containerFiber.child.tag) { - case HostComponent: - return getPublicInstance(containerFiber.child.stateNode); + update.callback = callback; + } - default: - return containerFiber.child.stateNode; + enqueueUpdate(current$1, update); + scheduleWork(current$1, expirationTime); + return expirationTime; } -} -function attemptSynchronousHydration$1(fiber) { - switch (fiber.tag) { - case HostRoot: - var root = fiber.stateNode; - - if (root.hydrate) { - // Flush the first scheduled "update". - flushRoot(root, root.firstPendingTime); - } + function getPublicRootInstance(container) { + var containerFiber = container.current; - break; + if (!containerFiber.child) { + return null; + } - case SuspenseComponent: - flushSync(function () { - return scheduleWork(fiber, Sync); - }); // If we're still blocked after this, we need to increase - // the priority of any promises resolving within this - // boundary so that they next attempt also has higher pri. + switch (containerFiber.child.tag) { + case HostComponent: + return getPublicInstance(containerFiber.child.stateNode); - var retryExpTime = computeInteractiveExpiration(requestCurrentTimeForUpdate()); - markRetryTimeIfNotHydrated(fiber, retryExpTime); - break; + default: + return containerFiber.child.stateNode; + } } -} -function markRetryTimeImpl(fiber, retryTime) { - var suspenseState = fiber.memoizedState; + function markRetryTimeImpl(fiber, retryTime) { + var suspenseState = fiber.memoizedState; - if (suspenseState !== null && suspenseState.dehydrated !== null) { - if (suspenseState.retryTime < retryTime) { - suspenseState.retryTime = retryTime; + if (suspenseState !== null && suspenseState.dehydrated !== null) { + if (suspenseState.retryTime < retryTime) { + suspenseState.retryTime = retryTime; + } } - } -} // Increases the priority of thennables when they resolve within this boundary. + } // Increases the priority of thennables when they resolve within this boundary. -function markRetryTimeIfNotHydrated(fiber, retryTime) { - markRetryTimeImpl(fiber, retryTime); - var alternate = fiber.alternate; + function markRetryTimeIfNotHydrated(fiber, retryTime) { + markRetryTimeImpl(fiber, retryTime); + var alternate = fiber.alternate; - if (alternate) { - markRetryTimeImpl(alternate, retryTime); - } -} - -function attemptUserBlockingHydration$1(fiber) { - if (fiber.tag !== SuspenseComponent) { - // We ignore HostRoots here because we can't increase - // their priority and they should not suspend on I/O, - // since you have to wrap anything that might suspend in - // Suspense. - return; + if (alternate) { + markRetryTimeImpl(alternate, retryTime); + } } - var expTime = computeInteractiveExpiration(requestCurrentTimeForUpdate()); - scheduleWork(fiber, expTime); - markRetryTimeIfNotHydrated(fiber, expTime); -} -function attemptContinuousHydration$1(fiber) { - if (fiber.tag !== SuspenseComponent) { - // We ignore HostRoots here because we can't increase - // their priority and they should not suspend on I/O, - // since you have to wrap anything that might suspend in - // Suspense. - return; - } + function attemptUserBlockingHydration$1(fiber) { + if (fiber.tag !== SuspenseComponent) { + // We ignore HostRoots here because we can't increase + // their priority and they should not suspend on I/O, + // since you have to wrap anything that might suspend in + // Suspense. + return; + } - var expTime = computeContinuousHydrationExpiration(requestCurrentTimeForUpdate()); - scheduleWork(fiber, expTime); - markRetryTimeIfNotHydrated(fiber, expTime); -} -function attemptHydrationAtCurrentPriority$1(fiber) { - if (fiber.tag !== SuspenseComponent) { - // We ignore HostRoots here because we can't increase - // their priority other than synchronously flush it. - return; + var expTime = computeInteractiveExpiration(requestCurrentTimeForUpdate()); + scheduleWork(fiber, expTime); + markRetryTimeIfNotHydrated(fiber, expTime); } + function attemptContinuousHydration$1(fiber) { + if (fiber.tag !== SuspenseComponent) { + // We ignore HostRoots here because we can't increase + // their priority and they should not suspend on I/O, + // since you have to wrap anything that might suspend in + // Suspense. + return; + } - var currentTime = requestCurrentTimeForUpdate(); - var expTime = computeExpirationForFiber(currentTime, fiber, null); - scheduleWork(fiber, expTime); - markRetryTimeIfNotHydrated(fiber, expTime); -} -function findHostInstanceWithNoPortals(fiber) { - var hostFiber = findCurrentHostFiberWithNoPortals(fiber); - - if (hostFiber === null) { - return null; + scheduleWork(fiber, ContinuousHydration); + markRetryTimeIfNotHydrated(fiber, ContinuousHydration); } + function attemptHydrationAtCurrentPriority$1(fiber) { + if (fiber.tag !== SuspenseComponent) { + // We ignore HostRoots here because we can't increase + // their priority other than synchronously flush it. + return; + } - if (hostFiber.tag === FundamentalComponent) { - return hostFiber.stateNode.instance; + var currentTime = requestCurrentTimeForUpdate(); + var expTime = computeExpirationForFiber(currentTime, fiber, null); + scheduleWork(fiber, expTime); + markRetryTimeIfNotHydrated(fiber, expTime); } + function findHostInstanceWithNoPortals(fiber) { + var hostFiber = findCurrentHostFiberWithNoPortals(fiber); - return hostFiber.stateNode; -} - -var shouldSuspendImpl = function (fiber) { - return false; -}; - -function shouldSuspend(fiber) { - return shouldSuspendImpl(fiber); -} -var overrideHookState = null; -var overrideProps = null; -var scheduleUpdate = null; -var setSuspenseHandler = null; + if (hostFiber === null) { + return null; + } -{ - var copyWithSetImpl = function (obj, path, idx, value) { - if (idx >= path.length) { - return value; + if (hostFiber.tag === FundamentalComponent) { + return hostFiber.stateNode.instance; } - var key = path[idx]; - var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj); // $FlowFixMe number or string is fine here + return hostFiber.stateNode; + } - updated[key] = copyWithSetImpl(obj[key], path, idx + 1, value); - return updated; + var shouldSuspendImpl = function (fiber) { + return false; }; - var copyWithSet = function (obj, path, value) { - return copyWithSetImpl(obj, path, 0, value); - }; // Support DevTools editable values for useState and useReducer. + function shouldSuspend(fiber) { + return shouldSuspendImpl(fiber); + } + var overrideHookState = null; + var overrideProps = null; + var scheduleUpdate = null; + var setSuspenseHandler = null; + { + var copyWithSetImpl = function (obj, path, idx, value) { + if (idx >= path.length) { + return value; + } - overrideHookState = function (fiber, id, path, value) { - // For now, the "id" of stateful hooks is just the stateful hook index. - // This may change in the future with e.g. nested hooks. - var currentHook = fiber.memoizedState; + var key = path[idx]; + var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj); // $FlowFixMe number or string is fine here - while (currentHook !== null && id > 0) { - currentHook = currentHook.next; - id--; - } + updated[key] = copyWithSetImpl(obj[key], path, idx + 1, value); + return updated; + }; - if (currentHook !== null) { - var newState = copyWithSet(currentHook.memoizedState, path, value); - currentHook.memoizedState = newState; - currentHook.baseState = newState; // We aren't actually adding an update to the queue, - // because there is no update we can add for useReducer hooks that won't trigger an error. - // (There's no appropriate action type for DevTools overrides.) - // As a result though, React will see the scheduled update as a noop and bailout. - // Shallow cloning props works as a workaround for now to bypass the bailout check. - - fiber.memoizedProps = _assign({}, fiber.memoizedProps); - scheduleWork(fiber, Sync); - } - }; // Support DevTools props for function components, forwardRef, memo, host components, etc. + var copyWithSet = function (obj, path, value) { + return copyWithSetImpl(obj, path, 0, value); + }; // Support DevTools editable values for useState and useReducer. - overrideProps = function (fiber, path, value) { - fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value); + overrideHookState = function (fiber, id, path, value) { + // For now, the "id" of stateful hooks is just the stateful hook index. + // This may change in the future with e.g. nested hooks. + var currentHook = fiber.memoizedState; - if (fiber.alternate) { - fiber.alternate.pendingProps = fiber.pendingProps; - } + while (currentHook !== null && id > 0) { + currentHook = currentHook.next; + id--; + } - scheduleWork(fiber, Sync); - }; + if (currentHook !== null) { + var newState = copyWithSet(currentHook.memoizedState, path, value); + currentHook.memoizedState = newState; + currentHook.baseState = newState; // We aren't actually adding an update to the queue, + // because there is no update we can add for useReducer hooks that won't trigger an error. + // (There's no appropriate action type for DevTools overrides.) + // As a result though, React will see the scheduled update as a noop and bailout. + // Shallow cloning props works as a workaround for now to bypass the bailout check. - scheduleUpdate = function (fiber) { - scheduleWork(fiber, Sync); - }; + fiber.memoizedProps = _assign({}, fiber.memoizedProps); + scheduleWork(fiber, Sync); + } + }; // Support DevTools props for function components, forwardRef, memo, host components, etc. - setSuspenseHandler = function (newShouldSuspendImpl) { - shouldSuspendImpl = newShouldSuspendImpl; - }; -} - -function injectIntoDevTools(devToolsConfig) { - var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance; - var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; - return injectInternals(_assign({}, devToolsConfig, { - overrideHookState: overrideHookState, - overrideProps: overrideProps, - setSuspenseHandler: setSuspenseHandler, - scheduleUpdate: scheduleUpdate, - currentDispatcherRef: ReactCurrentDispatcher, - findHostInstanceByFiber: function (fiber) { - var hostFiber = findCurrentHostFiber(fiber); - if (hostFiber === null) { - return null; - } + overrideProps = function (fiber, path, value) { + fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value); - return hostFiber.stateNode; - }, - findFiberByHostInstance: function (instance) { - if (!findFiberByHostInstance) { - // Might not be implemented by the renderer. - return null; + if (fiber.alternate) { + fiber.alternate.pendingProps = fiber.pendingProps; } - return findFiberByHostInstance(instance); - }, - // React Refresh - findHostInstancesForRefresh: findHostInstancesForRefresh, - scheduleRefresh: scheduleRefresh, - scheduleRoot: scheduleRoot, - setRefreshHandler: setRefreshHandler, - // Enables DevTools to append owner stacks to error messages in DEV mode. - getCurrentFiber: function () { - return current; - } - })); -} + scheduleWork(fiber, Sync); + }; -// This file intentionally does *not* have the Flow annotation. -// Don't add it. See `./inline-typed.js` for an explanation. + scheduleUpdate = function (fiber) { + scheduleWork(fiber, Sync); + }; -// TODO: This type is shared between the reconciler and ReactDOM, but will -// eventually be lifted out to the renderer. -function ReactDOMRoot(container, options) { - this._internalRoot = createRootImpl(container, ConcurrentRoot, options); -} + setSuspenseHandler = function (newShouldSuspendImpl) { + shouldSuspendImpl = newShouldSuspendImpl; + }; + } -function ReactDOMBlockingRoot(container, tag, options) { - this._internalRoot = createRootImpl(container, tag, options); -} + function injectIntoDevTools(devToolsConfig) { + var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance; + var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; + return injectInternals(_assign({}, devToolsConfig, { + overrideHookState: overrideHookState, + overrideProps: overrideProps, + setSuspenseHandler: setSuspenseHandler, + scheduleUpdate: scheduleUpdate, + currentDispatcherRef: ReactCurrentDispatcher, + findHostInstanceByFiber: function (fiber) { + var hostFiber = findCurrentHostFiber(fiber); -ReactDOMRoot.prototype.render = ReactDOMBlockingRoot.prototype.render = function (children, callback) { - var root = this._internalRoot; - var cb = callback === undefined ? null : callback; + if (hostFiber === null) { + return null; + } - { - warnOnInvalidCallback(cb, 'render'); - } + return hostFiber.stateNode; + }, + findFiberByHostInstance: function (instance) { + if (!findFiberByHostInstance) { + // Might not be implemented by the renderer. + return null; + } - updateContainer(children, root, null, cb); -}; + return findFiberByHostInstance(instance); + }, + // React Refresh + findHostInstancesForRefresh: findHostInstancesForRefresh , + scheduleRefresh: scheduleRefresh , + scheduleRoot: scheduleRoot , + setRefreshHandler: setRefreshHandler , + // Enables DevTools to append owner stacks to error messages in DEV mode. + getCurrentFiber: function () { + return current; + } + })); + } + var IsSomeRendererActing$1 = ReactSharedInternals.IsSomeRendererActing; -ReactDOMRoot.prototype.unmount = ReactDOMBlockingRoot.prototype.unmount = function (callback) { - var root = this._internalRoot; - var cb = callback === undefined ? null : callback; + function ReactDOMRoot(container, options) { + this._internalRoot = createRootImpl(container, ConcurrentRoot, options); + } - { - warnOnInvalidCallback(cb, 'render'); + function ReactDOMBlockingRoot(container, tag, options) { + this._internalRoot = createRootImpl(container, tag, options); } - var container = root.containerInfo; - updateContainer(null, root, null, function () { - unmarkContainerAsRoot(container); + ReactDOMRoot.prototype.render = ReactDOMBlockingRoot.prototype.render = function (children) { + var root = this._internalRoot; - if (cb !== null) { - cb(); - } - }); -}; + { + if (typeof arguments[1] === 'function') { + error('render(...): does not support the second callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().'); + } -function createRootImpl(container, tag, options) { - // Tag is either LegacyRoot or Concurrent Root - var hydrate = options != null && options.hydrate === true; - var hydrationCallbacks = options != null && options.hydrationOptions || null; - var root = createContainer(container, tag, hydrate, hydrationCallbacks); - markContainerAsRoot(root.current, container); + var container = root.containerInfo; - if (hydrate && tag !== LegacyRoot) { - var doc = container.nodeType === DOCUMENT_NODE ? container : container.ownerDocument; - eagerlyTrapReplayableEvents(doc); - } + if (container.nodeType !== COMMENT_NODE) { + var hostInstance = findHostInstanceWithNoPortals(root.current); + + if (hostInstance) { + if (hostInstance.parentNode !== container) { + error('render(...): It looks like the React-rendered content of the ' + 'root container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + "root.unmount() to empty a root's container."); + } + } + } + } - return root; -} + updateContainer(children, root, null, null); + }; -function createRoot(container, options) { - if (!isValidContainer(container)) { + ReactDOMRoot.prototype.unmount = ReactDOMBlockingRoot.prototype.unmount = function () { { - throw Error("createRoot(...): Target container is not a DOM element."); + if (typeof arguments[0] === 'function') { + error('unmount(...): does not support a callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().'); + } } - } - warnIfReactDOMContainerInDEV(container); - return new ReactDOMRoot(container, options); -} -function createBlockingRoot(container, options) { - if (!isValidContainer(container)) { - { - throw Error("createRoot(...): Target container is not a DOM element."); + var root = this._internalRoot; + var container = root.containerInfo; + updateContainer(null, root, null, function () { + unmarkContainerAsRoot(container); + }); + }; + + function createRootImpl(container, tag, options) { + // Tag is either LegacyRoot or Concurrent Root + var hydrate = options != null && options.hydrate === true; + var hydrationCallbacks = options != null && options.hydrationOptions || null; + var root = createContainer(container, tag, hydrate); + markContainerAsRoot(root.current, container); + + if (hydrate && tag !== LegacyRoot) { + var doc = container.nodeType === DOCUMENT_NODE ? container : container.ownerDocument; + eagerlyTrapReplayableEvents(container, doc); } - } - warnIfReactDOMContainerInDEV(container); - return new ReactDOMBlockingRoot(container, BlockingRoot, options); -} -function createLegacyRoot(container, options) { - return new ReactDOMBlockingRoot(container, LegacyRoot, options); -} -function isValidContainer(node) { - return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || node.nodeType === COMMENT_NODE && node.nodeValue === ' react-mount-point-unstable ')); -} -function warnOnInvalidCallback(callback, callerName) { - { - !(callback === null || typeof callback === 'function') ? warningWithoutStack$1(false, '%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback) : void 0; + return root; + } + function createLegacyRoot(container, options) { + return new ReactDOMBlockingRoot(container, LegacyRoot, options); + } + function isValidContainer(node) { + return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || node.nodeType === COMMENT_NODE && node.nodeValue === ' react-mount-point-unstable ')); } -} -function warnIfReactDOMContainerInDEV(container) { + var ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner; + var topLevelUpdateWarnings; + var warnedAboutHydrateAPI = false; + { - if (isContainerMarkedAsRoot(container)) { - if (container._reactRootContainer) { - warningWithoutStack$1(false, 'You are calling ReactDOM.createRoot() on a container that was previously ' + 'passed to ReactDOM.render(). This is not supported.'); - } else { - warningWithoutStack$1(false, 'You are calling ReactDOM.createRoot() on a container that ' + 'has already been passed to createRoot() before. Instead, call ' + 'root.render() on the existing root instead if you want to update it.'); + topLevelUpdateWarnings = function (container) { + if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) { + var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer._internalRoot.current); + + if (hostInstance) { + if (hostInstance.parentNode !== container) { + error('render(...): It looks like the React-rendered content of this ' + 'container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + 'ReactDOM.unmountComponentAtNode to empty a container.'); + } + } } - } - } -} -var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner; -var topLevelUpdateWarnings; -var warnedAboutHydrateAPI = false; + var isRootRenderedBySomeReact = !!container._reactRootContainer; + var rootEl = getReactRootElementInContainer(container); + var hasNonRootReactChild = !!(rootEl && getInstanceFromNode$1(rootEl)); -{ - topLevelUpdateWarnings = function (container) { - if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) { - var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer._internalRoot.current); + if (hasNonRootReactChild && !isRootRenderedBySomeReact) { + error('render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.'); + } - if (hostInstance) { - !(hostInstance.parentNode === container) ? warningWithoutStack$1(false, 'render(...): It looks like the React-rendered content of this ' + 'container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + 'ReactDOM.unmountComponentAtNode to empty a container.') : void 0; + if (container.nodeType === ELEMENT_NODE && container.tagName && container.tagName.toUpperCase() === 'BODY') { + error('render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.'); } - } + }; + } - var isRootRenderedBySomeReact = !!container._reactRootContainer; - var rootEl = getReactRootElementInContainer(container); - var hasNonRootReactChild = !!(rootEl && getInstanceFromNode$1(rootEl)); - !(!hasNonRootReactChild || isRootRenderedBySomeReact) ? warningWithoutStack$1(false, 'render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.') : void 0; - !(container.nodeType !== ELEMENT_NODE || !container.tagName || container.tagName.toUpperCase() !== 'BODY') ? warningWithoutStack$1(false, 'render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.') : void 0; - }; -} + function getReactRootElementInContainer(container) { + if (!container) { + return null; + } -function getReactRootElementInContainer(container) { - if (!container) { - return null; + if (container.nodeType === DOCUMENT_NODE) { + return container.documentElement; + } else { + return container.firstChild; + } } - if (container.nodeType === DOCUMENT_NODE) { - return container.documentElement; - } else { - return container.firstChild; + function shouldHydrateDueToLegacyHeuristic(container) { + var rootElement = getReactRootElementInContainer(container); + return !!(rootElement && rootElement.nodeType === ELEMENT_NODE && rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME)); } -} -function shouldHydrateDueToLegacyHeuristic(container) { - var rootElement = getReactRootElementInContainer(container); - return !!(rootElement && rootElement.nodeType === ELEMENT_NODE && rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME)); -} + function legacyCreateRootFromDOMContainer(container, forceHydrate) { + var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container); // First clear any existing content. -function legacyCreateRootFromDOMContainer(container, forceHydrate) { - var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container); // First clear any existing content. + if (!shouldHydrate) { + var warned = false; + var rootSibling; - if (!shouldHydrate) { - var warned = false; - var rootSibling; + while (rootSibling = container.lastChild) { + { + if (!warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME)) { + warned = true; - while (rootSibling = container.lastChild) { - { - if (!warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME)) { - warned = true; - warningWithoutStack$1(false, 'render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.'); + error('render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.'); + } } + + container.removeChild(rootSibling); } + } + + { + if (shouldHydrate && !forceHydrate && !warnedAboutHydrateAPI) { + warnedAboutHydrateAPI = true; - container.removeChild(rootSibling); + warn('render(): Calling ReactDOM.render() to hydrate server-rendered markup ' + 'will stop working in React v17. Replace the ReactDOM.render() call ' + 'with ReactDOM.hydrate() if you want React to attach to the server HTML.'); + } } + + return createLegacyRoot(container, shouldHydrate ? { + hydrate: true + } : undefined); } - { - if (shouldHydrate && !forceHydrate && !warnedAboutHydrateAPI) { - warnedAboutHydrateAPI = true; - lowPriorityWarningWithoutStack$1(false, 'render(): Calling ReactDOM.render() to hydrate server-rendered markup ' + 'will stop working in React v17. Replace the ReactDOM.render() call ' + 'with ReactDOM.hydrate() if you want React to attach to the server HTML.'); + function warnOnInvalidCallback$1(callback, callerName) { + { + if (callback !== null && typeof callback !== 'function') { + error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback); + } } } - return createLegacyRoot(container, shouldHydrate ? { - hydrate: true - } : undefined); -} + function legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) { + { + topLevelUpdateWarnings(container); + warnOnInvalidCallback$1(callback === undefined ? null : callback, 'render'); + } // TODO: Without `any` type, Flow says "Property cannot be accessed on any + // member of intersection type." Whyyyyyy. -function legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) { - { - topLevelUpdateWarnings(container); - warnOnInvalidCallback(callback === undefined ? null : callback, 'render'); - } // TODO: Without `any` type, Flow says "Property cannot be accessed on any - // member of intersection type." Whyyyyyy. + var root = container._reactRootContainer; + var fiberRoot; - var root = container._reactRootContainer; - var fiberRoot; + if (!root) { + // Initial mount + root = container._reactRootContainer = legacyCreateRootFromDOMContainer(container, forceHydrate); + fiberRoot = root._internalRoot; - if (!root) { - // Initial mount - root = container._reactRootContainer = legacyCreateRootFromDOMContainer(container, forceHydrate); - fiberRoot = root._internalRoot; + if (typeof callback === 'function') { + var originalCallback = callback; - if (typeof callback === 'function') { - var originalCallback = callback; + callback = function () { + var instance = getPublicRootInstance(fiberRoot); + originalCallback.call(instance); + }; + } // Initial mount should not be batched. - callback = function () { - var instance = getPublicRootInstance(fiberRoot); - originalCallback.call(instance); - }; - } // Initial mount should not be batched. + unbatchedUpdates(function () { + updateContainer(children, fiberRoot, parentComponent, callback); + }); + } else { + fiberRoot = root._internalRoot; - unbatchedUpdates(function () { - updateContainer(children, fiberRoot, parentComponent, callback); - }); - } else { - fiberRoot = root._internalRoot; + if (typeof callback === 'function') { + var _originalCallback = callback; - if (typeof callback === 'function') { - var _originalCallback = callback; + callback = function () { + var instance = getPublicRootInstance(fiberRoot); - callback = function () { - var instance = getPublicRootInstance(fiberRoot); + _originalCallback.call(instance); + }; + } // Update - _originalCallback.call(instance); - }; - } // Update + updateContainer(children, fiberRoot, parentComponent, callback); + } - updateContainer(children, fiberRoot, parentComponent, callback); + return getPublicRootInstance(fiberRoot); } - return getPublicRootInstance(fiberRoot); -} + function findDOMNode(componentOrElement) { + { + var owner = ReactCurrentOwner$3.current; + + if (owner !== null && owner.stateNode !== null) { + var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender; -function findDOMNode(componentOrElement) { - { - var owner = ReactCurrentOwner$1.current; + if (!warnedAboutRefsInRender) { + error('%s is accessing findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(owner.type) || 'A component'); + } - if (owner !== null && owner.stateNode !== null) { - var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender; - !warnedAboutRefsInRender ? warningWithoutStack$1(false, '%s is accessing findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(owner.type) || 'A component') : void 0; - owner.stateNode._warnedAboutRefsInRender = true; + owner.stateNode._warnedAboutRefsInRender = true; + } } - } - - if (componentOrElement == null) { - return null; - } - if (componentOrElement.nodeType === ELEMENT_NODE) { - return componentOrElement; - } + if (componentOrElement == null) { + return null; + } - { - return findHostInstanceWithWarning(componentOrElement, 'findDOMNode'); - } + if (componentOrElement.nodeType === ELEMENT_NODE) { + return componentOrElement; + } - return findHostInstance(componentOrElement); -} -function hydrate(element, container, callback) { - if (!isValidContainer(container)) { { - throw Error("Target container is not a DOM element."); + return findHostInstanceWithWarning(componentOrElement, 'findDOMNode'); } } - - { - var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined; - - if (isModernRoot) { - warningWithoutStack$1(false, 'You are calling ReactDOM.hydrate() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call createRoot(container, {hydrate: true}).render(element)?'); + function hydrate(element, container, callback) { + if (!isValidContainer(container)) { + { + throw Error( "Target container is not a DOM element." ); + } } - } // TODO: throw or warn if we couldn't hydrate? - - return legacyRenderSubtreeIntoContainer(null, element, container, true, callback); -} -function render(element, container, callback) { - if (!isValidContainer(container)) { { - throw Error("Target container is not a DOM element."); - } - } + var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined; - { - var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined; + if (isModernRoot) { + error('You are calling ReactDOM.hydrate() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call createRoot(container, {hydrate: true}).render(element)?'); + } + } // TODO: throw or warn if we couldn't hydrate? - if (isModernRoot) { - warningWithoutStack$1(false, 'You are calling ReactDOM.render() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call root.render(element)?'); - } + + return legacyRenderSubtreeIntoContainer(null, element, container, true, callback); } + function render(element, container, callback) { + if (!isValidContainer(container)) { + { + throw Error( "Target container is not a DOM element." ); + } + } - return legacyRenderSubtreeIntoContainer(null, element, container, false, callback); -} -function unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) { - if (!isValidContainer(containerNode)) { { - throw Error("Target container is not a DOM element."); + var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined; + + if (isModernRoot) { + error('You are calling ReactDOM.render() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call root.render(element)?'); + } } + + return legacyRenderSubtreeIntoContainer(null, element, container, false, callback); } + function unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) { + if (!isValidContainer(containerNode)) { + { + throw Error( "Target container is not a DOM element." ); + } + } - if (!(parentComponent != null && has$1(parentComponent))) { - { - throw Error("parentComponent must be a valid React Component"); + if (!(parentComponent != null && has$1(parentComponent))) { + { + throw Error( "parentComponent must be a valid React Component" ); + } } + + return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback); } + function unmountComponentAtNode(container) { + if (!isValidContainer(container)) { + { + throw Error( "unmountComponentAtNode(...): Target container is not a DOM element." ); + } + } - return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback); -} -function unmountComponentAtNode(container) { - if (!isValidContainer(container)) { { - throw Error("unmountComponentAtNode(...): Target container is not a DOM element."); + var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined; + + if (isModernRoot) { + error('You are calling ReactDOM.unmountComponentAtNode() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. Did you mean to call root.unmount()?'); + } } - } - { - var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined; + if (container._reactRootContainer) { + { + var rootEl = getReactRootElementInContainer(container); + var renderedByDifferentReact = rootEl && !getInstanceFromNode$1(rootEl); - if (isModernRoot) { - warningWithoutStack$1(false, 'You are calling ReactDOM.unmountComponentAtNode() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. Did you mean to call root.unmount()?'); - } - } + if (renderedByDifferentReact) { + error("unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by another copy of React.'); + } + } // Unmount should not be batched. - if (container._reactRootContainer) { - { - var rootEl = getReactRootElementInContainer(container); - var renderedByDifferentReact = rootEl && !getInstanceFromNode$1(rootEl); - !!renderedByDifferentReact ? warningWithoutStack$1(false, "unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by another copy of React.') : void 0; - } // Unmount should not be batched. + unbatchedUpdates(function () { + legacyRenderSubtreeIntoContainer(null, null, container, false, function () { + // $FlowFixMe This should probably use `delete container._reactRootContainer` + container._reactRootContainer = null; + unmarkContainerAsRoot(container); + }); + }); // If you call unmountComponentAtNode twice in quick succession, you'll + // get `true` twice. That's probably fine? - unbatchedUpdates(function () { - legacyRenderSubtreeIntoContainer(null, null, container, false, function () { - container._reactRootContainer = null; - unmarkContainerAsRoot(container); - }); - }); // If you call unmountComponentAtNode twice in quick succession, you'll - // get `true` twice. That's probably fine? + return true; + } else { + { + var _rootEl = getReactRootElementInContainer(container); - return true; - } else { - { - var _rootEl = getReactRootElementInContainer(container); + var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode$1(_rootEl)); // Check if the container itself is a React root node. - var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode$1(_rootEl)); // Check if the container itself is a React root node. + var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer; - var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer; - !!hasNonRootReactChild ? warningWithoutStack$1(false, "unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.') : void 0; - } + if (hasNonRootReactChild) { + error("unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.'); + } + } - return false; + return false; + } } -} - -function createPortal$1(children, containerInfo, // TODO: figure out the API for cross-renderer implementation. -implementation) { - var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; - return { - // This tag allow us to uniquely identify this as a React Portal - $$typeof: REACT_PORTAL_TYPE, - key: key == null ? null : '' + key, - children: children, - containerInfo: containerInfo, - implementation: implementation - }; -} -// TODO: this is special because it gets imported during build. + function createPortal(children, containerInfo, // TODO: figure out the API for cross-renderer implementation. + implementation) { + var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; + return { + // This tag allow us to uniquely identify this as a React Portal + $$typeof: REACT_PORTAL_TYPE, + key: key == null ? null : '' + key, + children: children, + containerInfo: containerInfo, + implementation: implementation + }; + } -var ReactVersion = '16.12.0'; + var ReactVersion = '16.13.1'; -setAttemptSynchronousHydration(attemptSynchronousHydration$1); -setAttemptUserBlockingHydration(attemptUserBlockingHydration$1); -setAttemptContinuousHydration(attemptContinuousHydration$1); -setAttemptHydrationAtCurrentPriority(attemptHydrationAtCurrentPriority$1); -var didWarnAboutUnstableCreatePortal = false; + setAttemptUserBlockingHydration(attemptUserBlockingHydration$1); + setAttemptContinuousHydration(attemptContinuousHydration$1); + setAttemptHydrationAtCurrentPriority(attemptHydrationAtCurrentPriority$1); + var didWarnAboutUnstableCreatePortal = false; -{ - if (typeof Map !== 'function' || // $FlowIssue Flow incorrectly thinks Map has no prototype - Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' || // $FlowIssue Flow incorrectly thinks Set has no prototype - Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') { - warningWithoutStack$1(false, 'React depends on Map and Set built-in types. Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills'); + { + if (typeof Map !== 'function' || // $FlowIssue Flow incorrectly thinks Map has no prototype + Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' || // $FlowIssue Flow incorrectly thinks Set has no prototype + Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') { + error('React depends on Map and Set built-in types. Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills'); + } } -} - -setRestoreImplementation(restoreControlledState$$1); -setBatchingImplementation(batchedUpdates$1, discreteUpdates$1, flushDiscreteUpdates, batchedEventUpdates$1); -function createPortal$$1(children, container) { - var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + setRestoreImplementation(restoreControlledState$3); + setBatchingImplementation(batchedUpdates$1, discreteUpdates$1, flushDiscreteUpdates, batchedEventUpdates$1); - if (!isValidContainer(container)) { - { - throw Error("Target container is not a DOM element."); - } - } // TODO: pass ReactDOM portal implementation as third argument - - - return createPortal$1(children, container, null, key); -} - -var ReactDOM = { - createPortal: createPortal$$1, - // Legacy - findDOMNode: findDOMNode, - hydrate: hydrate, - render: render, - unstable_renderSubtreeIntoContainer: unstable_renderSubtreeIntoContainer, - unmountComponentAtNode: unmountComponentAtNode, - // Temporary alias since we already shipped React 16 RC with it. - // TODO: remove in React 17. - unstable_createPortal: function () { - if (!didWarnAboutUnstableCreatePortal) { - didWarnAboutUnstableCreatePortal = true; - lowPriorityWarningWithoutStack$1(false, 'The ReactDOM.unstable_createPortal() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactDOM.createPortal() instead. It has the exact same API, ' + 'but without the "unstable_" prefix.'); - } - - return createPortal$$1.apply(void 0, arguments); - }, - unstable_batchedUpdates: batchedUpdates$1, - flushSync: flushSync, - __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: { - // Keep in sync with ReactDOMUnstableNativeDependencies.js - // ReactTestUtils.js, and ReactTestUtilsAct.js. This is an array for better minification. - Events: [getInstanceFromNode$1, getNodeFromInstance$1, getFiberCurrentPropsFromNode$1, injection.injectEventPluginsByName, eventNameDispatchConfigs, accumulateTwoPhaseDispatches, accumulateDirectDispatches, enqueueStateRestore, restoreStateIfNeeded, dispatchEvent, runEventsInBatch, flushPassiveEffects, IsThisRendererActing] - } -}; + function createPortal$1(children, container) { + var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; -if (exposeConcurrentModeAPIs) { - ReactDOM.createRoot = createRoot; - ReactDOM.createBlockingRoot = createBlockingRoot; - ReactDOM.unstable_discreteUpdates = discreteUpdates$1; - ReactDOM.unstable_flushDiscreteUpdates = flushDiscreteUpdates; - ReactDOM.unstable_flushControlled = flushControlled; + if (!isValidContainer(container)) { + { + throw Error( "Target container is not a DOM element." ); + } + } // TODO: pass ReactDOM portal implementation as third argument + // $FlowFixMe The Flow type is opaque but there's no way to actually create it. - ReactDOM.unstable_scheduleHydration = function (target) { - if (target) { - queueExplicitHydrationTarget(target); - } - }; -} -var foundDevTools = injectIntoDevTools({ - findFiberByHostInstance: getClosestInstanceFromNode, - bundleType: 1, - version: ReactVersion, - rendererPackageName: 'react-dom' -}); + return createPortal(children, container, null, key); + } -{ - if (!foundDevTools && canUseDOM && window.top === window.self) { - // If we're in Chrome or Firefox, provide a download link if not installed. - if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) { - var protocol = window.location.protocol; // Don't warn in exotic cases like chrome-extension://. + function renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) { - if (/^(https?|file):$/.test(protocol)) { - console.info('%cDownload the React DevTools ' + 'for a better development experience: ' + 'https://fb.me/react-devtools' + (protocol === 'file:' ? '\nYou might need to use a local HTTP server (instead of file://): ' + 'https://fb.me/react-devtools-faq' : ''), 'font-weight:bold'); - } - } + return unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback); } -} + function unstable_createPortal(children, container) { + var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + { + if (!didWarnAboutUnstableCreatePortal) { + didWarnAboutUnstableCreatePortal = true; -var ReactDOM$2 = Object.freeze({ - default: ReactDOM -}); + warn('The ReactDOM.unstable_createPortal() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactDOM.createPortal() instead. It has the exact same API, ' + 'but without the "unstable_" prefix.'); + } + } -var ReactDOM$3 = ( ReactDOM$2 && ReactDOM ) || ReactDOM$2; + return createPortal$1(children, container, key); + } -// TODO: decide on the top-level export form. -// This is hacky but makes it work with both Rollup and Jest. + var Internals = { + // Keep in sync with ReactDOMUnstableNativeDependencies.js + // ReactTestUtils.js, and ReactTestUtilsAct.js. This is an array for better minification. + Events: [getInstanceFromNode$1, getNodeFromInstance$1, getFiberCurrentPropsFromNode$1, injectEventPluginsByName, eventNameDispatchConfigs, accumulateTwoPhaseDispatches, accumulateDirectDispatches, enqueueStateRestore, restoreStateIfNeeded, dispatchEvent, runEventsInBatch, flushPassiveEffects, IsThisRendererActing] + }; + var foundDevTools = injectIntoDevTools({ + findFiberByHostInstance: getClosestInstanceFromNode, + bundleType: 1 , + version: ReactVersion, + rendererPackageName: 'react-dom' + }); + { + if (!foundDevTools && canUseDOM && window.top === window.self) { + // If we're in Chrome or Firefox, provide a download link if not installed. + if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) { + var protocol = window.location.protocol; // Don't warn in exotic cases like chrome-extension://. -var reactDom = ReactDOM$3.default || ReactDOM$3; + if (/^(https?|file):$/.test(protocol)) { + // eslint-disable-next-line react-internal/no-production-logging + console.info('%cDownload the React DevTools ' + 'for a better development experience: ' + 'https://fb.me/react-devtools' + (protocol === 'file:' ? '\nYou might need to use a local HTTP server (instead of file://): ' + 'https://fb.me/react-devtools-faq' : ''), 'font-weight:bold'); + } + } + } + } -return reactDom; + exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = Internals; + exports.createPortal = createPortal$1; + exports.findDOMNode = findDOMNode; + exports.flushSync = flushSync; + exports.hydrate = hydrate; + exports.render = render; + exports.unmountComponentAtNode = unmountComponentAtNode; + exports.unstable_batchedUpdates = batchedUpdates$1; + exports.unstable_createPortal = unstable_createPortal; + exports.unstable_renderSubtreeIntoContainer = renderSubtreeIntoContainer; + exports.version = ReactVersion; }))); diff --git a/browser/components/newtab/vendor/react-dom.js b/browser/components/newtab/vendor/react-dom.js index c932590d62da44ab441a7d4d9f63e6f0a484289d..8ddde060c7389aa22423c24714b39200b0c5b09a 100644 --- a/browser/components/newtab/vendor/react-dom.js +++ b/browser/components/newtab/vendor/react-dom.js @@ -1,4 +1,4 @@ -/** @license React v16.12.0 +/** @license React v16.13.1 * react-dom.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. @@ -9,234 +9,231 @@ /* Modernizr 3.0.0pre (Custom Build) | MIT */ -'use strict';(function(la,m){"object"===typeof exports&&"undefined"!==typeof module?module.exports=m(require("react")):"function"===typeof define&&define.amd?define(["react"],m):la.ReactDOM=m(la.React)})(this,function(la){function m(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c<arguments.length;c++)b+="&args[]="+encodeURIComponent(arguments[c]);return"Minified React error #"+a+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."} -function uf(){if(qc)for(var a in bb){var b=bb[a],c=qc.indexOf(a);if(!(-1<c))throw Error(m(96,a));if(!rc[c]){if(!b.extractEvents)throw Error(m(97,a));rc[c]=b;c=b.eventTypes;for(var d in c){var e=void 0;var f=c[d],g=b,h=d;if(wd.hasOwnProperty(h))throw Error(m(99,h));wd[h]=f;var k=f.phasedRegistrationNames;if(k){for(e in k)k.hasOwnProperty(e)&&vf(k[e],g,h);e=!0}else f.registrationName?(vf(f.registrationName,g,h),e=!0):e=!1;if(!e)throw Error(m(98,d,a));}}}}function vf(a,b,c){if(cb[a])throw Error(m(100, -a));cb[a]=b;xd[a]=b.eventTypes[c].dependencies}function Ai(a,b,c,d,e,f,g,h,k){Cb=!1;sc=null;Bi.apply(Ci,arguments)}function Di(a,b,c,d,e,f,g,h,k){Ai.apply(this,arguments);if(Cb){if(Cb){var l=sc;Cb=!1;sc=null}else throw Error(m(198));tc||(tc=!0,yd=l)}}function wf(a,b,c){var d=a.type||"unknown-event";a.currentTarget=xf(c);Di(d,b,void 0,a);a.currentTarget=null}function db(a,b){if(null==b)throw Error(m(30));if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b); -return a}return Array.isArray(b)?[a].concat(b):[a,b]}function zd(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}function uc(a){null!==a&&(Db=db(Db,a));a=Db;Db=null;if(a){zd(a,Ei);if(Db)throw Error(m(95));if(tc)throw a=yd,tc=!1,yd=null,a;}}function yf(a,b){var c=a.stateNode;if(!c)return null;var d=Ad(c);if(!d)return null;c=d[b];a:switch(b){case "onClick":case "onClickCapture":case "onDoubleClick":case "onDoubleClickCapture":case "onMouseDown":case "onMouseDownCapture":case "onMouseMove":case "onMouseMoveCapture":case "onMouseUp":case "onMouseUpCapture":(d= -!d.disabled)||(a=a.type,d=!("button"===a||"input"===a||"select"===a||"textarea"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&"function"!==typeof c)throw Error(m(231,b,typeof c));return c}function Eb(a){if(null===a||"object"!==typeof a)return null;a=zf&&a[zf]||a["@@iterator"];return"function"===typeof a?a:null}function Fi(a){if(-1===a._status){a._status=0;var b=a._ctor;b=b();a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status= -2,a._result=b)})}}function ua(a){if(null==a)return null;if("function"===typeof a)return a.displayName||a.name||null;if("string"===typeof a)return a;switch(a){case va:return"Fragment";case eb:return"Portal";case vc:return"Profiler";case Af:return"StrictMode";case wc:return"Suspense";case Bd:return"SuspenseList"}if("object"===typeof a)switch(a.$$typeof){case Bf:return"Context.Consumer";case Cf:return"Context.Provider";case Cd:var b=a.render;b=b.displayName||b.name||"";return a.displayName||(""!==b? -"ForwardRef("+b+")":"ForwardRef");case Dd:return ua(a.type);case Df:if(a=1===a._status?a._result:null)return ua(a)}return null}function Ed(a){var b="";do{a:switch(a.tag){case 3:case 4:case 6:case 7:case 10:case 9:var c="";break a;default:var d=a._debugOwner,e=a._debugSource,f=ua(a.type);c=null;d&&(c=ua(d.type));d=f;f="";e?f=" (at "+e.fileName.replace(Gi,"")+":"+e.lineNumber+")":c&&(f=" (created by "+c+")");c="\n in "+(d||"Unknown")+f}b+=c;a=a.return}while(a);return b}function Ef(a){if(a=Ff(a)){if("function"!== -typeof Fd)throw Error(m(280));var b=Ad(a.stateNode);Fd(a.stateNode,a.type,b)}}function Gf(a){fb?gb?gb.push(a):gb=[a]:fb=a}function Hf(){if(fb){var a=fb,b=gb;gb=fb=null;Ef(a);if(b)for(a=0;a<b.length;a++)Ef(b[a])}}function Gd(){if(null!==fb||null!==gb)Hd(),Hf()}function Hi(a){if(If.call(Jf,a))return!0;if(If.call(Kf,a))return!1;if(Ii.test(a))return Jf[a]=!0;Kf[a]=!0;return!1}function Ji(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case "function":case "symbol":return!0;case "boolean":if(d)return!1; -if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return"data-"!==a&&"aria-"!==a;default:return!1}}function Ki(a,b,c,d){if(null===b||"undefined"===typeof b||Ji(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function E(a,b,c,d,e,f){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL= -f}function wa(a){switch(typeof a){case "boolean":case "number":case "object":case "string":case "undefined":return a;default:return""}}function Id(a,b,c,d){var e=C.hasOwnProperty(b)?C[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||"o"!==b[0]&&"O"!==b[0]||"n"!==b[1]&&"N"!==b[1]?!1:!0;f||(Ki(b,c,e,d)&&(c=null),d||null===e?Hi(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,""+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:"":c:(b=e.attributeName,d=e.attributeNamespace,null=== -c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?"":""+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}function Lf(a){var b=a.type;return(a=a.nodeName)&&"input"===a.toLowerCase()&&("checkbox"===b||"radio"===b)}function Li(a){var b=Lf(a)?"checked":"value",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=""+a[b];if(!a.hasOwnProperty(b)&&"undefined"!==typeof c&&"function"===typeof c.get&&"function"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0, -get:function(){return e.call(this)},set:function(a){d=""+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=""+a},stopTracking:function(){a._valueTracker=null;delete a[b]}}}}function xc(a){a._valueTracker||(a._valueTracker=Li(a))}function Mf(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d="";a&&(d=Lf(a)?a.checked?"true":"false":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Jd(a, -b){var c=b.checked;return J({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Nf(a,b){var c=null==b.defaultValue?"":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=wa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:"checkbox"===b.type||"radio"===b.type?null!=b.checked:null!=b.value}}function Of(a,b){b=b.checked;null!=b&&Id(a,"checked",b,!1)}function Kd(a,b){Of(a,b);var c=wa(b.value), -d=b.type;if(null!=c)if("number"===d){if(0===c&&""===a.value||a.value!=c)a.value=""+c}else a.value!==""+c&&(a.value=""+c);else if("submit"===d||"reset"===d){a.removeAttribute("value");return}b.hasOwnProperty("value")?Ld(a,b.type,c):b.hasOwnProperty("defaultValue")&&Ld(a,b.type,wa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}function Pf(a,b,c){if(b.hasOwnProperty("value")||b.hasOwnProperty("defaultValue")){var d=b.type;if(!("submit"!==d&&"reset"!== -d||void 0!==b.value&&null!==b.value))return;b=""+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;""!==c&&(a.name="");a.defaultChecked=!a.defaultChecked;a.defaultChecked=!!a._wrapperState.initialChecked;""!==c&&(a.name=c)}function Ld(a,b,c){if("number"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=""+a._wrapperState.initialValue:a.defaultValue!==""+c&&(a.defaultValue=""+c)}function Mi(a){var b="";la.Children.forEach(a,function(a){null!=a&&(b+=a)}); -return b}function Md(a,b){a=J({children:void 0},b);if(b=Mi(b.children))a.children=b;return a}function hb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b["$"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty("$"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=""+wa(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}function Nd(a,b){if(null!= -b.dangerouslySetInnerHTML)throw Error(m(91));return J({},b,{value:void 0,defaultValue:void 0,children:""+a._wrapperState.initialValue})}function Qf(a,b){var c=b.value;if(null==c){c=b.defaultValue;b=b.children;if(null!=b){if(null!=c)throw Error(m(92));if(Array.isArray(b)){if(!(1>=b.length))throw Error(m(93));b=b[0]}c=b}null==c&&(c="")}a._wrapperState={initialValue:wa(c)}}function Rf(a,b){var c=wa(b.value),d=wa(b.defaultValue);null!=c&&(c=""+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!== -c&&(a.defaultValue=c));null!=d&&(a.defaultValue=""+d)}function Sf(a,b){b=a.textContent;b===a._wrapperState.initialValue&&""!==b&&null!==b&&(a.value=b)}function Tf(a){switch(a){case "svg":return"http://www.w3.org/2000/svg";case "math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function Od(a,b){return null==a||"http://www.w3.org/1999/xhtml"===a?Tf(b):"http://www.w3.org/2000/svg"===a&&"foreignObject"===b?"http://www.w3.org/1999/xhtml":a}function yc(a,b){var c= -{};c[a.toLowerCase()]=b.toLowerCase();c["Webkit"+a]="webkit"+b;c["Moz"+a]="moz"+b;return c}function zc(a){if(Pd[a])return Pd[a];if(!ib[a])return a;var b=ib[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Uf)return Pd[a]=b[c];return a}function Na(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.effectTag&1026)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function Vf(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState)); -if(null!==b)return b.dehydrated}return null}function Wf(a){if(Na(a)!==a)throw Error(m(188));}function Ni(a){var b=a.alternate;if(!b){b=Na(a);if(null===b)throw Error(m(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return Wf(e),a;if(f===d)return Wf(e),b;f=f.sibling}throw Error(m(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h=== -c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===c){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(m(189));}}if(c.alternate!==d)throw Error(m(190));}if(3!==c.tag)throw Error(m(188));return c.stateNode.current===c?a:b}function Xf(a){a=Ni(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return= -b.return;b=b.sibling}}return null}function Oi(a){var b=Qd(a);Rd.forEach(function(c){Sd(c,a,b)});Pi.forEach(function(c){Sd(c,a,b)})}function Td(a,b,c,d){return{blockedOn:a,topLevelType:b,eventSystemFlags:c|32,nativeEvent:d}}function Yf(a,b){switch(a){case "focus":case "blur":xa=null;break;case "dragenter":case "dragleave":ya=null;break;case "mouseover":case "mouseout":za=null;break;case "pointerover":case "pointerout":Fb.delete(b.pointerId);break;case "gotpointercapture":case "lostpointercapture":Gb.delete(b.pointerId)}} -function Hb(a,b,c,d,e){if(null===a||a.nativeEvent!==e)return a=Td(b,c,d,e),null!==b&&(b=Ib(b),null!==b&&Zf(b)),a;a.eventSystemFlags|=d;return a}function Qi(a,b,c,d){switch(b){case "focus":return xa=Hb(xa,a,b,c,d),!0;case "dragenter":return ya=Hb(ya,a,b,c,d),!0;case "mouseover":return za=Hb(za,a,b,c,d),!0;case "pointerover":var e=d.pointerId;Fb.set(e,Hb(Fb.get(e)||null,a,b,c,d));return!0;case "gotpointercapture":return e=d.pointerId,Gb.set(e,Hb(Gb.get(e)||null,a,b,c,d)),!0}return!1}function Ri(a){var b= -Jb(a.target);if(null!==b){var c=Na(b);if(null!==c)if(b=c.tag,13===b){if(b=Vf(c),null!==b){a.blockedOn=b;Ud(a.priority,function(){Si(c)});return}}else if(3===b&&c.stateNode.hydrate){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}function Ac(a){if(null!==a.blockedOn)return!1;var b=Vd(a.topLevelType,a.eventSystemFlags,a.nativeEvent);if(null!==b){var c=Ib(b);null!==c&&Zf(c);a.blockedOn=b;return!1}return!0}function $f(a,b,c){Ac(a)&&c.delete(b)}function Ti(){for(Wd=!1;0<ba.length;){var a= -ba[0];if(null!==a.blockedOn){a=Ib(a.blockedOn);null!==a&&Ui(a);break}var b=Vd(a.topLevelType,a.eventSystemFlags,a.nativeEvent);null!==b?a.blockedOn=b:ba.shift()}null!==xa&&Ac(xa)&&(xa=null);null!==ya&&Ac(ya)&&(ya=null);null!==za&&Ac(za)&&(za=null);Fb.forEach($f);Gb.forEach($f)}function Kb(a,b){a.blockedOn===b&&(a.blockedOn=null,Wd||(Wd=!0,ag(bg,Ti)))}function cg(a){if(0<ba.length){Kb(ba[0],a);for(var b=1;b<ba.length;b++){var c=ba[b];c.blockedOn===a&&(c.blockedOn=null)}}null!==xa&&Kb(xa,a);null!== -ya&&Kb(ya,a);null!==za&&Kb(za,a);b=function(b){return Kb(b,a)};Fb.forEach(b);Gb.forEach(b);for(b=0;b<Lb.length;b++)c=Lb[b],c.blockedOn===a&&(c.blockedOn=null);for(;0<Lb.length&&(b=Lb[0],null===b.blockedOn);)Ri(b),null===b.blockedOn&&Lb.shift()}function Xd(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}function ma(a){do a=a.return;while(a&&5!==a.tag);return a?a:null}function dg(a,b,c){if(b=yf(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners= -db(c._dispatchListeners,b),c._dispatchInstances=db(c._dispatchInstances,a)}function Vi(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=ma(b);for(b=c.length;0<b--;)dg(c[b],"captured",a);for(b=0;b<c.length;b++)dg(c[b],"bubbled",a)}}function Yd(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=yf(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=db(c._dispatchListeners,b),c._dispatchInstances=db(c._dispatchInstances,a))}function Wi(a){a&&a.dispatchConfig.registrationName&& -Yd(a._targetInst,null,a)}function jb(a){zd(a,Vi)}function Bc(){return!0}function Cc(){return!1}function M(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):"target"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?Bc:Cc;this.isPropagationStopped=Cc;return this}function Xi(a,b,c,d){if(this.eventPool.length){var e=this.eventPool.pop(); -this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}function Yi(a){if(!(a instanceof this))throw Error(m(279));a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}function eg(a){a.eventPool=[];a.getPooled=Xi;a.release=Yi}function Dc(a){var b=a.keyCode;"charCode"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}function Zi(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=$i[a])?!!b[a]:!1}function Zd(a){return Zi}function aj(a){var b= -a.targetInst,c=b;do{if(!c){a.ancestors.push(c);break}var d=c;if(3===d.tag)d=d.stateNode.containerInfo;else{for(;d.return;)d=d.return;d=3!==d.tag?null:d.stateNode.containerInfo}if(!d)break;b=c.tag;5!==b&&6!==b||a.ancestors.push(c);c=Jb(d)}while(c);for(c=0;c<a.ancestors.length;c++){b=a.ancestors[c];var e=Xd(a.nativeEvent);d=a.topLevelType;for(var f=a.nativeEvent,g=a.eventSystemFlags,h=null,k=0;k<rc.length;k++){var l=rc[k];l&&(l=l.extractEvents(d,b,f,e,g))&&(h=db(h,l))}uc(h)}}function x(a,b){Mb(b,a, -!1)}function Mb(a,b,c){switch(bj(b)){case 0:var d=cj.bind(null,b,1);break;case 1:d=dj.bind(null,b,1);break;default:d=Ec.bind(null,b,1)}c?a.addEventListener(b,d,!0):a.addEventListener(b,d,!1)}function cj(a,b,c){Oa||Hd();var d=Ec,e=Oa;Oa=!0;try{fg(d,a,b,c)}finally{(Oa=e)||Gd()}}function dj(a,b,c){ej(fj,Ec.bind(null,a,b,c))}function gg(a,b,c,d){if(Fc.length){var e=Fc.pop();e.topLevelType=a;e.eventSystemFlags=b;e.nativeEvent=c;e.targetInst=d;a=e}else a={topLevelType:a,eventSystemFlags:b,nativeEvent:c, -targetInst:d,ancestors:[]};try{if(b=aj,c=a,$d)b(c,void 0);else{$d=!0;try{hg(b,c,void 0)}finally{$d=!1,Gd()}}}finally{a.topLevelType=null,a.nativeEvent=null,a.targetInst=null,a.ancestors.length=0,Fc.length<gj&&Fc.push(a)}}function Ec(a,b,c){if(Gc)if(0<ba.length&&-1<Rd.indexOf(a))a=Td(null,a,b,c),ba.push(a);else{var d=Vd(a,b,c);null===d?Yf(a,c):-1<Rd.indexOf(a)?(a=Td(d,a,b,c),ba.push(a)):Qi(d,a,b,c)||(Yf(a,c),gg(a,b,c,null))}}function Vd(a,b,c){var d=Xd(c);d=Jb(d);if(null!==d){var e=Na(d);if(null=== -e)d=null;else{var f=e.tag;if(13===f){d=Vf(e);if(null!==d)return d;d=null}else if(3===f){if(e.stateNode.hydrate)return 3===e.tag?e.stateNode.containerInfo:null;d=null}else e!==d&&(d=null)}}gg(a,b,c,d);return null}function ig(a){if(!Aa)return!1;a="on"+a;var b=a in document;b||(b=document.createElement("div"),b.setAttribute(a,"return;"),b="function"===typeof b[a]);return b}function Qd(a){var b=jg.get(a);void 0===b&&(b=new Set,jg.set(a,b));return b}function Sd(a,b,c){if(!c.has(a)){switch(a){case "scroll":Mb(b, -"scroll",!0);break;case "focus":case "blur":Mb(b,"focus",!0);Mb(b,"blur",!0);c.add("blur");c.add("focus");break;case "cancel":case "close":ig(a)&&Mb(b,a,!0);break;case "invalid":case "submit":case "reset":break;default:-1===Nb.indexOf(a)&&x(a,b)}c.add(a)}}function kg(a,b,c){return null==b||"boolean"===typeof b||""===b?"":c||"number"!==typeof b||0===b||Ob.hasOwnProperty(a)&&Ob[a]?(""+b).trim():b+"px"}function lg(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf("--"),e=kg(c, -b[c],d);"float"===c&&(c="cssFloat");d?a.setProperty(c,e):a[c]=e}}function ae(a,b){if(b){if(hj[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(m(137,a,""));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(m(60));if(!("object"===typeof b.dangerouslySetInnerHTML&&"__html"in b.dangerouslySetInnerHTML))throw Error(m(61));}if(null!=b.style&&"object"!==typeof b.style)throw Error(m(62,""));}}function be(a,b){if(-1===a.indexOf("-"))return"string"===typeof b.is;switch(a){case "annotation-xml":case "color-profile":case "font-face":case "font-face-src":case "font-face-uri":case "font-face-format":case "font-face-name":case "missing-glyph":return!1; -default:return!0}}function na(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=Qd(a);b=xd[b];for(var d=0;d<b.length;d++)Sd(b[d],a,c)}function Hc(){}function ce(a){a=a||("undefined"!==typeof document?document:void 0);if("undefined"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function mg(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function ng(a,b){var c=mg(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c, -offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=mg(c)}}function og(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?og(a,b.parentNode):"contains"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}function pg(){for(var a=window,b=ce();b instanceof a.HTMLIFrameElement;){try{var c="string"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=ce(a.document)}return b} -function de(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&("input"===b&&("text"===a.type||"search"===a.type||"tel"===a.type||"url"===a.type||"password"===a.type)||"textarea"===b||"true"===a.contentEditable)}function qg(a,b){switch(a){case "button":case "input":case "select":case "textarea":return!!b.autoFocus}return!1}function ee(a,b){return"textarea"===a||"option"===a||"noscript"===a||"string"===typeof b.children||"number"===typeof b.children||"object"===typeof b.dangerouslySetInnerHTML&& -null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}function kb(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break}return a}function rg(a){a=a.previousSibling;for(var b=0;a;){if(a.nodeType===Pa){var c=a.data;if(c===sg||c===fe||c===ge){if(0===b)return a;b--}else c===tg&&b++}a=a.previousSibling}return null}function Jb(a){var b=a[Ba];if(b)return b;for(var c=a.parentNode;c;){if(b=c[Pb]||c[Ba]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=rg(a);null!== -a;){if(c=a[Ba])return c;a=rg(a)}return b}a=c;c=a.parentNode}return null}function Ib(a){a=a[Ba]||a[Pb];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function Qa(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(m(33));}function he(a){return a[Ic]||null}function ug(){if(Jc)return Jc;var a,b=ie,c=b.length,d,e="value"in Ca?Ca.value:Ca.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return Jc=e.slice(a,1<d?1-d:void 0)}function vg(a, -b){switch(a){case "keyup":return-1!==ij.indexOf(b.keyCode);case "keydown":return 229!==b.keyCode;case "keypress":case "mousedown":case "blur":return!0;default:return!1}}function wg(a){a=a.detail;return"object"===typeof a&&"data"in a?a.data:null}function jj(a,b){switch(a){case "compositionend":return wg(b);case "keypress":if(32!==b.which)return null;xg=!0;return yg;case "textInput":return a=b.data,a===yg&&xg?null:a;default:return null}}function kj(a,b){if(lb)return"compositionend"===a||!je&&vg(a,b)? -(a=ug(),Jc=ie=Ca=null,lb=!1,a):null;switch(a){case "paste":return null;case "keypress":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case "compositionend":return zg&&"ko"!==b.locale?null:b.data;default:return null}}function Ag(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return"input"===b?!!lj[a.type]:"textarea"===b?!0:!1}function Bg(a,b,c){a=M.getPooled(Cg.change,a,b,c);a.type="change"; -Gf(c);jb(a);return a}function mj(a){uc(a)}function Kc(a){var b=Qa(a);if(Mf(b))return a}function nj(a,b){if("change"===a)return b}function Dg(){Qb&&(Qb.detachEvent("onpropertychange",Eg),Rb=Qb=null)}function Eg(a){if("value"===a.propertyName&&Kc(Rb))if(a=Bg(Rb,a,Xd(a)),Oa)uc(a);else{Oa=!0;try{ke(mj,a)}finally{Oa=!1,Gd()}}}function oj(a,b,c){"focus"===a?(Dg(),Qb=b,Rb=c,Qb.attachEvent("onpropertychange",Eg)):"blur"===a&&Dg()}function pj(a,b){if("selectionchange"===a||"keyup"===a||"keydown"===a)return Kc(Rb)} -function qj(a,b){if("click"===a)return Kc(b)}function rj(a,b){if("input"===a||"change"===a)return Kc(b)}function sj(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}function Sb(a,b){if(Ra(a,b))return!0;if("object"!==typeof a||null===a||"object"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!tj.call(b,c[d])||!Ra(a[c[d]],b[c[d]]))return!1;return!0}function Fg(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument; -if(le||null==mb||mb!==ce(c))return null;c=mb;"selectionStart"in c&&de(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return Tb&&Sb(Tb,c)?null:(Tb=c,a=M.getPooled(Gg.select,me,a,b),a.type="select",a.target=mb,jb(a),a)}function B(a,b){0>nb||(a.current=ne[nb],ne[nb]=null,nb--)}function y(a,b,c){nb++;ne[nb]=a.current;a.current= -b}function ob(a,b){var c=a.type.contextTypes;if(!c)return Da;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function K(a){a=a.childContextTypes;return null!==a&&void 0!==a}function Lc(a){B(Q,a);B(L,a)}function oe(a){B(Q,a);B(L,a)}function Hg(a,b,c){if(L.current!==Da)throw Error(m(168)); -y(L,b,a);y(Q,c,a)}function Ig(a,b,c){var d=a.stateNode;a=b.childContextTypes;if("function"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw Error(m(108,ua(b)||"Unknown",e));return J({},c,{},d)}function Mc(a){var b=a.stateNode;b=b&&b.__reactInternalMemoizedMergedChildContext||Da;Sa=L.current;y(L,b,a);y(Q,Q.current,a);return!0}function Jg(a,b,c){var d=a.stateNode;if(!d)throw Error(m(169));c?(b=Ig(a,b,Sa),d.__reactInternalMemoizedMergedChildContext=b,B(Q,a), -B(L,a),y(L,b,a)):B(Q,a);y(Q,c,a)}function pe(){switch(uj()){case Nc:return 99;case Kg:return 98;case Lg:return 97;case Mg:return 96;case Ng:return 95;default:throw Error(m(332));}}function Og(a){switch(a){case 99:return Nc;case 98:return Kg;case 97:return Lg;case 96:return Mg;case 95:return Ng;default:throw Error(m(332));}}function pb(a,b){a=Og(a);return vj(a,b)}function Pg(a,b,c){a=Og(a);return qe(a,b,c)}function Qg(a){null===oa?(oa=[a],Oc=qe(Nc,Rg)):oa.push(a);return Sg}function ca(){if(null!== -Oc){var a=Oc;Oc=null;Tg(a)}Rg()}function Rg(){if(!re&&null!==oa){re=!0;var a=0;try{var b=oa;pb(99,function(){for(;a<b.length;a++){var c=b[a];do c=c(!0);while(null!==c)}});oa=null}catch(c){throw null!==oa&&(oa=oa.slice(a+1)),qe(Nc,ca),c;}finally{re=!1}}}function Pc(a,b,c){c/=10;return 1073741821-(((1073741821-a+b/10)/c|0)+1)*c}function V(a,b){if(a&&a.defaultProps){b=J({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}function se(){Qc=qb=Rc=null}function Ug(a,b){var c=a.type._context; -y(te,c._currentValue,a);c._currentValue=b}function ue(a){var b=te.current;B(te,a);a.type._context._currentValue=b}function Vg(a,b){for(;null!==a;){var c=a.alternate;if(a.childExpirationTime<b)a.childExpirationTime=b,null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);else if(null!==c&&c.childExpirationTime<b)c.childExpirationTime=b;else break;a=a.return}}function rb(a,b){Rc=a;Qc=qb=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(a.expirationTime>=b&&(da=!0),a.firstContext=null)}function ea(a, -b){if(Qc!==a&&!1!==b&&0!==b){if("number"!==typeof b||1073741823===b)Qc=a,b=1073741823;b={context:a,observedBits:b,next:null};if(null===qb){if(null===Rc)throw Error(m(308));qb=b;Rc.dependencies={expirationTime:0,firstContext:b,responders:null}}else qb=qb.next=b}return a._currentValue}function Sc(a){return{baseState:a,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function ve(a){return{baseState:a.baseState, -firstUpdate:a.firstUpdate,lastUpdate:a.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Ea(a,b){return{expirationTime:a,suspenseConfig:b,tag:Wg,payload:null,callback:null,next:null,nextEffect:null}}function Tc(a,b){null===a.lastUpdate?a.firstUpdate=a.lastUpdate=b:(a.lastUpdate.next=b,a.lastUpdate=b)}function Fa(a,b){var c=a.alternate;if(null===c){var d=a.updateQueue;var e=null;null===d&&(d=a.updateQueue= -Sc(a.memoizedState))}else d=a.updateQueue,e=c.updateQueue,null===d?null===e?(d=a.updateQueue=Sc(a.memoizedState),e=c.updateQueue=Sc(c.memoizedState)):d=a.updateQueue=ve(e):null===e&&(e=c.updateQueue=ve(d));null===e||d===e?Tc(d,b):null===d.lastUpdate||null===e.lastUpdate?(Tc(d,b),Tc(e,b)):(Tc(d,b),e.lastUpdate=b)}function Xg(a,b){var c=a.updateQueue;c=null===c?a.updateQueue=Sc(a.memoizedState):Yg(a,c);null===c.lastCapturedUpdate?c.firstCapturedUpdate=c.lastCapturedUpdate=b:(c.lastCapturedUpdate.next= -b,c.lastCapturedUpdate=b)}function Yg(a,b){var c=a.alternate;null!==c&&b===c.updateQueue&&(b=a.updateQueue=ve(b));return b}function Zg(a,b,c,d,e,f){switch(c.tag){case 1:return a=c.payload,"function"===typeof a?a.call(f,d,e):a;case 3:a.effectTag=a.effectTag&-4097|64;case Wg:a=c.payload;e="function"===typeof a?a.call(f,d,e):a;if(null===e||void 0===e)break;return J({},d,e);case Uc:Ga=!0}return d}function Ub(a,b,c,d,e){Ga=!1;b=Yg(a,b);for(var f=b.baseState,g=null,h=0,k=b.firstUpdate,l=f;null!==k;){var m= -k.expirationTime;m<e?(null===g&&(g=k,f=l),h<m&&(h=m)):($g(m,k.suspenseConfig),l=Zg(a,b,k,l,c,d),null!==k.callback&&(a.effectTag|=32,k.nextEffect=null,null===b.lastEffect?b.firstEffect=b.lastEffect=k:(b.lastEffect.nextEffect=k,b.lastEffect=k)));k=k.next}m=null;for(k=b.firstCapturedUpdate;null!==k;){var n=k.expirationTime;n<e?(null===m&&(m=k,null===g&&(f=l)),h<n&&(h=n)):(l=Zg(a,b,k,l,c,d),null!==k.callback&&(a.effectTag|=32,k.nextEffect=null,null===b.lastCapturedEffect?b.firstCapturedEffect=b.lastCapturedEffect= -k:(b.lastCapturedEffect.nextEffect=k,b.lastCapturedEffect=k)));k=k.next}null===g&&(b.lastUpdate=null);null===m?b.lastCapturedUpdate=null:a.effectTag|=32;null===g&&null===m&&(f=l);b.baseState=f;b.firstUpdate=g;b.firstCapturedUpdate=m;Vc(h);a.expirationTime=h;a.memoizedState=l}function ah(a,b,c,d){null!==b.firstCapturedUpdate&&(null!==b.lastUpdate&&(b.lastUpdate.next=b.firstCapturedUpdate,b.lastUpdate=b.lastCapturedUpdate),b.firstCapturedUpdate=b.lastCapturedUpdate=null);bh(b.firstEffect,c);b.firstEffect= -b.lastEffect=null;bh(b.firstCapturedEffect,c);b.firstCapturedEffect=b.lastCapturedEffect=null}function bh(a,b){for(;null!==a;){var c=a.callback;if(null!==c){a.callback=null;var d=b;if("function"!==typeof c)throw Error(m(191,c));c.call(d)}a=a.nextEffect}}function Wc(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:J({},b,c);a.memoizedState=c;d=a.updateQueue;null!==d&&0===a.expirationTime&&(d.baseState=c)}function ch(a,b,c,d,e,f,g){a=a.stateNode;return"function"===typeof a.shouldComponentUpdate? -a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!Sb(c,d)||!Sb(e,f):!0}function dh(a,b,c,d){var e=!1;d=Da;var f=b.contextType;"object"===typeof f&&null!==f?f=ea(f):(d=K(b)?Sa:L.current,e=b.contextTypes,f=(e=null!==e&&void 0!==e)?ob(a,d):Da);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Xc;a.stateNode=b;b._reactInternalFiber=a;e&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=d,a.__reactInternalMemoizedMaskedChildContext= -f);return b}function eh(a,b,c,d){a=b.state;"function"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);"function"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Xc.enqueueReplaceState(b,b.state,null)}function we(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=fh;var f=b.contextType;"object"===typeof f&&null!==f?e.context=ea(f):(f=K(b)?Sa:L.current,e.context=ob(a,f));f=a.updateQueue;null!==f&&(Ub(a,f,c,e,d), -e.state=a.memoizedState);f=b.getDerivedStateFromProps;"function"===typeof f&&(Wc(a,b,f,c),e.state=a.memoizedState);"function"===typeof b.getDerivedStateFromProps||"function"===typeof e.getSnapshotBeforeUpdate||"function"!==typeof e.UNSAFE_componentWillMount&&"function"!==typeof e.componentWillMount||(b=e.state,"function"===typeof e.componentWillMount&&e.componentWillMount(),"function"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Xc.enqueueReplaceState(e,e.state, -null),f=a.updateQueue,null!==f&&(Ub(a,f,c,e,d),e.state=a.memoizedState));"function"===typeof e.componentDidMount&&(a.effectTag|=4)}function Vb(a,b,c){a=c.ref;if(null!==a&&"function"!==typeof a&&"object"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(m(309));var d=c.stateNode}if(!d)throw Error(m(147,a));var e=""+a;if(null!==b&&null!==b.ref&&"function"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===fh&&(b=d.refs={});null===a?delete b[e]:b[e]=a}; -b._stringRef=e;return b}if("string"!==typeof a)throw Error(m(284));if(!c._owner)throw Error(m(290,a));}return a}function Yc(a,b){if("textarea"!==a.type)throw Error(m(31,"[object Object]"===Object.prototype.toString.call(b)?"object with keys {"+Object.keys(b).join(", ")+"}":b,""));}function gh(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling; -return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b,c){a=Ta(a,b,c);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=2,c):d;b.effectTag=2;return c}function g(b){a&&null===b.alternate&&(b.effectTag=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=xe(c,a.mode,d),b.return=a,b;b=e(b,c,d);b.return=a;return b}function k(a, -b,c,d){if(null!==b&&b.elementType===c.type)return d=e(b,c.props,d),d.ref=Vb(a,b,c),d.return=a,d;d=Zc(c.type,c.key,c.props,null,a.mode,d);d.ref=Vb(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=ye(c,a.mode,d),b.return=a,b;b=e(b,c.children||[],d);b.return=a;return b}function p(a,b,c,d,f){if(null===b||7!==b.tag)return b=Ha(c,a.mode,d,f),b.return=a,b;b=e(b,c,d);b.return=a;return b} -function n(a,b,c){if("string"===typeof b||"number"===typeof b)return b=xe(""+b,a.mode,c),b.return=a,b;if("object"===typeof b&&null!==b){switch(b.$$typeof){case $c:return c=Zc(b.type,b.key,b.props,null,a.mode,c),c.ref=Vb(a,null,b),c.return=a,c;case eb:return b=ye(b,a.mode,c),b.return=a,b}if(ad(b)||Eb(b))return b=Ha(b,a.mode,c,null),b.return=a,b;Yc(a,b)}return null}function q(a,b,c,d){var e=null!==b?b.key:null;if("string"===typeof c||"number"===typeof c)return null!==e?null:h(a,b,""+c,d);if("object"=== -typeof c&&null!==c){switch(c.$$typeof){case $c:return c.key===e?c.type===va?p(a,b,c.props.children,d,e):k(a,b,c,d):null;case eb:return c.key===e?l(a,b,c,d):null}if(ad(c)||Eb(c))return null!==e?null:p(a,b,c,d,null);Yc(a,c)}return null}function v(a,b,c,d,e){if("string"===typeof d||"number"===typeof d)return a=a.get(c)||null,h(b,a,""+d,e);if("object"===typeof d&&null!==d){switch(d.$$typeof){case $c:return a=a.get(null===d.key?c:d.key)||null,d.type===va?p(b,a,d.props.children,e,d.key):k(b,a,d,e);case eb:return a= -a.get(null===d.key?c:d.key)||null,l(b,a,d,e)}if(ad(d)||Eb(d))return a=a.get(c)||null,p(b,a,d,e,null);Yc(b,d)}return null}function x(e,g,h,k){for(var l=null,m=null,p=g,t=g=0,z=null;null!==p&&t<h.length;t++){p.index>t?(z=p,p=null):z=p.sibling;var W=q(e,p,h[t],k);if(null===W){null===p&&(p=z);break}a&&p&&null===W.alternate&&b(e,p);g=f(W,g,t);null===m?l=W:m.sibling=W;m=W;p=z}if(t===h.length)return c(e,p),l;if(null===p){for(;t<h.length;t++)p=n(e,h[t],k),null!==p&&(g=f(p,g,t),null===m?l=p:m.sibling=p,m= -p);return l}for(p=d(e,p);t<h.length;t++)z=v(p,e,t,h[t],k),null!==z&&(a&&null!==z.alternate&&p.delete(null===z.key?t:z.key),g=f(z,g,t),null===m?l=z:m.sibling=z,m=z);a&&p.forEach(function(a){return b(e,a)});return l}function A(e,g,h,k){var l=Eb(h);if("function"!==typeof l)throw Error(m(150));h=l.call(h);if(null==h)throw Error(m(151));for(var p=l=null,t=g,z=g=0,W=null,r=h.next();null!==t&&!r.done;z++,r=h.next()){t.index>z?(W=t,t=null):W=t.sibling;var sb=q(e,t,r.value,k);if(null===sb){null===t&&(t=W); -break}a&&t&&null===sb.alternate&&b(e,t);g=f(sb,g,z);null===p?l=sb:p.sibling=sb;p=sb;t=W}if(r.done)return c(e,t),l;if(null===t){for(;!r.done;z++,r=h.next())r=n(e,r.value,k),null!==r&&(g=f(r,g,z),null===p?l=r:p.sibling=r,p=r);return l}for(t=d(e,t);!r.done;z++,r=h.next())r=v(t,e,z,r.value,k),null!==r&&(a&&null!==r.alternate&&t.delete(null===r.key?z:r.key),g=f(r,g,z),null===p?l=r:p.sibling=r,p=r);a&&t.forEach(function(a){return b(e,a)});return l}return function(a,d,f,h){var k="object"===typeof f&&null!== -f&&f.type===va&&null===f.key;k&&(f=f.props.children);var l="object"===typeof f&&null!==f;if(l)switch(f.$$typeof){case $c:a:{l=f.key;for(k=d;null!==k;){if(k.key===l)if(7===k.tag?f.type===va:k.elementType===f.type){c(a,k.sibling);d=e(k,f.type===va?f.props.children:f.props,h);d.ref=Vb(a,k,f);d.return=a;a=d;break a}else{c(a,k);break}else b(a,k);k=k.sibling}f.type===va?(d=Ha(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Zc(f.type,f.key,f.props,null,a.mode,h),h.ref=Vb(a,d,f),h.return=a,a=h)}return g(a); -case eb:a:{for(k=f.key;null!==d;){if(d.key===k)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[],h);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=ye(f,a.mode,h);d.return=a;a=d}return g(a)}if("string"===typeof f||"number"===typeof f)return f=""+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f,h),d.return=a,a=d):(c(a,d),d=xe(f,a.mode,h),d.return=a,a=d),g(a);if(ad(f))return x(a,d,f,h);if(Eb(f))return A(a, -d,f,h);l&&Yc(a,f);if("undefined"===typeof f&&!k)switch(a.tag){case 1:case 0:throw a=a.type,Error(m(152,a.displayName||a.name||"Component"));}return c(a,d)}}function Ua(a){if(a===Wb)throw Error(m(174));return a}function ze(a,b){y(Xb,b,a);y(Yb,a,a);y(fa,Wb,a);var c=b.nodeType;switch(c){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:Od(null,"");break;default:c=c===Pa?b.parentNode:b,b=c.namespaceURI||null,c=c.tagName,b=Od(b,c)}B(fa,a);y(fa,b,a)}function tb(a){B(fa,a);B(Yb,a);B(Xb,a)}function hh(a){Ua(Xb.current); -var b=Ua(fa.current);var c=Od(b,a.type);b!==c&&(y(Yb,a,a),y(fa,c,a))}function Ae(a){Yb.current===a&&(B(fa,a),B(Yb,a))}function bd(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||c.data===ge||c.data===fe))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.effectTag&64))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null; -b=b.return}b.sibling.return=b.return;b=b.sibling}return null}function ih(a,b){return{responder:a,props:b}}function N(){throw Error(m(321));}function Be(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!Ra(a[c],b[c]))return!1;return!0}function Ce(a,b,c,d,e,f){Zb=f;Ia=b;ha=null!==a?a.memoizedState:null;cd.current=null===ha?wj:jh;b=c(d,e);if($b){do $b=!1,ac+=1,ha=null!==a?a.memoizedState:null,ub=vb,ia=O=H=null,cd.current=jh,b=c(d,e);while($b);pa=null;ac=0}cd.current=dd;a=Ia;a.memoizedState= -vb;a.expirationTime=wb;a.updateQueue=ia;a.effectTag|=bc;a=null!==H&&null!==H.next;Zb=0;ub=O=vb=ha=H=Ia=null;wb=0;ia=null;bc=0;if(a)throw Error(m(300));return b}function kh(){cd.current=dd;Zb=0;ub=O=vb=ha=H=Ia=null;wb=0;ia=null;bc=0;$b=!1;pa=null;ac=0}function xb(){var a={memoizedState:null,baseState:null,queue:null,baseUpdate:null,next:null};null===O?vb=O=a:O=O.next=a;return O}function cc(){if(null!==ub)O=ub,ub=O.next,H=ha,ha=null!==H?H.next:null;else{if(null===ha)throw Error(m(310));H=ha;var a={memoizedState:H.memoizedState, -baseState:H.baseState,queue:H.queue,baseUpdate:H.baseUpdate,next:null};O=null===O?vb=a:O.next=a;ha=H.next}return O}function lh(a,b){return"function"===typeof b?b(a):b}function mh(a,b,c){b=cc();c=b.queue;if(null===c)throw Error(m(311));c.lastRenderedReducer=a;if(0<ac){var d=c.dispatch;if(null!==pa){var e=pa.get(c);if(void 0!==e){pa.delete(c);var f=b.memoizedState;do f=a(f,e.action),e=e.next;while(null!==e);Ra(f,b.memoizedState)||(da=!0);b.memoizedState=f;b.baseUpdate===c.last&&(b.baseState=f);c.lastRenderedState= -f;return[f,d]}}return[b.memoizedState,d]}d=c.last;var g=b.baseUpdate;f=b.baseState;null!==g?(null!==d&&(d.next=null),d=g.next):d=null!==d?d.next:null;if(null!==d){var h=e=null,k=d,l=!1;do{var p=k.expirationTime;p<Zb?(l||(l=!0,h=g,e=f),p>wb&&(wb=p,Vc(wb))):($g(p,k.suspenseConfig),f=k.eagerReducer===a?k.eagerState:a(f,k.action));g=k;k=k.next}while(null!==k&&k!==d);l||(h=g,e=f);Ra(f,b.memoizedState)||(da=!0);b.memoizedState=f;b.baseUpdate=h;b.baseState=e;c.lastRenderedState=f}return[b.memoizedState, -c.dispatch]}function De(a){var b=xb();"function"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={last:null,dispatch:null,lastRenderedReducer:lh,lastRenderedState:a};a=a.dispatch=nh.bind(null,Ia,a);return[b.memoizedState,a]}function Ee(a){return mh(lh,a)}function Fe(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};null===ia?(ia={lastEffect:null},ia.lastEffect=a.next=a):(b=ia.lastEffect,null===b?ia.lastEffect=a.next=a:(c=b.next,b.next=a,a.next=c,ia.lastEffect=a));return a}function Ge(a, -b,c,d){var e=xb();bc|=a;e.memoizedState=Fe(b,c,void 0,void 0===d?null:d)}function He(a,b,c,d){var e=cc();d=void 0===d?null:d;var f=void 0;if(null!==H){var g=H.memoizedState;f=g.destroy;if(null!==d&&Be(d,g.deps)){Fe(0,c,f,d);return}}bc|=a;e.memoizedState=Fe(b,c,f,d)}function oh(a,b){return Ge(516,192,a,b)}function ph(a,b){return He(516,192,a,b)}function qh(a,b){if("function"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}} -function rh(a,b){}function sh(a,b){xb().memoizedState=[a,void 0===b?null:b];return a}function th(a,b){var c=cc();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Be(b,d[1]))return d[0];c.memoizedState=[a,b];return a}function nh(a,b,c){if(!(25>ac))throw Error(m(301));var d=a.alternate;if(a===Ia||null!==d&&d===Ia)if($b=!0,a={expirationTime:Zb,suspenseConfig:null,action:c,eagerReducer:null,eagerState:null,next:null},null===pa&&(pa=new Map),c=pa.get(b),void 0===c)pa.set(b,a);else{for(b= -c;null!==b.next;)b=b.next;b.next=a}else{var e=X(),f=dc.suspense;e=Va(e,a,f);f={expirationTime:e,suspenseConfig:f,action:c,eagerReducer:null,eagerState:null,next:null};var g=b.last;if(null===g)f.next=f;else{var h=g.next;null!==h&&(f.next=h);g.next=f}b.last=f;if(0===a.expirationTime&&(null===d||0===d.expirationTime)&&(d=b.lastRenderedReducer,null!==d))try{var k=b.lastRenderedState,l=d(k,c);f.eagerReducer=d;f.eagerState=l;if(Ra(l,k))return}catch(p){}finally{}Ja(a,e)}}function uh(a,b){var c=ja(5,null, -null,0);c.elementType="DELETED";c.type="DELETED";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function vh(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=""===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}function Ie(a){if(Wa){var b=Ka;if(b){var c= -b;if(!vh(a,b)){b=kb(c.nextSibling);if(!b||!vh(a,b)){a.effectTag=a.effectTag&-1025|2;Wa=!1;qa=a;return}uh(qa,c)}qa=a;Ka=kb(b.firstChild)}else a.effectTag=a.effectTag&-1025|2,Wa=!1,qa=a}}function wh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;qa=a}function ed(a){if(a!==qa)return!1;if(!Wa)return wh(a),Wa=!0,!1;var b=a.type;if(5!==a.tag||"head"!==b&&"body"!==b&&!ee(b,a.memoizedProps))for(b=Ka;b;)uh(a,b),b=kb(b.nextSibling);wh(a);if(13===a.tag){a=a.memoizedState;a=null!==a? -a.dehydrated:null;if(!a)throw Error(m(317));a:{a=a.nextSibling;for(b=0;a;){if(a.nodeType===Pa){var c=a.data;if(c===tg){if(0===b){Ka=kb(a.nextSibling);break a}b--}else c!==sg&&c!==fe&&c!==ge||b++}a=a.nextSibling}Ka=null}}else Ka=qa?kb(a.stateNode.nextSibling):null;return!0}function Je(){Ka=qa=null;Wa=!1}function P(a,b,c,d){b.child=null===a?Ke(b,null,c,d):yb(b,a.child,c,d)}function xh(a,b,c,d,e){c=c.render;var f=b.ref;rb(b,e);d=Ce(a,b,c,d,f,e);if(null!==a&&!da)return b.updateQueue=a.updateQueue,b.effectTag&= --517,a.expirationTime<=e&&(a.expirationTime=0),ra(a,b,e);b.effectTag|=1;P(a,b,d,e);return b.child}function yh(a,b,c,d,e,f){if(null===a){var g=c.type;if("function"===typeof g&&!Le(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,zh(a,b,g,d,e,f);a=Zc(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e<f&&(e=g.memoizedProps,c=c.compare,c=null!==c?c:Sb,c(e,d)&&a.ref===b.ref))return ra(a,b,f);b.effectTag|=1;a=Ta(g,d,f);a.ref= -b.ref;a.return=b;return b.child=a}function zh(a,b,c,d,e,f){return null!==a&&Sb(a.memoizedProps,d)&&a.ref===b.ref&&(da=!1,e<f)?ra(a,b,f):Me(a,b,c,d,f)}function Ah(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function Me(a,b,c,d,e){var f=K(c)?Sa:L.current;f=ob(b,f);rb(b,e);c=Ce(a,b,c,d,f,e);if(null!==a&&!da)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),ra(a,b,e);b.effectTag|=1;P(a,b,c,e);return b.child}function Bh(a,b, -c,d,e){if(K(c)){var f=!0;Mc(b)}else f=!1;rb(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),dh(b,c,d,e),we(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;"object"===typeof l&&null!==l?l=ea(l):(l=K(c)?Sa:L.current,l=ob(b,l));var m=c.getDerivedStateFromProps,n="function"===typeof m||"function"===typeof g.getSnapshotBeforeUpdate;n||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!== -typeof g.componentWillReceiveProps||(h!==d||k!==l)&&eh(b,g,d,l);Ga=!1;var q=b.memoizedState;k=g.state=q;var v=b.updateQueue;null!==v&&(Ub(b,v,d,g,e),k=b.memoizedState);h!==d||q!==k||Q.current||Ga?("function"===typeof m&&(Wc(b,c,m,d),k=b.memoizedState),(h=Ga||ch(b,c,h,d,q,k,l))?(n||"function"!==typeof g.UNSAFE_componentWillMount&&"function"!==typeof g.componentWillMount||("function"===typeof g.componentWillMount&&g.componentWillMount(),"function"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()), -"function"===typeof g.componentDidMount&&(b.effectTag|=4)):("function"===typeof g.componentDidMount&&(b.effectTag|=4),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):("function"===typeof g.componentDidMount&&(b.effectTag|=4),d=!1)}else g=b.stateNode,h=b.memoizedProps,g.props=b.type===b.elementType?h:V(b.type,h),k=g.context,l=c.contextType,"object"===typeof l&&null!==l?l=ea(l):(l=K(c)?Sa:L.current,l=ob(b,l)),m=c.getDerivedStateFromProps,(n="function"===typeof m||"function"=== -typeof g.getSnapshotBeforeUpdate)||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&eh(b,g,d,l),Ga=!1,k=b.memoizedState,q=g.state=k,v=b.updateQueue,null!==v&&(Ub(b,v,d,g,e),q=b.memoizedState),h!==d||k!==q||Q.current||Ga?("function"===typeof m&&(Wc(b,c,m,d),q=b.memoizedState),(m=Ga||ch(b,c,h,d,k,q,l))?(n||"function"!==typeof g.UNSAFE_componentWillUpdate&&"function"!==typeof g.componentWillUpdate||("function"===typeof g.componentWillUpdate&& -g.componentWillUpdate(d,q,l),"function"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,q,l)),"function"===typeof g.componentDidUpdate&&(b.effectTag|=4),"function"===typeof g.getSnapshotBeforeUpdate&&(b.effectTag|=256)):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),b.memoizedProps=d,b.memoizedState=q),g.props=d,g.state= -q,g.context=l,d=m):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),d=!1);return Ne(a,b,c,d,f,e)}function Ne(a,b,c,d,e,f){Ah(a,b);var g=0!==(b.effectTag&64);if(!d&&!g)return e&&Jg(b,c,!1),ra(a,b,f);d=b.stateNode;xj.current=b;var h=g&&"function"!==typeof c.getDerivedStateFromError?null:d.render();b.effectTag|=1;null!==a&&g?(b.child=yb(b,a.child, -null,f),b.child=yb(b,null,h,f)):P(a,b,h,f);b.memoizedState=d.state;e&&Jg(b,c,!0);return b.child}function Ch(a){var b=a.stateNode;b.pendingContext?Hg(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Hg(a,b.context,!1);ze(a,b.containerInfo)}function Dh(a,b,c){var d=b.mode,e=b.pendingProps,f=A.current,g=!1,h;(h=0!==(b.effectTag&64))||(h=0!==(f&2)&&(null===a||null!==a.memoizedState));h?(g=!0,b.effectTag&=-65):null!==a&&null===a.memoizedState||void 0===e.fallback||!0===e.unstable_avoidThisFallback|| -(f|=1);y(A,f&1,b);if(null===a){void 0!==e.fallback&&Ie(b);if(g){g=e.fallback;e=Ha(null,d,0,null);e.return=b;if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Ha(g,d,c,null);c.return=b;e.sibling=c;b.memoizedState=Oe;b.child=e;return c}d=e.children;b.memoizedState=null;return b.child=Ke(b,null,d,c)}if(null!==a.memoizedState){a=a.child;d=a.sibling;if(g){e=e.fallback;c=Ta(a,a.pendingProps,0);c.return=b;if(0===(b.mode&2)&&(g=null!==b.memoizedState? -b.child.child:b.child,g!==a.child))for(c.child=g;null!==g;)g.return=c,g=g.sibling;d=Ta(d,e,d.expirationTime);d.return=b;c.sibling=d;c.childExpirationTime=0;b.memoizedState=Oe;b.child=c;return d}c=yb(b,a.child,e.children,c);b.memoizedState=null;return b.child=c}a=a.child;if(g){g=e.fallback;e=Ha(null,d,0,null);e.return=b;e.child=a;null!==a&&(a.return=e);if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Ha(g,d,c,null);c.return=b;e.sibling= -c;c.effectTag|=2;e.childExpirationTime=0;b.memoizedState=Oe;b.child=e;return c}b.memoizedState=null;return b.child=yb(b,a,e.children,c)}function Eh(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);Vg(a.return,b)}function Pe(a,b,c,d,e,f){var g=a.memoizedState;null===g?a.memoizedState={isBackwards:b,rendering:null,last:d,tail:c,tailExpiration:0,tailMode:e,lastEffect:f}:(g.isBackwards=b,g.rendering=null,g.last=d,g.tail=c,g.tailExpiration= -0,g.tailMode=e,g.lastEffect=f)}function Fh(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;P(a,b,d.children,c);d=A.current;if(0!==(d&2))d=d&1|2,b.effectTag|=64;else{if(null!==a&&0!==(a.effectTag&64))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&Eh(a,c);else if(19===a.tag)Eh(a,c);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}y(A, -d,b);if(0===(b.mode&2))b.memoizedState=null;else switch(e){case "forwards":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===bd(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);Pe(b,!1,e,c,f,b.lastEffect);break;case "backwards":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===bd(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}Pe(b,!0,c,null,f,b.lastEffect);break;case "together":Pe(b,!1,null,null,void 0,b.lastEffect); -break;default:b.memoizedState=null}return b.child}function ra(a,b,c){null!==a&&(b.dependencies=a.dependencies);var d=b.expirationTime;0!==d&&Vc(d);if(b.childExpirationTime<c)return null;if(null!==a&&b.child!==a.child)throw Error(m(153));if(null!==b.child){a=b.child;c=Ta(a,a.pendingProps,a.expirationTime);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Ta(a,a.pendingProps,a.expirationTime),c.return=b;c.sibling=null}return b.child}function zb(a){a.effectTag|=4}function fd(a,b){switch(a.tailMode){case "hidden":b= -a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case "collapsed":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}function yj(a,b){switch(a.tag){case 1:return K(a.type)&&Lc(a),b=a.effectTag,b&4096?(a.effectTag=b&-4097|64,a):null;case 3:tb(a);oe(a);b=a.effectTag;if(0!==(b&64))throw Error(m(285));a.effectTag=b&-4097|64;return a;case 5:return Ae(a), -null;case 13:return B(A,a),b=a.effectTag,b&4096?(a.effectTag=b&-4097|64,a):null;case 19:return B(A,a),null;case 4:return tb(a),null;case 10:return ue(a),null;default:return null}}function Qe(a,b){return{value:a,source:b,stack:Ed(b)}}function Re(a,b){var c=b.source,d=b.stack;null===d&&null!==c&&(d=Ed(c));null!==c&&ua(c.type);b=b.value;null!==a&&1===a.tag&&ua(a.type);try{console.error(b)}catch(e){setTimeout(function(){throw e;})}}function zj(a,b){try{b.props=a.memoizedProps,b.state=a.memoizedState, -b.componentWillUnmount()}catch(c){Xa(a,c)}}function Gh(a){var b=a.ref;if(null!==b)if("function"===typeof b)try{b(null)}catch(c){Xa(a,c)}else b.current=null}function Aj(a,b){switch(b.tag){case 0:case 11:case 15:ec(2,0,b);break;case 1:if(b.effectTag&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===b.type?c:V(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}break;case 3:case 5:case 6:case 4:case 17:break;default:throw Error(m(163)); -}}function ec(a,b,c){c=c.updateQueue;c=null!==c?c.lastEffect:null;if(null!==c){var d=c=c.next;do{if(0!==(d.tag&a)){var e=d.destroy;d.destroy=void 0;void 0!==e&&e()}0!==(d.tag&b)&&(e=d.create,d.destroy=e());d=d.next}while(d!==c)}}function Hh(a,b,c){"function"===typeof Se&&Se(b);switch(b.tag){case 0:case 11:case 14:case 15:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var d=a.next;pb(97<c?97:c,function(){var a=d;do{var c=a.destroy;if(void 0!==c){var g=b;try{c()}catch(h){Xa(g,h)}}a=a.next}while(a!== -d)})}break;case 1:Gh(b);c=b.stateNode;"function"===typeof c.componentWillUnmount&&zj(b,c);break;case 5:Gh(b);break;case 4:Ih(a,b,c)}}function Jh(a){var b=a.alternate;a.return=null;a.child=null;a.memoizedState=null;a.updateQueue=null;a.dependencies=null;a.alternate=null;a.firstEffect=null;a.lastEffect=null;a.pendingProps=null;a.memoizedProps=null;null!==b&&Jh(b)}function Kh(a){return 5===a.tag||3===a.tag||4===a.tag}function Lh(a){a:{for(var b=a.return;null!==b;){if(Kh(b)){var c=b;break a}b=b.return}throw Error(m(160)); -}b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw Error(m(161));}c.effectTag&16&&(fc(b,""),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||Kh(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.effectTag&2)continue b;if(null===c.child||4===c.tag)continue b;else c.child.return=c,c=c.child}if(!(c.effectTag&2)){c=c.stateNode; -break a}}for(var e=a;;){var f=5===e.tag||6===e.tag;if(f){var g=f?e.stateNode:e.stateNode.instance;if(c)if(d){f=b;var h=g;g=c;f.nodeType===Pa?f.parentNode.insertBefore(h,g):f.insertBefore(h,g)}else b.insertBefore(g,c);else d?(h=b,h.nodeType===Pa?(f=h.parentNode,f.insertBefore(g,h)):(f=h,f.appendChild(g)),h=h._reactRootContainer,null!==h&&void 0!==h||null!==f.onclick||(f.onclick=Hc)):b.appendChild(g)}else if(4!==e.tag&&null!==e.child){e.child.return=e;e=e.child;continue}if(e===a)break;for(;null===e.sibling;){if(null=== -e.return||e.return===a)return;e=e.return}e.sibling.return=e.return;e=e.sibling}}function Ih(a,b,c){for(var d=b,e=!1,f,g;;){if(!e){e=d.return;a:for(;;){if(null===e)throw Error(m(160));f=e.stateNode;switch(e.tag){case 5:g=!1;break a;case 3:f=f.containerInfo;g=!0;break a;case 4:f=f.containerInfo;g=!0;break a}e=e.return}e=!0}if(5===d.tag||6===d.tag){a:for(var h=a,k=d,l=c,p=k;;)if(Hh(h,p,l),null!==p.child&&4!==p.tag)p.child.return=p,p=p.child;else{if(p===k)break;for(;null===p.sibling;){if(null===p.return|| -p.return===k)break a;p=p.return}p.sibling.return=p.return;p=p.sibling}g?(h=f,k=d.stateNode,h.nodeType===Pa?h.parentNode.removeChild(k):h.removeChild(k)):f.removeChild(d.stateNode)}else if(4===d.tag){if(null!==d.child){f=d.stateNode.containerInfo;g=!0;d.child.return=d;d=d.child;continue}}else if(Hh(a,d,c),null!==d.child){d.child.return=d;d=d.child;continue}if(d===b)break;for(;null===d.sibling;){if(null===d.return||d.return===b)return;d=d.return;4===d.tag&&(e=!1)}d.sibling.return=d.return;d=d.sibling}} -function Te(a,b){switch(b.tag){case 0:case 11:case 14:case 15:ec(4,8,b);break;case 1:break;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[Ic]=d;"input"===a&&"radio"===d.type&&null!=d.name&&Of(c,d);be(a,e);b=be(a,d);for(e=0;e<f.length;e+=2){var g=f[e],h=f[e+1];"style"===g?lg(c,h):"dangerouslySetInnerHTML"===g?Mh(c,h):"children"===g?fc(c,h):Id(c,g,h,b)}switch(a){case "input":Kd(c,d);break;case "textarea":Rf(c, -d);break;case "select":b=c._wrapperState.wasMultiple,c._wrapperState.wasMultiple=!!d.multiple,a=d.value,null!=a?hb(c,!!d.multiple,a,!1):b!==!!d.multiple&&(null!=d.defaultValue?hb(c,!!d.multiple,d.defaultValue,!0):hb(c,!!d.multiple,d.multiple?[]:"",!1))}}}break;case 6:if(null===b.stateNode)throw Error(m(162));b.stateNode.nodeValue=b.memoizedProps;break;case 3:b=b.stateNode;b.hydrate&&(b.hydrate=!1,cg(b.containerInfo));break;case 12:break;case 13:c=b;null===b.memoizedState?d=!1:(d=!0,c=b.child,Ue=Y()); -if(null!==c)a:for(a=c;;){if(5===a.tag)f=a.stateNode,d?(f=f.style,"function"===typeof f.setProperty?f.setProperty("display","none","important"):f.display="none"):(f=a.stateNode,e=a.memoizedProps.style,e=void 0!==e&&null!==e&&e.hasOwnProperty("display")?e.display:null,f.style.display=kg("display",e));else if(6===a.tag)a.stateNode.nodeValue=d?"":a.memoizedProps;else if(13===a.tag&&null!==a.memoizedState&&null===a.memoizedState.dehydrated){f=a.child.sibling;f.return=a;a=f;continue}else if(null!==a.child){a.child.return= -a;a=a.child;continue}if(a===c)break a;for(;null===a.sibling;){if(null===a.return||a.return===c)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}Nh(b);break;case 19:Nh(b);break;case 17:break;case 20:break;case 21:break;default:throw Error(m(163));}}function Nh(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Bj);b.forEach(function(b){var d=Cj.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}function Oh(a,b,c){c=Ea(c,null);c.tag=3;c.payload= -{element:null};var d=b.value;c.callback=function(){gd||(gd=!0,Ve=d);Re(a,b)};return c}function Ph(a,b,c){c=Ea(c,null);c.tag=3;var d=a.type.getDerivedStateFromError;if("function"===typeof d){var e=b.value;c.payload=function(){Re(a,b);return d(e)}}var f=a.stateNode;null!==f&&"function"===typeof f.componentDidCatch&&(c.callback=function(){"function"!==typeof d&&(null===La?La=new Set([this]):La.add(this),Re(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:""})});return c} -function X(){return(q&(Z|ka))!==F?1073741821-(Y()/10|0):0!==hd?hd:hd=1073741821-(Y()/10|0)}function Va(a,b,c){b=b.mode;if(0===(b&2))return 1073741823;var d=pe();if(0===(b&4))return 99===d?1073741823:1073741822;if((q&Z)!==F)return R;if(null!==c)a=Pc(a,c.timeoutMs|0||5E3,250);else switch(d){case 99:a=1073741823;break;case 98:a=Pc(a,150,100);break;case 97:case 96:a=Pc(a,5E3,250);break;case 95:a=2;break;default:throw Error(m(326));}null!==S&&a===R&&--a;return a}function id(a,b){a.expirationTime<b&&(a.expirationTime= -b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);var d=a.return,e=null;if(null===d&&3===a.tag)e=a.stateNode;else for(;null!==d;){c=d.alternate;d.childExpirationTime<b&&(d.childExpirationTime=b);null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);if(null===d.return&&3===d.tag){e=d.stateNode;break}d=d.return}null!==e&&(S===e&&(Vc(b),G===jd&&Ya(e,R)),Qh(e,b));return e}function kd(a){var b=a.lastExpiredTime;if(0!==b)return b;b=a.firstPendingTime;if(!Rh(a,b))return b;b= -a.lastPingedTime;a=a.nextKnownPendingLevel;return b>a?b:a}function T(a){if(0!==a.lastExpiredTime)a.callbackExpirationTime=1073741823,a.callbackPriority=99,a.callbackNode=Qg(We.bind(null,a));else{var b=kd(a),c=a.callbackNode;if(0===b)null!==c&&(a.callbackNode=null,a.callbackExpirationTime=0,a.callbackPriority=90);else{var d=X();1073741823===b?d=99:1===b||2===b?d=95:(d=10*(1073741821-b)-10*(1073741821-d),d=0>=d?99:250>=d?98:5250>=d?97:95);if(null!==c){var e=a.callbackPriority;if(a.callbackExpirationTime=== -b&&e>=d)return;c!==Sg&&Tg(c)}a.callbackExpirationTime=b;a.callbackPriority=d;b=1073741823===b?Qg(We.bind(null,a)):Pg(d,Sh.bind(null,a),{timeout:10*(1073741821-b)-Y()});a.callbackNode=b}}}function Sh(a,b){hd=0;if(b)return b=X(),Xe(a,b),T(a),null;var c=kd(a);if(0!==c){b=a.callbackNode;if((q&(Z|ka))!==F)throw Error(m(327));Ab();a===S&&c===R||Za(a,c);if(null!==v){var d=q;q|=Z;var e=Th(a);do try{Dj();break}catch(h){Uh(a,h)}while(1);se();q=d;ld.current=e;if(G===md)throw b=nd,Za(a,c),Ya(a,c),T(a),b;if(null=== -v)switch(e=a.finishedWork=a.current.alternate,a.finishedExpirationTime=c,d=G,S=null,d){case $a:case md:throw Error(m(345));case Vh:Xe(a,2<c?2:c);break;case od:Ya(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Ye(e));if(1073741823===sa&&(e=Ue+Wh-Y(),10<e)){if(pd){var f=a.lastPingedTime;if(0===f||f>=c){a.lastPingedTime=c;Za(a,c);break}}f=kd(a);if(0!==f&&f!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}a.timeoutHandle=Ze(Ma.bind(null,a),e);break}Ma(a);break;case jd:Ya(a,c);d=a.lastSuspendedTime; -c===d&&(a.nextKnownPendingLevel=Ye(e));if(pd&&(e=a.lastPingedTime,0===e||e>=c)){a.lastPingedTime=c;Za(a,c);break}e=kd(a);if(0!==e&&e!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}1073741823!==gc?d=10*(1073741821-gc)-Y():1073741823===sa?d=0:(d=10*(1073741821-sa)-5E3,e=Y(),c=10*(1073741821-c)-e,d=e-d,0>d&&(d=0),d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*Ej(d/1960))-d,c<d&&(d=c));if(10<d){a.timeoutHandle=Ze(Ma.bind(null,a),d);break}Ma(a);break;case $e:if(1073741823!== -sa&&null!==qd){f=sa;var g=qd;d=g.busyMinDurationMs|0;0>=d?d=0:(e=g.busyDelayMs|0,f=Y()-(10*(1073741821-f)-(g.timeoutMs|0||5E3)),d=f<=e?0:e+d-f);if(10<d){Ya(a,c);a.timeoutHandle=Ze(Ma.bind(null,a),d);break}}Ma(a);break;default:throw Error(m(329));}T(a);if(a.callbackNode===b)return Sh.bind(null,a)}}return null}function We(a){var b=a.lastExpiredTime;b=0!==b?b:1073741823;if(a.finishedExpirationTime===b)Ma(a);else{if((q&(Z|ka))!==F)throw Error(m(327));Ab();a===S&&b===R||Za(a,b);if(null!==v){var c=q;q|= -Z;var d=Th(a);do try{Fj();break}catch(e){Uh(a,e)}while(1);se();q=c;ld.current=d;if(G===md)throw c=nd,Za(a,b),Ya(a,b),T(a),c;if(null!==v)throw Error(m(261));a.finishedWork=a.current.alternate;a.finishedExpirationTime=b;S=null;Ma(a);T(a)}}return null}function Gj(){if(null!==ab){var a=ab;ab=null;a.forEach(function(a,c){Xe(c,a);T(c)});ca()}}function Xh(a,b){var c=q;q|=1;try{return a(b)}finally{q=c,q===F&&ca()}}function Yh(a,b){var c=q;q&=-2;q|=af;try{return a(b)}finally{q=c,q===F&&ca()}}function Za(a, -b){a.finishedWork=null;a.finishedExpirationTime=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,Hj(c));if(null!==v)for(c=v.return;null!==c;){var d=c;switch(d.tag){case 1:var e=d.type.childContextTypes;null!==e&&void 0!==e&&Lc(d);break;case 3:tb(d);oe(d);break;case 5:Ae(d);break;case 4:tb(d);break;case 13:B(A,d);break;case 19:B(A,d);break;case 10:ue(d)}c=c.return}S=a;v=Ta(a.current,null,b);R=b;G=$a;nd=null;gc=sa=1073741823;qd=null;hc=0;pd=!1}function Uh(a,b){do{try{se();kh();if(null===v||null=== -v.return)return G=md,nd=b,null;a:{var c=a,d=v.return,e=v,f=b;b=R;e.effectTag|=2048;e.firstEffect=e.lastEffect=null;if(null!==f&&"object"===typeof f&&"function"===typeof f.then){var g=f,h=0!==(A.current&1),k=d;do{var l;if(l=13===k.tag){var m=k.memoizedState;if(null!==m)l=null!==m.dehydrated?!0:!1;else{var n=k.memoizedProps;l=void 0===n.fallback?!1:!0!==n.unstable_avoidThisFallback?!0:h?!1:!0}}if(l){var q=k.updateQueue;if(null===q){var x=new Set;x.add(g);k.updateQueue=x}else q.add(g);if(0===(k.mode& -2)){k.effectTag|=64;e.effectTag&=-2981;if(1===e.tag)if(null===e.alternate)e.tag=17;else{var B=Ea(1073741823,null);B.tag=Uc;Fa(e,B)}e.expirationTime=1073741823;break a}f=void 0;e=b;var y=c.pingCache;null===y?(y=c.pingCache=new Ij,f=new Set,y.set(g,f)):(f=y.get(g),void 0===f&&(f=new Set,y.set(g,f)));if(!f.has(e)){f.add(e);var t=Jj.bind(null,c,g,e);g.then(t,t)}k.effectTag|=4096;k.expirationTime=b;break a}k=k.return}while(null!==k);f=Error((ua(e.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display."+ -Ed(e))}G!==$e&&(G=Vh);f=Qe(f,e);k=d;do{switch(k.tag){case 3:g=f;k.effectTag|=4096;k.expirationTime=b;var z=Oh(k,g,b);Xg(k,z);break a;case 1:g=f;var F=k.type,r=k.stateNode;if(0===(k.effectTag&64)&&("function"===typeof F.getDerivedStateFromError||null!==r&&"function"===typeof r.componentDidCatch&&(null===La||!La.has(r)))){k.effectTag|=4096;k.expirationTime=b;var u=Ph(k,g,b);Xg(k,u);break a}}k=k.return}while(null!==k)}v=Zh(v)}catch(w){b=w;continue}break}while(1)}function Th(a){a=ld.current;ld.current= -dd;return null===a?dd:a}function $g(a,b){a<sa&&2<a&&(sa=a);null!==b&&a<gc&&2<a&&(gc=a,qd=b)}function Vc(a){a>hc&&(hc=a)}function Fj(){for(;null!==v;)v=$h(v)}function Dj(){for(;null!==v&&!Kj();)v=$h(v)}function $h(a){var b=Lj(a.alternate,a,R);a.memoizedProps=a.pendingProps;null===b&&(b=Zh(a));ai.current=null;return b}function Zh(a){v=a;do{var b=v.alternate;a=v.return;if(0===(v.effectTag&2048)){a:{var c=b;b=v;var d=R;var e=b.pendingProps;switch(b.tag){case 2:break;case 16:break;case 15:case 0:break; -case 1:K(b.type)&&Lc(b);break;case 3:tb(b);oe(b);e=b.stateNode;e.pendingContext&&(e.context=e.pendingContext,e.pendingContext=null);(null===c||null===c.child)&&ed(b)&&zb(b);bi(b);break;case 5:Ae(b);var f=Ua(Xb.current);d=b.type;if(null!==c&&null!=b.stateNode)Mj(c,b,d,e,f),c.ref!==b.ref&&(b.effectTag|=128);else if(e){var g=Ua(fa.current);if(ed(b)){e=b;c=e.stateNode;var h=e.type;g=e.memoizedProps;c[Ba]=e;c[Ic]=g;d=void 0;switch(h){case "iframe":case "object":case "embed":x("load",c);break;case "video":case "audio":for(var k= -0;k<Nb.length;k++)x(Nb[k],c);break;case "source":x("error",c);break;case "img":case "image":case "link":x("error",c);x("load",c);break;case "form":x("reset",c);x("submit",c);break;case "details":x("toggle",c);break;case "input":Nf(c,g);x("invalid",c);na(f,"onChange");break;case "select":c._wrapperState={wasMultiple:!!g.multiple};x("invalid",c);na(f,"onChange");break;case "textarea":Qf(c,g),x("invalid",c),na(f,"onChange")}ae(h,g);k=null;for(d in g)if(g.hasOwnProperty(d)){var l=g[d];"children"===d? -"string"===typeof l?c.textContent!==l&&(k=["children",l]):"number"===typeof l&&c.textContent!==""+l&&(k=["children",""+l]):cb.hasOwnProperty(d)&&null!=l&&na(f,d)}switch(h){case "input":xc(c);Pf(c,g,!0);break;case "textarea":xc(c);Sf(c,g);break;case "select":case "option":break;default:"function"===typeof g.onClick&&(c.onclick=Hc)}f=k;e.updateQueue=f;e=null!==f?!0:!1;e&&zb(b)}else{h=b;c=9===f.nodeType?f:f.ownerDocument;"http://www.w3.org/1999/xhtml"===g&&(g=Tf(d));"http://www.w3.org/1999/xhtml"=== -g?"script"===d?(c=c.createElement("div"),c.innerHTML="<script>\x3c/script>",c=c.removeChild(c.firstChild)):"string"===typeof e.is?c=c.createElement(d,{is:e.is}):(c=c.createElement(d),"select"===d&&(g=c,e.multiple?g.multiple=!0:e.size&&(g.size=e.size))):c=c.createElementNS(g,d);c[Ba]=h;c[Ic]=e;Nj(c,b,!1,!1);b.stateNode=c;var p=be(d,e);switch(d){case "iframe":case "object":case "embed":x("load",c);h=e;break;case "video":case "audio":for(h=0;h<Nb.length;h++)x(Nb[h],c);h=e;break;case "source":x("error", -c);h=e;break;case "img":case "image":case "link":x("error",c);x("load",c);h=e;break;case "form":x("reset",c);x("submit",c);h=e;break;case "details":x("toggle",c);h=e;break;case "input":Nf(c,e);h=Jd(c,e);x("invalid",c);na(f,"onChange");break;case "option":h=Md(c,e);break;case "select":c._wrapperState={wasMultiple:!!e.multiple};h=J({},e,{value:void 0});x("invalid",c);na(f,"onChange");break;case "textarea":Qf(c,e);h=Nd(c,e);x("invalid",c);na(f,"onChange");break;default:h=e}ae(d,h);g=void 0;k=d;l=c;var n= -h;for(g in n)if(n.hasOwnProperty(g)){var q=n[g];"style"===g?lg(l,q):"dangerouslySetInnerHTML"===g?(q=q?q.__html:void 0,null!=q&&Mh(l,q)):"children"===g?"string"===typeof q?("textarea"!==k||""!==q)&&fc(l,q):"number"===typeof q&&fc(l,""+q):"suppressContentEditableWarning"!==g&&"suppressHydrationWarning"!==g&&"autoFocus"!==g&&(cb.hasOwnProperty(g)?null!=q&&na(f,g):null!=q&&Id(l,g,q,p))}switch(d){case "input":xc(c);Pf(c,e,!1);break;case "textarea":xc(c);Sf(c,e);break;case "option":null!=e.value&&c.setAttribute("value", -""+wa(e.value));break;case "select":f=c;c=e;f.multiple=!!c.multiple;h=c.value;null!=h?hb(f,!!c.multiple,h,!1):null!=c.defaultValue&&hb(f,!!c.multiple,c.defaultValue,!0);break;default:"function"===typeof h.onClick&&(c.onclick=Hc)}qg(d,e)&&zb(b)}null!==b.ref&&(b.effectTag|=128)}else if(null===b.stateNode)throw Error(m(166));break;case 6:if(c&&null!=b.stateNode)Oj(c,b,c.memoizedProps,e);else{if("string"!==typeof e&&null===b.stateNode)throw Error(m(166));d=Ua(Xb.current);Ua(fa.current);ed(b)?(e=b,f=e.stateNode, -d=e.memoizedProps,f[Ba]=e,(e=f.nodeValue!==d)&&zb(b)):(f=b,e=(9===d.nodeType?d:d.ownerDocument).createTextNode(e),e[Ba]=f,b.stateNode=e)}break;case 11:break;case 13:B(A,b);e=b.memoizedState;if(0!==(b.effectTag&64)){b.expirationTime=d;break a}e=null!==e;f=!1;null===c?void 0!==b.memoizedProps.fallback&&ed(b):(d=c.memoizedState,f=null!==d,e||null===d||(d=c.child.sibling,null!==d&&(h=b.firstEffect,null!==h?(b.firstEffect=d,d.nextEffect=h):(b.firstEffect=b.lastEffect=d,d.nextEffect=null),d.effectTag=8))); -if(e&&!f&&0!==(b.mode&2))if(null===c&&!0!==b.memoizedProps.unstable_avoidThisFallback||0!==(A.current&1))G===$a&&(G=od);else{if(G===$a||G===od)G=jd;0!==hc&&null!==S&&(Ya(S,R),Qh(S,hc))}if(e||f)b.effectTag|=4;break;case 7:break;case 8:break;case 12:break;case 4:tb(b);bi(b);break;case 10:ue(b);break;case 9:break;case 14:break;case 17:K(b.type)&&Lc(b);break;case 19:B(A,b);e=b.memoizedState;if(null===e)break;f=0!==(b.effectTag&64);h=e.rendering;if(null===h)if(f)fd(e,!1);else{if(G!==$a||null!==c&&0!== -(c.effectTag&64))for(c=b.child;null!==c;){h=bd(c);if(null!==h){b.effectTag|=64;fd(e,!1);f=h.updateQueue;null!==f&&(b.updateQueue=f,b.effectTag|=4);null===e.lastEffect&&(b.firstEffect=null);b.lastEffect=e.lastEffect;e=d;for(f=b.child;null!==f;)d=f,c=e,d.effectTag&=2,d.nextEffect=null,d.firstEffect=null,d.lastEffect=null,h=d.alternate,null===h?(d.childExpirationTime=0,d.expirationTime=c,d.child=null,d.memoizedProps=null,d.memoizedState=null,d.updateQueue=null,d.dependencies=null):(d.childExpirationTime= -h.childExpirationTime,d.expirationTime=h.expirationTime,d.child=h.child,d.memoizedProps=h.memoizedProps,d.memoizedState=h.memoizedState,d.updateQueue=h.updateQueue,c=h.dependencies,d.dependencies=null===c?null:{expirationTime:c.expirationTime,firstContext:c.firstContext,responders:c.responders}),f=f.sibling;y(A,A.current&1|2,b);b=b.child;break a}c=c.sibling}}else{if(!f)if(c=bd(h),null!==c){if(b.effectTag|=64,f=!0,d=c.updateQueue,null!==d&&(b.updateQueue=d,b.effectTag|=4),fd(e,!0),null===e.tail&&"hidden"=== -e.tailMode&&!h.alternate){b=b.lastEffect=e.lastEffect;null!==b&&(b.nextEffect=null);break}}else Y()>e.tailExpiration&&1<d&&(b.effectTag|=64,f=!0,fd(e,!1),b.expirationTime=b.childExpirationTime=d-1);e.isBackwards?(h.sibling=b.child,b.child=h):(d=e.last,null!==d?d.sibling=h:b.child=h,e.last=h)}if(null!==e.tail){0===e.tailExpiration&&(e.tailExpiration=Y()+500);d=e.tail;e.rendering=d;e.tail=d.sibling;e.lastEffect=b.lastEffect;d.sibling=null;e=A.current;e=f?e&1|2:e&1;y(A,e,b);b=d;break a}break;case 20:break; -case 21:break;default:throw Error(m(156,b.tag));}b=null}e=v;if(1===R||1!==e.childExpirationTime){f=0;for(d=e.child;null!==d;)c=d.expirationTime,h=d.childExpirationTime,c>f&&(f=c),h>f&&(f=h),d=d.sibling;e.childExpirationTime=f}if(null!==b)return b;null!==a&&0===(a.effectTag&2048)&&(null===a.firstEffect&&(a.firstEffect=v.firstEffect),null!==v.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=v.firstEffect),a.lastEffect=v.lastEffect),1<v.effectTag&&(null!==a.lastEffect?a.lastEffect.nextEffect= -v:a.firstEffect=v,a.lastEffect=v))}else{b=yj(v,R);if(null!==b)return b.effectTag&=2047,b;null!==a&&(a.firstEffect=a.lastEffect=null,a.effectTag|=2048)}b=v.sibling;if(null!==b)return b;v=a}while(null!==v);G===$a&&(G=$e);return null}function Ye(a){var b=a.expirationTime;a=a.childExpirationTime;return b>a?b:a}function Ma(a){var b=pe();pb(99,Pj.bind(null,a,b));return null}function Pj(a,b){do Ab();while(null!==ic);if((q&(Z|ka))!==F)throw Error(m(327));var c=a.finishedWork,d=a.finishedExpirationTime;if(null=== -c)return null;a.finishedWork=null;a.finishedExpirationTime=0;if(c===a.current)throw Error(m(177));a.callbackNode=null;a.callbackExpirationTime=0;a.callbackPriority=90;a.nextKnownPendingLevel=0;var e=Ye(c);a.firstPendingTime=e;d<=a.lastSuspendedTime?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:d<=a.firstSuspendedTime&&(a.firstSuspendedTime=d-1);d<=a.lastPingedTime&&(a.lastPingedTime=0);d<=a.lastExpiredTime&&(a.lastExpiredTime=0);a===S&&(v=S=null,R=0);1<c.effectTag?null!==c.lastEffect? -(c.lastEffect.nextEffect=c,e=c.firstEffect):e=c:e=c.firstEffect;if(null!==e){var f=q;q|=ka;ai.current=null;bf=Gc;var g=pg();if(de(g)){if("selectionStart"in g)var h={start:g.selectionStart,end:g.selectionEnd};else a:{h=(h=g.ownerDocument)&&h.defaultView||window;var k=h.getSelection&&h.getSelection();if(k&&0!==k.rangeCount){h=k.anchorNode;var l=k.anchorOffset,p=k.focusNode;k=k.focusOffset;try{h.nodeType,p.nodeType}catch(Bb){h=null;break a}var x=0,y=-1,A=-1,B=0,G=0,t=g,z=null;b:for(;;){for(var C;;){t!== -h||0!==l&&3!==t.nodeType||(y=x+l);t!==p||0!==k&&3!==t.nodeType||(A=x+k);3===t.nodeType&&(x+=t.nodeValue.length);if(null===(C=t.firstChild))break;z=t;t=C}for(;;){if(t===g)break b;z===h&&++B===l&&(y=x);z===p&&++G===k&&(A=x);if(null!==(C=t.nextSibling))break;t=z;z=t.parentNode}t=C}h=-1===y||-1===A?null:{start:y,end:A}}else h=null}h=h||{start:0,end:0}}else h=null;cf={focusedElem:g,selectionRange:h};Gc=!1;n=e;do try{Qj()}catch(Bb){if(null===n)throw Error(m(330));Xa(n,Bb);n=n.nextEffect}while(null!==n); -n=e;do try{for(g=a,h=b;null!==n;){var r=n.effectTag;r&16&&fc(n.stateNode,"");if(r&128){var u=n.alternate;if(null!==u){var w=u.ref;null!==w&&("function"===typeof w?w(null):w.current=null)}}switch(r&1038){case 2:Lh(n);n.effectTag&=-3;break;case 6:Lh(n);n.effectTag&=-3;Te(n.alternate,n);break;case 1024:n.effectTag&=-1025;break;case 1028:n.effectTag&=-1025;Te(n.alternate,n);break;case 4:Te(n.alternate,n);break;case 8:l=n,Ih(g,l,h),Jh(l)}n=n.nextEffect}}catch(Bb){if(null===n)throw Error(m(330));Xa(n,Bb); -n=n.nextEffect}while(null!==n);w=cf;u=pg();r=w.focusedElem;h=w.selectionRange;if(u!==r&&r&&r.ownerDocument&&og(r.ownerDocument.documentElement,r)){null!==h&&de(r)&&(u=h.start,w=h.end,void 0===w&&(w=u),"selectionStart"in r?(r.selectionStart=u,r.selectionEnd=Math.min(w,r.value.length)):(w=(u=r.ownerDocument||document)&&u.defaultView||window,w.getSelection&&(w=w.getSelection(),l=r.textContent.length,g=Math.min(h.start,l),h=void 0===h.end?g:Math.min(h.end,l),!w.extend&&g>h&&(l=h,h=g,g=l),l=ng(r,g),p= -ng(r,h),l&&p&&(1!==w.rangeCount||w.anchorNode!==l.node||w.anchorOffset!==l.offset||w.focusNode!==p.node||w.focusOffset!==p.offset)&&(u=u.createRange(),u.setStart(l.node,l.offset),w.removeAllRanges(),g>h?(w.addRange(u),w.extend(p.node,p.offset)):(u.setEnd(p.node,p.offset),w.addRange(u))))));u=[];for(w=r;w=w.parentNode;)1===w.nodeType&&u.push({element:w,left:w.scrollLeft,top:w.scrollTop});"function"===typeof r.focus&&r.focus();for(r=0;r<u.length;r++)w=u[r],w.element.scrollLeft=w.left,w.element.scrollTop= -w.top}cf=null;Gc=!!bf;bf=null;a.current=c;n=e;do try{for(r=d;null!==n;){var H=n.effectTag;if(H&36){var D=n.alternate;u=n;w=r;switch(u.tag){case 0:case 11:case 15:ec(16,32,u);break;case 1:var E=u.stateNode;if(u.effectTag&4)if(null===D)E.componentDidMount();else{var J=u.elementType===u.type?D.memoizedProps:V(u.type,D.memoizedProps);E.componentDidUpdate(J,D.memoizedState,E.__reactInternalSnapshotBeforeUpdate)}var K=u.updateQueue;null!==K&&ah(u,K,E,w);break;case 3:var L=u.updateQueue;if(null!==L){g=null; -if(null!==u.child)switch(u.child.tag){case 5:g=u.child.stateNode;break;case 1:g=u.child.stateNode}ah(u,L,g,w)}break;case 5:var O=u.stateNode;null===D&&u.effectTag&4&&qg(u.type,u.memoizedProps)&&O.focus();break;case 6:break;case 4:break;case 12:break;case 13:if(null===u.memoizedState){var M=u.alternate;if(null!==M){var N=M.memoizedState;if(null!==N){var P=N.dehydrated;null!==P&&cg(P)}}}break;case 19:case 17:case 20:case 21:break;default:throw Error(m(163));}}if(H&128){u=void 0;var I=n.ref;if(null!== -I){var Q=n.stateNode;switch(n.tag){case 5:u=Q;break;default:u=Q}"function"===typeof I?I(u):I.current=u}}n=n.nextEffect}}catch(Bb){if(null===n)throw Error(m(330));Xa(n,Bb);n=n.nextEffect}while(null!==n);n=null;Rj();q=f}else a.current=c;if(rd)rd=!1,ic=a,jc=b;else for(n=e;null!==n;)b=n.nextEffect,n.nextEffect=null,n=b;b=a.firstPendingTime;0===b&&(La=null);1073741823===b?a===df?kc++:(kc=0,df=a):kc=0;"function"===typeof ef&&ef(c.stateNode,d);T(a);if(gd)throw gd=!1,a=Ve,Ve=null,a;if((q&af)!==F)return null; -ca();return null}function Qj(){for(;null!==n;){var a=n.effectTag;0!==(a&256)&&Aj(n.alternate,n);0===(a&512)||rd||(rd=!0,Pg(97,function(){Ab();return null}));n=n.nextEffect}}function Ab(){if(90!==jc){var a=97<jc?97:jc;jc=90;return pb(a,Sj)}}function Sj(){if(null===ic)return!1;var a=ic;ic=null;if((q&(Z|ka))!==F)throw Error(m(331));var b=q;q|=ka;for(a=a.current.firstEffect;null!==a;){try{var c=a;if(0!==(c.effectTag&512))switch(c.tag){case 0:case 11:case 15:ec(128,0,c),ec(0,64,c)}}catch(d){if(null=== -a)throw Error(m(330));Xa(a,d)}c=a.nextEffect;a.nextEffect=null;a=c}q=b;ca();return!0}function ci(a,b,c){b=Qe(c,b);b=Oh(a,b,1073741823);Fa(a,b);a=id(a,1073741823);null!==a&&T(a)}function Xa(a,b){if(3===a.tag)ci(a,a,b);else for(var c=a.return;null!==c;){if(3===c.tag){ci(c,a,b);break}else if(1===c.tag){var d=c.stateNode;if("function"===typeof c.type.getDerivedStateFromError||"function"===typeof d.componentDidCatch&&(null===La||!La.has(d))){a=Qe(b,a);a=Ph(c,a,1073741823);Fa(c,a);c=id(c,1073741823);null!== -c&&T(c);break}}c=c.return}}function Jj(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);S===a&&R===c?G===jd||G===od&&1073741823===sa&&Y()-Ue<Wh?Za(a,R):pd=!0:Rh(a,c)&&(b=a.lastPingedTime,0!==b&&b<c||(a.lastPingedTime=c,a.finishedExpirationTime===c&&(a.finishedExpirationTime=0,a.finishedWork=null),T(a)))}function Cj(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=0;0===b&&(b=X(),b=Va(b,a,null));a=id(a,b);null!==a&&T(a)}function Tj(a){if("undefined"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b= -__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=b.inject(a);ef=function(a,e){try{b.onCommitFiberRoot(c,a,void 0,64===(a.current.effectTag&64))}catch(f){}};Se=function(a){try{b.onCommitFiberUnmount(c,a)}catch(e){}}}catch(d){}return!0}function Uj(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps= -null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function Le(a){a=a.prototype;return!(!a||!a.isReactComponent)}function Vj(a){if("function"===typeof a)return Le(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Cd)return 11;if(a===Dd)return 14}return 2}function Ta(a,b,c){c=a.alternate;null===c?(c=ja(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate= -a,a.alternate=c):(c.pendingProps=b,c.effectTag=0,c.nextEffect=null,c.firstEffect=null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{expirationTime:b.expirationTime,firstContext:b.firstContext,responders:b.responders};c.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}function Zc(a,b,c,d,e, -f){var g=2;d=a;if("function"===typeof a)Le(a)&&(g=1);else if("string"===typeof a)g=5;else a:switch(a){case va:return Ha(c.children,e,f,b);case Wj:g=8;e|=7;break;case Af:g=8;e|=1;break;case vc:return a=ja(12,c,b,e|8),a.elementType=vc,a.type=vc,a.expirationTime=f,a;case wc:return a=ja(13,c,b,e),a.type=wc,a.elementType=wc,a.expirationTime=f,a;case Bd:return a=ja(19,c,b,e),a.elementType=Bd,a.expirationTime=f,a;default:if("object"===typeof a&&null!==a)switch(a.$$typeof){case Cf:g=10;break a;case Bf:g= -9;break a;case Cd:g=11;break a;case Dd:g=14;break a;case Df:g=16;d=null;break a}throw Error(m(130,null==a?a:typeof a,""));}b=ja(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function Ha(a,b,c,d){a=ja(7,a,d,b);a.expirationTime=c;return a}function xe(a,b,c){a=ja(6,a,null,b);a.expirationTime=c;return a}function ye(a,b,c){b=ja(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b} -function Xj(a,b,c){this.tag=b;this.current=null;this.containerInfo=a;this.pingCache=this.pendingChildren=null;this.finishedExpirationTime=0;this.finishedWork=null;this.timeoutHandle=-1;this.pendingContext=this.context=null;this.hydrate=c;this.callbackNode=null;this.callbackPriority=90;this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}function Rh(a,b){var c=a.firstSuspendedTime;a=a.lastSuspendedTime;return 0!== -c&&c>=b&&a<=b}function Ya(a,b){var c=a.firstSuspendedTime,d=a.lastSuspendedTime;c<b&&(a.firstSuspendedTime=b);if(d>b||0===c)a.lastSuspendedTime=b;b<=a.lastPingedTime&&(a.lastPingedTime=0);b<=a.lastExpiredTime&&(a.lastExpiredTime=0)}function Qh(a,b){b>a.firstPendingTime&&(a.firstPendingTime=b);var c=a.firstSuspendedTime;0!==c&&(b>=c?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:b>=a.lastSuspendedTime&&(a.lastSuspendedTime=b+1),b>a.nextKnownPendingLevel&&(a.nextKnownPendingLevel= -b))}function Xe(a,b){var c=a.lastExpiredTime;if(0===c||c>b)a.lastExpiredTime=b}function sd(a,b,c,d){var e=b.current,f=X(),g=dc.suspense;f=Va(f,e,g);a:if(c){c=c._reactInternalFiber;b:{if(Na(c)!==c||1!==c.tag)throw Error(m(170));var h=c;do{switch(h.tag){case 3:h=h.stateNode.context;break b;case 1:if(K(h.type)){h=h.stateNode.__reactInternalMemoizedMergedChildContext;break b}}h=h.return}while(null!==h);throw Error(m(171));}if(1===c.tag){var k=c.type;if(K(k)){c=Ig(c,k,h);break a}}c=h}else c=Da;null=== -b.context?b.context=c:b.pendingContext=c;b=Ea(f,g);b.payload={element:a};d=void 0===d?null:d;null!==d&&(b.callback=d);Fa(e,b);Ja(e,f);return f}function ff(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function di(a,b){a=a.memoizedState;null!==a&&null!==a.dehydrated&&a.retryTime<b&&(a.retryTime=b)}function gf(a,b){di(a,b);(a=a.alternate)&&di(a,b)}function hf(a,b,c){c=null!=c&&!0===c.hydrate;var d=new Xj(a,b,c),e=ja(3,null, -null,2===b?7:1===b?3:0);d.current=e;e.stateNode=d;a[Pb]=d.current;c&&0!==b&&Oi(9===a.nodeType?a:a.ownerDocument);this._internalRoot=d}function lc(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(a.nodeType!==Pa||" react-mount-point-unstable "!==a.nodeValue))}function Yj(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute("data-reactroot")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new hf(a,0,b?{hydrate:!0}:void 0)}function td(a, -b,c,d,e){var f=c._reactRootContainer;if(f){var g=f._internalRoot;if("function"===typeof e){var h=e;e=function(){var a=ff(g);h.call(a)}}sd(b,g,a,e)}else{f=c._reactRootContainer=Yj(c,d);g=f._internalRoot;if("function"===typeof e){var k=e;e=function(){var a=ff(g);k.call(a)}}Yh(function(){sd(b,g,a,e)})}return ff(g)}function Zj(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:eb,key:null==d?null:""+d,children:a,containerInfo:b,implementation:c}}function ei(a,b){var c= -2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!lc(b))throw Error(m(200));return Zj(a,b,null,c)}if(!la)throw Error(m(227));var qc=null,bb={},rc=[],wd={},cb={},xd={},Bi=function(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(p){this.onError(p)}},Cb=!1,sc=null,tc=!1,yd=null,Ci={onError:function(a){Cb=!0;sc=a}},Ad=null,Ff=null,xf=null,Db=null,Ei=function(a){if(a){var b=a._dispatchListeners,c=a._dispatchInstances;if(Array.isArray(b))for(var d=0;d< -b.length&&!a.isPropagationStopped();d++)wf(a,b[d],c[d]);else b&&wf(a,b,c);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}},jf={injectEventPluginOrder:function(a){if(qc)throw Error(m(101));qc=Array.prototype.slice.call(a);uf()},injectEventPluginsByName:function(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(!bb.hasOwnProperty(c)||bb[c]!==d){if(bb[c])throw Error(m(102,c));bb[c]=d;b=!0}}b&&uf()}},aa=la.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; -aa.hasOwnProperty("ReactCurrentDispatcher")||(aa.ReactCurrentDispatcher={current:null});aa.hasOwnProperty("ReactCurrentBatchConfig")||(aa.ReactCurrentBatchConfig={suspense:null});var Gi=/^(.*)[\\\/]/,D="function"===typeof Symbol&&Symbol.for,$c=D?Symbol.for("react.element"):60103,eb=D?Symbol.for("react.portal"):60106,va=D?Symbol.for("react.fragment"):60107,Af=D?Symbol.for("react.strict_mode"):60108,vc=D?Symbol.for("react.profiler"):60114,Cf=D?Symbol.for("react.provider"):60109,Bf=D?Symbol.for("react.context"): -60110,Wj=D?Symbol.for("react.concurrent_mode"):60111,Cd=D?Symbol.for("react.forward_ref"):60112,wc=D?Symbol.for("react.suspense"):60113,Bd=D?Symbol.for("react.suspense_list"):60120,Dd=D?Symbol.for("react.memo"):60115,Df=D?Symbol.for("react.lazy"):60116;D&&Symbol.for("react.fundamental");D&&Symbol.for("react.responder");D&&Symbol.for("react.scope");var zf="function"===typeof Symbol&&Symbol.iterator,Aa=!("undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement), -J=la.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.assign,Fd=null,fb=null,gb=null,ke=function(a,b){return a(b)},fg=function(a,b,c,d){return a(b,c,d)},Hd=function(){},hg=ke,Oa=!1,$d=!1,I=la.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.Scheduler,ak=I.unstable_cancelCallback,kf=I.unstable_now,ag=I.unstable_scheduleCallback,bk=I.unstable_shouldYield,fi=I.unstable_requestPaint,Ud=I.unstable_runWithPriority,ud=I.unstable_next,ck=I.unstable_getCurrentPriorityLevel,dk=I.unstable_ImmediatePriority, -gi=I.unstable_UserBlockingPriority,bg=I.unstable_NormalPriority,ek=I.unstable_LowPriority,fk=I.unstable_IdlePriority;new Map;var Ii=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,If=Object.prototype.hasOwnProperty, -Kf={},Jf={},C={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a){C[a]=new E(a,0,!1,a,null,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(a){var b=a[0];C[b]=new E(b,1,!1,a[1],null,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(a){C[a]=new E(a,2,!1,a.toLowerCase(),null,!1)}); -["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(a){C[a]=new E(a,2,!1,a,null,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a){C[a]=new E(a,3,!1,a.toLowerCase(),null,!1)});["checked","multiple","muted","selected"].forEach(function(a){C[a]=new E(a,3,!0,a,null, -!1)});["capture","download"].forEach(function(a){C[a]=new E(a,4,!1,a,null,!1)});["cols","rows","size","span"].forEach(function(a){C[a]=new E(a,6,!1,a,null,!1)});["rowSpan","start"].forEach(function(a){C[a]=new E(a,5,!1,a.toLowerCase(),null,!1)});var lf=/[\-:]([a-z])/g,mf=function(a){return a[1].toUpperCase()};"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a){var b= -a.replace(lf,mf);C[b]=new E(b,1,!1,a,null,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a){var b=a.replace(lf,mf);C[b]=new E(b,1,!1,a,"http://www.w3.org/1999/xlink",!1)});["xml:base","xml:lang","xml:space"].forEach(function(a){var b=a.replace(lf,mf);C[b]=new E(b,1,!1,a,"http://www.w3.org/XML/1998/namespace",!1)});["tabIndex","crossOrigin"].forEach(function(a){C[a]=new E(a,1,!1,a.toLowerCase(),null,!1)});C.xlinkHref=new E("xlinkHref",1, -!1,"xlink:href","http://www.w3.org/1999/xlink",!0);["src","href","action","formAction"].forEach(function(a){C[a]=new E(a,1,!1,a.toLowerCase(),null,!0)});var vd,Mh=function(a){return"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if("http://www.w3.org/2000/svg"!==a.namespaceURI||"innerHTML"in a)a.innerHTML=b;else{vd=vd||document.createElement("div");vd.innerHTML="<svg>"+b.valueOf().toString()+ -"</svg>";for(b=vd.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}}),Pa=8,fc=function(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b},ib={animationend:yc("Animation","AnimationEnd"),animationiteration:yc("Animation","AnimationIteration"),animationstart:yc("Animation","AnimationStart"),transitionend:yc("Transition","TransitionEnd")},Pd={},Uf={};Aa&&(Uf=document.createElement("div").style, -"AnimationEvent"in window||(delete ib.animationend.animation,delete ib.animationiteration.animation,delete ib.animationstart.animation),"TransitionEvent"in window||delete ib.transitionend.transition);var hi=zc("animationend"),ii=zc("animationiteration"),ji=zc("animationstart"),ki=zc("transitionend"),Nb="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "), -Wd=!1,ba=[],xa=null,ya=null,za=null,Fb=new Map,Gb=new Map,Lb=[],Rd="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput close cancel copy cut paste click change contextmenu reset submit".split(" "),Pi="focus blur dragenter dragleave mouseover mouseout pointerover pointerout gotpointercapture lostpointercapture".split(" ");J(M.prototype,{preventDefault:function(){this.defaultPrevented= -!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():"unknown"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=Bc)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():"unknown"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=Bc)},persist:function(){this.isPersistent=Bc},isPersistent:Cc,destructor:function(){var a=this.constructor.Interface,b;for(b in a)this[b]=null;this.nativeEvent=this._targetInst=this.dispatchConfig= -null;this.isPropagationStopped=this.isDefaultPrevented=Cc;this._dispatchInstances=this._dispatchListeners=null}});M.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};M.extend=function(a){function b(){return c.apply(this,arguments)}var c=this,d=function(){};d.prototype=c.prototype;d=new d;J(d,b.prototype);b.prototype=d;b.prototype.constructor= -b;b.Interface=J({},c.Interface,a);b.extend=c.extend;eg(b);return b};eg(M);var gk=M.extend({animationName:null,elapsedTime:null,pseudoElement:null}),hk=M.extend({clipboardData:function(a){return"clipboardData"in a?a.clipboardData:window.clipboardData}}),mc=M.extend({view:null,detail:null}),ik=mc.extend({relatedTarget:null}),jk={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock", -MozPrintableKey:"Unidentified"},kk={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},$i={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"}, -lk=mc.extend({key:function(a){if(a.key){var b=jk[a.key]||a.key;if("Unidentified"!==b)return b}return"keypress"===a.type?(a=Dc(a),13===a?"Enter":String.fromCharCode(a)):"keydown"===a.type||"keyup"===a.type?kk[a.keyCode]||"Unidentified":""},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:Zd,charCode:function(a){return"keypress"===a.type?Dc(a):0},keyCode:function(a){return"keydown"===a.type||"keyup"===a.type?a.keyCode:0},which:function(a){return"keypress"=== -a.type?Dc(a):"keydown"===a.type||"keyup"===a.type?a.keyCode:0}}),li=0,mi=0,ni=!1,oi=!1,nc=mc.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:Zd,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)},movementX:function(a){if("movementX"in a)return a.movementX;var b=li;li=a.screenX;return ni?"mousemove"===a.type?a.screenX- -b:0:(ni=!0,0)},movementY:function(a){if("movementY"in a)return a.movementY;var b=mi;mi=a.screenY;return oi?"mousemove"===a.type?a.screenY-b:0:(oi=!0,0)}}),pi=nc.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),mk=nc.extend({dataTransfer:null}),nk=mc.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:Zd}),ok=M.extend({propertyName:null, -elapsedTime:null,pseudoElement:null}),pk=nc.extend({deltaX:function(a){return"deltaX"in a?a.deltaX:"wheelDeltaX"in a?-a.wheelDeltaX:0},deltaY:function(a){return"deltaY"in a?a.deltaY:"wheelDeltaY"in a?-a.wheelDeltaY:"wheelDelta"in a?-a.wheelDelta:0},deltaZ:null,deltaMode:null}),qi=[["blur","blur",0],["cancel","cancel",0],["click","click",0],["close","close",0],["contextmenu","contextMenu",0],["copy","copy",0],["cut","cut",0],["auxclick","auxClick",0],["dblclick","doubleClick",0],["dragend","dragEnd", -0],["dragstart","dragStart",0],["drop","drop",0],["focus","focus",0],["input","input",0],["invalid","invalid",0],["keydown","keyDown",0],["keypress","keyPress",0],["keyup","keyUp",0],["mousedown","mouseDown",0],["mouseup","mouseUp",0],["paste","paste",0],["pause","pause",0],["play","play",0],["pointercancel","pointerCancel",0],["pointerdown","pointerDown",0],["pointerup","pointerUp",0],["ratechange","rateChange",0],["reset","reset",0],["seeked","seeked",0],["submit","submit",0],["touchcancel","touchCancel", -0],["touchend","touchEnd",0],["touchstart","touchStart",0],["volumechange","volumeChange",0],["drag","drag",1],["dragenter","dragEnter",1],["dragexit","dragExit",1],["dragleave","dragLeave",1],["dragover","dragOver",1],["mousemove","mouseMove",1],["mouseout","mouseOut",1],["mouseover","mouseOver",1],["pointermove","pointerMove",1],["pointerout","pointerOut",1],["pointerover","pointerOver",1],["scroll","scroll",1],["toggle","toggle",1],["touchmove","touchMove",1],["wheel","wheel",1],["abort","abort", -2],[hi,"animationEnd",2],[ii,"animationIteration",2],[ji,"animationStart",2],["canplay","canPlay",2],["canplaythrough","canPlayThrough",2],["durationchange","durationChange",2],["emptied","emptied",2],["encrypted","encrypted",2],["ended","ended",2],["error","error",2],["gotpointercapture","gotPointerCapture",2],["load","load",2],["loadeddata","loadedData",2],["loadedmetadata","loadedMetadata",2],["loadstart","loadStart",2],["lostpointercapture","lostPointerCapture",2],["playing","playing",2],["progress", -"progress",2],["seeking","seeking",2],["stalled","stalled",2],["suspend","suspend",2],["timeupdate","timeUpdate",2],[ki,"transitionEnd",2],["waiting","waiting",2]],ri={},nf={},of=0;for(;of<qi.length;of++){var pf=qi[of],si=pf[0],qf=pf[1],qk=pf[2],ti="on"+(qf[0].toUpperCase()+qf.slice(1)),ui={phasedRegistrationNames:{bubbled:ti,captured:ti+"Capture"},dependencies:[si],eventPriority:qk};ri[qf]=ui;nf[si]=ui}var vi={eventTypes:ri,getEventPriority:function(a){a=nf[a];return void 0!==a?a.eventPriority:2}, -extractEvents:function(a,b,c,d,e){e=nf[a];if(!e)return null;switch(a){case "keypress":if(0===Dc(c))return null;case "keydown":case "keyup":a=lk;break;case "blur":case "focus":a=ik;break;case "click":if(2===c.button)return null;case "auxclick":case "dblclick":case "mousedown":case "mousemove":case "mouseup":case "mouseout":case "mouseover":case "contextmenu":a=nc;break;case "drag":case "dragend":case "dragenter":case "dragexit":case "dragleave":case "dragover":case "dragstart":case "drop":a=mk;break; -case "touchcancel":case "touchend":case "touchmove":case "touchstart":a=nk;break;case hi:case ii:case ji:a=gk;break;case ki:a=ok;break;case "scroll":a=mc;break;case "wheel":a=pk;break;case "copy":case "cut":case "paste":a=hk;break;case "gotpointercapture":case "lostpointercapture":case "pointercancel":case "pointerdown":case "pointermove":case "pointerout":case "pointerover":case "pointerup":a=pi;break;default:a=M}b=a.getPooled(e,b,c,d);jb(b);return b}},fj=gi,ej=Ud,bj=vi.getEventPriority,gj=10,Fc= -[],Gc=!0,jg=new ("function"===typeof WeakMap?WeakMap:Map),Ob={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0, -tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},rk=["Webkit","ms","Moz","O"];Object.keys(Ob).forEach(function(a){rk.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);Ob[b]=Ob[a]})});var hj=J({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}),sg="$",tg="/$",ge="$?",fe="$!", -bf=null,cf=null,Ze="function"===typeof setTimeout?setTimeout:void 0,Hj="function"===typeof clearTimeout?clearTimeout:void 0,rf=Math.random().toString(36).slice(2),Ba="__reactInternalInstance$"+rf,Ic="__reactEventHandlers$"+rf,Pb="__reactContainere$"+rf,Ca=null,ie=null,Jc=null,sk=M.extend({data:null}),tk=M.extend({data:null}),ij=[9,13,27,32],je=Aa&&"CompositionEvent"in window,oc=null;Aa&&"documentMode"in document&&(oc=document.documentMode);var uk=Aa&&"TextEvent"in window&&!oc,zg=Aa&&(!je||oc&&8<oc&& -11>=oc),yg=String.fromCharCode(32),ta={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")}, -compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},xg=!1,lb=!1,vk={eventTypes:ta,extractEvents:function(a,b,c,d,e){var f;if(je)b:{switch(a){case "compositionstart":var g=ta.compositionStart;break b;case "compositionend":g=ta.compositionEnd;break b;case "compositionupdate":g=ta.compositionUpdate;break b}g=void 0}else lb?vg(a,c)&&(g=ta.compositionEnd):"keydown"=== -a&&229===c.keyCode&&(g=ta.compositionStart);g?(zg&&"ko"!==c.locale&&(lb||g!==ta.compositionStart?g===ta.compositionEnd&&lb&&(f=ug()):(Ca=d,ie="value"in Ca?Ca.value:Ca.textContent,lb=!0)),e=sk.getPooled(g,b,c,d),f?e.data=f:(f=wg(c),null!==f&&(e.data=f)),jb(e),f=e):f=null;(a=uk?jj(a,c):kj(a,c))?(b=tk.getPooled(ta.beforeInput,b,c,d),b.data=a,jb(b)):b=null;return null===f?b:null===b?f:[f,b]}},lj={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0, -tel:!0,text:!0,time:!0,url:!0,week:!0},Cg={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:"blur change click focus input keydown keyup selectionchange".split(" ")}},Qb=null,Rb=null,sf=!1;Aa&&(sf=ig("input")&&(!document.documentMode||9<document.documentMode));var wk={eventTypes:Cg,_isInputEventSupported:sf,extractEvents:function(a,b,c,d,e){e=b?Qa(b):window;var f=e.nodeName&&e.nodeName.toLowerCase();if("select"===f||"input"===f&&"file"===e.type)var g=nj; -else if(Ag(e))if(sf)g=rj;else{g=pj;var h=oj}else(f=e.nodeName)&&"input"===f.toLowerCase()&&("checkbox"===e.type||"radio"===e.type)&&(g=qj);if(g&&(g=g(a,b)))return Bg(g,c,d);h&&h(a,e,b);"blur"===a&&(a=e._wrapperState)&&a.controlled&&"number"===e.type&&Ld(e,"number",e.value)}},pc={mouseEnter:{registrationName:"onMouseEnter",dependencies:["mouseout","mouseover"]},mouseLeave:{registrationName:"onMouseLeave",dependencies:["mouseout","mouseover"]},pointerEnter:{registrationName:"onPointerEnter",dependencies:["pointerout", -"pointerover"]},pointerLeave:{registrationName:"onPointerLeave",dependencies:["pointerout","pointerover"]}},tf,xk={eventTypes:pc,extractEvents:function(a,b,c,d,e){var f="mouseover"===a||"pointerover"===a,g="mouseout"===a||"pointerout"===a;if(f&&0===(e&32)&&(c.relatedTarget||c.fromElement)||!g&&!f)return null;e=d.window===d?d:(e=d.ownerDocument)?e.defaultView||e.parentWindow:window;if(g){if(g=b,b=(b=c.relatedTarget||c.toElement)?Jb(b):null,null!==b&&(f=Na(b),b!==f||5!==b.tag&&6!==b.tag))b=null}else g= -null;if(g===b)return null;if("mouseout"===a||"mouseover"===a){var h=nc;var k=pc.mouseLeave;var l=pc.mouseEnter;var m="mouse"}else if("pointerout"===a||"pointerover"===a)h=pi,k=pc.pointerLeave,l=pc.pointerEnter,m="pointer";a=null==g?e:Qa(g);e=null==b?e:Qa(b);k=h.getPooled(k,g,c,d);k.type=m+"leave";k.target=a;k.relatedTarget=e;d=h.getPooled(l,b,c,d);d.type=m+"enter";d.target=e;d.relatedTarget=a;h=g;m=b;if(h&&m)a:{l=h;a=m;g=0;for(b=l;b;b=ma(b))g++;b=0;for(e=a;e;e=ma(e))b++;for(;0<g-b;)l=ma(l),g--;for(;0< -b-g;)a=ma(a),b--;for(;g--;){if(l===a||l===a.alternate)break a;l=ma(l);a=ma(a)}l=null}else l=null;a=l;for(l=[];h&&h!==a;){g=h.alternate;if(null!==g&&g===a)break;l.push(h);h=ma(h)}for(h=[];m&&m!==a;){g=m.alternate;if(null!==g&&g===a)break;h.push(m);m=ma(m)}for(m=0;m<l.length;m++)Yd(l[m],"bubbled",k);for(m=h.length;0<m--;)Yd(h[m],"captured",d);if(c===tf)return tf=null,[k];tf=c;return[k,d]}},Ra="function"===typeof Object.is?Object.is:sj,tj=Object.prototype.hasOwnProperty,yk=Aa&&"documentMode"in document&& -11>=document.documentMode,Gg={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"},dependencies:"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange".split(" ")}},mb=null,me=null,Tb=null,le=!1,zk={eventTypes:Gg,extractEvents:function(a,b,c,d,e){e=d.window===d?d.document:9===d.nodeType?d:d.ownerDocument;var f;if(!(f=!e)){a:{e=Qd(e);f=xd.onSelect;for(var g=0;g<f.length;g++)if(!e.has(f[g])){e=!1;break a}e=!0}f=!e}if(f)return null;e=b?Qa(b):window; -switch(a){case "focus":if(Ag(e)||"true"===e.contentEditable)mb=e,me=b,Tb=null;break;case "blur":Tb=me=mb=null;break;case "mousedown":le=!0;break;case "contextmenu":case "mouseup":case "dragend":return le=!1,Fg(c,d);case "selectionchange":if(yk)break;case "keydown":case "keyup":return Fg(c,d)}return null}};jf.injectEventPluginOrder("ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin".split(" "));(function(a,b,c){Ad=a;Ff=b;xf=c})(he, -Ib,Qa);jf.injectEventPluginsByName({SimpleEventPlugin:vi,EnterLeaveEventPlugin:xk,ChangeEventPlugin:wk,SelectEventPlugin:zk,BeforeInputEventPlugin:vk});new Set;var ne=[],nb=-1,Da={},L={current:Da},Q={current:!1},Sa=Da,vj=Ud,qe=ag,Tg=ak,uj=ck,Nc=dk,Kg=gi,Lg=bg,Mg=ek,Ng=fk,Sg={},Kj=bk,Rj=void 0!==fi?fi:function(){},oa=null,Oc=null,re=!1,wi=kf(),Y=1E4>wi?kf:function(){return kf()-wi},Ak=3,te={current:null},Rc=null,qb=null,Qc=null,Wg=0,Uc=2,Ga=!1,dc=aa.ReactCurrentBatchConfig,fh=(new la.Component).refs, -Xc={isMounted:function(a){return(a=a._reactInternalFiber)?Na(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=X(),e=dc.suspense;d=Va(d,a,e);e=Ea(d,e);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);Fa(a,e);Ja(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=X(),e=dc.suspense;d=Va(d,a,e);e=Ea(d,e);e.tag=1;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);Fa(a,e);Ja(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=X(),d=dc.suspense; -c=Va(c,a,d);d=Ea(c,d);d.tag=Uc;void 0!==b&&null!==b&&(d.callback=b);Fa(a,d);Ja(a,c)}},ad=Array.isArray,yb=gh(!0),Ke=gh(!1),Wb={},fa={current:Wb},Yb={current:Wb},Xb={current:Wb},A={current:0},cd=aa.ReactCurrentDispatcher,U=aa.ReactCurrentBatchConfig,Zb=0,Ia=null,H=null,ha=null,vb=null,O=null,ub=null,wb=0,ia=null,bc=0,$b=!1,pa=null,ac=0,dd={readContext:ea,useCallback:N,useContext:N,useEffect:N,useImperativeHandle:N,useLayoutEffect:N,useMemo:N,useReducer:N,useRef:N,useState:N,useDebugValue:N,useResponder:N, -useDeferredValue:N,useTransition:N},wj={readContext:ea,useCallback:sh,useContext:ea,useEffect:oh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Ge(4,36,qh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return Ge(4,36,a,b)},useMemo:function(a,b){var c=xb();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=xb();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={last:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b}; -a=a.dispatch=nh.bind(null,Ia,a);return[d.memoizedState,a]},useRef:function(a){var b=xb();a={current:a};return b.memoizedState=a},useState:De,useDebugValue:rh,useResponder:ih,useDeferredValue:function(a,b){var c=De(a),d=c[0],e=c[1];oh(function(){ud(function(){var c=U.suspense;U.suspense=void 0===b?null:b;try{e(a)}finally{U.suspense=c}})},[a,b]);return d},useTransition:function(a){var b=De(!1),c=b[0],d=b[1];return[sh(function(b){d(!0);ud(function(){var c=U.suspense;U.suspense=void 0===a?null:a;try{d(!1), -b()}finally{U.suspense=c}})},[a,c]),c]}},jh={readContext:ea,useCallback:th,useContext:ea,useEffect:ph,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return He(4,36,qh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return He(4,36,a,b)},useMemo:function(a,b){var c=cc();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Be(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a},useReducer:mh,useRef:function(a){return cc().memoizedState},useState:Ee,useDebugValue:rh, -useResponder:ih,useDeferredValue:function(a,b){var c=Ee(a),d=c[0],e=c[1];ph(function(){ud(function(){var c=U.suspense;U.suspense=void 0===b?null:b;try{e(a)}finally{U.suspense=c}})},[a,b]);return d},useTransition:function(a){var b=Ee(!1),c=b[0],d=b[1];return[th(function(b){d(!0);ud(function(){var c=U.suspense;U.suspense=void 0===a?null:a;try{d(!1),b()}finally{U.suspense=c}})},[a,c]),c]}},qa=null,Ka=null,Wa=!1,xj=aa.ReactCurrentOwner,da=!1,Oe={dehydrated:null,retryTime:0};var Nj=function(a,b,c,d){for(c= -b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};var bi=function(a){};var Mj=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){var g=b.stateNode;Ua(fa.current);a=null;switch(c){case "input":f=Jd(g,f);d=Jd(g,d);a=[];break;case "option":f=Md(g,f);d=Md(g,d);a=[];break;case "select":f= -J({},f,{value:void 0});d=J({},d,{value:void 0});a=[];break;case "textarea":f=Nd(g,f);d=Nd(g,d);a=[];break;default:"function"!==typeof f.onClick&&"function"===typeof d.onClick&&(g.onclick=Hc)}ae(c,d);var h,k;c=null;for(h in f)if(!d.hasOwnProperty(h)&&f.hasOwnProperty(h)&&null!=f[h])if("style"===h)for(k in g=f[h],g)g.hasOwnProperty(k)&&(c||(c={}),c[k]="");else"dangerouslySetInnerHTML"!==h&&"children"!==h&&"suppressContentEditableWarning"!==h&&"suppressHydrationWarning"!==h&&"autoFocus"!==h&&(cb.hasOwnProperty(h)? -a||(a=[]):(a=a||[]).push(h,null));for(h in d){var l=d[h];g=null!=f?f[h]:void 0;if(d.hasOwnProperty(h)&&l!==g&&(null!=l||null!=g))if("style"===h)if(g){for(k in g)!g.hasOwnProperty(k)||l&&l.hasOwnProperty(k)||(c||(c={}),c[k]="");for(k in l)l.hasOwnProperty(k)&&g[k]!==l[k]&&(c||(c={}),c[k]=l[k])}else c||(a||(a=[]),a.push(h,c)),c=l;else"dangerouslySetInnerHTML"===h?(l=l?l.__html:void 0,g=g?g.__html:void 0,null!=l&&g!==l&&(a=a||[]).push(h,""+l)):"children"===h?g===l||"string"!==typeof l&&"number"!==typeof l|| -(a=a||[]).push(h,""+l):"suppressContentEditableWarning"!==h&&"suppressHydrationWarning"!==h&&(cb.hasOwnProperty(h)?(null!=l&&na(e,h),a||g===l||(a=[])):(a=a||[]).push(h,l))}c&&(a=a||[]).push("style",c);e=a;(b.updateQueue=e)&&zb(b)}};var Oj=function(a,b,c,d){c!==d&&zb(b)};var Bj="function"===typeof WeakSet?WeakSet:Set,Ij="function"===typeof WeakMap?WeakMap:Map,Ej=Math.ceil,ld=aa.ReactCurrentDispatcher,ai=aa.ReactCurrentOwner,F=0,af=8,Z=16,ka=32,$a=0,md=1,Vh=2,od=3,jd=4,$e=5,q=F,S=null,v=null,R=0,G= -$a,nd=null,sa=1073741823,gc=1073741823,qd=null,hc=0,pd=!1,Ue=0,Wh=500,n=null,gd=!1,Ve=null,La=null,rd=!1,ic=null,jc=90,ab=null,kc=0,df=null,hd=0,Ja=function(a,b){if(50<kc)throw kc=0,df=null,Error(m(185));a=id(a,b);if(null!==a){var c=pe();1073741823===b?(q&af)!==F&&(q&(Z|ka))===F?We(a):(T(a),q===F&&ca()):T(a);(q&4)===F||98!==c&&99!==c||(null===ab?ab=new Map([[a,b]]):(c=ab.get(a),(void 0===c||c>b)&&ab.set(a,b)))}};var Lj=function(a,b,c){var d=b.expirationTime;if(null!==a){var e=b.pendingProps;if(a.memoizedProps!== -e||Q.current)da=!0;else{if(d<c){da=!1;switch(b.tag){case 3:Ch(b);Je();break;case 5:hh(b);if(b.mode&4&&1!==c&&e.hidden)return b.expirationTime=b.childExpirationTime=1,null;break;case 1:K(b.type)&&Mc(b);break;case 4:ze(b,b.stateNode.containerInfo);break;case 10:Ug(b,b.memoizedProps.value);break;case 13:if(null!==b.memoizedState){d=b.child.childExpirationTime;if(0!==d&&d>=c)return Dh(a,b,c);y(A,A.current&1,b);b=ra(a,b,c);return null!==b?b.sibling:null}y(A,A.current&1,b);break;case 19:d=b.childExpirationTime>= -c;if(0!==(a.effectTag&64)){if(d)return Fh(a,b,c);b.effectTag|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null);y(A,A.current,b);if(!d)return null}return ra(a,b,c)}da=!1}}else da=!1;b.expirationTime=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;e=ob(b,L.current);rb(b,c);e=Ce(null,b,d,a,e,c);b.effectTag|=1;if("object"===typeof e&&null!==e&&"function"===typeof e.render&&void 0===e.$$typeof){b.tag=1;kh();if(K(d)){var f=!0;Mc(b)}else f= -!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;var g=d.getDerivedStateFromProps;"function"===typeof g&&Wc(b,d,g,a);e.updater=Xc;b.stateNode=e;e._reactInternalFiber=b;we(b,d,a,c);b=Ne(null,b,d,!0,f,c)}else b.tag=0,P(null,b,e,c),b=b.child;return b;case 16:e=b.elementType;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;Fi(e);if(1!==e._status)throw e._result;e=e._result;b.type=e;f=b.tag=Vj(e);a=V(e,a);switch(f){case 0:b=Me(null,b,e,a,c);break;case 1:b=Bh(null, -b,e,a,c);break;case 11:b=xh(null,b,e,a,c);break;case 14:b=yh(null,b,e,V(e.type,a),d,c);break;default:throw Error(m(306,e,""));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:V(d,e),Me(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:V(d,e),Bh(a,b,d,e,c);case 3:Ch(b);d=b.updateQueue;if(null===d)throw Error(m(282));e=b.memoizedState;e=null!==e?e.element:null;Ub(b,d,b.pendingProps,null,c);d=b.memoizedState.element;if(d===e)Je(),b=ra(a,b,c);else{if(e=b.stateNode.hydrate)Ka= -kb(b.stateNode.containerInfo.firstChild),qa=b,e=Wa=!0;if(e)for(c=Ke(b,null,d,c),b.child=c;c;)c.effectTag=c.effectTag&-3|1024,c=c.sibling;else P(a,b,d,c),Je();b=b.child}return b;case 5:return hh(b),null===a&&Ie(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,ee(d,e)?g=null:null!==f&&ee(d,f)&&(b.effectTag|=16),Ah(a,b),b.mode&4&&1!==c&&e.hidden?(b.expirationTime=b.childExpirationTime=1,b=null):(P(a,b,g,c),b=b.child),b;case 6:return null===a&&Ie(b),null;case 13:return Dh(a,b, -c);case 4:return ze(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=yb(b,null,d,c):P(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:V(d,e),xh(a,b,d,e,c);case 7:return P(a,b,b.pendingProps,c),b.child;case 8:return P(a,b,b.pendingProps.children,c),b.child;case 12:return P(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;Ug(b,f);if(null!==g){var h=g.value;f=Ra(h,f)?0:("function"===typeof d._calculateChangedBits? -d._calculateChangedBits(h,f):1073741823)|0;if(0===f){if(g.children===e.children&&!Q.current){b=ra(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var k=h.dependencies;if(null!==k){g=h.child;for(var l=k.firstContext;null!==l;){if(l.context===d&&0!==(l.observedBits&f)){1===h.tag&&(l=Ea(c,null),l.tag=Uc,Fa(h,l));h.expirationTime<c&&(h.expirationTime=c);l=h.alternate;null!==l&&l.expirationTime<c&&(l.expirationTime=c);Vg(h.return,c);k.expirationTime<c&&(k.expirationTime=c);break}l= -l.next}}else g=10===h.tag?h.type===b.type?null:h.child:h.child;if(null!==g)g.return=h;else for(g=h;null!==g;){if(g===b){g=null;break}h=g.sibling;if(null!==h){h.return=g.return;g=h;break}g=g.return}h=g}}P(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,f=b.pendingProps,d=f.children,rb(b,c),e=ea(e,f.unstable_observedBits),d=d(e),b.effectTag|=1,P(a,b,d,c),b.child;case 14:return e=b.type,f=V(e,b.pendingProps),f=V(e.type,f),yh(a,b,e,f,d,c);case 15:return zh(a,b,b.type,b.pendingProps,d,c);case 17:return d= -b.type,e=b.pendingProps,e=b.elementType===d?e:V(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),b.tag=1,K(d)?(a=!0,Mc(b)):a=!1,rb(b,c),dh(b,d,e,c),we(b,d,e,c),Ne(null,b,d,!0,a,c);case 19:return Fh(a,b,c)}throw Error(m(156,b.tag));};var ef=null,Se=null,ja=function(a,b,c,d){return new Uj(a,b,c,d)};hf.prototype.render=function(a,b){sd(a,this._internalRoot,null,void 0===b?null:b)};hf.prototype.unmount=function(a){var b=this._internalRoot,c=void 0===a?null:a,d=b.containerInfo;sd(null, -b,null,function(){d[Pb]=null;null!==c&&c()})};var Ui=function(a){if(13===a.tag){var b=Pc(X(),150,100);Ja(a,b);gf(a,b)}};var Zf=function(a){if(13===a.tag){X();var b=Ak++;Ja(a,b);gf(a,b)}};var Si=function(a){if(13===a.tag){var b=X();b=Va(b,a,null);Ja(a,b);gf(a,b)}};Fd=function(a,b,c){switch(b){case "input":Kd(a,c);b=c.name;if("radio"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll("input[name="+JSON.stringify(""+b)+'][type="radio"]');for(b=0;b<c.length;b++){var d=c[b];if(d!== -a&&d.form===a.form){var e=he(d);if(!e)throw Error(m(90));Mf(d);Kd(d,e)}}}break;case "textarea":Rf(a,c);break;case "select":b=c.value,null!=b&&hb(a,!!c.multiple,b,!1)}};(function(a,b,c,d){ke=a;fg=b;Hd=c;hg=d})(Xh,function(a,b,c,d){var e=q;q|=4;try{return pb(98,a.bind(null,b,c,d))}finally{q=e,q===F&&ca()}},function(){(q&(1|Z|ka))===F&&(Gj(),Ab())},function(a,b){var c=q;q|=2;try{return a(b)}finally{q=c,q===F&&ca()}});var xi={createPortal:ei,findDOMNode:function(a){if(null==a)return null;if(1===a.nodeType)return a; -var b=a._reactInternalFiber;if(void 0===b){if("function"===typeof a.render)throw Error(m(188));throw Error(m(268,Object.keys(a)));}a=Xf(b);a=null===a?null:a.stateNode;return a},hydrate:function(a,b,c){if(!lc(b))throw Error(m(200));return td(null,a,b,!0,c)},render:function(a,b,c){if(!lc(b))throw Error(m(200));return td(null,a,b,!1,c)},unstable_renderSubtreeIntoContainer:function(a,b,c,d){if(!lc(c))throw Error(m(200));if(null==a||void 0===a._reactInternalFiber)throw Error(m(38));return td(a,b,c,!1, -d)},unmountComponentAtNode:function(a){if(!lc(a))throw Error(m(40));return a._reactRootContainer?(Yh(function(){td(null,null,a,!1,function(){a._reactRootContainer=null;a[Pb]=null})}),!0):!1},unstable_createPortal:function(){return ei.apply(void 0,arguments)},unstable_batchedUpdates:Xh,flushSync:function(a,b){if((q&(Z|ka))!==F)throw Error(m(187));var c=q;q|=1;try{return pb(99,a.bind(null,b))}finally{q=c,ca()}},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{Events:[Ib,Qa,he,jf.injectEventPluginsByName, -wd,jb,function(a){zd(a,Wi)},Gf,Hf,Ec,uc,Ab,{current:!1}]}};(function(a){var b=a.findFiberByHostInstance;return Tj(J({},a,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:aa.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=Xf(a);return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null}))})({findFiberByHostInstance:Jb, -bundleType:0,version:"16.12.0",rendererPackageName:"react-dom"});var yi={default:xi},zi=yi&&xi||yi;return zi.default||zi}); +'use strict';(function(I,ea){"object"===typeof exports&&"undefined"!==typeof module?ea(exports,require("react")):"function"===typeof define&&define.amd?define(["exports","react"],ea):(I=I||self,ea(I.ReactDOM={},I.React))})(this,function(I,ea){function k(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c<arguments.length;c++)b+="&args[]="+encodeURIComponent(arguments[c]);return"Minified React error #"+a+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."} +function ji(a,b,c,d,e,f,g,h,m){yb=!1;gc=null;ki.apply(li,arguments)}function mi(a,b,c,d,e,f,g,h,m){ji.apply(this,arguments);if(yb){if(yb){var n=gc;yb=!1;gc=null}else throw Error(k(198));hc||(hc=!0,pd=n)}}function lf(a,b,c){var d=a.type||"unknown-event";a.currentTarget=mf(c);mi(d,b,void 0,a);a.currentTarget=null}function nf(){if(ic)for(var a in cb){var b=cb[a],c=ic.indexOf(a);if(!(-1<c))throw Error(k(96,a));if(!jc[c]){if(!b.extractEvents)throw Error(k(97,a));jc[c]=b;c=b.eventTypes;for(var d in c){var e= +void 0;var f=c[d],g=b,h=d;if(qd.hasOwnProperty(h))throw Error(k(99,h));qd[h]=f;var m=f.phasedRegistrationNames;if(m){for(e in m)m.hasOwnProperty(e)&&of(m[e],g,h);e=!0}else f.registrationName?(of(f.registrationName,g,h),e=!0):e=!1;if(!e)throw Error(k(98,d,a));}}}}function of(a,b,c){if(db[a])throw Error(k(100,a));db[a]=b;rd[a]=b.eventTypes[c].dependencies}function pf(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(!cb.hasOwnProperty(c)||cb[c]!==d){if(cb[c])throw Error(k(102,c));cb[c]= +d;b=!0}}b&&nf()}function qf(a){if(a=rf(a)){if("function"!==typeof sd)throw Error(k(280));var b=a.stateNode;b&&(b=td(b),sd(a.stateNode,a.type,b))}}function sf(a){eb?fb?fb.push(a):fb=[a]:eb=a}function tf(){if(eb){var a=eb,b=fb;fb=eb=null;qf(a);if(b)for(a=0;a<b.length;a++)qf(b[a])}}function ud(){if(null!==eb||null!==fb)vd(),tf()}function uf(a,b,c){if(wd)return a(b,c);wd=!0;try{return vf(a,b,c)}finally{wd=!1,ud()}}function ni(a){if(wf.call(xf,a))return!0;if(wf.call(yf,a))return!1;if(oi.test(a))return xf[a]= +!0;yf[a]=!0;return!1}function pi(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case "function":case "symbol":return!0;case "boolean":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return"data-"!==a&&"aria-"!==a;default:return!1}}function qi(a,b,c,d){if(null===b||"undefined"===typeof b||pi(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function L(a, +b,c,d,e,f){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f}function xd(a,b,c,d){var e=E.hasOwnProperty(b)?E[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||"o"!==b[0]&&"O"!==b[0]||"n"!==b[1]&&"N"!==b[1]?!1:!0;f||(qi(b,c,e,d)&&(c=null),d||null===e?ni(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,""+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:"":c:(b=e.attributeName, +d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?"":""+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}function zb(a){if(null===a||"object"!==typeof a)return null;a=zf&&a[zf]||a["@@iterator"];return"function"===typeof a?a:null}function ri(a){if(-1===a._status){a._status=0;var b=a._ctor;b=b();a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)})}}function na(a){if(null==a)return null; +if("function"===typeof a)return a.displayName||a.name||null;if("string"===typeof a)return a;switch(a){case Ma:return"Fragment";case gb:return"Portal";case kc:return"Profiler";case Af:return"StrictMode";case lc:return"Suspense";case yd:return"SuspenseList"}if("object"===typeof a)switch(a.$$typeof){case Bf:return"Context.Consumer";case Cf:return"Context.Provider";case zd:var b=a.render;b=b.displayName||b.name||"";return a.displayName||(""!==b?"ForwardRef("+b+")":"ForwardRef");case Ad:return na(a.type); +case Df:return na(a.render);case Ef:if(a=1===a._status?a._result:null)return na(a)}return null}function Bd(a){var b="";do{a:switch(a.tag){case 3:case 4:case 6:case 7:case 10:case 9:var c="";break a;default:var d=a._debugOwner,e=a._debugSource,f=na(a.type);c=null;d&&(c=na(d.type));d=f;f="";e?f=" (at "+e.fileName.replace(si,"")+":"+e.lineNumber+")":c&&(f=" (created by "+c+")");c="\n in "+(d||"Unknown")+f}b+=c;a=a.return}while(a);return b}function va(a){switch(typeof a){case "boolean":case "number":case "object":case "string":case "undefined":return a; +default:return""}}function Ff(a){var b=a.type;return(a=a.nodeName)&&"input"===a.toLowerCase()&&("checkbox"===b||"radio"===b)}function ti(a){var b=Ff(a)?"checked":"value",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=""+a[b];if(!a.hasOwnProperty(b)&&"undefined"!==typeof c&&"function"===typeof c.get&&"function"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=""+a;f.call(this,a)}});Object.defineProperty(a, +b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=""+a},stopTracking:function(){a._valueTracker=null;delete a[b]}}}}function mc(a){a._valueTracker||(a._valueTracker=ti(a))}function Gf(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d="";a&&(d=Ff(a)?a.checked?"true":"false":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Cd(a,b){var c=b.checked;return M({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!= +c?c:a._wrapperState.initialChecked})}function Hf(a,b){var c=null==b.defaultValue?"":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=va(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:"checkbox"===b.type||"radio"===b.type?null!=b.checked:null!=b.value}}function If(a,b){b=b.checked;null!=b&&xd(a,"checked",b,!1)}function Dd(a,b){If(a,b);var c=va(b.value),d=b.type;if(null!=c)if("number"===d){if(0===c&&""===a.value||a.value!=c)a.value=""+c}else a.value!== +""+c&&(a.value=""+c);else if("submit"===d||"reset"===d){a.removeAttribute("value");return}b.hasOwnProperty("value")?Ed(a,b.type,c):b.hasOwnProperty("defaultValue")&&Ed(a,b.type,va(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}function Jf(a,b,c){if(b.hasOwnProperty("value")||b.hasOwnProperty("defaultValue")){var d=b.type;if(!("submit"!==d&&"reset"!==d||void 0!==b.value&&null!==b.value))return;b=""+a._wrapperState.initialValue;c||b===a.value||(a.value= +b);a.defaultValue=b}c=a.name;""!==c&&(a.name="");a.defaultChecked=!!a._wrapperState.initialChecked;""!==c&&(a.name=c)}function Ed(a,b,c){if("number"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=""+a._wrapperState.initialValue:a.defaultValue!==""+c&&(a.defaultValue=""+c)}function ui(a){var b="";ea.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}function Fd(a,b){a=M({children:void 0},b);if(b=ui(b.children))a.children=b;return a}function hb(a,b,c,d){a=a.options;if(b){b={}; +for(var e=0;e<c.length;e++)b["$"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty("$"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=""+va(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}function Gd(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(k(91));return M({},b,{value:void 0,defaultValue:void 0,children:""+a._wrapperState.initialValue})} +function Kf(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(k(92));if(Array.isArray(c)){if(!(1>=c.length))throw Error(k(93));c=c[0]}b=c}null==b&&(b="");c=b}a._wrapperState={initialValue:va(c)}}function Lf(a,b){var c=va(b.value),d=va(b.defaultValue);null!=c&&(c=""+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=""+d)}function Mf(a,b){b=a.textContent;b===a._wrapperState.initialValue&&""!== +b&&null!==b&&(a.value=b)}function Nf(a){switch(a){case "svg":return"http://www.w3.org/2000/svg";case "math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function Hd(a,b){return null==a||"http://www.w3.org/1999/xhtml"===a?Nf(b):"http://www.w3.org/2000/svg"===a&&"foreignObject"===b?"http://www.w3.org/1999/xhtml":a}function nc(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c["Webkit"+a]="webkit"+b;c["Moz"+a]="moz"+b;return c}function oc(a){if(Id[a])return Id[a]; +if(!ib[a])return a;var b=ib[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Of)return Id[a]=b[c];return a}function Jd(a){var b=Pf.get(a);void 0===b&&(b=new Map,Pf.set(a,b));return b}function Na(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.effectTag&1026)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function Qf(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function Rf(a){if(Na(a)!== +a)throw Error(k(188));}function vi(a){var b=a.alternate;if(!b){b=Na(a);if(null===b)throw Error(k(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return Rf(e),a;if(f===d)return Rf(e),b;f=f.sibling}throw Error(k(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h= +f.child;h;){if(h===c){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(k(189));}}if(c.alternate!==d)throw Error(k(190));}if(3!==c.tag)throw Error(k(188));return c.stateNode.current===c?a:b}function Sf(a){a=vi(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}}return null}function jb(a,b){if(null== +b)throw Error(k(30));if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}function Kd(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}function pc(a){null!==a&&(Ab=jb(Ab,a));a=Ab;Ab=null;if(a){Kd(a,wi);if(Ab)throw Error(k(95));if(hc)throw a=pd,hc=!1,pd=null,a;}}function Ld(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode: +a}function Tf(a){if(!wa)return!1;a="on"+a;var b=a in document;b||(b=document.createElement("div"),b.setAttribute(a,"return;"),b="function"===typeof b[a]);return b}function Uf(a){a.topLevelType=null;a.nativeEvent=null;a.targetInst=null;a.ancestors.length=0;10>qc.length&&qc.push(a)}function Vf(a,b,c,d){if(qc.length){var e=qc.pop();e.topLevelType=a;e.eventSystemFlags=d;e.nativeEvent=b;e.targetInst=c;return e}return{topLevelType:a,eventSystemFlags:d,nativeEvent:b,targetInst:c,ancestors:[]}}function Wf(a){var b= +a.targetInst,c=b;do{if(!c){a.ancestors.push(c);break}var d=c;if(3===d.tag)d=d.stateNode.containerInfo;else{for(;d.return;)d=d.return;d=3!==d.tag?null:d.stateNode.containerInfo}if(!d)break;b=c.tag;5!==b&&6!==b||a.ancestors.push(c);c=Bb(d)}while(c);for(c=0;c<a.ancestors.length;c++){b=a.ancestors[c];var e=Ld(a.nativeEvent);d=a.topLevelType;var f=a.nativeEvent,g=a.eventSystemFlags;0===c&&(g|=64);for(var h=null,m=0;m<jc.length;m++){var n=jc[m];n&&(n=n.extractEvents(d,b,f,e,g))&&(h=jb(h,n))}pc(h)}}function Md(a, +b,c){if(!c.has(a)){switch(a){case "scroll":Cb(b,"scroll",!0);break;case "focus":case "blur":Cb(b,"focus",!0);Cb(b,"blur",!0);c.set("blur",null);c.set("focus",null);break;case "cancel":case "close":Tf(a)&&Cb(b,a,!0);break;case "invalid":case "submit":case "reset":break;default:-1===Db.indexOf(a)&&w(a,b)}c.set(a,null)}}function xi(a,b){var c=Jd(b);Nd.forEach(function(a){Md(a,b,c)});yi.forEach(function(a){Md(a,b,c)})}function Od(a,b,c,d,e){return{blockedOn:a,topLevelType:b,eventSystemFlags:c|32,nativeEvent:e, +container:d}}function Xf(a,b){switch(a){case "focus":case "blur":xa=null;break;case "dragenter":case "dragleave":ya=null;break;case "mouseover":case "mouseout":za=null;break;case "pointerover":case "pointerout":Eb.delete(b.pointerId);break;case "gotpointercapture":case "lostpointercapture":Fb.delete(b.pointerId)}}function Gb(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a=Od(b,c,d,e,f),null!==b&&(b=Hb(b),null!==b&&Yf(b)),a;a.eventSystemFlags|=d;return a}function zi(a,b,c,d,e){switch(b){case "focus":return xa= +Gb(xa,a,b,c,d,e),!0;case "dragenter":return ya=Gb(ya,a,b,c,d,e),!0;case "mouseover":return za=Gb(za,a,b,c,d,e),!0;case "pointerover":var f=e.pointerId;Eb.set(f,Gb(Eb.get(f)||null,a,b,c,d,e));return!0;case "gotpointercapture":return f=e.pointerId,Fb.set(f,Gb(Fb.get(f)||null,a,b,c,d,e)),!0}return!1}function Ai(a){var b=Bb(a.target);if(null!==b){var c=Na(b);if(null!==c)if(b=c.tag,13===b){if(b=Qf(c),null!==b){a.blockedOn=b;Pd(a.priority,function(){Bi(c)});return}}else if(3===b&&c.stateNode.hydrate){a.blockedOn= +3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}function rc(a){if(null!==a.blockedOn)return!1;var b=Qd(a.topLevelType,a.eventSystemFlags,a.container,a.nativeEvent);if(null!==b){var c=Hb(b);null!==c&&Yf(c);a.blockedOn=b;return!1}return!0}function Zf(a,b,c){rc(a)&&c.delete(b)}function Ci(){for(Rd=!1;0<fa.length;){var a=fa[0];if(null!==a.blockedOn){a=Hb(a.blockedOn);null!==a&&Di(a);break}var b=Qd(a.topLevelType,a.eventSystemFlags,a.container,a.nativeEvent);null!==b?a.blockedOn=b:fa.shift()}null!== +xa&&rc(xa)&&(xa=null);null!==ya&&rc(ya)&&(ya=null);null!==za&&rc(za)&&(za=null);Eb.forEach(Zf);Fb.forEach(Zf)}function Ib(a,b){a.blockedOn===b&&(a.blockedOn=null,Rd||(Rd=!0,$f(ag,Ci)))}function bg(a){if(0<fa.length){Ib(fa[0],a);for(var b=1;b<fa.length;b++){var c=fa[b];c.blockedOn===a&&(c.blockedOn=null)}}null!==xa&&Ib(xa,a);null!==ya&&Ib(ya,a);null!==za&&Ib(za,a);b=function(b){return Ib(b,a)};Eb.forEach(b);Fb.forEach(b);for(b=0;b<Jb.length;b++)c=Jb[b],c.blockedOn===a&&(c.blockedOn=null);for(;0<Jb.length&& +(b=Jb[0],null===b.blockedOn);)Ai(b),null===b.blockedOn&&Jb.shift()}function Sd(a,b){for(var c=0;c<a.length;c+=2){var d=a[c],e=a[c+1],f="on"+(e[0].toUpperCase()+e.slice(1));f={phasedRegistrationNames:{bubbled:f,captured:f+"Capture"},dependencies:[d],eventPriority:b};Td.set(d,b);cg.set(d,f);dg[e]=f}}function w(a,b){Cb(b,a,!1)}function Cb(a,b,c){var d=Td.get(b);switch(void 0===d?2:d){case 0:d=Ei.bind(null,b,1,a);break;case 1:d=Fi.bind(null,b,1,a);break;default:d=sc.bind(null,b,1,a)}c?a.addEventListener(b, +d,!0):a.addEventListener(b,d,!1)}function Ei(a,b,c,d){Oa||vd();var e=sc,f=Oa;Oa=!0;try{eg(e,a,b,c,d)}finally{(Oa=f)||ud()}}function Fi(a,b,c,d){Gi(Hi,sc.bind(null,a,b,c,d))}function sc(a,b,c,d){if(tc)if(0<fa.length&&-1<Nd.indexOf(a))a=Od(null,a,b,c,d),fa.push(a);else{var e=Qd(a,b,c,d);if(null===e)Xf(a,d);else if(-1<Nd.indexOf(a))a=Od(e,a,b,c,d),fa.push(a);else if(!zi(e,a,b,c,d)){Xf(a,d);a=Vf(a,d,null,b);try{uf(Wf,a)}finally{Uf(a)}}}}function Qd(a,b,c,d){c=Ld(d);c=Bb(c);if(null!==c){var e=Na(c);if(null=== +e)c=null;else{var f=e.tag;if(13===f){c=Qf(e);if(null!==c)return c;c=null}else if(3===f){if(e.stateNode.hydrate)return 3===e.tag?e.stateNode.containerInfo:null;c=null}else e!==c&&(c=null)}}a=Vf(a,d,c,b);try{uf(Wf,a)}finally{Uf(a)}return null}function fg(a,b,c){return null==b||"boolean"===typeof b||""===b?"":c||"number"!==typeof b||0===b||Kb.hasOwnProperty(a)&&Kb[a]?(""+b).trim():b+"px"}function gg(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf("--"),e=fg(c,b[c],d);"float"=== +c&&(c="cssFloat");d?a.setProperty(c,e):a[c]=e}}function Ud(a,b){if(b){if(Ii[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(k(137,a,""));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(k(60));if(!("object"===typeof b.dangerouslySetInnerHTML&&"__html"in b.dangerouslySetInnerHTML))throw Error(k(61));}if(null!=b.style&&"object"!==typeof b.style)throw Error(k(62,""));}}function Vd(a,b){if(-1===a.indexOf("-"))return"string"===typeof b.is;switch(a){case "annotation-xml":case "color-profile":case "font-face":case "font-face-src":case "font-face-uri":case "font-face-format":case "font-face-name":case "missing-glyph":return!1; +default:return!0}}function oa(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=Jd(a);b=rd[b];for(var d=0;d<b.length;d++)Md(b[d],a,c)}function uc(){}function Wd(a){a=a||("undefined"!==typeof document?document:void 0);if("undefined"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function hg(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function ig(a,b){var c=hg(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c, +offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=hg(c)}}function jg(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?jg(a,b.parentNode):"contains"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}function kg(){for(var a=window,b=Wd();b instanceof a.HTMLIFrameElement;){try{var c="string"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Wd(a.document)}return b} +function Xd(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&("input"===b&&("text"===a.type||"search"===a.type||"tel"===a.type||"url"===a.type||"password"===a.type)||"textarea"===b||"true"===a.contentEditable)}function lg(a,b){switch(a){case "button":case "input":case "select":case "textarea":return!!b.autoFocus}return!1}function Yd(a,b){return"textarea"===a||"option"===a||"noscript"===a||"string"===typeof b.children||"number"===typeof b.children||"object"===typeof b.dangerouslySetInnerHTML&& +null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}function kb(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break}return a}function mg(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(c===ng||c===Zd||c===$d){if(0===b)return a;b--}else c===og&&b++}a=a.previousSibling}return null}function Bb(a){var b=a[Aa];if(b)return b;for(var c=a.parentNode;c;){if(b=c[Lb]||c[Aa]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=mg(a);null!== +a;){if(c=a[Aa])return c;a=mg(a)}return b}a=c;c=a.parentNode}return null}function Hb(a){a=a[Aa]||a[Lb];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function Pa(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(k(33));}function ae(a){return a[vc]||null}function pa(a){do a=a.return;while(a&&5!==a.tag);return a?a:null}function pg(a,b){var c=a.stateNode;if(!c)return null;var d=td(c);if(!d)return null;c=d[b];a:switch(b){case "onClick":case "onClickCapture":case "onDoubleClick":case "onDoubleClickCapture":case "onMouseDown":case "onMouseDownCapture":case "onMouseMove":case "onMouseMoveCapture":case "onMouseUp":case "onMouseUpCapture":case "onMouseEnter":(d= +!d.disabled)||(a=a.type,d=!("button"===a||"input"===a||"select"===a||"textarea"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&"function"!==typeof c)throw Error(k(231,b,typeof c));return c}function qg(a,b,c){if(b=pg(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=jb(c._dispatchListeners,b),c._dispatchInstances=jb(c._dispatchInstances,a)}function Ji(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=pa(b);for(b=c.length;0<b--;)qg(c[b], +"captured",a);for(b=0;b<c.length;b++)qg(c[b],"bubbled",a)}}function be(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=pg(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=jb(c._dispatchListeners,b),c._dispatchInstances=jb(c._dispatchInstances,a))}function Ki(a){a&&a.dispatchConfig.registrationName&&be(a._targetInst,null,a)}function lb(a){Kd(a,Ji)}function rg(){if(wc)return wc;var a,b=ce,c=b.length,d,e="value"in Ba?Ba.value:Ba.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g= +c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return wc=e.slice(a,1<d?1-d:void 0)}function xc(){return!0}function yc(){return!1}function R(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):"target"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?xc:yc;this.isPropagationStopped=yc;return this}function Li(a,b,c,d){if(this.eventPool.length){var e= +this.eventPool.pop();this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}function Mi(a){if(!(a instanceof this))throw Error(k(279));a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}function sg(a){a.eventPool=[];a.getPooled=Li;a.release=Mi}function tg(a,b){switch(a){case "keyup":return-1!==Ni.indexOf(b.keyCode);case "keydown":return 229!==b.keyCode;case "keypress":case "mousedown":case "blur":return!0;default:return!1}}function ug(a){a=a.detail;return"object"===typeof a&&"data"in +a?a.data:null}function Oi(a,b){switch(a){case "compositionend":return ug(b);case "keypress":if(32!==b.which)return null;vg=!0;return wg;case "textInput":return a=b.data,a===wg&&vg?null:a;default:return null}}function Pi(a,b){if(mb)return"compositionend"===a||!de&&tg(a,b)?(a=rg(),wc=ce=Ba=null,mb=!1,a):null;switch(a){case "paste":return null;case "keypress":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null; +case "compositionend":return xg&&"ko"!==b.locale?null:b.data;default:return null}}function yg(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return"input"===b?!!Qi[a.type]:"textarea"===b?!0:!1}function zg(a,b,c){a=R.getPooled(Ag.change,a,b,c);a.type="change";sf(c);lb(a);return a}function Ri(a){pc(a)}function zc(a){var b=Pa(a);if(Gf(b))return a}function Si(a,b){if("change"===a)return b}function Bg(){Mb&&(Mb.detachEvent("onpropertychange",Cg),Nb=Mb=null)}function Cg(a){if("value"===a.propertyName&& +zc(Nb))if(a=zg(Nb,a,Ld(a)),Oa)pc(a);else{Oa=!0;try{ee(Ri,a)}finally{Oa=!1,ud()}}}function Ti(a,b,c){"focus"===a?(Bg(),Mb=b,Nb=c,Mb.attachEvent("onpropertychange",Cg)):"blur"===a&&Bg()}function Ui(a,b){if("selectionchange"===a||"keyup"===a||"keydown"===a)return zc(Nb)}function Vi(a,b){if("click"===a)return zc(b)}function Wi(a,b){if("input"===a||"change"===a)return zc(b)}function Xi(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Yi[a])?!!b[a]:!1}function fe(a){return Xi} +function Zi(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}function Ob(a,b){if(Qa(a,b))return!0;if("object"!==typeof a||null===a||"object"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!$i.call(b,c[d])||!Qa(a[c[d]],b[c[d]]))return!1;return!0}function Dg(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if(ge||null==nb||nb!==Wd(c))return null;c=nb;"selectionStart"in c&&Xd(c)?c={start:c.selectionStart, +end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return Pb&&Ob(Pb,c)?null:(Pb=c,a=R.getPooled(Eg.select,he,a,b),a.type="select",a.target=nb,lb(a),a)}function Ac(a){var b=a.keyCode;"charCode"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}function q(a,b){0>ob||(a.current=ie[ob],ie[ob]=null,ob--)}function y(a,b,c){ob++; +ie[ob]=a.current;a.current=b}function pb(a,b){var c=a.type.contextTypes;if(!c)return Ca;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function N(a){a=a.childContextTypes;return null!==a&&void 0!==a}function Fg(a,b,c){if(B.current!==Ca)throw Error(k(168));y(B,b);y(G,c)} +function Gg(a,b,c){var d=a.stateNode;a=b.childContextTypes;if("function"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw Error(k(108,na(b)||"Unknown",e));return M({},c,{},d)}function Bc(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Ca;Ra=B.current;y(B,a);y(G,G.current);return!0}function Hg(a,b,c){var d=a.stateNode;if(!d)throw Error(k(169));c?(a=Gg(a,b,Ra),d.__reactInternalMemoizedMergedChildContext=a,q(G),q(B),y(B,a)):q(G);y(G,c)}function Cc(){switch(aj()){case Dc:return 99; +case Ig:return 98;case Jg:return 97;case Kg:return 96;case Lg:return 95;default:throw Error(k(332));}}function Mg(a){switch(a){case 99:return Dc;case 98:return Ig;case 97:return Jg;case 96:return Kg;case 95:return Lg;default:throw Error(k(332));}}function Da(a,b){a=Mg(a);return bj(a,b)}function Ng(a,b,c){a=Mg(a);return je(a,b,c)}function Og(a){null===qa?(qa=[a],Ec=je(Dc,Pg)):qa.push(a);return Qg}function ha(){if(null!==Ec){var a=Ec;Ec=null;Rg(a)}Pg()}function Pg(){if(!ke&&null!==qa){ke=!0;var a=0; +try{var b=qa;Da(99,function(){for(;a<b.length;a++){var c=b[a];do c=c(!0);while(null!==c)}});qa=null}catch(c){throw null!==qa&&(qa=qa.slice(a+1)),je(Dc,ha),c;}finally{ke=!1}}}function Fc(a,b,c){c/=10;return 1073741821-(((1073741821-a+b/10)/c|0)+1)*c}function aa(a,b){if(a&&a.defaultProps){b=M({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}function le(){Gc=qb=Hc=null}function me(a){var b=Ic.current;q(Ic);a.type._context._currentValue=b}function Sg(a,b){for(;null!==a;){var c= +a.alternate;if(a.childExpirationTime<b)a.childExpirationTime=b,null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);else if(null!==c&&c.childExpirationTime<b)c.childExpirationTime=b;else break;a=a.return}}function rb(a,b){Hc=a;Gc=qb=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(a.expirationTime>=b&&(ia=!0),a.firstContext=null)}function W(a,b){if(Gc!==a&&!1!==b&&0!==b){if("number"!==typeof b||1073741823===b)Gc=a,b=1073741823;b={context:a,observedBits:b,next:null};if(null===qb){if(null=== +Hc)throw Error(k(308));qb=b;Hc.dependencies={expirationTime:0,firstContext:b,responders:null}}else qb=qb.next=b}return a._currentValue}function ne(a){a.updateQueue={baseState:a.memoizedState,baseQueue:null,shared:{pending:null},effects:null}}function oe(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,baseQueue:a.baseQueue,shared:a.shared,effects:a.effects})}function Ea(a,b){a={expirationTime:a,suspenseConfig:b,tag:Tg,payload:null,callback:null,next:null};return a.next= +a}function Fa(a,b){a=a.updateQueue;if(null!==a){a=a.shared;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}}function Ug(a,b){var c=a.alternate;null!==c&&oe(c,a);a=a.updateQueue;c=a.baseQueue;null===c?(a.baseQueue=b.next=b,b.next=b):(b.next=c.next,c.next=b)}function Qb(a,b,c,d){var e=a.updateQueue;Ga=!1;var f=e.baseQueue,g=e.shared.pending;if(null!==g){if(null!==f){var h=f.next;f.next=g.next;g.next=h}f=g;e.shared.pending=null;h=a.alternate;null!==h&&(h=h.updateQueue,null!==h&& +(h.baseQueue=g))}if(null!==f){h=f.next;var m=e.baseState,n=0,k=null,ba=null,l=null;if(null!==h){var p=h;do{g=p.expirationTime;if(g<d){var t={expirationTime:p.expirationTime,suspenseConfig:p.suspenseConfig,tag:p.tag,payload:p.payload,callback:p.callback,next:null};null===l?(ba=l=t,k=m):l=l.next=t;g>n&&(n=g)}else{null!==l&&(l=l.next={expirationTime:1073741823,suspenseConfig:p.suspenseConfig,tag:p.tag,payload:p.payload,callback:p.callback,next:null});Vg(g,p.suspenseConfig);a:{var q=a,r=p;g=b;t=c;switch(r.tag){case 1:q= +r.payload;if("function"===typeof q){m=q.call(t,m,g);break a}m=q;break a;case 3:q.effectTag=q.effectTag&-4097|64;case Tg:q=r.payload;g="function"===typeof q?q.call(t,m,g):q;if(null===g||void 0===g)break a;m=M({},m,g);break a;case Jc:Ga=!0}}null!==p.callback&&(a.effectTag|=32,g=e.effects,null===g?e.effects=[p]:g.push(p))}p=p.next;if(null===p||p===h)if(g=e.shared.pending,null===g)break;else p=f.next=g.next,g.next=h,e.baseQueue=f=g,e.shared.pending=null}while(1)}null===l?k=m:l.next=ba;e.baseState=k;e.baseQueue= +l;Kc(n);a.expirationTime=n;a.memoizedState=m}}function Wg(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=e;e=c;if("function"!==typeof d)throw Error(k(191,d));d.call(e)}}}function Lc(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:M({},b,c);a.memoizedState=c;0===a.expirationTime&&(a.updateQueue.baseState=c)}function Xg(a,b,c,d,e,f,g){a=a.stateNode;return"function"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d, +f,g):b.prototype&&b.prototype.isPureReactComponent?!Ob(c,d)||!Ob(e,f):!0}function Yg(a,b,c){var d=!1,e=Ca;var f=b.contextType;"object"===typeof f&&null!==f?f=W(f):(e=N(b)?Ra:B.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?pb(a,e):Ca);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Mc;a.stateNode=b;b._reactInternalFiber=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}function Zg(a, +b,c,d){a=b.state;"function"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);"function"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Mc.enqueueReplaceState(b,b.state,null)}function pe(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=$g;ne(a);var f=b.contextType;"object"===typeof f&&null!==f?e.context=W(f):(f=N(b)?Ra:B.current,e.context=pb(a,f));Qb(a,c,e,d);e.state=a.memoizedState;f=b.getDerivedStateFromProps; +"function"===typeof f&&(Lc(a,b,f,c),e.state=a.memoizedState);"function"===typeof b.getDerivedStateFromProps||"function"===typeof e.getSnapshotBeforeUpdate||"function"!==typeof e.UNSAFE_componentWillMount&&"function"!==typeof e.componentWillMount||(b=e.state,"function"===typeof e.componentWillMount&&e.componentWillMount(),"function"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Mc.enqueueReplaceState(e,e.state,null),Qb(a,c,e,d),e.state=a.memoizedState);"function"=== +typeof e.componentDidMount&&(a.effectTag|=4)}function Rb(a,b,c){a=c.ref;if(null!==a&&"function"!==typeof a&&"object"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(k(309));var d=c.stateNode}if(!d)throw Error(k(147,a));var e=""+a;if(null!==b&&null!==b.ref&&"function"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===$g&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}if("string"!==typeof a)throw Error(k(284));if(!c._owner)throw Error(k(290, +a));}return a}function Nc(a,b){if("textarea"!==a.type)throw Error(k(31,"[object Object]"===Object.prototype.toString.call(b)?"object with keys {"+Object.keys(b).join(", ")+"}":b,""));}function ah(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index, +b),b=b.sibling;return a}function e(a,b){a=Sa(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=2,c):d;b.effectTag=2;return c}function g(b){a&&null===b.alternate&&(b.effectTag=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=qe(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function m(a,b,c,d){if(null!==b&&b.elementType===c.type)return d=e(b,c.props),d.ref=Rb(a,b,c),d.return=a,d;d=Oc(c.type, +c.key,c.props,null,a.mode,d);d.ref=Rb(a,b,c);d.return=a;return d}function n(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=re(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function l(a,b,c,d,f){if(null===b||7!==b.tag)return b=Ha(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function ba(a,b,c){if("string"===typeof b||"number"===typeof b)return b=qe(""+b,a.mode,c),b.return=a,b;if("object"=== +typeof b&&null!==b){switch(b.$$typeof){case Pc:return c=Oc(b.type,b.key,b.props,null,a.mode,c),c.ref=Rb(a,null,b),c.return=a,c;case gb:return b=re(b,a.mode,c),b.return=a,b}if(Qc(b)||zb(b))return b=Ha(b,a.mode,c,null),b.return=a,b;Nc(a,b)}return null}function p(a,b,c,d){var e=null!==b?b.key:null;if("string"===typeof c||"number"===typeof c)return null!==e?null:h(a,b,""+c,d);if("object"===typeof c&&null!==c){switch(c.$$typeof){case Pc:return c.key===e?c.type===Ma?l(a,b,c.props.children,d,e):m(a,b,c, +d):null;case gb:return c.key===e?n(a,b,c,d):null}if(Qc(c)||zb(c))return null!==e?null:l(a,b,c,d,null);Nc(a,c)}return null}function t(a,b,c,d,e){if("string"===typeof d||"number"===typeof d)return a=a.get(c)||null,h(b,a,""+d,e);if("object"===typeof d&&null!==d){switch(d.$$typeof){case Pc:return a=a.get(null===d.key?c:d.key)||null,d.type===Ma?l(b,a,d.props.children,e,d.key):m(b,a,d,e);case gb:return a=a.get(null===d.key?c:d.key)||null,n(b,a,d,e)}if(Qc(d)||zb(d))return a=a.get(c)||null,l(b,a,d,e,null); +Nc(b,d)}return null}function q(e,g,h,m){for(var n=null,k=null,l=g,r=g=0,C=null;null!==l&&r<h.length;r++){l.index>r?(C=l,l=null):C=l.sibling;var O=p(e,l,h[r],m);if(null===O){null===l&&(l=C);break}a&&l&&null===O.alternate&&b(e,l);g=f(O,g,r);null===k?n=O:k.sibling=O;k=O;l=C}if(r===h.length)return c(e,l),n;if(null===l){for(;r<h.length;r++)l=ba(e,h[r],m),null!==l&&(g=f(l,g,r),null===k?n=l:k.sibling=l,k=l);return n}for(l=d(e,l);r<h.length;r++)C=t(l,e,r,h[r],m),null!==C&&(a&&null!==C.alternate&&l.delete(null=== +C.key?r:C.key),g=f(C,g,r),null===k?n=C:k.sibling=C,k=C);a&&l.forEach(function(a){return b(e,a)});return n}function w(e,g,h,n){var m=zb(h);if("function"!==typeof m)throw Error(k(150));h=m.call(h);if(null==h)throw Error(k(151));for(var l=m=null,r=g,C=g=0,O=null,v=h.next();null!==r&&!v.done;C++,v=h.next()){r.index>C?(O=r,r=null):O=r.sibling;var q=p(e,r,v.value,n);if(null===q){null===r&&(r=O);break}a&&r&&null===q.alternate&&b(e,r);g=f(q,g,C);null===l?m=q:l.sibling=q;l=q;r=O}if(v.done)return c(e,r),m; +if(null===r){for(;!v.done;C++,v=h.next())v=ba(e,v.value,n),null!==v&&(g=f(v,g,C),null===l?m=v:l.sibling=v,l=v);return m}for(r=d(e,r);!v.done;C++,v=h.next())v=t(r,e,C,v.value,n),null!==v&&(a&&null!==v.alternate&&r.delete(null===v.key?C:v.key),g=f(v,g,C),null===l?m=v:l.sibling=v,l=v);a&&r.forEach(function(a){return b(e,a)});return m}return function(a,d,f,h){var m="object"===typeof f&&null!==f&&f.type===Ma&&null===f.key;m&&(f=f.props.children);var n="object"===typeof f&&null!==f;if(n)switch(f.$$typeof){case Pc:a:{n= +f.key;for(m=d;null!==m;){if(m.key===n){switch(m.tag){case 7:if(f.type===Ma){c(a,m.sibling);d=e(m,f.props.children);d.return=a;a=d;break a}break;default:if(m.elementType===f.type){c(a,m.sibling);d=e(m,f.props);d.ref=Rb(a,m,f);d.return=a;a=d;break a}}c(a,m);break}else b(a,m);m=m.sibling}f.type===Ma?(d=Ha(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Oc(f.type,f.key,f.props,null,a.mode,h),h.ref=Rb(a,d,f),h.return=a,a=h)}return g(a);case gb:a:{for(m=f.key;null!==d;){if(d.key===m)if(4===d.tag&&d.stateNode.containerInfo=== +f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=re(f,a.mode,h);d.return=a;a=d}return g(a)}if("string"===typeof f||"number"===typeof f)return f=""+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):(c(a,d),d=qe(f,a.mode,h),d.return=a,a=d),g(a);if(Qc(f))return q(a,d,f,h);if(zb(f))return w(a,d,f,h);n&&Nc(a,f);if("undefined"===typeof f&&!m)switch(a.tag){case 1:case 0:throw a= +a.type,Error(k(152,a.displayName||a.name||"Component"));}return c(a,d)}}function Ta(a){if(a===Sb)throw Error(k(174));return a}function se(a,b){y(Tb,b);y(Ub,a);y(ja,Sb);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:Hd(null,"");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=Hd(b,a)}q(ja);y(ja,b)}function tb(a){q(ja);q(Ub);q(Tb)}function bh(a){Ta(Tb.current);var b=Ta(ja.current);var c=Hd(b,a.type);b!==c&&(y(Ub,a),y(ja,c))}function te(a){Ub.current=== +a&&(q(ja),q(Ub))}function Rc(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||c.data===$d||c.data===Zd))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.effectTag&64))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}function ue(a,b){return{responder:a,props:b}} +function S(){throw Error(k(321));}function ve(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!Qa(a[c],b[c]))return!1;return!0}function we(a,b,c,d,e,f){Ia=f;z=b;b.memoizedState=null;b.updateQueue=null;b.expirationTime=0;Sc.current=null===a||null===a.memoizedState?dj:ej;a=c(d,e);if(b.expirationTime===Ia){f=0;do{b.expirationTime=0;if(!(25>f))throw Error(k(301));f+=1;J=K=null;b.updateQueue=null;Sc.current=fj;a=c(d,e)}while(b.expirationTime===Ia)}Sc.current=Tc;b=null!==K&&null!==K.next; +Ia=0;J=K=z=null;Uc=!1;if(b)throw Error(k(300));return a}function ub(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===J?z.memoizedState=J=a:J=J.next=a;return J}function vb(){if(null===K){var a=z.alternate;a=null!==a?a.memoizedState:null}else a=K.next;var b=null===J?z.memoizedState:J.next;if(null!==b)J=b,K=a;else{if(null===a)throw Error(k(310));K=a;a={memoizedState:K.memoizedState,baseState:K.baseState,baseQueue:K.baseQueue,queue:K.queue,next:null};null===J?z.memoizedState= +J=a:J=J.next=a}return J}function Ua(a,b){return"function"===typeof b?b(a):b}function Vc(a,b,c){b=vb();c=b.queue;if(null===c)throw Error(k(311));c.lastRenderedReducer=a;var d=K,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){e=e.next;d=d.baseState;var h=g=f=null,m=e;do{var n=m.expirationTime;if(n<Ia){var l={expirationTime:m.expirationTime,suspenseConfig:m.suspenseConfig,action:m.action,eagerReducer:m.eagerReducer,eagerState:m.eagerState, +next:null};null===h?(g=h=l,f=d):h=h.next=l;n>z.expirationTime&&(z.expirationTime=n,Kc(n))}else null!==h&&(h=h.next={expirationTime:1073741823,suspenseConfig:m.suspenseConfig,action:m.action,eagerReducer:m.eagerReducer,eagerState:m.eagerState,next:null}),Vg(n,m.suspenseConfig),d=m.eagerReducer===a?m.eagerState:a(d,m.action);m=m.next}while(null!==m&&m!==e);null===h?f=d:h.next=g;Qa(d,b.memoizedState)||(ia=!0);b.memoizedState=d;b.baseState=f;b.baseQueue=h;c.lastRenderedState=d}return[b.memoizedState, +c.dispatch]}function Wc(a,b,c){b=vb();c=b.queue;if(null===c)throw Error(k(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);Qa(f,b.memoizedState)||(ia=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}function xe(a){var b=ub();"function"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={pending:null,dispatch:null,lastRenderedReducer:Ua, +lastRenderedState:a};a=a.dispatch=ch.bind(null,z,a);return[b.memoizedState,a]}function ye(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};b=z.updateQueue;null===b?(b={lastEffect:null},z.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}function dh(a){return vb().memoizedState}function ze(a,b,c,d){var e=ub();z.effectTag|=a;e.memoizedState=ye(1|b,c,void 0,void 0===d?null:d)}function Ae(a,b,c,d){var e=vb(); +d=void 0===d?null:d;var f=void 0;if(null!==K){var g=K.memoizedState;f=g.destroy;if(null!==d&&ve(d,g.deps)){ye(b,c,f,d);return}}z.effectTag|=a;e.memoizedState=ye(1|b,c,f,d)}function eh(a,b){return ze(516,4,a,b)}function Xc(a,b){return Ae(516,4,a,b)}function fh(a,b){return Ae(4,2,a,b)}function gh(a,b){if("function"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function hh(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null; +return Ae(4,2,gh.bind(null,b,a),c)}function Be(a,b){}function ih(a,b){ub().memoizedState=[a,void 0===b?null:b];return a}function Yc(a,b){var c=vb();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&ve(b,d[1]))return d[0];c.memoizedState=[a,b];return a}function jh(a,b){var c=vb();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&ve(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}function Ce(a,b,c){var d=Cc();Da(98>d?98:d,function(){a(!0)});Da(97<d?97:d,function(){var d= +X.suspense;X.suspense=void 0===b?null:b;try{a(!1),c()}finally{X.suspense=d}})}function ch(a,b,c){var d=ka(),e=Vb.suspense;d=Va(d,a,e);e={expirationTime:d,suspenseConfig:e,action:c,eagerReducer:null,eagerState:null,next:null};var f=b.pending;null===f?e.next=e:(e.next=f.next,f.next=e);b.pending=e;f=a.alternate;if(a===z||null!==f&&f===z)Uc=!0,e.expirationTime=Ia,z.expirationTime=Ia;else{if(0===a.expirationTime&&(null===f||0===f.expirationTime)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState, +h=f(g,c);e.eagerReducer=f;e.eagerState=h;if(Qa(h,g))return}catch(m){}finally{}Ja(a,d)}}function kh(a,b){var c=la(5,null,null,0);c.elementType="DELETED";c.type="DELETED";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function lh(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=""===a.pendingProps||3!==b.nodeType? +null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}function De(a){if(Wa){var b=Ka;if(b){var c=b;if(!lh(a,b)){b=kb(c.nextSibling);if(!b||!lh(a,b)){a.effectTag=a.effectTag&-1025|2;Wa=!1;ra=a;return}kh(ra,c)}ra=a;Ka=kb(b.firstChild)}else a.effectTag=a.effectTag&-1025|2,Wa=!1,ra=a}}function mh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;ra=a}function Zc(a){if(a!==ra)return!1;if(!Wa)return mh(a),Wa=!0,!1;var b=a.type;if(5!==a.tag||"head"!==b&&"body"!== +b&&!Yd(b,a.memoizedProps))for(b=Ka;b;)kh(a,b),b=kb(b.nextSibling);mh(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(k(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(c===og){if(0===b){Ka=kb(a.nextSibling);break a}b--}else c!==ng&&c!==Zd&&c!==$d||b++}a=a.nextSibling}Ka=null}}else Ka=ra?kb(a.stateNode.nextSibling):null;return!0}function Ee(){Ka=ra=null;Wa=!1}function T(a,b,c,d){b.child=null===a?Fe(b,null,c,d):wb(b,a.child,c,d)}function nh(a, +b,c,d,e){c=c.render;var f=b.ref;rb(b,e);d=we(a,b,c,d,f,e);if(null!==a&&!ia)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),sa(a,b,e);b.effectTag|=1;T(a,b,d,e);return b.child}function oh(a,b,c,d,e,f){if(null===a){var g=c.type;if("function"===typeof g&&!Ge(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,ph(a,b,g,d,e,f);a=Oc(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e< +f&&(e=g.memoizedProps,c=c.compare,c=null!==c?c:Ob,c(e,d)&&a.ref===b.ref))return sa(a,b,f);b.effectTag|=1;a=Sa(g,d);a.ref=b.ref;a.return=b;return b.child=a}function ph(a,b,c,d,e,f){return null!==a&&Ob(a.memoizedProps,d)&&a.ref===b.ref&&(ia=!1,e<f)?(b.expirationTime=a.expirationTime,sa(a,b,f)):He(a,b,c,d,f)}function qh(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function He(a,b,c,d,e){var f=N(c)?Ra:B.current;f=pb(b,f);rb(b,e);c=we(a,b,c,d,f,e);if(null!==a&&!ia)return b.updateQueue= +a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),sa(a,b,e);b.effectTag|=1;T(a,b,c,e);return b.child}function rh(a,b,c,d,e){if(N(c)){var f=!0;Bc(b)}else f=!1;rb(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),Yg(b,c,d),pe(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var m=g.context,n=c.contextType;"object"===typeof n&&null!==n?n=W(n):(n=N(c)?Ra:B.current,n=pb(b,n));var l=c.getDerivedStateFromProps,k="function"=== +typeof l||"function"===typeof g.getSnapshotBeforeUpdate;k||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||(h!==d||m!==n)&&Zg(b,g,d,n);Ga=!1;var p=b.memoizedState;g.state=p;Qb(b,d,g,e);m=b.memoizedState;h!==d||p!==m||G.current||Ga?("function"===typeof l&&(Lc(b,c,l,d),m=b.memoizedState),(h=Ga||Xg(b,c,h,d,p,m,n))?(k||"function"!==typeof g.UNSAFE_componentWillMount&&"function"!==typeof g.componentWillMount||("function"===typeof g.componentWillMount&& +g.componentWillMount(),"function"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),"function"===typeof g.componentDidMount&&(b.effectTag|=4)):("function"===typeof g.componentDidMount&&(b.effectTag|=4),b.memoizedProps=d,b.memoizedState=m),g.props=d,g.state=m,g.context=n,d=h):("function"===typeof g.componentDidMount&&(b.effectTag|=4),d=!1)}else g=b.stateNode,oe(a,b),h=b.memoizedProps,g.props=b.type===b.elementType?h:aa(b.type,h),m=g.context,n=c.contextType,"object"===typeof n&&null!== +n?n=W(n):(n=N(c)?Ra:B.current,n=pb(b,n)),l=c.getDerivedStateFromProps,(k="function"===typeof l||"function"===typeof g.getSnapshotBeforeUpdate)||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||(h!==d||m!==n)&&Zg(b,g,d,n),Ga=!1,m=b.memoizedState,g.state=m,Qb(b,d,g,e),p=b.memoizedState,h!==d||m!==p||G.current||Ga?("function"===typeof l&&(Lc(b,c,l,d),p=b.memoizedState),(l=Ga||Xg(b,c,h,d,m,p,n))?(k||"function"!==typeof g.UNSAFE_componentWillUpdate&& +"function"!==typeof g.componentWillUpdate||("function"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,p,n),"function"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,p,n)),"function"===typeof g.componentDidUpdate&&(b.effectTag|=4),"function"===typeof g.getSnapshotBeforeUpdate&&(b.effectTag|=256)):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&m=== +a.memoizedState||(b.effectTag|=256),b.memoizedProps=d,b.memoizedState=p),g.props=d,g.state=p,g.context=n,d=l):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=256),d=!1);return Ie(a,b,c,d,f,e)}function Ie(a,b,c,d,e,f){qh(a,b);var g=0!==(b.effectTag&64);if(!d&&!g)return e&&Hg(b,c,!1),sa(a,b,f);d=b.stateNode;gj.current=b;var h=g&&"function"!==typeof c.getDerivedStateFromError? +null:d.render();b.effectTag|=1;null!==a&&g?(b.child=wb(b,a.child,null,f),b.child=wb(b,null,h,f)):T(a,b,h,f);b.memoizedState=d.state;e&&Hg(b,c,!0);return b.child}function sh(a){var b=a.stateNode;b.pendingContext?Fg(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Fg(a,b.context,!1);se(a,b.containerInfo)}function th(a,b,c){var d=b.mode,e=b.pendingProps,f=D.current,g=!1,h;(h=0!==(b.effectTag&64))||(h=0!==(f&2)&&(null===a||null!==a.memoizedState));h?(g=!0,b.effectTag&=-65):null!==a&&null=== +a.memoizedState||void 0===e.fallback||!0===e.unstable_avoidThisFallback||(f|=1);y(D,f&1);if(null===a){void 0!==e.fallback&&De(b);if(g){g=e.fallback;e=Ha(null,d,0,null);e.return=b;if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Ha(g,d,c,null);c.return=b;e.sibling=c;b.memoizedState=Je;b.child=e;return c}d=e.children;b.memoizedState=null;return b.child=Fe(b,null,d,c)}if(null!==a.memoizedState){a=a.child;d=a.sibling;if(g){e=e.fallback; +c=Sa(a,a.pendingProps);c.return=b;if(0===(b.mode&2)&&(g=null!==b.memoizedState?b.child.child:b.child,g!==a.child))for(c.child=g;null!==g;)g.return=c,g=g.sibling;d=Sa(d,e);d.return=b;c.sibling=d;c.childExpirationTime=0;b.memoizedState=Je;b.child=c;return d}c=wb(b,a.child,e.children,c);b.memoizedState=null;return b.child=c}a=a.child;if(g){g=e.fallback;e=Ha(null,d,0,null);e.return=b;e.child=a;null!==a&&(a.return=e);if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!== +a;)a.return=e,a=a.sibling;c=Ha(g,d,c,null);c.return=b;e.sibling=c;c.effectTag|=2;e.childExpirationTime=0;b.memoizedState=Je;b.child=e;return c}b.memoizedState=null;return b.child=wb(b,a,e.children,c)}function uh(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);Sg(a.return,b)}function Ke(a,b,c,d,e,f){var g=a.memoizedState;null===g?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailExpiration:0,tailMode:e, +lastEffect:f}:(g.isBackwards=b,g.rendering=null,g.renderingStartTime=0,g.last=d,g.tail=c,g.tailExpiration=0,g.tailMode=e,g.lastEffect=f)}function vh(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;T(a,b,d.children,c);d=D.current;if(0!==(d&2))d=d&1|2,b.effectTag|=64;else{if(null!==a&&0!==(a.effectTag&64))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&uh(a,c);else if(19===a.tag)uh(a,c);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null=== +a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}y(D,d);if(0===(b.mode&2))b.memoizedState=null;else switch(e){case "forwards":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===Rc(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);Ke(b,!1,e,c,f,b.lastEffect);break;case "backwards":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===Rc(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}Ke(b, +!0,c,null,f,b.lastEffect);break;case "together":Ke(b,!1,null,null,void 0,b.lastEffect);break;default:b.memoizedState=null}return b.child}function sa(a,b,c){null!==a&&(b.dependencies=a.dependencies);var d=b.expirationTime;0!==d&&Kc(d);if(b.childExpirationTime<c)return null;if(null!==a&&b.child!==a.child)throw Error(k(153));if(null!==b.child){a=b.child;c=Sa(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Sa(a,a.pendingProps),c.return=b;c.sibling=null}return b.child} +function $c(a,b){switch(a.tailMode){case "hidden":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case "collapsed":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}function hj(a,b,c){var d=b.pendingProps;switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:return N(b.type)&&(q(G),q(B)), +null;case 3:return tb(),q(G),q(B),c=b.stateNode,c.pendingContext&&(c.context=c.pendingContext,c.pendingContext=null),null!==a&&null!==a.child||!Zc(b)||(b.effectTag|=4),wh(b),null;case 5:te(b);c=Ta(Tb.current);var e=b.type;if(null!==a&&null!=b.stateNode)ij(a,b,e,d,c),a.ref!==b.ref&&(b.effectTag|=128);else{if(!d){if(null===b.stateNode)throw Error(k(166));return null}a=Ta(ja.current);if(Zc(b)){d=b.stateNode;e=b.type;var f=b.memoizedProps;d[Aa]=b;d[vc]=f;switch(e){case "iframe":case "object":case "embed":w("load", +d);break;case "video":case "audio":for(a=0;a<Db.length;a++)w(Db[a],d);break;case "source":w("error",d);break;case "img":case "image":case "link":w("error",d);w("load",d);break;case "form":w("reset",d);w("submit",d);break;case "details":w("toggle",d);break;case "input":Hf(d,f);w("invalid",d);oa(c,"onChange");break;case "select":d._wrapperState={wasMultiple:!!f.multiple};w("invalid",d);oa(c,"onChange");break;case "textarea":Kf(d,f),w("invalid",d),oa(c,"onChange")}Ud(e,f);a=null;for(var g in f)if(f.hasOwnProperty(g)){var h= +f[g];"children"===g?"string"===typeof h?d.textContent!==h&&(a=["children",h]):"number"===typeof h&&d.textContent!==""+h&&(a=["children",""+h]):db.hasOwnProperty(g)&&null!=h&&oa(c,g)}switch(e){case "input":mc(d);Jf(d,f,!0);break;case "textarea":mc(d);Mf(d);break;case "select":case "option":break;default:"function"===typeof f.onClick&&(d.onclick=uc)}c=a;b.updateQueue=c;null!==c&&(b.effectTag|=4)}else{g=9===c.nodeType?c:c.ownerDocument;"http://www.w3.org/1999/xhtml"===a&&(a=Nf(e));"http://www.w3.org/1999/xhtml"=== +a?"script"===e?(a=g.createElement("div"),a.innerHTML="<script>\x3c/script>",a=a.removeChild(a.firstChild)):"string"===typeof d.is?a=g.createElement(e,{is:d.is}):(a=g.createElement(e),"select"===e&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,e);a[Aa]=b;a[vc]=d;jj(a,b,!1,!1);b.stateNode=a;g=Vd(e,d);switch(e){case "iframe":case "object":case "embed":w("load",a);h=d;break;case "video":case "audio":for(h=0;h<Db.length;h++)w(Db[h],a);h=d;break;case "source":w("error",a); +h=d;break;case "img":case "image":case "link":w("error",a);w("load",a);h=d;break;case "form":w("reset",a);w("submit",a);h=d;break;case "details":w("toggle",a);h=d;break;case "input":Hf(a,d);h=Cd(a,d);w("invalid",a);oa(c,"onChange");break;case "option":h=Fd(a,d);break;case "select":a._wrapperState={wasMultiple:!!d.multiple};h=M({},d,{value:void 0});w("invalid",a);oa(c,"onChange");break;case "textarea":Kf(a,d);h=Gd(a,d);w("invalid",a);oa(c,"onChange");break;default:h=d}Ud(e,h);var m=h;for(f in m)if(m.hasOwnProperty(f)){var n= +m[f];"style"===f?gg(a,n):"dangerouslySetInnerHTML"===f?(n=n?n.__html:void 0,null!=n&&xh(a,n)):"children"===f?"string"===typeof n?("textarea"!==e||""!==n)&&Wb(a,n):"number"===typeof n&&Wb(a,""+n):"suppressContentEditableWarning"!==f&&"suppressHydrationWarning"!==f&&"autoFocus"!==f&&(db.hasOwnProperty(f)?null!=n&&oa(c,f):null!=n&&xd(a,f,n,g))}switch(e){case "input":mc(a);Jf(a,d,!1);break;case "textarea":mc(a);Mf(a);break;case "option":null!=d.value&&a.setAttribute("value",""+va(d.value));break;case "select":a.multiple= +!!d.multiple;c=d.value;null!=c?hb(a,!!d.multiple,c,!1):null!=d.defaultValue&&hb(a,!!d.multiple,d.defaultValue,!0);break;default:"function"===typeof h.onClick&&(a.onclick=uc)}lg(e,d)&&(b.effectTag|=4)}null!==b.ref&&(b.effectTag|=128)}return null;case 6:if(a&&null!=b.stateNode)kj(a,b,a.memoizedProps,d);else{if("string"!==typeof d&&null===b.stateNode)throw Error(k(166));c=Ta(Tb.current);Ta(ja.current);Zc(b)?(c=b.stateNode,d=b.memoizedProps,c[Aa]=b,c.nodeValue!==d&&(b.effectTag|=4)):(c=(9===c.nodeType? +c:c.ownerDocument).createTextNode(d),c[Aa]=b,b.stateNode=c)}return null;case 13:q(D);d=b.memoizedState;if(0!==(b.effectTag&64))return b.expirationTime=c,b;c=null!==d;d=!1;null===a?void 0!==b.memoizedProps.fallback&&Zc(b):(e=a.memoizedState,d=null!==e,c||null===e||(e=a.child.sibling,null!==e&&(f=b.firstEffect,null!==f?(b.firstEffect=e,e.nextEffect=f):(b.firstEffect=b.lastEffect=e,e.nextEffect=null),e.effectTag=8)));if(c&&!d&&0!==(b.mode&2))if(null===a&&!0!==b.memoizedProps.unstable_avoidThisFallback|| +0!==(D.current&1))F===Xa&&(F=ad);else{if(F===Xa||F===ad)F=bd;0!==Xb&&null!==U&&(Ya(U,P),yh(U,Xb))}if(c||d)b.effectTag|=4;return null;case 4:return tb(),wh(b),null;case 10:return me(b),null;case 17:return N(b.type)&&(q(G),q(B)),null;case 19:q(D);d=b.memoizedState;if(null===d)return null;e=0!==(b.effectTag&64);f=d.rendering;if(null===f)if(e)$c(d,!1);else{if(F!==Xa||null!==a&&0!==(a.effectTag&64))for(f=b.child;null!==f;){a=Rc(f);if(null!==a){b.effectTag|=64;$c(d,!1);e=a.updateQueue;null!==e&&(b.updateQueue= +e,b.effectTag|=4);null===d.lastEffect&&(b.firstEffect=null);b.lastEffect=d.lastEffect;for(d=b.child;null!==d;)e=d,f=c,e.effectTag&=2,e.nextEffect=null,e.firstEffect=null,e.lastEffect=null,a=e.alternate,null===a?(e.childExpirationTime=0,e.expirationTime=f,e.child=null,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null):(e.childExpirationTime=a.childExpirationTime,e.expirationTime=a.expirationTime,e.child=a.child,e.memoizedProps=a.memoizedProps,e.memoizedState=a.memoizedState, +e.updateQueue=a.updateQueue,f=a.dependencies,e.dependencies=null===f?null:{expirationTime:f.expirationTime,firstContext:f.firstContext,responders:f.responders}),d=d.sibling;y(D,D.current&1|2);return b.child}f=f.sibling}}else{if(!e)if(a=Rc(f),null!==a){if(b.effectTag|=64,e=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.effectTag|=4),$c(d,!0),null===d.tail&&"hidden"===d.tailMode&&!f.alternate)return b=b.lastEffect=d.lastEffect,null!==b&&(b.nextEffect=null),null}else 2*Y()-d.renderingStartTime>d.tailExpiration&& +1<c&&(b.effectTag|=64,e=!0,$c(d,!1),b.expirationTime=b.childExpirationTime=c-1);d.isBackwards?(f.sibling=b.child,b.child=f):(c=d.last,null!==c?c.sibling=f:b.child=f,d.last=f)}return null!==d.tail?(0===d.tailExpiration&&(d.tailExpiration=Y()+500),c=d.tail,d.rendering=c,d.tail=c.sibling,d.lastEffect=b.lastEffect,d.renderingStartTime=Y(),c.sibling=null,b=D.current,y(D,e?b&1|2:b&1),c):null}throw Error(k(156,b.tag));}function lj(a,b){switch(a.tag){case 1:return N(a.type)&&(q(G),q(B)),b=a.effectTag,b&4096? +(a.effectTag=b&-4097|64,a):null;case 3:tb();q(G);q(B);b=a.effectTag;if(0!==(b&64))throw Error(k(285));a.effectTag=b&-4097|64;return a;case 5:return te(a),null;case 13:return q(D),b=a.effectTag,b&4096?(a.effectTag=b&-4097|64,a):null;case 19:return q(D),null;case 4:return tb(),null;case 10:return me(a),null;default:return null}}function Le(a,b){return{value:a,source:b,stack:Bd(b)}}function Me(a,b){var c=b.source,d=b.stack;null===d&&null!==c&&(d=Bd(c));null!==c&&na(c.type);b=b.value;null!==a&&1===a.tag&& +na(a.type);try{console.error(b)}catch(e){setTimeout(function(){throw e;})}}function mj(a,b){try{b.props=a.memoizedProps,b.state=a.memoizedState,b.componentWillUnmount()}catch(c){Za(a,c)}}function zh(a){var b=a.ref;if(null!==b)if("function"===typeof b)try{b(null)}catch(c){Za(a,c)}else b.current=null}function nj(a,b){switch(b.tag){case 0:case 11:case 15:case 22:return;case 1:if(b.effectTag&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType=== +b.type?c:aa(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}return;case 3:case 5:case 6:case 4:case 17:return}throw Error(k(163));}function Ah(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.destroy;c.destroy=void 0;void 0!==d&&d()}c=c.next}while(c!==b)}}function Bh(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function oj(a,b,c,d){switch(c.tag){case 0:case 11:case 15:case 22:Bh(3, +c);return;case 1:a=c.stateNode;c.effectTag&4&&(null===b?a.componentDidMount():(d=c.elementType===c.type?b.memoizedProps:aa(c.type,b.memoizedProps),a.componentDidUpdate(d,b.memoizedState,a.__reactInternalSnapshotBeforeUpdate)));b=c.updateQueue;null!==b&&Wg(c,b,a);return;case 3:b=c.updateQueue;if(null!==b){a=null;if(null!==c.child)switch(c.child.tag){case 5:a=c.child.stateNode;break;case 1:a=c.child.stateNode}Wg(c,b,a)}return;case 5:a=c.stateNode;null===b&&c.effectTag&4&&lg(c.type,c.memoizedProps)&& +a.focus();return;case 6:return;case 4:return;case 12:return;case 13:null===c.memoizedState&&(c=c.alternate,null!==c&&(c=c.memoizedState,null!==c&&(c=c.dehydrated,null!==c&&bg(c))));return;case 19:case 17:case 20:case 21:return}throw Error(k(163));}function Ch(a,b,c){"function"===typeof Ne&&Ne(b);switch(b.tag){case 0:case 11:case 14:case 15:case 22:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var d=a.next;Da(97<c?97:c,function(){var a=d;do{var c=a.destroy;if(void 0!==c){var g=b;try{c()}catch(h){Za(g, +h)}}a=a.next}while(a!==d)})}break;case 1:zh(b);c=b.stateNode;"function"===typeof c.componentWillUnmount&&mj(b,c);break;case 5:zh(b);break;case 4:Dh(a,b,c)}}function Eh(a){var b=a.alternate;a.return=null;a.child=null;a.memoizedState=null;a.updateQueue=null;a.dependencies=null;a.alternate=null;a.firstEffect=null;a.lastEffect=null;a.pendingProps=null;a.memoizedProps=null;a.stateNode=null;null!==b&&Eh(b)}function Fh(a){return 5===a.tag||3===a.tag||4===a.tag}function Gh(a){a:{for(var b=a.return;null!== +b;){if(Fh(b)){var c=b;break a}b=b.return}throw Error(k(160));}b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw Error(k(161));}c.effectTag&16&&(Wb(b,""),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||Fh(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.effectTag&2)continue b;if(null===c.child||4===c.tag)continue b; +else c.child.return=c,c=c.child}if(!(c.effectTag&2)){c=c.stateNode;break a}}d?Oe(a,c,b):Pe(a,c,b)}function Oe(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=uc));else if(4!==d&&(a=a.child,null!==a))for(Oe(a,b,c),a=a.sibling;null!==a;)Oe(a,b,c),a=a.sibling} +function Pe(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Pe(a,b,c),a=a.sibling;null!==a;)Pe(a,b,c),a=a.sibling}function Dh(a,b,c){for(var d=b,e=!1,f,g;;){if(!e){e=d.return;a:for(;;){if(null===e)throw Error(k(160));f=e.stateNode;switch(e.tag){case 5:g=!1;break a;case 3:f=f.containerInfo;g=!0;break a;case 4:f=f.containerInfo;g=!0;break a}e=e.return}e=!0}if(5===d.tag||6===d.tag){a:for(var h= +a,m=d,n=c,l=m;;)if(Ch(h,l,n),null!==l.child&&4!==l.tag)l.child.return=l,l=l.child;else{if(l===m)break a;for(;null===l.sibling;){if(null===l.return||l.return===m)break a;l=l.return}l.sibling.return=l.return;l=l.sibling}g?(h=f,m=d.stateNode,8===h.nodeType?h.parentNode.removeChild(m):h.removeChild(m)):f.removeChild(d.stateNode)}else if(4===d.tag){if(null!==d.child){f=d.stateNode.containerInfo;g=!0;d.child.return=d;d=d.child;continue}}else if(Ch(a,d,c),null!==d.child){d.child.return=d;d=d.child;continue}if(d=== +b)break;for(;null===d.sibling;){if(null===d.return||d.return===b)return;d=d.return;4===d.tag&&(e=!1)}d.sibling.return=d.return;d=d.sibling}}function Qe(a,b){switch(b.tag){case 0:case 11:case 14:case 15:case 22:Ah(3,b);return;case 1:return;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[vc]=d;"input"===a&&"radio"===d.type&&null!=d.name&&If(c,d);Vd(a,e);b=Vd(a,d);for(e=0;e<f.length;e+=2){var g=f[e], +h=f[e+1];"style"===g?gg(c,h):"dangerouslySetInnerHTML"===g?xh(c,h):"children"===g?Wb(c,h):xd(c,g,h,b)}switch(a){case "input":Dd(c,d);break;case "textarea":Lf(c,d);break;case "select":b=c._wrapperState.wasMultiple,c._wrapperState.wasMultiple=!!d.multiple,a=d.value,null!=a?hb(c,!!d.multiple,a,!1):b!==!!d.multiple&&(null!=d.defaultValue?hb(c,!!d.multiple,d.defaultValue,!0):hb(c,!!d.multiple,d.multiple?[]:"",!1))}}}return;case 6:if(null===b.stateNode)throw Error(k(162));b.stateNode.nodeValue=b.memoizedProps; +return;case 3:b=b.stateNode;b.hydrate&&(b.hydrate=!1,bg(b.containerInfo));return;case 12:return;case 13:c=b;null===b.memoizedState?d=!1:(d=!0,c=b.child,Re=Y());if(null!==c)a:for(a=c;;){if(5===a.tag)f=a.stateNode,d?(f=f.style,"function"===typeof f.setProperty?f.setProperty("display","none","important"):f.display="none"):(f=a.stateNode,e=a.memoizedProps.style,e=void 0!==e&&null!==e&&e.hasOwnProperty("display")?e.display:null,f.style.display=fg("display",e));else if(6===a.tag)a.stateNode.nodeValue=d? +"":a.memoizedProps;else if(13===a.tag&&null!==a.memoizedState&&null===a.memoizedState.dehydrated){f=a.child.sibling;f.return=a;a=f;continue}else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===c)break;for(;null===a.sibling;){if(null===a.return||a.return===c)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}Hh(b);return;case 19:Hh(b);return;case 17:return}throw Error(k(163));}function Hh(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode= +new pj);b.forEach(function(b){var d=qj.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}function Ih(a,b,c){c=Ea(c,null);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){cd||(cd=!0,Se=d);Me(a,b)};return c}function Jh(a,b,c){c=Ea(c,null);c.tag=3;var d=a.type.getDerivedStateFromError;if("function"===typeof d){var e=b.value;c.payload=function(){Me(a,b);return d(e)}}var f=a.stateNode;null!==f&&"function"===typeof f.componentDidCatch&&(c.callback=function(){"function"!==typeof d&& +(null===La?La=new Set([this]):La.add(this),Me(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:""})});return c}function ka(){return(p&(ca|ma))!==H?1073741821-(Y()/10|0):0!==dd?dd:dd=1073741821-(Y()/10|0)}function Va(a,b,c){b=b.mode;if(0===(b&2))return 1073741823;var d=Cc();if(0===(b&4))return 99===d?1073741823:1073741822;if((p&ca)!==H)return P;if(null!==c)a=Fc(a,c.timeoutMs|0||5E3,250);else switch(d){case 99:a=1073741823;break;case 98:a=Fc(a,150,100);break;case 97:case 96:a= +Fc(a,5E3,250);break;case 95:a=2;break;default:throw Error(k(326));}null!==U&&a===P&&--a;return a}function ed(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);var d=a.return,e=null;if(null===d&&3===a.tag)e=a.stateNode;else for(;null!==d;){c=d.alternate;d.childExpirationTime<b&&(d.childExpirationTime=b);null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);if(null===d.return&&3===d.tag){e=d.stateNode;break}d=d.return}null!==e&& +(U===e&&(Kc(b),F===bd&&Ya(e,P)),yh(e,b));return e}function fd(a){var b=a.lastExpiredTime;if(0!==b)return b;b=a.firstPendingTime;if(!Kh(a,b))return b;var c=a.lastPingedTime;a=a.nextKnownPendingLevel;a=c>a?c:a;return 2>=a&&b!==a?0:a}function V(a){if(0!==a.lastExpiredTime)a.callbackExpirationTime=1073741823,a.callbackPriority=99,a.callbackNode=Og(Te.bind(null,a));else{var b=fd(a),c=a.callbackNode;if(0===b)null!==c&&(a.callbackNode=null,a.callbackExpirationTime=0,a.callbackPriority=90);else{var d=ka(); +1073741823===b?d=99:1===b||2===b?d=95:(d=10*(1073741821-b)-10*(1073741821-d),d=0>=d?99:250>=d?98:5250>=d?97:95);if(null!==c){var e=a.callbackPriority;if(a.callbackExpirationTime===b&&e>=d)return;c!==Qg&&Rg(c)}a.callbackExpirationTime=b;a.callbackPriority=d;b=1073741823===b?Og(Te.bind(null,a)):Ng(d,Lh.bind(null,a),{timeout:10*(1073741821-b)-Y()});a.callbackNode=b}}}function Lh(a,b){dd=0;if(b)return b=ka(),Ue(a,b),V(a),null;var c=fd(a);if(0!==c){b=a.callbackNode;if((p&(ca|ma))!==H)throw Error(k(327)); +xb();a===U&&c===P||$a(a,c);if(null!==t){var d=p;p|=ca;var e=Mh();do try{rj();break}catch(h){Nh(a,h)}while(1);le();p=d;gd.current=e;if(F===hd)throw b=id,$a(a,c),Ya(a,c),V(a),b;if(null===t)switch(e=a.finishedWork=a.current.alternate,a.finishedExpirationTime=c,d=F,U=null,d){case Xa:case hd:throw Error(k(345));case Oh:Ue(a,2<c?2:c);break;case ad:Ya(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Ve(e));if(1073741823===ta&&(e=Re+Ph-Y(),10<e)){if(jd){var f=a.lastPingedTime;if(0===f||f>=c){a.lastPingedTime= +c;$a(a,c);break}}f=fd(a);if(0!==f&&f!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}a.timeoutHandle=We(ab.bind(null,a),e);break}ab(a);break;case bd:Ya(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Ve(e));if(jd&&(e=a.lastPingedTime,0===e||e>=c)){a.lastPingedTime=c;$a(a,c);break}e=fd(a);if(0!==e&&e!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}1073741823!==Yb?d=10*(1073741821-Yb)-Y():1073741823===ta?d=0:(d=10*(1073741821-ta)-5E3,e=Y(),c=10*(1073741821-c)-e,d=e-d,0>d&&(d=0),d= +(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*sj(d/1960))-d,c<d&&(d=c));if(10<d){a.timeoutHandle=We(ab.bind(null,a),d);break}ab(a);break;case Xe:if(1073741823!==ta&&null!==kd){f=ta;var g=kd;d=g.busyMinDurationMs|0;0>=d?d=0:(e=g.busyDelayMs|0,f=Y()-(10*(1073741821-f)-(g.timeoutMs|0||5E3)),d=f<=e?0:e+d-f);if(10<d){Ya(a,c);a.timeoutHandle=We(ab.bind(null,a),d);break}}ab(a);break;default:throw Error(k(329));}V(a);if(a.callbackNode===b)return Lh.bind(null,a)}}return null}function Te(a){var b= +a.lastExpiredTime;b=0!==b?b:1073741823;if((p&(ca|ma))!==H)throw Error(k(327));xb();a===U&&b===P||$a(a,b);if(null!==t){var c=p;p|=ca;var d=Mh();do try{tj();break}catch(e){Nh(a,e)}while(1);le();p=c;gd.current=d;if(F===hd)throw c=id,$a(a,b),Ya(a,b),V(a),c;if(null!==t)throw Error(k(261));a.finishedWork=a.current.alternate;a.finishedExpirationTime=b;U=null;ab(a);V(a)}return null}function uj(){if(null!==bb){var a=bb;bb=null;a.forEach(function(a,c){Ue(c,a);V(c)});ha()}}function Qh(a,b){var c=p;p|=1;try{return a(b)}finally{p= +c,p===H&&ha()}}function Rh(a,b){var c=p;p&=-2;p|=Ye;try{return a(b)}finally{p=c,p===H&&ha()}}function $a(a,b){a.finishedWork=null;a.finishedExpirationTime=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,vj(c));if(null!==t)for(c=t.return;null!==c;){var d=c;switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&(q(G),q(B));break;case 3:tb();q(G);q(B);break;case 5:te(d);break;case 4:tb();break;case 13:q(D);break;case 19:q(D);break;case 10:me(d)}c=c.return}U=a;t=Sa(a.current,null); +P=b;F=Xa;id=null;Yb=ta=1073741823;kd=null;Xb=0;jd=!1}function Nh(a,b){do{try{le();Sc.current=Tc;if(Uc)for(var c=z.memoizedState;null!==c;){var d=c.queue;null!==d&&(d.pending=null);c=c.next}Ia=0;J=K=z=null;Uc=!1;if(null===t||null===t.return)return F=hd,id=b,t=null;a:{var e=a,f=t.return,g=t,h=b;b=P;g.effectTag|=2048;g.firstEffect=g.lastEffect=null;if(null!==h&&"object"===typeof h&&"function"===typeof h.then){var m=h;if(0===(g.mode&2)){var n=g.alternate;n?(g.updateQueue=n.updateQueue,g.memoizedState= +n.memoizedState,g.expirationTime=n.expirationTime):(g.updateQueue=null,g.memoizedState=null)}var l=0!==(D.current&1),k=f;do{var p;if(p=13===k.tag){var q=k.memoizedState;if(null!==q)p=null!==q.dehydrated?!0:!1;else{var w=k.memoizedProps;p=void 0===w.fallback?!1:!0!==w.unstable_avoidThisFallback?!0:l?!1:!0}}if(p){var y=k.updateQueue;if(null===y){var r=new Set;r.add(m);k.updateQueue=r}else y.add(m);if(0===(k.mode&2)){k.effectTag|=64;g.effectTag&=-2981;if(1===g.tag)if(null===g.alternate)g.tag=17;else{var O= +Ea(1073741823,null);O.tag=Jc;Fa(g,O)}g.expirationTime=1073741823;break a}h=void 0;g=b;var v=e.pingCache;null===v?(v=e.pingCache=new wj,h=new Set,v.set(m,h)):(h=v.get(m),void 0===h&&(h=new Set,v.set(m,h)));if(!h.has(g)){h.add(g);var x=xj.bind(null,e,m,g);m.then(x,x)}k.effectTag|=4096;k.expirationTime=b;break a}k=k.return}while(null!==k);h=Error((na(g.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display."+ +Bd(g))}F!==Xe&&(F=Oh);h=Le(h,g);k=f;do{switch(k.tag){case 3:m=h;k.effectTag|=4096;k.expirationTime=b;var A=Ih(k,m,b);Ug(k,A);break a;case 1:m=h;var u=k.type,B=k.stateNode;if(0===(k.effectTag&64)&&("function"===typeof u.getDerivedStateFromError||null!==B&&"function"===typeof B.componentDidCatch&&(null===La||!La.has(B)))){k.effectTag|=4096;k.expirationTime=b;var H=Jh(k,m,b);Ug(k,H);break a}}k=k.return}while(null!==k)}t=Sh(t)}catch(cj){b=cj;continue}break}while(1)}function Mh(a){a=gd.current;gd.current= +Tc;return null===a?Tc:a}function Vg(a,b){a<ta&&2<a&&(ta=a);null!==b&&a<Yb&&2<a&&(Yb=a,kd=b)}function Kc(a){a>Xb&&(Xb=a)}function tj(){for(;null!==t;)t=Th(t)}function rj(){for(;null!==t&&!yj();)t=Th(t)}function Th(a){var b=zj(a.alternate,a,P);a.memoizedProps=a.pendingProps;null===b&&(b=Sh(a));Uh.current=null;return b}function Sh(a){t=a;do{var b=t.alternate;a=t.return;if(0===(t.effectTag&2048)){b=hj(b,t,P);if(1===P||1!==t.childExpirationTime){for(var c=0,d=t.child;null!==d;){var e=d.expirationTime, +f=d.childExpirationTime;e>c&&(c=e);f>c&&(c=f);d=d.sibling}t.childExpirationTime=c}if(null!==b)return b;null!==a&&0===(a.effectTag&2048)&&(null===a.firstEffect&&(a.firstEffect=t.firstEffect),null!==t.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=t.firstEffect),a.lastEffect=t.lastEffect),1<t.effectTag&&(null!==a.lastEffect?a.lastEffect.nextEffect=t:a.firstEffect=t,a.lastEffect=t))}else{b=lj(t);if(null!==b)return b.effectTag&=2047,b;null!==a&&(a.firstEffect=a.lastEffect=null,a.effectTag|= +2048)}b=t.sibling;if(null!==b)return b;t=a}while(null!==t);F===Xa&&(F=Xe);return null}function Ve(a){var b=a.expirationTime;a=a.childExpirationTime;return b>a?b:a}function ab(a){var b=Cc();Da(99,Aj.bind(null,a,b));return null}function Aj(a,b){do xb();while(null!==Zb);if((p&(ca|ma))!==H)throw Error(k(327));var c=a.finishedWork,d=a.finishedExpirationTime;if(null===c)return null;a.finishedWork=null;a.finishedExpirationTime=0;if(c===a.current)throw Error(k(177));a.callbackNode=null;a.callbackExpirationTime= +0;a.callbackPriority=90;a.nextKnownPendingLevel=0;var e=Ve(c);a.firstPendingTime=e;d<=a.lastSuspendedTime?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:d<=a.firstSuspendedTime&&(a.firstSuspendedTime=d-1);d<=a.lastPingedTime&&(a.lastPingedTime=0);d<=a.lastExpiredTime&&(a.lastExpiredTime=0);a===U&&(t=U=null,P=0);1<c.effectTag?null!==c.lastEffect?(c.lastEffect.nextEffect=c,e=c.firstEffect):e=c:e=c.firstEffect;if(null!==e){var f=p;p|=ma;Uh.current=null;Ze=tc;var g=kg();if(Xd(g)){if("selectionStart"in +g)var h={start:g.selectionStart,end:g.selectionEnd};else a:{h=(h=g.ownerDocument)&&h.defaultView||window;var m=h.getSelection&&h.getSelection();if(m&&0!==m.rangeCount){h=m.anchorNode;var n=m.anchorOffset,q=m.focusNode;m=m.focusOffset;try{h.nodeType,q.nodeType}catch(sb){h=null;break a}var ba=0,w=-1,y=-1,B=0,D=0,r=g,z=null;b:for(;;){for(var v;;){r!==h||0!==n&&3!==r.nodeType||(w=ba+n);r!==q||0!==m&&3!==r.nodeType||(y=ba+m);3===r.nodeType&&(ba+=r.nodeValue.length);if(null===(v=r.firstChild))break;z=r; +r=v}for(;;){if(r===g)break b;z===h&&++B===n&&(w=ba);z===q&&++D===m&&(y=ba);if(null!==(v=r.nextSibling))break;r=z;z=r.parentNode}r=v}h=-1===w||-1===y?null:{start:w,end:y}}else h=null}h=h||{start:0,end:0}}else h=null;$e={activeElementDetached:null,focusedElem:g,selectionRange:h};tc=!1;l=e;do try{Bj()}catch(sb){if(null===l)throw Error(k(330));Za(l,sb);l=l.nextEffect}while(null!==l);l=e;do try{for(g=a,h=b;null!==l;){var x=l.effectTag;x&16&&Wb(l.stateNode,"");if(x&128){var A=l.alternate;if(null!==A){var u= +A.ref;null!==u&&("function"===typeof u?u(null):u.current=null)}}switch(x&1038){case 2:Gh(l);l.effectTag&=-3;break;case 6:Gh(l);l.effectTag&=-3;Qe(l.alternate,l);break;case 1024:l.effectTag&=-1025;break;case 1028:l.effectTag&=-1025;Qe(l.alternate,l);break;case 4:Qe(l.alternate,l);break;case 8:n=l,Dh(g,n,h),Eh(n)}l=l.nextEffect}}catch(sb){if(null===l)throw Error(k(330));Za(l,sb);l=l.nextEffect}while(null!==l);u=$e;A=kg();x=u.focusedElem;h=u.selectionRange;if(A!==x&&x&&x.ownerDocument&&jg(x.ownerDocument.documentElement, +x)){null!==h&&Xd(x)&&(A=h.start,u=h.end,void 0===u&&(u=A),"selectionStart"in x?(x.selectionStart=A,x.selectionEnd=Math.min(u,x.value.length)):(u=(A=x.ownerDocument||document)&&A.defaultView||window,u.getSelection&&(u=u.getSelection(),n=x.textContent.length,g=Math.min(h.start,n),h=void 0===h.end?g:Math.min(h.end,n),!u.extend&&g>h&&(n=h,h=g,g=n),n=ig(x,g),q=ig(x,h),n&&q&&(1!==u.rangeCount||u.anchorNode!==n.node||u.anchorOffset!==n.offset||u.focusNode!==q.node||u.focusOffset!==q.offset)&&(A=A.createRange(), +A.setStart(n.node,n.offset),u.removeAllRanges(),g>h?(u.addRange(A),u.extend(q.node,q.offset)):(A.setEnd(q.node,q.offset),u.addRange(A))))));A=[];for(u=x;u=u.parentNode;)1===u.nodeType&&A.push({element:u,left:u.scrollLeft,top:u.scrollTop});"function"===typeof x.focus&&x.focus();for(x=0;x<A.length;x++)u=A[x],u.element.scrollLeft=u.left,u.element.scrollTop=u.top}tc=!!Ze;$e=Ze=null;a.current=c;l=e;do try{for(x=a;null!==l;){var F=l.effectTag;F&36&&oj(x,l.alternate,l);if(F&128){A=void 0;var E=l.ref;if(null!== +E){var G=l.stateNode;switch(l.tag){case 5:A=G;break;default:A=G}"function"===typeof E?E(A):E.current=A}}l=l.nextEffect}}catch(sb){if(null===l)throw Error(k(330));Za(l,sb);l=l.nextEffect}while(null!==l);l=null;Cj();p=f}else a.current=c;if(ld)ld=!1,Zb=a,$b=b;else for(l=e;null!==l;)b=l.nextEffect,l.nextEffect=null,l=b;b=a.firstPendingTime;0===b&&(La=null);1073741823===b?a===af?ac++:(ac=0,af=a):ac=0;"function"===typeof bf&&bf(c.stateNode,d);V(a);if(cd)throw cd=!1,a=Se,Se=null,a;if((p&Ye)!==H)return null; +ha();return null}function Bj(){for(;null!==l;){var a=l.effectTag;0!==(a&256)&&nj(l.alternate,l);0===(a&512)||ld||(ld=!0,Ng(97,function(){xb();return null}));l=l.nextEffect}}function xb(){if(90!==$b){var a=97<$b?97:$b;$b=90;return Da(a,Dj)}}function Dj(){if(null===Zb)return!1;var a=Zb;Zb=null;if((p&(ca|ma))!==H)throw Error(k(331));var b=p;p|=ma;for(a=a.current.firstEffect;null!==a;){try{var c=a;if(0!==(c.effectTag&512))switch(c.tag){case 0:case 11:case 15:case 22:Ah(5,c),Bh(5,c)}}catch(d){if(null=== +a)throw Error(k(330));Za(a,d)}c=a.nextEffect;a.nextEffect=null;a=c}p=b;ha();return!0}function Vh(a,b,c){b=Le(c,b);b=Ih(a,b,1073741823);Fa(a,b);a=ed(a,1073741823);null!==a&&V(a)}function Za(a,b){if(3===a.tag)Vh(a,a,b);else for(var c=a.return;null!==c;){if(3===c.tag){Vh(c,a,b);break}else if(1===c.tag){var d=c.stateNode;if("function"===typeof c.type.getDerivedStateFromError||"function"===typeof d.componentDidCatch&&(null===La||!La.has(d))){a=Le(b,a);a=Jh(c,a,1073741823);Fa(c,a);c=ed(c,1073741823);null!== +c&&V(c);break}}c=c.return}}function xj(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);U===a&&P===c?F===bd||F===ad&&1073741823===ta&&Y()-Re<Ph?$a(a,P):jd=!0:Kh(a,c)&&(b=a.lastPingedTime,0!==b&&b<c||(a.lastPingedTime=c,V(a)))}function qj(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=0;0===b&&(b=ka(),b=Va(b,a,null));a=ed(a,b);null!==a&&V(a)}function Ej(a){if("undefined"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c= +b.inject(a);bf=function(a,e){try{b.onCommitFiberRoot(c,a,void 0,64===(a.current.effectTag&64))}catch(f){}};Ne=function(a){try{b.onCommitFiberUnmount(c,a)}catch(e){}}}catch(d){}return!0}function Fj(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect= +null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function Ge(a){a=a.prototype;return!(!a||!a.isReactComponent)}function Gj(a){if("function"===typeof a)return Ge(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===zd)return 11;if(a===Ad)return 14}return 2}function Sa(a,b){var c=a.alternate;null===c?(c=la(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.effectTag=0,c.nextEffect=null,c.firstEffect= +null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{expirationTime:b.expirationTime,firstContext:b.firstContext,responders:b.responders};c.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}function Oc(a,b,c,d,e,f){var g=2;d=a;if("function"===typeof a)Ge(a)&&(g=1);else if("string"===typeof a)g= +5;else a:switch(a){case Ma:return Ha(c.children,e,f,b);case Hj:g=8;e|=7;break;case Af:g=8;e|=1;break;case kc:return a=la(12,c,b,e|8),a.elementType=kc,a.type=kc,a.expirationTime=f,a;case lc:return a=la(13,c,b,e),a.type=lc,a.elementType=lc,a.expirationTime=f,a;case yd:return a=la(19,c,b,e),a.elementType=yd,a.expirationTime=f,a;default:if("object"===typeof a&&null!==a)switch(a.$$typeof){case Cf:g=10;break a;case Bf:g=9;break a;case zd:g=11;break a;case Ad:g=14;break a;case Ef:g=16;d=null;break a;case Df:g= +22;break a}throw Error(k(130,null==a?a:typeof a,""));}b=la(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function Ha(a,b,c,d){a=la(7,a,d,b);a.expirationTime=c;return a}function qe(a,b,c){a=la(6,a,null,b);a.expirationTime=c;return a}function re(a,b,c){b=la(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}function Ij(a,b,c){this.tag=b;this.current=null;this.containerInfo= +a;this.pingCache=this.pendingChildren=null;this.finishedExpirationTime=0;this.finishedWork=null;this.timeoutHandle=-1;this.pendingContext=this.context=null;this.hydrate=c;this.callbackNode=null;this.callbackPriority=90;this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}function Kh(a,b){var c=a.firstSuspendedTime;a=a.lastSuspendedTime;return 0!==c&&c>=b&&a<=b}function Ya(a,b){var c=a.firstSuspendedTime,d=a.lastSuspendedTime; +c<b&&(a.firstSuspendedTime=b);if(d>b||0===c)a.lastSuspendedTime=b;b<=a.lastPingedTime&&(a.lastPingedTime=0);b<=a.lastExpiredTime&&(a.lastExpiredTime=0)}function yh(a,b){b>a.firstPendingTime&&(a.firstPendingTime=b);var c=a.firstSuspendedTime;0!==c&&(b>=c?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:b>=a.lastSuspendedTime&&(a.lastSuspendedTime=b+1),b>a.nextKnownPendingLevel&&(a.nextKnownPendingLevel=b))}function Ue(a,b){var c=a.lastExpiredTime;if(0===c||c>b)a.lastExpiredTime=b} +function md(a,b,c,d){var e=b.current,f=ka(),g=Vb.suspense;f=Va(f,e,g);a:if(c){c=c._reactInternalFiber;b:{if(Na(c)!==c||1!==c.tag)throw Error(k(170));var h=c;do{switch(h.tag){case 3:h=h.stateNode.context;break b;case 1:if(N(h.type)){h=h.stateNode.__reactInternalMemoizedMergedChildContext;break b}}h=h.return}while(null!==h);throw Error(k(171));}if(1===c.tag){var m=c.type;if(N(m)){c=Gg(c,m,h);break a}}c=h}else c=Ca;null===b.context?b.context=c:b.pendingContext=c;b=Ea(f,g);b.payload={element:a};d=void 0=== +d?null:d;null!==d&&(b.callback=d);Fa(e,b);Ja(e,f);return f}function cf(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function Wh(a,b){a=a.memoizedState;null!==a&&null!==a.dehydrated&&a.retryTime<b&&(a.retryTime=b)}function df(a,b){Wh(a,b);(a=a.alternate)&&Wh(a,b)}function ef(a,b,c){c=null!=c&&!0===c.hydrate;var d=new Ij(a,b,c),e=la(3,null,null,2===b?7:1===b?3:0);d.current=e;e.stateNode=d;ne(e);a[Lb]=d.current;c&&0!==b&& +xi(a,9===a.nodeType?a:a.ownerDocument);this._internalRoot=d}function bc(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||" react-mount-point-unstable "!==a.nodeValue))}function Jj(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute("data-reactroot")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new ef(a,0,b?{hydrate:!0}:void 0)}function nd(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f._internalRoot; +if("function"===typeof e){var h=e;e=function(){var a=cf(g);h.call(a)}}md(b,g,a,e)}else{f=c._reactRootContainer=Jj(c,d);g=f._internalRoot;if("function"===typeof e){var m=e;e=function(){var a=cf(g);m.call(a)}}Rh(function(){md(b,g,a,e)})}return cf(g)}function Kj(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:gb,key:null==d?null:""+d,children:a,containerInfo:b,implementation:c}}function Xh(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null; +if(!bc(b))throw Error(k(200));return Kj(a,b,null,c)}if(!ea)throw Error(k(227));var ki=function(a,b,c,d,e,f,g,h,m){var n=Array.prototype.slice.call(arguments,3);try{b.apply(c,n)}catch(C){this.onError(C)}},yb=!1,gc=null,hc=!1,pd=null,li={onError:function(a){yb=!0;gc=a}},td=null,rf=null,mf=null,ic=null,cb={},jc=[],qd={},db={},rd={},wa=!("undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement),M=ea.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.assign, +sd=null,eb=null,fb=null,ee=function(a,b){return a(b)},eg=function(a,b,c,d,e){return a(b,c,d,e)},vd=function(){},vf=ee,Oa=!1,wd=!1,Z=ea.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.Scheduler,Lj=Z.unstable_cancelCallback,ff=Z.unstable_now,$f=Z.unstable_scheduleCallback,Mj=Z.unstable_shouldYield,Yh=Z.unstable_requestPaint,Pd=Z.unstable_runWithPriority,Nj=Z.unstable_getCurrentPriorityLevel,Oj=Z.unstable_ImmediatePriority,Zh=Z.unstable_UserBlockingPriority,ag=Z.unstable_NormalPriority,Pj=Z.unstable_LowPriority, +Qj=Z.unstable_IdlePriority,oi=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,wf=Object.prototype.hasOwnProperty,yf={},xf={},E={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a){E[a]= +new L(a,0,!1,a,null,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(a){var b=a[0];E[b]=new L(b,1,!1,a[1],null,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(a){E[a]=new L(a,2,!1,a.toLowerCase(),null,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(a){E[a]=new L(a,2,!1,a,null,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a){E[a]= +new L(a,3,!1,a.toLowerCase(),null,!1)});["checked","multiple","muted","selected"].forEach(function(a){E[a]=new L(a,3,!0,a,null,!1)});["capture","download"].forEach(function(a){E[a]=new L(a,4,!1,a,null,!1)});["cols","rows","size","span"].forEach(function(a){E[a]=new L(a,6,!1,a,null,!1)});["rowSpan","start"].forEach(function(a){E[a]=new L(a,5,!1,a.toLowerCase(),null,!1)});var gf=/[\-:]([a-z])/g,hf=function(a){return a[1].toUpperCase()};"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a){var b= +a.replace(gf,hf);E[b]=new L(b,1,!1,a,null,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a){var b=a.replace(gf,hf);E[b]=new L(b,1,!1,a,"http://www.w3.org/1999/xlink",!1)});["xml:base","xml:lang","xml:space"].forEach(function(a){var b=a.replace(gf,hf);E[b]=new L(b,1,!1,a,"http://www.w3.org/XML/1998/namespace",!1)});["tabIndex","crossOrigin"].forEach(function(a){E[a]=new L(a,1,!1,a.toLowerCase(),null,!1)});E.xlinkHref=new L("xlinkHref",1, +!1,"xlink:href","http://www.w3.org/1999/xlink",!0);["src","href","action","formAction"].forEach(function(a){E[a]=new L(a,1,!1,a.toLowerCase(),null,!0)});var da=ea.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;da.hasOwnProperty("ReactCurrentDispatcher")||(da.ReactCurrentDispatcher={current:null});da.hasOwnProperty("ReactCurrentBatchConfig")||(da.ReactCurrentBatchConfig={suspense:null});var si=/^(.*)[\\\/]/,Q="function"===typeof Symbol&&Symbol.for,Pc=Q?Symbol.for("react.element"):60103,gb=Q?Symbol.for("react.portal"): +60106,Ma=Q?Symbol.for("react.fragment"):60107,Af=Q?Symbol.for("react.strict_mode"):60108,kc=Q?Symbol.for("react.profiler"):60114,Cf=Q?Symbol.for("react.provider"):60109,Bf=Q?Symbol.for("react.context"):60110,Hj=Q?Symbol.for("react.concurrent_mode"):60111,zd=Q?Symbol.for("react.forward_ref"):60112,lc=Q?Symbol.for("react.suspense"):60113,yd=Q?Symbol.for("react.suspense_list"):60120,Ad=Q?Symbol.for("react.memo"):60115,Ef=Q?Symbol.for("react.lazy"):60116,Df=Q?Symbol.for("react.block"):60121,zf="function"=== +typeof Symbol&&Symbol.iterator,od,xh=function(a){return"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if("http://www.w3.org/2000/svg"!==a.namespaceURI||"innerHTML"in a)a.innerHTML=b;else{od=od||document.createElement("div");od.innerHTML="<svg>"+b.valueOf().toString()+"</svg>";for(b=od.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}}),Wb=function(a, +b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b},ib={animationend:nc("Animation","AnimationEnd"),animationiteration:nc("Animation","AnimationIteration"),animationstart:nc("Animation","AnimationStart"),transitionend:nc("Transition","TransitionEnd")},Id={},Of={};wa&&(Of=document.createElement("div").style,"AnimationEvent"in window||(delete ib.animationend.animation,delete ib.animationiteration.animation,delete ib.animationstart.animation),"TransitionEvent"in +window||delete ib.transitionend.transition);var $h=oc("animationend"),ai=oc("animationiteration"),bi=oc("animationstart"),ci=oc("transitionend"),Db="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Pf=new ("function"===typeof WeakMap?WeakMap:Map),Ab=null,wi=function(a){if(a){var b=a._dispatchListeners,c=a._dispatchInstances; +if(Array.isArray(b))for(var d=0;d<b.length&&!a.isPropagationStopped();d++)lf(a,b[d],c[d]);else b&&lf(a,b,c);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}},qc=[],Rd=!1,fa=[],xa=null,ya=null,za=null,Eb=new Map,Fb=new Map,Jb=[],Nd="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput close cancel copy cut paste click change contextmenu reset submit".split(" "), +yi="focus blur dragenter dragleave mouseover mouseout pointerover pointerout gotpointercapture lostpointercapture".split(" "),dg={},cg=new Map,Td=new Map,Rj=["abort","abort",$h,"animationEnd",ai,"animationIteration",bi,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata", +"loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",ci,"transitionEnd","waiting","waiting"];Sd("blur blur cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focus focus input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "), +0);Sd("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1);Sd(Rj,2);(function(a,b){for(var c=0;c<a.length;c++)Td.set(a[c],b)})("change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),0);var Hi=Zh,Gi=Pd,tc=!0,Kb={animationIterationCount:!0, +borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0, +strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Sj=["Webkit","ms","Moz","O"];Object.keys(Kb).forEach(function(a){Sj.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);Kb[b]=Kb[a]})});var Ii=M({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}),ng="$",og="/$",$d="$?",Zd="$!",Ze=null,$e=null,We="function"===typeof setTimeout?setTimeout:void 0,vj="function"=== +typeof clearTimeout?clearTimeout:void 0,jf=Math.random().toString(36).slice(2),Aa="__reactInternalInstance$"+jf,vc="__reactEventHandlers$"+jf,Lb="__reactContainere$"+jf,Ba=null,ce=null,wc=null;M(R.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():"unknown"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=xc)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():"unknown"!== +typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=xc)},persist:function(){this.isPersistent=xc},isPersistent:yc,destructor:function(){var a=this.constructor.Interface,b;for(b in a)this[b]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null;this.isPropagationStopped=this.isDefaultPrevented=yc;this._dispatchInstances=this._dispatchListeners=null}});R.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp|| +Date.now()},defaultPrevented:null,isTrusted:null};R.extend=function(a){function b(){return c.apply(this,arguments)}var c=this,d=function(){};d.prototype=c.prototype;d=new d;M(d,b.prototype);b.prototype=d;b.prototype.constructor=b;b.Interface=M({},c.Interface,a);b.extend=c.extend;sg(b);return b};sg(R);var Tj=R.extend({data:null}),Uj=R.extend({data:null}),Ni=[9,13,27,32],de=wa&&"CompositionEvent"in window,cc=null;wa&&"documentMode"in document&&(cc=document.documentMode);var Vj=wa&&"TextEvent"in window&& +!cc,xg=wa&&(!de||cc&&8<cc&&11>=cc),wg=String.fromCharCode(32),ua={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"}, +dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},vg=!1,mb=!1,Wj={eventTypes:ua,extractEvents:function(a,b,c,d,e){var f;if(de)b:{switch(a){case "compositionstart":var g=ua.compositionStart;break b;case "compositionend":g=ua.compositionEnd;break b;case "compositionupdate":g= +ua.compositionUpdate;break b}g=void 0}else mb?tg(a,c)&&(g=ua.compositionEnd):"keydown"===a&&229===c.keyCode&&(g=ua.compositionStart);g?(xg&&"ko"!==c.locale&&(mb||g!==ua.compositionStart?g===ua.compositionEnd&&mb&&(f=rg()):(Ba=d,ce="value"in Ba?Ba.value:Ba.textContent,mb=!0)),e=Tj.getPooled(g,b,c,d),f?e.data=f:(f=ug(c),null!==f&&(e.data=f)),lb(e),f=e):f=null;(a=Vj?Oi(a,c):Pi(a,c))?(b=Uj.getPooled(ua.beforeInput,b,c,d),b.data=a,lb(b)):b=null;return null===f?b:null===b?f:[f,b]}},Qi={color:!0,date:!0, +datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0},Ag={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:"blur change click focus input keydown keyup selectionchange".split(" ")}},Mb=null,Nb=null,kf=!1;wa&&(kf=Tf("input")&&(!document.documentMode||9<document.documentMode));var Xj={eventTypes:Ag,_isInputEventSupported:kf,extractEvents:function(a,b,c,d,e){e=b?Pa(b):window;var f= +e.nodeName&&e.nodeName.toLowerCase();if("select"===f||"input"===f&&"file"===e.type)var g=Si;else if(yg(e))if(kf)g=Wi;else{g=Ui;var h=Ti}else(f=e.nodeName)&&"input"===f.toLowerCase()&&("checkbox"===e.type||"radio"===e.type)&&(g=Vi);if(g&&(g=g(a,b)))return zg(g,c,d);h&&h(a,e,b);"blur"===a&&(a=e._wrapperState)&&a.controlled&&"number"===e.type&&Ed(e,"number",e.value)}},dc=R.extend({view:null,detail:null}),Yi={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"},di=0,ei=0,fi=!1,gi=!1,ec=dc.extend({screenX:null, +screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:fe,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)},movementX:function(a){if("movementX"in a)return a.movementX;var b=di;di=a.screenX;return fi?"mousemove"===a.type?a.screenX-b:0:(fi=!0,0)},movementY:function(a){if("movementY"in a)return a.movementY;var b=ei;ei=a.screenY;return gi?"mousemove"=== +a.type?a.screenY-b:0:(gi=!0,0)}}),hi=ec.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),fc={mouseEnter:{registrationName:"onMouseEnter",dependencies:["mouseout","mouseover"]},mouseLeave:{registrationName:"onMouseLeave",dependencies:["mouseout","mouseover"]},pointerEnter:{registrationName:"onPointerEnter",dependencies:["pointerout","pointerover"]},pointerLeave:{registrationName:"onPointerLeave",dependencies:["pointerout", +"pointerover"]}},Yj={eventTypes:fc,extractEvents:function(a,b,c,d,e){var f="mouseover"===a||"pointerover"===a,g="mouseout"===a||"pointerout"===a;if(f&&0===(e&32)&&(c.relatedTarget||c.fromElement)||!g&&!f)return null;f=d.window===d?d:(f=d.ownerDocument)?f.defaultView||f.parentWindow:window;if(g){if(g=b,b=(b=c.relatedTarget||c.toElement)?Bb(b):null,null!==b){var h=Na(b);if(b!==h||5!==b.tag&&6!==b.tag)b=null}}else g=null;if(g===b)return null;if("mouseout"===a||"mouseover"===a){var m=ec;var n=fc.mouseLeave; +var l=fc.mouseEnter;var k="mouse"}else if("pointerout"===a||"pointerover"===a)m=hi,n=fc.pointerLeave,l=fc.pointerEnter,k="pointer";a=null==g?f:Pa(g);f=null==b?f:Pa(b);n=m.getPooled(n,g,c,d);n.type=k+"leave";n.target=a;n.relatedTarget=f;c=m.getPooled(l,b,c,d);c.type=k+"enter";c.target=f;c.relatedTarget=a;d=g;k=b;if(d&&k)a:{m=d;l=k;g=0;for(a=m;a;a=pa(a))g++;a=0;for(b=l;b;b=pa(b))a++;for(;0<g-a;)m=pa(m),g--;for(;0<a-g;)l=pa(l),a--;for(;g--;){if(m===l||m===l.alternate)break a;m=pa(m);l=pa(l)}m=null}else m= +null;l=m;for(m=[];d&&d!==l;){g=d.alternate;if(null!==g&&g===l)break;m.push(d);d=pa(d)}for(d=[];k&&k!==l;){g=k.alternate;if(null!==g&&g===l)break;d.push(k);k=pa(k)}for(k=0;k<m.length;k++)be(m[k],"bubbled",n);for(k=d.length;0<k--;)be(d[k],"captured",c);return 0===(e&64)?[n]:[n,c]}},Qa="function"===typeof Object.is?Object.is:Zi,$i=Object.prototype.hasOwnProperty,Zj=wa&&"documentMode"in document&&11>=document.documentMode,Eg={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"}, +dependencies:"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange".split(" ")}},nb=null,he=null,Pb=null,ge=!1,ak={eventTypes:Eg,extractEvents:function(a,b,c,d,e,f){e=f||(d.window===d?d.document:9===d.nodeType?d:d.ownerDocument);if(!(f=!e)){a:{e=Jd(e);f=rd.onSelect;for(var g=0;g<f.length;g++)if(!e.has(f[g])){e=!1;break a}e=!0}f=!e}if(f)return null;e=b?Pa(b):window;switch(a){case "focus":if(yg(e)||"true"===e.contentEditable)nb=e,he=b,Pb=null;break;case "blur":Pb=he=nb=null; +break;case "mousedown":ge=!0;break;case "contextmenu":case "mouseup":case "dragend":return ge=!1,Dg(c,d);case "selectionchange":if(Zj)break;case "keydown":case "keyup":return Dg(c,d)}return null}},bk=R.extend({animationName:null,elapsedTime:null,pseudoElement:null}),ck=R.extend({clipboardData:function(a){return"clipboardData"in a?a.clipboardData:window.clipboardData}}),dk=dc.extend({relatedTarget:null}),ek={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown", +Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},fk={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock", +224:"Meta"},gk=dc.extend({key:function(a){if(a.key){var b=ek[a.key]||a.key;if("Unidentified"!==b)return b}return"keypress"===a.type?(a=Ac(a),13===a?"Enter":String.fromCharCode(a)):"keydown"===a.type||"keyup"===a.type?fk[a.keyCode]||"Unidentified":""},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:fe,charCode:function(a){return"keypress"===a.type?Ac(a):0},keyCode:function(a){return"keydown"===a.type||"keyup"===a.type?a.keyCode:0},which:function(a){return"keypress"=== +a.type?Ac(a):"keydown"===a.type||"keyup"===a.type?a.keyCode:0}}),hk=ec.extend({dataTransfer:null}),ik=dc.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:fe}),jk=R.extend({propertyName:null,elapsedTime:null,pseudoElement:null}),kk=ec.extend({deltaX:function(a){return"deltaX"in a?a.deltaX:"wheelDeltaX"in a?-a.wheelDeltaX:0},deltaY:function(a){return"deltaY"in a?a.deltaY:"wheelDeltaY"in a?-a.wheelDeltaY:"wheelDelta"in a? +-a.wheelDelta:0},deltaZ:null,deltaMode:null}),lk={eventTypes:dg,extractEvents:function(a,b,c,d,e){e=cg.get(a);if(!e)return null;switch(a){case "keypress":if(0===Ac(c))return null;case "keydown":case "keyup":a=gk;break;case "blur":case "focus":a=dk;break;case "click":if(2===c.button)return null;case "auxclick":case "dblclick":case "mousedown":case "mousemove":case "mouseup":case "mouseout":case "mouseover":case "contextmenu":a=ec;break;case "drag":case "dragend":case "dragenter":case "dragexit":case "dragleave":case "dragover":case "dragstart":case "drop":a= +hk;break;case "touchcancel":case "touchend":case "touchmove":case "touchstart":a=ik;break;case $h:case ai:case bi:a=bk;break;case ci:a=jk;break;case "scroll":a=dc;break;case "wheel":a=kk;break;case "copy":case "cut":case "paste":a=ck;break;case "gotpointercapture":case "lostpointercapture":case "pointercancel":case "pointerdown":case "pointermove":case "pointerout":case "pointerover":case "pointerup":a=hi;break;default:a=R}b=a.getPooled(e,b,c,d);lb(b);return b}};(function(a){if(ic)throw Error(k(101)); +ic=Array.prototype.slice.call(a);nf()})("ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin".split(" "));(function(a,b,c){td=a;rf=b;mf=c})(ae,Hb,Pa);pf({SimpleEventPlugin:lk,EnterLeaveEventPlugin:Yj,ChangeEventPlugin:Xj,SelectEventPlugin:ak,BeforeInputEventPlugin:Wj});var ie=[],ob=-1,Ca={},B={current:Ca},G={current:!1},Ra=Ca,bj=Pd,je=$f,Rg=Lj,aj=Nj,Dc=Oj,Ig=Zh,Jg=ag,Kg=Pj,Lg=Qj,Qg={},yj=Mj,Cj=void 0!==Yh?Yh:function(){},qa=null, +Ec=null,ke=!1,ii=ff(),Y=1E4>ii?ff:function(){return ff()-ii},Ic={current:null},Hc=null,qb=null,Gc=null,Tg=0,Jc=2,Ga=!1,Vb=da.ReactCurrentBatchConfig,$g=(new ea.Component).refs,Mc={isMounted:function(a){return(a=a._reactInternalFiber)?Na(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=ka(),e=Vb.suspense;d=Va(d,a,e);e=Ea(d,e);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);Fa(a,e);Ja(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=ka(),e=Vb.suspense; +d=Va(d,a,e);e=Ea(d,e);e.tag=1;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);Fa(a,e);Ja(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=ka(),d=Vb.suspense;c=Va(c,a,d);d=Ea(c,d);d.tag=Jc;void 0!==b&&null!==b&&(d.callback=b);Fa(a,d);Ja(a,c)}},Qc=Array.isArray,wb=ah(!0),Fe=ah(!1),Sb={},ja={current:Sb},Ub={current:Sb},Tb={current:Sb},D={current:0},Sc=da.ReactCurrentDispatcher,X=da.ReactCurrentBatchConfig,Ia=0,z=null,K=null,J=null,Uc=!1,Tc={readContext:W,useCallback:S,useContext:S, +useEffect:S,useImperativeHandle:S,useLayoutEffect:S,useMemo:S,useReducer:S,useRef:S,useState:S,useDebugValue:S,useResponder:S,useDeferredValue:S,useTransition:S},dj={readContext:W,useCallback:ih,useContext:W,useEffect:eh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ze(4,2,gh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ze(4,2,a,b)},useMemo:function(a,b){var c=ub();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d= +ub();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={pending:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};a=a.dispatch=ch.bind(null,z,a);return[d.memoizedState,a]},useRef:function(a){var b=ub();a={current:a};return b.memoizedState=a},useState:xe,useDebugValue:Be,useResponder:ue,useDeferredValue:function(a,b){var c=xe(a),d=c[0],e=c[1];eh(function(){var c=X.suspense;X.suspense=void 0===b?null:b;try{e(a)}finally{X.suspense=c}},[a,b]);return d},useTransition:function(a){var b= +xe(!1),c=b[0];b=b[1];return[ih(Ce.bind(null,b,a),[b,a]),c]}},ej={readContext:W,useCallback:Yc,useContext:W,useEffect:Xc,useImperativeHandle:hh,useLayoutEffect:fh,useMemo:jh,useReducer:Vc,useRef:dh,useState:function(a){return Vc(Ua)},useDebugValue:Be,useResponder:ue,useDeferredValue:function(a,b){var c=Vc(Ua),d=c[0],e=c[1];Xc(function(){var c=X.suspense;X.suspense=void 0===b?null:b;try{e(a)}finally{X.suspense=c}},[a,b]);return d},useTransition:function(a){var b=Vc(Ua),c=b[0];b=b[1];return[Yc(Ce.bind(null, +b,a),[b,a]),c]}},fj={readContext:W,useCallback:Yc,useContext:W,useEffect:Xc,useImperativeHandle:hh,useLayoutEffect:fh,useMemo:jh,useReducer:Wc,useRef:dh,useState:function(a){return Wc(Ua)},useDebugValue:Be,useResponder:ue,useDeferredValue:function(a,b){var c=Wc(Ua),d=c[0],e=c[1];Xc(function(){var c=X.suspense;X.suspense=void 0===b?null:b;try{e(a)}finally{X.suspense=c}},[a,b]);return d},useTransition:function(a){var b=Wc(Ua),c=b[0];b=b[1];return[Yc(Ce.bind(null,b,a),[b,a]),c]}},ra=null,Ka=null,Wa= +!1,gj=da.ReactCurrentOwner,ia=!1,Je={dehydrated:null,retryTime:0};var jj=function(a,b,c,d){for(c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};var wh=function(a){};var ij=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){var g=b.stateNode;Ta(ja.current);a=null;switch(c){case "input":f= +Cd(g,f);d=Cd(g,d);a=[];break;case "option":f=Fd(g,f);d=Fd(g,d);a=[];break;case "select":f=M({},f,{value:void 0});d=M({},d,{value:void 0});a=[];break;case "textarea":f=Gd(g,f);d=Gd(g,d);a=[];break;default:"function"!==typeof f.onClick&&"function"===typeof d.onClick&&(g.onclick=uc)}Ud(c,d);var h,m;c=null;for(h in f)if(!d.hasOwnProperty(h)&&f.hasOwnProperty(h)&&null!=f[h])if("style"===h)for(m in g=f[h],g)g.hasOwnProperty(m)&&(c||(c={}),c[m]="");else"dangerouslySetInnerHTML"!==h&&"children"!==h&&"suppressContentEditableWarning"!== +h&&"suppressHydrationWarning"!==h&&"autoFocus"!==h&&(db.hasOwnProperty(h)?a||(a=[]):(a=a||[]).push(h,null));for(h in d){var k=d[h];g=null!=f?f[h]:void 0;if(d.hasOwnProperty(h)&&k!==g&&(null!=k||null!=g))if("style"===h)if(g){for(m in g)!g.hasOwnProperty(m)||k&&k.hasOwnProperty(m)||(c||(c={}),c[m]="");for(m in k)k.hasOwnProperty(m)&&g[m]!==k[m]&&(c||(c={}),c[m]=k[m])}else c||(a||(a=[]),a.push(h,c)),c=k;else"dangerouslySetInnerHTML"===h?(k=k?k.__html:void 0,g=g?g.__html:void 0,null!=k&&g!==k&&(a=a|| +[]).push(h,k)):"children"===h?g===k||"string"!==typeof k&&"number"!==typeof k||(a=a||[]).push(h,""+k):"suppressContentEditableWarning"!==h&&"suppressHydrationWarning"!==h&&(db.hasOwnProperty(h)?(null!=k&&oa(e,h),a||g===k||(a=[])):(a=a||[]).push(h,k))}c&&(a=a||[]).push("style",c);e=a;if(b.updateQueue=e)b.effectTag|=4}};var kj=function(a,b,c,d){c!==d&&(b.effectTag|=4)};var pj="function"===typeof WeakSet?WeakSet:Set,wj="function"===typeof WeakMap?WeakMap:Map,sj=Math.ceil,gd=da.ReactCurrentDispatcher, +Uh=da.ReactCurrentOwner,H=0,Ye=8,ca=16,ma=32,Xa=0,hd=1,Oh=2,ad=3,bd=4,Xe=5,p=H,U=null,t=null,P=0,F=Xa,id=null,ta=1073741823,Yb=1073741823,kd=null,Xb=0,jd=!1,Re=0,Ph=500,l=null,cd=!1,Se=null,La=null,ld=!1,Zb=null,$b=90,bb=null,ac=0,af=null,dd=0,Ja=function(a,b){if(50<ac)throw ac=0,af=null,Error(k(185));a=ed(a,b);if(null!==a){var c=Cc();1073741823===b?(p&Ye)!==H&&(p&(ca|ma))===H?Te(a):(V(a),p===H&&ha()):V(a);(p&4)===H||98!==c&&99!==c||(null===bb?bb=new Map([[a,b]]):(c=bb.get(a),(void 0===c||c>b)&&bb.set(a, +b)))}};var zj=function(a,b,c){var d=b.expirationTime;if(null!==a){var e=b.pendingProps;if(a.memoizedProps!==e||G.current)ia=!0;else{if(d<c){ia=!1;switch(b.tag){case 3:sh(b);Ee();break;case 5:bh(b);if(b.mode&4&&1!==c&&e.hidden)return b.expirationTime=b.childExpirationTime=1,null;break;case 1:N(b.type)&&Bc(b);break;case 4:se(b,b.stateNode.containerInfo);break;case 10:d=b.memoizedProps.value;e=b.type._context;y(Ic,e._currentValue);e._currentValue=d;break;case 13:if(null!==b.memoizedState){d=b.child.childExpirationTime; +if(0!==d&&d>=c)return th(a,b,c);y(D,D.current&1);b=sa(a,b,c);return null!==b?b.sibling:null}y(D,D.current&1);break;case 19:d=b.childExpirationTime>=c;if(0!==(a.effectTag&64)){if(d)return vh(a,b,c);b.effectTag|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null);y(D,D.current);if(!d)return null}return sa(a,b,c)}ia=!1}}else ia=!1;b.expirationTime=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;e=pb(b,B.current);rb(b,c);e=we(null, +b,d,a,e,c);b.effectTag|=1;if("object"===typeof e&&null!==e&&"function"===typeof e.render&&void 0===e.$$typeof){b.tag=1;b.memoizedState=null;b.updateQueue=null;if(N(d)){var f=!0;Bc(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;ne(b);var g=d.getDerivedStateFromProps;"function"===typeof g&&Lc(b,d,g,a);e.updater=Mc;b.stateNode=e;e._reactInternalFiber=b;pe(b,d,a,c);b=Ie(null,b,d,!0,f,c)}else b.tag=0,T(null,b,e,c),b=b.child;return b;case 16:a:{e=b.elementType;null!==a&&(a.alternate= +null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;ri(e);if(1!==e._status)throw e._result;e=e._result;b.type=e;f=b.tag=Gj(e);a=aa(e,a);switch(f){case 0:b=He(null,b,e,a,c);break a;case 1:b=rh(null,b,e,a,c);break a;case 11:b=nh(null,b,e,a,c);break a;case 14:b=oh(null,b,e,aa(e.type,a),d,c);break a}throw Error(k(306,e,""));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:aa(d,e),He(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:aa(d,e),rh(a,b,d,e,c); +case 3:sh(b);d=b.updateQueue;if(null===a||null===d)throw Error(k(282));d=b.pendingProps;e=b.memoizedState;e=null!==e?e.element:null;oe(a,b);Qb(b,d,null,c);d=b.memoizedState.element;if(d===e)Ee(),b=sa(a,b,c);else{if(e=b.stateNode.hydrate)Ka=kb(b.stateNode.containerInfo.firstChild),ra=b,e=Wa=!0;if(e)for(c=Fe(b,null,d,c),b.child=c;c;)c.effectTag=c.effectTag&-3|1024,c=c.sibling;else T(a,b,d,c),Ee();b=b.child}return b;case 5:return bh(b),null===a&&De(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps: +null,g=e.children,Yd(d,e)?g=null:null!==f&&Yd(d,f)&&(b.effectTag|=16),qh(a,b),b.mode&4&&1!==c&&e.hidden?(b.expirationTime=b.childExpirationTime=1,b=null):(T(a,b,g,c),b=b.child),b;case 6:return null===a&&De(b),null;case 13:return th(a,b,c);case 4:return se(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=wb(b,null,d,c):T(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:aa(d,e),nh(a,b,d,e,c);case 7:return T(a,b,b.pendingProps,c),b.child;case 8:return T(a, +b,b.pendingProps.children,c),b.child;case 12:return T(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;var h=b.type._context;y(Ic,h._currentValue);h._currentValue=f;if(null!==g)if(h=g.value,f=Qa(h,f)?0:("function"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0,0===f){if(g.children===e.children&&!G.current){b=sa(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var m=h.dependencies;if(null!== +m){g=h.child;for(var l=m.firstContext;null!==l;){if(l.context===d&&0!==(l.observedBits&f)){1===h.tag&&(l=Ea(c,null),l.tag=Jc,Fa(h,l));h.expirationTime<c&&(h.expirationTime=c);l=h.alternate;null!==l&&l.expirationTime<c&&(l.expirationTime=c);Sg(h.return,c);m.expirationTime<c&&(m.expirationTime=c);break}l=l.next}}else g=10===h.tag?h.type===b.type?null:h.child:h.child;if(null!==g)g.return=h;else for(g=h;null!==g;){if(g===b){g=null;break}h=g.sibling;if(null!==h){h.return=g.return;g=h;break}g=g.return}h= +g}T(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,f=b.pendingProps,d=f.children,rb(b,c),e=W(e,f.unstable_observedBits),d=d(e),b.effectTag|=1,T(a,b,d,c),b.child;case 14:return e=b.type,f=aa(e,b.pendingProps),f=aa(e.type,f),oh(a,b,e,f,d,c);case 15:return ph(a,b,b.type,b.pendingProps,d,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:aa(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),b.tag=1,N(d)?(a=!0,Bc(b)):a=!1,rb(b,c),Yg(b,d,e),pe(b,d,e,c),Ie(null, +b,d,!0,a,c);case 19:return vh(a,b,c)}throw Error(k(156,b.tag));};var bf=null,Ne=null,la=function(a,b,c,d){return new Fj(a,b,c,d)};ef.prototype.render=function(a){md(a,this._internalRoot,null,null)};ef.prototype.unmount=function(){var a=this._internalRoot,b=a.containerInfo;md(null,a,null,function(){b[Lb]=null})};var Di=function(a){if(13===a.tag){var b=Fc(ka(),150,100);Ja(a,b);df(a,b)}};var Yf=function(a){13===a.tag&&(Ja(a,3),df(a,3))};var Bi=function(a){if(13===a.tag){var b=ka();b=Va(b,a,null);Ja(a, +b);df(a,b)}};sd=function(a,b,c){switch(b){case "input":Dd(a,c);b=c.name;if("radio"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll("input[name="+JSON.stringify(""+b)+'][type="radio"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=ae(d);if(!e)throw Error(k(90));Gf(d);Dd(d,e)}}}break;case "textarea":Lf(a,c);break;case "select":b=c.value,null!=b&&hb(a,!!c.multiple,b,!1)}};(function(a,b,c,d){ee=a;eg=b;vd=c;vf=d})(Qh,function(a,b,c,d,e){var f=p;p|=4; +try{return Da(98,a.bind(null,b,c,d,e))}finally{p=f,p===H&&ha()}},function(){(p&(1|ca|ma))===H&&(uj(),xb())},function(a,b){var c=p;p|=2;try{return a(b)}finally{p=c,p===H&&ha()}});var mk={Events:[Hb,Pa,ae,pf,qd,lb,function(a){Kd(a,Ki)},sf,tf,sc,pc,xb,{current:!1}]};(function(a){var b=a.findFiberByHostInstance;return Ej(M({},a,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:da.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=Sf(a); +return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null}))})({findFiberByHostInstance:Bb,bundleType:0,version:"16.13.1",rendererPackageName:"react-dom"});I.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=mk;I.createPortal=Xh;I.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternalFiber;if(void 0=== +b){if("function"===typeof a.render)throw Error(k(188));throw Error(k(268,Object.keys(a)));}a=Sf(b);a=null===a?null:a.stateNode;return a};I.flushSync=function(a,b){if((p&(ca|ma))!==H)throw Error(k(187));var c=p;p|=1;try{return Da(99,a.bind(null,b))}finally{p=c,ha()}};I.hydrate=function(a,b,c){if(!bc(b))throw Error(k(200));return nd(null,a,b,!0,c)};I.render=function(a,b,c){if(!bc(b))throw Error(k(200));return nd(null,a,b,!1,c)};I.unmountComponentAtNode=function(a){if(!bc(a))throw Error(k(40));return a._reactRootContainer? +(Rh(function(){nd(null,null,a,!1,function(){a._reactRootContainer=null;a[Lb]=null})}),!0):!1};I.unstable_batchedUpdates=Qh;I.unstable_createPortal=function(a,b){return Xh(a,b,2<arguments.length&&void 0!==arguments[2]?arguments[2]:null)};I.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!bc(c))throw Error(k(200));if(null==a||void 0===a._reactInternalFiber)throw Error(k(38));return nd(a,b,c,!1,d)};I.version="16.13.1"}); diff --git a/browser/components/newtab/vendor/react.js b/browser/components/newtab/vendor/react.js index 2d9fb9aa29b70e3dcb76226be90a83ce57aa6e71..a6338f8b62751a3341b256610047dbf6167eefb5 100644 --- a/browser/components/newtab/vendor/react.js +++ b/browser/components/newtab/vendor/react.js @@ -1,4 +1,4 @@ -/** @license React v16.12.0 +/** @license React v16.13.1 * react.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. @@ -6,27 +6,27 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -'use strict';(function(v,m){"object"===typeof exports&&"undefined"!==typeof module?module.exports=m():"function"===typeof define&&define.amd?define(m):v.React=m()})(this,function(){function v(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c<arguments.length;c++)b+="&args[]="+encodeURIComponent(arguments[c]);return"Minified React error #"+a+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function m(a, -b,c){this.props=a;this.context=b;this.refs=da;this.updater=c||ea}function fa(){}function M(a,b,c){this.props=a;this.context=b;this.refs=da;this.updater=c||ea}function ha(a,b,c){var d,e={},p=null,f=null;if(null!=b)for(d in void 0!==b.ref&&(f=b.ref),void 0!==b.key&&(p=""+b.key),b)ia.call(b,d)&&!ja.hasOwnProperty(d)&&(e[d]=b[d]);var g=arguments.length-2;if(1===g)e.children=c;else if(1<g){for(var k=Array(g),h=0;h<g;h++)k[h]=arguments[h+2];e.children=k}if(a&&a.defaultProps)for(d in g=a.defaultProps,g)void 0=== -e[d]&&(e[d]=g[d]);return{$$typeof:y,type:a,key:p,ref:f,props:e,_owner:N.current}}function wa(a,b){return{$$typeof:y,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return"object"===typeof a&&null!==a&&a.$$typeof===y}function xa(a){var b={"=":"=0",":":"=2"};return"$"+(""+a).replace(/[=:]/g,function(a){return b[a]})}function ka(a,b,c,d){if(D.length){var e=D.pop();e.result=a;e.keyPrefix=b;e.func=c;e.context=d;e.count=0;return e}return{result:a,keyPrefix:b,func:c,context:d,count:0}} -function la(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>D.length&&D.push(a)}function P(a,b,c,d){var e=typeof a;if("undefined"===e||"boolean"===e)a=null;var p=!1;if(null===a)p=!0;else switch(e){case "string":case "number":p=!0;break;case "object":switch(a.$$typeof){case y:case ya:p=!0}}if(p)return c(d,a,""===b?"."+Q(a,0):b),1;p=0;b=""===b?".":b+":";if(Array.isArray(a))for(var f=0;f<a.length;f++){e=a[f];var g=b+Q(e,f);p+=P(e,g,c,d)}else if(null===a||"object"!==typeof a? -g=null:(g=ma&&a[ma]||a["@@iterator"],g="function"===typeof g?g:null),"function"===typeof g)for(a=g.call(a),f=0;!(e=a.next()).done;)e=e.value,g=b+Q(e,f++),p+=P(e,g,c,d);else if("object"===e)throw c=""+a,Error(v(31,"[object Object]"===c?"object with keys {"+Object.keys(a).join(", ")+"}":c,""));return p}function R(a,b,c){return null==a?0:P(a,"",b,c)}function Q(a,b){return"object"===typeof a&&null!==a&&null!=a.key?xa(a.key):b.toString(36)}function za(a,b,c){a.func.call(a.context,b,a.count++)}function Aa(a, -b,c){var d=a.result,e=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?S(a,d,c,function(a){return a}):null!=a&&(O(a)&&(a=wa(a,e+(!a.key||b&&b.key===a.key?"":(""+a.key).replace(na,"$&/")+"/")+c)),d.push(a))}function S(a,b,c,d,e){var f="";null!=c&&(f=(""+c).replace(na,"$&/")+"/");b=ka(b,f,d,e);R(a,Aa,b);la(b)}function t(){var a=oa.current;if(null===a)throw Error(v(321));return a}function T(a,b){var c=a.length;a.push(b);a:for(;;){var d=Math.floor((c-1)/2),e=a[d];if(void 0!==e&&0<E(e, -b))a[d]=b,a[c]=e,c=d;else break a}}function n(a){a=a[0];return void 0===a?null:a}function F(a){var b=a[0];if(void 0!==b){var c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length;d<e;){var f=2*(d+1)-1,h=a[f],g=f+1,k=a[g];if(void 0!==h&&0>E(h,c))void 0!==k&&0>E(k,h)?(a[d]=k,a[g]=c,d=g):(a[d]=h,a[f]=c,d=f);else if(void 0!==k&&0>E(k,c))a[d]=k,a[g]=c,d=g;else break a}}return b}return null}function E(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}function G(a){for(var b=n(u);null!==b;){if(null=== -b.callback)F(u);else if(b.startTime<=a)F(u),b.sortIndex=b.expirationTime,T(q,b);else break;b=n(u)}}function U(a){z=!1;G(a);if(!w)if(null!==n(q))w=!0,A(V);else{var b=n(u);null!==b&&H(U,b.startTime-a)}}function V(a,b){w=!1;z&&(z=!1,W());I=!0;var c=h;try{G(b);for(l=n(q);null!==l&&(!(l.expirationTime>b)||a&&!X());){var d=l.callback;if(null!==d){l.callback=null;h=l.priorityLevel;var e=d(l.expirationTime<=b);b=r();"function"===typeof e?l.callback=e:l===n(q)&&F(q);G(b)}else F(q);l=n(q)}if(null!==l)var f= -!0;else{var m=n(u);null!==m&&H(U,m.startTime-b);f=!1}return f}finally{l=null,h=c,I=!1}}function pa(a){switch(a){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1E4;default:return 5E3}}var f="function"===typeof Symbol&&Symbol.for,y=f?Symbol.for("react.element"):60103,ya=f?Symbol.for("react.portal"):60106,x=f?Symbol.for("react.fragment"):60107,Y=f?Symbol.for("react.strict_mode"):60108,Ba=f?Symbol.for("react.profiler"):60114,Ca=f?Symbol.for("react.provider"):60109,Da=f?Symbol.for("react.context"): -60110,Ea=f?Symbol.for("react.forward_ref"):60112,Fa=f?Symbol.for("react.suspense"):60113;f&&Symbol.for("react.suspense_list");var Ga=f?Symbol.for("react.memo"):60115,Ha=f?Symbol.for("react.lazy"):60116;f&&Symbol.for("react.fundamental");f&&Symbol.for("react.responder");f&&Symbol.for("react.scope");var ma="function"===typeof Symbol&&Symbol.iterator,qa=Object.getOwnPropertySymbols,Ia=Object.prototype.hasOwnProperty,Ja=Object.prototype.propertyIsEnumerable,J=function(){try{if(!Object.assign)return!1; -var a=new String("abc");a[5]="de";if("5"===Object.getOwnPropertyNames(a)[0])return!1;var b={};for(a=0;10>a;a++)b["_"+String.fromCharCode(a)]=a;if("0123456789"!==Object.getOwnPropertyNames(b).map(function(a){return b[a]}).join(""))return!1;var c={};"abcdefghijklmnopqrst".split("").forEach(function(a){c[a]=a});return"abcdefghijklmnopqrst"!==Object.keys(Object.assign({},c)).join("")?!1:!0}catch(d){return!1}}()?Object.assign:function(a,b){if(null===a||void 0===a)throw new TypeError("Object.assign cannot be called with null or undefined"); -var c=Object(a);for(var d,e=1;e<arguments.length;e++){var f=Object(arguments[e]);for(var h in f)Ia.call(f,h)&&(c[h]=f[h]);if(qa){d=qa(f);for(var g=0;g<d.length;g++)Ja.call(f,d[g])&&(c[d[g]]=f[d[g]])}}return c},ea={isMounted:function(a){return!1},enqueueForceUpdate:function(a,b,c){},enqueueReplaceState:function(a,b,c,d){},enqueueSetState:function(a,b,c,d){}},da={};m.prototype.isReactComponent={};m.prototype.setState=function(a,b){if("object"!==typeof a&&"function"!==typeof a&&null!=a)throw Error(v(85)); -this.updater.enqueueSetState(this,a,b,"setState")};m.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,"forceUpdate")};fa.prototype=m.prototype;f=M.prototype=new fa;f.constructor=M;J(f,m.prototype);f.isPureReactComponent=!0;var oa={current:null},N={current:null},ia=Object.prototype.hasOwnProperty,ja={key:!0,ref:!0,__self:!0,__source:!0},na=/\/+/g,D=[],Z;if("undefined"===typeof window||"function"!==typeof MessageChannel){var B=null,ra=null,sa=function(){if(null!==B)try{var a= -r();B(!0,a);B=null}catch(b){throw setTimeout(sa,0),b;}},Ka=Date.now();var r=function(){return Date.now()-Ka};var A=function(a){null!==B?setTimeout(A,0,a):(B=a,setTimeout(sa,0))};var H=function(a,b){ra=setTimeout(a,b)};var W=function(){clearTimeout(ra)};var X=function(){return!1};f=Z=function(){}}else{var aa=window.performance,ta=window.Date,La=window.setTimeout,Ma=window.clearTimeout;"undefined"!==typeof console&&(f=window.cancelAnimationFrame,"function"!==typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"), -"function"!==typeof f&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"));if("object"===typeof aa&&"function"===typeof aa.now)r=function(){return aa.now()};else{var Na=ta.now();r=function(){return ta.now()-Na}}var K=!1,L=null,ba=-1,ua=5,va=0;X=function(){return r()>=va};f=function(){};Z=function(a){0>a||125<a?console.error("forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported"): -ua=0<a?Math.floor(1E3/a):5};var C=new MessageChannel,ca=C.port2;C.port1.onmessage=function(){if(null!==L){var a=r();va=a+ua;try{L(!0,a)?ca.postMessage(null):(K=!1,L=null)}catch(b){throw ca.postMessage(null),b;}}else K=!1};A=function(a){L=a;K||(K=!0,ca.postMessage(null))};H=function(a,b){ba=La(function(){a(r())},b)};W=function(){Ma(ba);ba=-1}}var q=[],u=[],Oa=1,l=null,h=3,I=!1,w=!1,z=!1,Pa=0;C={ReactCurrentDispatcher:oa,ReactCurrentOwner:N,IsSomeRendererActing:{current:!1},assign:J};J(C,{Scheduler:{unstable_ImmediatePriority:1, -unstable_UserBlockingPriority:2,unstable_NormalPriority:3,unstable_IdlePriority:5,unstable_LowPriority:4,unstable_runWithPriority:function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=h;h=a;try{return b()}finally{h=c}},unstable_next:function(a){switch(h){case 1:case 2:case 3:var b=3;break;default:b=h}var c=h;h=b;try{return a()}finally{h=c}},unstable_scheduleCallback:function(a,b,c){var d=r();if("object"===typeof c&&null!==c){var e=c.delay;e="number"===typeof e&&0<e?d+ -e:d;c="number"===typeof c.timeout?c.timeout:pa(a)}else c=pa(a),e=d;c=e+c;a={id:Oa++,callback:b,priorityLevel:a,startTime:e,expirationTime:c,sortIndex:-1};e>d?(a.sortIndex=e,T(u,a),null===n(q)&&a===n(u)&&(z?W():z=!0,H(U,e-d))):(a.sortIndex=c,T(q,a),w||I||(w=!0,A(V)));return a},unstable_cancelCallback:function(a){a.callback=null},unstable_wrapCallback:function(a){var b=h;return function(){var c=h;h=b;try{return a.apply(this,arguments)}finally{h=c}}},unstable_getCurrentPriorityLevel:function(){return h}, -unstable_shouldYield:function(){var a=r();G(a);var b=n(q);return b!==l&&null!==l&&null!==b&&null!==b.callback&&b.startTime<=a&&b.expirationTime<l.expirationTime||X()},unstable_requestPaint:f,unstable_continueExecution:function(){w||I||(w=!0,A(V))},unstable_pauseExecution:function(){},unstable_getFirstCallbackNode:function(){return n(q)},get unstable_now(){return r},get unstable_forceFrameRate(){return Z},unstable_Profiling:null},SchedulerTracing:{get __interactionsRef(){return null},get __subscriberRef(){return null}, -unstable_clear:function(a){return a()},unstable_getCurrent:function(){return null},unstable_getThreadID:function(){return++Pa},unstable_trace:function(a,b,c){return c()},unstable_wrap:function(a){return a},unstable_subscribe:function(a){},unstable_unsubscribe:function(a){}}});x={Children:{map:function(a,b,c){if(null==a)return a;var d=[];S(a,d,null,b,c);return d},forEach:function(a,b,c){if(null==a)return a;b=ka(null,null,b,c);R(a,za,b);la(b)},count:function(a){return R(a,function(){return null},null)}, -toArray:function(a){var b=[];S(a,b,null,function(a){return a});return b},only:function(a){if(!O(a))throw Error(v(143));return a}},createRef:function(){return{current:null}},Component:m,PureComponent:M,createContext:function(a,b){void 0===b&&(b=null);a={$$typeof:Da,_calculateChangedBits:b,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:Ca,_context:a};return a.Consumer=a},forwardRef:function(a){return{$$typeof:Ea,render:a}},lazy:function(a){return{$$typeof:Ha, -_ctor:a,_status:-1,_result:null}},memo:function(a,b){return{$$typeof:Ga,type:a,compare:void 0===b?null:b}},useCallback:function(a,b){return t().useCallback(a,b)},useContext:function(a,b){return t().useContext(a,b)},useEffect:function(a,b){return t().useEffect(a,b)},useImperativeHandle:function(a,b,c){return t().useImperativeHandle(a,b,c)},useDebugValue:function(a,b){},useLayoutEffect:function(a,b){return t().useLayoutEffect(a,b)},useMemo:function(a,b){return t().useMemo(a,b)},useReducer:function(a, -b,c){return t().useReducer(a,b,c)},useRef:function(a){return t().useRef(a)},useState:function(a){return t().useState(a)},Fragment:x,Profiler:Ba,StrictMode:Y,Suspense:Fa,createElement:ha,cloneElement:function(a,b,c){if(null===a||void 0===a)throw Error(v(267,a));var d=J({},a.props),e=a.key,f=a.ref,h=a._owner;if(null!=b){void 0!==b.ref&&(f=b.ref,h=N.current);void 0!==b.key&&(e=""+b.key);if(a.type&&a.type.defaultProps)var g=a.type.defaultProps;for(k in b)ia.call(b,k)&&!ja.hasOwnProperty(k)&&(d[k]=void 0=== -b[k]&&void 0!==g?g[k]:b[k])}var k=arguments.length-2;if(1===k)d.children=c;else if(1<k){g=Array(k);for(var l=0;l<k;l++)g[l]=arguments[l+2];d.children=g}return{$$typeof:y,type:a.type,key:e,ref:f,props:d,_owner:h}},createFactory:function(a){var b=ha.bind(null,a);b.type=a;return b},isValidElement:O,version:"16.12.0",__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:C};x=(Y={default:x},x)||Y;return x.default||x}); +'use strict';(function(d,r){"object"===typeof exports&&"undefined"!==typeof module?r(exports):"function"===typeof define&&define.amd?define(["exports"],r):(d=d||self,r(d.React={}))})(this,function(d){function r(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c<arguments.length;c++)b+="&args[]="+encodeURIComponent(arguments[c]);return"Minified React error #"+a+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."} +function w(a,b,c){this.props=a;this.context=b;this.refs=ba;this.updater=c||ca}function da(){}function L(a,b,c){this.props=a;this.context=b;this.refs=ba;this.updater=c||ca}function ea(a,b,c){var g,e={},fa=null,d=null;if(null!=b)for(g in void 0!==b.ref&&(d=b.ref),void 0!==b.key&&(fa=""+b.key),b)ha.call(b,g)&&!ia.hasOwnProperty(g)&&(e[g]=b[g]);var h=arguments.length-2;if(1===h)e.children=c;else if(1<h){for(var k=Array(h),f=0;f<h;f++)k[f]=arguments[f+2];e.children=k}if(a&&a.defaultProps)for(g in h=a.defaultProps, +h)void 0===e[g]&&(e[g]=h[g]);return{$$typeof:x,type:a,key:fa,ref:d,props:e,_owner:M.current}}function va(a,b){return{$$typeof:x,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function N(a){return"object"===typeof a&&null!==a&&a.$$typeof===x}function wa(a){var b={"=":"=0",":":"=2"};return"$"+(""+a).replace(/[=:]/g,function(a){return b[a]})}function ja(a,b,c,g){if(C.length){var e=C.pop();e.result=a;e.keyPrefix=b;e.func=c;e.context=g;e.count=0;return e}return{result:a,keyPrefix:b,func:c, +context:g,count:0}}function ka(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>C.length&&C.push(a)}function O(a,b,c,g){var e=typeof a;if("undefined"===e||"boolean"===e)a=null;var d=!1;if(null===a)d=!0;else switch(e){case "string":case "number":d=!0;break;case "object":switch(a.$$typeof){case x:case xa:d=!0}}if(d)return c(g,a,""===b?"."+P(a,0):b),1;d=0;b=""===b?".":b+":";if(Array.isArray(a))for(var f=0;f<a.length;f++){e=a[f];var h=b+P(e,f);d+=O(e,h,c,g)}else if(null===a|| +"object"!==typeof a?h=null:(h=la&&a[la]||a["@@iterator"],h="function"===typeof h?h:null),"function"===typeof h)for(a=h.call(a),f=0;!(e=a.next()).done;)e=e.value,h=b+P(e,f++),d+=O(e,h,c,g);else if("object"===e)throw c=""+a,Error(r(31,"[object Object]"===c?"object with keys {"+Object.keys(a).join(", ")+"}":c,""));return d}function Q(a,b,c){return null==a?0:O(a,"",b,c)}function P(a,b){return"object"===typeof a&&null!==a&&null!=a.key?wa(a.key):b.toString(36)}function ya(a,b,c){a.func.call(a.context,b, +a.count++)}function za(a,b,c){var g=a.result,e=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?R(a,g,c,function(a){return a}):null!=a&&(N(a)&&(a=va(a,e+(!a.key||b&&b.key===a.key?"":(""+a.key).replace(ma,"$&/")+"/")+c)),g.push(a))}function R(a,b,c,g,e){var d="";null!=c&&(d=(""+c).replace(ma,"$&/")+"/");b=ja(b,d,g,e);Q(a,za,b);ka(b)}function t(){var a=na.current;if(null===a)throw Error(r(321));return a}function S(a,b){var c=a.length;a.push(b);a:for(;;){var g=c-1>>>1,e=a[g];if(void 0!== +e&&0<D(e,b))a[g]=b,a[c]=e,c=g;else break a}}function n(a){a=a[0];return void 0===a?null:a}function E(a){var b=a[0];if(void 0!==b){var c=a.pop();if(c!==b){a[0]=c;a:for(var g=0,e=a.length;g<e;){var d=2*(g+1)-1,f=a[d],h=d+1,k=a[h];if(void 0!==f&&0>D(f,c))void 0!==k&&0>D(k,f)?(a[g]=k,a[h]=c,g=h):(a[g]=f,a[d]=c,g=d);else if(void 0!==k&&0>D(k,c))a[g]=k,a[h]=c,g=h;else break a}}return b}return null}function D(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}function F(a){for(var b=n(u);null!== +b;){if(null===b.callback)E(u);else if(b.startTime<=a)E(u),b.sortIndex=b.expirationTime,S(p,b);else break;b=n(u)}}function T(a){y=!1;F(a);if(!v)if(null!==n(p))v=!0,z(U);else{var b=n(u);null!==b&&G(T,b.startTime-a)}}function U(a,b){v=!1;y&&(y=!1,V());H=!0;var c=m;try{F(b);for(l=n(p);null!==l&&(!(l.expirationTime>b)||a&&!W());){var g=l.callback;if(null!==g){l.callback=null;m=l.priorityLevel;var e=g(l.expirationTime<=b);b=q();"function"===typeof e?l.callback=e:l===n(p)&&E(p);F(b)}else E(p);l=n(p)}if(null!== +l)var d=!0;else{var f=n(u);null!==f&&G(T,f.startTime-b);d=!1}return d}finally{l=null,m=c,H=!1}}function oa(a){switch(a){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1E4;default:return 5E3}}var f="function"===typeof Symbol&&Symbol.for,x=f?Symbol.for("react.element"):60103,xa=f?Symbol.for("react.portal"):60106,Aa=f?Symbol.for("react.fragment"):60107,Ba=f?Symbol.for("react.strict_mode"):60108,Ca=f?Symbol.for("react.profiler"):60114,Da=f?Symbol.for("react.provider"):60109, +Ea=f?Symbol.for("react.context"):60110,Fa=f?Symbol.for("react.forward_ref"):60112,Ga=f?Symbol.for("react.suspense"):60113,Ha=f?Symbol.for("react.memo"):60115,Ia=f?Symbol.for("react.lazy"):60116,la="function"===typeof Symbol&&Symbol.iterator,pa=Object.getOwnPropertySymbols,Ja=Object.prototype.hasOwnProperty,Ka=Object.prototype.propertyIsEnumerable,I=function(){try{if(!Object.assign)return!1;var a=new String("abc");a[5]="de";if("5"===Object.getOwnPropertyNames(a)[0])return!1;var b={};for(a=0;10>a;a++)b["_"+ +String.fromCharCode(a)]=a;if("0123456789"!==Object.getOwnPropertyNames(b).map(function(a){return b[a]}).join(""))return!1;var c={};"abcdefghijklmnopqrst".split("").forEach(function(a){c[a]=a});return"abcdefghijklmnopqrst"!==Object.keys(Object.assign({},c)).join("")?!1:!0}catch(g){return!1}}()?Object.assign:function(a,b){if(null===a||void 0===a)throw new TypeError("Object.assign cannot be called with null or undefined");var c=Object(a);for(var g,e=1;e<arguments.length;e++){var d=Object(arguments[e]); +for(var f in d)Ja.call(d,f)&&(c[f]=d[f]);if(pa){g=pa(d);for(var h=0;h<g.length;h++)Ka.call(d,g[h])&&(c[g[h]]=d[g[h]])}}return c},ca={isMounted:function(a){return!1},enqueueForceUpdate:function(a,b,c){},enqueueReplaceState:function(a,b,c,d){},enqueueSetState:function(a,b,c,d){}},ba={};w.prototype.isReactComponent={};w.prototype.setState=function(a,b){if("object"!==typeof a&&"function"!==typeof a&&null!=a)throw Error(r(85));this.updater.enqueueSetState(this,a,b,"setState")};w.prototype.forceUpdate= +function(a){this.updater.enqueueForceUpdate(this,a,"forceUpdate")};da.prototype=w.prototype;f=L.prototype=new da;f.constructor=L;I(f,w.prototype);f.isPureReactComponent=!0;var M={current:null},ha=Object.prototype.hasOwnProperty,ia={key:!0,ref:!0,__self:!0,__source:!0},ma=/\/+/g,C=[],na={current:null},X;if("undefined"===typeof window||"function"!==typeof MessageChannel){var A=null,qa=null,ra=function(){if(null!==A)try{var a=q();A(!0,a);A=null}catch(b){throw setTimeout(ra,0),b;}},La=Date.now();var q= +function(){return Date.now()-La};var z=function(a){null!==A?setTimeout(z,0,a):(A=a,setTimeout(ra,0))};var G=function(a,b){qa=setTimeout(a,b)};var V=function(){clearTimeout(qa)};var W=function(){return!1};f=X=function(){}}else{var Y=window.performance,sa=window.Date,Ma=window.setTimeout,Na=window.clearTimeout;"undefined"!==typeof console&&(f=window.cancelAnimationFrame,"function"!==typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"), +"function"!==typeof f&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"));if("object"===typeof Y&&"function"===typeof Y.now)q=function(){return Y.now()};else{var Oa=sa.now();q=function(){return sa.now()-Oa}}var J=!1,K=null,Z=-1,ta=5,ua=0;W=function(){return q()>=ua};f=function(){};X=function(a){0>a||125<a?console.error("forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported"): +ta=0<a?Math.floor(1E3/a):5};var B=new MessageChannel,aa=B.port2;B.port1.onmessage=function(){if(null!==K){var a=q();ua=a+ta;try{K(!0,a)?aa.postMessage(null):(J=!1,K=null)}catch(b){throw aa.postMessage(null),b;}}else J=!1};z=function(a){K=a;J||(J=!0,aa.postMessage(null))};G=function(a,b){Z=Ma(function(){a(q())},b)};V=function(){Na(Z);Z=-1}}var p=[],u=[],Pa=1,l=null,m=3,H=!1,v=!1,y=!1,Qa=0;B={ReactCurrentDispatcher:na,ReactCurrentOwner:M,IsSomeRendererActing:{current:!1},assign:I};I(B,{Scheduler:{__proto__:null, +unstable_ImmediatePriority:1,unstable_UserBlockingPriority:2,unstable_NormalPriority:3,unstable_IdlePriority:5,unstable_LowPriority:4,unstable_runWithPriority:function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=m;m=a;try{return b()}finally{m=c}},unstable_next:function(a){switch(m){case 1:case 2:case 3:var b=3;break;default:b=m}var c=m;m=b;try{return a()}finally{m=c}},unstable_scheduleCallback:function(a,b,c){var d=q();if("object"===typeof c&&null!==c){var e=c.delay; +e="number"===typeof e&&0<e?d+e:d;c="number"===typeof c.timeout?c.timeout:oa(a)}else c=oa(a),e=d;c=e+c;a={id:Pa++,callback:b,priorityLevel:a,startTime:e,expirationTime:c,sortIndex:-1};e>d?(a.sortIndex=e,S(u,a),null===n(p)&&a===n(u)&&(y?V():y=!0,G(T,e-d))):(a.sortIndex=c,S(p,a),v||H||(v=!0,z(U)));return a},unstable_cancelCallback:function(a){a.callback=null},unstable_wrapCallback:function(a){var b=m;return function(){var c=m;m=b;try{return a.apply(this,arguments)}finally{m=c}}},unstable_getCurrentPriorityLevel:function(){return m}, +unstable_shouldYield:function(){var a=q();F(a);var b=n(p);return b!==l&&null!==l&&null!==b&&null!==b.callback&&b.startTime<=a&&b.expirationTime<l.expirationTime||W()},unstable_requestPaint:f,unstable_continueExecution:function(){v||H||(v=!0,z(U))},unstable_pauseExecution:function(){},unstable_getFirstCallbackNode:function(){return n(p)},get unstable_now(){return q},get unstable_forceFrameRate(){return X},unstable_Profiling:null},SchedulerTracing:{__proto__:null,__interactionsRef:null,__subscriberRef:null, +unstable_clear:function(a){return a()},unstable_getCurrent:function(){return null},unstable_getThreadID:function(){return++Qa},unstable_trace:function(a,b,c){return c()},unstable_wrap:function(a){return a},unstable_subscribe:function(a){},unstable_unsubscribe:function(a){}}});d.Children={map:function(a,b,c){if(null==a)return a;var d=[];R(a,d,null,b,c);return d},forEach:function(a,b,c){if(null==a)return a;b=ja(null,null,b,c);Q(a,ya,b);ka(b)},count:function(a){return Q(a,function(){return null},null)}, +toArray:function(a){var b=[];R(a,b,null,function(a){return a});return b},only:function(a){if(!N(a))throw Error(r(143));return a}};d.Component=w;d.Fragment=Aa;d.Profiler=Ca;d.PureComponent=L;d.StrictMode=Ba;d.Suspense=Ga;d.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=B;d.cloneElement=function(a,b,c){if(null===a||void 0===a)throw Error(r(267,a));var d=I({},a.props),e=a.key,f=a.ref,m=a._owner;if(null!=b){void 0!==b.ref&&(f=b.ref,m=M.current);void 0!==b.key&&(e=""+b.key);if(a.type&&a.type.defaultProps)var h= +a.type.defaultProps;for(k in b)ha.call(b,k)&&!ia.hasOwnProperty(k)&&(d[k]=void 0===b[k]&&void 0!==h?h[k]:b[k])}var k=arguments.length-2;if(1===k)d.children=c;else if(1<k){h=Array(k);for(var l=0;l<k;l++)h[l]=arguments[l+2];d.children=h}return{$$typeof:x,type:a.type,key:e,ref:f,props:d,_owner:m}};d.createContext=function(a,b){void 0===b&&(b=null);a={$$typeof:Ea,_calculateChangedBits:b,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:Da,_context:a};return a.Consumer= +a};d.createElement=ea;d.createFactory=function(a){var b=ea.bind(null,a);b.type=a;return b};d.createRef=function(){return{current:null}};d.forwardRef=function(a){return{$$typeof:Fa,render:a}};d.isValidElement=N;d.lazy=function(a){return{$$typeof:Ia,_ctor:a,_status:-1,_result:null}};d.memo=function(a,b){return{$$typeof:Ha,type:a,compare:void 0===b?null:b}};d.useCallback=function(a,b){return t().useCallback(a,b)};d.useContext=function(a,b){return t().useContext(a,b)};d.useDebugValue=function(a,b){}; +d.useEffect=function(a,b){return t().useEffect(a,b)};d.useImperativeHandle=function(a,b,c){return t().useImperativeHandle(a,b,c)};d.useLayoutEffect=function(a,b){return t().useLayoutEffect(a,b)};d.useMemo=function(a,b){return t().useMemo(a,b)};d.useReducer=function(a,b,c){return t().useReducer(a,b,c)};d.useRef=function(a){return t().useRef(a)};d.useState=function(a){return t().useState(a)};d.version="16.13.1"}); diff --git a/browser/components/preferences/in-content/privacy.js b/browser/components/preferences/in-content/privacy.js index 45a46b01943863a81f0cd430ab57754e124896b4..4dbebfcddeafc05140992ddf0c38bd59edcc959b 100644 --- a/browser/components/preferences/in-content/privacy.js +++ b/browser/components/preferences/in-content/privacy.js @@ -1933,7 +1933,7 @@ var gPrivacyPane = { window, false ); - if (!loggedIn) { + if (!loggedIn.authenticated) { return; } } diff --git a/browser/components/protections/content/protections.css b/browser/components/protections/content/protections.css index b9c5d41ce326a7f027eb69a792479a26caf55e2d..9a5739163bf630a79902ff85fff607db90509d84 100644 --- a/browser/components/protections/content/protections.css +++ b/browser/components/protections/content/protections.css @@ -234,7 +234,7 @@ a.hidden, padding-inline: 24px 3px; -moz-context-properties: fill; fill: currentColor; - background: url("chrome://browser/skin/settings.svg") no-repeat 3px 3px; + background: url("chrome://browser/skin/settings.svg") no-repeat 3px; font-size: 0.75em; cursor: default; width: max-content; diff --git a/browser/components/urlbar/UrlbarInput.jsm b/browser/components/urlbar/UrlbarInput.jsm index d93c7429f46d285892654ee0d2230efaeea41f4c..91c24d3a9281229a6af7459c1fd0e008472a985f 100644 --- a/browser/components/urlbar/UrlbarInput.jsm +++ b/browser/components/urlbar/UrlbarInput.jsm @@ -321,7 +321,7 @@ class UrlbarInput { valid = true; } - let isDifferentValidValue = valid && value != this.value; + let isDifferentValidValue = valid && value != this.untrimmedValue; this.value = value; this.valueIsTyped = !valid; this.removeAttribute("usertyping"); @@ -786,6 +786,11 @@ class UrlbarInput { setValueFromResult(result = null, event = null) { let canonizedUrl; + // Usually this is set by a previous input event, but in certain cases, like + // when opening Top Sites on a loaded page, it wouldn't happen. To avoid + // confusing the user, we always enforce it when a result changes our value. + this.setPageProxyState("invalid", true); + if (!result) { // This usually happens when there's no selected results (the user cycles // through results and there was no heuristic), and we reset the input diff --git a/browser/components/urlbar/tests/browser/browser_top_sites.js b/browser/components/urlbar/tests/browser/browser_top_sites.js index 24d37537bc3cf2aa7f6c50a5e35e5756ad8d1b31..186907bfec9b701628529df4faf55990fed16309 100644 --- a/browser/components/urlbar/tests/browser/browser_top_sites.js +++ b/browser/components/urlbar/tests/browser/browser_top_sites.js @@ -43,6 +43,9 @@ add_task(async function topSitesShown() { "The test suite browser should have 6 Top Sites." ); await UrlbarTestUtils.promisePopupOpen(window, () => { + if (gURLBar.getAttribute("pageproxystate") == "invalid") { + gURLBar.handleRevert(); + } EventUtils.synthesizeMouseAtCenter(window.gURLBar.inputField, {}); }); Assert.ok(window.gURLBar.view.isOpen, "UrlbarView should be open."); @@ -87,6 +90,9 @@ add_task(async function selectSearchTopSite() { true ); await UrlbarTestUtils.promisePopupOpen(window, () => { + if (gURLBar.getAttribute("pageproxystate") == "invalid") { + gURLBar.handleRevert(); + } EventUtils.synthesizeMouseAtCenter(window.gURLBar.inputField, {}); }); await UrlbarTestUtils.promiseSearchComplete(window); @@ -150,6 +156,9 @@ add_task(async function topSitesBookmarksAndTabs() { ); await UrlbarTestUtils.promisePopupOpen(window, () => { + if (gURLBar.getAttribute("pageproxystate") == "invalid") { + gURLBar.handleRevert(); + } EventUtils.synthesizeMouseAtCenter(window.gURLBar.inputField, {}); }); Assert.ok(window.gURLBar.view.isOpen, "UrlbarView should be open."); @@ -189,6 +198,54 @@ add_task(async function topSitesBookmarksAndTabs() { }); }); +add_task(async function topSitesKeywordNavigationPageproxystate() { + Assert.equal( + gURLBar.getAttribute("pageproxystate"), + "valid", + "Sanity check initial state" + ); + + await UrlbarTestUtils.promisePopupOpen(window, () => { + if (gURLBar.getAttribute("pageproxystate") == "invalid") { + gURLBar.handleRevert(); + } + EventUtils.synthesizeMouseAtCenter(window.gURLBar.inputField, {}); + }); + Assert.ok(window.gURLBar.view.isOpen, "UrlbarView should be open."); + await UrlbarTestUtils.promiseSearchComplete(window); + + let count = UrlbarTestUtils.getResultCount(window); + Assert.equal(count, 7, "The number of results should be the expected one."); + + for (let i = 0; i < count; ++i) { + EventUtils.synthesizeKey("KEY_ArrowDown"); + Assert.equal( + gURLBar.getAttribute("pageproxystate"), + "invalid", + "Moving through results" + ); + } + for (let i = 0; i < count; ++i) { + EventUtils.synthesizeKey("KEY_ArrowUp"); + Assert.equal( + gURLBar.getAttribute("pageproxystate"), + "invalid", + "Moving through results" + ); + } + + // Double ESC should restore state. + await UrlbarTestUtils.promisePopupClose(window, () => { + EventUtils.synthesizeKey("KEY_Escape"); + }); + EventUtils.synthesizeKey("KEY_Escape"); + Assert.equal( + gURLBar.getAttribute("pageproxystate"), + "valid", + "Double ESC should restore state" + ); +}); + add_task(async function topSitesDisabled() { // Disable top sites. await SpecialPowers.pushPrefEnv({ @@ -205,6 +262,9 @@ add_task(async function topSitesDisabled() { // Open the view. await UrlbarTestUtils.promisePopupOpen(window, () => { + if (gURLBar.getAttribute("pageproxystate") == "invalid") { + gURLBar.handleRevert(); + } EventUtils.synthesizeMouseAtCenter(window.gURLBar.inputField, {}); }); Assert.ok(window.gURLBar.view.isOpen, "UrlbarView should be open."); diff --git a/browser/config/version_display.txt b/browser/config/version_display.txt index 097167986683139f9aee0a95641d8b3df7d77afc..e69b6d18e6d4e1724e5115e14e525040dd36a8d1 100644 --- a/browser/config/version_display.txt +++ b/browser/config/version_display.txt @@ -1 +1 @@ -76.0b1 +76.0b6 diff --git a/browser/extensions/formautofill/FormAutofillParent.jsm b/browser/extensions/formautofill/FormAutofillParent.jsm index 46f4b94140c9e2bed1651e586c6cd298b44691f1..e3a11481593a6f8c4822a62411d861ad78de9333 100644 --- a/browser/extensions/formautofill/FormAutofillParent.jsm +++ b/browser/extensions/formautofill/FormAutofillParent.jsm @@ -341,7 +341,7 @@ class FormAutofillParent extends JSWindowActorParent { break; } case "FormAutofill:SaveCreditCard": { - if (!(await FormAutofillUtils.ensureLoggedIn())) { + if (!(await FormAutofillUtils.ensureLoggedIn()).authenticated) { log.warn("User canceled encryption login"); return undefined; } @@ -690,7 +690,7 @@ class FormAutofillParent extends JSWindowActorParent { return; } - if (!(await FormAutofillUtils.ensureLoggedIn())) { + if (!(await FormAutofillUtils.ensureLoggedIn()).authenticated) { log.warn("User canceled encryption login"); return; } diff --git a/browser/installer/windows/nsis/shared.nsh b/browser/installer/windows/nsis/shared.nsh index b091d8fddfbeadfa0083218833e6f39760b61d79..ef40317486c9c6cef775d361a750f47718946039 100755 --- a/browser/installer/windows/nsis/shared.nsh +++ b/browser/installer/windows/nsis/shared.nsh @@ -506,6 +506,11 @@ ${EndIf} !macroend !define SetHandlers "!insertmacro SetHandlers" +!macro WriteApplicationsSupportedType RegKey Type + WriteRegStr ${RegKey} "Software\Classes\Applications\${FileMainEXE}\SupportedTypes" "${Type}" "" +!macroend +!define WriteApplicationsSupportedType "!insertmacro WriteApplicationsSupportedType" + ; Adds the HKLM\Software\Clients\StartMenuInternet\Firefox-[pathhash] registry ; entries (does not use SHCTX). ; @@ -605,20 +610,44 @@ ${EndIf} ; If we're going to create this key at all, we also need to list our supported ; file types in it, because otherwise we'll be shown as a suggestion for every ; single file type, whether we support it in any way or not. - WriteRegStr ${RegKey} "Software\Classes\Applications\${FileMainEXE}\SupportedTypes" \ - ".htm" "" - WriteRegStr ${RegKey} "Software\Classes\Applications\${FileMainEXE}\SupportedTypes" \ - ".html" "" - WriteRegStr ${RegKey} "Software\Classes\Applications\${FileMainEXE}\SupportedTypes" \ - ".shtml" "" - WriteRegStr ${RegKey} "Software\Classes\Applications\${FileMainEXE}\SupportedTypes" \ - ".xht" "" - WriteRegStr ${RegKey} "Software\Classes\Applications\${FileMainEXE}\SupportedTypes" \ - ".xhtml" "" - WriteRegStr ${RegKey} "Software\Classes\Applications\${FileMainEXE}\SupportedTypes" \ - ".svg" "" - WriteRegStr ${RegKey} "Software\Classes\Applications\${FileMainEXE}\SupportedTypes" \ - ".webp" "" + ; We take a more expansive approach to the set of file types registered + ; here compared to elsewhere because this key is interpreted by the OS as + ; containing every file type that we can possibly open, so if something + ; isn't listed it assumes we can't open it and hides us from e.g. the Open + ; With context menu, even if the user has tried to add us there manually. + ; The list here was derived from the file /layout/build/components.conf, + ; filtered down to only those types which make sense to open on their own + ; in Firefox, basically meaning that plain text file types were left out, + ; but not JSON or XML types because we have specific viewers for those. + ${WriteApplicationsSupportedType} ${RegKey} ".apng" + ${WriteApplicationsSupportedType} ${RegKey} ".bmp" + ${WriteApplicationsSupportedType} ${RegKey} ".flac" + ${WriteApplicationsSupportedType} ${RegKey} ".gif" + ${WriteApplicationsSupportedType} ${RegKey} ".htm" + ${WriteApplicationsSupportedType} ${RegKey} ".html" + ${WriteApplicationsSupportedType} ${RegKey} ".ico" + ${WriteApplicationsSupportedType} ${RegKey} ".jfif" + ${WriteApplicationsSupportedType} ${RegKey} ".jpeg" + ${WriteApplicationsSupportedType} ${RegKey} ".jpg" + ${WriteApplicationsSupportedType} ${RegKey} ".json" + ${WriteApplicationsSupportedType} ${RegKey} ".m4a" + ${WriteApplicationsSupportedType} ${RegKey} ".mp3" + ${WriteApplicationsSupportedType} ${RegKey} ".oga" + ${WriteApplicationsSupportedType} ${RegKey} ".ogg" + ${WriteApplicationsSupportedType} ${RegKey} ".ogv" + ${WriteApplicationsSupportedType} ${RegKey} ".opus" + ${WriteApplicationsSupportedType} ${RegKey} ".pdf" + ${WriteApplicationsSupportedType} ${RegKey} ".pjpeg" + ${WriteApplicationsSupportedType} ${RegKey} ".pjp" + ${WriteApplicationsSupportedType} ${RegKey} ".png" + ${WriteApplicationsSupportedType} ${RegKey} ".rdf" + ${WriteApplicationsSupportedType} ${RegKey} ".shtml" + ${WriteApplicationsSupportedType} ${RegKey} ".svg" + ${WriteApplicationsSupportedType} ${RegKey} ".webm" + ${WriteApplicationsSupportedType} ${RegKey} ".webp" + ${WriteApplicationsSupportedType} ${RegKey} ".xht" + ${WriteApplicationsSupportedType} ${RegKey} ".xhtml" + ${WriteApplicationsSupportedType} ${RegKey} ".xml" ${EndIf} !macroend !define SetStartMenuInternet "!insertmacro SetStartMenuInternet" diff --git a/browser/installer/windows/nsis/uninstaller.nsi b/browser/installer/windows/nsis/uninstaller.nsi index 16b9b1c7283473cbddb082492d42dbf2dc1e5b56..5b8e7c9d1703254f2bb6445ac8806c4d6827af59 100755 --- a/browser/installer/windows/nsis/uninstaller.nsi +++ b/browser/installer/windows/nsis/uninstaller.nsi @@ -460,7 +460,7 @@ Section "Uninstall" ; Uninstall the default browser agent scheduled task. ; This also removes the registry entries it creates. - Exec '"$INSTDIR\default-browser-agent.exe" unregister-task $AppUserModelID' + ExecWait '"$INSTDIR\default-browser-agent.exe" unregister-task $AppUserModelID' ${un.RemovePrecompleteEntries} "false" diff --git a/browser/locales/l10n-changesets.json b/browser/locales/l10n-changesets.json index f7e477f8b0c0466ff0c014fdcb326b6eaa0b981b..f065716542f5d210c3bbece25c6de531a5829076 100644 --- a/browser/locales/l10n-changesets.json +++ b/browser/locales/l10n-changesets.json @@ -14,7 +14,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "a8e73b9557fc" + "revision": "60ac15515db3" }, "af": { "platforms": [ @@ -31,7 +31,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "813d51f5f62e" + "revision": "9e536e74ce12" }, "an": { "platforms": [ @@ -48,7 +48,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "52bf37156a36" + "revision": "b9a24a96f788" }, "ar": { "platforms": [ @@ -65,7 +65,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "ae9f937c138e" + "revision": "471f0e44c311" }, "ast": { "platforms": [ @@ -82,7 +82,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "85ec2fa70911" + "revision": "8077f557a738" }, "az": { "platforms": [ @@ -99,7 +99,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "95288b2f9830" + "revision": "7ddb72fcaa23" }, "be": { "platforms": [ @@ -116,7 +116,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "bc58cd411a53" + "revision": "4160b1aa3405" }, "bg": { "platforms": [ @@ -133,7 +133,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "0b026cc5aaef" + "revision": "6a1d92e050cf" }, "bn": { "platforms": [ @@ -150,7 +150,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "7d09c80c97d9" + "revision": "5763bc876d44" }, "br": { "platforms": [ @@ -167,7 +167,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "80e7f4f6f20a" + "revision": "4a1851560bf1" }, "bs": { "platforms": [ @@ -184,7 +184,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "2492d7f5ea78" + "revision": "b5166857f653" }, "ca": { "platforms": [ @@ -201,7 +201,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "c358fb7c5a93" + "revision": "dce0366dd43d" }, "ca-valencia": { "platforms": [ @@ -218,7 +218,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "ea31957a0c35" + "revision": "d4cfce5f0199" }, "cak": { "platforms": [ @@ -235,7 +235,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "6efa849aa6f4" + "revision": "3b137bdd17d2" }, "cs": { "platforms": [ @@ -252,7 +252,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "c1e454141681" + "revision": "4ce7d7b8edb0" }, "cy": { "platforms": [ @@ -269,7 +269,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "f4e3fa995ef3" + "revision": "b1ebedf46a6a" }, "da": { "platforms": [ @@ -286,7 +286,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "03a2576e0b62" + "revision": "51d69cdac5ef" }, "de": { "platforms": [ @@ -303,7 +303,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "65df9763a30d" + "revision": "1299e3fd1372" }, "dsb": { "platforms": [ @@ -320,7 +320,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "487b957514d0" + "revision": "03284d710304" }, "el": { "platforms": [ @@ -337,7 +337,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "b856307f21f7" + "revision": "0fce8bf04d07" }, "en-CA": { "platforms": [ @@ -354,7 +354,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "7ee70da1246f" + "revision": "470e1baac9b9" }, "en-GB": { "platforms": [ @@ -371,7 +371,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "8a6cd5366bb4" + "revision": "f66463c44006" }, "eo": { "platforms": [ @@ -388,7 +388,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "9ba898797c9a" + "revision": "3d2c852d28b4" }, "es-AR": { "platforms": [ @@ -405,7 +405,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "9235862e2764" + "revision": "19b93bbde3d3" }, "es-CL": { "platforms": [ @@ -422,7 +422,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "6c920f8a5a84" + "revision": "e70b94142329" }, "es-ES": { "platforms": [ @@ -439,7 +439,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "ac5f8bc23aa0" + "revision": "a5796389eaf5" }, "es-MX": { "platforms": [ @@ -456,7 +456,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "7dc9ff27ee85" + "revision": "ce40075973db" }, "et": { "platforms": [ @@ -473,7 +473,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "a08596786389" + "revision": "adf3f128dc69" }, "eu": { "platforms": [ @@ -490,7 +490,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "c6d6b9cd7dcd" + "revision": "e0ecc5128dca" }, "fa": { "platforms": [ @@ -507,7 +507,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "3f3ae3689e76" + "revision": "1acedf644223" }, "ff": { "platforms": [ @@ -524,7 +524,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "fe1900462912" + "revision": "ee1438e2918e" }, "fi": { "platforms": [ @@ -541,7 +541,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "a0411378bb4c" + "revision": "bcafb6c221ea" }, "fr": { "platforms": [ @@ -558,7 +558,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "ecb6bbd84382" + "revision": "986ae59956a1" }, "fy-NL": { "platforms": [ @@ -575,7 +575,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "6fbe78d4acad" + "revision": "3f61217ce280" }, "ga-IE": { "platforms": [ @@ -592,7 +592,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "4c54dc829afd" + "revision": "a14f1e7b4089" }, "gd": { "platforms": [ @@ -609,7 +609,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "2439a0322ab1" + "revision": "e2e42c718a2b" }, "gl": { "platforms": [ @@ -626,7 +626,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "0055707aa718" + "revision": "48fda83a2a70" }, "gn": { "platforms": [ @@ -643,7 +643,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "d99e0018135b" + "revision": "cc9b3b4d8338" }, "gu-IN": { "platforms": [ @@ -660,7 +660,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "5861f91c9142" + "revision": "86b1098ae36c" }, "he": { "platforms": [ @@ -677,7 +677,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "ff0a4d49fc9f" + "revision": "db911a9ee52c" }, "hi-IN": { "platforms": [ @@ -694,7 +694,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "a05893948fbb" + "revision": "7144369af595" }, "hr": { "platforms": [ @@ -711,7 +711,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "c708a22fca65" + "revision": "ae4c238100eb" }, "hsb": { "platforms": [ @@ -728,7 +728,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "173d2211c5de" + "revision": "c18f01fcadf5" }, "hu": { "platforms": [ @@ -745,7 +745,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "a8517a2ebaf2" + "revision": "5d0dc98e1a01" }, "hy-AM": { "platforms": [ @@ -762,7 +762,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "1b612c698334" + "revision": "c19cf92ebc15" }, "ia": { "platforms": [ @@ -779,7 +779,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "531c78827fac" + "revision": "1066f6851a57" }, "id": { "platforms": [ @@ -796,7 +796,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "356331c9508f" + "revision": "f08b5b2476c6" }, "is": { "platforms": [ @@ -813,7 +813,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "a9d1dbe033f2" + "revision": "236b6c0a8114" }, "it": { "platforms": [ @@ -830,7 +830,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "4e2970abb9d0" + "revision": "783c4a702603" }, "ja": { "platforms": [ @@ -845,14 +845,14 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "0e0cf5d0042a" + "revision": "53409d1b9a80" }, "ja-JP-mac": { "platforms": [ "macosx64", "macosx64-devedition" ], - "revision": "5ea03acdb131" + "revision": "255210ef04a1" }, "ka": { "platforms": [ @@ -869,7 +869,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "9d650ef3f4f5" + "revision": "b6a95f8803cf" }, "kab": { "platforms": [ @@ -886,7 +886,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "f4d1d0c25912" + "revision": "e615a861b948" }, "kk": { "platforms": [ @@ -903,7 +903,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "068b291f689a" + "revision": "07814f160f73" }, "km": { "platforms": [ @@ -920,7 +920,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "ebe97e39b630" + "revision": "5ef756e32960" }, "kn": { "platforms": [ @@ -937,7 +937,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "07565ae6cb50" + "revision": "aa1fbdb56ea0" }, "ko": { "platforms": [ @@ -954,7 +954,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "c48fb21eea74" + "revision": "7434834dfd48" }, "lij": { "platforms": [ @@ -971,7 +971,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "1cf9e72f1dbb" + "revision": "f4d88de83247" }, "lt": { "platforms": [ @@ -988,7 +988,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "a881c91becb4" + "revision": "0b85f1ae3c3e" }, "lv": { "platforms": [ @@ -1005,7 +1005,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "a944366cc8f5" + "revision": "cecd28c90654" }, "mk": { "platforms": [ @@ -1022,7 +1022,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "48726fa78404" + "revision": "52b8f839cf6b" }, "mr": { "platforms": [ @@ -1039,7 +1039,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "3bb44a611e9a" + "revision": "c77e4468b4b4" }, "ms": { "platforms": [ @@ -1056,7 +1056,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "50773fdde329" + "revision": "1f033ed85e75" }, "my": { "platforms": [ @@ -1073,7 +1073,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "920d1a52038f" + "revision": "5382a4a7e330" }, "nb-NO": { "platforms": [ @@ -1090,7 +1090,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "3e958c33d216" + "revision": "eeb68f2d374c" }, "ne-NP": { "platforms": [ @@ -1107,7 +1107,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "8842f750206f" + "revision": "379acbb4fe75" }, "nl": { "platforms": [ @@ -1124,7 +1124,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "77c074fce875" + "revision": "f6ebedc73abc" }, "nn-NO": { "platforms": [ @@ -1141,7 +1141,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "81a8132db0ea" + "revision": "6343d32ad901" }, "oc": { "platforms": [ @@ -1158,7 +1158,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "c0ec97c9655e" + "revision": "11e89c9a9a15" }, "pa-IN": { "platforms": [ @@ -1175,7 +1175,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "4f7d85fda0af" + "revision": "3a9e0a35d655" }, "pl": { "platforms": [ @@ -1192,7 +1192,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "38dbb1c4aff5" + "revision": "d4ed5ed70d5d" }, "pt-BR": { "platforms": [ @@ -1209,7 +1209,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "8eaa154f3a30" + "revision": "6bb51095f3e0" }, "pt-PT": { "platforms": [ @@ -1226,7 +1226,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "ab07bfc80e7b" + "revision": "d778eafc508c" }, "rm": { "platforms": [ @@ -1243,7 +1243,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "5731c96c50e8" + "revision": "1834e92c1d81" }, "ro": { "platforms": [ @@ -1260,7 +1260,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "6fcc3b058bb4" + "revision": "cc8c351b64ca" }, "ru": { "platforms": [ @@ -1277,7 +1277,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "ad1c74cc8188" + "revision": "50ab49d57f5c" }, "si": { "platforms": [ @@ -1294,7 +1294,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "71e2e8c1aa83" + "revision": "b7a4c2aad443" }, "sk": { "platforms": [ @@ -1311,7 +1311,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "b268e4643355" + "revision": "df56fd163cad" }, "sl": { "platforms": [ @@ -1328,7 +1328,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "0264695cad75" + "revision": "850a439fcb8d" }, "son": { "platforms": [ @@ -1345,7 +1345,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "d6895ca679be" + "revision": "220a82ec364c" }, "sq": { "platforms": [ @@ -1362,7 +1362,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "a4762980152a" + "revision": "f188c24c537c" }, "sr": { "platforms": [ @@ -1379,7 +1379,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "c97eee9e13b9" + "revision": "3db79780f4f3" }, "sv-SE": { "platforms": [ @@ -1396,7 +1396,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "a027c730364f" + "revision": "f2f89a8d149b" }, "ta": { "platforms": [ @@ -1413,7 +1413,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "e46a33fb213c" + "revision": "95f68a6356dd" }, "te": { "platforms": [ @@ -1430,7 +1430,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "3654aac693b6" + "revision": "a0571be8190c" }, "th": { "platforms": [ @@ -1447,7 +1447,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "2602cd18b0bb" + "revision": "f9d7ccac9441" }, "tl": { "platforms": [ @@ -1464,7 +1464,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "427c9ee3a1ce" + "revision": "39794888c7b1" }, "tr": { "platforms": [ @@ -1481,7 +1481,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "621e71ae044f" + "revision": "b82a33db222c" }, "trs": { "platforms": [ @@ -1498,7 +1498,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "233b0f68a061" + "revision": "708276a44cf3" }, "uk": { "platforms": [ @@ -1515,7 +1515,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "91336afdb618" + "revision": "c805769b84b8" }, "ur": { "platforms": [ @@ -1532,7 +1532,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "e8c0879d04c6" + "revision": "45a100439fc9" }, "uz": { "platforms": [ @@ -1549,7 +1549,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "ef762dcbce1d" + "revision": "b98bac8f6c55" }, "vi": { "platforms": [ @@ -1566,7 +1566,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "336a342b9b1d" + "revision": "ddf89f86aa53" }, "xh": { "platforms": [ @@ -1583,7 +1583,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "1c9d19ddc8e3" + "revision": "a9b7f26ac216" }, "zh-CN": { "platforms": [ @@ -1600,7 +1600,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "e2dd4692a2cb" + "revision": "152a1bc43f0b" }, "zh-TW": { "platforms": [ @@ -1617,6 +1617,6 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "23b796922728" + "revision": "674289f83c58" } } \ No newline at end of file diff --git a/browser/themes/shared/browser.inc.css b/browser/themes/shared/browser.inc.css index 8a61b3a08afba400cd206ce658db84aac15ebfaa..3ddaaf3bd2c5c47e4de352f408e5322a73eb0904 100644 --- a/browser/themes/shared/browser.inc.css +++ b/browser/themes/shared/browser.inc.css @@ -61,7 +61,7 @@ #PersonalToolbar { overflow: -moz-hidden-unscrollable; max-height: 4em; - padding: 0 6px 2px; + padding: 2px 6px; } :root[uidensity=compact] #PersonalToolbar { diff --git a/browser/themes/shared/toolbarbuttons.inc.css b/browser/themes/shared/toolbarbuttons.inc.css index cc8d0205374655383059a5cf6a338bd278629a92..3c709cbaf288ed19cecddedbb5273692fc45e7fd 100644 --- a/browser/themes/shared/toolbarbuttons.inc.css +++ b/browser/themes/shared/toolbarbuttons.inc.css @@ -314,17 +314,17 @@ toolbar .toolbarbutton-1:-moz-focusring { toolbarbutton.bookmark-item:not(.subviewbutton) { margin: 0 2px; - padding: 2px 4px; + padding: 4px; -moz-appearance: none; } :root[uidensity=compact] toolbarbutton.bookmark-item:not(.subviewbutton) { - margin: 0 1px; - padding: 1px 4px; + margin-inline: 1px; + padding-block: 1px; } :root[uidensity=touch] toolbarbutton.bookmark-item:not(.subviewbutton) { - padding: 4px; + padding-block: 7px; } toolbarbutton.bookmark-item { diff --git a/browser/tools/mozscreenshots/permissionPrompts/browser.ini b/browser/tools/mozscreenshots/permissionPrompts/browser.ini index 65ce1a6fac754dcd1141a2fb3130364fc5847477..9a97184c738aeba5e3568640a47e37bc664ec647 100644 --- a/browser/tools/mozscreenshots/permissionPrompts/browser.ini +++ b/browser/tools/mozscreenshots/permissionPrompts/browser.ini @@ -2,6 +2,9 @@ subsuite = screenshots support-files = ../head.js - +prefs = + signon.testOnlyUserHasInteractedByPrefValue=true + signon.testOnlyUserHasInteractedWithDocument=true + [browser_permissionPrompts.js] skip-if = os == 'mac' # times out on macosx1014, see 1570098 diff --git a/build/defines.sh b/build/defines.sh index 9de47c446b5b0d6f4b4a152964d25d275f69c741..cf98c3d8bf726178b3f47b2fd4fbd850d265a073 100644 --- a/build/defines.sh +++ b/build/defines.sh @@ -1,3 +1,3 @@ # Define indicating that this build is prior to one of the early betas. To be # unset mid-way through the beta cycle. -EARLY_BETA_OR_EARLIER=1 +EARLY_BETA_OR_EARLIER= diff --git a/comm/.gecko_rev.yml b/comm/.gecko_rev.yml index 153e810c4c8229ec320fba50b692d2bc67dbd6d3..61f01e2ae7e4953877c32e83e09fe273d3ef753c 100644 --- a/comm/.gecko_rev.yml +++ b/comm/.gecko_rev.yml @@ -1,7 +1,8 @@ --- GECKO_BASE_REPOSITORY: https://hg.mozilla.org/mozilla-unified GECKO_HEAD_REPOSITORY: https://hg.mozilla.org/releases/mozilla-beta -GECKO_HEAD_REV: b4ef8571957b03316302e9dd21979a0d2612f648 +GECKO_HEAD_REF: FIREFOX_76_0b6_RELEASE +GECKO_HEAD_REV: d64d5ccf2b14498b6de0bb18c4e9e66abae5efce ### For comm-central # GECKO_BASE_REPOSITORY: https://hg.mozilla.org/mozilla-unified diff --git a/comm/chat/components/public/imIConversationsService.idl b/comm/chat/components/public/imIConversationsService.idl index 5a360a3578034fd69458ba9680f69a187ee807f4..12975b67c9cf18339607b2208bcb295b4f477777 100644 --- a/comm/chat/components/public/imIConversationsService.idl +++ b/comm/chat/components/public/imIConversationsService.idl @@ -16,12 +16,14 @@ interface imIConversation: prplIConversation { // Write a system message into the conversation. // Note: this will not be logged. - void systemMessage(in AUTF8String aMessage, [optional] in boolean aIsError); + void systemMessage(in AUTF8String aMessage, + [optional] in boolean aIsError, + [optional] in boolean aNoCollapse); // Write a system message into the conversation and trigger the udpate of the // notification counter during an off-the-record authentication request. // Note: this will not be logged. - void notificationOTR(in AUTF8String aMessage); + void notifyVerifyOTR(in AUTF8String aMessage); attribute prplIConversation target; diff --git a/comm/chat/components/public/prplIMessage.idl b/comm/chat/components/public/prplIMessage.idl index 034c60f3d4546990ee2eeeed4356f808629a6375..f4d5b19c46594ed84f667ac10875d42365dba33e 100644 --- a/comm/chat/components/public/prplIMessage.idl +++ b/comm/chat/components/public/prplIMessage.idl @@ -65,6 +65,8 @@ interface prplIMessage: nsISupports { readonly attribute boolean notification; /* PURPLE_MESSAGE_NO_LINKIFY = 0x4000 /**< Message should not be auto-linkified */ readonly attribute boolean noLinkification; + /* Do not collapse the message. */ + readonly attribute boolean noCollapse; /** * Get an array of actions the user may perform on this message. diff --git a/comm/chat/components/src/imConversations.jsm b/comm/chat/components/src/imConversations.jsm index bea430f749f729e959a788ce047456e7cc2c43c5..f53b64ea803cf4dadf8b3c027073ee68ad6e7ca0 100644 --- a/comm/chat/components/src/imConversations.jsm +++ b/comm/chat/components/src/imConversations.jsm @@ -114,6 +114,9 @@ imMessage.prototype = { get noLinkification() { return this.prplMessage.noLinkification; }, + get noCollapse() { + return this.prplMessage.noCollapse; + }, get originalMessage() { return this.prplMessage.originalMessage; }, @@ -445,14 +448,25 @@ UIConversation.prototype = { this.notifyObservers(aSubject, aTopic, aData); }, - systemMessage(aText, aIsError) { - let flags = { system: true, noLog: true, error: !!aIsError }; + systemMessage(aText, aIsError, aNoCollapse) { + let flags = { + system: true, + noLog: true, + error: !!aIsError, + noCollapse: !!aNoCollapse, + }; new Message("system", aText, flags).conversation = this; }, - notificationOTR(aText) { + /** + * Emit a notification sound for a new chat message and trigger the + * global notificationbox to prompt the user with the verifiation request. + * + * @param String aText - The system message. + */ + notifyVerifyOTR(aText) { this._unreadOTRNotificationCount++; - this.systemMessage(aText); + this.systemMessage(aText, false, true); for (let observer of this._observers) { observer.observe( this, diff --git a/comm/chat/modules/OTR.jsm b/comm/chat/modules/OTR.jsm index 32d28acfaa4568b5616a73154939ee877c095885..1b389e8f2a9f98f09585aeec0827e40efb9ff0e3 100644 --- a/comm/chat/modules/OTR.jsm +++ b/comm/chat/modules/OTR.jsm @@ -1136,7 +1136,7 @@ var OTR = { }, sendAlert(context, msg) { - this.getUIConvFromContext(context).systemMessage(msg); + this.getUIConvFromContext(context).systemMessage(msg, false, true); }, observe(aObject, aTopic, aMsg) { diff --git a/comm/chat/modules/OTRUI.jsm b/comm/chat/modules/OTRUI.jsm index c182342619c95fbfb8385981d51cfd579b467a52..f1237e170f8b2ae6f4ced92f184bd8c5ef68500b 100644 --- a/comm/chat/modules/OTRUI.jsm +++ b/comm/chat/modules/OTRUI.jsm @@ -331,7 +331,11 @@ var OTRUI = { }, sendSystemAlert(uiConv, conv, bundleId) { - uiConv.systemMessage(_strArgs(bundleId, { name: conv.normalizedName })); + uiConv.systemMessage( + _strArgs(bundleId, { name: conv.normalizedName }), + false, + true + ); }, setNotificationBox(notificationbox) { @@ -429,7 +433,7 @@ var OTRUI = { } else { msg = syncL10n.formatValueSync(id, { name: context.username }); } - uiConv.systemMessage(msg); + uiConv.systemMessage(msg, false, true); } } catch (e) { OTRUI.noOtrPossible(otrContainer, context); @@ -460,7 +464,9 @@ var OTRUI = { let uiConv = OTR.getUIConvFromContext(context); let trust = OTRUI.getTrustSettings(context); uiConv.systemMessage( - _strArgs("afterauth-" + trust.class, { name: context.username }) + _strArgs("afterauth-" + trust.class, { name: context.username }), + false, + true ); }, @@ -478,7 +484,7 @@ var OTRUI = { let name = uiConv.target.normalizedName; let msg = _strArgs("verify-request", { name }); // Trigger the udpate of the unread message counter. - uiConv.notificationOTR(msg); + uiConv.notifyVerifyOTR(msg); Services.obs.notifyObservers(uiConv, "new-otr-verification-request"); // Trigger the inline notification. diff --git a/comm/chat/modules/imThemes.jsm b/comm/chat/modules/imThemes.jsm index 051ec3d793ef2b535877b9b5646ce03d9c3aff81..f063e4cceacfea237f1777ea63b97d763ac6db2b 100644 --- a/comm/chat/modules/imThemes.jsm +++ b/comm/chat/modules/imThemes.jsm @@ -474,6 +474,9 @@ var statusMessageReplacements = { if (aMsg.noFormat) { msgClass.push("monospaced"); } + if (aMsg.noCollapse) { + msgClass.push("no-collapse"); + } return msgClass.join(" "); }, diff --git a/comm/chat/modules/jsProtoHelper.jsm b/comm/chat/modules/jsProtoHelper.jsm index c9b1fd8a7bfeb45decb352867659abbd46e08cc7..32d8f3bb6d42aa7d45902056015ac9295a4e084e 100644 --- a/comm/chat/modules/jsProtoHelper.jsm +++ b/comm/chat/modules/jsProtoHelper.jsm @@ -593,6 +593,7 @@ var GenericMessagePrototype = { containsImages: false, notification: false, noLinkification: false, + noCollapse: false, getActions() { return []; diff --git a/comm/mail/base/content/mailWindowOverlay.js b/comm/mail/base/content/mailWindowOverlay.js index d10f91afb838e71372a521b55d99c53152d39003..c846d3f2c1e3347fa5fad19b842c9433cec57c44 100644 --- a/comm/mail/base/content/mailWindowOverlay.js +++ b/comm/mail/base/content/mailWindowOverlay.js @@ -1501,7 +1501,13 @@ function populateHistoryMenu(menuPopup, isBackMenu) { ); var menuText = ""; - var msgHdr = messenger.msgHdrFromURI(historyArray[i]); + var msgHdr; + try { + msgHdr = messenger.msgHdrFromURI(historyArray[i]); + } catch (ex) { + // Let's just ignore this history entry. + continue; + } var msgSubject = msgHdr.mime2DecodedSubject; var msgAuthor = msgHdr.mime2DecodedAuthor; diff --git a/comm/mail/base/content/messenger.xhtml b/comm/mail/base/content/messenger.xhtml index d2aecac36eaf4d8bf06d5c4c91fd0bbca59176ba..176ad3c5cd304085f84507c55fcb7237652197b0 100644 --- a/comm/mail/base/content/messenger.xhtml +++ b/comm/mail/base/content/messenger.xhtml @@ -933,7 +933,10 @@ <!-- notificationbox will be added here lazily. --> </hbox> <statuspanel id="statusbar-display"/> - <hbox id="status-bar" class="statusbar chromeclass-status" role="status"> + <hbox id="status-bar" + class="statusbar chromeclass-status" + role="status" + aria-live="off"> #include mainStatusbar.inc.xhtml <hbox id="calendar-invitations-panel" class="statusbarpanel" diff --git a/comm/mail/components/extensions/ExtensionToolbarButtons.jsm b/comm/mail/components/extensions/ExtensionToolbarButtons.jsm index 394342f474b95f1b579b07c99b82241b5b34f5d5..e9aef44451e0c72fa28d0b6883727ce5c3fd203b 100644 --- a/comm/mail/components/extensions/ExtensionToolbarButtons.jsm +++ b/comm/mail/components/extensions/ExtensionToolbarButtons.jsm @@ -468,8 +468,13 @@ this.ToolbarButtonAPI = class extends ExtensionAPI { async updateOnChange(target) { if (target) { let window = Cu.getGlobalForObject(target); - if (target === window || target.selected) { + if (target === window) { await this.updateWindow(window); + } else { + let tabmail = window.document.getElementById("tabmail"); + if (tabmail && target == tabmail.selectedTab) { + await this.updateWindow(window); + } } } else { let promises = []; diff --git a/comm/mail/components/extensions/test/browser/browser_ext_browserAction_properties.js b/comm/mail/components/extensions/test/browser/browser_ext_browserAction_properties.js index 9827985b296a551eacffe6771f08bc9ad47707f1..cd31cb79182c6313bdc3417cda924711946ee525 100644 --- a/comm/mail/components/extensions/test/browser/browser_ext_browserAction_properties.js +++ b/comm/mail/components/extensions/test/browser/browser_ext_browserAction_properties.js @@ -33,7 +33,7 @@ add_task(async () => { browser.test.onMessage.removeListener(listener); resolve(); }); - browser.test.sendMessage("checkProperty", property, expected); + browser.test.sendMessage(whichTest, property, expected); }); } @@ -41,6 +41,8 @@ add_task(async () => { browser.test.assertEq(3, tabs.length); let tabIDs = tabs.map(t => t.id); + let whichTest = "checkProperty"; + await checkProperty("isEnabled", true, true, true, true); await browser.browserAction.disable(); await checkProperty("isEnabled", false, false, false, false); @@ -81,7 +83,55 @@ add_task(async () => { "default" ); - await browser.tabs.remove(tabIDs[0]); + // Check that properties are updated without switching tabs. We might be + // relying on the tab switch to update the properties. + + // Tab 0's enabled state doesn't reflect the default any more, so we + // can't just run the code above again. + + browser.test.log("checkPropertyCurrent"); + whichTest = "checkPropertyCurrent"; + + await checkProperty("isEnabled", true, false, true, true); + await browser.browserAction.disable(); + await checkProperty("isEnabled", false, false, false, false); + await browser.browserAction.enable(tabIDs[0]); + await checkProperty("isEnabled", false, true, false, false); + await browser.browserAction.enable(); + await checkProperty("isEnabled", true, true, true, true); + await browser.browserAction.disable(); + await checkProperty("isEnabled", false, true, false, false); + await browser.browserAction.disable(tabIDs[0]); + await checkProperty("isEnabled", false, false, false, false); + await browser.browserAction.enable(); + await checkProperty("isEnabled", true, false, true, true); + + await checkProperty( + "getTitle", + "default", + "default", + "default", + "default" + ); + await browser.browserAction.setTitle({ tabId: tabIDs[0], title: "tab0" }); + await checkProperty("getTitle", "default", "tab0", "default", "default"); + await browser.browserAction.setTitle({ title: "new" }); + await checkProperty("getTitle", "new", "tab0", "new", "new"); + await browser.browserAction.setTitle({ tabId: tabIDs[1], title: "tab1" }); + await checkProperty("getTitle", "new", "tab0", "tab1", "new"); + await browser.browserAction.setTitle({ tabId: tabIDs[0], title: null }); + await checkProperty("getTitle", "new", "new", "tab1", "new"); + await browser.browserAction.setTitle({ title: null }); + await checkProperty("getTitle", "default", "default", "tab1", "default"); + await browser.browserAction.setTitle({ tabId: tabIDs[1], title: null }); + await checkProperty( + "getTitle", + "default", + "default", + "default", + "default" + ); + await browser.tabs.remove(tabIDs[1]); await browser.tabs.remove(tabIDs[2]); browser.test.notifyPass("finished"); @@ -104,6 +154,7 @@ add_task(async () => { let mailTabs = tabmail.tabInfo; is(mailTabs.length, 3); + tabmail.switchToTab(mailTabs[0]); await extension.startup(); @@ -125,6 +176,21 @@ add_task(async () => { } } + tabmail.switchToTab(mailTabs[0]); + extension.sendMessage(); + }); + + extension.onMessage("checkPropertyCurrent", async (property, expected) => { + await new Promise(resolve => requestAnimationFrame(resolve)); + switch (property) { + case "isEnabled": + is(button.disabled, !expected[0], `button 0 enabled state`); + break; + case "getTitle": + is(button.getAttribute("label"), expected[0], `button 0 label`); + break; + } + extension.sendMessage(); }); diff --git a/comm/mail/components/im/messages/bubbles/main.css b/comm/mail/components/im/messages/bubbles/main.css index 6520757dddf406dc0dde7074366c5efe954c84ca..b9d82c109f82b96d18f89b42197acb47ff027d65 100644 --- a/comm/mail/components/im/messages/bubbles/main.css +++ b/comm/mail/components/im/messages/bubbles/main.css @@ -175,7 +175,7 @@ p *:any-link img { color: hsl(0, 0%, 60%); } -.hide-children > :-moz-any(p.event, hr):not(:first-of-type):not(:last-of-type) { +.hide-children > :-moz-any(p.event, hr):not(:first-of-type):not(:last-of-type):not(.no-collapse) { display: none; } diff --git a/comm/mail/components/im/messages/mail/main.css b/comm/mail/components/im/messages/mail/main.css index 9d4d2075cafaf5c1094bd1186eb8d48dc6aa2199..35131f2aab79384aef96d3b33f74dad3bd56a45b 100644 --- a/comm/mail/components/im/messages/mail/main.css +++ b/comm/mail/components/im/messages/mail/main.css @@ -132,7 +132,7 @@ p *:any-link img { color: GrayText; } -.hide-children > :-moz-any(p.event, hr):not(:first-of-type):not(:last-of-type) { +.hide-children > :-moz-any(p.event, hr):not(:first-of-type):not(:last-of-type):not(.no-collapse) { display: none; } diff --git a/comm/mail/components/preferences/general.inc.xhtml b/comm/mail/components/preferences/general.inc.xhtml index 4d23865cf46d5c0a6e143e5ddca3c41e576ab378..034e24894186fa3323b1317174af4346ac461d97 100644 --- a/comm/mail/components/preferences/general.inc.xhtml +++ b/comm/mail/components/preferences/general.inc.xhtml @@ -363,17 +363,19 @@ <separator class="thin"/> - <listheader equalsize="always"> - <treecol id="typeColumn" label="&typeColumn.label;" value="type" - accesskey="&typeColumn.accesskey;" persist="sortDirection" - flex="1" onclick="gGeneralPane.sort(event);" - sortDirection="ascending" sort="typeDescription"/> - <treecol id="actionColumn" label="&actionColumn2.label;" value="action" - accesskey="&actionColumn2.accesskey;" persist="sortDirection" - flex="1" onclick="gGeneralPane.sort(event);"/> - </listheader> - <richlistbox id="handlersView" height="180px" - preference="pref.downloads.disable_button.edit_actions"/> + <vbox> + <listheader equalsize="always"> + <treecol id="typeColumn" label="&typeColumn.label;" value="type" + accesskey="&typeColumn.accesskey;" persist="sortDirection" + flex="1" onclick="gGeneralPane.sort(event);" + sortDirection="ascending" sort="typeDescription"/> + <treecol id="actionColumn" label="&actionColumn2.label;" value="action" + accesskey="&actionColumn2.accesskey;" persist="sortDirection" + flex="1" onclick="gGeneralPane.sort(event);"/> + </listheader> + <richlistbox id="handlersView" height="180px" + preference="pref.downloads.disable_button.edit_actions"/> + </vbox> <separator class="thin"/> diff --git a/comm/mail/components/preferences/passwordManager.js b/comm/mail/components/preferences/passwordManager.js index 464f712bf8cc213073663f65ff9b79ab95c1d4e7..910a2b0a4c1932db080520ac2942a67c1370fdda 100644 --- a/comm/mail/components/preferences/passwordManager.js +++ b/comm/mail/components/preferences/passwordManager.js @@ -833,7 +833,7 @@ async function masterPasswordLogin(noPasswordCallback) { window, false ); - if (!loggedIn) { + if (!loggedIn.authenticated) { return false; } return true; diff --git a/comm/mail/components/preferences/privacy.js b/comm/mail/components/preferences/privacy.js index ef1871715c53f37476745f3be58d6c6ecf8a3e88..47ca9fe0c8732f57cb66d94b420399d064374ec2 100644 --- a/comm/mail/components/preferences/privacy.js +++ b/comm/mail/components/preferences/privacy.js @@ -352,7 +352,7 @@ var gPrivacyPane = { window, false ); - if (!loggedIn) { + if (!loggedIn.authenticated) { return; } } diff --git a/comm/mail/config/version_display.txt b/comm/mail/config/version_display.txt index 097167986683139f9aee0a95641d8b3df7d77afc..4c142d648b8f7c6ac1a888da038b7ff76b66b231 100644 --- a/comm/mail/config/version_display.txt +++ b/comm/mail/config/version_display.txt @@ -1 +1 @@ -76.0b1 +76.0b2 diff --git a/comm/mail/locales/l10n-changesets.json b/comm/mail/locales/l10n-changesets.json index 5a2520c41e4d31c052b5552d9348b9edabb91715..577d348b6853fd199237323c5b98a0ed25bf71b2 100644 --- a/comm/mail/locales/l10n-changesets.json +++ b/comm/mail/locales/l10n-changesets.json @@ -7,7 +7,7 @@ "win32", "win64" ], - "revision": "ae9f937c138e" + "revision": "471f0e44c311" }, "ast": { "platforms": [ @@ -17,7 +17,7 @@ "win32", "win64" ], - "revision": "85ec2fa70911" + "revision": "8077f557a738" }, "be": { "platforms": [ @@ -27,7 +27,7 @@ "win32", "win64" ], - "revision": "bc58cd411a53" + "revision": "ea559a223207" }, "bg": { "platforms": [ @@ -37,7 +37,7 @@ "win32", "win64" ], - "revision": "0b026cc5aaef" + "revision": "6a1d92e050cf" }, "br": { "platforms": [ @@ -47,7 +47,7 @@ "win32", "win64" ], - "revision": "80e7f4f6f20a" + "revision": "4a1851560bf1" }, "ca": { "platforms": [ @@ -57,7 +57,7 @@ "win32", "win64" ], - "revision": "c358fb7c5a93" + "revision": "56e335a7a9c3" }, "cak": { "platforms": [ @@ -67,7 +67,7 @@ "win32", "win64" ], - "revision": "6efa849aa6f4" + "revision": "3b137bdd17d2" }, "cs": { "platforms": [ @@ -77,7 +77,7 @@ "win32", "win64" ], - "revision": "c1e454141681" + "revision": "5472bffca437" }, "cy": { "platforms": [ @@ -87,7 +87,7 @@ "win32", "win64" ], - "revision": "f4e3fa995ef3" + "revision": "b1ebedf46a6a" }, "da": { "platforms": [ @@ -97,7 +97,7 @@ "win32", "win64" ], - "revision": "03a2576e0b62" + "revision": "f51dcb55b08f" }, "de": { "platforms": [ @@ -107,7 +107,7 @@ "win32", "win64" ], - "revision": "65df9763a30d" + "revision": "1299e3fd1372" }, "dsb": { "platforms": [ @@ -117,7 +117,7 @@ "win32", "win64" ], - "revision": "487b957514d0" + "revision": "03284d710304" }, "el": { "platforms": [ @@ -127,7 +127,7 @@ "win32", "win64" ], - "revision": "b856307f21f7" + "revision": "0fce8bf04d07" }, "en-GB": { "platforms": [ @@ -137,7 +137,7 @@ "win32", "win64" ], - "revision": "8a6cd5366bb4" + "revision": "f66463c44006" }, "es-AR": { "platforms": [ @@ -147,7 +147,7 @@ "win32", "win64" ], - "revision": "9235862e2764" + "revision": "19b93bbde3d3" }, "es-ES": { "platforms": [ @@ -157,7 +157,7 @@ "win32", "win64" ], - "revision": "ac5f8bc23aa0" + "revision": "7796746946f9" }, "et": { "platforms": [ @@ -167,7 +167,7 @@ "win32", "win64" ], - "revision": "a08596786389" + "revision": "adf3f128dc69" }, "eu": { "platforms": [ @@ -177,7 +177,7 @@ "win32", "win64" ], - "revision": "c6d6b9cd7dcd" + "revision": "84ae7e1ba981" }, "fi": { "platforms": [ @@ -187,7 +187,7 @@ "win32", "win64" ], - "revision": "8a5816e8fb4c" + "revision": "cda9a8b13087" }, "fr": { "platforms": [ @@ -197,7 +197,7 @@ "win32", "win64" ], - "revision": "ecb6bbd84382" + "revision": "e963c27cb8b1" }, "fy-NL": { "platforms": [ @@ -207,7 +207,7 @@ "win32", "win64" ], - "revision": "6fbe78d4acad" + "revision": "3f61217ce280" }, "ga-IE": { "platforms": [ @@ -217,7 +217,7 @@ "win32", "win64" ], - "revision": "4c54dc829afd" + "revision": "a14f1e7b4089" }, "gd": { "platforms": [ @@ -227,7 +227,7 @@ "win32", "win64" ], - "revision": "2439a0322ab1" + "revision": "e2e42c718a2b" }, "gl": { "platforms": [ @@ -237,7 +237,7 @@ "win32", "win64" ], - "revision": "0055707aa718" + "revision": "48fda83a2a70" }, "he": { "platforms": [ @@ -247,7 +247,7 @@ "win32", "win64" ], - "revision": "ff0a4d49fc9f" + "revision": "6dab8b8a3f99" }, "hr": { "platforms": [ @@ -257,7 +257,7 @@ "win32", "win64" ], - "revision": "c708a22fca65" + "revision": "ae4c238100eb" }, "hsb": { "platforms": [ @@ -267,7 +267,7 @@ "win32", "win64" ], - "revision": "173d2211c5de" + "revision": "641e796f2b83" }, "hu": { "platforms": [ @@ -277,7 +277,7 @@ "win32", "win64" ], - "revision": "a8517a2ebaf2" + "revision": "aa4a03cc6c76" }, "hy-AM": { "platforms": [ @@ -287,7 +287,7 @@ "win32", "win64" ], - "revision": "1b612c698334" + "revision": "ef88e370a28a" }, "id": { "platforms": [ @@ -297,7 +297,7 @@ "win32", "win64" ], - "revision": "356331c9508f" + "revision": "f08b5b2476c6" }, "is": { "platforms": [ @@ -307,7 +307,7 @@ "win32", "win64" ], - "revision": "a9d1dbe033f2" + "revision": "6e05fc06a401" }, "it": { "platforms": [ @@ -317,7 +317,7 @@ "win32", "win64" ], - "revision": "4e2970abb9d0" + "revision": "93f7c2db6104" }, "ja": { "platforms": [ @@ -326,13 +326,13 @@ "win32", "win64" ], - "revision": "0e0cf5d0042a" + "revision": "53409d1b9a80" }, "ja-JP-mac": { "platforms": [ "macosx64" ], - "revision": "5ea03acdb131" + "revision": "255210ef04a1" }, "ka": { "platforms": [ @@ -342,7 +342,7 @@ "win32", "win64" ], - "revision": "9d650ef3f4f5" + "revision": "b6a95f8803cf" }, "kab": { "platforms": [ @@ -352,7 +352,7 @@ "win32", "win64" ], - "revision": "f4d1d0c25912" + "revision": "c935fde54e6f" }, "kk": { "platforms": [ @@ -362,7 +362,7 @@ "win32", "win64" ], - "revision": "068b291f689a" + "revision": "484455adb06c" }, "ko": { "platforms": [ @@ -372,7 +372,7 @@ "win32", "win64" ], - "revision": "c48fb21eea74" + "revision": "15e10604c92e" }, "lt": { "platforms": [ @@ -382,7 +382,7 @@ "win32", "win64" ], - "revision": "a881c91becb4" + "revision": "350800636e69" }, "ms": { "platforms": [ @@ -392,7 +392,7 @@ "win32", "win64" ], - "revision": "50773fdde329" + "revision": "1f033ed85e75" }, "nb-NO": { "platforms": [ @@ -402,7 +402,7 @@ "win32", "win64" ], - "revision": "3e958c33d216" + "revision": "dac9950ba164" }, "nl": { "platforms": [ @@ -412,7 +412,7 @@ "win32", "win64" ], - "revision": "77c074fce875" + "revision": "f6ebedc73abc" }, "nn-NO": { "platforms": [ @@ -422,7 +422,7 @@ "win32", "win64" ], - "revision": "27f99013866a" + "revision": "b23848917fbb" }, "pl": { "platforms": [ @@ -432,7 +432,7 @@ "win32", "win64" ], - "revision": "38dbb1c4aff5" + "revision": "d4ed5ed70d5d" }, "pt-BR": { "platforms": [ @@ -442,7 +442,7 @@ "win32", "win64" ], - "revision": "8eaa154f3a30" + "revision": "6bb51095f3e0" }, "pt-PT": { "platforms": [ @@ -452,7 +452,7 @@ "win32", "win64" ], - "revision": "ab07bfc80e7b" + "revision": "d778eafc508c" }, "rm": { "platforms": [ @@ -462,7 +462,7 @@ "win32", "win64" ], - "revision": "5731c96c50e8" + "revision": "1834e92c1d81" }, "ro": { "platforms": [ @@ -472,7 +472,7 @@ "win32", "win64" ], - "revision": "6fcc3b058bb4" + "revision": "cc8c351b64ca" }, "ru": { "platforms": [ @@ -482,7 +482,7 @@ "win32", "win64" ], - "revision": "ad1c74cc8188" + "revision": "7d95425fd9fe" }, "si": { "platforms": [ @@ -492,7 +492,7 @@ "win32", "win64" ], - "revision": "71e2e8c1aa83" + "revision": "b7a4c2aad443" }, "sk": { "platforms": [ @@ -502,7 +502,7 @@ "win32", "win64" ], - "revision": "b268e4643355" + "revision": "9575fdeff158" }, "sl": { "platforms": [ @@ -512,7 +512,7 @@ "win32", "win64" ], - "revision": "0264695cad75" + "revision": "a0140b8874dc" }, "sq": { "platforms": [ @@ -522,7 +522,7 @@ "win32", "win64" ], - "revision": "a4762980152a" + "revision": "f188c24c537c" }, "sr": { "platforms": [ @@ -532,7 +532,7 @@ "win32", "win64" ], - "revision": "68aceb141b13" + "revision": "3db79780f4f3" }, "sv-SE": { "platforms": [ @@ -542,7 +542,7 @@ "win32", "win64" ], - "revision": "a027c730364f" + "revision": "338c76f278b5" }, "tr": { "platforms": [ @@ -552,7 +552,7 @@ "win32", "win64" ], - "revision": "621e71ae044f" + "revision": "b82a33db222c" }, "uk": { "platforms": [ @@ -562,7 +562,7 @@ "win32", "win64" ], - "revision": "91336afdb618" + "revision": "c805769b84b8" }, "uz": { "platforms": [ @@ -572,7 +572,7 @@ "win32", "win64" ], - "revision": "ef762dcbce1d" + "revision": "b98bac8f6c55" }, "vi": { "platforms": [ @@ -582,7 +582,7 @@ "win32", "win64" ], - "revision": "336a342b9b1d" + "revision": "2b0105602659" }, "zh-CN": { "platforms": [ @@ -592,7 +592,7 @@ "win32", "win64" ], - "revision": "e2dd4692a2cb" + "revision": "152a1bc43f0b" }, "zh-TW": { "platforms": [ @@ -602,6 +602,6 @@ "win32", "win64" ], - "revision": "23b796922728" + "revision": "674289f83c58" } } \ No newline at end of file diff --git a/config/recurse.mk b/config/recurse.mk index 9dbefebcd257895047c5d2e33ae0a2f62f7a4bca..38b3364078c2f8dd8242e43eb97d25b5b2344876 100644 --- a/config/recurse.mk +++ b/config/recurse.mk @@ -206,15 +206,11 @@ ifeq ($(MOZ_WIDGET_TOOLKIT),gtk) toolkit/library/target: widget/gtk/mozgtk/gtk3/target endif -ifeq ($(OS_ARCH), Linux) -ifneq ($(OS_TARGET), Android) +ifeq (,$(filter WINNT Darwin Android,$(OS_TARGET))) netwerk/test/http3server/target: security/nss/lib/nss/nss_nss3/target security/nss/lib/ssl/ssl_ssl3/target config/external/nspr/pr/target else netwerk/test/http3server/target: security/target endif -else -netwerk/test/http3server/target: security/target -endif # Most things are built during compile (target/host), but some things happen during export # Those need to depend on config/export for system wrappers. diff --git a/devtools/client/inspector/rules/views/text-property-editor.js b/devtools/client/inspector/rules/views/text-property-editor.js index 3aac0f2c49b77df8846b239519822396d65a84e6..5e38cd45c6163e097bd563f251df56ea4ece3a85 100644 --- a/devtools/client/inspector/rules/views/text-property-editor.js +++ b/devtools/client/inspector/rules/views/text-property-editor.js @@ -740,12 +740,12 @@ TextPropertyEditor.prototype = { updatePropertyState: function() { if (this.prop.enabled) { this.enable.style.removeProperty("visibility"); - this.enable.setAttribute("checked", ""); } else { this.enable.style.visibility = "visible"; - this.enable.removeAttribute("checked"); } + this.enable.checked = this.prop.enabled; + this.warning.title = !this.isNameValid() ? l10n("rule.warningName.title") : l10n("rule.warning.title"); @@ -926,13 +926,7 @@ TextPropertyEditor.prototype = { * Handles clicks on the disabled property. */ _onEnableChanged: function(event) { - const checked = this.enable.hasAttribute("checked"); - if (checked) { - this.enable.removeAttribute("checked"); - } else { - this.enable.setAttribute("checked", ""); - } - this.prop.setEnabled(!checked); + this.prop.setEnabled(this.enable.checked); event.stopPropagation(); this.telemetry.recordEvent("edit_rule", "ruleview", null, { session_id: this.toolbox.sessionId, diff --git a/devtools/client/netmonitor/src/utils/tooltips.js b/devtools/client/netmonitor/src/utils/tooltips.js index be3fdc67e957914ba2b53fb8dac27e6e10da252c..1f35346353fb74d84295e8e0a63547e12e34e4e7 100644 --- a/devtools/client/netmonitor/src/utils/tooltips.js +++ b/devtools/client/netmonitor/src/utils/tooltips.js @@ -5,12 +5,12 @@ "use strict"; /** - * Returns first 1024 characters of value for use as a tooltip. + * Returns first 128 characters of value for use as a tooltip. * @param object * @returns {*} */ function limitTooltipLength(object) { - return object.length > 1024 ? object.substring(0, 1024) + "…" : object; + return object.length > 128 ? object.substring(0, 128) + "…" : object; } module.exports = { diff --git a/devtools/client/netmonitor/test/browser_net_copy_as_curl.js b/devtools/client/netmonitor/test/browser_net_copy_as_curl.js index de09202b8d0858a9be97099c239fdc3113b53642..883771b3c8e2df253e2e1bae6f6d36d17a88470a 100644 --- a/devtools/client/netmonitor/test/browser_net_copy_as_curl.js +++ b/devtools/client/netmonitor/test/browser_net_copy_as_curl.js @@ -72,7 +72,7 @@ function buildTestData(QUOTE) { const COOKIE_PARTIAL_RESULT = [header("Cookie: bob=true; tom=cool")]; const POST_PARTIAL_RESULT = [ - "--data " + quote(POST_PAYLOAD), + "--data-raw " + quote(POST_PAYLOAD), header("Content-Type: text/plain;charset=UTF-8"), ]; const ORIGIN_RESULT = [header("Origin: http://example.com")]; diff --git a/devtools/client/netmonitor/test/browser_net_curl-utils.js b/devtools/client/netmonitor/test/browser_net_curl-utils.js index 8beeb8af1416f4076ee3fe37aed9494e93b031d3..4e73acaad6441d9a39f7ad37f70f1996dd672af7 100644 --- a/devtools/client/netmonitor/test/browser_net_curl-utils.js +++ b/devtools/client/netmonitor/test/browser_net_curl-utils.js @@ -142,25 +142,25 @@ function testWriteEmptyPostDataTextParams(data) { function testDataArgumentOnGeneratedCommand(data) { const curlCommand = Curl.generateCommand(data); ok( - curlCommand.includes("--data"), - "Should return a curl command with --data" + curlCommand.includes("--data-raw"), + "Should return a curl command with --data-raw" ); } function testDataEscapeOnGeneratedCommand(data) { - const paramsWin = `--data "{""param1"":""value1"",""param2"":""value2""}"`; - const paramsPosix = `--data '{"param1":"value1","param2":"value2"}'`; + const paramsWin = `--data-raw "{""param1"":""value1"",""param2"":""value2""}"`; + const paramsPosix = `--data-raw '{"param1":"value1","param2":"value2"}'`; let curlCommand = Curl.generateCommand(data, "WINNT"); ok( curlCommand.includes(paramsWin), - "Should return a curl command with --data escaped for Windows systems" + "Should return a curl command with --data-raw escaped for Windows systems" ); curlCommand = Curl.generateCommand(data, "Linux"); ok( curlCommand.includes(paramsPosix), - "Should return a curl command with --data escaped for Posix systems" + "Should return a curl command with --data-raw escaped for Posix systems" ); } diff --git a/devtools/client/shared/curl.js b/devtools/client/shared/curl.js index 32b2b57072cc71987fbee85801dcc482ba28b953..d9592ab6d453faac610e713dc6d9aaa0b4a64948 100644 --- a/devtools/client/shared/curl.js +++ b/devtools/client/shared/curl.js @@ -119,7 +119,7 @@ const Curl = { ["PUT", "POST", "PATCH"].includes(data.method) ) { postDataText = data.postDataText; - addPostData("--data"); + addPostData("--data-raw"); addPostData(utils.writePostDataTextParams(postDataText)); ignoredHeaders.add("content-length"); } diff --git a/devtools/client/shared/test/xpcshell/test_curl.js b/devtools/client/shared/test/xpcshell/test_curl.js index b6f90a0d575d697b7bcb28ca91969004bf8dd022..3c54e39db28483bf4563e8e423af271c04820c5b 100644 --- a/devtools/client/shared/test/xpcshell/test_curl.js +++ b/devtools/client/shared/test/xpcshell/test_curl.js @@ -81,6 +81,10 @@ add_task(async function() { "content-type header present in curl output" ); ok(!inParams(curlParams, "--data"), "no data param in GET curl output"); + ok( + !inParams(curlParams, "--data-raw"), + "no raw data param in GET curl output" + ); }); // Test `Curl.generateCommand` URL glob handling @@ -140,9 +144,12 @@ add_task(async function() { exactHeaderInParams(curlParams, "Content-Type: text/plain"), "content-type header present in curl output" ); - ok(inParams(curlParams, "--data"), '"--data" param present in curl output'); ok( - inParams(curlParams, `--data ${quote(request.postDataText)}`), + inParams(curlParams, "--data-raw"), + '"--data-raw" param present in curl output' + ); + ok( + inParams(curlParams, `--data-raw ${quote(request.postDataText)}`), "proper payload data present in output" ); }); diff --git a/dom/base/CustomElementRegistry.cpp b/dom/base/CustomElementRegistry.cpp index b03154ede0be741b0973ea2d828b13c8bbf8ea74..9f86f0e991f78e96ce8625c539485e1083587cae 100644 --- a/dom/base/CustomElementRegistry.cpp +++ b/dom/base/CustomElementRegistry.cpp @@ -182,7 +182,7 @@ void CustomElementData::AttachedInternals() { mIsAttachedInternals = true; } -CustomElementDefinition* CustomElementData::GetCustomElementDefinition() { +CustomElementDefinition* CustomElementData::GetCustomElementDefinition() const { // Per spec, if there is a definition, the custom element state should be // either "failed" (during upgrade) or "customized". MOZ_ASSERT_IF(mCustomElementDefinition, mState != State::eUndefined); @@ -492,6 +492,7 @@ CustomElementRegistry::CreateCustomElementCallback( return callback; } +// https://html.spec.whatwg.org/commit-snapshots/65f39c6fc0efa92b0b2b23b93197016af6ac0de6/#enqueue-a-custom-element-callback-reaction /* static */ void CustomElementRegistry::EnqueueLifecycleCallback( Document::ElementCallbackType aType, Element* aCustomElement, diff --git a/dom/base/CustomElementRegistry.h b/dom/base/CustomElementRegistry.h index cce28249b8790201bb0e676c0c2c925a141be5bb..7733dcd33355ec8d0ada69cff944cf8862485333 100644 --- a/dom/base/CustomElementRegistry.h +++ b/dom/base/CustomElementRegistry.h @@ -103,7 +103,7 @@ struct CustomElementData { AutoTArray<UniquePtr<CustomElementReaction>, 3> mReactionQueue; void SetCustomElementDefinition(CustomElementDefinition* aDefinition); - CustomElementDefinition* GetCustomElementDefinition(); + CustomElementDefinition* GetCustomElementDefinition() const; nsAtom* GetCustomElementType() const { return mType; } void AttachedInternals(); bool HasAttachedInternals() const { return mIsAttachedInternals; } diff --git a/dom/base/Element.cpp b/dom/base/Element.cpp index 7882474875e94036d34de93e8bb3a0d07ee2161f..e43e6090d1b8ac2c848cab684f5b3362b2e521c1 100644 --- a/dom/base/Element.cpp +++ b/dom/base/Element.cpp @@ -2322,31 +2322,34 @@ nsresult Element::SetAttrAndNotify( } } - CustomElementDefinition* definition = GetCustomElementDefinition(); - // Only custom element which is in `custom` state could get the - // CustomElementDefinition. - if (definition && definition->IsInObservedAttributeList(aName)) { - RefPtr<nsAtom> oldValueAtom; - if (oldValue) { - oldValueAtom = oldValue->GetAsAtom(); - } else { - // If there is no old value, get the value of the uninitialized - // attribute that was swapped with aParsedValue. - oldValueAtom = aParsedValue.GetAsAtom(); + const CustomElementData* data = GetCustomElementData(); + if (data && data->mState == CustomElementData::State::eCustom) { + CustomElementDefinition* definition = data->GetCustomElementDefinition(); + MOZ_ASSERT(definition, "Should have a valid CustomElementDefinition"); + + if (definition->IsInObservedAttributeList(aName)) { + RefPtr<nsAtom> oldValueAtom; + if (oldValue) { + oldValueAtom = oldValue->GetAsAtom(); + } else { + // If there is no old value, get the value of the uninitialized + // attribute that was swapped with aParsedValue. + oldValueAtom = aParsedValue.GetAsAtom(); + } + RefPtr<nsAtom> newValueAtom = valueForAfterSetAttr.GetAsAtom(); + nsAutoString ns; + nsContentUtils::NameSpaceManager()->GetNameSpaceURI(aNamespaceID, ns); + + LifecycleCallbackArgs args = {nsDependentAtomString(aName), + aModType == MutationEvent_Binding::ADDITION + ? VoidString() + : nsDependentAtomString(oldValueAtom), + nsDependentAtomString(newValueAtom), + (ns.IsEmpty() ? VoidString() : ns)}; + + nsContentUtils::EnqueueLifecycleCallback( + Document::eAttributeChanged, this, &args, nullptr, definition); } - RefPtr<nsAtom> newValueAtom = valueForAfterSetAttr.GetAsAtom(); - nsAutoString ns; - nsContentUtils::NameSpaceManager()->GetNameSpaceURI(aNamespaceID, ns); - - LifecycleCallbackArgs args = {nsDependentAtomString(aName), - aModType == MutationEvent_Binding::ADDITION - ? VoidString() - : nsDependentAtomString(oldValueAtom), - nsDependentAtomString(newValueAtom), - (ns.IsEmpty() ? VoidString() : ns)}; - - nsContentUtils::EnqueueLifecycleCallback(Document::eAttributeChanged, this, - &args, nullptr, definition); } if (aCallAfterSetAttr) { @@ -2514,19 +2517,22 @@ void Element::PostIdMaybeChange(int32_t aNamespaceID, nsAtom* aName, nsresult Element::OnAttrSetButNotChanged(int32_t aNamespaceID, nsAtom* aName, const nsAttrValueOrString& aValue, bool aNotify) { - // Only custom element which is in `custom` state could get the - // CustomElementDefinition. - CustomElementDefinition* definition = GetCustomElementDefinition(); - if (definition && definition->IsInObservedAttributeList(aName)) { - nsAutoString ns; - nsContentUtils::NameSpaceManager()->GetNameSpaceURI(aNamespaceID, ns); + const CustomElementData* data = GetCustomElementData(); + if (data && data->mState == CustomElementData::State::eCustom) { + CustomElementDefinition* definition = data->GetCustomElementDefinition(); + MOZ_ASSERT(definition, "Should have a valid CustomElementDefinition"); + + if (definition->IsInObservedAttributeList(aName)) { + nsAutoString ns; + nsContentUtils::NameSpaceManager()->GetNameSpaceURI(aNamespaceID, ns); - nsAutoString value(aValue.String()); - LifecycleCallbackArgs args = {nsDependentAtomString(aName), value, value, - (ns.IsEmpty() ? VoidString() : ns)}; + nsAutoString value(aValue.String()); + LifecycleCallbackArgs args = {nsDependentAtomString(aName), value, value, + (ns.IsEmpty() ? VoidString() : ns)}; - nsContentUtils::EnqueueLifecycleCallback(Document::eAttributeChanged, this, - &args, nullptr, definition); + nsContentUtils::EnqueueLifecycleCallback( + Document::eAttributeChanged, this, &args, nullptr, definition); + } } return NS_OK; @@ -2622,20 +2628,23 @@ nsresult Element::UnsetAttr(int32_t aNameSpaceID, nsAtom* aName, bool aNotify) { PostIdMaybeChange(aNameSpaceID, aName, nullptr); - CustomElementDefinition* definition = GetCustomElementDefinition(); - // Only custom element which is in `custom` state could get the - // CustomElementDefinition. - if (definition && definition->IsInObservedAttributeList(aName)) { - nsAutoString ns; - nsContentUtils::NameSpaceManager()->GetNameSpaceURI(aNameSpaceID, ns); + const CustomElementData* data = GetCustomElementData(); + if (data && data->mState == CustomElementData::State::eCustom) { + CustomElementDefinition* definition = data->GetCustomElementDefinition(); + MOZ_ASSERT(definition, "Should have a valid CustomElementDefinition"); + + if (definition->IsInObservedAttributeList(aName)) { + nsAutoString ns; + nsContentUtils::NameSpaceManager()->GetNameSpaceURI(aNameSpaceID, ns); - RefPtr<nsAtom> oldValueAtom = oldValue.GetAsAtom(); - LifecycleCallbackArgs args = { - nsDependentAtomString(aName), nsDependentAtomString(oldValueAtom), - VoidString(), (ns.IsEmpty() ? VoidString() : ns)}; + RefPtr<nsAtom> oldValueAtom = oldValue.GetAsAtom(); + LifecycleCallbackArgs args = { + nsDependentAtomString(aName), nsDependentAtomString(oldValueAtom), + VoidString(), (ns.IsEmpty() ? VoidString() : ns)}; - nsContentUtils::EnqueueLifecycleCallback(Document::eAttributeChanged, this, - &args, nullptr, definition); + nsContentUtils::EnqueueLifecycleCallback( + Document::eAttributeChanged, this, &args, nullptr, definition); + } } rv = AfterSetAttr(aNameSpaceID, aName, nullptr, &oldValue, nullptr, aNotify); diff --git a/dom/base/test/common_postMessages.js b/dom/base/test/common_postMessages.js index 71ac8cfc811844ef120504768ab8f06c871c9852..c7c16ee3b3588e9acb8b3028dc34584d5d1f9698 100644 --- a/dom/base/test/common_postMessages.js +++ b/dom/base/test/common_postMessages.js @@ -152,13 +152,19 @@ function create_wasmModule() { ok(WebAssembly, "WebAssembly object should exist"); ok(WebAssembly.compile, "WebAssembly.compile function should exist"); - const wasmTextToBinary = SpecialPowers.unwrap( - SpecialPowers.Cu.getJSTestingFunctions().wasmTextToBinary - ); - const fooModuleCode = wasmTextToBinary(`(module - (func $foo (result i32) (i32.const 42)) - (export "foo" (func $foo)) - )`); + /* + js -e ' + t = wasmTextToBinary(` + (module + (func $foo (result i32) (i32.const 42)) + (export "foo" (func $foo)) + ) + `); + print(t) + ' + */ + // eslint-disable-next-line + const fooModuleCode = new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,127,3,2,1,0,7,7,1,3,102,111,111,0,0,10,6,1,4,0,65,42,11,0,13,4,110,97,109,101,1,6,1,0,3,102,111,111]); WebAssembly.compile(fooModuleCode).then( m => { diff --git a/dom/clients/manager/ClientOpenWindowUtils.cpp b/dom/clients/manager/ClientOpenWindowUtils.cpp index 28a39b983435562010e183b33b5aac402a1af583..5633333e581b1285ece6bc9bba6946fe02f80d76 100644 --- a/dom/clients/manager/ClientOpenWindowUtils.cpp +++ b/dom/clients/manager/ClientOpenWindowUtils.cpp @@ -239,8 +239,9 @@ void OpenWindow(const ClientOpenWindowArgs& aArgs, BrowsingContext** aBC, aRv.ThrowTypeError("Unable to open window"); return; } - - rv = bwin->OpenURI(uri, nullptr, nsIBrowserDOMWindow::OPEN_DEFAULTWINDOW, + // annyG: This is a hack to fix bug 1622749. + // We will force to open new windows in tabs so we don't crash later. + rv = bwin->OpenURI(uri, nullptr, nsIBrowserDOMWindow::OPEN_NEWTAB, nsIBrowserDOMWindow::OPEN_NEW, principal, csp, aBC); if (NS_WARN_IF(NS_FAILED(rv))) { aRv.ThrowTypeError("Unable to open window"); diff --git a/dom/filehandle/ActorsParent.cpp b/dom/filehandle/ActorsParent.cpp index f1638736a63114a1f06900d8be558b32d04a6bbd..5cf6238b6b9b5fb98087f85f8ef14973d76f23d9 100644 --- a/dom/filehandle/ActorsParent.cpp +++ b/dom/filehandle/ActorsParent.cpp @@ -2137,6 +2137,25 @@ nsresult TruncateOp::DoFileWork(FileHandle* aFileHandle) { nsCOMPtr<nsISeekableStream> sstream = do_QueryInterface(mFileStream); MOZ_ASSERT(sstream); + if (mParams.offset()) { + nsCOMPtr<nsIFileMetadata> fileMetadata = do_QueryInterface(mFileStream); + MOZ_ASSERT(fileMetadata); + + int64_t size; + nsresult rv = fileMetadata->GetSize(&size); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + MOZ_ASSERT(size >= 0); + + if (mParams.offset() > static_cast<uint64_t>(size)) { + // Cannot extend the size of a file through truncate. + return NS_ERROR_DOM_INVALID_MODIFICATION_ERR; + } + } + + // XXX If we allowed truncate to extend the file size, we would to ensure that + // the quota limit is checked, e.g. by making FileQuotaStream override Seek. nsresult rv = sstream->Seek(nsISeekableStream::NS_SEEK_SET, mParams.offset()); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; diff --git a/dom/html/HTMLImageElement.cpp b/dom/html/HTMLImageElement.cpp index 4abcd3bae9a68ac9b387bb0b6373b994ab1c56e4..f137c2909a92f8081ec75d1cf5d4c3340a401b0c 100644 --- a/dom/html/HTMLImageElement.cpp +++ b/dom/html/HTMLImageElement.cpp @@ -86,7 +86,15 @@ class ImageLoadTask final : public MicroTaskRunnable { if (mElement->mPendingImageLoadTask == this) { mElement->mPendingImageLoadTask = nullptr; mElement->mUseUrgentStartForChannel = mUseUrgentStartForChannel; - mElement->LoadSelectedImage(true, true, mAlwaysLoad); + // Defer loading this image if loading="lazy" was set after this microtask + // was queued. + // NOTE: Using ShouldLoadImage() will violate the HTML standard spec + // because ShouldLoadImage() checks the document active state which should + // have done just once before this queue is created as per the spec, so + // we just check the lazy loading state here. + if (!mElement->IsLazyLoading()) { + mElement->LoadSelectedImage(true, true, mAlwaysLoad); + } } mDocument->UnblockOnload(false); } diff --git a/dom/html/HTMLImageElement.h b/dom/html/HTMLImageElement.h index 60347057077cd125774f36185e45539ecf558921..d6a9d6a300e2da88c1f024f569df12a6463bc541 100644 --- a/dom/html/HTMLImageElement.h +++ b/dom/html/HTMLImageElement.h @@ -197,6 +197,8 @@ class HTMLImageElement final : public nsGenericHTMLElement, return mLazyLoading || mPendingImageLoadTask; } + bool IsLazyLoading() const { return mLazyLoading; } + Loading LoadingState() const; already_AddRefed<Promise> Decode(ErrorResult& aRv); diff --git a/dom/indexedDB/IDBCursor.cpp b/dom/indexedDB/IDBCursor.cpp index 8ce4f636d63ebad66b20b2a139f26c149e80904b..05591540def5d3dfd05297bb57485ffb1a1f123a 100644 --- a/dom/indexedDB/IDBCursor.cpp +++ b/dom/indexedDB/IDBCursor.cpp @@ -828,19 +828,13 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_ADDREF_INHERITED(_subclassName, IDBCursor) \ NS_IMPL_RELEASE_INHERITED(_subclassName, IDBCursor) -#define NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_SUBCLASS(_subclassName) \ - NS_IMPL_CYCLE_COLLECTION_CLASS(_subclassName) \ +#define NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_SUBCLASS(_subclassName) \ + NS_IMPL_CYCLE_COLLECTION_MULTI_ZONE_JSHOLDER_CLASS(_subclassName) \ NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_SUBCLASS_METHODS(_subclassName) -#define NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_MULTI_ZONE_JSHOLDER_SUBCLASS( \ - _subclassName) \ - NS_IMPL_CYCLE_COLLECTION_MULTI_ZONE_JSHOLDER_CLASS(_subclassName) \ - NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_SUBCLASS_METHODS(_subclassName) - -NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_MULTI_ZONE_JSHOLDER_SUBCLASS( - IDBObjectStoreCursor) +NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_SUBCLASS(IDBObjectStoreCursor) NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_SUBCLASS(IDBObjectStoreKeyCursor) -NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_MULTI_ZONE_JSHOLDER_SUBCLASS(IDBIndexCursor) +NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_SUBCLASS(IDBIndexCursor) NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_SUBCLASS(IDBIndexKeyCursor) template <IDBCursor::Type CursorType> diff --git a/dom/indexedDB/test/file.js b/dom/indexedDB/test/file.js index 12e02a66e35cd321446e25a454c365235440217f..8089a541f06ae5052fd4d9494d34706c9c0eeca6 100644 --- a/dom/indexedDB/test/file.js +++ b/dom/indexedDB/test/file.js @@ -76,14 +76,6 @@ function getNullFile(name, size) { return getFile(name, "binary/null", getView(size)); } -// This needs to be async to make it available on workers too. -function getWasmBinary(text) { - let binary = getWasmBinarySync(text); - SimpleTest.executeSoon(function() { - testGenerator.next(binary); - }); -} - function getWasmModule(binary) { let module = new WebAssembly.Module(binary); return module; diff --git a/dom/indexedDB/test/helpers.js b/dom/indexedDB/test/helpers.js index be69207121fbb02fe291a3b348113a4395ad5fb8..f093aaaf3e4522b0b5cd21d0e7d81b2ae62977bd 100644 --- a/dom/indexedDB/test/helpers.js +++ b/dom/indexedDB/test/helpers.js @@ -357,23 +357,6 @@ function isWasmSupported() { return testingFunctions.wasmIsSupported(); } -function getWasmBinarySync(text) { - let testingFunctions = SpecialPowers.Cu.getJSTestingFunctions(); - let wasmTextToBinary = SpecialPowers.unwrap( - testingFunctions.wasmTextToBinary - ); - let binary = wasmTextToBinary(text); - return binary; -} - -// (Async versions to imitate the on-worker behavior where getWasmBinarySync is -// not available.) -function getWasmBinary(text) { - let binary = getWasmBinarySync(text); - SimpleTest.executeSoon(function() { - testGenerator.next(binary); - }); -} function getWasmModule(_binary_) { let module = new WebAssembly.Module(_binary_); return module; @@ -415,6 +398,7 @@ function expectingError(request, errorName) { return new Promise(function(resolve, reject) { request.onerror = function(event) { is(errorName, event.target.error.name, "Correct exception type"); + event.stopPropagation(); resolve(event); }; request.onsuccess = function(event) { @@ -671,14 +655,6 @@ function workerScript() { return self.wasmSupported; }; - self.getWasmBinarySync = function(_text_) { - self.ok(false, "This can't be used on workers"); - }; - - self.getWasmBinary = function(_text_) { - self.postMessage({ op: "getWasmBinary", text: _text_ }); - }; - self.getWasmModule = function(_binary_) { let module = new WebAssembly.Module(_binary_); return module; @@ -729,11 +705,6 @@ function workerScript() { } break; - case "getWasmBinaryDone": - info("Worker: get wasm binary done"); - testGenerator.next(message.wasmBinary); - break; - default: throw new Error( "Received a bad message from parent: " + JSON.stringify(message) @@ -846,13 +817,6 @@ async function executeWorkerTestAndCleanUp(testScriptPath) { }); break; - case "getWasmBinary": - worker.postMessage({ - op: "getWasmBinaryDone", - wasmBinary: getWasmBinarySync(message.text), - }); - break; - default: ok( false, diff --git a/dom/indexedDB/test/test_filehandle_truncate_exceptions.html b/dom/indexedDB/test/test_filehandle_truncate_exceptions.html index 847465577a50737636b691a466803bb7bcd18672..857859268b4f16d9ca7956036b1a55c5b0e7a475 100644 --- a/dom/indexedDB/test/test_filehandle_truncate_exceptions.html +++ b/dom/indexedDB/test/test_filehandle_truncate_exceptions.html @@ -27,6 +27,14 @@ info("Expecting TypeError on truncating to a negative length that converts to UINT64_MAX implicitly"); let message = assertThrowsInstanceOf(() => { fileHandle.truncate(-1); }, TypeError); is(message, "IDBFileHandle.truncate: UINT64_MAX is not a valid size", "Correct message"); + + info ("Attempt to truncate to a size larger than the current size should fail."); + // XXX Expect a more specific error here? + await expectingError(fileHandle.truncate(10000000), "UnknownError"); + + info("Still the state should be consistent and we should be able to truncate to a valid size after this."); + // This wasn't always the case, see Bug 1626973 + await expectingSuccess(fileHandle.truncate(0)); } </script> <script type="text/javascript" src="file.js"></script> diff --git a/dom/indexedDB/test/unit/test_wasm_put_get_values.js b/dom/indexedDB/test/unit/test_wasm_put_get_values.js index 3d4062aafeafa8d260427e441c8192d4780a7c2e..d8463391018692b695e21d42244032ae582026e9 100644 --- a/dom/indexedDB/test/unit/test_wasm_put_get_values.js +++ b/dom/indexedDB/test/unit/test_wasm_put_get_values.js @@ -19,8 +19,10 @@ function* testSteps() { return; } - getWasmBinary(`(module (func (export "run") (result i32) (i32.const 13)))`); - let binary = yield undefined; + // js -e 'print(wasmTextToBinary(`(module (func (export "run") (result i32) (i32.const 13)))`))' + // eslint-disable-next-line + let binary = new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,127,3,2,1,0,7,7,1,3,114,117,110,0,0,10,6,1,4,0,65,13,11]); + wasmData.value = getWasmModule(binary); info("Opening database"); diff --git a/dom/indexedDB/test/unit/xpcshell-head-parent-process.js b/dom/indexedDB/test/unit/xpcshell-head-parent-process.js index d5d438b20c8155a7d28b03b40a32b1e377976c7d..17e2913ceb4a8660ded43c686fca41e0d37ebc81 100644 --- a/dom/indexedDB/test/unit/xpcshell-head-parent-process.js +++ b/dom/indexedDB/test/unit/xpcshell-head-parent-process.js @@ -406,19 +406,6 @@ function isWasmSupported() { return testingFunctions.wasmIsSupported(); } -function getWasmBinarySync(text) { - let testingFunctions = Cu.getJSTestingFunctions(); - let binary = testingFunctions.wasmTextToBinary(text); - return binary; -} - -function getWasmBinary(text) { - let binary = getWasmBinarySync(text); - executeSoon(function() { - testGenerator.next(binary); - }); -} - function getWasmModule(binary) { let module = new WebAssembly.Module(binary); return module; diff --git a/dom/media/MediaManager.cpp b/dom/media/MediaManager.cpp index 9d0d1f77837610e2c027ed88eb302292571f3083..31004668460fc89c4be3f32e1bf831e846eb9dae 100644 --- a/dom/media/MediaManager.cpp +++ b/dom/media/MediaManager.cpp @@ -1899,6 +1899,7 @@ MediaManager::MediaManager(UniquePtr<base::Thread> aMediaThread) mPrefs.mAecOn = false; mPrefs.mUseAecMobile = false; mPrefs.mAgcOn = false; + mPrefs.mHPFOn = false; mPrefs.mNoiseOn = false; mPrefs.mExtendedFilter = true; mPrefs.mDelayAgnostic = true; @@ -1925,13 +1926,15 @@ MediaManager::MediaManager(UniquePtr<base::Thread> aMediaThread) } } LOG("%s: default prefs: %dx%d @%dfps, %dHz test tones, aec: %s," - "agc: %s, noise: %s, aec level: %d, agc level: %d, noise level: %d," + "agc: %s, hpf: %s, noise: %s, aec level: %d, agc level: %d, noise level: " + "%d," "%sfull_duplex, extended aec %s, delay_agnostic %s " "channels %d", __FUNCTION__, mPrefs.mWidth, mPrefs.mHeight, mPrefs.mFPS, mPrefs.mFreq, mPrefs.mAecOn ? "on" : "off", mPrefs.mAgcOn ? "on" : "off", - mPrefs.mNoiseOn ? "on" : "off", mPrefs.mAec, mPrefs.mAgc, mPrefs.mNoise, - mPrefs.mFullDuplex ? "" : "not ", mPrefs.mExtendedFilter ? "on" : "off", + mPrefs.mHPFOn ? "on" : "off", mPrefs.mNoiseOn ? "on" : "off", mPrefs.mAec, + mPrefs.mAgc, mPrefs.mNoise, mPrefs.mFullDuplex ? "" : "not ", + mPrefs.mExtendedFilter ? "on" : "off", mPrefs.mDelayAgnostic ? "on" : "off", mPrefs.mChannels); } @@ -2037,6 +2040,7 @@ MediaManager* MediaManager::Get() { prefs->AddObserver("media.getusermedia.aec", sSingleton, false); prefs->AddObserver("media.getusermedia.agc_enabled", sSingleton, false); prefs->AddObserver("media.getusermedia.agc", sSingleton, false); + prefs->AddObserver("media.getusermedia.hpf_enabled", sSingleton, false); prefs->AddObserver("media.getusermedia.noise_enabled", sSingleton, false); prefs->AddObserver("media.getusermedia.noise", sSingleton, false); prefs->AddObserver("media.ondevicechange.fakeDeviceChangeEvent.enabled", @@ -3477,6 +3481,7 @@ void MediaManager::GetPrefs(nsIPrefBranch* aBranch, const char* aData) { #ifdef MOZ_WEBRTC GetPrefBool(aBranch, "media.getusermedia.aec_enabled", aData, &mPrefs.mAecOn); GetPrefBool(aBranch, "media.getusermedia.agc_enabled", aData, &mPrefs.mAgcOn); + GetPrefBool(aBranch, "media.getusermedia.hpf_enabled", aData, &mPrefs.mHPFOn); GetPrefBool(aBranch, "media.getusermedia.noise_enabled", aData, &mPrefs.mNoiseOn); GetPref(aBranch, "media.getusermedia.aec", aData, &mPrefs.mAec); @@ -3533,6 +3538,7 @@ void MediaManager::Shutdown() { prefs->RemoveObserver("media.getusermedia.aec_enabled", this); prefs->RemoveObserver("media.getusermedia.aec", this); prefs->RemoveObserver("media.getusermedia.agc_enabled", this); + prefs->RemoveObserver("media.getusermedia.hpf_enabled", this); prefs->RemoveObserver("media.getusermedia.agc", this); prefs->RemoveObserver("media.getusermedia.noise_enabled", this); prefs->RemoveObserver("media.getusermedia.noise", this); diff --git a/dom/media/webrtc/MediaEnginePrefs.h b/dom/media/webrtc/MediaEnginePrefs.h index f782f3d098d8621aceec3e51b43d839cb800fe8f..1aa076ab72d77849f1109f265d9d177fba925268 100644 --- a/dom/media/webrtc/MediaEnginePrefs.h +++ b/dom/media/webrtc/MediaEnginePrefs.h @@ -28,6 +28,7 @@ class MediaEnginePrefs { mAecOn(false), mUseAecMobile(false), mAgcOn(false), + mHPFOn(false), mNoiseOn(false), mAec(0), mAgc(0), @@ -45,6 +46,7 @@ class MediaEnginePrefs { bool mAecOn; bool mUseAecMobile; bool mAgcOn; + bool mHPFOn; bool mNoiseOn; int32_t mAec; int32_t mAgc; diff --git a/dom/media/webrtc/MediaEngineWebRTCAudio.cpp b/dom/media/webrtc/MediaEngineWebRTCAudio.cpp index c5dc0ff0a93537dc509df9a9c743afcfbfe25074..e38ee74b6aacfae8e02f779e7561ab2d29f337ef 100644 --- a/dom/media/webrtc/MediaEngineWebRTCAudio.cpp +++ b/dom/media/webrtc/MediaEngineWebRTCAudio.cpp @@ -236,6 +236,35 @@ void MediaEngineWebRTCMicrophoneSource::UpdateAGCSettings( })); } +void MediaEngineWebRTCMicrophoneSource::UpdateHPFSettings(bool aEnable) { + AssertIsOnOwningThread(); + + RefPtr<MediaEngineWebRTCMicrophoneSource> that = this; + NS_DispatchToMainThread( + NS_NewRunnableFunction(__func__, [that, track = mTrack, aEnable] { + class Message : public ControlMessage { + public: + Message(AudioInputProcessing* aInputProcessing, bool aEnable) + : ControlMessage(nullptr), + mInputProcessing(aInputProcessing), + mEnable(aEnable) {} + + void Run() override { mInputProcessing->UpdateHPFSettings(mEnable); } + + protected: + RefPtr<AudioInputProcessing> mInputProcessing; + bool mEnable; + }; + + if (track->IsDestroyed()) { + return; + } + + track->GraphImpl()->AppendMessage( + MakeUnique<Message>(that->mInputProcessing, aEnable)); + })); +} + void MediaEngineWebRTCMicrophoneSource::UpdateNSSettings( bool aEnable, webrtc::NoiseSuppression::Level aLevel) { AssertIsOnOwningThread(); @@ -324,6 +353,7 @@ void MediaEngineWebRTCMicrophoneSource::ApplySettings( UpdateAECSettings( aPrefs.mAecOn, aPrefs.mUseAecMobile, static_cast<webrtc::EchoCancellation::SuppressionLevel>(aPrefs.mAec)); + UpdateHPFSettings(aPrefs.mHPFOn); UpdateAPMExtraOptions(mExtendedFilter, mDelayAgnostic); } @@ -357,6 +387,8 @@ void MediaEngineWebRTCMicrophoneSource::ApplySettings( uint32_t mRequestedInputChannelCount; }; + // The high-pass filter is not taken into account when activating the + // pass through, since it's not controllable from content. bool passThrough = !(prefs.mAecOn || prefs.mAgcOn || prefs.mNoiseOn); if (track->IsDestroyed()) { return; @@ -690,6 +722,10 @@ void AudioInputProcessing::UpdateAGCSettings(bool aEnable, HANDLE_APM_ERROR(mAudioProcessing->gain_control()->Enable(aEnable)); } +void AudioInputProcessing::UpdateHPFSettings(bool aEnable) { + HANDLE_APM_ERROR(mAudioProcessing->high_pass_filter()->Enable(aEnable)); +} + void AudioInputProcessing::UpdateNSSettings( bool aEnable, webrtc::NoiseSuppression::Level aLevel) { if (aLevel != NoiseSuppression::Level::kLow && diff --git a/dom/media/webrtc/MediaEngineWebRTCAudio.h b/dom/media/webrtc/MediaEngineWebRTCAudio.h index c38da7fd6550f65ad4e8e63cd2537137276deb15..161166dd1029d68f154186c8179503d24d5498ed 100644 --- a/dom/media/webrtc/MediaEngineWebRTCAudio.h +++ b/dom/media/webrtc/MediaEngineWebRTCAudio.h @@ -95,6 +95,7 @@ class MediaEngineWebRTCMicrophoneSource : public MediaEngineSource { void UpdateAECSettings(bool aEnable, bool aUseAecMobile, webrtc::EchoCancellation::SuppressionLevel aLevel); void UpdateAGCSettings(bool aEnable, webrtc::GainControl::Mode aMode); + void UpdateHPFSettings(bool aEnable); void UpdateNSSettings(bool aEnable, webrtc::NoiseSuppression::Level aLevel); void UpdateAPMExtraOptions(bool aExtendedFilter, bool aDelayAgnostic); @@ -191,6 +192,7 @@ class AudioInputProcessing : public AudioDataListener { void UpdateAECSettings(bool aEnable, bool aUseAecMobile, webrtc::EchoCancellation::SuppressionLevel aLevel); void UpdateAGCSettings(bool aEnable, webrtc::GainControl::Mode aMode); + void UpdateHPFSettings(bool aEnable); void UpdateNSSettings(bool aEnable, webrtc::NoiseSuppression::Level aLevel); void UpdateAPMExtraOptions(bool aExtendedFilter, bool aDelayAgnostic); diff --git a/dom/promise/tests/test_webassembly_compile.html b/dom/promise/tests/test_webassembly_compile.html index 2ac706d78ef2aa73be241e751c48d1dae7812cc4..9a2cefbc75045290e349d27bb9cee04d106f65b9 100644 --- a/dom/promise/tests/test_webassembly_compile.html +++ b/dom/promise/tests/test_webassembly_compile.html @@ -10,7 +10,6 @@ </head> <body> <script> -const wasmTextToBinary = SpecialPowers.unwrap(SpecialPowers.Cu.getJSTestingFunctions().wasmTextToBinary); const wasmIsSupported = SpecialPowers.Cu.getJSTestingFunctions().wasmIsSupported; // The test_webassembly_compile_sample.wasm is a medium-sized module with 100 diff --git a/dom/quota/ActorsParent.cpp b/dom/quota/ActorsParent.cpp index cbad7ff96c85b45b78f4dde29039a144782323bf..3f6b190cf810740f645a48deaf6f9840a3bfadf9 100644 --- a/dom/quota/ActorsParent.cpp +++ b/dom/quota/ActorsParent.cpp @@ -3940,6 +3940,10 @@ void QuotaManager::CollectPendingOriginsForListing(P aPredicate) { nsresult QuotaManager::Init(const nsAString& aBasePath) { mBasePath = aBasePath; +#ifdef XP_WIN + CacheUseDOSDevicePathSyntaxPrefValue(); +#endif + auto baseDirOrErr = QM_NewLocalFile(aBasePath); if (NS_WARN_IF(baseDirOrErr.isErr())) { return baseDirOrErr.unwrapErr(); diff --git a/dom/quota/FileStreams.cpp b/dom/quota/FileStreams.cpp index 1aaa8a2c5a8f26f3f77e878b6aed111461a2002e..bf94b5c5b6ebd371cf64734bf37a2839521e285c 100644 --- a/dom/quota/FileStreams.cpp +++ b/dom/quota/FileStreams.cpp @@ -21,7 +21,9 @@ NS_IMETHODIMP FileQuotaStream<FileStreamBase>::SetEOF() { nsresult rv = FileStreamBase::Tell(&offset); NS_ENSURE_SUCCESS(rv, rv); - mQuotaObject->MaybeUpdateSize(offset, /* aTruncate */ true); + DebugOnly<bool> res = + mQuotaObject->MaybeUpdateSize(offset, /* aTruncate */ true); + MOZ_ASSERT(res); } return NS_OK; @@ -51,7 +53,9 @@ nsresult FileQuotaStream<FileStreamBase>::DoOpen() { NS_ENSURE_SUCCESS(rv, rv); if (mQuotaObject && (FileStreamBase::mOpenParams.ioFlags & PR_TRUNCATE)) { - mQuotaObject->MaybeUpdateSize(0, /* aTruncate */ true); + DebugOnly<bool> res = + mQuotaObject->MaybeUpdateSize(0, /* aTruncate */ true); + MOZ_ASSERT(res); } return NS_OK; diff --git a/dom/quota/QuotaCommon.cpp b/dom/quota/QuotaCommon.cpp index 5ab265ce986c1f697043cc28a5b1ede765e3e245..67ce07798a9d0ab0914f12f48f9833be28efd159 100644 --- a/dom/quota/QuotaCommon.cpp +++ b/dom/quota/QuotaCommon.cpp @@ -8,7 +8,11 @@ #include "mozilla/Logging.h" // LazyLogModule #include "nsIFile.h" +#include "nsXPCOM.h" +#include "nsXULAppAPI.h" #ifdef XP_WIN +# include "mozilla/ipc/BackgroundParent.h" +# include "mozilla/StaticPrefs_dom.h" # include "nsILocalFileWin.h" #endif #include "nsXPCOM.h" @@ -19,6 +23,10 @@ namespace quota { namespace { +#ifdef XP_WIN +Atomic<int32_t> gUseDOSDevicePathSyntax(-1); +#endif + LazyLogModule gLogger("QuotaManager"); void AnonymizeCString(nsACString& aCString, uint32_t aStart) { @@ -72,6 +80,19 @@ void AnonymizeOriginString(nsACString& aOriginString) { AnonymizeCString(aOriginString, start); } +#ifdef XP_WIN +void CacheUseDOSDevicePathSyntaxPrefValue() { + MOZ_ASSERT(XRE_IsParentProcess()); + AssertIsOnBackgroundThread(); + + if (gUseDOSDevicePathSyntax == -1) { + bool useDOSDevicePathSyntax = + StaticPrefs::dom_quotaManager_useDOSDevicePathSyntax_DoNotUseDirectly(); + gUseDOSDevicePathSyntax = useDOSDevicePathSyntax ? 1 : 0; + } +} +#endif + Result<nsCOMPtr<nsIFile>, nsresult> QM_NewLocalFile(const nsAString& aPath) { nsCOMPtr<nsIFile> file; nsresult rv = @@ -81,13 +102,17 @@ Result<nsCOMPtr<nsIFile>, nsresult> QM_NewLocalFile(const nsAString& aPath) { } #ifdef XP_WIN - nsCOMPtr<nsILocalFileWin> winFile = do_QueryInterface(file, &rv); - if (NS_WARN_IF(NS_FAILED(rv))) { - return Err(rv); - } + MOZ_ASSERT(gUseDOSDevicePathSyntax != -1); - MOZ_ASSERT(winFile); - winFile->SetUseDOSDevicePathSyntax(true); + if (gUseDOSDevicePathSyntax) { + nsCOMPtr<nsILocalFileWin> winFile = do_QueryInterface(file, &rv); + if (NS_WARN_IF(NS_FAILED(rv))) { + return Err(rv); + } + + MOZ_ASSERT(winFile); + winFile->SetUseDOSDevicePathSyntax(true); + } #endif return file; diff --git a/dom/quota/QuotaCommon.h b/dom/quota/QuotaCommon.h index 27413e6be79941f1cbeeefa6f064670efc60c139..e45d98205f9376e6819e970782c4542461ede163 100644 --- a/dom/quota/QuotaCommon.h +++ b/dom/quota/QuotaCommon.h @@ -163,6 +163,10 @@ void StringifyTableKeys(const T& aTable, nsACString& aResult) { } } +#ifdef XP_WIN +void CacheUseDOSDevicePathSyntaxPrefValue(); +#endif + Result<nsCOMPtr<nsIFile>, nsresult> QM_NewLocalFile(const nsAString& aPath); class IntString : public nsAutoString { diff --git a/dom/quota/QuotaObject.h b/dom/quota/QuotaObject.h index 76967667ffa813c0ff8f62b4a1dbd31d97e5d990..b6e29778cf893853a52e1d68e129ed2209e86366 100644 --- a/dom/quota/QuotaObject.h +++ b/dom/quota/QuotaObject.h @@ -32,7 +32,7 @@ class QuotaObject { const nsAString& Path() const { return mPath; } - bool MaybeUpdateSize(int64_t aSize, bool aTruncate); + [[nodiscard]] bool MaybeUpdateSize(int64_t aSize, bool aTruncate); bool IncreaseSize(int64_t aDelta); diff --git a/dom/quota/test/unit/head-shared.js b/dom/quota/test/unit/head-shared.js index 41fccb2f82d886103281943eb8729e6a85b63dd1..8ade6f0594ed15d2f00c4761fb8bd608f711af08 100644 --- a/dom/quota/test/unit/head-shared.js +++ b/dom/quota/test/unit/head-shared.js @@ -97,12 +97,18 @@ function continueToNextStepSync() { function enableTesting() { SpecialPowers.setBoolPref("dom.quotaManager.testing", true); + if (Services.appinfo.OS === "WINNT") { + SpecialPowers.setBoolPref("dom.quotaManager.useDOSDevicePathSyntax", true); + } SpecialPowers.setBoolPref("dom.simpleDB.enabled", true); SpecialPowers.setBoolPref("dom.storage.next_gen", true); } function resetTesting() { SpecialPowers.clearUserPref("dom.quotaManager.testing"); + if (Services.appinfo.OS === "WINNT") { + SpecialPowers.clearUserPref("dom.quotaManager.useDOSDevicePathSyntax"); + } SpecialPowers.clearUserPref("dom.simpleDB.enabled"); SpecialPowers.clearUserPref("dom.storage.next_gen"); } diff --git a/dom/serviceworkers/test/test_notification_openWindow.html b/dom/serviceworkers/test/test_notification_openWindow.html index 2a5233a61cc60f229f895f0ad63c06fdbc74481b..b7f381cdcdd4a4bc39a737efbbdfe72b10471af4 100644 --- a/dom/serviceworkers/test/test_notification_openWindow.html +++ b/dom/serviceworkers/test/test_notification_openWindow.html @@ -29,7 +29,7 @@ add_task(async function setup() { MockServices.register(); SimpleTest.requestFlakyTimeout("Mock alert service dispatches show and click events."); SimpleTest.registerCleanupFunction(() => { - MockServices.unregister() + MockServices.unregister(); }); }); @@ -43,25 +43,36 @@ add_task(async function test() { navigator.serviceWorker.onmessage = null; }); - // The onclicknotification handler uses Clients.openWindow() to open a new - // window. This newly created window will attempt to open another window with - // Window.open() and some arbitrary URL. We crash before the second window - // finishes loading. - info("Showing notification."); - await swr.showNotification("notification"); + for (let prefValue of [ + SpecialPowers.Ci.nsIBrowserDOMWindow.OPEN_CURRENTWINDOW, + SpecialPowers.Ci.nsIBrowserDOMWindow.OPEN_NEWWINDOW, + SpecialPowers.Ci.nsIBrowserDOMWindow.OPEN_NEWTAB, + ]) { + info(`Setting browser.link.open_newwindow to ${prefValue}.`); + await SpecialPowers.pushPrefEnv({ + set: [["browser.link.open_newwindow", prefValue]], + }); - info("Waiting for \"DONE\" from worker."); - await new Promise(resolve => { - navigator.serviceWorker.onmessage = event => { - if (event.data !== "DONE") { - ok(false, `Unexpected message from service worker: ${JSON.stringify(event.data)}`); + // The onclicknotification handler uses Clients.openWindow() to open a new + // window. This newly created window will attempt to open another window with + // Window.open() and some arbitrary URL. We crash before the second window + // finishes loading. + info("Showing notification."); + await swr.showNotification("notification"); + + info("Waiting for \"DONE\" from worker."); + await new Promise(resolve => { + navigator.serviceWorker.onmessage = event => { + if (event.data !== "DONE") { + ok(false, `Unexpected message from service worker: ${JSON.stringify(event.data)}`); + } + resolve(); } - resolve(); - } - }); + }); - // If we make it here, then we didn't crash. - ok(true, "Didn't crash!"); + // If we make it here, then we didn't crash. + ok(true, "Didn't crash!"); + } }); </script> diff --git a/dom/tests/mochitest/general/test_interfaces.js b/dom/tests/mochitest/general/test_interfaces.js index 8d40ac4f7c764a7765a2dbeb77167e7ea71d1df9..5b63e351fba4d1b001aa26077bc1ac644e9c8b66 100644 --- a/dom/tests/mochitest/general/test_interfaces.js +++ b/dom/tests/mochitest/general/test_interfaces.js @@ -167,15 +167,15 @@ var interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! { name: "AudioParam", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "AudioParamMap", insecureContext: false, nightly: true }, + { name: "AudioParamMap", insecureContext: false }, // IMPORTANT: Do not change this list without review from a DOM peer! { name: "AudioProcessingEvent", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! { name: "AudioScheduledSourceNode", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "AudioWorklet", insecureContext: false, nightly: true }, + { name: "AudioWorklet", insecureContext: false }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "AudioWorkletNode", insecureContext: false, nightly: true }, + { name: "AudioWorkletNode", insecureContext: false }, // IMPORTANT: Do not change this list without review from a DOM peer! { name: "AuthenticatorAssertionResponse", android: false }, // IMPORTANT: Do not change this list without review from a DOM peer! @@ -1394,7 +1394,7 @@ var interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! { name: "Worker", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "Worklet", insecureContext: false, nightly: true }, + { name: "Worklet", insecureContext: false }, // IMPORTANT: Do not change this list without review from a DOM peer! { name: "XMLDocument", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! diff --git a/dom/webgpu/mochitest/mochitest.ini b/dom/webgpu/mochitest/mochitest.ini index 49f022b38cebb213927c9a62b25b1c051ee8a566..e18c5586bf3b66517ff536e19076eb2862c0a02f 100644 --- a/dom/webgpu/mochitest/mochitest.ini +++ b/dom/webgpu/mochitest/mochitest.ini @@ -1,6 +1,7 @@ [DEFAULT] subsuite = webgpu prefs = dom.webgpu.enabled=true +run_if = nightly_build [test_enabled.html] [test_device_creation.html] diff --git a/dom/worklet/tests/test_audioWorklet_WASM.html b/dom/worklet/tests/test_audioWorklet_WASM.html index 2195a8719b1c29826f5d7fa8e39cac613ce483a0..92dd740d283b0fdad2607691a1522bf9c940cd8f 100644 --- a/dom/worklet/tests/test_audioWorklet_WASM.html +++ b/dom/worklet/tests/test_audioWorklet_WASM.html @@ -35,10 +35,19 @@ function create_wasmModule() { ok(WebAssembly.compile, "WebAssembly.compile function should exist"); const wasmTextToBinary = SpecialPowers.unwrap(SpecialPowers.Cu.getJSTestingFunctions().wasmTextToBinary); - const fooModuleCode = wasmTextToBinary(`(module - (func $foo (result i32) (i32.const 42)) - (export "foo" (func $foo)) - )`); + /* + js -e ' + t = wasmTextToBinary(` + (module + (func $foo (result i32) (i32.const 42)) + (export "foo" (func $foo)) + ) + `); + print(t) + ' + */ + // eslint-disable-next-line + const fooModuleCode = new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,127,3,2,1,0,7,7,1,3,102,111,111,0,0,10,6,1,4,0,65,42,11,0,13,4,110,97,109,101,1,6,1,0,3,102,111,111]); WebAssembly.compile(fooModuleCode).then(m => { ok(m instanceof WebAssembly.Module, "The WasmModule has been compiled."); diff --git a/dom/worklet/tests/test_audioWorklet_options.html b/dom/worklet/tests/test_audioWorklet_options.html index 4f001c334a94a744e186c33650a431a5a90174eb..714a09a2ce800e8e5e1b52a51e77dec641471b49 100644 --- a/dom/worklet/tests/test_audioWorklet_options.html +++ b/dom/worklet/tests/test_audioWorklet_options.html @@ -34,10 +34,20 @@ function create_wasmModule() { ok(WebAssembly.compile, "WebAssembly.compile function should exist"); const wasmTextToBinary = SpecialPowers.unwrap(SpecialPowers.Cu.getJSTestingFunctions().wasmTextToBinary); - const fooModuleCode = wasmTextToBinary(`(module - (func $foo (result i32) (i32.const 42)) - (export "foo" (func $foo)) - )`); + + /* + js -e ' + t = wasmTextToBinary(` + (module + (func $foo (result i32) (i32.const 42)) + (export "foo" (func $foo)) + ) + `); + print(t) + ' + */ + // eslint-disable-next-line + const fooModuleCode = new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,127,3,2,1,0,7,7,1,3,102,111,111,0,0,10,6,1,4,0,65,42,11,0,13,4,110,97,109,101,1,6,1,0,3,102,111,111]); WebAssembly.compile(fooModuleCode).then(m => { ok(m instanceof WebAssembly.Module, "The WasmModule has been compiled."); diff --git a/dom/worklet/tests/test_promise.html b/dom/worklet/tests/test_promise.html index fc371050d355fd44c26ab6f5356839c53188f92c..8ea71af9a6313032b03b2caefc495e347961fe72 100644 --- a/dom/worklet/tests/test_promise.html +++ b/dom/worklet/tests/test_promise.html @@ -35,10 +35,19 @@ function runTestInIframe() { } const wasmTextToBinary = SpecialPowers.unwrap(SpecialPowers.Cu.getJSTestingFunctions().wasmTextToBinary); - const fooModuleCode = wasmTextToBinary(`(module - (func $foo (result i32) (i32.const 42)) - (export "foo" (func $foo)) - )`); + /* + js -e ' + t = wasmTextToBinary(` + (module + (func $foo (result i32) (i32.const 42)) + (export "foo" (func $foo)) + ) + `); + print(t) + ' + */ + // eslint-disable-next-line + const fooModuleCode = new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,127,3,2,1,0,7,7,1,3,102,111,111,0,0,10,6,1,4,0,65,42,11,0,13,4,110,97,109,101,1,6,1,0,3,102,111,111]); node.port.postMessage(fooModuleCode); }); diff --git a/dom/xul/XULTreeElement.cpp b/dom/xul/XULTreeElement.cpp index fe26ae9617b3f3291cac521fd766289b39af923a..f9b3ca0a5f622b3cc6c566f84da46a152a50a2d1 100644 --- a/dom/xul/XULTreeElement.cpp +++ b/dom/xul/XULTreeElement.cpp @@ -173,9 +173,9 @@ already_AddRefed<Element> XULTreeElement::GetTreeBody() { return nullptr; } -already_AddRefed<nsTreeColumns> XULTreeElement::GetColumns() { - nsTreeBodyFrame* body = GetTreeBodyFrame(); - if (body) { +already_AddRefed<nsTreeColumns> XULTreeElement::GetColumns( + FlushType aFlushType) { + if (nsTreeBodyFrame* body = GetTreeBodyFrame(aFlushType)) { return body->Columns(); } return nullptr; diff --git a/dom/xul/XULTreeElement.h b/dom/xul/XULTreeElement.h index 55a7767033a3a985df03e0ab5b39cb7bbf286289..78e4926986c0b1f20315f9855d86260f930e7bc5 100644 --- a/dom/xul/XULTreeElement.h +++ b/dom/xul/XULTreeElement.h @@ -41,7 +41,7 @@ class XULTreeElement final : public nsXULElement { nsTreeBodyFrame* GetTreeBodyFrame(FlushType = FlushType::Frames); nsTreeBodyFrame* GetCachedTreeBodyFrame() { return mTreeBody; } - already_AddRefed<nsTreeColumns> GetColumns(); + already_AddRefed<nsTreeColumns> GetColumns(FlushType = FlushType::Frames); already_AddRefed<nsITreeView> GetView(CallerType /* unused */) { return GetView(); diff --git a/gfx/thebes/DeviceManagerDx.cpp b/gfx/thebes/DeviceManagerDx.cpp index 9ed382e14fadadaf23ad2616d36f05acd9cc05e9..04be5837311e71ffc7eaa6ac966429690ca5c8d3 100644 --- a/gfx/thebes/DeviceManagerDx.cpp +++ b/gfx/thebes/DeviceManagerDx.cpp @@ -170,6 +170,34 @@ nsTArray<DXGI_OUTPUT_DESC1> DeviceManagerDx::EnumerateOutputs() { return outputs; } +bool DeviceManagerDx::GetOutputFromMonitor(HMONITOR monitor, + RefPtr<IDXGIOutput>* aOutOutput) { + RefPtr<IDXGIAdapter> adapter = GetDXGIAdapter(); + + if (!adapter) { + NS_WARNING("Failed to acquire a DXGI adapter for GetOutputFromMonitor."); + return false; + } + + for (UINT i = 0;; ++i) { + RefPtr<IDXGIOutput> output = nullptr; + if (FAILED(adapter->EnumOutputs(i, getter_AddRefs(output)))) { + break; + } + + DXGI_OUTPUT_DESC desc; + if (FAILED(output->GetDesc(&desc))) { + continue; + } + + if (desc.Monitor == monitor) { + *aOutOutput = output; + return true; + } + } + return false; +} + bool DeviceManagerDx::CheckHardwareStretchingSupport() { RefPtr<IDXGIAdapter> adapter = GetDXGIAdapter(); diff --git a/gfx/thebes/DeviceManagerDx.h b/gfx/thebes/DeviceManagerDx.h index 3388163c3d95913662ee4889fa7a88a506ebdb63..23267bdb074c6075b902421864988eeadc6b592f 100644 --- a/gfx/thebes/DeviceManagerDx.h +++ b/gfx/thebes/DeviceManagerDx.h @@ -87,6 +87,10 @@ class DeviceManagerDx final { // Enumerate and return all outputs on the current adapter. nsTArray<DXGI_OUTPUT_DESC1> EnumerateOutputs(); + // find the IDXGIOutput with a description.Monitor matching + // 'monitor'; returns false if not found or some error occurred. + bool GetOutputFromMonitor(HMONITOR monitor, RefPtr<IDXGIOutput>* aOutOutput); + // Check if the current adapter supports hardware stretching bool CheckHardwareStretchingSupport(); diff --git a/gfx/thebes/DisplayConfigWindows.cpp b/gfx/thebes/DisplayConfigWindows.cpp new file mode 100644 index 0000000000000000000000000000000000000000..202380acf04127bf79dccb95557b8eada9e6281b --- /dev/null +++ b/gfx/thebes/DisplayConfigWindows.cpp @@ -0,0 +1,78 @@ +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * 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/. */ + +#include <iostream> +#include <windows.h> +#include <wingdi.h> +#include <optional> +#include <vector> + +#include "DisplayConfigWindows.h" + +namespace mozilla { +namespace gfx { + +using namespace std; + +struct DisplayConfig { + vector<DISPLAYCONFIG_PATH_INFO> mPaths; + vector<DISPLAYCONFIG_MODE_INFO> mModes; +}; + +optional<DisplayConfig> GetDisplayConfig() { + LONG result; + + UINT32 numPaths; + UINT32 numModes; + vector<DISPLAYCONFIG_PATH_INFO> paths; + vector<DISPLAYCONFIG_MODE_INFO> modes; + do { + result = GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &numPaths, + &numModes); + if (result != ERROR_SUCCESS) { + return {}; + } + // allocate the recommended amount of space + paths.resize(numPaths); + modes.resize(numModes); + + result = QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, &numPaths, paths.data(), + &numModes, modes.data(), NULL); + // try again if there wasn't enough space + } while (result == ERROR_INSUFFICIENT_BUFFER); + + if (result != ERROR_SUCCESS) return {}; + + // shrink to fit the actual number of modes and paths returned + modes.resize(numModes); + paths.resize(numPaths); + + return DisplayConfig{paths, modes}; +} + +bool HasScaledResolution() { + auto config = GetDisplayConfig(); + if (config) { + for (auto& path : config->mPaths) { + auto& modes = config->mModes; + int targetModeIndex = path.targetInfo.modeInfoIdx; + int sourceModeIndex = path.sourceInfo.modeInfoIdx; + + // Check if the source and target resolutions are different + if ((modes[targetModeIndex] + .targetMode.targetVideoSignalInfo.activeSize.cx != + modes[sourceModeIndex].sourceMode.width) || + (modes[targetModeIndex] + .targetMode.targetVideoSignalInfo.activeSize.cy != + modes[sourceModeIndex].sourceMode.height)) { + return true; + } + } + } + return false; +} + +} // namespace gfx +} // namespace mozilla diff --git a/gfx/thebes/DisplayConfigWindows.h b/gfx/thebes/DisplayConfigWindows.h new file mode 100644 index 0000000000000000000000000000000000000000..93d3d12d12ea850b36c69c5adc80283f390f8e8e --- /dev/null +++ b/gfx/thebes/DisplayConfigWindows.h @@ -0,0 +1,17 @@ +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * 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/. */ + +#ifndef mozilla_gfx_thebes_DisplayConfigWindows_h +#define mozilla_gfx_thebes_DisplayConfigWindows_h + +namespace mozilla { +namespace gfx { + +extern bool HasScaledResolution(); + +} // namespace gfx +} // namespace mozilla + +#endif // mozilla_gfx_thebes_DisplayConfigWindows_h diff --git a/gfx/thebes/SharedFontList.h b/gfx/thebes/SharedFontList.h index c7e242ef3bd128d2fe9717d8e4dcca61f3e9eb3e..0de4b3035071714e300deee7d20c099e6ac57cb2 100644 --- a/gfx/thebes/SharedFontList.h +++ b/gfx/thebes/SharedFontList.h @@ -92,9 +92,12 @@ struct String { const nsCString AsString(FontList* aList) const { MOZ_ASSERT(!mPointer.IsNull()); - nsCString res; - res.AssignLiteral(static_cast<const char*>(mPointer.ToPtr(aList)), mLength); - return res; + // It's tempting to use AssignLiteral here so that we get an nsCString that + // simply wraps the character data in the shmem block without needing to + // allocate or copy. But that's unsafe because in the event of font-list + // reinitalization, that shared memory will be unmapped; then any copy of + // the nsCString that may still be around will crash if accessed. + return nsCString(static_cast<const char*>(mPointer.ToPtr(aList)), mLength); } void Assign(const nsACString& aString, FontList* aList); diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp index bb0324408fae401f9511a7ebbef8397e31863a8f..7128895b0e6eff1035ad7b424f71756c3a1b89c4 100644 --- a/gfx/thebes/gfxPlatform.cpp +++ b/gfx/thebes/gfxPlatform.cpp @@ -64,6 +64,7 @@ #if defined(XP_WIN) # include "gfxWindowsPlatform.h" +# include "DisplayConfigWindows.h" #elif defined(XP_MACOSX) # include "gfxPlatformMac.h" # include "gfxQuartzSurface.h" @@ -3060,7 +3061,8 @@ void gfxPlatform::InitWebRenderConfig() { // Disable native compositor when hardware stretching is not supported. It is // for avoiding a problem like Bug 1618370. // XXX Is there a better check for Bug 1618370? - if (!DeviceManagerDx::Get()->CheckHardwareStretchingSupport()) { + if (!DeviceManagerDx::Get()->CheckHardwareStretchingSupport() && + HasScaledResolution()) { featureComp.Disable( FeatureStatus::Unavailable, "No hardware stretching support", NS_LITERAL_CSTRING("FEATURE_FAILURE_NO_HARDWARE_STRETCHING")); @@ -3115,6 +3117,11 @@ void gfxPlatform::InitWebRenderConfig() { void gfxPlatform::InitWebGPUConfig() { FeatureState& feature = gfxConfig::GetFeature(Feature::WEBGPU); feature.SetDefaultFromPref("dom.webgpu.enabled", true, false); +#ifndef NIGHTLY_BUILD + feature.ForceDisable(FeatureStatus::Blocked, + "WebGPU can only be enabled in nightly", + NS_LITERAL_CSTRING("WEBGPU_DISABLE_NON_NIGHTLY")); +#endif } void gfxPlatform::InitOMTPConfig() { diff --git a/gfx/thebes/gfxPlatformFontList.cpp b/gfx/thebes/gfxPlatformFontList.cpp index 1c9fd2729f8a3069a0391e2b3aa650b9dc1d5c5d..4b78804c2ff2ad70dcca3b3e75bc29ab802ce66e 100644 --- a/gfx/thebes/gfxPlatformFontList.cpp +++ b/gfx/thebes/gfxPlatformFontList.cpp @@ -1059,10 +1059,10 @@ bool gfxPlatformFontList::FindAndAddFamilies( } mOtherNamesMissed->PutEntry(key); } - if (family) { - aOutput->AppendElement(FamilyAndGeneric(family, aGeneric)); - return true; - } + } + if (family) { + aOutput->AppendElement(FamilyAndGeneric(family, aGeneric)); + return true; } return false; } @@ -1862,12 +1862,17 @@ void gfxPlatformFontList::GetFontFamilyNames( fontlist::FontList* list = SharedFontList(); const fontlist::Family* families = list->Families(); for (uint32_t i = 0, n = list->NumFamilies(); i < n; i++) { - aFontFamilyNames.AppendElement(families[i].DisplayName().AsString(list)); + const fontlist::Family& family = families[i]; + if (!family.IsHidden()) { + aFontFamilyNames.AppendElement(family.DisplayName().AsString(list)); + } } } else { for (auto iter = mFontFamilies.Iter(); !iter.Done(); iter.Next()) { RefPtr<gfxFontFamily>& family = iter.Data(); - aFontFamilyNames.AppendElement(family->Name()); + if (!family->IsHidden()) { + aFontFamilyNames.AppendElement(family->Name()); + } } } } @@ -1939,9 +1944,6 @@ bool gfxPlatformFontList::LoadFontInfo() { if (!family) { continue; } - if (family->IsHidden()) { - continue; - } ReadFaceNamesForFamily(family, NeedFullnamePostscriptNames()); } else { // lookup in canonical (i.e. English) family name list diff --git a/gfx/thebes/gfxTextRun.cpp b/gfx/thebes/gfxTextRun.cpp index c7fda899c37c34c078d4e701ec428680984dc260..57670c548d0eea71d8192187205580a1ac53903b 100644 --- a/gfx/thebes/gfxTextRun.cpp +++ b/gfx/thebes/gfxTextRun.cpp @@ -1736,7 +1736,8 @@ void gfxFontGroup::BuildFontList() { if (mFontMatchingStats) { for (const auto& f : fonts) { - nsAutoCString key; + nsCString key; // not nsAutoCString, as the assignment to it won't copy + // characters, it'll just share the string buffer FontVisibility visibility; if (f.mFamily.mIsShared) { key = f.mFamily.mShared->Key().AsString(pfl->SharedFontList()); diff --git a/gfx/thebes/gfxWindowsPlatform.cpp b/gfx/thebes/gfxWindowsPlatform.cpp index b7af2718eac698426bf1d4eda53daa0a3e4c18d7..e527a114dadfa893e0b3da7c84aa53271cb84736 100644 --- a/gfx/thebes/gfxWindowsPlatform.cpp +++ b/gfx/thebes/gfxWindowsPlatform.cpp @@ -1591,7 +1591,8 @@ class D3DVsyncSource final : public VsyncSource { D3DVsyncDisplay() : mPrevVsync(TimeStamp::Now()), mVsyncEnabledLock("D3DVsyncEnabledLock"), - mVsyncEnabled(false) { + mVsyncEnabled(false), + mWaitVBlankMonitor(NULL) { mVsyncThread = new base::Thread("WindowsVsyncThread"); MOZ_RELEASE_ASSERT(mVsyncThread->Start(), "GFX: Could not start Windows vsync thread"); @@ -1766,9 +1767,16 @@ class D3DVsyncSource final : public VsyncSource { return; } - // Using WaitForVBlank, the whole system dies because WaitForVBlank - // only works if it's run on the same thread as the Present(); - HRESULT hr = DwmFlush(); + HRESULT hr = E_FAIL; + if (StaticPrefs::gfx_vsync_use_waitforvblank()) { + UpdateVBlankOutput(); + if (mWaitVBlankOutput) { + hr = mWaitVBlankOutput->WaitForVBlank(); + } + } + if (!SUCCEEDED(hr)) { + hr = DwmFlush(); + } if (!SUCCEEDED(hr)) { // DWMFlush isn't working, fallback to software vsync. ScheduleSoftwareVsync(TimeStamp::Now()); @@ -1816,11 +1824,35 @@ class D3DVsyncSource final : public VsyncSource { return mVsyncThread->thread_id() == PlatformThread::CurrentId(); } + void UpdateVBlankOutput() { + HMONITOR primary_monitor = + MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY); + if (primary_monitor == mWaitVBlankMonitor && mWaitVBlankOutput) { + return; + } + + mWaitVBlankMonitor = primary_monitor; + + RefPtr<IDXGIOutput> output = nullptr; + if (DeviceManagerDx* dx = DeviceManagerDx::Get()) { + if (dx->GetOutputFromMonitor(mWaitVBlankMonitor, &output)) { + mWaitVBlankOutput = output; + return; + } + } + + // failed to convert a monitor to an output so keep trying + mWaitVBlankOutput = nullptr; + } + TimeStamp mPrevVsync; Monitor mVsyncEnabledLock; base::Thread* mVsyncThread; TimeDuration mVsyncRate; bool mVsyncEnabled; + + HMONITOR mWaitVBlankMonitor; + RefPtr<IDXGIOutput> mWaitVBlankOutput; }; // end d3dvsyncdisplay D3DVsyncSource() { mPrimaryDisplay = new D3DVsyncDisplay(); } diff --git a/gfx/thebes/moz.build b/gfx/thebes/moz.build index 313e750a75eabe15656403a8b1d22e016ffb871f..001431ce7e304f3ed700ad5d21cf7fe980014a74 100644 --- a/gfx/thebes/moz.build +++ b/gfx/thebes/moz.build @@ -155,6 +155,7 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': 'PrintTargetWindows.h', ] SOURCES += [ + 'DisplayConfigWindows.cpp', 'gfxDWriteCommon.cpp', 'gfxDWriteFonts.cpp', 'gfxGDIFont.cpp', diff --git a/gfx/wr/webrender/src/clip.rs b/gfx/wr/webrender/src/clip.rs index 1e6d0dcde4113085900b40e9d332d3df41b779e2..94bf7aeda61e79c7b99c92f8808473b7754b58f8 100644 --- a/gfx/wr/webrender/src/clip.rs +++ b/gfx/wr/webrender/src/clip.rs @@ -107,8 +107,9 @@ use crate::prim_store::{ClipData, ImageMaskData, SpaceMapper, VisibleMaskImageTi use crate::prim_store::{PointKey, SizeKey, RectangleKey}; use crate::render_task_cache::to_cache_size; use crate::resource_cache::{ImageRequest, ResourceCache}; -use std::{iter, ops, u32}; use crate::util::{extract_inner_rect_safe, project_rect, ScaleOffset}; +use euclid::approxeq::ApproxEq; +use std::{iter, ops, u32}; // Type definitions for interning clip nodes. @@ -1573,24 +1574,25 @@ pub fn projected_rect_contains( target_rect.bottom_right(), target_rect.bottom_left(), ]; - // iterate the edges of the transformed polygon for (a, b) in points .iter() .cloned() .zip(points[1..].iter().cloned().chain(iter::once(points[0]))) { - // check if every destination point is on the right of the edge - for &c in target_points.iter() { - if (b - a).cross(c - a) < 0.0 { - return None - } + // If this edge is redundant, it's a weird, case, and we shouldn't go + // length in trying to take the fast path (e.g. when the whole rectangle is a point). + // If any of edges of the target rectangle crosses the edge, it's not completely + // inside our transformed polygon either. + if a.approx_eq(&b) || target_points.iter().any(|&c| (b - a).cross(c - a) < 0.0) { + return None } } Some(()) } + // Add a clip node into the list of clips to be processed // for the current clip chain. Returns false if the clip // results in the entire primitive being culled out. @@ -1650,3 +1652,22 @@ fn add_clip_node_to_current_chain( true } + +#[cfg(test)] +mod tests { + use super::projected_rect_contains; + use euclid::{Transform3D, rect}; + + #[test] + fn test_empty_projected_rect() { + assert_eq!( + None, + projected_rect_contains( + &rect(10.0, 10.0, 0.0, 0.0), + &Transform3D::identity(), + &rect(20.0, 20.0, 10.0, 10.0), + ), + "Empty rectangle is considered to include a non-empty!" + ); + } +} diff --git a/gfx/wr/webrender/src/device/gl.rs b/gfx/wr/webrender/src/device/gl.rs index 66d44b0ade379b1f02724713e8f059a3961d5000..a2ad9116bd927072618340de7c829af5ea6789e9 100644 --- a/gfx/wr/webrender/src/device/gl.rs +++ b/gfx/wr/webrender/src/device/gl.rs @@ -1032,6 +1032,26 @@ enum TexStorageUsage { Always, } +/// Describes a required alignment for a stride, +/// which can either be represented in bytes or pixels. +#[derive(Copy, Clone, Debug)] +pub enum StrideAlignment { + Bytes(NonZeroUsize), + Pixels(NonZeroUsize), +} + +impl StrideAlignment { + pub fn num_bytes(&self, format: ImageFormat) -> NonZeroUsize { + match *self { + Self::Bytes(bytes) => bytes, + Self::Pixels(pixels) => { + assert!(format.bytes_per_pixel() > 0); + NonZeroUsize::new(pixels.get() * format.bytes_per_pixel() as usize).unwrap() + } + } + } +} + // We get 24 bits of Z value - use up 22 bits of it to give us // 4 bits to account for GPU issues. This seems to manifest on // some GPUs under certain perspectives due to z interpolation @@ -1097,7 +1117,7 @@ pub struct Device { /// format, we fall back to glTexImage*. texture_storage_usage: TexStorageUsage, - optimal_pbo_stride: NonZeroUsize, + optimal_pbo_stride: StrideAlignment, /// Whether we must ensure the source strings passed to glShaderSource() /// are null-terminated, to work around driver bugs. @@ -1520,16 +1540,22 @@ impl Device { // strings are not null-terminated. See bug 1591945. let requires_null_terminated_shader_source = is_emulator; - // On Adreno GPUs PBO texture upload is only performed asynchronously - // if the stride of the data in the PBO is a multiple of 256 bytes. + let is_amd_macos = cfg!(target_os = "macos") && renderer_name.starts_with("AMD"); + + // On certain GPUs PBO texture upload is only performed asynchronously + // if the stride of the data is a multiple of a certain value. + // On Adreno it must be a multiple of 64 pixels, meaning value in bytes + // varies with the texture format. + // On AMD Mac, it must always be a multiple of 256 bytes. // Other platforms may have similar requirements and should be added // here. - // The default value should be 4. - let is_amd_macos = cfg!(target_os = "macos") && renderer_name.starts_with("AMD"); - let optimal_pbo_stride = if is_adreno || is_amd_macos { - NonZeroUsize::new(256).unwrap() + // The default value should be 4 bytes. + let optimal_pbo_stride = if is_adreno { + StrideAlignment::Pixels(NonZeroUsize::new(64).unwrap()) + } else if is_amd_macos { + StrideAlignment::Bytes(NonZeroUsize::new(256).unwrap()) } else { - NonZeroUsize::new(4).unwrap() + StrideAlignment::Bytes(NonZeroUsize::new(4).unwrap()) }; // On AMD Macs there is a driver bug which causes some texture uploads @@ -1660,7 +1686,7 @@ impl Device { return (self.max_depth_ids() - 1) as f32; } - pub fn optimal_pbo_stride(&self) -> NonZeroUsize { + pub fn optimal_pbo_stride(&self) -> StrideAlignment { self.optimal_pbo_stride } @@ -2858,7 +2884,7 @@ impl Device { let bytes_pp = format.bytes_per_pixel() as usize; let width_bytes = size.width as usize * bytes_pp; - let dst_stride = round_up_to_multiple(width_bytes, self.optimal_pbo_stride); + let dst_stride = round_up_to_multiple(width_bytes, self.optimal_pbo_stride.num_bytes(format)); // The size of the chunk should only need to be (height - 1) * dst_stride + width_bytes, // however, the android emulator will error unless it is height * dst_stride. diff --git a/gfx/wr/webrender/src/frame_builder.rs b/gfx/wr/webrender/src/frame_builder.rs index 2942ba2855325ac0276ad1bee6076324196b8df6..88f838442fd94f8a31577d88441d496a5c6cb267 100644 --- a/gfx/wr/webrender/src/frame_builder.rs +++ b/gfx/wr/webrender/src/frame_builder.rs @@ -67,6 +67,7 @@ pub struct FrameBuilderConfig { pub compositor_kind: CompositorKind, pub tile_size_override: Option<DeviceIntSize>, pub max_depth_ids: i32, + pub max_target_size: i32, } /// A set of common / global resources that are retained between diff --git a/gfx/wr/webrender/src/picture.rs b/gfx/wr/webrender/src/picture.rs index 73ce7c1a2c9bdf135496735560f41d1bcb82224b..d8faf40c956071736b90e6095bfdba3f6da18129 100644 --- a/gfx/wr/webrender/src/picture.rs +++ b/gfx/wr/webrender/src/picture.rs @@ -4630,6 +4630,7 @@ impl PicturePrimitive { /// font size, etc. need to be scaled accordingly. fn adjust_scale_for_max_surface_size( raster_config: &RasterConfig, + max_target_size: i32, pic_rect: PictureRect, map_pic_to_raster: &SpaceMapper<PicturePixel, RasterPixel>, map_raster_to_world: &SpaceMapper<RasterPixel, WorldPixel>, @@ -4638,13 +4639,15 @@ impl PicturePrimitive { device_rect: &mut DeviceIntRect, unclipped: &mut DeviceRect) -> Option<f32> { - if raster_config.establishes_raster_root && - (device_rect.size.width > (MAX_SURFACE_SIZE as i32) || - device_rect.size.height > (MAX_SURFACE_SIZE as i32)) - { + let limit = if raster_config.establishes_raster_root { + MAX_SURFACE_SIZE as i32 + } else { + max_target_size + }; + if device_rect.size.width > limit || device_rect.size.height > limit { // round_out will grow by 1 integer pixel if origin is on a // fractional position, so keep that margin for error with -1: - let scale = (MAX_SURFACE_SIZE as f32 - 1.0) / + let scale = (limit as f32 - 1.0) / (i32::max(device_rect.size.width, device_rect.size.height) as f32); *device_pixel_scale = *device_pixel_scale * Scale::new(scale); let new_device_rect = device_rect.to_f32() * Scale::new(scale); @@ -4717,10 +4720,11 @@ impl PicturePrimitive { ); if let Some(scale) = adjust_scale_for_max_surface_size( - raster_config, pic_rect, &map_pic_to_raster, &map_raster_to_world, - clipped_prim_bounding_rect, - &mut device_pixel_scale, &mut device_rect, &mut unclipped) - { + raster_config, frame_context.fb_config.max_target_size, + pic_rect, &map_pic_to_raster, &map_raster_to_world, + clipped_prim_bounding_rect, + &mut device_pixel_scale, &mut device_rect, &mut unclipped, + ) { blur_std_deviation = blur_std_deviation * scale; original_size = (original_size.to_f32() * scale).try_cast::<i32>().unwrap(); raster_config.root_scaling_factor = scale; @@ -4791,10 +4795,11 @@ impl PicturePrimitive { ); if let Some(scale) = adjust_scale_for_max_surface_size( - raster_config, pic_rect, &map_pic_to_raster, &map_raster_to_world, + raster_config, frame_context.fb_config.max_target_size, + pic_rect, &map_pic_to_raster, &map_raster_to_world, clipped_prim_bounding_rect, - &mut device_pixel_scale, &mut device_rect, &mut unclipped) - { + &mut device_pixel_scale, &mut device_rect, &mut unclipped, + ) { // std_dev adjusts automatically from using device_pixel_scale raster_config.root_scaling_factor = scale; } @@ -4889,10 +4894,11 @@ impl PicturePrimitive { PictureCompositeMode::Filter(..) => { if let Some(scale) = adjust_scale_for_max_surface_size( - raster_config, pic_rect, &map_pic_to_raster, &map_raster_to_world, + raster_config, frame_context.fb_config.max_target_size, + pic_rect, &map_pic_to_raster, &map_raster_to_world, clipped_prim_bounding_rect, - &mut device_pixel_scale, &mut clipped, &mut unclipped) - { + &mut device_pixel_scale, &mut clipped, &mut unclipped, + ) { raster_config.root_scaling_factor = scale; } @@ -4922,10 +4928,11 @@ impl PicturePrimitive { } PictureCompositeMode::ComponentTransferFilter(..) => { if let Some(scale) = adjust_scale_for_max_surface_size( - raster_config, pic_rect, &map_pic_to_raster, &map_raster_to_world, + raster_config, frame_context.fb_config.max_target_size, + pic_rect, &map_pic_to_raster, &map_raster_to_world, clipped_prim_bounding_rect, - &mut device_pixel_scale, &mut clipped, &mut unclipped) - { + &mut device_pixel_scale, &mut clipped, &mut unclipped, + ) { raster_config.root_scaling_factor = scale; } @@ -5228,10 +5235,11 @@ impl PicturePrimitive { PictureCompositeMode::MixBlend(..) | PictureCompositeMode::Blit(_) => { if let Some(scale) = adjust_scale_for_max_surface_size( - raster_config, pic_rect, &map_pic_to_raster, &map_raster_to_world, + raster_config, frame_context.fb_config.max_target_size, + pic_rect, &map_pic_to_raster, &map_raster_to_world, clipped_prim_bounding_rect, - &mut device_pixel_scale, &mut clipped, &mut unclipped) - { + &mut device_pixel_scale, &mut clipped, &mut unclipped, + ) { raster_config.root_scaling_factor = scale; } @@ -5262,10 +5270,11 @@ impl PicturePrimitive { PictureCompositeMode::SvgFilter(ref primitives, ref filter_datas) => { if let Some(scale) = adjust_scale_for_max_surface_size( - raster_config, pic_rect, &map_pic_to_raster, &map_raster_to_world, + raster_config, frame_context.fb_config.max_target_size, + pic_rect, &map_pic_to_raster, &map_raster_to_world, clipped_prim_bounding_rect, - &mut device_pixel_scale, &mut clipped, &mut unclipped) - { + &mut device_pixel_scale, &mut clipped, &mut unclipped, + ) { raster_config.root_scaling_factor = scale; } diff --git a/gfx/wr/webrender/src/renderer.rs b/gfx/wr/webrender/src/renderer.rs index fe17540e59e09a904beb039a91ba9eeed45b731b..3bed6acf52698666a62a731fcbcf611011d9ff13 100644 --- a/gfx/wr/webrender/src/renderer.rs +++ b/gfx/wr/webrender/src/renderer.rs @@ -2276,6 +2276,7 @@ impl Renderer { compositor_kind, tile_size_override: None, max_depth_ids: device.max_depth_ids(), + max_target_size: max_texture_size, }; info!("WR {:?}", config); @@ -2559,8 +2560,8 @@ impl Renderer { self.device.preferred_color_formats().external } - pub fn optimal_texture_stride_alignment(&self) -> usize { - self.device.optimal_pbo_stride().get() + pub fn optimal_texture_stride_alignment(&self, format: ImageFormat) -> usize { + self.device.optimal_pbo_stride().num_bytes(format).get() } pub fn flush_pipeline_info(&mut self) -> PipelineInfo { diff --git a/gfx/wr/webrender/src/scene.rs b/gfx/wr/webrender/src/scene.rs index 7498f9dae5e567e04c1d181a2e2e1ed68aca2e64..3caf68ab6035ffdc38f98dab6a92327ba1e9cf97 100644 --- a/gfx/wr/webrender/src/scene.rs +++ b/gfx/wr/webrender/src/scene.rs @@ -309,6 +309,7 @@ impl BuiltScene { compositor_kind: CompositorKind::default(), tile_size_override: None, max_depth_ids: 0, + max_target_size: 0, }, } } diff --git a/gfx/wr/webrender/src/screen_capture.rs b/gfx/wr/webrender/src/screen_capture.rs index 5941f4e8c5adc4baaf93559aa358dabb272c2d85..56fdf4586749ac04eaa080a3154290f581034678 100644 --- a/gfx/wr/webrender/src/screen_capture.rs +++ b/gfx/wr/webrender/src/screen_capture.rs @@ -141,7 +141,7 @@ impl AsyncScreenshotGrabber { let read_size = match self.mode { AsyncScreenshotGrabberMode::ProfilerScreenshots => { let stride = (screenshot_size.width * image_format.bytes_per_pixel()) as usize; - let rounded = round_up_to_multiple(stride, device.optimal_pbo_stride()); + let rounded = round_up_to_multiple(stride, device.optimal_pbo_stride().num_bytes(image_format)); let optimal_width = rounded as i32 / image_format.bytes_per_pixel(); DeviceIntSize::new( diff --git a/gfx/wr/wrench/reftests/clip/clip-empty-inner-rect-ref.yaml b/gfx/wr/wrench/reftests/clip/clip-empty-inner-rect-ref.yaml new file mode 100644 index 0000000000000000000000000000000000000000..0dea07f57dc30e7bbb30fe2bab598cb0b85c4294 --- /dev/null +++ b/gfx/wr/wrench/reftests/clip/clip-empty-inner-rect-ref.yaml @@ -0,0 +1,20 @@ +# In this case, the inner rectangle of the clip is empty, because +# the size is 200 and each corner radius is 100. +# The blue rect should be fully invisible +--- +root: + items: + - + type: "stacking-context" + bounds: [0, 0, 0, 0] + items: + - + type: clip + bounds: [0, 0, 200, 200] + complex: + - rect: [ 0, 0, 200, 200 ] + radius: 100 + items: + - type: rect + bounds: [ 0, 0, 200, 200 ] + color: red diff --git a/gfx/wr/wrench/reftests/clip/clip-empty-inner-rect.yaml b/gfx/wr/wrench/reftests/clip/clip-empty-inner-rect.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f8165f90d3256a3f56a13af46ee949257c23d103 --- /dev/null +++ b/gfx/wr/wrench/reftests/clip/clip-empty-inner-rect.yaml @@ -0,0 +1,28 @@ +# In this case, the inner rectangle of the clip is empty, because +# the size is 200 and each corner radius is 100. +# The blue rect should be fully invisible +--- +root: + items: + - + type: "stacking-context" + bounds: [0, 0, 0, 0] + items: + - + type: clip + bounds: [0, 0, 200, 200] + complex: + - rect: [ 0, 0, 200, 200 ] + radius: 100 + items: + - type: rect + bounds: [ 0, 0, 200, 200 ] + color: red + - type: "stacking-context" + bounds: [0, 0, 0, 0] + transform: translate(0, 0, 1) + items: + - + type: rect + bounds: [0, 0, 25, 25] + color: blue diff --git a/gfx/wr/wrench/reftests/clip/reftest.list b/gfx/wr/wrench/reftests/clip/reftest.list index a436496bb1688b9d0aa60d07502dd7779f880844..8e8f217f73926d40a1c922a9e2cc559fd74f1ad4 100644 --- a/gfx/wr/wrench/reftests/clip/reftest.list +++ b/gfx/wr/wrench/reftests/clip/reftest.list @@ -14,4 +14,4 @@ skip_on(android,device) == color_targets(3) alpha_targets(1) stacking-context-cl fuzzy(70,2400) == clip-and-filter-with-rotation.yaml clip-and-filter-with-rotation-ref.yaml color_targets(1) alpha_targets(0) == clip-out-rotation.yaml blank.yaml # Unexpected color targets, see bug 1580795 == clipped-occlusion.yaml clipped-occlusion-ref.yaml -== clip-thin-rotated.yaml clip-thin-rotated-ref.yaml +== clip-empty-inner-rect.yaml clip-empty-inner-rect-ref.yaml diff --git a/js/src/builtin/TestingFunctions.cpp b/js/src/builtin/TestingFunctions.cpp index 8197d420d57c742203f440f7bc48e233aadf6f22..e2f6fa0999fc44ee09e8eb7aa96decf87333cc45 100644 --- a/js/src/builtin/TestingFunctions.cpp +++ b/js/src/builtin/TestingFunctions.cpp @@ -93,7 +93,6 @@ #include "wasm/WasmJS.h" #include "wasm/WasmModule.h" #include "wasm/WasmSignalHandlers.h" -#include "wasm/WasmTesting.h" #include "wasm/WasmTypes.h" #include "debugger/DebugAPI-inl.h" @@ -899,90 +898,6 @@ static bool WasmIonDisabledByFeatures(JSContext* cx, unsigned argc, Value* vp) { return true; } -static bool WasmTextToBinary(JSContext* cx, unsigned argc, Value* vp) { - CallArgs args = CallArgsFromVp(argc, vp); - RootedObject callee(cx, &args.callee()); - - if (!args.requireAtLeast(cx, "wasmTextToBinary", 1)) { - return false; - } - - if (!args[0].isString()) { - ReportUsageErrorASCII(cx, callee, "First argument must be a String"); - return false; - } - - size_t textLen = args[0].toString()->length(); - - AutoStableStringChars twoByteChars(cx); - if (!twoByteChars.initTwoByte(cx, args[0].toString())) { - return false; - } - - wasm::Bytes bytes; - UniqueChars error; - if (!wasm::TextToBinary(twoByteChars.twoByteChars(), textLen, &bytes, - &error)) { - JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_TEXT_FAIL, - error.get() ? error.get() : "out of memory"); - return false; - } - - RootedObject binary(cx, JS_NewUint8Array(cx, bytes.length())); - if (!binary) { - return false; - } - - memcpy(binary->as<TypedArrayObject>().dataPointerUnshared(), bytes.begin(), - bytes.length()); - - args.rval().setObject(*binary); - return true; -} - -static bool WasmCodeOffsets(JSContext* cx, unsigned argc, Value* vp) { - CallArgs args = CallArgsFromVp(argc, vp); - RootedObject callee(cx, &args.callee()); - - if (!args.requireAtLeast(cx, "wasmCodeOffsets", 1)) { - return false; - } - - if (!args.get(0).isObject()) { - JS_ReportErrorASCII(cx, "argument is not an object"); - return false; - } - - SharedMem<uint8_t*> bytes; - size_t byteLength; - - JSObject* bufferObject = &args[0].toObject(); - JSObject* unwrappedBufferObject = CheckedUnwrapStatic(bufferObject); - if (!unwrappedBufferObject || - !IsBufferSource(unwrappedBufferObject, &bytes, &byteLength)) { - JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, - JSMSG_WASM_BAD_BUF_ARG); - return false; - } - - wasm::Uint32Vector offsets; - wasm::CodeOffsets(bytes.unwrap(), byteLength, &offsets); - - RootedObject jsOffsets(cx, JS::NewArrayObject(cx, offsets.length())); - if (!jsOffsets) { - return false; - } - for (size_t i = 0; i < offsets.length(); i++) { - uint32_t offset = offsets[i]; - RootedValue offsetVal(cx, NumberValue(offset)); - if (!JS_SetElement(cx, jsOffsets, i, offsetVal)) { - return false; - } - } - args.rval().setObject(*jsOffsets); - return true; -} - static bool ConvertToTier(JSContext* cx, HandleValue value, const wasm::Code& code, wasm::Tier* tier) { RootedString option(cx, JS::ToString(cx, value)); @@ -6712,15 +6627,6 @@ gc::ZealModeHelpText), " from being used then this returns a truthy string describing the features that\n." " are disabling it. Otherwise it returns false."), - JS_FN_HELP("wasmTextToBinary", WasmTextToBinary, 1, 0, -"wasmTextToBinary(str)", -" Translates the given text wasm module into its binary encoding."), - - JS_FN_HELP("wasmCodeOffsets", WasmCodeOffsets, 1, 0, -"wasmCodeOffsets(binary)", -" Decodes the given wasm binary to find the offsets of every instruction in the" -" code section."), - JS_FN_HELP("wasmExtractCode", WasmExtractCode, 1, 0, "wasmExtractCode(module[, tier])", " Extracts generated machine code from WebAssembly.Module. The tier is a string,\n" diff --git a/js/src/jit/AliasAnalysis.cpp b/js/src/jit/AliasAnalysis.cpp index eed6d5c6e27c4617d9add970e1bbfc346effd4db..1089ee447d3b10c4555c12c0c02d574587ac857f 100644 --- a/js/src/jit/AliasAnalysis.cpp +++ b/js/src/jit/AliasAnalysis.cpp @@ -154,6 +154,7 @@ static inline const MDefinition* GetObject(const MDefinition* ins) { case MDefinition::Opcode::ThrowRuntimeLexicalError: case MDefinition::Opcode::GetArgumentsObjectArg: case MDefinition::Opcode::SetArgumentsObjectArg: + case MDefinition::Opcode::CreateThis: case MDefinition::Opcode::CompareExchangeTypedArrayElement: case MDefinition::Opcode::AtomicExchangeTypedArrayElement: case MDefinition::Opcode::AtomicTypedArrayElementBinop: diff --git a/js/src/jit/MIR.h b/js/src/jit/MIR.h index ffa4e7d1b3596de14d6b9ef8a798be5e6327b2cd..a8d546d46670c83819c0a78eb391815a11dc6516 100644 --- a/js/src/jit/MIR.h +++ b/js/src/jit/MIR.h @@ -3561,8 +3561,11 @@ class MCreateThis : public MBinaryInstruction, TRIVIAL_NEW_WRAPPERS NAMED_OPERANDS((0, getCallee), (1, getNewTarget)) - // Although creation of |this| modifies global state, it is safely repeatable. - AliasSet getAliasSet() const override { return AliasSet::None(); } + // Performs a property read from |newTarget| iff |newTarget| is a JSFunction + // with an own |.prototype| property. + AliasSet getAliasSet() const override { + return AliasSet::Load(AliasSet::Any); + } bool possiblyCalls() const override { return true; } }; diff --git a/js/src/rust/Cargo.toml b/js/src/rust/Cargo.toml index 5ae614125ec2c90b60b690204daaaf1281e717eb..4094a71c15fef098f6a1cea644cd853e38e39201 100644 --- a/js/src/rust/Cargo.toml +++ b/js/src/rust/Cargo.toml @@ -20,3 +20,5 @@ smoosh = ['jsrust_shared/smoosh'] jsrust_shared = { path = "./shared" } # Workaround for https://github.com/rust-lang/rust/issues/58393 mozglue-static = { path = "../../../mozglue/static/rust" } +wat = { version = "1.0.14" } +wasmparser = { version = "0.48.2" } diff --git a/js/src/rust/lib.rs b/js/src/rust/lib.rs index e90fb547eae24f63e8288fd475e703b7485e20f2..69840a5a28ca74649421daafa14c6696ec107708 100644 --- a/js/src/rust/lib.rs +++ b/js/src/rust/lib.rs @@ -12,4 +12,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + extern crate jsrust_shared; +extern crate wat; +extern crate wasmparser; + +mod wasm; diff --git a/js/src/rust/shared/Cargo.toml b/js/src/rust/shared/Cargo.toml index 06c7e3fff8a819baa271d67bba7d769e36e53ae2..e80f88d615cf6ae37d7c567e935cd40d013a72ac 100644 --- a/js/src/rust/shared/Cargo.toml +++ b/js/src/rust/shared/Cargo.toml @@ -13,7 +13,6 @@ baldrdash = { path = "../../wasm/cranelift", optional = true } encoding_c = "0.9.5" encoding_c_mem = "0.2.4" smoosh = { path = "../../frontend/smoosh", optional = true } -wasm-rust = { path = "../../wasm/rust" } mozilla-central-workspace-hack = { path = "../../../../build/workspace-hack" } mozglue-static = { path = "../../../../mozglue/static/rust" } diff --git a/js/src/rust/shared/lib.rs b/js/src/rust/shared/lib.rs index 0eccfe5e66c347df867a93331d7c89180ea67c5e..31a3d5c53aec7e347a78daf5a5967f0a5c1c1577 100644 --- a/js/src/rust/shared/lib.rs +++ b/js/src/rust/shared/lib.rs @@ -21,5 +21,3 @@ extern crate mozglue_static; #[cfg(feature = "smoosh")] extern crate smoosh; - -extern crate wasm_rust; diff --git a/js/src/wasm/rust/src/lib.rs b/js/src/rust/wasm.rs similarity index 100% rename from js/src/wasm/rust/src/lib.rs rename to js/src/rust/wasm.rs diff --git a/js/src/wasm/WasmTesting.cpp b/js/src/shell/WasmTesting.cpp similarity index 98% rename from js/src/wasm/WasmTesting.cpp rename to js/src/shell/WasmTesting.cpp index 1f1a3b5c9a70149a8da456660a79b2ddf6e2d2e7..dcbbe7f4a073c0b70a860d87c57df743f58d7ebf 100644 --- a/js/src/wasm/WasmTesting.cpp +++ b/js/src/shell/WasmTesting.cpp @@ -16,7 +16,7 @@ * limitations under the License. */ -#include "wasm/WasmTesting.h" +#include "shell/WasmTesting.h" #include <inttypes.h> #include <stdbool.h> diff --git a/js/src/wasm/WasmTesting.h b/js/src/shell/WasmTesting.h similarity index 95% rename from js/src/wasm/WasmTesting.h rename to js/src/shell/WasmTesting.h index 595652f9e576959dd9aee57781e60f68c9fddf9c..fc6fc88118c2bea367249f57d741e024da013281 100644 --- a/js/src/wasm/WasmTesting.h +++ b/js/src/shell/WasmTesting.h @@ -16,8 +16,8 @@ * limitations under the License. */ -#ifndef wasm_testing_h -#define wasm_testing_h +#ifndef shell_wasm_h +#define shell_wasm_h #include "wasm/WasmTypes.h" @@ -43,4 +43,4 @@ extern void CodeOffsets(const uint8_t* bytes, size_t bytesLen, } // namespace wasm } // namespace js -#endif // wasm_testing_h +#endif // shell_wasm_h diff --git a/js/src/shell/js.cpp b/js/src/shell/js.cpp index 1a1fdbb71cdaef371b1b719ea6333e8274dad2ac..befbe877c94f4b50d9ddd9d0d3e7a8e717707298 100644 --- a/js/src/shell/js.cpp +++ b/js/src/shell/js.cpp @@ -117,6 +117,7 @@ #include "shell/jsoptparse.h" #include "shell/jsshell.h" #include "shell/OSObject.h" +#include "shell/WasmTesting.h" #include "threading/ConditionVariable.h" #include "threading/ExclusiveData.h" #include "threading/LockGuard.h" @@ -8218,6 +8219,90 @@ static bool SetARMHwCapFlags(JSContext* cx, unsigned argc, Value* vp) { return true; } +static bool WasmTextToBinary(JSContext* cx, unsigned argc, Value* vp) { + CallArgs args = CallArgsFromVp(argc, vp); + RootedObject callee(cx, &args.callee()); + + if (!args.requireAtLeast(cx, "wasmTextToBinary", 1)) { + return false; + } + + if (!args[0].isString()) { + ReportUsageErrorASCII(cx, callee, "First argument must be a String"); + return false; + } + + size_t textLen = args[0].toString()->length(); + + AutoStableStringChars twoByteChars(cx); + if (!twoByteChars.initTwoByte(cx, args[0].toString())) { + return false; + } + + wasm::Bytes bytes; + UniqueChars error; + if (!wasm::TextToBinary(twoByteChars.twoByteChars(), textLen, &bytes, + &error)) { + JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_TEXT_FAIL, + error.get() ? error.get() : "out of memory"); + return false; + } + + RootedObject binary(cx, JS_NewUint8Array(cx, bytes.length())); + if (!binary) { + return false; + } + + memcpy(binary->as<TypedArrayObject>().dataPointerUnshared(), bytes.begin(), + bytes.length()); + + args.rval().setObject(*binary); + return true; +} + +static bool WasmCodeOffsets(JSContext* cx, unsigned argc, Value* vp) { + CallArgs args = CallArgsFromVp(argc, vp); + RootedObject callee(cx, &args.callee()); + + if (!args.requireAtLeast(cx, "wasmCodeOffsets", 1)) { + return false; + } + + if (!args.get(0).isObject()) { + JS_ReportErrorASCII(cx, "argument is not an object"); + return false; + } + + SharedMem<uint8_t*> bytes; + size_t byteLength; + + JSObject* bufferObject = &args[0].toObject(); + JSObject* unwrappedBufferObject = CheckedUnwrapStatic(bufferObject); + if (!unwrappedBufferObject || + !IsBufferSource(unwrappedBufferObject, &bytes, &byteLength)) { + JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, + JSMSG_WASM_BAD_BUF_ARG); + return false; + } + + wasm::Uint32Vector offsets; + wasm::CodeOffsets(bytes.unwrap(), byteLength, &offsets); + + RootedObject jsOffsets(cx, JS::NewArrayObject(cx, offsets.length())); + if (!jsOffsets) { + return false; + } + for (size_t i = 0; i < offsets.length(); i++) { + uint32_t offset = offsets[i]; + RootedValue offsetVal(cx, NumberValue(offset)); + if (!JS_SetElement(cx, jsOffsets, i, offsetVal)) { + return false; + } + } + args.rval().setObject(*jsOffsets); + return true; +} + #ifndef __AFL_HAVE_MANUAL_CONTROL # define __AFL_LOOP(x) true #endif @@ -9222,6 +9307,15 @@ JS_FN_HELP("parseBin", BinParse, 1, 0, " wasm::Module into bytes, and deserialize those bytes in the current\n" " process, returning the resulting WebAssembly.Module."), + JS_FN_HELP("wasmTextToBinary", WasmTextToBinary, 1, 0, +"wasmTextToBinary(str)", +" Translates the given text wasm module into its binary encoding."), + + JS_FN_HELP("wasmCodeOffsets", WasmCodeOffsets, 1, 0, +"wasmCodeOffsets(binary)", +" Decodes the given wasm binary to find the offsets of every instruction in the" +" code section."), + JS_FN_HELP("transplantableObject", TransplantableObject, 0, 0, "transplantableObject([options])", " Returns the pair {object, transplant}. |object| is an object which can be\n" diff --git a/js/src/shell/moz.build b/js/src/shell/moz.build index be6cea093c8bb3105577329d7c56c342814c2032..7940924876749f5cb7ae1584c3424904ca0c3974 100644 --- a/js/src/shell/moz.build +++ b/js/src/shell/moz.build @@ -19,7 +19,8 @@ UNIFIED_SOURCES += [ 'js.cpp', 'jsoptparse.cpp', 'jsshell.cpp', - 'OSObject.cpp' + 'OSObject.cpp', + 'WasmTesting.cpp' ] if CONFIG['FUZZING_INTERFACES']: diff --git a/js/src/wasm/WasmStubs.cpp b/js/src/wasm/WasmStubs.cpp index 1b402783d4e0ea17da66a67b23331517a0c2260a..fc34030c2cdcca39fdd263d58869c40e504ecc1e 100644 --- a/js/src/wasm/WasmStubs.cpp +++ b/js/src/wasm/WasmStubs.cpp @@ -1889,7 +1889,7 @@ static bool GenerateImportInterpExit(MacroAssembler& masm, const FuncImport& fi, AlignBytes(StackArgBytes(invokeArgTypes), sizeof(double)); // The abiArgCount includes a stack result pointer argument if needed. unsigned abiArgCount = ArgTypeVector(fi.funcType()).length(); - unsigned argBytes = std::max<size_t>(1, abiArgCount * sizeof(Value)); + unsigned argBytes = std::max<size_t>(1, abiArgCount) * sizeof(Value); unsigned framePushed = StackDecrementForCall(ABIStackAlignment, sizeof(Frame), // pushed by prologue diff --git a/js/src/wasm/moz.build b/js/src/wasm/moz.build index 9cba04c1aa6cbd976a70a006842ef55834134178..66cd41a2a262b9c9886fc18e3076e7c63db711ab 100644 --- a/js/src/wasm/moz.build +++ b/js/src/wasm/moz.build @@ -40,7 +40,6 @@ UNIFIED_SOURCES += [ 'WasmSignalHandlers.cpp', 'WasmStubs.cpp', 'WasmTable.cpp', - 'WasmTesting.cpp', 'WasmTypes.cpp', 'WasmValidate.cpp' ] diff --git a/js/src/wasm/rust/Cargo.toml b/js/src/wasm/rust/Cargo.toml deleted file mode 100644 index 83293dfb85088df1cfc89b0fd063326beb8e376f..0000000000000000000000000000000000000000 --- a/js/src/wasm/rust/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "wasm-rust" -version = "0.1.0" -authors = ["The Spidermonkey developers"] -edition = "2018" - -[lib] -crate-type = ["rlib"] -name = "wasm_rust" - -[dependencies] -wat = { version = "1.0.14" } -wasmparser = { version = "0.48.2" } diff --git a/js/xpconnect/src/XPCJSContext.cpp b/js/xpconnect/src/XPCJSContext.cpp index 2f0c0a7ff33088701b8cd732b61cfbf7d1ed67ca..2934c27cf8f3a3a0e6706d27cd66c70fda70f499 100644 --- a/js/xpconnect/src/XPCJSContext.cpp +++ b/js/xpconnect/src/XPCJSContext.cpp @@ -1330,6 +1330,11 @@ void XPCJSContext::AfterProcessTask(uint32_t aNewRecursionDepth) { nsJSContext::MaybePokeCC(); CycleCollectedJSContext::AfterProcessTask(aNewRecursionDepth); mozilla::jsipc::AfterProcessTask(); + + // This exception might have been set if we called an XPCWrappedJS that threw, + // but now we're returning to the event loop, so nothing is going to look at + // this value again. Clear it to prevent leaks. + SetPendingException(nullptr); } bool XPCJSContext::IsSystemCaller() const { diff --git a/layout/base/PresShell.cpp b/layout/base/PresShell.cpp index 9e006823d902b1224e31e613eda39c4ca5af6ea6..f23130ed729b11dd8350ef63c7fdfe056a991c95 100644 --- a/layout/base/PresShell.cpp +++ b/layout/base/PresShell.cpp @@ -1597,6 +1597,24 @@ void PresShell::SelectionWillLoseFocus() { // Do nothing, the main selection is the default focused selection. } +// Selection repainting code relies on selection offsets being properly +// adjusted (see bug 1626291), so we need to wait until the DOM is finished +// notifying. +static void RepaintNormalSelectionWhenSafe(nsFrameSelection& aFrameSelection) { + if (nsContentUtils::IsSafeToRunScript()) { + aFrameSelection.RepaintSelection(SelectionType::eNormal); + return; + } + + // Note that importantly we don't defer changing the DisplaySelection. That'd + // be potentially racy with other code that may change it. + nsContentUtils::AddScriptRunner(NS_NewRunnableFunction( + "RepaintNormalSelectionWhenSafe", + [sel = RefPtr<nsFrameSelection>(&aFrameSelection)] { + sel->RepaintSelection(SelectionType::eNormal); + })); +} + void PresShell::FrameSelectionWillLoseFocus(nsFrameSelection& aFrameSelection) { if (mFocusedFrameSelection != &aFrameSelection) { return; @@ -1612,7 +1630,7 @@ void PresShell::FrameSelectionWillLoseFocus(nsFrameSelection& aFrameSelection) { if (old->GetDisplaySelection() != nsISelectionController::SELECTION_HIDDEN) { old->SetDisplaySelection(nsISelectionController::SELECTION_HIDDEN); - old->RepaintSelection(SelectionType::eNormal); + RepaintNormalSelectionWhenSafe(*old); } if (mSelection) { @@ -1627,7 +1645,7 @@ void PresShell::FrameSelectionWillTakeFocus(nsFrameSelection& aFrameSelection) { // document's focused selection doesn't change, and this is currently done // from RepaintSelection. Maybe we should move part of the global selection // handling here, or something of that sort, unclear. - aFrameSelection.RepaintSelection(SelectionType::eNormal); + RepaintNormalSelectionWhenSafe(aFrameSelection); #endif return; } @@ -1638,13 +1656,13 @@ void PresShell::FrameSelectionWillTakeFocus(nsFrameSelection& aFrameSelection) { if (old && old->GetDisplaySelection() != nsISelectionController::SELECTION_HIDDEN) { old->SetDisplaySelection(nsISelectionController::SELECTION_HIDDEN); - old->RepaintSelection(SelectionType::eNormal); + RepaintNormalSelectionWhenSafe(*old); } if (aFrameSelection.GetDisplaySelection() != nsISelectionController::SELECTION_ON) { aFrameSelection.SetDisplaySelection(nsISelectionController::SELECTION_ON); - aFrameSelection.RepaintSelection(SelectionType::eNormal); + RepaintNormalSelectionWhenSafe(aFrameSelection); } } diff --git a/layout/generic/crashtests/1628804.html b/layout/generic/crashtests/1628804.html new file mode 100644 index 0000000000000000000000000000000000000000..937a3474d14bdd0cb29e6b07dcf040a75fa811f5 --- /dev/null +++ b/layout/generic/crashtests/1628804.html @@ -0,0 +1,21 @@ +<style> +.c { + box-decoration-break: clone; + padding-bottom: 41vmax; +} +</style> +<script> +go = () => { + try { b.appendChild(a) } catch(e) { } +} +</script> +<body onload=go()> +<button style="columns: 72 0px"> +<dl style="columns: 1"> +<dd>-</dd> +<dt id="b" style="float: left" class="c">x</dt> +</dl> +<dl> +<map id="a"> +<canvas></canvas> +<details open="">x</details> diff --git a/layout/generic/crashtests/crashtests.list b/layout/generic/crashtests/crashtests.list index a172e736d88dea215f4b12efc0a4d063884c5258..f38f37c13387bbd4443f1cd6959bcd4725c4d5b3 100644 --- a/layout/generic/crashtests/crashtests.list +++ b/layout/generic/crashtests/crashtests.list @@ -758,4 +758,5 @@ load 1618312.html load 1618564.html load 1625051-1.html load 1625051-2.html +load 1628804.html load very-large-frameset.html diff --git a/layout/generic/nsBlockFrame.cpp b/layout/generic/nsBlockFrame.cpp index 6c7c7438cc74f53ae09800e09e431467e361d174..0922e9b0d441f9826f0807073784ae35c022539e 100644 --- a/layout/generic/nsBlockFrame.cpp +++ b/layout/generic/nsBlockFrame.cpp @@ -3055,8 +3055,7 @@ void nsBlockFrame::ReflowDirtyLines(BlockReflowInput& aState) { marker->SetRect(marker->GetRect() + nsPoint(0, offset)); } } - } else if (!Style()->IsPseudoOrAnonBox() && - StyleUI()->mUserModify != StyleUserModify::ReadOnly) { + } else if (ShouldHaveLineIfEmpty()) { aState.mBCoord += aState.mMinLineHeight; } } diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 0c38f608a4bd3367f713a9ea94f0ea3180e9f6c5..8dbd0cab0e9fc033993cccfc1ed4aa2e408b98d7 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -4688,6 +4688,13 @@ bool nsIFrame::IsSelectable(StyleUserSelect* aSelectStyle) const { return style != StyleUserSelect::None; } +bool nsIFrame::ShouldHaveLineIfEmpty() const { + if (Style()->IsPseudoOrAnonBox()) { + return false; + } + return IsEditingHost(this); +} + /** * Handles the Mouse Press Event for the frame */ diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h index 0793b2d962923f3decf4a903e1231824c63fae13..8b9fe2266fff90abe17a070da8aeaa79f7e9609d 100644 --- a/layout/generic/nsIFrame.h +++ b/layout/generic/nsIFrame.h @@ -1022,7 +1022,11 @@ class nsIFrame : public nsQueryFrame { mozilla::LogicalSize ContentSize(mozilla::WritingMode aWritingMode) const { auto bp = GetLogicalUsedBorderAndPadding(aWritingMode); bp.ApplySkipSides(GetLogicalSkipSides()); - return GetLogicalSize(aWritingMode) - bp.Size(aWritingMode); + const auto size = GetLogicalSize(aWritingMode); + return mozilla::LogicalSize( + aWritingMode, + std::max(0, size.ISize(aWritingMode) - bp.IStartEnd(aWritingMode)), + std::max(0, size.BSize(aWritingMode) - bp.BStartEnd(aWritingMode))); } /** @@ -3404,6 +3408,12 @@ class nsIFrame : public nsQueryFrame { */ bool IsSelectable(mozilla::StyleUserSelect* aSelectStyle) const; + /** + * Returns whether this frame should have the content-block-size of a line, + * even if empty. + */ + bool ShouldHaveLineIfEmpty() const; + /** * Called to retrieve the SelectionController associated with the frame. * diff --git a/layout/generic/nsImageFrame.cpp b/layout/generic/nsImageFrame.cpp index f7cfe97d8357d5b8a5607e7a147b1702e733ac74..ec7f1f2c2b303bffb1f7a789edaba28e05a205cb 100644 --- a/layout/generic/nsImageFrame.cpp +++ b/layout/generic/nsImageFrame.cpp @@ -281,6 +281,7 @@ void nsImageFrame::DestroyFrom(nsIFrame* aDestructRoot, imageLoader->FrameDestroyed(this); imageLoader->RemoveNativeObserver(mListener); } else if (mContentURLRequest) { + PresContext()->Document()->ImageTracker()->Remove(mContentURLRequest); nsLayoutUtils::DeregisterImageRequest(PresContext(), mContentURLRequest, &mContentURLRequestRegistered); mContentURLRequest->Cancel(NS_BINDING_ABORTED); @@ -402,6 +403,10 @@ void nsImageFrame::SetupForContentURLRequest() { return; } + // We're not using AssociateRequestToFrame for the content property, so we + // need to add it to the image tracker manually. + PresContext()->Document()->ImageTracker()->Add(mContentURLRequest); + uint32_t status = 0; nsresult rv = mContentURLRequest->GetImageStatus(&status); if (NS_FAILED(rv)) { diff --git a/media/libvpx/moz.build b/media/libvpx/moz.build index f3845941fe4dee1f4ab1e63672e046cb5a583650..47853d43408b790cc5131151be313e85d04fc15e 100644 --- a/media/libvpx/moz.build +++ b/media/libvpx/moz.build @@ -102,6 +102,8 @@ if CONFIG['OS_TARGET'] == 'Android': for f in SOURCES: if f.endswith('.c'): + if 'mmx.c' in f: + SOURCES[f].flags += ['-mmmx'] if 'sse2.c' in f: SOURCES[f].flags += CONFIG['SSE2_FLAGS'] if 'ssse3.c' in f: diff --git a/media/webrtc/signaling/src/media-conduit/VideoStreamFactory.cpp b/media/webrtc/signaling/src/media-conduit/VideoStreamFactory.cpp index 5f4cebf28110335af43497888d45cab4013b9541..b5575919a5566d22f9ec5d572329d15a6cac2db6 100644 --- a/media/webrtc/signaling/src/media-conduit/VideoStreamFactory.cpp +++ b/media/webrtc/signaling/src/media-conduit/VideoStreamFactory.cpp @@ -122,15 +122,14 @@ void VideoStreamFactory::SetSendingFramerate(unsigned int aSendingFramerate) { std::vector<webrtc::VideoStream> VideoStreamFactory::CreateEncoderStreams( int width, int height, const webrtc::VideoEncoderConfig& config) { - size_t streamCount = config.number_of_streams; + // We only allow one layer when screensharing + const size_t streamCount = + mCodecMode == webrtc::VideoCodecMode::kScreensharing + ? 1 + : config.number_of_streams; MOZ_RELEASE_ASSERT(streamCount >= 1, "Should request at least one stream"); - // We only allow one layer when screensharing - if (mCodecMode == webrtc::VideoCodecMode::kScreensharing) { - streamCount = 1; - } - std::vector<webrtc::VideoStream> streams; streams.reserve(streamCount); @@ -141,7 +140,7 @@ std::vector<webrtc::VideoStream> VideoStreamFactory::CreateEncoderStreams( mSimulcastAdapter->OnOutputFormatRequest( cricket::VideoFormat(width, height, 0, 0)); - for (size_t idx = streamCount - 1; streamCount > 0; idx--, streamCount--) { + for (int idx = streamCount - 1; idx >= 0; --idx) { webrtc::VideoStream video_stream; auto& encoding = mCodecConfig.mEncodings[idx]; MOZ_ASSERT(encoding.constraints.scaleDownBy >= 1.0); diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml index d8aadcaa531081dc1c67ff5238856b00a64770ae..93fc19198644413f2d59ed31a81f5a350c37e777 100644 --- a/modules/libpref/init/StaticPrefList.yaml +++ b/modules/libpref/init/StaticPrefList.yaml @@ -1384,7 +1384,7 @@ # Is support for AudioWorklet enabled? - name: dom.audioworklet.enabled type: bool - value: @IS_NIGHTLY_BUILD@ + value: true mirror: always # Is support for Navigator.getBattery enabled? @@ -2254,6 +2254,19 @@ value: false mirror: always +#ifdef XP_WIN + # Preference that is used to set nsILocalFileWin::useDOSDevicePathSyntax + # attribute for all local file instances created by QuotaManager and its + # clients. The value of this preference is cached so changing the preference + # during runtime has no effect. + # See bug 1626846 for setting this to false by default. +- name: dom.quotaManager.useDOSDevicePathSyntax + type: RelaxedAtomicBool + value: false + mirror: always + do_not_use_directly: true +#endif + # Reporting API. - name: dom.reporting.enabled type: RelaxedAtomicBool @@ -3097,7 +3110,7 @@ - name: dom.worklet.enabled type: bool - value: @IS_NIGHTLY_BUILD@ + value: true mirror: always # Enable content type normalization of XHR uploads via MIME Sniffing standard @@ -3963,6 +3976,11 @@ value: 10 mirror: once +- name: gfx.vsync.use-waitforvblank + type: RelaxedAtomicBool + value: false + mirror: always + # We expose two prefs: gfx.webrender.all and gfx.webrender.enabled. # The first enables WR+additional features, and the second just enables WR. # For developer convenience, building with --enable-webrender=true or just @@ -5332,7 +5350,7 @@ # Are implicit tracks in computed grid templates serialized? - name: layout.css.serialize-grid-implicit-tracks type: RelaxedAtomicBool - value: false + value: @IS_NOT_NIGHTLY_BUILD@ mirror: always # Set the number of device pixels per CSS pixel. A value <= 0 means choose @@ -6123,8 +6141,8 @@ mirror: always #if defined(XP_LINUX) && !defined(MOZ_WIDGET_ANDROID) value: true -#elif defined(XP_WIN) && !defined(_ARM64_) - value: @IS_EARLY_BETA_OR_EARLIER@ +#elif defined(XP_WIN) && !defined(_ARM64_) && !defined(_X86_) + value: true #else value: false #endif diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index 65438672e775051090e806591bcbc01b892fd404..1fd3c4805f75ec580727fc601567c7cd0c07bd63 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -533,6 +533,7 @@ pref("media.videocontrols.picture-in-picture.video-toggle.min-video-secs", 45); pref("media.getusermedia.noise", 1); // kModerate pref("media.getusermedia.agc_enabled", true); pref("media.getusermedia.agc", 1); // kAdaptiveDigital + pref("media.getusermedia.hpf_enabled", true); // full_duplex: enable cubeb full-duplex capture/playback pref("media.navigator.audio.full_duplex", true); #endif // MOZ_WEBRTC diff --git a/netwerk/base/PartiallySeekableInputStream.cpp b/netwerk/base/PartiallySeekableInputStream.cpp index 5a0aaf21ebca9f3944b5d228db63cdea89a05e10..40dcbc561f5b6693622ee9a9818d3702c6cf7876 100644 --- a/netwerk/base/PartiallySeekableInputStream.cpp +++ b/netwerk/base/PartiallySeekableInputStream.cpp @@ -56,6 +56,8 @@ PartiallySeekableInputStream::PartiallySeekableInputStream( mWeakCloneableInputStream(nullptr), mWeakIPCSerializableInputStream(nullptr), mWeakAsyncInputStream(nullptr), + mWeakInputStreamLength(nullptr), + mWeakAsyncInputStreamLength(nullptr), mCachedBuffer(aClonedFrom->mCachedBuffer), mBufferSize(aClonedFrom->mBufferSize), mPos(aClonedFrom->mPos), diff --git a/netwerk/dns/effective_tld_names.dat b/netwerk/dns/effective_tld_names.dat index eefd4ae9dc0fc1c8ea52439949a2c38c8c96ad28..0130401b73a651c7fc4115482ba766acd14ac213 100644 --- a/netwerk/dns/effective_tld_names.dat +++ b/netwerk/dns/effective_tld_names.dat @@ -212,6 +212,7 @@ ac.at co.at gv.at or.at +sth.ac.at // au : https://en.wikipedia.org/wiki/.au // http://www.auda.org.au/ @@ -7091,7 +7092,7 @@ org.zw // newGTLDs -// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2020-03-29T18:18:21Z +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2020-04-02T18:20:31Z // This list is auto-generated, don't edit it manually. // aaa : 2015-02-26 American Automobile Association, Inc. aaa @@ -10432,9 +10433,6 @@ xin // xn--efvy88h : 2014-08-22 Guangzhou YU Wei Information Technology Co., Ltd. 新闻 -// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited -工行 - // xn--fct429k : 2015-04-09 Amazon Registry Services, Inc. 家電 @@ -11097,6 +11095,10 @@ realm.cz // Submitted by Jonathan Rudenberg <jonathan@cupcake.io> cupcake.is +// Curv UG : https://curv-labs.de/ +// Submitted by Marvin Wiesner <Marvin@curv-labs.de> +curv.dev + // Customer OCI - Oracle Dyn https://cloud.oracle.com/home https://dyn.com/dns/ // Submitted by Gregory Drake <support@dyn.com> // Note: This is intended to also include customer-oci.com due to wildcards implicitly including the current label @@ -11132,6 +11134,10 @@ firm.dk reg.dk store.dk +// dappnode.io : https://dappnode.io/ +// Submitted by Abel Boldu / DAppNode Team <community@dappnode.io> +dyndns.dappnode.io + // dapps.earth : https://dapps.earth/ // Submitted by Daniil Burdakov <icqkill@gmail.com> *.dapps.earth @@ -11614,6 +11620,10 @@ twmail.org mymailer.com.tw url.tw +// Fabrica Technologies, Inc. : https://www.fabrica.dev/ +// Submitted by Eric Jiang <eric@fabrica.dev> +onfabrica.com + // Facebook, Inc. // Submitted by Peter Ruibal <public-suffix@fb.com> apps.fbsbx.com @@ -11716,6 +11726,10 @@ global.ssl.fastly.net // Submitted by Likhachev Vasiliy <lihachev@fastvps.ru> fastpanel.direct fastvps-server.com +myfast.space +myfast.host +fastvps.site +fastvps.host // Featherhead : https://featherhead.xyz/ // Submitted by Simon Menke <simon@featherhead.xyz> @@ -11729,6 +11743,13 @@ cloud.fedoraproject.org app.os.fedoraproject.org app.os.stg.fedoraproject.org +// FearWorks Media Ltd. : https://fearworksmedia.co.uk +// submitted by Keith Fairley <domains@fearworksmedia.co.uk> +conn.uk +copro.uk +couk.me +ukco.me + // Fermax : https://fermax.com/ // submitted by Koen Van Isterdael <k.vanisterdael@fermax.be> mydobiss.com @@ -11749,7 +11770,6 @@ firebaseapp.com // Flynn : https://flynn.io // Submitted by Jonathan Rudenberg <jonathan@flynn.io> -flynnhub.com flynnhosting.net // Frederik Braun https://frederik-braun.com @@ -11921,6 +11941,10 @@ publishproxy.com withgoogle.com withyoutube.com +// Aaron Marais' Gitlab pages: https://lab.aaronleem.co.za +// Submitted by Aaron Marais <its_me@aaronleem.co.za> +graphox.us + // Group 53, LLC : https://www.group53.com // Submitted by Tyler Todd <noc@nova53.net> awsmppl.com @@ -12051,8 +12075,9 @@ pixolino.com ipifony.net // IServ GmbH : https://iserv.eu -// Submitted by Kim-Alexander Brodowski <kim.brodowski@iserv.eu> +// Submitted by Kim-Alexander Brodowski <info@iserv.eu> mein-iserv.de +schulserver.de test-iserv.de iserv.dev @@ -12285,6 +12310,7 @@ nctu.me // Netlify : https://www.netlify.com // Submitted by Jessica Parsons <jessica@netlify.com> bitballoon.com +netlify.app netlify.com // Neustar Inc. @@ -12578,6 +12604,12 @@ on-web.fr *.platform.sh *.platformsh.site +// Platter: https://platter.dev +// Submitted by Patrick Flor <patrick@platter.dev> +platter-app.com +platter-app.dev +platterp.us + // Port53 : https://port53.io/ // Submitted by Maximilian Schieder <maxi@zeug.co> dyn53.io @@ -12791,6 +12823,10 @@ static.land dev.static.land sites.static.land +// Sony Interactive Entertainment LLC : https://sie.com/ +// Submitted by David Coles <david.coles@sony.com> +playstation-cloud.com + // SourceLair PC : https://www.sourcelair.com // Submitted by Antonis Kalipetis <akalipetis@sourcelair.com> apps.lair.io @@ -13018,6 +13054,11 @@ wmflabs.org toolforge.org wmcloud.org +// WISP : https://wisp.gg +// Submitted by Stepan Fedotov <stepan@wisp.gg> +panel.gg +daemon.panel.gg + // WoltLab GmbH : https://www.woltlab.com // Submitted by Tim Düsterhus <security@woltlab.cloud> myforum.community diff --git a/netwerk/protocol/http/nsHttpResponseHead.cpp b/netwerk/protocol/http/nsHttpResponseHead.cpp index 0de16f91d36dfe753b826a2475e7f5503e40c488..3561ebf581e03470885a4eac259e3d537c621dae 100644 --- a/netwerk/protocol/http/nsHttpResponseHead.cpp +++ b/netwerk/protocol/http/nsHttpResponseHead.cpp @@ -1081,7 +1081,7 @@ void nsHttpResponseHead::ParseVersion(const char* str) { Tokenizer t(str, nullptr, ""); // make sure we have HTTP at the beginning if (!t.CheckWord("HTTP")) { - if (t.CheckWord("ICY ")) { + if (PL_strncasecmp(str, "ICY ", 4) == 0) { // ShoutCast ICY is HTTP/1.0-like. Assume it is HTTP/1.0. LOG(("Treating ICY as HTTP 1.0\n")); mVersion = HttpVersion::v1_0; diff --git a/python/l10n/fluent_migrations/bug_1626381_about_addons_sidebar_titles.py b/python/l10n/fluent_migrations/bug_1626381_about_addons_sidebar_titles.py new file mode 100644 index 0000000000000000000000000000000000000000..1c82384171d92a4b5fa80d1b635dfa204fde1911 --- /dev/null +++ b/python/l10n/fluent_migrations/bug_1626381_about_addons_sidebar_titles.py @@ -0,0 +1,45 @@ + +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +from __future__ import absolute_import +import fluent.syntax.ast as FTL +from fluent.migrate.helpers import transforms_from +from fluent.migrate import COPY_PATTERN + + +def migrate(ctx): + """Bug 1626381 - Add titles to about:addons sidebar, part {index}""" + + ctx.add_transforms( + 'toolkit/toolkit/about/aboutAddons.ftl', + 'toolkit/toolkit/about/aboutAddons.ftl', + transforms_from( +""" +header-back-button = + .title = {COPY_PATTERN(from_path, "go-back-button.tooltiptext")} + +addon-category-discover-title = + .title = {COPY_PATTERN(from_path, "addon-category-discover")} +addon-category-available-updates-title = + .title = {COPY_PATTERN(from_path, "addon-category-available-updates")} +addon-category-recent-updates-title = + .title = {COPY_PATTERN(from_path, "addon-category-recent-updates")} +addon-category-extension-title = + .title = {COPY_PATTERN(from_path, "addon-category-extension")} +addon-category-theme-title = + .title = {COPY_PATTERN(from_path, "addon-category-theme")} +addon-category-locale-title = + .title = {COPY_PATTERN(from_path, "addon-category-locale")} +addon-category-plugin-title = + .title = {COPY_PATTERN(from_path, "addon-category-plugin")} +addon-category-dictionary-title = + .title = {COPY_PATTERN(from_path, "addon-category-dictionary")} + +sidebar-help-button-title = + .title = {COPY_PATTERN(from_path, "help-button")} +sidebar-preferences-button-title = + .title = {COPY_PATTERN(from_path, "preferences")} +""" + , from_path='toolkit/toolkit/about/aboutAddons.ftl') + ) diff --git a/security/manager/ssl/OSReauthenticator.cpp b/security/manager/ssl/OSReauthenticator.cpp index 31a8883f868e55c70ce2634f80d8a39575a673cd..78ff583075087c1b29334e747c2917f2836e826b 100644 --- a/security/manager/ssl/OSReauthenticator.cpp +++ b/security/manager/ssl/OSReauthenticator.cpp @@ -85,8 +85,10 @@ std::unique_ptr<char[]> GetUserTokenInfo() { static nsresult ReauthenticateUserWindows(const nsAString& aMessageText, const nsAString& aCaptionText, const WindowsHandle& hwndParent, - /* out */ bool& reauthenticated) { + /* out */ bool& reauthenticated, + /* out */ bool& isBlankPassword) { reauthenticated = false; + isBlankPassword = false; // Check if the user has a blank password before proceeding DWORD usernameLength = CREDUI_MAX_USERNAME_LENGTH + 1; @@ -104,6 +106,7 @@ static nsresult ReauthenticateUserWindows(const nsAString& aMessageText, CloseHandle(logonUserHandle); } reauthenticated = true; + isBlankPassword = true; return NS_OK; } } @@ -231,13 +234,15 @@ static nsresult ReauthenticateUserWindows(const nsAString& aMessageText, static nsresult ReauthenticateUser(const nsAString& prompt, const nsAString& caption, const WindowsHandle& hwndParent, - /* out */ bool& reauthenticated) { + /* out */ bool& reauthenticated, + /* out */ bool& isBlankPassword) { reauthenticated = false; + isBlankPassword = false; #if defined(XP_WIN) - return ReauthenticateUserWindows(prompt, caption, hwndParent, - reauthenticated); + return ReauthenticateUserWindows(prompt, caption, hwndParent, reauthenticated, + isBlankPassword); #elif defined(XP_MACOSX) - return ReauthenticateUserMacOS(prompt, reauthenticated); + return ReauthenticateUserMacOS(prompt, reauthenticated, isBlankPassword); #endif // Reauthentication is not implemented for this platform. return NS_OK; } @@ -248,15 +253,19 @@ static void BackgroundReauthenticateUser(RefPtr<Promise>& aPromise, const WindowsHandle& hwndParent) { nsAutoCString recovery; bool reauthenticated; + bool isBlankPassword; nsresult rv = ReauthenticateUser(aMessageText, aCaptionText, hwndParent, - reauthenticated); + reauthenticated, isBlankPassword); + nsTArray<bool> results(2); + results.AppendElement(reauthenticated); + results.AppendElement(isBlankPassword); nsCOMPtr<nsIRunnable> runnable(NS_NewRunnableFunction( "BackgroundReauthenticateUserResolve", - [rv, reauthenticated, aPromise = std::move(aPromise)]() { + [rv, results = std::move(results), aPromise = std::move(aPromise)]() { if (NS_FAILED(rv)) { aPromise->MaybeReject(rv); } else { - aPromise->MaybeResolve(reauthenticated); + aPromise->MaybeResolve(results); } })); NS_DispatchToMainThread(runnable.forget()); diff --git a/security/manager/ssl/OSReauthenticator.h b/security/manager/ssl/OSReauthenticator.h index 4ebc059c212df56052b7649efb03a60a8887bc6e..837dfa91c0fe5d2f9da3df2f493c237477dc4092 100644 --- a/security/manager/ssl/OSReauthenticator.h +++ b/security/manager/ssl/OSReauthenticator.h @@ -29,7 +29,8 @@ class OSReauthenticator : public nsIOSReauthenticator { #ifdef XP_MACOSX nsresult ReauthenticateUserMacOS(const nsAString& aPrompt, - /* out */ bool& aReauthenticated); + /* out */ bool& aReauthenticated, + /* out */ bool& aIsBlankPassword); #endif // XP_MACOSX #endif // OSReauthenticator_h diff --git a/security/manager/ssl/OSReauthenticatorDarwin.mm b/security/manager/ssl/OSReauthenticatorDarwin.mm index ac834898d91ba782d6ca4ba5c9fa2efcfe7fad7c..ac1ff66f9bcddc3e17d1fa40b3e588cceedd2956 100644 --- a/security/manager/ssl/OSReauthenticatorDarwin.mm +++ b/security/manager/ssl/OSReauthenticatorDarwin.mm @@ -16,7 +16,8 @@ using namespace mozilla; static const int32_t kPasswordNotSetErrorCode = -1000; nsresult ReauthenticateUserMacOS(const nsAString& aPrompt, - /* out */ bool& aReauthenticated) { + /* out */ bool& aReauthenticated, + /* out */ bool& aIsBlankPassword) { // The idea here is that we ask to be authorized to unlock the user's session. // This should cause a prompt to come up for the user asking them for their // password. If they correctly enter it, we'll set aReauthenticated to true. @@ -26,7 +27,8 @@ nsresult ReauthenticateUserMacOS(const nsAString& aPrompt, dispatch_semaphore_t sema = dispatch_semaphore_create(0); - __block BOOL biometricSuccess = NO; // mark variable r/w across the block + __block BOOL biometricSuccess = NO; // mark variable r/w across the block + __block BOOL errorPasswordNotSet = NO; // mark variable r/w across the block // Note: This is an async callback in an already-async Promise chain. [context evaluatePolicy:LAPolicyDeviceOwnerAuthentication @@ -38,9 +40,8 @@ nsresult ReauthenticateUserMacOS(const nsAString& aPrompt, // but this is a best-effort mechanism and there's no particular case for // propagating up XPCOM. The one exception being a user account that // has no passcode set, which we handle below. - if (success || [error code] == kPasswordNotSetErrorCode) { - biometricSuccess = YES; - } + errorPasswordNotSet = error && [error code] == kPasswordNotSetErrorCode; + biometricSuccess = success || errorPasswordNotSet; dispatch_semaphore_signal(sema); }); }]; @@ -52,6 +53,7 @@ nsresult ReauthenticateUserMacOS(const nsAString& aPrompt, sema = NULL; aReauthenticated = biometricSuccess; + aIsBlankPassword = errorPasswordNotSet; [context release]; return NS_OK; diff --git a/security/manager/ssl/StaticHPKPins.h b/security/manager/ssl/StaticHPKPins.h index 120027448cd4d678543b80ed93091c69b46ae3ea..49c313f2e421037baade1dbf435ceaf72b572466 100644 --- a/security/manager/ssl/StaticHPKPins.h +++ b/security/manager/ssl/StaticHPKPins.h @@ -1149,4 +1149,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = { static const int32_t kUnknownId = -1; -static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1594302968429000); +static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1595512322973000); diff --git a/security/manager/ssl/nsSTSPreloadList.inc b/security/manager/ssl/nsSTSPreloadList.inc index 1763f0fe0ffec9abf1275e30174d0215e400e1bd..d5ce775c075a755187a1c7044212e2ee2153374b 100644 --- a/security/manager/ssl/nsSTSPreloadList.inc +++ b/security/manager/ssl/nsSTSPreloadList.inc @@ -8,7 +8,7 @@ /*****************************************************************************/ #include <stdint.h> -const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); +const PRTime gPreloadListExpirationTime = INT64_C(1597931506167000); %% 0--1.de, 1 0-1.party, 1 @@ -24,7 +24,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 000a7.com, 1 000a8.com, 1 000a9.com, 1 -000b58.com, 1 000bet86.com, 1 000x2.com, 1 000x3.com, 1 @@ -125,6 +124,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 015zl.com, 1 0165365.com, 0 0166z6.com, 1 +016910804.xyz, 1 016kb.com, 1 0175365.com, 0 0177z6.com, 1 @@ -501,7 +501,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 0cp8778.com, 1 0d111.com, 1 0day.agency, 1 -0day.su, 1 0dayexploits.gq, 1 0des.com, 1 0i0.nl, 1 @@ -540,6 +539,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 0x52.net, 1 0x52.org, 1 0x53.de, 1 +0x5d.de, 1 0x7.io, 1 0x76.de, 1 0x7d.com, 1 @@ -581,7 +581,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 1004233.com, 1 1007337.com, 1 10086.ru, 1 -100aaaa.com, 1 100cccc.com, 1 100dddd.com, 1 100eeee.com, 1 @@ -596,11 +595,9 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 100mani.it, 1 100onrainkajino.com, 1 100pounds.co.uk, 1 -100pppp.com, 1 100pudov.tk, 1 100qqqq.com, 1 100rrrr.com, 1 -100tttt.com, 1 100up.de, 1 100up.org, 1 100uuuu.com, 1 @@ -649,7 +646,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 10495.net, 1 105318.com, 1 1068511.com, 1 -1069.cloud, 1 106jamz.com, 1 10774.net, 1 107996.com, 1 @@ -679,11 +675,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 110bg.com, 1 110bu.com, 1 110bv.com, 1 -110ca.com, 1 -110cb.com, 1 110ce.com, 1 -110cl.com, 1 -110ef.com, 1 110eh.com, 1 110ej.com, 1 110ek.com, 1 @@ -691,15 +683,12 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 110ep.com, 1 110es.com, 1 110et.com, 1 -110ff.com, 1 110fn.com, 1 110fr.com, 1 110gf.com, 1 110gh.com, 1 -110gs.com, 1 110hq.com, 1 110jf.com, 1 -110jt.com, 1 110ju.com, 1 110jx.com, 1 110k8.com, 1 @@ -708,18 +697,15 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 110kp.com, 1 110lh.com, 1 110lj.com, 1 -110na.com, 1 110ne.com, 1 110nf.com, 1 110ng.com, 1 110nl.com, 1 110nr.com, 1 -110nx.com, 1 110nz.com, 1 110pe.com, 1 110qa.com, 1 110qc.com, 1 -110qs.com, 1 110qu.com, 1 110rd.com, 1 110rl.com, 1 @@ -732,7 +718,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 110wf.com, 1 110wq.com, 1 110wy.com, 1 -110xn.com, 1 110xp.com, 1 110xz.com, 1 110yj.com, 1 @@ -742,7 +727,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 110yu.com, 1 110ze.com, 1 110zg.com, 1 -110zw.com, 1 111.one, 1 1111365t.com, 1 1111k8.com, 1 @@ -759,7 +743,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 1117z6.com, 1 1119365.com, 1 1119z6.com, 1 -111b58.com, 1 111bet86.com, 1 111novosti.tk, 1 111ttt.com, 1 @@ -812,7 +795,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 1120350.com, 1 112112112.net, 1 11221jz.com, 1 -11223837.com, 1 1122z6.com, 1 1126p.com, 1 112app.nl, 1 @@ -822,44 +804,29 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 1130p.com, 1 113113113.net, 1 11321365.com, 1 -11333837.com, 1 -11335835.com, 1 1133z6.com, 1 11365t.com, 1 113k8.com, 1 113kb.com, 1 113ks.com, 1 113z6.com, 1 -11443837.com, 1 -11445835.com, 1 114514ss.com, 1 -11553837.com, 1 -11555835.com, 1 -115lc.com, 1 115z6.com, 1 -11663837.com, 1 -11665835.com, 1 1166z6.com, 1 116ks.com, 1 116lc.com, 1 116vip.net, 1 116z6.com, 1 -11773837.com, 1 -11775835.com, 1 1177z6.com, 1 117lc.com, 1 117z6.com, 1 118118118.net, 1 -11883837.com, 1 -11885835.com, 1 1188bet.vip, 1 1188z6.com, 1 118btt.com, 1 118vip.net, 1 118z6.com, 1 1190america.tk, 1 -11993837.com, 1 -11995835.com, 1 1199bet.vip, 1 1199z6.com, 1 119lc.com, 1 @@ -876,17 +843,14 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 11b58.com, 1 11bbee.com, 1 11bbjj.com, 1 -11bbkk.com, 1 11bbpp.com, 1 11bbqq.com, 1 11bbrr.com, 1 11bbss.com, 1 11bbtt.com, 1 -11bbyy.com, 1 11bbzz.com, 1 11bet86.com, 1 11ccee.com, 1 -11ccff.com, 1 11ccgg.com, 1 11cchh.com, 1 11ccjj.com, 1 @@ -910,13 +874,10 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 11ddzz.com, 1 11dzon.com, 1 11eebb.com, 1 -11eecc.com, 1 -11eedd.com, 1 11eeff.com, 1 11eegg.com, 1 11eehh.com, 1 11eejj.com, 1 -11eepp.com, 1 11eeqq.com, 1 11eess.com, 1 11eett.com, 1 @@ -928,8 +889,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 11ffhh.com, 1 11ffjj.com, 1 11ffkk.com, 1 -11ffpp.com, 1 -11ffqq.com, 1 11ffrr.com, 1 11fftt.com, 1 11ffxx.com, 1 @@ -948,10 +907,8 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 11ggrr.com, 1 11ggss.com, 1 11ggtt.com, 1 -11ggxx.com, 1 11ggyy.com, 1 11ggzz.com, 1 -11hhcc.com, 1 11hhee.com, 1 11hhff.com, 1 11hhgg.com, 1 @@ -959,33 +916,25 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 11hhqq.com, 1 11hhrr.com, 1 11hhtt.com, 1 -11hhyy.com, 1 11hhzz.com, 1 11jjaa.com, 1 -11jjbb.com, 1 11jjcc.com, 1 11jjee.com, 1 -11jjff.com, 1 -11jjhh.com, 1 11jjpp.com, 1 11jjqq.com, 1 11jjrr.com, 1 11jjtt.com, 1 -11jjyy.com, 1 11jjzz.com, 1 11kkee.com, 1 11kkff.com, 1 11kkss.com, 1 -11kkyy.com, 1 11lc8.com, 1 11lc8.net, 1 11loc.de, 1 11men.tk, 1 -11ppbb.com, 1 11ppcc.com, 1 11ppdd.com, 1 11ppee.com, 1 -11ppff.com, 1 11ppgg.com, 1 11pphh.com, 1 11ppjj.com, 1 @@ -996,7 +945,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 11ppzz.com, 1 11qqbb.com, 1 11qqdd.com, 1 -11qqee.com, 1 11qqff.com, 1 11qqgg.com, 1 11qqhh.com, 1 @@ -1004,9 +952,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 11qqpp.com, 1 11qqrr.com, 1 11qqss.com, 1 -11qqtt.com, 1 11qqyy.com, 1 -11qqzz.com, 1 11rrcc.com, 1 11rrdd.com, 1 11rree.com, 1 @@ -1018,10 +964,8 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 11rrpp.com, 1 11rrqq.com, 1 11rrss.com, 1 -11rrxx.com, 1 11rryy.com, 1 11rrzz.com, 1 -11ssff.com, 1 11sshh.com, 1 11ssjj.com, 1 11sskk.com, 1 @@ -1029,14 +973,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 11ssqq.com, 1 11ssrr.com, 1 11sstt.com, 1 -11sszz.com, 1 11thstreetcoffee.com, 1 11ttbb.com, 1 -11ttcc.com, 1 11ttdd.com, 1 11ttee.com, 1 11ttff.com, 1 -11ttgg.com, 1 11tthh.com, 1 11ttkk.com, 1 11ttpp.com, 1 @@ -1054,19 +995,13 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 11yykk.com, 1 11yypp.com, 1 11yyqq.com, 1 -11yyrr.com, 1 -11yytt.com, 1 11yyxx.com, 1 -11yyzz.com, 1 -11zzaa.com, 1 11zzbb.com, 1 11zzdd.com, 1 -11zzee.com, 1 11zzgg.com, 1 11zzhh.com, 1 11zzjj.com, 1 11zzkk.com, 1 -11zzqq.com, 1 11zztt.com, 1 11zzyy.com, 1 120323.com, 1 @@ -1181,6 +1116,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 123roulement.be, 1 123roulement.com, 1 123seo.ml, 1 +123start.pl, 1 123termpapers.com, 1 123viajando.com, 1 123writings.com, 1 @@ -1198,7 +1134,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 1288fc.com, 1 1299bet.com, 1 12ag8.com, 1 -12ca.com, 1 12l.nl, 1 12nomos.tk, 1 12thmanrising.com, 1 @@ -1401,26 +1336,17 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 157ks.com, 1 157ks.net, 1 157z6.com, 1 -158be.com, 1 -158bg.com, 1 -158bh.com, 1 -158bi.com, 1 -158bq.com, 1 158fb.com, 1 -158gs.com, 1 158ia.com, 1 158in.com, 1 158iw.com, 1 158k66.ag, 1 158k66.com, 1 158ks.net, 1 -158nb.com, 1 158yt.com, 1 -158yu.com, 1 158yv.com, 1 158z6.com, 1 158za.com, 1 -158zh.com, 1 1590284872.rsc.cdn77.org, 1 15918.net, 1 159cp.com, 1 @@ -1483,23 +1409,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 162229.com, 1 162361.com, 1 162632.com, 1 -162be.com, 1 162bf.com, 1 162bg.com, 1 -162bj.com, 1 162ca.com, 1 162cb.com, 1 -162ce.com, 1 162cf.com, 1 -162ch.com, 1 -162cq.com, 1 -162cr.com, 1 -162cs.com, 1 -162cx.com, 1 -162cy.com, 1 -162dc.com, 1 -162dg.com, 1 -162ea.com, 1 162ee.com, 1 162ff.com, 1 162jj.com, 1 @@ -1513,6 +1427,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 1666ks.com, 1 166jk.cc, 1 166ks.net, 1 +166zzz.com, 1 16836500.com, 1 1683651.com, 1 16836511.com, 1 @@ -1750,6 +1665,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 189ks.net, 1 189z6.com, 1 18agks.com, 1 +18celebration.com, 1 18f.gov, 1 18f.gsa.gov, 0 18upchat.com, 1 @@ -1856,10 +1772,10 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 1europlan.nl, 1 1f123.net, 1 1fach-digital.de, 1 +1fax.com, 1 1fc0.org, 1 1gp.us, 1 1hc.be, 1 -1hourproofreading.com, 1 1in9.net, 1 1it.click, 1 1js.de, 0 @@ -1900,7 +1816,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 1scope.com, 1 1se.co, 1 1se2or3.com, 1 -1simplesolution.com, 1 1st-bounce.co.uk, 1 1st-community.de, 1 1st2bounce.com, 1 @@ -1930,6 +1845,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 2000feet.tk, 1 2000meter.no, 1 2001y.me, 1 +2002000.xyz, 1 200201.xyz, 1 2002138.com, 1 20071019780415.com, 1 @@ -1947,13 +1863,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 200llll.com, 1 200mmmm.com, 1 200oooo.com, 1 -200pppp.com, 1 200qqqq.com, 1 200rrrr.com, 1 200uuuu.com, 1 200vvvv.com, 1 200wwww.com, 1 -200xxxx.com, 1 200yyyy.com, 1 200zzzz.com, 1 2012.ovh, 1 @@ -1978,7 +1892,22 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 202jj.com, 1 2030404.com, 1 2030411.com, 1 +2033004.com, 1 +2033005.com, 1 2033a.com, 1 +2033b.com, 1 +2033c.com, 1 +2033d.com, 0 +2033e.com, 0 +2033f.com, 0 +2033g.com, 0 +2033h.com, 0 +2033i.com, 0 +2033l.com, 0 +2033m.com, 0 +2033n.com, 0 +2033r.com, 0 +2033s.com, 0 2033z.com, 1 204504byse.info, 1 2048-spiel.de, 1 @@ -2025,13 +1954,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 2226321.com, 1 2227035.com, 1 2227552.com, 1 -222b58.com, 1 222bet86.com, 1 222digits.pl, 1 222k8.com, 1 222k8.net, 1 222tips.com, 1 -222yn.com, 1 222zlong.com, 1 224918.com, 1 225485.com, 1 @@ -2076,16 +2003,13 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 22bbtt.com, 1 22bbyy.com, 1 22bet86.com, 1 -22ccaa.com, 1 22ccbb.com, 1 -22ccee.com, 1 22ccpp.com, 1 22ccxx.com, 1 22cncn.com, 1 22d.io, 1 22ddhh.com, 1 22ddii.com, 1 -22ddjj.com, 1 22ddkk.com, 1 22ddpp.com, 1 22ddqq.com, 1 @@ -2098,15 +2022,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 22eegg.com, 1 22eekk.com, 1 22eess.com, 1 -22ffcc.com, 1 22ffee.com, 1 -22ffgg.com, 1 22ffpp.com, 1 22ffxx.com, 1 22ggaa.com, 1 22ggdd.com, 1 -22gugu.com, 1 -22haha.com, 1 22haose.com, 1 22hehe.com, 1 22hhcc.com, 1 @@ -2122,11 +2042,9 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 22kb88.com, 1 22kkdd.com, 1 22kkpp.com, 1 -22kkss.com, 1 22kkyy.com, 1 22lc8.com, 1 22lc8.net, 1 -22momo.com, 1 22ppdd.com, 1 22ppgg.com, 1 22ppss.com, 1 @@ -2134,21 +2052,16 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 22qqbb.com, 1 22qqgg.com, 1 22qqii.com, 1 -22qqjj.com, 1 22qqrr.com, 1 22qqtt.com, 1 -22rere.com, 1 22rree.com, 1 22rrff.com, 1 22rrss.com, 1 -22ruru.com, 1 22ssbb.com, 1 22ssjj.com, 1 22sskk.com, 1 22sstt.com, 1 -22tete.com, 1 22ttgg.com, 1 -22ttkk.com, 1 22txc.com, 1 22vetter.st, 1 22xxhh.com, 1 @@ -2225,6 +2138,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 247a.co.uk, 1 247healthshop.com, 1 247medplan.com, 1 +247naijabuzz.com, 1 247xchanger.com, 1 2484811.com, 1 24848168.com, 1 @@ -2295,21 +2209,15 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 2525admin.nl, 1 2555z6.com, 1 255k8.com, 1 -256ab.com, 1 256ac.com, 1 256be.com, 1 256bf.com, 1 -256bk.com, 1 256bl.com, 1 256bp.com, 1 256bq.com, 1 -256br.com, 1 -256bs.com, 1 256bt.com, 1 256bx.com, 1 -256ge.com, 1 256hh.com, 1 -256hk.com, 1 256k.me, 1 256pb.com, 1 256pf.com, 1 @@ -2331,38 +2239,20 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 266k66.com, 1 266z6.com, 1 269196.com, 1 -26bbc.com, 1 26ce.com, 1 -26ck.com, 1 -26ddc.com, 1 26gt.com, 1 -26he.com, 1 26ja.com, 1 -26na.com, 1 26nc.com, 1 26nd.com, 1 -26pa.com, 1 -26pe.com, 1 26pg.com, 1 26pn.com, 1 -26rd.com, 1 26sn.com, 1 26sr.com, 1 26ssb.com, 1 -26uuu.com, 1 26uuu.info, 1 -26uuu.mobi, 1 -26uuu.net, 1 -26uuu.org, 1 -26uuu.tv, 1 -26uuu.us, 1 -26xe.com, 1 -26yk.com, 1 26z6.com, 1 27000.best, 1 2718282.net, 1 -276112.com, 1 -276117.com, 1 276771.com, 1 27728522.com, 1 2777z6.com, 1 @@ -2376,7 +2266,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 2831365.com, 0 28365cn-365.com, 1 28428.com, 1 -284365.com, 1 285551.com, 1 2858958.com, 1 2888z6.com, 1 @@ -2437,8 +2326,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 2h-nagoya.org, 1 2habc.com, 1 2heartsbookings.co.uk, 1 -2hypeenterprises.com, 1 -2isk.in, 1 2jhb.com, 1 2kgwf.fi, 1 2krueger.de, 1 @@ -2447,8 +2334,10 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 2learncomputing.ga, 1 2link.ga, 1 2lovebirdsblog.com, 1 +2makeu.com, 1 2manydots.nl, 1 2mb.solutions, 1 +2me.cl, 1 2melo.fr, 1 2mir.com, 1 2monkeysandme.com, 1 @@ -2467,7 +2356,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 2ulcceria.nl, 1 2wheel.com, 0 2x.nu, 1 -2ximedia.com, 1 2y.fi, 1 2y3x.com, 1 3-dot-careapp1-146314.appspot.com, 1 @@ -2480,11 +2368,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 300bbbb.com, 1 300cccc.com, 1 300dddd.com, 1 -300ffff.com, 1 -300gggg.com, 1 300hhhh.com, 1 -300iiii.com, 1 -300jjjj.com, 1 300kkkk.com, 1 300llll.com, 1 300mmmm.com, 1 @@ -2594,7 +2478,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 31du.cn, 1 31klabs.com, 1 320281.net, 1 -321098.com, 1 321132.com, 1 321666365.com, 1 321live.nl, 1 @@ -2631,7 +2514,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 3336321.com, 1 33365t.com, 1 3337035.com, 1 -333b58.com, 1 333bet86.com, 1 333zlong.com, 1 33445111.com, 1 @@ -2656,14 +2538,10 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 338sa.com, 1 33acac.com, 1 33am8.com, 1 -33ao.com, 1 33b58.com, 1 33bet86.com, 1 33btt.net, 1 33devici.ml, 1 -33eh.com, 1 -33ej.com, 1 -33iz.com, 1 33jiasu.com, 1 33kb88.com, 1 33knkn.com, 1 @@ -2727,75 +2605,53 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 349433.com, 1 349533.com, 1 34ac.com, 1 -34ae.com, 1 34ax.com, 1 -34bg.com, 1 34bk.com, 1 34da.com, 1 -34ex.com, 1 34fc.com, 1 34fy.com, 1 34gn.com, 1 34gr.com, 1 34gv.com, 1 34hc.com, 1 -34he.com, 1 34if.com, 1 34il.com, 1 34iu.com, 1 34iv.com, 1 34ix.com, 1 -34ja.com, 1 34jb.com, 1 -34je.com, 1 -34jf.com, 1 34jg.com, 1 34ji.com, 1 34jm.com, 1 34jn.com, 1 -34jr.com, 1 -34jt.com, 1 -34jw.com, 1 34kr.com, 1 34lb.com, 1 34ld.com, 1 -34lf.com, 1 -34lk.com, 1 34lp.com, 1 34lq.com, 1 34lr.com, 1 -34lz.com, 1 -34nb.com, 1 34nd.com, 1 -34nf.com, 1 -34nh.com, 1 -34ni.com, 1 -34nj.com, 1 34nv.com, 1 34nw.com, 1 34oa.com, 1 34oh.com, 1 34om.com, 1 34oy.com, 1 -34pl.com, 1 34pv.com, 1 34py.com, 1 34qa.com, 1 34qf.com, 1 -34qo.com, 1 34qx.com, 1 34sh.com, 1 34sk.com, 1 34uf.com, 1 34va.com, 1 34vd.com, 1 -34vf.com, 1 34vh.com, 1 34vi.com, 1 34vt.com, 1 34vu.com, 1 34vz.com, 1 -34wv.com, 1 34xc.com, 1 34xt.com, 1 34xu.com, 1 @@ -2843,15 +2699,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 35898z.com, 1 35d88.com, 1 35dr.com, 1 -35ga.com, 1 35if.com, 1 35jq.com, 1 35ud.com, 1 35ue.com, 1 -35uh.com, 1 -35uj.com, 1 35vn.com, 1 -360365.com, 1 360gpscorp.com, 1 360hosting.com.au, 1 360live.fr, 1 @@ -2950,7 +2802,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 3659869.com, 1 3659980.com, 1 365a1.com, 1 -365b58.com, 1 365beautyworld.com, 1 365cn-288.com, 1 365d88.com, 1 @@ -2967,6 +2818,19 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 365nnn.vip, 0 365nnnn.com, 0 365propertybuyer.co.uk, 0 +365q02.com, 0 +365q03.com, 0 +365q04.com, 0 +365q05.com, 0 +365q06.com, 0 +365q07.com, 0 +365q08.com, 0 +365q10.com, 0 +365q11.com, 0 +365q12.com, 0 +365q13.com, 0 +365q14.com, 0 +365q15.com, 0 365r.co, 0 365rr.vip, 0 365sb-cn.com, 1 @@ -2997,51 +2861,32 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 3666ks.com, 1 366k66.com, 1 366z6.com, 1 -369ak.com, 1 369az.com, 1 -369be.com, 1 369bk.com, 1 369bn.com, 1 -369bp.com, 1 -369bq.com, 1 -369br.com, 1 369bu.com, 1 369bw.com, 1 369cd.com, 1 -369ce.com, 1 369ck.com, 1 369cr.com, 1 369cu.com, 1 -369df.com, 1 -369dk.com, 1 -369dp.com, 1 369dr.com, 1 -369ea.com, 1 369ec.com, 1 369eh.com, 1 369em.com, 1 369ep.com, 1 -369eq.com, 1 -369ex.com, 1 -369ey.com, 1 -369ez.com, 1 369fj.com, 1 -369fm.com, 1 369fn.com, 1 369ft.com, 1 369fy.com, 1 369gh.com, 1 369gp.com, 1 -369ha.com, 1 369ja.com, 1 -369mb.com, 1 369mr.com, 1 369nk.com, 1 369pb.com, 1 369qb.com, 1 369ra.com, 1 -369rr.com, 1 -369tw.com, 1 369ve.com, 1 369wt.com, 1 36ag8.com, 1 @@ -3113,34 +2958,8 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 381115.com, 1 38138938.com, 1 382225.com, 1 -3837a.com, 1 -3837app.com, 1 -3837app3837app.com, 1 -3837app3837app3837app.com, 1 -3837b.com, 1 -3837c.com, 1 -3837d.com, 1 -3837e.com, 1 -3837g.com, 1 -3837h.com, 1 -3837i.com, 1 -3837j.com, 1 -3837k.com, 1 -3837l.com, 1 -3837m.com, 1 -3837n.com, 1 -3837o.com, 1 -3837p.com, 1 -3837q.com, 1 3837r.com, 1 3837s.com, 1 -3837t.com, 1 -3837u.com, 1 -3837v.com, 1 -3837w.com, 1 -3837x.com, 1 -3837y.com, 1 -3837z.com, 1 3838onndo.tk, 1 3839.ca, 1 383aaa.com, 1 @@ -3189,17 +3008,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 3957y.com, 1 3957z.com, 1 396228.com, 1 -396301.com, 1 -396302.com, 1 -396303.com, 1 -396304.com, 1 -396305.com, 1 3963aa.com, 1 -3963bb.com, 1 -3963cc.com, 1 -3963dd.com, 1 -3963ee.com, 1 -3963ff.com, 1 396422.com, 1 3970a.com, 1 3970aa.com, 1 @@ -3284,6 +3093,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 3candy.com, 1 3cbalance.pl, 1 3cc365.com, 1 +3commas.io, 1 3countiescastlehire.co.uk, 1 3cs.ch, 1 3d-animator.net, 1 @@ -3306,7 +3116,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 3dmusiclab.nl, 1 3dnovedades.com, 1 3do3dont.com, 1 -3dprintinggear.net, 1 3dprintsondemand.eu, 1 3dreactions.com, 1 3dsupplies.be, 1 @@ -3355,6 +3164,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 3niu7.com, 1 3niu8.com, 1 3niu88.com, 1 +3niu888.com, 1 3niu9.com, 1 3niusurl.com, 1 3niuurl.com, 1 @@ -3464,7 +3274,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 4096bit.de, 0 40acts.org.uk, 1 40daysforlifepensacola.com, 1 -40percentpapermache.com, 0 +40percentpapermache.com, 1 41-where.com, 1 41199.com, 1 411film.com, 1 @@ -3473,7 +3283,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 4144bet.com, 1 414553.com, 1 4151365.com, 1 -416365.com, 1 41844.de, 0 418663.com, 1 41studio.com, 1 @@ -3481,7 +3290,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 42.tools, 1 420.nerdpol.ovh, 1 420java.com, 1 -420screen.com, 1 420weedcenter.com, 1 4233065.com, 1 4233068.com, 1 @@ -3520,7 +3328,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 43klive.com, 1 44-k.com, 1 440887.com, 1 -440cc.com, 1 44168365.com, 1 441jj.com, 0 442887.com, 1 @@ -3532,11 +3339,9 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 4447035.com, 1 4447552.com, 1 444887.com, 1 -444b58.com, 1 444bet86.com, 1 4455bet.vip, 1 445887.com, 1 -44b58.com, 1 44sec.com, 0 451.ooo, 1 451365.com, 1 @@ -3569,17 +3374,13 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 46ap.com, 1 46ay.com, 1 46az.com, 1 -46bf.com, 1 46bg.com, 1 46bh.com, 1 -46bk.com, 1 -46bl.com, 1 46bn.com, 1 46bp.com, 1 46bq.com, 1 46br.com, 1 46bx.com, 1 -46ce.com, 1 46cg.com, 1 46cu.com, 1 46d88.com, 1 @@ -3590,49 +3391,26 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 46dn.com, 1 46dr.com, 1 46ds.com, 1 -46dx.com, 1 -46ea.com, 1 46eb.com, 1 -46ec.com, 1 46ed.com, 1 -46ef.com, 1 46eg.com, 1 -46eh.com, 1 -46ej.com, 1 -46ek.com, 1 46ep.com, 1 46eq.com, 1 -46es.com, 1 46et.com, 1 -46ex.com, 1 46ey.com, 1 -46ez.com, 1 46fa.com, 1 -46fb.com, 1 -46fd.com, 1 -46fe.com, 1 -46fg.com, 1 -46fh.com, 1 -46fj.com, 1 -46fk.com, 1 -46fn.com, 1 46fp.com, 1 46fq.com, 1 -46fr.com, 1 -46fx.com, 1 46gc.com, 1 46gi.com, 1 46gj.com, 1 46gk.com, 1 46gl.com, 1 -46gp.com, 1 46gx.com, 1 46gy.com, 1 46gz.com, 1 46ha.com, 1 -46hc.com, 1 46he.com, 1 -46hf.com, 1 46hi.com, 1 46hl.com, 1 46ia.com, 1 @@ -3648,10 +3426,8 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 46jc.com, 1 46jd.com, 1 46jr.com, 1 -46jx.com, 1 46kh.com, 1 46ki.com, 1 -46kl.com, 1 46kn.com, 1 46kp.com, 1 46kq.com, 1 @@ -3659,7 +3435,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 46ky.com, 1 46kz.com, 1 46lf.com, 1 -46lj.com, 1 46lk.com, 1 46lq.com, 1 46lt.com, 1 @@ -3667,7 +3442,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 46ng.com, 1 46ni.com, 1 46nk.com, 1 -46nr.com, 1 46nu.com, 1 46pg.com, 1 46pj.com, 1 @@ -3682,7 +3456,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 46rj.com, 1 46rl.com, 1 46rn.com, 1 -46rt.com, 1 46rx.com, 1 46rz.com, 1 46sd.com, 1 @@ -3727,8 +3500,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 46zk.com, 1 46zl.com, 1 46zn.com, 1 -46zs.com, 1 -46zt.com, 1 47.rs, 1 4706666.com, 1 4716666.com, 1 @@ -3741,7 +3512,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 4776070.com, 1 4786666.com, 1 47af.com, 1 -47an.com, 1 47d88.com, 1 47dp.com, 1 47essays.com, 1 @@ -3758,10 +3528,8 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 47iz.com, 1 47jc.com, 1 47kl.com, 1 -47ld.com, 1 47lo.com, 1 47nf.com, 1 -47nh.com, 1 47nt.com, 1 47ph.com, 1 47qe.com, 1 @@ -3775,26 +3543,17 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 47vg.com, 1 47vk.com, 1 47vy.com, 1 -47vz.com, 1 47wv.com, 1 47xc.com, 1 47xt.com, 1 -47yf.com, 1 47yi.com, 1 47yp.com, 1 47yr.com, 1 -47yt.com, 1 47yv.com, 1 47yw.com, 1 47yz.com, 1 -47za.com, 1 47ze.com, 1 47zg.com, 1 -47zi.com, 1 -47zm.com, 1 -47zn.com, 1 -47zq.com, 1 -47zt.com, 1 47zv.com, 1 48365365cn.com, 1 48365cn-365.com, 1 @@ -3828,6 +3587,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 4dillusion.tk, 1 4dlatest.com, 1 4dpredict.com, 1 +4driver.eu, 1 4dropping.com, 1 4everproxy.com, 1 4evip.com, 1 @@ -3836,10 +3596,10 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 4flex.info, 1 4freepress.com, 1 4g-server.eu, 0 -4garage.com.br, 1 4gnews.pt, 1 4hmediaproductions.com, 1 4host.ch, 1 +4hypo.cz, 1 4iners.com, 1 4investors.de, 1 4kpi.eu, 1 @@ -3847,7 +3607,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 4lephants.tk, 1 4list.ml, 1 4loc.us, 1 -4lock.com.br, 1 4mama.ua, 1 4maniacos.tk, 1 4mm.org, 1 @@ -3872,6 +3631,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 4vector.com, 1 4vf.de, 1 4vio.com, 1 +4voip.ru, 1 4web-hosting.com, 1 4wrd.cc, 1 4x.fi, 1 @@ -3882,6 +3642,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 4xlabs.co, 1 4y4a-arts.space, 1 50-ottenkov.tk, 1 +50.gy, 1 50.pe, 1 5000164.com, 1 5000164.jp, 1 @@ -3889,7 +3650,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 5002888.com, 1 5004233.com, 1 5007999.com, 1 -500aaaa.com, 1 500bbbb.com, 1 500dddd.com, 1 500eeee.com, 1 @@ -3909,8 +3669,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 500uuuu.com, 1 500vvvv.com, 1 500wordessay.gq, 1 -500xxxx.com, 1 -500yyyy.com, 1 500zzzz.com, 1 501117.com, 1 5017501.com, 1 @@ -4063,17 +3821,12 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 52051.com, 1 52051a.com, 1 5205365.com, 0 -52062a.com, 1 -52062b.com, 1 +52062e.com, 1 52062g.com, 1 52062i.com, 1 -52062j.com, 1 -52062m.com, 1 -52062n.com, 1 -52062r.com, 1 -52062t.com, 1 -52062w.com, 1 +52062l.com, 1 52062y.com, 1 +52062z.com, 1 5206365.com, 0 5209365.com, 0 520xpjxpj.com, 0 @@ -4085,6 +3838,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 524922.com, 1 525.info, 1 5287.com, 1 +528sss.com, 1 529kb.com, 1 529sss.com, 1 52b9.com, 1 @@ -4130,9 +3884,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 546802.com, 1 54below.com, 1 54lsj.cc, 1 -551365.com, 1 5518k3.com, 1 -552365.com, 1 552z6.com, 1 55321365.com, 1 5533445.com, 1 @@ -4146,7 +3898,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 5556321.com, 1 5557035.com, 1 5557552.com, 1 -555b58.com, 1 555bet86.com, 1 555btt.com, 1 555k8.com, 1 @@ -4161,11 +3912,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 5566bet.vip, 1 556777.cc, 1 556z6.com, 1 +557bbb.com, 1 557z6.com, 1 558btt.net, 1 558z6.com, 1 559z6.com, 1 -55b58.com, 1 55bet86.com, 1 55d88.com, 1 55k66.vip, 1 @@ -4199,11 +3950,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 578637.com, 1 5792.org, 1 579422.com, 1 -5795111.com, 1 -579533.com, 1 5795444.com, 1 -5795885.com, 1 -5795886.com, 1 5795887.com, 1 5796.org, 1 5797.org, 1 @@ -4329,17 +4076,15 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 5thchichesterscouts.org.uk, 1 5thelementtease.com, 1 5y.fi, 1 +6.gift, 1 6004233.com, 1 60062b.cc, 1 60062h.cc, 1 60062i.cc, 1 600aaaa.com, 1 600bbbb.com, 1 -600cao.com, 1 600dddd.com, 1 -600gao.com, 1 600iiii.com, 1 -600jjjj.com, 1 600k8.com, 1 600kkkk.com, 1 600llll.com, 1 @@ -4538,9 +4283,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 6396yyy.com, 1 6396zzz.com, 1 63aj.com, 1 -63ak.com, 1 -63ao.com, 1 -63ap.com, 1 63at.com, 1 63bg.com, 1 63bh.com, 1 @@ -4555,44 +4297,30 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 63et.com, 1 63fb.com, 1 63fd.com, 1 -63fg.com, 1 63fk.com, 1 63fn.com, 1 63fp.com, 1 -63fq.com, 1 63ga.com, 1 63gaming.com, 1 63gc.com, 1 63gf.com, 1 63gh.com, 1 -63gi.com, 1 63gj.com, 1 63gn.com, 1 63gq.com, 1 -63gt.com, 1 63gu.com, 1 63ha.com, 1 63he.com, 1 -63ho.com, 1 63hq.com, 1 63hv.com, 1 63hx.com, 1 63ia.com, 1 -63ib.com, 1 -63ic.com, 1 63if.com, 1 -63ig.com, 1 63ik.com, 1 63im.com, 1 -63iq.com, 1 -63ir.com, 1 -63iv.com, 1 63iw.com, 1 -63ix.com, 1 -63jg.com, 1 63jl.com, 1 63jr.com, 1 -63jw.com, 1 63kd.com, 1 63ki.com, 1 63kl.com, 1 @@ -4606,15 +4334,12 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 63lr.com, 1 63md.com, 1 63mf.com, 1 -63mj.com, 1 63mq.com, 1 -63nc.com, 1 63nd.com, 1 63ng.com, 1 63ni.com, 1 63nk.com, 1 63nl.com, 1 -63np.com, 1 63nx.com, 1 63of.com, 1 63ox.com, 1 @@ -4630,7 +4355,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 63rz.com, 1 63ta.com, 1 63tf.com, 1 -63to.com, 1 63tx.com, 1 63ud.com, 1 63uf.com, 1 @@ -4743,7 +4467,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 659422.com, 1 659ks.com, 1 65d88.com, 1 -66.tn, 1 6602p.com, 1 661326.com, 1 6616.fun, 1 @@ -4792,8 +4515,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 663365x.com, 1 663365y.com, 1 663365z.com, 1 -663651.com, 1 -663657.com, 1 6639s.com, 1 663z6.com, 1 664048.com, 1 @@ -4824,7 +4545,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 6669255.com, 1 666999bet.com, 1 666am8.com, 1 -666b58.com, 1 666bet86.com, 1 666btt.net, 1 666k66.com, 1 @@ -4851,7 +4571,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 66ag9.com, 1 66agks.com, 1 66b.com, 1 -66b58.com, 1 66bet86.com, 1 66bwf.com, 1 66d88.net, 1 @@ -5013,7 +4732,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 681vv.com, 1 68277.me, 1 6830521.com, 1 -6848.com, 1 68522.com, 1 68522c.com, 1 68522k.com, 1 @@ -5140,33 +4858,22 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 7-it.ml, 1 700.az, 1 7004233.com, 1 -700aaaa.com, 1 700bbbb.com, 1 700cccc.com, 1 700dddd.com, 1 700gggg.com, 1 700hhhh.com, 1 700iiii.com, 1 -700jjjj.com, 1 700k8.com, 1 700mmmm.com, 1 -700nnnn.com, 1 -700oooo.com, 1 -700pppp.com, 1 -700qqqq.com, 1 -700ssss.com, 1 -700tttt.com, 1 700uuuu.com, 1 -700vvvv.com, 1 700wns.com, 1 -700wwww.com, 1 700yyyy.com, 1 700zzzz.com, 1 701135.com, 1 701605.com, 1 -70365365.com, 0 +70365365.com, 1 704233.com, 1 -7045.com, 1 704533.com, 1 7045h.com, 1 704633.com, 1 @@ -5199,6 +4906,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 7214.cc, 1 721aa.com, 1 722201.com, 1 +722sss.com, 1 722z6.com, 1 724233.com, 1 724go.com, 1 @@ -5222,7 +4930,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 732365.com, 1 732433.com, 1 733575.com, 1 -73365365.com, 0 +73365365.com, 1 7337006.com, 1 7337007.com, 1 733z6.com, 1 @@ -5239,29 +4947,18 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 73ar.com, 1 73ax.com, 1 73az.com, 1 -73dt.com, 1 73ea.com, 1 73eb.com, 1 73ef.com, 1 -73eg.com, 1 73eh.com, 1 73ei.com, 1 73ej.com, 1 73ek.com, 1 73en.com, 1 -73ep.com, 1 -73eq.com, 1 73es.com, 1 -73eu.com, 1 -73ew.com, 1 73ex.com, 1 -73ey.com, 1 -73ez.com, 1 73fd.com, 1 73fg.com, 1 -73fh.com, 1 -73fj.com, 1 -73fk.com, 1 73fl.com, 1 73fp.com, 1 73fq.com, 1 @@ -5272,7 +4969,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 73gb.com, 1 73gc.com, 1 73gf.com, 1 -73gi.com, 1 73gj.com, 1 73gl.com, 1 73gn.com, 1 @@ -5301,8 +4997,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 73ld.com, 1 73lg.com, 1 73ln.com, 1 -73ng.com, 1 -73nj.com, 1 73nk.com, 1 73nm.com, 1 73np.com, 1 @@ -5318,7 +5012,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 73qe.com, 1 73ql.com, 1 73qx.com, 1 -73ra.com, 1 73rh.com, 1 73rq.com, 1 73rt.com, 1 @@ -5349,7 +5042,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 73xm.com, 1 73xv.com, 1 73yj.com, 1 -73yp.com, 1 73yr.com, 1 73yu.com, 1 73za.com, 1 @@ -5391,7 +5083,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 762116.com, 1 763365.com, 1 76365365.com, 1 -7654321c.com, 1 +7654321c.com, 0 765666365.com, 1 7666321.com, 1 76668.com, 1 @@ -5426,6 +5118,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 777365t.com, 1 7776321.com, 0 7776365.com, 1 +7777365q.com, 0 7777k8.com, 1 7777k8.net, 1 777bet86.com, 1 @@ -5435,7 +5128,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 779z6.com, 1 77b58.com, 1 77bet86.com, 1 -77caca.com, 1 77dd.com, 1 77lc8.com, 1 77zaza.com, 1 @@ -5477,6 +5169,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 790security.co.za, 1 791188.com, 1 793ww.com, 1 +795sss.com, 1 797715.com, 1 798sss.com, 1 799ks.com, 1 @@ -5505,11 +5198,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 7minutemiles.com, 0 7pets.net, 1 7plus.com.au, 1 +7proxies.com, 1 7qly.com, 1 7sdre.am, 1 7starhealth.ga, 1 7th-heaven.me, 1 -7thcircledesigns.com, 1 7url.ml, 1 7win.am, 1 7x24servis.com, 1 @@ -5534,10 +5227,8 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 800kkkk.com, 1 800llll.com, 1 800nnnn.com, 1 -800pppp.com, 1 800qqqq.com, 1 800rrrr.com, 1 -800uuuu.com, 1 800vvvv.com, 1 800wwww.com, 1 800xxxx.com, 1 @@ -5730,7 +5421,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 8199d88.com, 1 819kb.com, 1 81d88.com, 1 -81sese.com, 1 81sese.net, 1 81sese.org, 1 81uc.com, 1 @@ -5886,39 +5576,28 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 8391p.com, 1 8396p.com, 1 83kb88.com, 1 -842365.com, 1 842844.com, 1 846773.com, 1 847773.com, 1 848663.com, 1 848jz.com, 1 -84ab.com, 1 84ag.com, 1 84aj.com, 1 84al.com, 1 84an.com, 1 84aq.com, 1 84ar.com, 1 -84at.com, 1 84az.com, 1 84bd.com, 1 -84be.com, 1 84bf.com, 1 -84bh.com, 1 84bi.com, 1 84bn.com, 1 84bp.com, 1 84bq.com, 1 84bx.com, 1 -84cd.com, 1 -84ce.com, 1 84cl.com, 1 84cr.com, 1 -84cs.com, 1 -84cu.com, 1 -84cw.com, 1 84cx.com, 1 -84df.com, 1 84dp.com, 1 84dt.com, 1 84eg.com, 1 @@ -5931,21 +5610,13 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 84fb.com, 1 84fd.com, 1 84fe.com, 1 -84fg.com, 1 -84fh.com, 1 84fi.com, 1 -84fj.com, 1 -84fn.com, 1 -84fp.com, 1 -84fq.com, 1 84fs.com, 1 84ft.com, 1 -84fy.com, 1 84fz.com, 1 84ga.com, 1 84gc.com, 1 84gf.com, 1 -84gh.com, 1 84gi.com, 1 84gk.com, 1 84gt.com, 1 @@ -5953,51 +5624,33 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 84he.com, 1 84hp.com, 1 84hs.com, 1 -84hv.com, 1 84hx.com, 1 84ia.com, 1 84if.com, 1 84im.com, 1 84jg.com, 1 -84jh.com, 1 84ji.com, 1 84jl.com, 1 -84jp.com, 1 84jt.com, 1 84kc.com, 1 -84kh.com, 1 -84ki.com, 1 84kl.com, 1 84kn.com, 1 84kp.com, 1 84kq.com, 1 -84kr.com, 1 -84kt.com, 1 84kv.com, 1 -84kz.com, 1 84lb.com, 1 84lh.com, 1 -84nf.com, 1 -84ni.com, 1 -84nv.com, 1 -84nx.com, 1 -84pb.com, 1 -84pd.com, 1 84pe.com, 1 84pg.com, 1 -84ph.com, 1 84pq.com, 1 -84qa.com, 1 84qb.com, 1 84qf.com, 1 -84qi.com, 1 84qj.com, 1 84qx.com, 1 84rb.com, 1 84rd.com, 1 84rf.com, 1 84rn.com, 1 -84rt.com, 1 84sg.com, 1 84sr.com, 1 84sv.com, 1 @@ -6016,17 +5669,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 84yj.com, 1 84yp.com, 1 84yq.com, 1 -84yt.com, 1 84yv.com, 1 84yw.com, 1 -84za.com, 1 84zb.com, 1 84zc.com, 1 -84zd.com, 1 -84ze.com, 1 -84zm.com, 1 84zr.com, 1 -84zt.com, 1 84zu.com, 1 84zv.com, 1 850226.com, 1 @@ -6306,7 +5953,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 8886ks.com, 1 888789j.com, 1 8887ks.com, 1 -88881.pw, 1 +8888365q.com, 0 888888722.com, 1 88889822.com, 1 8888esb.com, 1 @@ -6314,7 +5961,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 8889ks.com, 1 888am8.com, 1 888am8.net, 1 -888b58.com, 1 888bet86.com, 1 888bwf.com, 1 888funcity.com, 1 @@ -6347,7 +5993,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 88agks.com, 1 88bet86.com, 1 88btt.net, 1 -88caca.com, 1 +88cakescorner.com, 1 88d.com, 1 88djl.cc, 1 88home9.com, 1 @@ -6375,7 +6021,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 88yule6.com, 1 88yule7.com, 1 88yule9.com, 1 -88zaza.com, 1 88zl.app, 1 8900d.com, 1 8901178.com, 1 @@ -6460,7 +6105,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 8yun.ga, 0 9-11commission.gov, 1 9005424.com, 1 -9009019.com, 1 +9009019.com, 0 900aaaa.com, 1 900bbbb.com, 1 900cccc.com, 1 @@ -6474,7 +6119,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 900qqqq.com, 1 900tttt.com, 1 900uuuu.com, 1 -900vvvv.com, 1 900wwww.com, 1 900yyyy.com, 1 900zzzz.com, 1 @@ -6503,6 +6147,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 915ers.com, 0 915kb.com, 1 917.moe, 1 +918-siteinfo.com, 1 918.com, 1 9180.fun, 1 9180nn.com, 1 @@ -6841,7 +6486,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 9297yy.co, 1 9297z.co, 1 9297zz.co, 1 -92ganb.com, 1 92kb88.com, 1 92url.com, 1 931422.com, 1 @@ -6872,7 +6516,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 93cq.com, 1 93jc.cn, 1 93kb88.com, 1 -940365.com, 1 941988.cn, 1 943022.com, 1 9449-27a1-22a1-e0d9-4237-dd99-e75e-ac85-2f47-9d34.de, 1 @@ -6986,6 +6629,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 9721mm.com, 0 9721yy.com, 0 972422.com, 1 +9728.com, 0 9728a.co, 1 9728aa.co, 1 9728b.co, 1 @@ -7054,9 +6698,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 9788876.com, 1 9796k8.com, 1 9796k8.net, 1 +97bros.com, 1 9800.cc, 1 981ccc.com, 1 9822.am, 1 +9822.com, 1 9822am.com, 1 9822cn.com, 1 9822hk.com, 1 @@ -7070,7 +6716,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 985kb.com, 1 986ccc.com, 1 9877bet.com, 1 -988316.com, 0 +988316.com, 1 988am8.com, 1 988am8.net, 1 988wh.com, 1 @@ -7086,11 +6732,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 9906753.net, 1 99123j.com, 1 9918883.com, 1 +991ccc.com, 1 992z6.com, 1 99321365.com, 1 9933445.com, 1 99365t.com, 1 -993ccc.com, 1 99456j.com, 1 9950p.com, 1 99599.fi, 1 @@ -7150,7 +6796,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 999998722.com, 1 9999k8.com, 1 9999k8.net, 1 -999b58.com, 1 999bet86.com, 1 999btt.net, 1 999k66.com, 1 @@ -7160,7 +6805,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000); 999zlong.com, 1 99agks.com, 1 99bet86.com, 1 -99billionaire.com, 1 99buffets.com, 1 99d88.com, 1 99kb88.com, 1 @@ -7399,7 +7043,6 @@ a210.online, 1 a22z.xyz, 1 a291.cc, 1 a2a.me, 1 -a2a.net, 1 a2c-co.net, 1 a2censo.com, 1 a2ch.ru, 1 @@ -7468,13 +7111,13 @@ aaa-racing.net, 1 aaa-racing.uk, 1 aaapl.com, 1 aaapo.com.br, 1 -aabanet.com.br, 1 aaben-bank.dk, 1 aabenbank.dk, 1 aabenjaminjewelry.com, 1 aacs-design.com, 1 aadv.com.br, 1 aaex.uk, 1 +aaflalo.me, 1 aagetransport.no, 1 aalalbayt.com, 1 aalalbayt.net, 1 @@ -7549,6 +7192,7 @@ abbottscastles.co.uk, 1 abbruch-star.de, 1 abbtw.com, 1 abbyairsoft.tk, 1 +abbyvangrinsven.co.nz, 1 abc-rz.de, 1 abc-solutions.cf, 1 abc.li, 1 @@ -7604,6 +7248,7 @@ aberdeencastles.co.uk, 1 aberdeencriticalmass.tk, 1 aberdeenjudo.co.uk, 1 aberon.pl, 1 +abeshultz.com, 1 abetterdeath.com, 1 abeus.com, 1 abg.ninja, 1 @@ -7642,7 +7287,6 @@ ableprop.net, 1 abloomnova.net, 1 abloop.com, 1 abmackenzie.com, 1 -abmc.gov, 1 abminiplex.in, 1 abmledger.ca, 1 abmtax.ca, 1 @@ -7727,6 +7371,7 @@ abrilect.com, 1 abristolgeek.co.uk, 1 abrition.com, 1 abseits.org, 0 +absentia.cf, 1 absolem.cc, 0 absoluav.com, 1 absoluconseils.com, 1 @@ -7766,6 +7411,7 @@ abvent.net, 1 abvlbasketviganello.ch, 0 abwatches.net, 1 abyssproject.net, 1 +abzarweb.com, 1 ac-admin.pl, 1 ac-booster.net, 1 ac-cosmetics.nl, 1 @@ -7787,7 +7433,6 @@ academkin.com, 1 academus.io, 1 academy-awards.ml, 1 academytv.com.au, 1 -acampar.com.br, 1 acandroid.top, 1 acaonegocios.com.br, 1 acapadena.co, 1 @@ -7806,7 +7451,7 @@ accademiapugilistica.it, 1 accadia.academy, 1 accelaway.com, 1 accelerate.network, 1 -acceleratenetworks.com, 1 +acceleratenetworks.com, 0 accelerateyourworld.org, 1 accelsnow.com, 1 accentthailand.com, 1 @@ -7870,7 +7515,6 @@ acemobileforce.com, 1 acemsa.ga, 1 acemypaper.com, 1 acen.eu, 1 -acendealuz.com.br, 1 acerentalandsales.com, 1 acerislaw.com, 1 aceshop702.com, 1 @@ -7880,6 +7524,7 @@ acg.mn, 1 acg.social, 1 acg.vc, 1 acgaudio.com, 1 +acgc.nl, 1 acgmoon.com, 1 acgmoon.org, 1 acgpiano.club, 1 @@ -7919,6 +7564,7 @@ acneintelligence.com, 1 acnh.info, 1 acnpacific.com, 1 acodess.com, 1 +acolicy.com, 1 acomplia20mg.cf, 1 aconnor.xyz, 1 acordes.online, 1 @@ -8058,7 +7704,6 @@ ad-notam.uk, 1 ad-notam.us, 1 ad-s.cn, 1 ad4msan.com, 1 -ad4msan.win, 1 ada.eco, 1 ada.gov, 1 adaera.com, 1 @@ -8084,6 +7729,7 @@ adamh.website, 1 adamjoycegames.co.uk, 1 adamkostecki.de, 1 adamlee.com, 1 +adamliu.net, 1 adamoutler.com, 1 adamov.tk, 1 adamradocz.com, 1 @@ -8171,6 +7817,7 @@ adf.rocks, 1 adfisicateca.org, 1 adftrasporti.it, 1 adhd-inattentive.com, 1 +adhdyogi.ca, 1 adhesivelaundry.co.uk, 1 adhgroup.ug, 1 adhockery.ga, 1 @@ -8263,11 +7910,13 @@ adrenalin.travel, 1 adrenaline-gaming.ru, 1 adrian-riemer.tk, 1 adrian.web.id, 1 +adrian2023.com, 1 adrianajewelry.my, 1 adrianbechtold.de, 1 adriancitu.com, 1 adriancostin.ro, 1 adrianjensen.com, 1 +adriankeenan.co.uk, 1 adrianmejias.com, 1 adrianoansaldi.it, 1 adrianobarbosa.xyz, 1 @@ -8278,7 +7927,6 @@ adrianweb.ml, 1 adriarae.xyz, 1 adriatic.hr, 1 adriatrans.ga, 1 -adrienjacquierbret.com, 1 adrienkohlbecker.com, 1 adriennesmiles.com, 1 adrinet.tk, 1 @@ -8299,7 +7947,6 @@ adswoo.com, 1 adtelligent.com, 1 adtgroup.com, 1 adti.pt, 1 -adult.properties, 1 adultbizz.eu, 1 adultforum.gr, 1 adultshop.com.au, 1 @@ -8325,8 +7972,8 @@ advancedheatinginc.com, 1 advancedoneroofing.com, 1 advancedprotectionkey.com, 1 advancedprotectionsecuritykey.com, 1 +advancedroofingmuskoka.com, 1 advancedseotool.it, 1 -advancedsepticandpumping.com, 1 advancedsurgicalconsultantsllc.com, 1 advancedturf.tk, 1 advancedurologyswla.com, 1 @@ -8383,7 +8030,6 @@ 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 advokatkonsult.cf, 1 advokatonline.ml, 1 @@ -8401,7 +8047,6 @@ advokaty.gq, 1 advst.uk, 1 advtran.com, 1 adware.pl, 0 -adwokatkosterka.pl, 1 adwokatzdunek.pl, 1 adws.io, 1 adxperience.com, 1 @@ -8437,8 +8082,8 @@ ae86b.com, 1 ae86c.com, 1 ae86dj.com, 1 ae86dy.com, 1 +ae86m.com, 1 ae86nb.com, 1 -ae86sb.com, 1 ae86x.com, 1 ae86zx.com, 1 aeb.io, 1 @@ -8488,7 +8133,7 @@ aerospace-schools.com, 1 aerotechcoatings.com, 1 aerowillys.tk, 1 aertel.ie, 1 -aessencia.com.br, 1 +aes-freundeskreis.de, 1 aestheticsplus.xyz, 1 aesthetikpiercing.de, 1 aesthetx.com, 1 @@ -8670,7 +8315,6 @@ ag518518.net, 1 ag5326.com, 1 ag5358.com, 1 ag5392.com, 1 -ag5519.com, 1 ag556.com, 1 ag5623.com, 1 ag5657.com, 1 @@ -8718,7 +8362,6 @@ ag660.com, 1 ag66321.com, 1 ag66567.com, 1 ag666.vip, 1 -ag66668.com, 1 ag6819.com, 1 ag6825.com, 1 ag686.com, 1 @@ -8796,7 +8439,6 @@ ag855.net, 1 ag860.com, 1 ag8600.com, 1 ag865.com, 1 -ag87777.com, 1 ag8778.net, 1 ag878.com, 1 ag88-guide.com, 1 @@ -8894,12 +8536,12 @@ aga-eiken.tk, 1 agaa35.com, 1 agaa41.com, 1 agagent.vip, 1 -agalliasis.ch, 0 agalloch.tk, 1 agambarta.com, 1 agamsecurity.ch, 0 agari-mj.com, 1 agarioforum.ga, 1 +agasaya.com, 1 agatajanik.de, 1 agate.pw, 1 agaveandpine.com, 1 @@ -9180,6 +8822,7 @@ agworkers.com, 1 agy.cl, 1 agyacht.club, 1 agzlapp.com, 1 +ahata.com, 1 ahawkesrealtors.com, 1 ahccorleone.tk, 1 ahcpr.gov, 0 @@ -9193,6 +8836,7 @@ ahlac.tk, 1 ahlaejaba.com, 1 ahlz.sk, 1 ahmad.works, 1 +ahmed-alasadi.tk, 1 ahmedabadflowermall.com, 1 ahmedcharles.com, 1 ahmerjamilkhan.org, 1 @@ -9209,7 +8853,6 @@ ahu.la, 1 ahughes03.com, 1 ahwah.net, 1 ahxxm.com, 0 -ai-cuisine.fr, 1 ai-english.jp, 1 ai-media.tv, 1 ai-soft.co.jp, 1 @@ -9259,7 +8902,6 @@ aignermunich.de, 1 aignermunich.jp, 1 aiinsurance.io, 1 aiinsurance.xyz, 1 -aijsk.com, 1 aikenorganics.com, 1 aikenpromotions.com, 1 aiki.de, 1 @@ -9367,6 +9009,7 @@ airbnb.ru, 1 airbnb.se, 1 airbnb.tools, 1 airbnbchina.cn, 1 +airbnbcupom.com, 1 airbnbopen.com, 1 airborne-inflatables.co.uk, 1 airbossofamerica.com, 1 @@ -9508,6 +9151,7 @@ akademie-frankfurt.de, 1 akalashnikov.ru, 1 akamon.ac.jp, 1 akaoma.com, 1 +akapumkin.com, 1 akasha.world, 1 akashdsouza.now.sh, 1 akay.me, 1 @@ -9523,7 +9167,6 @@ akerboom.org, 1 akfoundationindia.com, 1 akhabar.tk, 1 akhealthconnection.com, 0 -akhildev.com, 1 akhilindurti.com, 0 akhomesforyou.com, 1 akiba-server.info, 1 @@ -9540,6 +9183,7 @@ akkade.be, 1 akkbouncycastles.co.uk, 1 akkordy-skachat.ga, 1 akmatrix.org, 1 +aknastore.co, 1 akoch.net, 1 akostecki.de, 1 akoww.de, 0 @@ -9599,7 +9243,7 @@ aladdinschools.appspot.com, 1 aladintechnologies.tk, 1 alainbaechlerphotography.ch, 0 alainfrancois.eu, 1 -alainfrancois.nl, 1 +alainfrancois.nl, 0 alainmargot.ch, 0 alainodea.com, 1 alainwolf.ch, 1 @@ -9662,6 +9306,7 @@ albertcuyp-markt.amsterdam, 1 alberteinsteinbiography.tk, 1 albertify.xyz, 1 albertinum-goettingen.de, 1 +alberts-blatt.de, 1 albilaga.id, 1 albinma.com, 1 albion2.org, 1 @@ -9692,8 +9337,17 @@ alcouponest.com, 1 alcove.cf, 1 alcubillas.tk, 1 aldeal.gq, 1 +aldersgate.cf, 1 +aldersgate.ga, 1 +aldersgate.gq, 1 +aldersgate.ml, 1 +aldersgate.tk, 1 +aldersgateumc.cf, 1 +aldersgateumc.ga, 1 +aldersgateumc.gq, 1 +aldersgateumc.ml, 1 +aldersgateumc.tk, 1 aldiabcs.com, 1 -aldien.com.br, 1 aldo-saputra.ga, 1 aldomedia.com, 1 aldorr.net, 0 @@ -9726,7 +9380,6 @@ alertwire.com, 1 alesha.tk, 1 alesia-formation.fr, 1 alessandrobasi.it, 1 -alessandroonline.com.br, 1 alessandrotravel.com, 1 alessandroz.ddns.net, 1 aletm.it, 1 @@ -9760,7 +9413,7 @@ alexcoman.com, 1 alexcpp.tk, 1 alexdaniel.org, 1 alexdiazdeleon.com, 1 -alexey-shamara.ru, 1 +alexey-shamara.ru, 0 alexeykopytko.com, 1 alexfabian.myftp.org, 1 alexgaynor.net, 1 @@ -9817,10 +9470,8 @@ alfa-tech.su, 1 alfacharlie.co, 1 alfadlmedical.com, 1 alfadlmedical.net, 1 -alfaei.com.br, 1 alfalasteenyia.cf, 1 alfambra.tk, 1 -alfaperfumes.com.br, 1 alfaproweb.fr, 1 alfastone.com.ua, 1 alfavideocirurgica.com.br, 1 @@ -9830,6 +9481,7 @@ alforto.nl, 1 alfratehotelcampiglio.it, 1 alfred-figge.de, 1 alfredapp.com, 1 +alfredetnestor.com, 1 alftrain.com, 1 algarmatic-automatismos.pt, 1 algbee.com, 1 @@ -9881,6 +9533,7 @@ alignrs.com, 1 aliim.gdn, 1 alikulov.me, 1 alilialili.ga, 1 +alimak.com, 1 aliment-covid19.com, 1 alimentosmcf.com, 1 alimentsduquebecaumenu.com, 1 @@ -9921,7 +9574,6 @@ alkami.com, 1 alkamitech.com, 1 alkel.info, 1 alkemi-si.fr, 1 -alko-centr.ru, 1 alko-stop.ml, 1 alkopedia.tk, 1 alkor.tk, 1 @@ -9940,6 +9592,7 @@ allaboutreligions.tk, 1 allaboutswing.co.uk, 1 allaboutswing.com, 1 allaboutthekink.org, 1 +allaccessglobal.tech, 1 allactioneventhire.co.uk, 1 allamakee.k12.ia.us, 1 allamericanmuslim.com, 1 @@ -9968,7 +9621,6 @@ allcelebs.tk, 1 allcinema.net, 1 allcleanservices.ca, 1 allcloud.com, 1 -allcountyins.com, 1 allcovered.nl, 1 allcoveredbyac.com, 1 allcrimea.tk, 1 @@ -10019,6 +9671,7 @@ allinagency.com, 1 allincoin.shop, 1 allindiacityguide.com, 1 allindiajobs.ga, 1 +allinform.ga, 1 allinone-ranking150.com, 1 allinsuranceinformation.com, 1 allis.studio, 1 @@ -10049,13 +9702,13 @@ alloutsec.com, 1 alloverthehill.com, 1 allpedia.tk, 1 allphaseclean.com, 1 -allplayer.tk, 1 allpointsblog.com, 1 allpointsheating.com, 1 allproptonline.com, 1 allpussynow.com, 1 allrad-buck.de, 1 allram.info, 1 +allremotecodes.com, 1 allright.tk, 1 allroundpvp.net, 1 allroundtechnology.com, 1 @@ -10112,6 +9765,7 @@ almorafestival.com, 1 almosis.tk, 1 almostobjective.com, 1 almstrom.org, 1 +almukhtar.se, 1 almusbahperfume.com, 1 almut-zielonka.de, 1 almx.net, 1 @@ -10133,6 +9787,7 @@ alpencams.com, 1 alpencams.net, 1 alpengreis.ch, 1 alpenjuice.com, 1 +alperozmen.kim, 1 alpertron.com.ar, 1 alpes-deis-tools.com, 1 alpha-ag.ru, 1 @@ -10161,7 +9816,6 @@ alphaman.ooo, 1 alphamedphysicians.com, 1 alphanodes.com, 1 alphapengu.in, 1 -alphaperfumes.com.br, 1 alphapoker.ru, 1 alpharail.se, 1 alpharoofga.com, 1 @@ -10172,6 +9826,7 @@ alphassl.de, 1 alphatrash.de, 1 alphavote-avex.com, 1 alphavote.com, 1 +alphazure.co.uk, 1 alphera.nl, 1 alphie.me, 1 alphipneux.fr, 1 @@ -10188,6 +9843,7 @@ alpinestarmassage.com, 1 alplogopedia.it, 1 alquds.edu, 1 alquiaga.com, 1 +alquilerps5.com, 1 alrait.com, 1 alre-outillage.fr, 1 alroniks.com, 1 @@ -10217,7 +9873,6 @@ altaizemlya.ml, 1 altaizemlya.tk, 1 altapina.com, 0 altaplana.be, 1 -altawfer.com, 1 altaynews.kz, 1 altco.group, 1 altdforyou.tk, 1 @@ -10232,7 +9887,6 @@ altered.si, 1 alterego.tk, 1 altergalaxy.tk, 1 alteria.xyz, 1 -alternador.com.br, 1 alternative.bike, 1 alternative.hosting, 1 alternativebit.fr, 1 @@ -10394,6 +10048,7 @@ amateurradionotes.com, 1 amateurs.ga, 1 amateurvoicetalent.com, 1 amati.solutions, 1 +amatista.tech, 1 amato.tk, 1 amatsuka.com, 1 amatzen.dk, 1 @@ -10427,8 +10082,7 @@ ambra.net.nz, 1 ambrosius.io, 1 ambulanza.roma.it, 1 ambulari.cz, 1 -amcangroup.com, 1 -amcchemical.com, 1 +amcchemical.com, 0 amcfirst.com, 1 amchainitiative.org, 1 amcs.website, 1 @@ -10449,6 +10103,7 @@ ameliemarieintokyo.com, 1 amello.de, 1 amendine.fr, 1 ameninalaceira.com.br, 1 +ameri-drain.com, 1 america.gov, 1 america250.gov, 1 americafamilylawcenter.org, 1 @@ -10460,6 +10115,7 @@ americanartwarehouse.com, 1 americanbooks.cf, 1 americanbuzz.tk, 1 americandetour.com, 1 +americanenergysystemswa.com, 1 americanflooring.co, 1 americanfootball.ml, 1 americanfootball.tk, 1 @@ -10683,7 +10339,7 @@ anarkhe.net, 1 anarticle.gq, 1 anasahr.be, 1 anassiriphotography.com, 0 -anastasia-shamara.ru, 1 +anastasia-shamara.ru, 0 anatoray.com, 1 anaxios.ga, 1 anayarealm.com, 1 @@ -10729,6 +10385,7 @@ andrea-wirthensohn.at, 0 andreaassenti.it, 1 andreaboero.it, 1 andreadraghetti.it, 1 +andreae.nl, 1 andreagobetti.com, 1 andreagourmet.it, 1 andreahruby.it, 1 @@ -10906,7 +10563,6 @@ angular-js.ga, 1 angular-software.at, 1 angularjs.org, 0 angusandperthpgl.tk, 1 -angusmak.com, 1 anhaffen.lu, 1 anhqv.es, 1 ani-man.de, 1 @@ -10954,7 +10610,6 @@ animeheaven.ml, 1 animehf.com, 1 animeinsights.net, 1 animelandia.tk, 1 -animelib.net, 1 animem.es, 1 animemotivation.com, 1 animeone.me, 1 @@ -11004,6 +10659,8 @@ anleitung-zum-haekeln.de, 1 anleitung-zum-schreiben.de, 1 anleitung-zum-schweissen.de, 1 anleitung-zum-toepfern.de, 1 +anlovegeek.com, 0 +anlovegeek.net, 0 anlp.top, 1 anmelden.io, 1 anmolnayyar.com, 1 @@ -11019,6 +10676,7 @@ annangela.moe, 1 annarokina.com, 1 annawagner.pl, 1 anne-marie.tk, 1 +annebacarat.fr, 1 annedaniels.co.uk, 1 anneeden.de, 1 annejan.com, 1 @@ -11105,6 +10763,7 @@ ansogning-sg.dk, 1 anstaskforce.gov, 1 answernow.cf, 1 answers-online.ru, 1 +ant.lgbt, 1 antabuse.ga, 1 antabuskaufen1.gq, 1 antalya-yesim.cf, 1 @@ -11136,6 +10795,7 @@ antennistaroma.it, 1 antennisti.milano.it, 1 antennisti.roma.it, 1 anteprima.info, 1 +anteroleppanen.fi, 1 antfarm.cf, 1 antha.com, 1 anthisis.tv, 1 @@ -11215,9 +10875,9 @@ antistatik.tk, 1 antisystem.tk, 1 antitabak.tk, 1 antiuser.tk, 1 +antivirusgratuitos.net, 1 antivirusprotection.reviews, 1 antizon.net, 1 -antocom.com, 1 antocom.net, 1 antocom.ru, 1 antoga.eu, 1 @@ -11241,13 +10901,13 @@ antota.lt, 1 antragsgruen.de, 1 antraxx.ee, 1 antroposboutique.it, 1 -antroposofica.com.br, 1 anttitenhunen.com, 1 antvklik.com, 1 antyblokada.pl, 1 antyfake.pl, 1 anubisz.tk, 1 anulowano.pl, 1 +anunciosbolivia.com, 1 anunturitv.ro, 1 anvartay.com, 0 anvimpex.com, 1 @@ -11335,7 +10995,6 @@ apartment-market.ml, 1 apartmentdecoratingblog.com, 1 apartmentkroatien.at, 1 apartmentregister.com.au, 1 -apasaja.tech, 1 apbank.ch, 1 apbforum.tk, 1 apbox.de, 1 @@ -11379,10 +11038,12 @@ apiary.store, 1 apiary.supplies, 1 apiary.supply, 1 apicruz.com, 1 +apiida.com, 1 apila.care, 1 apila.us, 1 apiled.io, 1 apimon.de, 1 +apimoveisorocaba.com.br, 1 apination.com, 1 apinsa.com, 1 apio.systems, 1 @@ -11424,7 +11085,7 @@ apod.com.au, 1 apod.ml, 1 apogeephoto.com, 1 apokalipsis.tk, 1 -apollo-auto.com, 1 +apollo-auto.com, 0 apollonas.tk, 1 apollonia.tk, 1 apollyon.work, 1 @@ -11446,7 +11107,6 @@ apotheek-ict.nl, 1 apotheke-ch.org, 1 apotheke55.de, 1 apothekeonline.tk, 1 -apothes.is, 1 app, 1 app-2132.com, 1 app-2138.com, 1 @@ -11536,7 +11196,6 @@ apprenticeships.gov, 1 approbo.com, 1 approval-workflow.com, 1 approvedtreecare.com, 1 -apps-cart.com, 1 apps.co, 1 apps.facebook.com, 0 apps.fedoraproject.org, 1 @@ -11566,10 +11225,8 @@ aprendejainternet.tk, 1 aprendiendoforexhoy.com, 1 apretatuercas.es, 1 aprikaner.de, 1 -aprogend.com.br, 1 aproposcomputing.com, 1 aprovpn.com, 1 -aprr.org, 1 aprsdroid.org, 1 aprz.de, 1 apsa.paris, 1 @@ -11583,6 +11240,7 @@ aptnetwork.de, 1 aptumseguros.mx, 1 apu-board.de, 1 apunkt.dk, 1 +apuraytravel.com, 1 apustaja.org, 1 apuyou.io, 1 apv-ollon.ch, 1 @@ -11644,6 +11302,7 @@ arabicxz.com, 1 arablovepet.com, 1 arabska.tk, 1 arabskills.tk, 1 +arabwomen.ml, 1 arachina.com, 1 arackiralama.name.tr, 1 aracusbienestar.com, 1 @@ -11687,25 +11346,27 @@ arcadegames.com, 1 arcadio.fr, 1 arcaik.net, 1 arcanetides.com, 1 -arcanist.games, 1 arcbouncycastles.co.uk, 1 arcenergy.co.uk, 1 archaeoadventures.com, 1 +archaeology.lk, 1 archambault.paris, 1 archauthority.com, 1 archbishop.ga, 1 arche.es, 1 archeologicatoscana.it, 1 +archeologiegorinchem.com, 1 archeryaid.com, 1 +archerygearonline.com, 1 archframe.net, 1 archim.org.uk, 1 archimedicx.com, 1 +archina.ir, 1 archined.nl, 1 archit.in, 1 architectryan.com, 1 architecture-colleges.com, 1 architectureandgovernance.com, 1 -architecturequote.com, 1 architectus.ga, 1 architekten.tk, 1 architekturwiki.tk, 1 @@ -11721,6 +11382,7 @@ archivosstl.com, 1 archiweb.pl, 0 archlinux.de, 1 archlinux.org, 1 +archmacro.ga, 1 archmediamarketing.com, 1 archoit.org, 0 archsec.info, 1 @@ -11738,7 +11400,6 @@ arcridge.ca, 1 arctic.ca, 1 arctic.gov, 1 arctica.io, 1 -arcticbit.net, 1 arcticwolf.com, 1 arctus-security.com, 1 arcueil-cachan.fr, 0 @@ -11785,6 +11446,7 @@ areqgaming.com, 1 ares-trading.de, 1 aresanel.com, 1 arest.web.id, 1 +arethsu.se, 1 arex-corp.com, 1 arfad.ch, 0 arforingenieria.com, 1 @@ -11809,6 +11471,7 @@ ariacreations.net, 1 ariadermspa.com, 1 ariag.tk, 1 ariajourney.com, 1 +ariamovie.xyz, 1 arian.io, 1 ariana.wtf, 1 arias.re, 1 @@ -11880,7 +11543,6 @@ arlenarmageddon.com, 1 arletalibrary.com, 0 arlingtonelectric.com, 1 arlingtonwine.net, 1 -arm-host.com, 1 arm.gov, 1 armadale.wa.gov.au, 1 armadaquadrat.com, 1 @@ -11893,7 +11555,6 @@ armanet-promotion.fr, 1 armanozak.com, 1 armansfinejewellery.com, 1 armansfinejewellery.com.au, 1 -armarinhovirtual.com.br, 1 armazemdaminiatura.com.br, 1 armbrust.me, 1 armcar.ga, 1 @@ -11920,6 +11581,7 @@ arnakdanielian.com, 1 arnaqueoufiable.com, 1 arnaudardans.com, 1 arnaudb.net, 1 +arnaudfeld.de, 1 arnaudlanna.com, 1 arnaudminable.net, 1 arnesegers.be, 1 @@ -11944,7 +11606,6 @@ arnoudvandalen.nl, 1 arnove.fr, 1 arnove.net, 1 arnsmedia.nl, 0 -arocloud.de, 1 arod.tk, 1 arogov.com, 1 arokha.com, 1 @@ -12033,13 +11694,10 @@ arteaga.me, 1 arteaga.tech, 1 arteaga.uk, 1 arteaga.xyz, 1 -artebel.com.br, 1 artecat.ch, 1 artedellavetrina.it, 1 artedona.com, 1 artefakt.es, 1 -artefeita.com.br, 1 -artefeitaessencias.com.br, 1 arteinstudio.it, 1 artelt.com, 1 artembusiness.tk, 1 @@ -12104,13 +11762,14 @@ artlabdentistry.com, 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 artmaxi.eu, 1 -artmoney.com, 1 artmosfilms.co.za, 1 +artofclouds.ru, 1 artofcode.co.uk, 1 artofeyes.nl, 1 artofhappyliving.com, 1 @@ -12207,8 +11866,10 @@ asciitable.tips, 1 asciiwwdc.com, 1 ascpaphilatelie.eu, 1 asdchieti.tk, 1 +asdf.one, 1 asdwfwqd.com, 1 asdyx.de, 1 +asean-wen.org, 1 asec01.net, 1 asegem.es, 1 aseith.com, 1 @@ -12222,6 +11883,7 @@ asexualitat.cat, 1 asfaleianet.gr, 1 asgapps.co.za, 1 asgardiamc.fr, 1 +asgardsuper.com, 1 asgrd.org, 1 ashastalent.com, 1 ashd1.goip.de, 1 @@ -12245,9 +11907,8 @@ ashtonc.ca, 1 ashtonwealth.com, 1 ashutoshmishra.org, 1 asia-gazette.com, 1 -asia-global-risk.com, 0 +asia-global-risk.com, 1 asia.dating, 1 -asiabike.ir, 1 asiaflash.com, 1 asiaheavens.com, 1 asialeonding.at, 1 @@ -12280,7 +11941,7 @@ askcascade.com, 1 asker-massasje.no, 1 askerweb.cf, 1 askeustache.com, 1 -askexpert.in, 1 +askexpert.in, 0 askizzy.org.au, 1 askkaren.gov, 1 askmagicconch.com, 0 @@ -12299,7 +11960,6 @@ asmdz.com, 1 asmeets.nl, 1 asml.com, 1 asmood.net, 1 -asmrbuluo.com, 1 asngear.biz, 1 asnhgh.biz, 1 asoagroca.com, 1 @@ -12435,12 +12095,13 @@ astrosoc.ml, 1 astroteam.tk, 1 astrovandalistas.cc, 1 astsummer.tk, 1 +asttuchaud.com, 1 astucewebmaster.com, 1 astural.org, 0 astutikhonda.com, 1 astutr.co, 1 +astyork.com, 1 asua.ca, 1 -asuclassfinder.com, 1 asucrews.com, 1 asukalangley.tk, 1 asun.co, 1 @@ -12457,6 +12118,7 @@ asylumguild.tk, 1 asynchrono.cf, 1 asystent-dzierzawy.pl, 1 aszurkolassport.com, 1 +at-machining.com, 1 at.md, 1 at.search.yahoo.com, 0 at.vg, 1 @@ -12464,9 +12126,6 @@ at5.nl, 1 at7s.me, 1 atab.se, 1 ataber.pw, 1 -atacadocervejeiro.com.br, 1 -atacadodesandalias.com.br, 1 -atacarejovirtual.com.br, 1 atafu-village.tk, 1 atahualpa.com, 1 atallo.com, 1 @@ -12494,7 +12153,6 @@ atelier-des-apprentissages.com, 1 atelier-naruby.cz, 1 atelier-tecna.cz, 1 atelier-viennois-cannes.fr, 1 -atelieracbaby.com.br, 1 atelieraphelion.com, 1 atelierbw.com, 1 ateliercoquelicot.fr, 1 @@ -12559,7 +12217,6 @@ atlantacompa-international.co.uk, 1 atlantacustomfab.com, 0 atlantahealthcare.tk, 1 atlantareroof.com, 1 -atlantaspringroll.com, 1 atlanticdatastream.ca, 1 atlantichomes.com.au, 1 atlanticmarina.com, 1 @@ -12569,7 +12226,6 @@ atlanticpediatricortho.com, 1 atlanticyellowpages.com, 1 atlantik.tk, 1 atlantikwall.ga, 1 -atlantis-kh.noip.me, 1 atlantischild.hu, 1 atlantiswaterproofing.com, 1 atlas-5.site, 1 @@ -12609,7 +12265,7 @@ atomism.com, 1 atomiumvn.com, 1 atomnetworks.ca, 1 aton-ensemble.tk, 1 -atorcidabrasileira.com.br, 1 +atpeacerealty.com, 1 atplonline.co, 1 atpnutrition.com, 1 atracaosexshop.com.br, 1 @@ -12635,7 +12291,7 @@ attimec.com, 1 attinderdhillon.com, 1 attiremr.tk, 1 attitudes-bureaux.fr, 1 -attogtech.com, 1 +attoch.org, 1 attosoft.tk, 1 attractant.com, 1 attractieparken.tk, 1 @@ -12660,7 +12316,7 @@ atypicom.pt, 1 atzenchefin.de, 1 atzzz.com, 1 au-be.net, 1 -au.ci, 0 +au.ci, 1 au2pb.net, 1 au2pb.org, 1 aubergegilly.ch, 0 @@ -12668,7 +12324,6 @@ aubg.org, 0 aubio.org, 1 aubonheurdeshuiles.fr, 1 aubonmanger.fr, 0 -aubreysnider.com, 1 auburn-housekeeper.com, 1 auburnmedicalservices.com, 1 auburnperio.com, 1 @@ -12698,6 +12353,7 @@ audiomaze.com, 1 audiomind.tk, 1 audion.cc, 1 audionames.com, 1 +audionpack.de, 1 audioonly.stream, 1 audiophile.ch, 0 audiophiledebutant.fr, 1 @@ -12746,6 +12402,7 @@ aukaraoke.su, 1 aukcioon-domenov.ml, 1 auksnest.ca, 1 aulaschrank.gq, 1 +aulasprofdanilo.com.br, 1 aulasvirtualesperu.com, 1 aulaweb.co, 1 aulica-conseil.com, 1 @@ -12778,6 +12435,7 @@ auspicacious.org, 1 ausschreibungen-suedtirol.it, 1 aussiefunadvisor.com, 1 aussiemilfs.com, 1 +aussieparrotlets.com.au, 1 aussieseoadelaide.com.au, 1 aussieseobrisbane.com.au, 1 aussieservicedown.com, 1 @@ -12786,6 +12444,7 @@ aussiestories.dk, 1 austenplumbing.com, 1 austin-pearce.com, 1 austin-security-cameras.com, 1 +austinbestdjs.com, 1 austincardiac.com, 1 austinchase.com, 1 austinheap.com, 0 @@ -12814,7 +12473,6 @@ austromorph.space, 1 auszeit-lanzarote.com, 1 auszeit-walsrode.de, 1 auszeit.bio, 1 -autenticoperfumes.com.br, 1 auth.adult, 1 auth.mail.ru, 1 authanet.ga, 1 @@ -12867,15 +12525,14 @@ autocrypt.org, 1 autodalmacija.com, 1 autodemolizioni.roma.it, 1 autodidactic.ai, 1 -autodidacticstudios.com, 1 -autodidacticstudios.net, 1 +autodidacticstudios.com, 0 +autodidacticstudios.net, 0 autodidacticstudios.org, 1 autodius.com, 1 autoecoledumontblanc.com, 1 autoelettricaperbambini.com, 1 autoentrepreneurinfo.com, 1 autoepc.ro, 1 -autoeshop.eu, 1 autofficina.roma.it, 1 autofinancing.ga, 1 autoglass.com.my, 1 @@ -12904,6 +12561,7 @@ automekano.com, 0 automentesszolnok.hu, 1 automotivegroup-usedcars.be, 0 automotivemechanic.org, 1 +automotiveunlimited.net, 1 automoto-tom.net, 1 automuovifix.fi, 1 automy.de, 1 @@ -12921,6 +12579,7 @@ autopeople.ru, 1 autoplus.com.co, 1 autoportal.tk, 1 autopower.gr, 1 +autoprice.info, 0 autoprogconsortium.ga, 1 autoproshouston.com, 1 autorai.nl, 1 @@ -12990,6 +12649,7 @@ auxbrinstresses.fr, 1 auxiliame.com, 1 auxille.com, 1 auxquatrevents.ch, 0 +av-th.net, 1 av-yummy.com, 1 av01.tv, 1 av0ndale.de, 1 @@ -13025,7 +12685,7 @@ avarty.com, 1 avatardiffusion.com, 1 avcd.cz, 1 avdagic.net, 1 -avdh.top, 1 +avdh.top, 0 ave.zone, 1 aveapps.com, 0 aveclunettesoleil.fr, 1 @@ -13040,6 +12700,7 @@ avepol.eu, 1 averageinspired.com, 1 averen.co.uk, 1 avernis.de, 1 +averste.com, 1 avestawebbtjanst.se, 0 avexon.com, 1 avg.club, 1 @@ -13078,6 +12739,7 @@ avionschool.com, 1 avisofi-credit-immobilier.fr, 1 aviteng.cloud, 1 aviteng.com, 1 +avitus.hu, 1 avivaplasticsurgery.com, 1 avlhostel.com, 1 avm-multimedia.com, 1 @@ -13087,7 +12749,6 @@ avmoo.com, 1 avmrc.nl, 1 avmup.com, 1 avn-buses.tk, 1 -avnet.ws, 1 avocad.studio, 1 avocadooo.stream, 1 avocode.com, 1 @@ -13096,6 +12757,7 @@ avogel.ca, 1 avogel.co.uk, 1 avogel.nl, 1 avoids-troops.gq, 1 +avoinna24.fi, 1 avonlearningcampus.com, 1 avonture.be, 1 avonvets.co.uk, 1 @@ -13143,6 +12805,7 @@ aw.net, 1 await.one, 1 awakengr.com, 1 awakenwow.ga, 1 +awalong.work, 1 awan.tech, 1 awangardaszkola.pl, 1 awanteverde.tk, 1 @@ -13170,7 +12833,7 @@ awic.ca, 1 awinninghabit.com, 1 awk.tw, 1 awksolutions.com, 1 -awlgolf.com, 1 +awlgolf.com, 0 awningcanopyus.com, 1 awningsaboveus.com, 1 awningsatlantaga.com, 1 @@ -13195,7 +12858,6 @@ axel-fischer.net, 1 axel-fischer.science, 1 axel-voss.eu, 0 axelname.ru, 1 -axelr.me, 1 axelteichmann.net, 1 axelvoss.eu, 0 axiatancell.com, 1 @@ -13216,6 +12878,7 @@ axone-computers.fr, 0 axonholdingse.eu, 1 axre.de, 1 axrec.de, 1 +axtudo.com, 1 axtux.tk, 1 axxial.tk, 1 axxis.co.jp, 1 @@ -13338,13 +13001,6 @@ b-tree.be, 1 b0000.co, 1 b00228.com, 1 b00de.ga, 1 -b0305.com, 1 -b0306.com, 1 -b0307.com, 1 -b0309.com, 1 -b03aa.com, 1 -b03bb.com, 1 -b03cc.com, 1 b0607.com, 1 b0618.com, 1 b0618.net, 1 @@ -13409,15 +13065,10 @@ b5197.co, 1 b5289.com, 1 b538.com, 1 b5706.com, 0 -b5707.com, 0 b5708.com, 0 b5709.com, 0 b57bb.com, 0 b57cc.com, 0 -b58365.com, 1 -b58app.com, 1 -b58appb58app.com, 1 -b58appb58appb58app.com, 1 b5901.com, 1 b5902.com, 1 b5903.com, 1 @@ -13433,7 +13084,6 @@ b5dev.com, 1 b61688.com, 1 b62102.com, 1 b62103.com, 1 -b62104.com, 1 b62105.com, 1 b62a.com, 1 b62aa.com, 1 @@ -13452,7 +13102,6 @@ b64.club, 1 b6530.com, 1 b6531.com, 1 b6701.com, 1 -b6702.com, 1 b6703.com, 1 b6704.com, 1 b6705.com, 1 @@ -13605,7 +13254,6 @@ b9488.net, 1 b9498.net, 1 b9518.com, 1 b9518.info, 1 -b9518.net, 1 b9518.org, 1 b9528.com, 1 b9538.com, 1 @@ -13616,7 +13264,6 @@ b9588.net, 1 b95888.net, 1 b9589.net, 1 b9598.net, 1 -b960.com, 1 b9618.com, 1 b9658.net, 1 b96899.com, 1 @@ -13777,11 +13424,7 @@ bachweid-baar.ch, 1 baciu.ch, 0 back-streets.tk, 1 backeby.eu, 1 -background-checks-systems.com, 1 -background-checks.asia, 1 -background-checks.biz, 1 -background-checks.mobi, 1 -backgroundchecks.online, 1 +backflow.pl, 1 backgroundscreenersofamerica.com, 1 backgroundz.net, 1 backjump.tk, 1 @@ -13810,7 +13453,7 @@ backtheeffup.com, 1 backup-kurumsal.com, 1 backupassist.de, 1 backupcloud.ru, 1 -baconismagic.ca, 1 +baconismagic.ca, 0 bacontreeconsulting.com, 1 bacoux.com, 1 bacsmegye.hu, 1 @@ -13825,6 +13468,7 @@ bacula.jp, 1 bad-wurzach.de, 1 bad.horse, 1 bad.pet, 1 +badaa.info, 1 badam.co, 1 badanka.com, 1 badanteinfamiglia.it, 1 @@ -13874,6 +13518,7 @@ bagelsbakery.com, 0 bageluncle.com, 1 baggy.me.uk, 1 bagheera.me.uk, 1 +baghtelecom.net, 1 bagiobella.com, 1 bagira.guru, 1 baglu.com, 0 @@ -13950,7 +13595,6 @@ baladecommune.ch, 0 balafon.cloud, 1 balaganlimited.cf, 1 balakovo-news.tk, 1 -balancascia.com.br, 1 balance7.jp, 1 balanceado.com, 1 balancedbrawl.net, 1 @@ -13982,7 +13626,6 @@ balkanpharmstore.com, 1 balkenbushmechanical.com, 1 balkonien.org, 1 ball-bizarr.de, 1 -ball3d.es, 1 ballarin.cc, 1 ballast.tk, 1 ballbusting-cbt.com, 1 @@ -14008,7 +13651,6 @@ balsamaiso.es, 1 balslev.io, 1 balter.com, 1 balthazarlondon.com, 1 -balticer.de, 1 balticmed.pl, 1 balticnetworks.com, 1 baltimorecashflow.com, 1 @@ -14046,7 +13688,6 @@ bandagastrica.es, 1 bandally.net, 1 bandamirandadeebro.tk, 1 bandarifamily.com, 1 -bandeira1.com.br, 1 bandeiraimoveisitu.com.br, 1 bandeirasnacionais.com, 1 banderas-mundo.es, 1 @@ -14132,6 +13773,7 @@ banzay.ml, 1 bao-in.com, 1 bao-in.net, 1 baobaojihua.com, 1 +baobaoquming.net, 1 baobeiglass.com, 1 baodan666.com, 1 baofengtech.com, 1 @@ -14153,7 +13795,6 @@ baptiste-peugnez.fr, 1 baptisteplanckaert.tk, 1 bar-harcourt.com, 1 barabrume.fr, 1 -barakayu.com, 1 barandazstorm.com, 1 barandazstorm.net, 1 barandazstorm.org, 1 @@ -14206,7 +13847,6 @@ barkassen15.se, 1 barkerjr.xyz, 1 barkingaboutbusiness.com, 1 barkstop.net, 1 -barlamane.com, 1 barlex.pl, 1 barlotta.net, 1 barnabycolby.io, 1 @@ -14236,7 +13876,6 @@ barrioitalia.com, 1 barrydenicola.com, 1 barrymarkus.tk, 1 bars.kh.ua, 1 -barsashop.com.br, 1 barsgroup.com, 1 barslecht.com, 1 barss.io, 1 @@ -14260,8 +13899,10 @@ bartvandamme.tk, 1 bartzutow.xyz, 1 baruch.me, 1 barwave.com, 1 +barzallof.com, 1 bas.co.jp, 1 basamadco.ir, 1 +basanakia.eu, 1 basauristudios.com, 1 basculasconfiables.com, 1 base-autonome-durable.com, 0 @@ -14277,7 +13918,6 @@ basel-gynaecology.com, 1 basel-gynaekologie.ch, 1 baselang.com, 1 basement961.co.nz, 1 -basementdoctor.com, 0 basementdoctornorthwest.com, 1 basementdoctorwestvirginia.com, 1 basementdoctorwv.com, 1 @@ -14310,6 +13950,7 @@ basisbedarf.de, 1 basketball-brannenburg.de, 1 basketballnewz.tk, 1 basketforex.com, 1 +basllp.co.uk, 1 basnoslovno.ru, 1 basonlinemarketing.nl, 1 basradio.tk, 1 @@ -14352,7 +13993,6 @@ bati-alu.fr, 1 batiburrillo.net, 1 batipresta.ch, 0 batiskaf.ua, 1 -batistareisfloresonline.com.br, 1 batitrakya.org, 1 batmanvsupermanfullmovie.ga, 1 batoit.gq, 1 @@ -14398,7 +14038,8 @@ bauunternehmen-herr.de, 1 bavaroparadise.com, 1 bavarovillage.com, 1 bavartec.de, 1 -bawbby.com, 1 +bawbby.com, 0 +bayanbennett.com, 1 bayareaenergyevents.com, 1 bayden.com, 1 bayer-stefan.com, 1 @@ -14463,6 +14104,7 @@ bbc67.fr, 1 bbcastles.com, 1 bbclyra.tk, 1 bbcomcdn.com, 1 +bbcustomremodeling.com, 1 bbforums.com, 1 bbgeschenke.ch, 0 bbimarketing.com, 1 @@ -14478,12 +14120,12 @@ bblove.me, 1 bblsa.ch, 0 bbmagnagrecia.it, 1 bbnx.net, 1 -bbs8080.net, 1 bbschat.tk, 1 bbsec.xyz, 1 bbsgood.com, 1 bbswin9.cc, 1 bbuio.com, 0 +bbunits.de, 1 bbw-wrestling.com, 1 bbw.dating, 1 bbwcs.co.uk, 1 @@ -14497,6 +14139,7 @@ bc-bd.org, 0 bc-diffusion.com, 1 bcansw.com.au, 1 bcbulle.ch, 0 +bccog7.org, 1 bcdiesel.ca, 1 bcdonadio.com, 1 bcdonadio.com.br, 1 @@ -14514,7 +14157,6 @@ bcmainland.ca, 1 bcmguide.com, 1 bcmhire.co.uk, 1 bcmlu.org, 1 -bcnation.com, 1 bcnet.com.hk, 1 bcoffices.com.mx, 1 bcpc-ccgpfcheminots.com, 1 @@ -14526,6 +14168,7 @@ bcsytv.com, 0 bcubic.net, 1 bcvps.com, 1 bcyw56.live, 0 +bcyw56.top, 1 bd-media.tk, 1 bd.foundation, 1 bd2positivo.com, 1 @@ -14549,6 +14192,7 @@ be-real.life, 0 be-up-developpement.com, 1 be-webdesign.com, 1 be.ax, 1 +be.gy, 1 be.search.yahoo.com, 0 be2cloud.de, 1 be9418.com, 1 @@ -14588,8 +14232,8 @@ beanilla.com, 1 beanjuice.me, 1 beans-one.com, 0 beansgalore.com.au, 1 +beaquarium.com, 1 bearcms.com, 1 -bearcosports.com.br, 1 bearcreekcubschildcare.com, 1 bearded.sexy, 1 bearden.io, 1 @@ -14640,7 +14284,6 @@ beautycom.club, 1 beautycon.ir, 1 beautyevent.fr, 1 beautyeyewear.ga, 1 -beautyinweb.net, 1 beautyseasons.ru, 1 beautyspot.tk, 1 beaver-creek.ga, 1 @@ -14651,7 +14294,6 @@ bebe2luxe.fr, 1 bebeautiful.business, 1 bebecar.com, 1 bebef.de, 1 -bebefofuxo.com.br, 1 bebemamae.com, 1 bebes.uno, 1 bebest.gov, 1 @@ -14700,7 +14342,6 @@ bee.clothing, 1 bee.supply, 1 bee.tools, 1 beecare.ch, 0 -beechwoodmetalworks.com, 1 beedsolyjas.tk, 1 beehive.govt.nz, 1 beehive42.com, 1 @@ -14725,7 +14366,6 @@ beer9.com, 1 beercandle.com, 1 beercast.co.uk, 1 beeremovalspretoria.co.za, 1 -beergazetteer.com, 1 beerglasses.tk, 1 beerians.com, 1 beerians.info, 1 @@ -14773,7 +14413,6 @@ behaviorchangeimpact.org, 1 behead.de, 1 beherit.pl, 1 behindertenagentur.de, 1 -behna24hodin.cz, 1 behoerden-online-dienste.de, 1 behold.gq, 1 behoreal.cz, 1 @@ -14817,8 +14456,6 @@ beleadsteam.com, 1 belebey.city, 1 beleggingspanden-financiering.nl, 1 belegit.org, 1 -belevida.com.br, 1 -belezashopping.com.br, 1 belf.ml, 1 belfastbounce.co.uk, 1 belfastlocks.com, 1 @@ -14877,7 +14514,6 @@ belly-button-piercings.com, 1 bellyandbrain.amsterdam, 1 belmontgoessolar.org, 1 beloevino.ml, 1 -belonggsumc.com, 1 belos.at, 1 belouga.org, 1 belpbleibtbelp.ch, 1 @@ -14927,7 +14563,6 @@ benefits.gov, 1 benefitsbookcase.com, 1 benefitshub.io, 1 benefitshub.xyz, 1 -benepiscinas.com.br, 1 benetcasablancas.tk, 1 benevisim.com, 1 benevita.bio, 1 @@ -14972,6 +14607,7 @@ benni1.eu, 1 bennierobinson.com, 1 bennink.me, 1 benno.frl, 1 +benny003.de, 1 bennygommers.nl, 1 bennythink.com, 1 benobi.one, 1 @@ -15016,6 +14652,7 @@ beraten-entwickeln-steuern.de, 1 beratung.com.au, 1 beratungswelt.dvag, 1 berbervandenberg.tk, 1 +berchtesgaden-hilft.de, 1 berdaguermontes.eu, 1 berdu.id, 1 bereaplumber.co.za, 1 @@ -15033,7 +14670,6 @@ bergman-gmbh.de, 1 bergmanbeachproperties.com, 1 bergsjomannen.tk, 1 bergstoneware.com, 1 -bergunabanget.com, 1 berichtsheft-vorlage.de, 1 berikod.ru, 1 beris.us, 1 @@ -15089,7 +14725,6 @@ berriescomunicacion.com, 1 berruezoabogados.com, 1 berrus.com, 1 berry.cat, 1 -berrypay.com, 1 berserk.tk, 1 bersierservices.ch, 0 bersotavocats.fr, 0 @@ -15163,6 +14798,7 @@ best-wedding-quotes.com, 1 best10websitebuilders.com, 1 best2pay.net, 1 best66.me, 1 +bestappliancedoctor.com, 1 bestattungen-kammerer.de, 1 bestattungshaus-kammerer.de, 0 bestautoinsurance.com, 1 @@ -15179,7 +14815,7 @@ bestcellular.com, 0 bestcivilattorneys.com, 1 bestcms.tk, 1 bestcouponvouchercodes.com, 1 -bestcrossbowguide.com, 1 +bestcrossbowguide.com, 0 bestdownloadscenter.com, 1 bestechgadgets.tk, 1 bestedeal.nl, 1 @@ -15233,6 +14869,7 @@ bestpractice.domains, 1 bestprint.vn, 1 bestproductsaudit.com, 1 bestremote.io, 1 +bestreviewcenter.com, 1 bestrevs.com, 1 bestsatoshifaucet.ga, 1 bestschools.io, 1 @@ -15254,15 +14891,12 @@ bestzoo.tk, 1 bet-99.cc, 1 bet-99.com, 1 bet-99.net, 1 -bet.eu, 0 bet01vip.com, 1 bet02vip.com, 1 bet03vip.com, 1 bet04vip.com, 1 bet05vip.com, 1 -bet064.com, 1 bet06vip.com, 1 -bet074.com, 1 bet08vip.com, 1 bet09vip.com, 1 bet10vip.com, 1 @@ -15295,7 +14929,6 @@ bet333123.com, 1 bet333222.com, 1 bet333321.com, 1 bet333345.com, 1 -bet333432.com, 1 bet333444.com, 1 bet333456.com, 1 bet333555.com, 1 @@ -15303,8 +14936,6 @@ bet333567.com, 1 bet333666.com, 1 bet333678.com, 1 bet333789.com, 1 -bet333876.com, 1 -bet333987.com, 1 bet333999.com, 1 bet333h.com, 1 bet333i.com, 1 @@ -15328,9 +14959,7 @@ bet333z.com, 1 bet33app.com, 1 bet3602.com, 0 bet3607.com, 0 -bet3639.com, 1 bet365bc.net, 1 -bet365bet2020.com, 1 bet365cn-casino.com, 1 bet365cn-game.com, 1 bet365cn-keno.com, 1 @@ -15359,10 +14988,8 @@ bet365q6.com, 1 bet365q8.com, 1 bet365q9.com, 1 bet365r8.com, 1 -bet365u.com, 1 bet365vip1.com, 1 bet365vip2.com, 1 -bet365vip2020.com, 1 bet365vip7.com, 1 bet365x0.com, 1 bet365x1.com, 1 @@ -15371,9 +14998,6 @@ bet365x3.com, 1 bet365x6.com, 1 bet365x8.com, 1 bet365x9.com, 1 -bet391.com, 1 -bet392.com, 1 -bet397.com, 1 bet3app.com, 1 bet3xx.com, 1 bet3zz.com, 1 @@ -15475,6 +15099,7 @@ betaclouds.net, 1 betacommand.tk, 1 betaoptimize.com, 1 betaprofiles.com, 1 +betassl.com, 1 betaworx.de, 1 betaworx.eu, 1 betb33.com, 1 @@ -15566,7 +15191,7 @@ bevallarta.com, 1 bevedo.cz, 1 bevedo.sk, 1 beveiligingscamerawestland.nl, 1 -beveiligingsupdate.nl, 1 +beveiligingsupdate.nl, 0 bevelbeer.com, 1 bevelpix.com, 1 beverhof.nl, 1 @@ -15591,7 +15216,6 @@ bewerbungsfibel.de, 1 bewerbungsfoto-deinfoto.ch, 1 bewertet.de, 1 bewildered.gq, 1 -bewonderen.com, 1 bexit-hosting.nl, 1 bexit-security.eu, 1 bexit-security.nl, 1 @@ -15765,6 +15389,7 @@ bienoubien.org, 1 biensenvue.com, 1 bienstar.tv, 1 bienvenidoamerica.com, 1 +biergaizi.info, 1 bierochs.org, 1 bierwebshop.be, 1 bieser.ch, 1 @@ -15808,7 +15433,6 @@ bighome.ml, 1 bighouse-events.co.uk, 1 bight.ca, 0 bigideasnetwork.com, 1 -bigio.com.br, 1 biglagoonrentals.com, 1 bigmoney.nu, 1 bigorbitgallery.org, 1 @@ -15824,6 +15448,8 @@ bigsister.tk, 1 bigsisterchannel.com, 1 bigskylifestylerealestate.com, 1 bigskymontanalandforsale.com, 1 +bigskywaterheaters.com, 1 +bigtexasbeerfest.com, 1 bigthunder.ca, 1 bigtimeiq.com, 1 bigtrucker.co.uk, 1 @@ -15848,6 +15474,7 @@ bikehistory.org, 1 biker.dating, 1 bikersclub.tk, 1 bikeshopitalia.com, 1 +bikesquadron.com, 0 bikestream.tk, 1 bikhof.com, 1 bikiniseli.com, 1 @@ -15894,7 +15521,6 @@ billingsmtpublicworks.gov, 1 billionaire.ml, 1 billionaire365.com, 1 billionairemailinglist.com, 1 -billionbooksbaby.org, 1 billionkiaparts.com, 1 billkochman.com, 1 billogr.am, 1 @@ -15936,7 +15562,7 @@ bim0s.com, 1 bimacitizen.com, 1 bimbo.com.ar, 0 bimbobakeriesusa.com, 0 -bimbole.it, 1 +bimechanics.com, 1 bimibroccoli.co.uk, 1 bimibroccoli.com, 1 bimibroccoli.dk, 1 @@ -16012,7 +15638,6 @@ bioamtw.com, 1 bioastin.de, 1 bioatelier.it, 1 bioblog.tk, 1 -biobone.net, 1 biobuttons.ch, 1 biocal.eu, 1 biocal.nl, 1 @@ -16097,7 +15722,6 @@ biotechware.com, 1 biotecommunity.com, 1 bioteebook.com, 1 biotin.ch, 1 -biovalue.eu, 1 biowtage.gq, 1 bip.gov.sa, 0 bipyo.com, 1 @@ -16125,6 +15749,7 @@ birosuli.hu, 1 birsinghdhami.com.np, 1 birtamode.tk, 1 birthday-to-you.com, 1 +birthdaycakekuching.my, 1 birthdaytip.com, 1 birthright.host, 1 birthright.website, 1 @@ -16187,6 +15812,7 @@ bitcoin-fauset.cf, 1 bitcoin-india.net, 1 bitcoin-india.org, 1 bitcoin-wizards.com, 1 +bitcoin-youtube.net, 1 bitcoin.asia, 1 bitcoin.ch, 1 bitcoin.co.nz, 1 @@ -16216,7 +15842,6 @@ bitcointhefts.com, 1 bitcoinwalletscript.tk, 1 bitcoinx.ro, 1 bitcork.io, 1 -bitcorner.de, 1 bitcqr.io, 1 bitcrazy.org, 1 bitech-ec.com, 1 @@ -16373,6 +15998,7 @@ bk725.com, 1 bkentertainments.co.uk, 1 bkhayes.com, 1 bkhpilates.co.uk, 1 +bkkf.at, 1 bkkposn.com, 1 bklaindia.com, 1 bkositspartytime.co.uk, 1 @@ -16427,6 +16053,7 @@ blackarch.sk, 1 blackarts.co.za, 1 blackbag.nl, 1 blackbam.at, 1 +blackbbwvideos.com, 1 blackberrycentral.com, 1 blackberryforums.be, 1 blackbird-whitebird.com, 1 @@ -16548,11 +16175,11 @@ blbcleaningservices.com.au, 1 blbet365.com, 1 blblblblbl.fr, 1 bleaching-tipps.de, 1 +bleatingsheep.org, 0 blechbuexn.de, 1 bleche-onlineshop.at, 1 bleche-onlineshop.de, 1 blechinger.io, 1 -blechschmidt.saarland, 1 bleep.zone, 1 blenderinsider.com, 1 blenderman.org, 1 @@ -16637,6 +16264,7 @@ blockchaindaigakko.jp, 1 blockchainmagazine.net, 1 blockcheck.network, 1 blockclique.io, 1 +blocked.icu, 1 blockedyourcar.com, 1 blockedyourcar.net, 1 blockedyourcar.org, 1 @@ -16704,8 +16332,8 @@ blogthetindung.com, 1 blogtroterzy.pl, 1 bloguser.ru, 1 blogvadim.ga, 1 -blok56.nl, 1 blomberg.name, 1 +bloobet.com, 0 blood4pets.tk, 1 bloodhunt.eu, 1 bloodhunt.pl, 1 @@ -16737,11 +16365,14 @@ blue-leaf81.net, 1 blue42.net, 1 blueangel.org.tw, 1 bluebahari.gq, 1 +blueberrywinery.com.au, 1 bluebie.com, 1 +bluebikesvalencia.com, 1 bluebirdservice.us, 1 blueblou.com, 1 bluebnc.com, 1 bluecanvas.io, 1 +bluecon.eu, 1 bluecon.ninja, 1 bluecrazii.nl, 1 blued.moe, 1 @@ -16802,6 +16433,7 @@ bluex.net, 1 bluex.org, 1 blueyonder.com, 1 bluffplumber.co.za, 1 +bluheron.ca, 1 blui.cf, 1 blui.xyz, 1 bluiandaj.ml, 1 @@ -16893,7 +16525,6 @@ bobep.ru, 1 bobfilm.ml, 1 bobigames.com, 1 bobiji.com, 0 -bobisec.cz, 0 bobkidbob.com, 1 bobkoetsier.nl, 1 bobnbounce.ie, 1 @@ -16904,7 +16535,6 @@ bobstronomie.fr, 1 bocaaboca.ml, 1 bocada.com, 1 bocamo.it, 1 -bocawa.es, 1 boccabell.com, 1 bochantinobgyn.com, 1 bochs.info, 1 @@ -16935,7 +16565,6 @@ bodypainter.pl, 1 bodypainting.waw.pl, 1 bodyshaping.ml, 1 bodyshopnews.net, 1 -bodyweb.com.br, 1 bodyworksautorebuild.com, 1 boeddhashop.nl, 1 boegli.tk, 1 @@ -17076,6 +16705,7 @@ bonus.net.nz, 1 bonus.pl, 1 bonusov.tk, 1 bonusup.tk, 1 +bonux.co, 1 boodmo.com, 1 boof.com, 0 book-in-hotel.com, 1 @@ -17106,7 +16736,6 @@ bookslibrarybooks.gq, 1 booksmp3.com, 1 bookstores.gq, 1 bookstrap.ga, 1 -booktoan.com, 1 booktracker-org.appspot.com, 1 bookwave.art, 1 bookwormex.com, 1 @@ -17182,6 +16811,7 @@ borriquillacuenca.tk, 1 borysek.net, 1 borysenko.se, 1 borza.ro, 1 +borza.us, 1 borzaresearch.com, 1 borzov.tk, 1 bosabosa.org, 1 @@ -17194,6 +16824,7 @@ boschveldtuin.nl, 1 boscoyacht.ch, 0 boscq.fr, 1 bosekarmelitky.cz, 1 +bosiquanao.vn, 1 boskeopolis-stories.com, 1 bosnia-online.tk, 1 bospor.tk, 1 @@ -17204,6 +16835,7 @@ bostonadvisors.com, 1 bostonaoii.com, 1 bostonews.tk, 1 bostonivy.co, 1 +bostonprocleaning.com, 1 bosufitness.cz, 1 bosun.io, 1 bot-manager.pl, 1 @@ -17215,6 +16847,8 @@ botelegram.tk, 1 botezdepoveste.ro, 1 botguard.net, 1 bothellwaygarage.net, 1 +boticadiservicio.com, 1 +botikadiservisio.com, 1 botipedia.tk, 1 botlab.ch, 1 botmanager.pl, 1 @@ -17231,6 +16865,7 @@ bottinquebec.com, 1 bottke.berlin, 1 bottle.li, 1 bottledstories.de, 1 +bottom9clothing.com, 1 bottomfeedings.tk, 1 bou.ke, 1 bouah.net, 1 @@ -17240,6 +16875,7 @@ bouchonville-knifemaker.com, 1 bouckaert-usedcars.be, 0 boudah.pl, 1 bougeret.fr, 1 +bougerpourmasante.com, 1 boughariosbros.com, 1 boukoubengo.com, 1 bouldercolorado.gov, 1 @@ -17348,6 +16984,7 @@ bound2bounce.co.uk, 1 boundarybrighton.com, 1 boundaryford.com, 1 boundaryvets.co.uk, 1 +boundless-designs.com, 1 bounouh.tk, 1 bountiful.gov, 1 bounty.fund, 1 @@ -17362,7 +16999,7 @@ bourse-aux-vetements.org, 0 bourse-puericulture.org, 0 bourseauxservices.com, 1 boutique-giovanni.fr, 1 -boutiquedecanetas.com.br, 1 +boutiquedelhogar.cl, 1 boutiqueguenaelleverdin.com, 1 boutoncoupdepoing.fr, 1 bouw.live, 1 @@ -17376,6 +17013,7 @@ bowedwallcrackrepair.com, 1 boweryandvine.com, 1 bowlcake.fr, 1 bowling.com, 1 +bowmanwilliams.com, 1 bowntycdn.net, 1 bowtie.com.hk, 1 boxcritters.wiki, 1 @@ -17412,7 +17050,6 @@ bphostels.com, 1 bpisites.eu, 1 bpo.ovh, 1 bpol-forum.de, 1 -bpreguica.com.br, 1 bpsis.fr, 1 bpvboekje.nl, 1 bpvr.ddns.net, 1 @@ -17453,6 +17090,7 @@ brahmins.com, 1 braiampeguero.xyz, 1 brailsford.xyz, 1 brain-club.info, 1 +brain-dev.com, 1 brain-e.co, 1 brain-force.ch, 1 brainball.fr, 0 @@ -17472,11 +17110,13 @@ brainstobrand.com, 1 brainstormproductions.tk, 1 braintensive.com, 1 braintonus.tk, 1 +brainvation.de, 1 brainvoyagermusic.com, 1 brainwav.es, 1 brainwork.space, 1 brainyapp.net, 1 braithwaites.ltd, 1 +brajenovic.com, 1 brakemanpro.com, 1 brakpanplumber24-7.co.za, 1 bralnik.com, 1 @@ -17489,6 +17129,7 @@ bramsikkens.be, 1 bramstaps.nl, 1 bramvanaken.be, 1 bramygrozy.pl, 1 +bran.cool, 1 bran.land, 1 bran.soy, 1 branch-bookkeeper.com, 1 @@ -17573,11 +17214,12 @@ bravewiki.tk, 1 bravica.tk, 1 bravobet.et, 1 brawny.com, 1 +braxtonehle.com, 1 brazenfol.io, 1 +brazilhealth.com.br, 1 brazilian.dating, 1 brazilianbikinishop.com, 1 braziliex.com, 1 -brazillens.com, 1 brazoriabar.org, 1 brb.city, 1 brck.nl, 1 @@ -17610,7 +17252,6 @@ brecknell.info, 1 brecknell.name, 1 brecknell.net, 1 brecknell.org, 1 -breda.computer, 1 breechdepot.com, 1 breest.net, 1 breeyn.com, 1 @@ -17642,6 +17283,7 @@ brestradio.tk, 1 brestshop.tk, 1 bretcarmichael.com, 1 bretech.net, 1 +breteuilcommerceartisanat.com, 1 brettabel.com, 1 brettcornwall.com, 1 bretti.net, 1 @@ -17655,6 +17297,7 @@ brewsouth.com, 1 brewspark.co, 1 brewvo.com, 1 brexit.tk, 1 +brexitmart.com, 1 breyerslakeshoreresort.com, 1 breyerslakesideresort.com, 1 breyersresort.com, 1 @@ -17667,7 +17310,6 @@ brianalaway.com, 1 brianalawayconsulting.com, 1 briandorey.com, 0 briandwells.com, 1 -brianfanzo.com, 1 brianfoshee.com, 1 briangarcia.ga, 1 briangosnell.com, 1 @@ -17705,6 +17347,7 @@ bridalfabrics.ru, 1 bridalshoes.com, 1 bridalweddingshow.ga, 1 bride-forever.com, 1 +bride.vn, 1 bridesbouquet.ml, 1 bridgedigest.tk, 1 bridgedirectoutreach.com, 1 @@ -17757,8 +17400,6 @@ brillio.com, 1 brimspark.com, 1 brimspark.systems, 1 brindesgrafica.com.br, 1 -brindespegassus.com.br, 1 -brindice.com.br, 1 bring-heaven.com, 1 bringingbackthesweatervest.com, 1 brinkbem.com, 1 @@ -17833,7 +17474,6 @@ brolic.com, 0 brols.eu, 1 bromo.cf, 1 brompton-cocktail.com, 1 -bronetb2b.com.br, 1 bronevichok.ru, 1 bronn.ee, 1 bronwynlewis.com, 1 @@ -17845,6 +17485,7 @@ brooklynboyblues.cf, 1 brooklyncosmetics.net, 1 brooklynentdoc.com, 1 brooklynrealestateblog.com, 1 +brooklynreclaimed.com, 1 brooklyntheborough.com, 1 brookscountyga.gov, 1 brookworth.com, 0 @@ -17902,6 +17543,7 @@ brunick.de, 0 brunnenhof-welze.de, 1 brunner.ninja, 1 brunoamaral.eu, 1 +brunoarruda.com.br, 1 brunodomingos.com, 1 brunohenc.from.hr, 1 brunolt.nl, 1 @@ -18019,7 +17661,6 @@ bthub.xyz, 1 btine.tk, 1 btio.pw, 0 btku.org, 1 -btmstore.com.br, 1 btnissanparts.com, 1 btopc.jp, 1 btorrent.xyz, 1 @@ -18275,6 +17916,7 @@ buitenposter.nl, 1 buka.jp, 1 bukalapak.com, 1 buketnevesti.cf, 1 +buketon.uz, 1 bukinist.tk, 1 bukiskola.hu, 1 bukivallalkozasok.hu, 1 @@ -18311,7 +17953,6 @@ bullterrierspain.tk, 1 bullyprotection.ml, 1 bulmanat.tk, 1 bulmastife.com.br, 1 -bulutkey.com, 1 bulvar.tk, 1 bulwarkcrypto.com, 1 bulwarkhost.com, 1 @@ -18385,7 +18026,6 @@ burnhamonseabouncycastles.co.uk, 1 burningbird.net, 1 burningflame.tk, 1 burningflipside.com, 0 -burningmarket.de, 1 burntfish.com, 1 burnworks.com, 1 buronwater.com, 1 @@ -18438,6 +18078,7 @@ businessetmarketing.com, 1 businessfactors.de, 1 businessfurs.info, 1 businessgram.eu, 1 +businessguide.co.ke, 1 businesshub.cz, 0 businessimmigration-eu.com, 1 businessimmigration-eu.ru, 1 @@ -18466,17 +18107,16 @@ busyon.cloud, 1 butarque.es, 1 butikvip.ru, 1 butlercountyhistory.org, 1 +butlerdisposal.com, 1 butlerfm.dk, 1 butlist.com, 1 butowka.tk, 1 butserdocumentary.tk, 1 butt.repair, 1 -butter.horse, 1 butteramotors.com, 1 butterhost.ga, 1 buttermilk.cf, 1 buttgun-tattoo.de, 1 -buttoned.io, 1 buttonizer.pro, 1 buttonline.ch, 1 butts-are.cool, 1 @@ -18579,7 +18219,6 @@ buyprozac.cf, 1 buyretinamicro.cf, 1 buyrimonabant.cf, 1 buyrogaine.ga, 1 -buyseo.store, 1 buyshoe.org, 1 buysildenafil.ml, 1 buysoft.co.uk, 1 @@ -18606,10 +18245,9 @@ buzz.tools, 1 buzzconf.io, 1 buzzcontent.com, 1 buzzhub.tk, 1 -buzzpop.tv, 1 +buzzpop.tv, 0 buzzprint.it, 1 bva.dyndns.info, 1 -bvb.moe, 1 bvbmedia.nl, 1 bvexplained.co.uk, 1 bvgt.org, 1 @@ -18649,6 +18287,7 @@ bxdj3.com, 1 bxdj4.com, 1 bxdj5.com, 1 bxdj6.com, 1 +bxdj66.com, 1 bxdj666.com, 1 bxdj7.com, 1 bxdj8.com, 1 @@ -18741,7 +18380,7 @@ bytesoftech.ml, 1 bytesund.biz, 1 byteswave.cl, 1 bytesystems.com, 1 -byteterrace.com, 1 +bytetime.net, 1 bytheglass.gr, 1 bythen.cn, 0 bytheswordinc.com, 1 @@ -18763,12 +18402,14 @@ c-3.moe, 1 c-aeroconsult.com, 1 c-c-europeen.org, 1 c-ma-copro.com, 1 +c-netsys.fr, 1 c-rtx.com, 1 c-shock.org, 1 c-webdesign.net, 1 c-world.co.uk, 1 c.cc, 1 c00ke.com, 1 +c057cl7.com, 1 c0rn3j.com, 1 c0rporation.com, 1 c16t.uk, 1 @@ -18798,6 +18439,7 @@ c4539.com, 1 c4dstudio.com, 1 c4k3.net, 1 c5197.co, 1 +c5h8no4na.net, 1 c6729.co, 1 c6729.com, 1 c678.top, 1 @@ -18849,7 +18491,6 @@ cabuna.hr, 1 cacao-chocolate.com, 1 cacao.supply, 1 cacaolalina.com, 1 -cacaumidade.com.br, 1 caceis.bank, 1 cachacacha.com, 1 cachedview.nl, 1 @@ -18866,7 +18507,7 @@ cad-noerdlingen.de, 1 cadafamilia.de, 1 cadams.io, 1 cadastroloteamento.com.br, 1 -cadcc.cl, 1 +cadcc.cl, 0 caddyfashionshop.com, 1 cadenceconstruction.com, 1 cadep2019.com, 1 @@ -19091,12 +18732,10 @@ cameo-membership.uk, 1 cameo.ee, 1 cameramark.nl, 1 cameraslyphotography.tk, 1 -cameraviva.com.br, 1 cameronstar.tk, 1 cameroonlounge.com, 1 camerweb.es, 1 camilaporto.tk, 1 -camilastore.com.br, 1 camileonline.tk, 1 camilomodzz.net, 1 caminreal.tk, 1 @@ -19138,6 +18777,7 @@ campona.hu, 1 campsoulfestival.com, 1 camptuk.org, 1 campula.cz, 1 +campus-competences.fr, 1 campus-discounts.com, 1 campus-finance.com, 1 campusdrugprevention.gov, 1 @@ -19148,9 +18788,11 @@ camrecord.ml, 1 camrojud.com, 1 camshowdir.com, 1 camshowdir.to, 1 +camshowhive.com, 1 camshowhive.to, 1 camshowhub.com, 1 camshowhub.to, 1 +camshowplace.com, 1 camshowplace.to, 1 camshowstorage.com, 1 camshowstorage.to, 1 @@ -19192,6 +18834,7 @@ cancan.ml, 1 cancer-rose.fr, 1 cancerdata.nhs.uk, 1 candaceplayforth.com, 1 +candalgic.com.tr, 1 candelaguatemala.tk, 1 candelec.com, 0 candeo-books.nl, 1 @@ -19216,6 +18859,7 @@ canhas.report, 1 canhazip.com, 1 canhq.tk, 1 cani-compostelle.fr, 1 +canibeoutside.com, 1 canihavesome.coffee, 1 canine-mobility.com, 1 caniuse.email, 1 @@ -19238,6 +18882,7 @@ cannon.org.cn, 1 cannyfoxx.me, 1 canobag.es, 1 canoonic.se, 1 +canopy.garden, 1 canopy.ninja, 1 canopycleaningmelbourne.com.au, 1 canopytax.com, 1 @@ -19256,7 +18901,6 @@ canttboardpachmarhi.org, 1 canva-dev.com, 1 canva.cn, 1 canva.com, 1 -canvas-gift.com, 1 canx.org, 1 canyons.media, 0 canyonshoa.com, 1 @@ -19324,6 +18968,7 @@ captainark.net, 1 captainclaw.tk, 1 captainfit.in, 1 captainjanks.tk, 1 +captainkids.vn, 1 captainsfarm.in, 1 captalize.com, 1 captivationscience.com, 1 @@ -19378,7 +19023,6 @@ carck.co.uk, 1 carck.uk, 1 carcloud.ch, 1 carcountking.com, 1 -card-cashing.com, 1 cardano.eco, 1 cardanoinvestment.com, 1 cardboard.cx, 1 @@ -19401,6 +19045,7 @@ cardjit.su, 1 cardloan-center.jp, 1 cardloan-manual.net, 1 cardmart.tk, 1 +cardoneshop.it, 1 cardoni.net, 1 cardozovargas.com, 1 cardranking.jp, 1 @@ -19424,9 +19069,11 @@ career.support, 1 careercapital.co.za, 1 careeroptionscoach.com, 1 careerpower.co.in, 1 +careersngr.com, 1 careertransformed.com, 1 carefulcolor.com, 1 caregiverva.org, 1 +careify.org, 1 caremad.io, 1 carepan.ga, 1 carepassport.com, 1 @@ -19489,7 +19136,6 @@ carlitoxxpro.com, 1 carlmjohnson.net, 0 carlobiagi.de, 1 carlocksmith--dallas.com, 1 -carlocksmithbaltimore.com, 1 carlocksmithcarrollton.com, 1 carlocksmithellicottcity.com, 1 carlocksmithfallbrook.com, 1 @@ -19532,8 +19178,6 @@ caroes.be, 1 caroffer.ch, 1 carol-lambert.com, 1 carolcappelletti.com, 1 -carolcestas.com, 1 -caroletolila.com, 1 caroli.biz, 1 caroli.com, 1 caroli.info, 1 @@ -19587,7 +19231,6 @@ carspneu.cz, 1 cartale.ru, 1 cartaodigi.com, 1 cartegrise.xyz, 1 -carteirasedistintivos.com.br, 1 cartelloni.roma.it, 1 carterdan.net, 1 carterorland.com, 1 @@ -19622,13 +19265,10 @@ casa-mea-inteligenta.ro, 1 casaamor.ph, 1 casaasia.cat, 1 casabella.com.tw, 1 -casabouquet.com, 1 casacazoleiro.com, 1 casacochecurro.com, 1 casadasportasejanelas.com, 1 -casadoarbitro.com.br, 1 casadopulpo.com, 1 -casadowifi.com.br, 1 casaessencias.com.br, 1 casalborgo.it, 1 casalindamex.com, 1 @@ -19636,11 +19276,9 @@ casalinghedisperate.ga, 1 casalribeiro.com, 1 casalunchbreak.de, 1 casamariposaspi.com, 1 -casamarrom.com.br, 1 casamentos.com.br, 1 casamiento.com.uy, 1 casamientos.com.ar, 1 -casapalla.com.br, 1 casasparaperross.com, 1 casasuara.com, 1 casasuleletrodomesticos.com.br, 1 @@ -19725,6 +19363,7 @@ casko-insurance.tk, 1 casperfirm.com, 1 casperpanel.com, 1 caspicards.com, 1 +cass.cz, 1 cassimo.com, 0 castaneda.tk, 1 castbulletassoc.org, 0 @@ -19760,6 +19399,7 @@ castroverde.tk, 1 casualclubdating.ml, 1 casualgaming.no, 1 casusgrillcaribbean.com, 1 +casvpn.com, 1 cat-encyclopedia.ml, 1 cat-problems.ml, 1 cat.ax, 1 @@ -19790,6 +19430,7 @@ caterbing.com, 1 catering-xanadu.cz, 1 cateringgoes.nl, 1 cateringvanhetland.nl, 1 +cateromarket.pl, 1 catfood.ga, 1 catgarden.tk, 1 catgirl.pics, 1 @@ -19834,6 +19475,7 @@ catnmeow.com, 1 catprincess.com.tw, 1 catram.org, 1 catriel25noticias.com, 1 +catsgalore.org, 1 catsmagic.pp.ua, 1 catsnow.com, 1 catsoft.me, 1 @@ -19866,6 +19508,7 @@ caxalt.com, 1 caycehouse.com, 1 caylee.de, 1 caylercapital.com, 1 +cazadordebuenaonda.com, 1 cazaviajes.es, 1 cazes.info, 1 cb-crochet.com, 1 @@ -19878,6 +19521,7 @@ cbcf.info, 0 cbd-oil.shop, 1 cbd.casa, 1 cbd.supply, 1 +cbdbflo.com, 1 cbdcontact.eu, 1 cbdcontact.pl, 1 cbdev.de, 1 @@ -19982,6 +19626,7 @@ cdnsys.net, 1 cdnya.com, 1 cdocs.ml, 1 cdom.de, 1 +cdrjapan.co.jp, 1 cds-infra.de, 1 cdshining.com, 1 cdsportal.uk, 1 @@ -20030,6 +19675,7 @@ celcomhomefibre.com.my, 1 cele.bi, 1 celebdaily.ga, 1 celebmasta.com, 1 +celebphotos.blog, 1 celebrasianconference.com, 1 celebraze.tk, 1 celebrex.ga, 1 @@ -20039,6 +19685,7 @@ celebritydailynews.ml, 1 celebrityhealthcritic.com, 1 celebrityphotos.blog, 1 celebritypics.club, 1 +celebritypics.co, 1 celebrityscope.net, 1 celebritysrit.tk, 1 celebritytopnews.tk, 1 @@ -20103,7 +19750,7 @@ centos.tips, 1 central-apartman.tk, 1 central4.me, 1 centralconvergence.com, 1 -centraldoencanador.com.br, 1 +centraldelbebe.com, 1 centrale-vapeur.pro, 1 centralebigmat.eu, 1 centralegedimat.eu, 1 @@ -20125,6 +19772,7 @@ centreagree.com, 1 centredaccueil.fr, 0 centrederessourcement.com, 1 centreoeil.ch, 0 +centreparkhistoricdistrict.org, 1 centrepointorguk-dev.azurewebsites.net, 1 centretownshipin.gov, 1 centricagency.co.uk, 1 @@ -20157,6 +19805,7 @@ centurialeonina.com, 1 centurion-consulting-cie.eu, 1 centurion-consulting.net, 1 centurion-consulting.tech, 1 +centurion-meet.site, 1 centurioninfosec.com, 1 centurioninfosec.com.sg, 1 centurioninfosec.hk, 1 @@ -20217,9 +19866,9 @@ certnazionale.it, 1 certspotter.com, 1 certspotter.org, 1 cervejista.com, 1 -cervera.com.br, 1 ces-ltd.co.uk, 1 cesar-hector.tk, 1 +cesarloaiciga.com, 1 cesarparedespacora.com, 1 cesboard.com, 1 cescfortuny.tk, 1 @@ -20230,9 +19879,7 @@ ceska-polygraficka.cz, 1 ceskaexpedice.org, 1 ceskepivnesety.sk, 1 ceskepivnisety.cz, 1 -ceso-saco.com, 1 cesobaly.cz, 1 -cestasedelicias.com.br, 1 cestunmetier.ch, 1 cetamol.com, 1 ceu.edu, 0 @@ -20275,9 +19922,10 @@ cgbassurances.ch, 0 cgbproduction.tk, 1 cgcookiemarkets.com, 1 cgelves.com, 1 +cges.xyz, 1 cgf-charcuterie.com, 1 cgionline.tk, 1 -cgknieuwpoort.nl, 1 +cgl.li, 1 cglib.xyz, 1 cgminc.net, 1 cgnparts.com, 1 @@ -20349,7 +19997,6 @@ championweb.nz, 0 championweb.sg, 0 champonthis.de, 1 chamsochoa.com, 1 -chanakyanewz.com, 1 chancekorte.com, 1 chancekorte.net, 1 chancekorte.org, 1 @@ -20387,7 +20034,6 @@ chaosfield.at, 1 chaosorchestra.com, 1 chaospott.de, 1 chaoswars.ddns.net, 1 -chaoswebs.net, 1 chaotichive.com, 1 chaoticonline.tk, 1 chaouby.com, 0 @@ -20407,7 +20053,6 @@ charbonnel.eu, 1 charcoal-se.org, 1 charcoalvenice.com, 1 charge.co, 0 -chargejuice.com, 1 chargify.com, 1 charisma.ai, 1 charitylog.co.uk, 1 @@ -20416,6 +20061,7 @@ charleliphile.tk, 1 charlenevondell.com, 1 charlenew.xyz, 1 charles-darwin.com, 1 +charlesbordet.com, 1 charlesbwise.com, 1 charlesdickens.tk, 1 charlespitonltd.com, 1 @@ -20440,6 +20086,7 @@ charmanterelefant.at, 1 charmcitytech.com, 1 charmingsaul.com, 1 charmyadesara.com, 1 +charolopezatelier.com, 1 charon.tk, 1 charonsecurity.com, 1 charr.xyz, 1 @@ -20451,6 +20098,7 @@ chartkick.com, 1 chartpen.com, 1 chartsheets.com, 1 chartsy.de, 1 +charuni.ru, 1 charuru.moe, 0 chasafilli.ch, 1 chascrazycreations.com, 1 @@ -20465,6 +20113,7 @@ chat2.cf, 1 chat36.ga, 1 chat4me.tk, 1 chataberan.cz, 1 +chataumateje.eu, 1 chatbelgie.eu, 1 chatbot.one, 1 chatbotclic.com, 1 @@ -20490,6 +20139,7 @@ chatroomfans.tk, 1 chatswoodprestige.com.au, 1 chatsworthelectrical.com, 1 chattanoogaface.com, 1 +chatterbox-aws.com, 1 chattergalerie.eu, 1 chattergallery.com, 1 chattersworld.nl, 1 @@ -20630,6 +20280,7 @@ chemistry-schools.com, 1 chemolak.pl, 1 chenapartment.com, 1 cheneypartners.com, 1 +cheng.pet, 0 chengarda.com, 1 chengfayun.com, 1 chenghao360.top, 1 @@ -20696,11 +20347,12 @@ chianti2002.jp, 1 chiaraiuola.com, 0 chiaramail.com, 1 chiaseeds24.com, 1 +chiasepremium.com, 1 chiaseweb.net, 1 chiavistello.it, 1 +chibiotaku.com, 1 chiboard.co, 1 chiboost.net, 1 -chibr.eu, 1 chic-leather.com, 1 chicagoagent.com, 1 chicagobreastaugdrs.com, 1 @@ -20731,6 +20383,7 @@ chiki.tk, 1 chikory.com, 1 chilbert.co, 1 childcare.gov, 1 +childcaresolutionscny.org, 1 childcounseling.org, 1 childcustodylegalaid.org, 1 childhr.org.au, 1 @@ -20738,7 +20391,6 @@ childno.de, 1 children-toys.tk, 1 childrenandmedia.org.au, 1 childrenfirstalways.org, 1 -childreninadversity.gov, 1 childrens-room.com, 1 childrenschoicepearland.com, 1 childrensentertainmentleicester.co.uk, 1 @@ -20771,8 +20423,9 @@ chimpmatic.com, 1 china-line.org, 1 china-online-news.tk, 1 chinacdn.org, 1 +chinafree.online, 1 +chinafree.site, 1 chinahighlights.ru, 1 -chinaicpower.org, 1 chinasa.net, 1 chinaspaceflight.com, 1 chinastory.tk, 1 @@ -20842,7 +20495,6 @@ chnlib.com, 1 choc-o-lush.co.uk, 1 chocgu.com, 1 chocoband.cf, 1 -chocodecor.com.br, 1 chocolah.com.au, 0 chocolat-suisse.ch, 0 chocolat.work, 1 @@ -20962,6 +20614,7 @@ christianrasch.de, 1 christians.dating, 1 christiansayswords.com, 1 christiansrit.tk, 1 +christianvanos.com, 1 christianwitts.tech, 1 christiehawkes.com, 1 christiesantiques.com, 1 @@ -20972,6 +20625,7 @@ christineprayon.de, 1 christmascard.be, 1 christmaspages.tk, 1 christmaspartyhire.co.uk, 1 +christo.ga, 1 christoph-conrads.name, 1 christoph-gadow.de, 1 christoph.media, 1 @@ -20979,7 +20633,6 @@ christophbartschat.com, 1 christophebarbezat.ch, 1 christopher-simon.de, 1 christopher.sh, 0 -christopherandcharlotte.uk, 1 christopherburg.com, 1 christopherd.me, 1 christopherkennelly.com, 1 @@ -21087,6 +20740,7 @@ ciat.no, 0 cibdol.com, 1 cibdol.nl, 1 cibercactus.com, 1 +cibleclick.com, 1 cica.es, 1 cichlid-world.com, 1 cichol.com, 1 @@ -21120,7 +20774,7 @@ cikeblog.com, 1 cilacapnews.ml, 1 cilloc.be, 1 cima-idf.fr, 1 -cimaflash.co, 1 +cimaflash.co, 0 cimbalino.org, 1 cimballa.com, 1 cimen.cc, 1 @@ -21156,6 +20810,7 @@ cinq-elements.com, 0 cinq-elements.fr, 1 cinq-elements.net, 1 cinsects.de, 1 +cint.com, 1 cintactimber.com, 1 cinteo.com, 1 cio-ciso-interchange.org, 1 @@ -21191,7 +20846,6 @@ circlepluscircle.me, 1 circu.ml, 1 circuitcityelectricaladelaide.com.au, 1 circulatedigital.com, 1 -circule.cc, 1 circulosocial77.com, 1 circumstances.ir, 1 circus-maximus.de, 1 @@ -21199,10 +20853,6 @@ cirfi.com, 1 cirruslab.ch, 1 cirugiasplasticas.com.mx, 1 cirujanooral.com, 1 -cirurgicaexpress.com.br, 1 -cirurgicagervasio.com.br, 1 -cirurgicalucena.com.br, 1 -cirurgicavirtual.com.br, 1 cirvapp.com, 1 cisa.gov, 1 ciscodude.net, 0 @@ -21247,7 +20897,6 @@ citos.ga, 1 citrusui.me, 1 citsc.de, 1 cittadesign.com, 0 -citton.com.br, 1 city-adm.lviv.ua, 1 city-forums.ml, 1 city-home.tk, 1 @@ -21291,6 +20940,7 @@ civicforum.pl, 1 civics.us, 1 civicunicorn.com, 1 civicunicorn.us, 1 +civil-works-sri.com, 1 civilbikes.com, 1 civilg20.org, 1 civillines.nl, 1 @@ -21338,6 +20988,7 @@ ckp.io, 1 ckrubble.co.za, 1 cktennis.com, 1 ckventura.sk, 1 +cl-brands.com, 1 cl-cloud.spdns.org, 1 cl-wiki.spdns.org, 1 cl.search.yahoo.com, 0 @@ -21385,6 +21036,7 @@ claretandbluearmy.tk, 1 claretvillans.com, 1 clarinet.ga, 1 clarinexonline.gq, 1 +clariti-health.com, 1 claritin.gq, 1 claritin.ml, 1 clarkelectricalservices.com.au, 1 @@ -21415,7 +21067,6 @@ classificadostodaoferta.tk, 1 classpoint.cz, 1 classroom.google.com, 1 classroomconductor.com, 1 -classroomcountdown.co.nz, 1 claster.it, 1 claude.me, 1 claude.photo, 1 @@ -21456,15 +21107,14 @@ cleandogsnederland.nl, 1 cleanfiles.us, 1 cleango.pl, 1 cleangroup.in.ua, 1 -cleanhouse2000.us, 1 cleaningservicejulai.com, 1 cleaningsquad.ca, 0 cleankey.jp, 1 cleanplanet.co.jp, 1 cleansewellness.com, 1 +cleanvision.space, 1 cleanway.dk, 1 clearance365.co.uk, 1 -clearblueday.co.uk, 1 clearbooks.co.uk, 1 clearbookscdn.uk, 1 clearbreezesecuritydoors.com.au, 1 @@ -21503,6 +21153,8 @@ cleververmarkten.com, 1 cleververmarkten.de, 1 clevisto.com, 1 clevvi.com.au, 1 +clevyrcares.com, 1 +clevyrlabs.com, 1 cleysense.com, 1 clic-et-site.com, 1 clic-music.com, 1 @@ -21511,6 +21163,7 @@ clicandfioul.com, 1 clicheshishalounge.co.uk, 1 click-licht.de, 1 click2order.co.uk, 1 +click4click.ga, 1 clickalphaville.com.br, 1 clickbasin.co.uk, 1 clickclock.cc, 1 @@ -21560,6 +21213,7 @@ clinicalstats.ga, 1 clinicaltrialpodcast.com, 1 clinicaltrials.gov, 1 clinicamiracueto.com, 1 +clinicasesteticas.com.br, 1 clinicasmedicas.com.br, 1 clinicminds.com, 1 clinicos.cl, 1 @@ -21652,6 +21306,7 @@ cloudfiles.at, 1 cloudflare-dns.com, 1 cloudflare.com, 1 cloudflareonazure.com, 1 +cloudfree.top, 1 cloudhoreca.com, 1 cloudia.org, 1 cloudily.com, 1 @@ -21665,6 +21320,9 @@ cloudlessdreams.com, 0 cloudlight.biz, 0 cloudmigrator365.com, 1 cloudmoney.tk, 1 +cloudmyhome.net, 1 +cloudmyhome.top, 1 +cloudmyhome.xyz, 1 cloudninelandscapedesign.com, 1 cloudnote.cc, 1 cloudns.net, 1 @@ -21836,9 +21494,11 @@ cncrans.ch, 0 cncs.gov.pt, 1 cnet-hosting.com, 1 cnetw.xyz, 1 +cnfree.xyz, 1 cni-certing.it, 1 cnitdog.com, 1 cnlic.com, 1 +cnnc.jp, 1 cnnet.in, 1 cnre.eu, 1 cnss.io, 1 @@ -21854,7 +21514,6 @@ coach-immobilier-neuf.fr, 1 coachapp-ipass.herokuapp.com, 1 coachbakery.com, 1 coachezmoi.ch, 0 -coachfederation.ro, 1 coaching-harmonique.fr, 1 coaching-impulse.ch, 0 coaching-park.fr, 1 @@ -21887,7 +21546,6 @@ cobraprotectionfl.com, 1 coc.de, 0 cocaine-import.agency, 1 cocaine.ninja, 1 -cocalc.com, 1 cocareonline.com, 1 cocbaoan.com, 1 coccinellaskitchen.com, 1 @@ -22004,6 +21662,7 @@ codestep.io, 1 codestudies.net, 1 codetheworld.com, 1 codetipi.com, 1 +codetrack.se, 1 codetripping.net, 1 codeux.com, 1 codeux.info, 1 @@ -22040,10 +21699,8 @@ coens.me.uk, 1 coentropic.com, 1 coeus.cloud, 1 cofbev.com, 1 -coffee-machine.reviews, 1 coffee-mamenoki.jp, 1 coffee-up.it, 1 -coffeeandteabrothers.com, 1 coffeebean.cf, 1 coffeebeanstudios.tk, 1 coffeeshopsandman.nl, 1 @@ -22095,6 +21752,7 @@ coins2001.ru, 1 coinsmat.com, 1 coinsuggest.com, 1 cointosh.jp, 1 +coinvex.org, 1 coinx.pro, 1 coisasdemulher.org, 1 cojam.ru, 1 @@ -22113,6 +21771,7 @@ colah.com.au, 1 colapsys.net, 0 colarelli.ch, 1 colbert.ml, 1 +colbird.com, 1 colchonesmoon.com, 1 colchonminicuna.com, 0 colcomm.com, 1 @@ -22127,13 +21786,13 @@ coldren.org, 1 coldspegll.gq, 1 coldstreamcreekfarm.com, 1 coldtomato.ga, 1 -colectivointerconductual.com, 1 coleg.gov, 1 colegiosantaursula.com.br, 1 colegiotalenti.com, 1 colegiovallejo.edu.pe, 1 colemak.com, 1 colengo.com, 1 +coletrain.com, 1 colf.online, 1 colibris.xyz, 1 colinchartier.com, 1 @@ -22199,6 +21858,7 @@ cololi.moe, 1 colombiaemprendedora.org, 1 colombian.dating, 1 colombianas.webcam, 1 +colombiawebs.com, 1 colonialfurniturestripping.com, 1 colonize.africa, 1 coloppe.com, 1 @@ -22207,6 +21867,7 @@ coloradobluebook.gov, 1 coloradolottery.com, 1 coloradoroofingservice.com, 1 coloraid.net, 1 +colorbitor.com, 1 colorblindfilms.com, 1 colorblindprogramming.com, 1 colorbrush.ru, 1 @@ -22258,6 +21919,7 @@ comdurav.com, 1 come.ga, 1 come2cook.com, 1 comeals.com, 1 +comedicgrouperu.com, 1 comedimagrire.it, 1 comedyhuis.nl, 1 comefollowme2016.com, 0 @@ -22268,7 +21930,6 @@ comercialcolombia.tk, 1 comercialroxana.com, 1 comercialtpv.com, 1 comercialtrading.eu, 1 -comerciositio.com, 1 comerford.net, 1 comestoarra.com, 1 cometbot.cf, 1 @@ -22280,7 +21941,6 @@ comevius.xyz, 1 comeyegroup.com, 1 comff.net, 1 comfintouch.com, 1 -comflores.com.br, 1 comfortablelife.tk, 1 comfortmastersinsulation.com, 1 comfortsolutionsair.com, 1 @@ -22303,6 +21963,7 @@ comiteexpertes.gc.ca, 1 comlipa.gq, 1 comm.cx, 1 commania.co.kr, 1 +commaschool.com, 1 commco.nl, 1 commechezvous.ch, 0 commercesend.com, 1 @@ -22315,7 +21976,7 @@ commeunamour.com, 1 commissaris-vraagbaak.nl, 1 commissionagenda.com, 1 commitsandrebases.com, 1 -commlabindia.com, 1 +commlabindia.com, 0 common.io, 1 commoncode.com.au, 1 commoncode.io, 0 @@ -22330,6 +21991,7 @@ communiquons.org, 1 communist-party.tk, 1 community-pro.de, 1 community-pro.net, 1 +community-services.cz, 1 communityaligned.com, 1 communitychurchafrica.co.za, 1 communitycodeofconduct.com, 1 @@ -22343,7 +22005,6 @@ comoculosdesol.pt, 1 comocurarlagastritis24.online, 1 comocurarlagastritistratamientonatural.com, 1 comodo.nl, 1 -comodormirmasrapido.com, 1 comodosslstore.com, 1 comogene.com, 1 comohacerblog.net, 1 @@ -22353,7 +22014,6 @@ comomoraremportugal.ga, 1 comoperdonar.tk, 1 comoquitarlacaspa24.com, 1 comorecuperaratumujerpdf.com, 1 -comosecarabarriga.net, 1 comoseduzir.net, 1 comosefazisto.com.br, 1 comoviajarcontumascota.com, 1 @@ -22368,7 +22028,6 @@ compagniemartin.com, 0 compalliance.com, 1 companion-web.net, 1 comparatif-moto.fr, 1 -compareinsurance.com.au, 1 comparelegalforms.com, 1 comparemymobile.com, 1 comparesoft.com, 1 @@ -22392,7 +22051,6 @@ compeuphoria.com, 1 comphare.nl, 1 compibus.fr, 1 compilenix.org, 1 -compitak.com, 1 complaint.tk, 1 completesecurityessex.co.uk, 1 completesecurityessex.com, 1 @@ -22428,10 +22086,10 @@ comprarparaguas.online, 1 comprasegura.ml, 1 comprauncelular.com, 1 compreair.com, 1 -compreautomacao.com.br, 1 compree.com, 1 comprefitasadere.com.br, 1 comprehensiveihc.com, 1 +comprocellularishop.it, 1 compservice.in.ua, 1 comptrollerofthecurrency.gov, 1 comptu.com, 1 @@ -22456,15 +22114,16 @@ computerhilfe-feucht.de, 1 computerinfobits.com, 1 computernetwerkwestland.nl, 1 computernetwork.be, 1 +computersforlearning.gov, 1 computersoftware.tk, 1 computersystems.guru, 0 computingsociety.co.uk, 1 computop.com, 1 computron.ga, 1 -comschool.com.br, 1 comtily.com, 1 comumlab.org, 1 comunal.co, 1 +comunate.com, 1 comunic.io, 1 comunicat.global, 1 comuniclick.com.br, 1 @@ -22504,7 +22163,6 @@ concursopublico.com.br, 1 concursos.com.br, 1 concursosabertos.com.br, 1 concursuri.biz, 1 -condecom.com.br, 1 condepenalba.com, 0 condesaelectronics.com, 1 condit.ml, 1 @@ -22526,19 +22184,20 @@ conexiontransporte.com, 1 conf.tn, 1 conference-expert.eu, 1 conference.dnsfor.me, 1 +confetayrona.org, 1 confiancefoundation.org, 1 confidential.network, 1 confidentliving.gq, 1 confidentliving.tk, 1 config.schokokeks.org, 0 confirmit.com.au, 1 +confirmit.de, 1 confiscate.ga, 1 confiwall.de, 1 conflicting.tk, 1 conforama.es, 1 conforama.pt, 1 conformal.com, 0 -conformax.com.br, 1 conformist.jp, 1 confrerie-rp.fr, 1 conftree.com, 1 @@ -22550,7 +22209,6 @@ congenio.com, 1 congenio.de, 1 congineer.com, 1 congobunkering.com, 0 -conhecendocosmeticos.com.br, 1 conju.cat, 1 conjugacao.com.br, 1 conkret.ch, 1 @@ -22565,6 +22223,7 @@ connect.dating, 1 connect.facebook.net, 1 connecta.store, 1 connectavid.com, 1 +connectedbynexus.com, 1 connectedcare.md, 1 connectfss.com, 1 connectingrentals.com, 1 @@ -22589,6 +22248,7 @@ connext.de, 1 connictro.de, 1 conniesacademy.com, 1 connorcordell.co.uk, 1 +connorfindlay.com, 1 connorhatch.com, 1 conntrack.com, 1 connyduck.at, 1 @@ -22635,6 +22295,7 @@ consonare.de, 1 conspiracionweb.tk, 1 constant-rough.de, 1 constant.ga, 1 +constelacion3d.com, 1 constellations.ga, 1 consteval.org, 1 constexpr.org, 1 @@ -22706,7 +22367,6 @@ contratatupoliza.com, 1 contratti.it, 1 contributor.google.com, 1 controlambientalbogota.com, 1 -controlautocom.com.br, 1 controlbooth.com, 1 controle.net, 1 controleer-maar-een-ander.nl, 1 @@ -22726,6 +22386,7 @@ conversiepartners.nl, 1 conversiones.com, 1 conversionsciences.com, 1 convert.zone, 1 +convert2sql.com, 1 converter.ml, 1 convertimg.com, 1 convexset.org, 1 @@ -22733,6 +22394,7 @@ convierteenabudancia.com, 1 convocatoriafundacionpepsicomexico.org, 0 conxcon.de, 1 coochiehacks.io, 1 +cookandgame.com, 1 cookcountyclerkil.gov, 1 cooker.fr, 1 cookescastles.co.uk, 1 @@ -22853,7 +22515,7 @@ corepartners.com.ua, 1 coresolutions.ca, 1 coresos.com, 1 coreum.ca, 1 -coreup.de, 0 +coreup.de, 1 corevetconnect.co.uk, 1 coreyjmahler.com, 1 corgei.com, 1 @@ -22867,7 +22529,6 @@ coriolis.ch, 1 corisu.co, 1 corkcityfc.tk, 1 corkedwinebar.com, 1 -corkerscrisps.co.uk, 1 corksoncolumbus.com, 1 corl3ss.com, 1 corleoncatering.com, 1 @@ -22940,6 +22601,7 @@ corsomassaggi.it, 1 corsorspp.roma.it, 1 cortealcastello.it, 1 cortege.cf, 1 +cortesparapelo.com, 1 cortex-development.de, 1 cortexitrecruitment.com, 1 cortexx.nl, 1 @@ -22949,6 +22611,7 @@ corvax.kiev.ua, 1 corvee.com, 1 corvus.eu.org, 1 coryadum.com, 1 +coryluba.com, 1 corytyburski.com, 0 cosasque.com, 1 cosciamoos.com, 1 @@ -23011,6 +22674,7 @@ cotswoldflatroofing.com, 1 cotta.dk, 1 cottonage.tk, 1 cotwe-ge.ch, 0 +cou.re, 1 cougar.dating, 1 coughlan.de, 1 coumoul.fr, 1 @@ -23066,8 +22730,14 @@ covermytrip.com.au, 1 covershousing.nl, 1 covert.sh, 1 covid-19advice.com, 1 +covid-graphs.info, 1 +covid-model.net, 1 covid19.melbourne, 1 +covid19resilience.org, 1 covid19responsepod.com, 1 +covid19scotland.co.uk, 0 +covid19statstracker.com, 1 +covidmodel.net, 1 covuro.com, 1 covve.com, 0 covybrat.cz, 1 @@ -23088,12 +22758,14 @@ cozmoapp.com, 1 cozmoyachts.com, 1 cozo.me, 1 cozumel-activities.com, 1 -cozyeggdesigns.com, 1 cp-st-martin.be, 1 cp014.com, 1 cp015.com, 1 cp017.com, 1 +cp061.com, 1 +cpad.org.pk, 1 cpaexamguy.com, 1 +cpanels.us, 1 cpaneltips.com, 1 cpap.com, 1 cpars.gov, 1 @@ -23129,6 +22801,7 @@ cps-sante.ml, 1 cpsa.co.uk, 1 cpsc.gov, 1 cpsecureapp.com, 1 +cpshr.us, 1 cpsq.fr, 1 cpsurvey.com, 1 cptoon.com, 1 @@ -23167,6 +22840,7 @@ craft-me-in.com, 1 craftandbuild.de, 1 craftcms.com, 1 crafted.cat, 1 +crafterbase.de, 1 crafters.co.jp, 1 craftination.net, 1 craftingcrow.com, 1 @@ -23216,7 +22890,6 @@ crawfordcountytcc.org, 1 crawler.ninja, 1 crawleybouncycastles.co.uk, 1 crawlspaceandbasementsolutions.com, 1 -crazy-bulks.com, 1 crazy-cat.net, 1 crazy-coders.com, 1 crazybear-underground.tk, 1 @@ -23256,6 +22929,7 @@ crea-shops.ch, 0 crea-th.at, 1 crea-that.fr, 1 crea.bg, 1 +crea.codes, 1 crea.me, 1 creacioneslri.com, 1 creadoc.fr, 1 @@ -23270,6 +22944,7 @@ creamyfox.com, 1 creandoydesarrollando.com, 1 creared.edu.co, 1 creareup.com, 1 +creatapeak.com, 1 create-ls.jp, 1 create-website.ga, 1 createbeing.com, 1 @@ -23290,7 +22965,7 @@ creativeangles.in, 1 creativebites.de, 1 creativecaptiv.es, 1 creativecommons.gr, 1 -creativecommons.org, 1 +creativecommons.org, 0 creativecommonscatpictures.com, 1 creativeconceptsvernon.com, 1 creativedigital.co.nz, 1 @@ -23308,6 +22983,7 @@ creativesectors.tk, 1 creativesurvey.com, 1 creativeweb.biz, 1 creativewolf.net, 1 +creativlabor.ch, 1 creativosonline.org, 1 creatixx-network.de, 0 creatleencoaching.com, 1 @@ -23318,6 +22994,7 @@ creatujoya.com, 1 crebita.de, 1 crecips.com, 1 crecman.fr, 1 +credee.org, 1 credex.bg, 1 credigo.se, 1 credit-10.com, 1 @@ -23366,6 +23043,7 @@ crgm.net, 1 cribcore.com, 1 crickey.eu, 1 cricklewood.condos, 1 +cricoff.com, 1 criena.com, 1 criena.net, 0 crime-lawyers.com, 1 @@ -23433,6 +23111,7 @@ croco.vision, 1 crocop.tk, 1 crocuscoaching.co.uk, 1 croeder.net, 1 +crohnszone.org, 1 croisedanslemetro.com, 1 cromefire.myds.me, 1 cromosomax.com, 1 @@ -23463,6 +23142,7 @@ crossfitblackwater.com, 1 crossfitvenegono.it, 1 crossformer.com, 1 crossfunctional.com, 1 +crossfw.com, 1 crosslifenutrition.co.uk, 0 crosslimit.ga, 1 crossnet.io, 1 @@ -23529,7 +23209,6 @@ cry-sys.de, 1 cry.nu, 0 cryoblaster.com, 1 cryoflesh.com, 1 -cryogenix.net, 1 cryothanasia.com, 1 cryp.no, 1 crypkit.com, 1 @@ -23552,7 +23231,6 @@ cryptocaseproject.com, 1 cryptoclix.website, 1 cryptocon.org, 1 cryptocurrencyfare.com, 1 -cryptodigitalgroup.com, 1 cryptoearnblog.xyz, 1 cryptofan.org, 1 cryptofomo.capital, 1 @@ -23570,8 +23248,10 @@ cryptolocalatm.com, 1 cryptology.ch, 1 cryptomail.nl, 1 cryptomaniaks.com, 1 +cryptomize.com, 1 cryptomkt.com, 1 crypton.asia, 1 +cryptonewsz.com, 1 cryptonit.cf, 1 cryptonom.org, 1 cryptonx.io, 1 @@ -23605,13 +23285,13 @@ crystalblockchain.com, 1 crystalchandelierservices.com, 1 crystalcherryonline.tk, 1 crystalgrid.net, 1 +crystalmusic-chat.com, 1 crystaloscillat.com, 1 crystalroad.net, 1 crystone.me, 1 cryz.ru, 1 cs-algeria.tk, 1 cs-colorscreed-betongulve.dk, 1 -cs-dreambox.com, 1 cs-kurnik.pl, 1 cs.money, 1 csa-library.org, 1 @@ -23647,10 +23327,10 @@ csgo77.com, 1 csgomtr.com, 1 csgoswap.com, 1 csgotwister.com, 1 +csharp.love, 1 csharpmarc.net, 1 cshopify.com, 1 cshub.nl, 1 -csi.lk, 1 csilies.de, 1 csinfo.us, 1 csinterstargeneve.ch, 0 @@ -23737,8 +23417,6 @@ cube-filing.com, 1 cube.builders, 1 cubebot.io, 1 cubebuilders.net, 1 -cubecart-demo.co.uk, 1 -cubecart-hosting.co.uk, 1 cubecraft.net, 1 cubecraftcdn.com, 1 cubecraftstore.com, 1 @@ -23749,7 +23427,6 @@ cubeo.xyz, 1 cubeperformancecentre.com.au, 1 cubesugar.info, 1 cubetech.co.jp, 1 -cubia.com, 1 cubia.de, 1 cubia3.com, 1 cubia4.com, 1 @@ -23775,28 +23452,27 @@ cuddlingyaks.com, 1 cudesa.gq, 1 cudesyb.tk, 1 cudoo.de, 1 -cueca.com.br, 1 -cuecasonline.com.br, 1 cuegee.com, 1 cuentamecomopaso.es, 1 cuentas-gratis.ga, 1 cuentasmutualamr.org.ar, 1 +cuestiondegustos.es, 1 cuetoems.com, 1 cuevafelina.tk, 1 cuff-links.nl, 1 cuibonobo.com, 1 cuio.net, 1 cuir-lipari.fr, 1 +cuisine-ultime.fr, 1 cuisinecastle.com, 1 cuitandokter.com, 1 -culan.dk, 1 +culan.dk, 0 culinary.ga, 1 culpoilu.tk, 1 cultiv.nl, 1 cultivo.bio, 1 cultofd50.org, 1 cultofperf.org.uk, 1 -cultrix.co.uk, 1 cultura10.com, 1 culturabrasilia.tk, 1 culturaldiversity.tk, 1 @@ -23847,7 +23523,6 @@ curia.fi, 1 curieux.digital, 0 curio-shiki.com, 1 curiosity-driven.org, 1 -curiouspeddler.com, 1 curl.tw, 1 curlify.com, 1 curlybracket.co.uk, 1 @@ -23919,6 +23594,7 @@ cutimbo.ovh, 1 cutlinks.ml, 1 cutmylink.gq, 1 cutner.co, 1 +cutt.pro, 1 cuvva.co, 1 cuvva.co.uk, 1 cuvva.com, 1 @@ -23954,7 +23630,6 @@ cvo-group.com, 1 cvr.dk, 1 cvtemplatemaster.com, 1 cvtenerife.tk, 1 -cvtshop.com.br, 1 cvursache.com, 0 cvutdecin.cz, 1 cvv.cn, 1 @@ -24008,13 +23683,13 @@ cyberduck.io, 1 cyberdyne.ie, 1 cyberdyne.llc, 1 cyberexplained.info, 1 -cyberfamily.network, 1 cyberforensics.com, 1 cyberfrancais.ro, 1 cybergame-host.tk, 1 cybergroup.cf, 1 cyberguerrilla.info, 1 cyberguerrilla.org, 1 +cyberhazard.eu, 1 cyberhipsters.nl, 1 cyberianhusky.com, 0 cyberislam.tk, 1 @@ -24126,7 +23801,6 @@ cytat.tk, 1 cytegic-update-packages.com, 1 cythereaxxx.com, 1 cyumus.com, 1 -cz.ma, 1 czakey.net, 1 czaw.org, 1 czbix.com, 1 @@ -24134,6 +23808,7 @@ czbtm.com, 1 czc.cz, 1 czech.is, 1 czechcrystals.co.uk, 1 +czechglaskralen.nl, 1 czechvirus.cz, 1 czerno.com, 1 czh999.com, 1 @@ -24161,7 +23836,6 @@ d00228.com, 1 d00d.de, 1 d0g.cc, 1 d0m41n.name, 1 -d0xq.com, 1 d0xq.net, 1 d166.net, 1 d1qvlbepn0kduz.cloudfront.net, 1 @@ -24190,7 +23864,6 @@ d588.cc, 1 d64.nl, 1 d66.nl, 1 d6729.co, 1 -d6729.com, 1 d6957.co, 1 d6c5yfulmsbv6.cloudfront.net, 1 d7035.com, 1 @@ -24438,6 +24111,7 @@ dagensannonser.se, 1 dagestan.cf, 1 dagestanci.tk, 1 dagestanec.tk, 1 +dagjetreinen.nl, 1 dagmar2018.cz, 1 dagmarhamalova.cz, 1 dagrs.se, 1 @@ -24447,7 +24121,7 @@ dahobo.tk, 1 dai94.com, 1 daibetter.com, 1 daidogei.com, 1 -daidr.me, 1 +daidr.me, 0 daie-inc.com, 1 daigakujuken-plus.com, 1 daikoz.com, 1 @@ -24476,6 +24150,7 @@ dailyw88.com, 1 dailyxenang.com, 1 daimafengzi.com, 1 daimonikos.com, 1 +dairikab.go.id, 1 dairyshrine.org, 1 daisakuikeda.org, 1 daisidaniels.co.uk, 1 @@ -24497,7 +24172,6 @@ daknob.net, 1 dakota-spain.tk, 1 dakotasjoint.com, 1 daktarisys.com, 1 -daladubbeln.se, 1 dalaran.city, 1 dalb.in, 1 dalbitresb.me, 1 @@ -24562,6 +24236,7 @@ danalina.by, 1 danalytics.com.pe, 1 danamica.dk, 1 danandrum.com, 1 +danangcitytours.com, 1 danarozmarin.com, 1 danashamsters.tk, 1 danbaldwinart.com, 1 @@ -24573,6 +24248,7 @@ danca.com, 1 dance-colleges.com, 1 danceylove.net, 1 danchen.org, 1 +danchestertonphoto.co.uk, 1 dancingcubs.co.uk, 1 danclassroom.com, 1 dandan101.com, 1 @@ -24637,6 +24313,7 @@ danielluisrodriguezs.com, 1 danielmartin.de, 1 danielmiessler.com, 1 danielmoch.com, 1 +danielmorales917.com, 1 danielmorell.com, 1 danielmostertman.com, 1 danieln.tech, 1 @@ -24767,6 +24444,7 @@ dark-nova.tk, 1 dark-vision.cz, 1 dark.fail, 1 dark.ninja, 1 +darkag.ovh, 1 darkartstudios.tk, 1 darkcards.xyz, 1 darkcelebration.tk, 1 @@ -24991,7 +24669,6 @@ davecardwell.com, 1 davedevries.nl, 1 daveedave.de, 1 davelage.com, 1 -davelynes.com, 1 daveoc64.co.uk, 1 daveops.net, 1 davepage.me.uk, 1 @@ -25139,7 +24816,6 @@ dblcastles.co.uk, 1 dbldub.net, 1 dblx.io, 1 dbmiller.org, 1 -dbmteam.com, 1 dborcard.com, 0 dbox.ga, 1 dbplanview.com, 1 @@ -25166,6 +24842,7 @@ dcarou.com, 1 dcave.net, 1 dcbouncycastles.co.uk, 1 dcc.cat, 1 +dcc.moe, 1 dccwiki.com, 1 dcdestetica.it, 1 dcdn.lt, 1 @@ -25193,6 +24870,7 @@ dd00228.com, 1 dd112d.net, 1 dd118d.com, 1 dd11d.net, 1 +dd152.ru, 1 dd201d.com, 1 dd202d.com, 1 dd203d.com, 1 @@ -25246,12 +24924,12 @@ ddracepro.net, 1 dds.mil, 1 dds.pe, 1 ddsmatchsouthwest.com, 1 +ddw.pw, 1 ddy.tw, 1 de-basiliek.tk, 1 de-groot.it, 1 de-gucci.com, 1 de-kramers.nl, 1 -de-mail.info, 1 de-medici.nl, 1 de-mossadeq.tk, 1 de-osopanda.com, 1 @@ -25294,7 +24972,6 @@ dealbanana.se, 1 dealbx.com, 1 dealcruiser.nl, 1 dealdump.nl, 1 -dealerbrindes.com.br, 1 dealerselectric.com, 1 dealerwriter.com, 1 dealinflatables.co.uk, 1 @@ -25357,7 +25034,6 @@ debostero.tk, 1 debraydesign.com.au, 1 debron-ot.nl, 1 debrusoft.ch, 1 -debt.com, 1 debtrecycling.com.au, 1 debuemon.com, 1 debuis.nl, 1 @@ -25406,9 +25082,7 @@ decorativeconcretewa.com.au, 1 decorativecosmetics.tk, 1 decorativeflooring.com, 1 decoratore.roma.it, 1 -decoratrix.com, 1 decorauvent.ca, 1 -decorestilo.com.br, 1 decorincasa.com.br, 1 decormiernissanparts.com, 1 decorotti.com.tr, 1 @@ -25453,6 +25127,7 @@ deepaero.com, 1 deeparamaraj.com, 1 deepbluecrafting.co.uk, 1 deepblueemail.com, 1 +deepclub-chat.com, 1 deepcode.io, 1 deepcreampie.com, 1 deephill.com, 1 @@ -25469,6 +25144,7 @@ deepspace4.com, 1 deepu-mathew.tk, 1 deepumathew.tk, 1 deepvalley.tech, 1 +deepwoodshop.com, 1 deerfieldapartmentsstl.com, 1 deerwoodrvpark.com, 1 deesylab.com, 1 @@ -25559,7 +25235,6 @@ dejongonline.eu, 1 dejting-sidor.com, 1 dejure.org, 0 dejvsoft.pl, 1 -dejw.cz, 1 dekasegi-kansai.com, 1 dekasegi-supportcenter.com, 1 dekasiba.com, 1 @@ -25641,6 +25316,7 @@ deluxe-dubai.com, 1 delvinoadegas.com.br, 1 delycate.com, 1 demand.io, 1 +demarit.fi, 1 demarle.ch, 0 demastglazenwasserij.nl, 1 demedx.at, 1 @@ -25691,6 +25367,7 @@ demuzere.eu, 1 demuzere.net, 1 demuzere.org, 1 den-ka.jp, 1 +den.taxi, 1 denabot.pw, 1 denaehula.com, 1 denahrumah.co, 1 @@ -25727,6 +25404,7 @@ deniz.uk, 1 denizdesign.co.uk, 1 denkeandersblog.de, 1 denkmalagentur.ch, 1 +denkmalsetzung.at, 1 denkubator.de, 1 dennhat.com, 1 denninger.jp, 1 @@ -25783,7 +25461,9 @@ depeche.ga, 1 depechemode-live.com, 1 deped.io, 1 deped.org, 1 +depedapplication.com, 1 depedclub.ph, 1 +depedresearch.com, 1 depedresources.ph, 1 depedsurigaodelnorte.com, 1 depedtambayan.net, 1 @@ -25843,10 +25523,12 @@ derf.red, 1 derf.us, 1 dergeilstestammderwelt.de, 1 derhil.de, 1 +derival.co.za, 1 derivativeshub.pro, 1 derive.cc, 1 derive.cf, 1 derivedata.com, 1 +derk-jan.com, 0 derkarl.tk, 1 derkuki.de, 1 dermacarecomplex.com, 1 @@ -25903,6 +25585,7 @@ designartepublicidad.com, 1 designed-cybersecurity.com, 1 designedbygeniuses.com, 1 designedcybersecurity.com, 1 +designepublicidade.com.br, 1 designer-drug.com, 1 designera.se, 1 designerchad.com, 1 @@ -25946,6 +25629,7 @@ destakbrasilbrindes.com.br, 1 destech.nl, 1 desterman.ru, 1 destileria.net.br, 1 +destinattorneyjohngreene.com, 1 destinfloor.com, 1 destinyofthephoenix.me, 0 destroysilence.cf, 1 @@ -26066,7 +25750,7 @@ developyourelement.com, 0 develux.net, 1 devendradox.ml, 1 deventersysteem.nl, 1 -devh.de, 0 +devh.de, 1 devh.net, 1 deviajesturismo.com, 1 deviant.email, 1 @@ -26094,6 +25778,7 @@ devmode.fm, 1 devnet.tk, 1 devnull.team, 1 devnull.zone, 1 +devoc.net, 1 devochki.ga, 1 devolution.ws, 1 devonsawatzky.ca, 1 @@ -26128,7 +25813,7 @@ dewaard.de, 1 dewalch.net, 1 dewapress.com, 1 dewblog.ml, 1 -dewinter.com, 1 +dewinter.com, 0 dewitteprins.nl, 1 dewolden.nl, 0 dex.top, 1 @@ -26143,6 +25828,7 @@ deyute.com, 1 dez-online.de, 1 dezeregio.nl, 1 dezet-ev.de, 1 +dezinfekcianaruky.com, 1 dezmembrariromania.ro, 1 dezzoroofing.co.za, 1 df118.me, 1 @@ -26181,7 +25867,6 @@ dg68.cc, 1 dgangsta.net, 1 dgblaw.com.au, 0 dgbouncycastlehire.com, 1 -dgeex.eu, 1 dgitup.com, 1 dgl-24.de, 1 dgmedia.tk, 1 @@ -26195,6 +25880,7 @@ dh9397.com, 1 dh9721.com, 1 dhakawebhost.com, 1 dhamdhamaanchalikcollege.tk, 1 +dhammacitta.org, 1 dharamkot.com, 1 dharveydev.com, 1 dhautefeuille.eu, 1 @@ -26268,6 +25954,7 @@ diariocibao.com, 1 diariodearaxa.com.br, 1 diarionoticia.pe, 1 diariorealidad.com, 1 +diariorp.com.br, 1 diariosurnoticias.com, 1 diaroma.it, 1 diarynote.jp, 1 @@ -26393,6 +26080,7 @@ diferenca.com, 1 different.cz, 1 differenta.ro, 1 differentgirleveryday.ml, 1 +differmint.com, 1 difficulty.ga, 1 diffnow.com, 1 diffuzehr.com.au, 1 @@ -26401,7 +26089,6 @@ diflucanonline.tk, 1 diflucanpill.ga, 1 difon.tk, 1 difoosion.com, 1 -difusordeambientes.com.br, 1 digchip.com, 1 digchip.info, 1 digchip.net, 1 @@ -26413,7 +26100,6 @@ dighans.com, 1 digiarc.net, 1 digibull.email, 1 digibull.link, 1 -digicasso.nl, 1 digicert-support.com, 1 digicode.hu, 1 digicy.cloud, 1 @@ -26426,8 +26112,11 @@ digilicious.com, 1 digimaat.agency, 1 digimagical.com, 1 digimedia.cd, 0 +digino.co.uk, 1 +digino.jp, 1 +digino.us, 1 +digino.xyz, 1 digioccumss.ddns.net, 1 -digipl.com, 1 digipolis.gent, 1 digipost.no, 1 digirechnung.de, 1 @@ -26503,11 +26192,11 @@ digitalhurricane.io, 0 digitalid-sandbox.com, 1 digitalid.com, 1 digitalid.com.au, 1 -digitaliguru.com, 1 digitalkes.com, 1 digitalliteracy.gov, 1 digitallive24.ir, 1 digitalmaniac.co.uk, 1 +digitalmarketerconsultant.com, 1 digitalmarketingindallas.com, 1 digitalninja.tk, 1 digitalpiloten.org, 1 @@ -26550,7 +26239,6 @@ diletec.com.br, 1 dilibel.be, 1 dilichen.fr, 1 diligo.ch, 0 -dillewijnzwapak.nl, 1 dillonkorman.com, 1 diluv.com, 0 dimagrimentoincorso.it, 1 @@ -26558,8 +26246,8 @@ dimanet.fr, 1 dimanss47.net, 1 dime-staging.com, 1 dime.io, 1 -dimeponline.com.br, 1 dimez.ru, 1 +dimigo.codes, 1 dimiskovska.de, 1 dimism.eu, 1 dimitrihomes.com, 1 @@ -26610,6 +26298,7 @@ dioesfoto.com, 1 diogeneshoy.com, 1 dionysos-ios.gr, 1 dionysus.se, 1 +dioxido.com.ar, 1 diozoid.com, 1 dipalma.me, 1 dipdaq.com, 1 @@ -26627,7 +26316,6 @@ dirba.io, 1 direct-sel.com, 1 direct.cz, 1 direct365.es, 1 -directed.ir, 1 directelectricalltd.co.uk, 1 directfinance.cz, 1 directfitnesssolutions.com, 1 @@ -26819,7 +26507,6 @@ distock.fr, 1 distracteddriving.gov, 1 distraction.gov, 1 distratus.com, 1 -distribuidoracristal.com.br, 1 distribuidoradecierres.com, 1 distribuidoraplus.com, 1 distribuidorveterinario.es, 1 @@ -26837,6 +26524,7 @@ ditemanggung.com, 1 diterzafra.tk, 1 diti.me, 1 dities.tk, 1 +ditudo.com, 1 div.im, 1 diva.nl, 1 divari.nl, 1 @@ -26871,7 +26559,6 @@ divistart.online, 1 divisuite.com, 1 divjak.at, 1 divo-remont.tk, 1 -divorciosmurcia.com, 1 divup.com, 1 diwaligiftforyou.com, 1 diwei.vip, 1 @@ -26898,6 +26585,7 @@ dizzyskills.tk, 1 dizzythewizard.co.uk, 1 dj-kupidon.gq, 1 dj-leszwolle.nl, 1 +dj-phil.fr, 1 dj-x.info, 1 dj16888.com, 1 dj16888a.com, 1 @@ -26939,7 +26627,6 @@ djl63.com, 1 djl63001.com, 1 djleon.net, 1 djlinux.cz, 1 -djlive.pl, 1 djlnetworks.co.uk, 1 djlove.tk, 1 djmarian.com, 1 @@ -26958,6 +26645,15 @@ djul.net, 1 djurklinikenangelholm.se, 1 djvintagevinyl.com, 1 djvintagevinyl.nl, 1 +djvip1.com, 1 +djvip10.com, 1 +djvip2.com, 1 +djvip3.com, 1 +djvip4.com, 1 +djvip5.com, 1 +djvip6.com, 1 +djvip7.com, 1 +djvip9.com, 1 djwaynepryke.com, 1 djwilson.tk, 1 djyoungcruse.tk, 1 @@ -26992,6 +26688,7 @@ dlld.org, 1 dlld.us, 1 dlmit.be, 1 dlouwrink.nl, 1 +dlrg-cux-ohz.de, 1 dlrsp.org, 1 dlscomputers.com.au, 1 dlui.xyz, 1 @@ -27010,7 +26707,6 @@ dmailshop.ro, 1 dmarc.dk, 1 dmarc.tech, 1 dmarcian.com, 1 -dmaseocompany.com, 1 dmatrix.xyz, 1 dmclix.com, 1 dmcw.de, 1 @@ -27047,6 +26743,7 @@ dnalounge.com, 1 dnapizza.com, 1 dnash.tk, 1 dnc.org.nz, 1 +dnddobbelstenen.nl, 1 dndtools.net, 1 dnepropetrovck.tk, 1 dnfc.rocks, 1 @@ -27141,6 +26838,7 @@ doctor.dating, 1 doctor360.com.au, 1 doctorbini.com, 1 doctorcalefon.com, 1 +doctorebonie.com, 1 doctorfox.co.uk, 1 doctormahamudul.tk, 1 doctornaima.ml, 1 @@ -27185,7 +26883,11 @@ dogcontrol.ca, 1 dogcratereview.info, 1 dogday.tk, 1 doge.town, 1 -dogear.ch, 1 +dogear.ch, 0 +dogespeed.cf, 1 +dogespeed.gq, 1 +dogespeed.ml, 1 +dogespeed.tk, 1 dogforum.de, 1 dogfriendly.co.uk, 1 dogft.com, 1 @@ -27206,7 +26908,6 @@ dogsdailylife.com, 1 dogsnow.com, 1 dogtrack.tk, 1 dogurai.com, 1 -dogworld.com.br, 1 dohanews.co, 1 doi.org, 1 doihavetoputonpants.com, 1 @@ -27326,10 +27027,10 @@ domix.fun, 1 domizx.de, 1 domjh.com, 1 domlist.tk, 1 -dommascate.com.br, 1 domob.eu, 1 domodeco.fr, 1 domodedovo.travel, 1 +domofon.io, 1 domop.cc, 1 domop.net, 1 domop.org, 1 @@ -27383,6 +27084,7 @@ donghochinhhang.store, 1 dongjingre.net, 1 dongor.tk, 1 dongxuwang.com, 1 +donia-almla3b.com, 1 donjusto.nl, 1 donkennedyandsons.com, 1 donkeytrekkingkefalonia.com, 1 @@ -27408,6 +27110,7 @@ dontbeevil.com, 1 dontbubble.me, 1 donteaetcrayons.tk, 1 donthedragonwilson.com, 1 +dontkeylog.me, 1 dontpayfull.com, 1 dontstopcoffee.com, 1 donttrust.me, 1 @@ -27491,6 +27194,7 @@ doska.cf, 1 doska.ru, 1 doskapozora.tk, 1 dosomeworks.biz, 1 +dossierweb.tk, 1 dossplumbing.co.za, 0 dostalsecurity.com, 1 dostav.tk, 1 @@ -27507,7 +27211,6 @@ dosvientosoutdoorlighting.com, 1 doswap.com, 1 dosyaa.tk, 1 dosyauzantisi.com, 1 -dot.ro, 1 dot42.no, 1 dota2free.tk, 1 dotacni-parazit.cz, 1 @@ -27557,6 +27260,7 @@ doublestat.me, 1 doubleup.com.au, 1 doubly.tk, 1 doubtaboutwill.org, 1 +douceurcarlet.com, 1 doucheba.gs, 0 doughseeker.com, 1 douglas-ma.gov, 1 @@ -27584,6 +27288,7 @@ dowling.nz, 1 down-load.dynu.net, 1 downandouts.tk, 1 downfreak.tk, 1 +download-audacity.org, 1 download-image.ga, 1 download-knigi.gq, 1 download.dk, 1 @@ -27622,7 +27327,6 @@ doyleshamrock.com, 1 doyo.email, 1 doyo.tech, 1 doyoucheck.com, 0 -doyouedc.com, 1 doyoulyft.com, 1 doyouspeakenglish.tk, 1 doyoutax.com, 0 @@ -27796,6 +27500,7 @@ draugr.de, 1 draw.uy, 1 drawchan.org, 1 drawesome.uy, 1 +drawguess.fun, 1 drawing.tk, 1 drawingcode.net, 1 drawtwo.gg, 1 @@ -27820,6 +27525,7 @@ dreadd.org, 1 dreadlord.tk, 1 dream-design.tk, 1 dream-domain.tk, 1 +dream-factory.tk, 1 dream-pools.cf, 1 dreamaholic.club, 1 dreambbs.tk, 1 @@ -27888,7 +27594,6 @@ dresdner-mandelstollen.de, 1 dresdner-stollen-von-reimann.de, 0 dresdner-stollen.shop, 1 dress-cons.com, 1 -dressedinwhitebridal.com, 1 dressify.in, 1 dressingmaternity.fr, 1 dreumesshakira.tk, 1 @@ -27909,6 +27614,7 @@ drfrey.ch, 0 drgeadsdavinci.com, 1 drgerthplasticsurgery.com, 1 drghomi.com, 1 +drgiyaseddin.com, 0 drglassgyn.com, 1 drgn.li, 1 drgn.no, 1 @@ -28004,6 +27710,7 @@ droidwiki.de, 1 dromax.hu, 1 dromotique.com, 1 drone-it.net, 0 +drone33.fr, 1 dronebase.cf, 1 dronebl.org, 1 droneland.nl, 1 @@ -28108,6 +27815,7 @@ drymx.cn, 1 drywallresponse.gov, 1 drywtea.com, 1 dryzgov.tk, 1 +ds-hostingsolutions.net, 1 ds.lol, 1 ds138.cc, 1 ds168.cc, 1 @@ -28137,6 +27845,7 @@ dsh.io, 1 dshield.org, 1 dsi7.com, 1 dsimons.tk, 1 +dsiteam.in, 1 dsm5.com, 1 dsmjs.com, 1 dsmnet.org, 1 @@ -28155,6 +27864,7 @@ dstvinstallkemptonpark.co.za, 1 dstvsandton.co.za, 1 dstvsouthafrica.com, 1 dsuinnovation.com, 1 +dsv-salesmanager.de, 1 dt688.net, 1 dtbouncycastles.co.uk, 1 dtbw.eu, 1 @@ -28228,7 +27938,7 @@ duckblade.com, 1 duckcorp.org, 1 duckduck.horse, 1 duckduckstart.com, 1 -duckeight.win, 0 +duckeight.win, 1 duckfam.us, 1 duckinc.net, 1 ducksify.com, 1 @@ -28245,7 +27955,6 @@ duernberg.at, 1 duesee.org, 1 duesseldorferheineburschenschaft.tk, 1 duesterhus.eu, 1 -dueto.store, 1 dufort.nl, 1 dufrei.com, 1 dug.net.pl, 1 @@ -28313,12 +28022,13 @@ duo.com, 1 duobus.nl, 1 duoluodeyu.com, 1 duonganhtuan.com, 1 +duoqichina.cn, 1 +duoqichina.com, 1 duoquadragintien.fr, 1 duoyin.com, 1 dupisces.com.tw, 1 duplicazionechiavi.it, 1 dupree.co, 1 -dupree.pe, 1 durabletravailler.tk, 1 duraes.pt, 1 durand.tf, 1 @@ -28338,6 +28048,7 @@ duria.de, 1 duriaux-dentiste.ch, 0 duriemas.com, 1 durin-art.com, 1 +durkinconstruction.com.au, 1 durmatest.com, 1 duroterm.ro, 1 durys.be, 1 @@ -28368,6 +28079,7 @@ dutchforkrunners.com, 1 dutchplayers.com, 1 dutchsailors.com, 1 dutchwanderers.nl, 1 +dutchwaredesign.nl, 1 dutchweballiance.nl, 1 dutkoteam.com, 1 dutrac.co.id, 1 @@ -28390,7 +28102,6 @@ dveri-lugansk.tk, 1 dverisochi.ru, 1 dvhosting.be, 1 dvipadmin.com, 1 -dvlot.ru, 1 dvnatura.ch, 0 dvor.ml, 1 dvorupotocnych.sk, 1 @@ -28398,8 +28109,8 @@ dvwc.org, 1 dvx.cloud, 1 dw-loewe.de, 0 dwarf.com.tw, 1 +dwell.property, 1 dwgf.xyz, 1 -dwhd.org, 1 dwhightmolina.com, 1 dwi-sued.de, 1 dwnld.me, 1 @@ -28428,6 +28139,7 @@ dybuster.de, 1 dybuster.es, 1 dybuster.it, 1 dybuster.se, 1 +dycoa.com, 1 dyeager.org, 1 dyktig.as, 1 dyktig.no, 1 @@ -28543,7 +28255,6 @@ e-briancon.com, 1 e-classroom.tk, 1 e-coexist.com, 1 e-colle.info, 1 -e-cottage.com.br, 1 e-dengi.tk, 1 e-diabolo.tk, 1 e-diapers.tk, 1 @@ -28575,6 +28286,7 @@ e-peeling.tk, 1 e-planshet.tk, 1 e-polygraphy.tk, 1 e-privat.info, 1 +e-procurement.co.mz, 1 e-ptn.com, 1 e-receta.cl, 1 e-recruitment.tk, 1 @@ -28607,7 +28319,6 @@ e-worksmedia.com, 0 e-zine.tk, 1 e.mail.ru, 1 e00228.com, 1 -e007.com, 1 e1488.com, 1 e15r.co, 1 e2ebrindes.com.br, 1 @@ -28800,9 +28511,19 @@ eac0662.com, 1 eac0663.com, 1 eac0691.com, 1 eac0692.com, 1 +eac0701.com, 1 +eac0710.com, 1 eac0711.com, 1 eac0712.com, 1 +eac0713.com, 1 eac0714.com, 1 +eac0716.com, 1 +eac0717.com, 1 +eac0718.com, 1 +eac0719.com, 1 +eac0728.com, 1 +eac0730.com, 1 +eac0731.com, 1 eac0832.com, 1 eac0833.com, 1 eac0834.com, 1 @@ -28988,9 +28709,7 @@ ebankingmasicuro.ch, 1 ebas.ch, 1 ebashim.tk, 1 ebataw.com, 1 -ebaymotorssucks.com, 1 ebenda.org, 1 -ebenezersbarnandgrill.com, 1 ebenvloedaanleggen.nl, 1 ebermannstadt.de, 0 ebertlang.com, 1 @@ -29000,7 +28719,9 @@ ebill.pl, 1 ebiografia.com, 1 ebiografias.com.br, 1 ebisi.be, 1 +ebix.dk, 1 ebizarts.com, 1 +ebjork.se, 1 eblog.cf, 1 eblog.ink, 1 eboardsolutions.com, 1 @@ -29019,6 +28740,7 @@ ebooks4all.tk, 1 ebooksa.com, 1 ebooksbag.com, 1 ebooksgratuits.org, 1 +ebooksinfocus.com, 1 ebookspy.tk, 1 ebop.ch, 1 eboutic.ch, 1 @@ -29028,7 +28750,6 @@ ebpglobal.com, 0 ebrnd.de, 1 ebrowz.com, 1 ebstyle.co.uk, 1 -ebteam.ir, 1 ebuha.ga, 1 ebuku.tk, 1 eburg.ml, 1 @@ -29036,6 +28757,7 @@ ebuyclub.com, 1 ec-baran.de, 1 ec-current.com, 1 ec.mine.nu, 1 +ecaa.ee, 1 ecarch.cf, 1 ecard.ml, 1 ecardoo.com, 1 @@ -29051,7 +28773,6 @@ eccux.com, 1 ecdahls.no, 1 ecdn.cz, 1 ecelembrou.ovh, 1 -ecfnorte.com.br, 1 ecfunstalls.com, 1 echarity.ae, 1 echarlascartas.es, 1 @@ -29083,7 +28804,6 @@ echternach-immobilien.de, 1 echtes-hutzelbrot.de, 1 echtgeld-casino.com, 0 ecigfind.com, 1 -ecir.pro, 1 ecir.ru, 1 ecirtam.net, 1 eciso.io, 1 @@ -29129,7 +28849,7 @@ ecohimdv.tk, 1 ecohostingservices.uk, 1 ecolala.my, 1 ecole-attalens.ch, 0 -ecole-iaf.fr, 1 +ecole-iaf.fr, 0 ecoledusabbat.org, 0 ecolemathurincordier.com, 0 ecolesrec.ch, 0 @@ -29161,6 +28881,7 @@ ecorp-australia.tk, 1 ecorp.cc, 1 ecos-ev.de, 1 ecos.srl, 1 +ecosdanoticia.net.br, 1 ecoshare.info, 1 ecoskif.ru, 1 ecosoftconsult.com, 0 @@ -29184,7 +28905,6 @@ ecr-test-partnapp.azurewebsites.net, 1 ecrandouble.ch, 0 ecredits-dev-app-backoffice01.azurewebsites.net, 1 ecredits-dev-app-partner01.azurewebsites.net, 1 -ecriminalrecords.com, 1 ecrownoffire.com, 1 ecstaticentertainment.com, 1 ecsupplyinc.com, 1 @@ -29209,7 +28929,6 @@ eddie.website, 1 eddmil.es, 1 eddokloosterman.com, 1 eddsworld.tk, 1 -eddy-vh.com, 1 eddyn.net, 1 edeals.co, 1 edeals.co.com, 1 @@ -29285,7 +29004,6 @@ edservicing.com, 1 edshogg.co.uk, 1 edsinet.com, 0 edsm.net, 1 -edstem.org, 1 edstep.com, 1 edtech-hub.com, 1 edtech.ee, 1 @@ -29318,6 +29036,7 @@ educators.co.nz, 1 educatoys.com.br, 1 educbook.ga, 1 eductf.org, 1 +edufrog.it, 1 edugundavetiyesi.com, 1 eduid.se, 0 eduif.nl, 0 @@ -29325,7 +29044,6 @@ edulinks.ml, 1 edumaster.pro, 1 edunaut.com.au, 1 edunet.gq, 1 -edupool.in, 1 eduproject.tk, 1 eduroam.no, 1 eduroam.uy, 1 @@ -29371,7 +29089,6 @@ ee632.com, 1 ee651.com, 0 ee652.com, 0 ee6729.co, 1 -ee6729.com, 1 ee6957.co, 1 ee735.com, 1 ee736.com, 1 @@ -29400,7 +29117,6 @@ eesti.xyz, 1 eet.nu, 1 eewna.org, 1 eez.ee, 1 -ef-georgia.org, 1 ef.gy, 1 efaas.nl, 1 efag.com, 1 @@ -29496,6 +29212,7 @@ egretail.no, 0 egrojsoft.info, 1 egrp365.ru, 1 egsl.pro, 1 +egt.ee, 1 egw-ceramica.de, 1 egweb.tv, 1 egypte.tk, 1 @@ -29508,8 +29225,6 @@ ehaccp.it, 1 ehazi.hu, 1 ehbsecuritydavy.be, 1 ehbssl.com, 1 -ehcommerce.com, 1 -ehcommerce.org, 1 ehealth.gov.au, 1 eheliche-disziplin.schule, 1 ehipaa.com, 1 @@ -29629,6 +29344,7 @@ ekrana.info, 1 ekranos.me, 1 ekre.club, 1 eksisozluk.com, 1 +eksk.pl, 1 ekspoint-mods.ru, 1 eku.com.tr, 1 ekvastra.in, 1 @@ -29670,7 +29386,6 @@ elcambiador.es, 1 elchamandelaprosperidad.org, 1 elcin.tk, 1 elcontadorsac.com, 1 -eldapoint.co.uk, 1 eldenelesat.com, 1 eldercare.gov, 1 elderjustice.gov, 1 @@ -29793,7 +29508,6 @@ electrotainment.com, 1 electroworld.cz, 1 electrum.org, 1 eled.io, 1 -elefantebrasil.com.br, 1 elefantevoador.com, 1 elegance-sm.com, 1 eleganceperfumes.com.br, 1 @@ -29803,7 +29517,6 @@ eleicoes2014.com.br, 1 eleicoes2016.com.br, 1 eleicoes2018.com, 1 elejordemarketingconsultancy.com, 1 -eleken.jp, 1 elekharris.com, 1 elektrische-zahnbuerste24.de, 1 elektro-adam.de, 1 @@ -29874,11 +29587,13 @@ eleonrp.tk, 1 elephantia.cf, 1 elephants.net, 1 elephants.tk, 1 +elephantstone.net, 1 elepover.com, 1 eletesstilus.hu, 1 eletminosegert.ro, 1 eletor.com, 1 eletor.pl, 1 +eletricista.biz, 1 eletrochape.com.br, 1 elettricista-roma.it, 1 elettricista-roma.org, 1 @@ -29916,6 +29631,7 @@ elherraderoloscabos.com, 1 elhorizontal.com, 1 elhossari.com, 1 elias-erdmann.tk, 1 +eliasfox.com, 1 eliaskordelakos.com, 1 eliasojala.me, 1 eliasong.com, 1 @@ -29931,9 +29647,9 @@ eligibleapi.com, 1 eligrey.com, 1 elijahgrey.com, 1 elikers.ml, 1 -elimer.com.ve, 1 eliminercellulite.com, 1 elimitecreamforsale.ga, 1 +elinahafer.de, 1 elindependiente.co.cr, 1 eline168.com, 1 elinevanhaaften.nl, 1 @@ -29991,6 +29707,7 @@ ellhofen-peccioli.de, 1 elligre.tk, 1 ellinaras.tk, 1 elliot.cat, 1 +elliottbernstein.com, 1 ellipsoid.cf, 1 elliquiy.com, 1 ellisamusements.co.uk, 1 @@ -30026,6 +29743,7 @@ eloxt.com, 1 elpaseadordeperros.com, 1 elpo.net, 1 elpoderdelespiritu.org, 1 +elpueblo.com.do, 1 elradiobuffet.tk, 1 elradix.be, 1 elradix.eu, 1 @@ -30047,6 +29765,7 @@ elsuccionador.com, 1 elsvanderlugt.nl, 1 elsword.moe, 0 eltair.com, 1 +eltd.com.vn, 1 eltern-verein.ch, 1 elternbeiratswahl.online, 1 elternforum-birmensdorf.ch, 1 @@ -30110,6 +29829,7 @@ embassycargo.eu, 1 embebelo.com, 1 embellir-aroma.com, 1 embellir-kyujin.com, 1 +embello.co.uk, 1 emberlife.com, 1 embodiaacademy.com, 1 embodiaapp.com, 1 @@ -30128,15 +29848,16 @@ emdadkhodrokaraj.ir, 1 emdrupholm.dk, 1 emecew.com, 1 emedos.es, 1 -emeliefalk.se, 1 emeliemai.com, 1 ememsei.com, 1 emeraldcbdshop.com, 0 emeraldcityswagger.com, 1 emeraldcoasturgentcare.com, 1 +emeraldislerealty.com, 1 emergency-federal-register.gov, 1 emergencycommand.us, 1 emergencyshutoff.com, 1 +emergenzaduepuntozero.it, 1 emergesydney.com.au, 1 emero.de, 1 emersoncanada.ca, 1 @@ -30160,6 +29881,7 @@ emils-1910.de, 1 emils-chemnitz.de, 1 emils1910.de, 1 emilstahl.com, 1 +emilstahl.de, 1 emilstahl.dk, 1 emilvarga.com, 1 emily.moe, 1 @@ -30226,14 +29948,9 @@ employer411.com, 1 employersupport.co.uk, 1 employmax.co.za, 1 employmaxetd.co.za, 1 -employment-applicant.com, 1 employment.uk.com, 1 employmentlawworldview.com, 1 emporikonathenshotel.com, 1 -emporiodascalcinhas.com.br, 1 -emporiodosperfumes.com.br, 1 -emporioonline.com.br, 1 -emporiopatanegra.com.br, 1 emporioviverbem.com.br, 0 empower.net, 1 empowerdb.com, 1 @@ -30261,6 +29978,7 @@ emsa-casm.ca, 1 emsliespharmacy.com.au, 1 emsrealfood.nl, 1 emtradingacademy.com, 1 +emulationking.com, 1 emulator.ml, 1 emulovers.com, 1 emulsifier.ga, 1 @@ -30348,7 +30066,6 @@ energy-drink-magazin.de, 1 energy-fm.tk, 1 energy-healings.com, 1 energy-in-balance.eu, 1 -energy-initiative.com, 1 energy-robotics.com, 1 energy.gov, 1 energyatlas.com, 1 @@ -30399,6 +30116,7 @@ engie-laadpalen.nl, 1 engiedev.net, 1 engima.nl, 1 engineeringbigdata.com, 1 +engineowning.com, 1 enginepit.com, 1 enginsight.com, 1 enginx.net, 1 @@ -30406,6 +30124,7 @@ engione.com, 1 engl-server.de, 1 engl-systems.de, 1 englandbeach.com, 1 +english-biography.com, 1 english-to-russian-translation.tk, 1 english-training.tk, 1 englishbulgaria.net, 1 @@ -30441,9 +30160,9 @@ enjinwallet.io, 1 enjinx.cn, 1 enjinx.io, 1 enjoy-drive.com, 1 -enjoymondayofficial.com, 1 enjoytech.fr, 1 enjoytransferitalia.com, 1 +enlace.vip, 1 enlacesgranotas.tk, 1 enlamochiladeadri.com, 1 enlight.no, 1 @@ -30453,7 +30172,6 @@ enlnf.link, 1 enloestatebank.com, 1 enlyft.com, 0 ennea-mediation.fr, 1 -enness.co.uk, 1 ennori.jp, 1 enns-photography.com, 1 enodais.gr, 1 @@ -30466,6 +30184,7 @@ enot32.ru, 1 enotecastore.it, 1 enotefile.com, 1 enotovil.ru, 1 +enoxhzwh.eu, 1 enpalmademallorca.info, 1 enpasenerji.com.tr, 1 enquetebeteiligung.de, 1 @@ -30478,6 +30197,7 @@ enriqueferreira.com, 1 enriquepiraces.com, 1 enrollapp.com, 1 ensage.io, 1 +ensaladasvinagreta.com, 1 enscosupply.com, 1 ensemble-rubato.de, 1 ensembling.com, 1 @@ -30516,6 +30236,7 @@ entrainr.com, 1 entrecieletpierres.com, 0 entrenossocialinfo.com, 1 entreprenet.gq, 1 +entrezdansladanse.fr, 1 entropia.de, 0 entropy.su, 1 entrup.io, 1 @@ -30538,6 +30259,7 @@ enviroli.uk, 1 environment.ai, 1 environmental-colleges.com, 1 enviroprobasements.com, 1 +envisionsproperty.com, 1 envisolarvind.tk, 1 envman.io, 1 envoie.moi, 1 @@ -30580,7 +30302,6 @@ epaygateway.net, 1 epcomputacion.com.ar, 1 epcreport.net, 1 epdeveloperchallenge.com, 1 -eperniagaan.com, 1 ephesusbreeze.com, 1 epi-lichtblick.de, 1 epi.no, 1 @@ -30601,7 +30322,6 @@ epicfail.be, 1 epicginger.fi, 1 epichouse.net, 0 epicinflatables.co.uk, 1 -epickitty.co.uk, 1 epiclub.com.au, 1 epicmoney.tk, 1 epicmusicradio.ml, 1 @@ -30697,9 +30417,8 @@ equinenow.com, 1 equinetherapy.ca, 1 equinox.io, 1 equip-test.com, 1 -equipandoloja.net.br, 1 +equipamentosparapostos.com.br, 1 equipedefrance.tv, 0 -equipeferramentas.com.br, 1 equipoweb.info, 1 equippers.de, 1 equisecu.com, 1 @@ -30731,6 +30450,7 @@ ereader.uno, 1 erector.tk, 1 erektion1.gq, 1 eremnews.com, 1 +erenvakfi.org, 1 erethon.com, 1 erevan-news.tk, 1 erf-neuilly.com, 1 @@ -30741,7 +30461,6 @@ ergobyte.eu, 1 ergobyte.gr, 1 ergodark.com, 1 ergoterapeutas.lt, 1 -ergovita.com.br, 1 ergowish.com, 1 eriador.io, 1 eric-kolelas.tk, 1 @@ -30753,12 +30472,13 @@ ericfo.cf, 1 erichoekstra.com, 1 erichoekstra.nl, 1 erichogue.ca, 1 +erichoins.com, 1 erichorstmanshof.nl, 1 erichware.tk, 1 ericjohnltd.com, 1 erick.blog, 1 ericksonvasquez.com, 1 -ericleuthardt.com, 1 +ericlight.com, 1 ericloud.tk, 1 ericoc.com, 1 erics.site, 1 @@ -30780,7 +30500,6 @@ erikkruithof.nl, 1 eriksen.im, 1 erikserver2.tk, 1 erikseth.de, 1 -erikw.me, 1 erinaceinae.com, 1 eriner.me, 1 eringmaguire.com, 1 @@ -30791,6 +30510,7 @@ erisys.net, 1 erkaelderbarenaaben.dk, 1 erkenntniswen.de, 1 erkiss.live, 1 +erkkiaronen.fi, 1 erlebnisarchaeologie-bayern.de, 1 erman.ga, 1 ermitano.cf, 1 @@ -30847,6 +30567,7 @@ erudicia.se, 1 erudicia.uk, 1 erudikum.cz, 1 erudio-usluge.hr, 1 +erulezz.nl, 1 ervaarjapan.nl, 1 ervinthagod.xyz, 1 ervirmaison.tk, 1 @@ -30872,6 +30593,7 @@ es9999.net, 1 esaborit.ddns.net, 0 esagente.com, 1 esailinggear.com, 1 +esajokinen.net, 1 esalesclub.com, 1 esalesdata.com, 1 esamievalori.com, 1 @@ -30909,6 +30631,7 @@ esb333.net, 1 esb336.com, 1 esb369.com, 0 esb433.com, 1 +esb518.com, 1 esb553.com, 1 esb555.biz, 1 esb555.cc, 1 @@ -30917,7 +30640,6 @@ esb556.com, 1 esb5889.com, 1 esb6.net, 1 esb666.com, 1 -esb66666.com, 1 esb677.net, 1 esb688.com, 1 esb68888.com, 1 @@ -31027,7 +30749,6 @@ esdiscuss.org, 1 esea.com.br, 1 eseances.ch, 1 esehospitalsabanagrande.com, 1 -esemprego.com.br, 1 eservices-greece.com, 1 eset.ml, 1 eseth.de, 1 @@ -31156,10 +30877,8 @@ estafallando.es, 1 estafallando.mx, 1 estahl.dk, 1 estaleiro.org, 1 -estalinas.com, 1 estallidodigital.cl, 1 estan.cn, 1 -estaryshop.com.br, 1 estate360.co.tz, 1 estateczech-eu.ru, 1 estcequejailaflemme.fr, 0 @@ -31172,12 +30891,10 @@ estela-artes.com, 1 esteladigital.com, 1 esteriliza-me.org, 1 esterilizacion-perros.es, 1 -esteticanorte.com.br, 1 estetici.com, 1 estetista.net, 1 esthe-zukan.com, 1 estherlew.is, 1 -estilopack-loja.com.br, 1 estimulantesbrasil.com, 1 estintori.roma.it, 1 estonia.net, 1 @@ -31254,7 +30971,6 @@ eth-services.de, 1 eth0.nl, 0 eth1.fi, 1 etha.nz, 1 -ethack.org, 1 ethaligan.fr, 1 ethan.pm, 1 ethanjones.me, 1 @@ -31267,6 +30983,7 @@ ethercalc.org, 1 etherderbies.com, 1 ethereal.games, 1 etherium.org, 1 +ethernia.fr, 1 ethernium.fun, 1 etheron.com, 1 etherpad.nl, 1 @@ -31289,6 +31006,7 @@ etienne.cc, 1 etiennes.work, 1 etikus-hacker.hu, 1 etincelle.ml, 1 +etindustries.com, 1 etiquetaunica.com.br, 1 etkaddict.com, 1 etkarle.de, 1 @@ -31307,8 +31025,8 @@ etrolleybizstore.com, 1 ets2mp.de, 1 etskinner.com, 1 etskinner.net, 1 -etsservicios.com, 1 ettbl.net, 1 +ettebiz.com, 1 etudesbibliques.fr, 0 etudesbibliques.net, 0 etudesbibliques.org, 0 @@ -31482,6 +31200,7 @@ evdenevenakliyatankara.name.tr, 1 eve-online-com.ru, 1 eve-raynon.fr, 1 eve-ua.com, 1 +eve.pub, 1 eveco-mebel.ga, 1 evedanjailbreak.com, 1 eveil-et-savoirs.com, 1 @@ -31517,7 +31236,6 @@ eveonline.com, 1 ever.sale, 1 everain.me, 1 everberg.tk, 1 -everettsautorepair.com, 1 everfine.com.tw, 1 evergarden.cn, 1 evergladesrestoration.gov, 1 @@ -31532,7 +31250,6 @@ everling.lu, 1 everlong.org, 1 evermarkstudios.com, 1 evernaut.com, 1 -everpcpc.com, 1 everseo.tk, 1 evertonarentwe.com, 1 everwaking.com, 0 @@ -31560,6 +31277,7 @@ everysync.co.jp, 1 everything-everywhere.com, 1 everythingaccess.com, 1 everythingbarca.com, 1 +everythingcebu.com, 1 everythinginoneblog.gq, 1 everythingstech.com, 1 everythinq.com, 1 @@ -31575,7 +31293,6 @@ evhoeft.com, 1 eviction.cf, 1 evidence-based.review, 1 evidencebased.net, 1 -evidenceusa.com.br, 1 evidencija.ba, 1 evil-empire.tk, 1 evilbeasts.ru, 1 @@ -31623,6 +31340,7 @@ evomada.com, 1 evomon.com, 1 evony.eu, 1 evoplay.gq, 1 +evosnine.xyz, 1 evosyn.com, 1 evote-ch.ch, 1 evotec.pl, 1 @@ -31676,6 +31394,7 @@ exablue.de, 1 exactlyinfinite.com, 1 exactphilosophy.net, 1 exadime.net, 1 +exaduosport.fr, 1 exagoni.com.au, 1 exagoni.com.my, 1 exaktus.pt, 1 @@ -31713,7 +31432,6 @@ exceptionalservices.us, 1 excerp.tech, 1 excess-baggage.com, 1 excessamerica.com, 1 -excesssecurity.com, 0 exchangers.top, 1 exchaser.com, 1 exciters.tk, 1 @@ -31722,6 +31440,7 @@ exclusive-world.tk, 1 exclusivebeautystudio.com.au, 1 exclusivebouncycastles.co.uk, 1 exclusivedesignz.com, 1 +exclusivityglobal.tech, 1 excluzive.ml, 1 excursionescaribe.com, 1 exdamo.de, 1 @@ -31781,6 +31500,7 @@ expatfinancial.com.hk, 1 expatfire.com, 1 expatmortgage.uk, 1 expe.voyage, 1 +expectation.management, 1 expeditiegrensland.nl, 0 expeditions.com, 0 experens.com, 1 @@ -31812,7 +31532,6 @@ expiscor.solutions, 1 explicate.org, 1 explodie.org, 1 explodingcamera.com, 1 -exploflex.com.br, 1 exploit-db.com, 1 exploit.cz, 0 exploit.party, 1 @@ -31893,6 +31612,7 @@ exteriorlightingwestlakevillage.com, 1 exteriorroofwindowguttercleaning.com, 1 exteriorservices.io, 1 externer-datenschutzbeauftragter-bochum.de, 1 +extienso.com, 1 extinctionrebellion.de, 1 extintormadrid.com, 1 extirosli.ga, 1 @@ -31949,6 +31669,7 @@ eyep.me, 1 eyes-berg.com, 0 eyesandearsrescue.org, 1 eyescratch.tk, 1 +eyeshield-informatique.tech, 1 eyespecialistsofla.com, 1 eyetooth.ga, 1 eyktasarim.tk, 1 @@ -31998,6 +31719,7 @@ f1classement.com, 0 f1distribution.com, 1 f1fever.co.uk, 1 f1fever.net, 1 +f1iran.com, 1 f1minute.com, 1 f1nal-lap.be, 1 f1simulator.tk, 1 @@ -32100,18 +31822,20 @@ fabbro-roma.org, 1 fabbro.roma.it, 1 fabdiz.com, 1 fabelturen.tk, 1 -faber.org.ru, 1 +faber.org.ru, 0 fabian-fingerle.de, 1 fabian-klose.com, 1 fabian-klose.de, 1 fabian-klose.net, 1 fabian-kluge.de, 1 +fabian-zoske.de, 1 fabian.gq, 1 fabianackle.ch, 1 fabianasantiago.com, 1 fabianbeiner.com, 1 fabianbeiner.de, 0 fabianegli.ch, 1 +fabianfranke.de, 1 fabiankaindl.de, 0 fabiankoeppen.com, 1 fabianni.tk, 1 @@ -32124,6 +31848,7 @@ fabjansisters.eu, 1 fabled.com, 1 fableforge.nl, 1 fableheartmedia.com, 1 +fabricadeobsequiosimpresores.com, 1 fabriceleroux.com, 0 fabriciomoreira.ga, 1 fabrika.com.br, 1 @@ -32141,8 +31866,7 @@ fac.fi, 1 faca.gov, 1 facai666.cc, 1 facai888.cc, 1 -facanabota.com, 1 -facanabota.com.br, 1 +facan-godollo.hu, 1 facarospauls.com, 1 facchinaggio.milano.it, 1 facchinaggio.roma.it, 1 @@ -32182,7 +31906,6 @@ fachversand-hennes.de, 1 facialexercising.com, 1 facialparalysisnetwork.ga, 1 facil.services, 0 -faciledireto.com.br, 1 facilities.fr, 1 facilitiessurvey.org, 1 facilitrak.com, 1 @@ -32195,6 +31918,7 @@ fackovec.cz, 1 fackovec.eu, 1 fackovec.sk, 1 factbytefactbox.com, 1 +factis.com, 1 factor.cc, 0 factoriadifacil.com, 1 factorio.tools, 1 @@ -32274,17 +31998,16 @@ fairyth.tk, 1 faithcentercogop.net, 1 faithfuladvisor.com, 1 faithfulroad.org, 1 -faithgrowth.com, 1 faithindemocracy.eu, 1 faithleaks.org, 1 faithwatch.org, 1 -faixaazul.com, 1 faizan.net, 1 faizan.xyz, 1 faizanullah.com, 1 fajode.net, 1 fake-show.ga, 1 fakeapple.nl, 1 +fakebusters.club, 1 faked.org, 1 fakeemergency.com, 1 fakel.ga, 1 @@ -32375,10 +32098,12 @@ familyrecipe.co.uk, 1 familytreehq.com, 1 familyworld.gr, 1 famion.eu, 0 +fammamtl.com, 1 famosas.cf, 1 famousbirthdays.com, 1 famouscelebsurgery.net, 1 famoushostels.com, 1 +famousit.nl, 1 famouspdf.gq, 1 famvangelder.nl, 1 famvsomeren.nl, 1 @@ -32479,7 +32204,6 @@ fareast.tk, 1 fareinternational.com, 1 faretravel.co.uk, 1 faretrotter.com, 1 -farfallapets.com.br, 1 farfetchos.com, 1 farfor.tk, 1 fargtorget.se, 1 @@ -32514,6 +32238,7 @@ farrel-f.tk, 1 farrelf.blog, 1 farsil.eu, 1 farthing.xyz, 1 +farumbedandbreakfast.dk, 1 farwat.ru, 1 farzli.com, 0 fascat.com, 1 @@ -32536,20 +32261,14 @@ fashionhijabers.com, 1 fashionlistify.tk, 1 fashionsuits.tk, 1 fashiontrendsetter.com, 1 -fashionunited.be, 1 fashionunited.cl, 1 fashionunited.com, 1 fashionunited.com.ar, 1 -fashionunited.de, 1 fashionunited.fi, 1 fashionunited.hk, 1 fashionunited.hu, 1 -fashionunited.ie, 1 fashionunited.lu, 1 -fashionunited.mx, 1 -fashionunited.nl, 1 fashionunited.no, 1 -fashionunited.nz, 1 fashionunited.pl, 1 fashionunited.se, 1 fashionusa.gq, 1 @@ -32578,7 +32297,6 @@ fastbob.tk, 1 fastcash.com.br, 1 fastcast.ga, 1 fastcomcorp.com, 1 -fastcommerce.org, 1 fastconfirm.com, 1 fastconv.com, 1 fastcp.top, 1 @@ -32612,7 +32330,6 @@ fathers4equalrights.org, 1 fatidique.com, 1 fatiguesyndrome.com, 1 fatihingemisi.com, 1 -fatimamoldes.com.br, 1 fatmixx.com, 1 fator25.com.br, 1 fatowltees.com, 1 @@ -32625,6 +32342,7 @@ fau8.ml, 1 faucetbox.com, 0 fauceton.tk, 1 faucetslist.tk, 1 +faulkner2020.com, 1 faultlines.org, 1 faunahotel.cl, 1 fauvettes.be, 1 @@ -32642,6 +32360,7 @@ fayamovies.tk, 1 faydali.org, 1 fayettecountyoh.gov, 1 fayntic.com, 1 +faysalabdi.fi, 1 fazzfinancial.com, 1 fb-feed.net, 1 fb-lab.de, 1 @@ -32686,6 +32405,7 @@ fcic.gov, 1 fcingolstadt.de, 1 fcitasc.com, 1 fcosinus.com, 1 +fcpn.org, 1 fcprovadia.com, 1 fcsic.gov, 1 fdalawboston.com, 1 @@ -32706,7 +32426,6 @@ fdp-brig-glis.ch, 1 fdpbrig.ch, 1 fdremodelingatlanta.com, 1 fdresearch.ca, 1 -fdsl.eu, 1 fdworlds.com, 1 fe-data.nl, 1 feac.us, 1 @@ -32721,7 +32440,6 @@ feat.agency, 1 featherweightlabs.com, 1 featuredmen.com, 1 feb.gov, 1 -febeditora.com.br, 1 fed-shashek.spb.ru, 1 fed51.com, 1 fedbizopps.gov, 1 @@ -32766,6 +32484,7 @@ feelgood-workouts.de, 1 feelgood.com.tw, 1 feelgoodwatches.com, 1 feelingmassage.nl, 0 +feelmingo.com, 1 feelmom.com, 1 feelnet.top, 1 feeltennis.net, 1 @@ -32827,6 +32546,7 @@ felixqu.com, 1 felixsanz.com, 1 felixseele.de, 1 felixsworld.tk, 1 +felixvelarde.com, 1 felsenheimer.tk, 1 felsing.net, 1 feltons.me, 1 @@ -32893,7 +32613,6 @@ ferieservice.dk, 1 feriespotter.dk, 1 ferlc.org, 1 ferm-rotterdam.nl, 1 -fermabel.com.br, 1 fermanacuratampaparts.com, 1 fermanaghomagh.com, 1 fermastore.cf, 1 @@ -32925,6 +32644,7 @@ fespad.org.sv, 1 festaprylar.se, 1 festerculiacan.com, 1 festesuniversitaries.tk, 1 +festicle.com, 1 festival-tipps.com, 1 festival-transform.com, 1 festival-transform.fr, 1 @@ -32935,7 +32655,6 @@ festivaljapon.com, 1 festivalpopayan.tk, 1 festivalsalmondeoro.tk, 1 festivalsrit.tk, 1 -festizen.com, 0 festrentcar.pl, 1 festx.co.za, 1 fetawerelddans.tk, 1 @@ -33088,7 +32807,6 @@ fierykitchen.pl, 1 fiestagenial.com, 1 fietsenbijauke.nl, 1 fietskr.at, 1 -fietsvierdaagsen.nl, 1 fifacup.ga, 1 fifastars.tk, 1 fifautstore.com, 1 @@ -33136,6 +32854,7 @@ filedesc.com, 1 filedoom.ml, 1 filehash.de, 1 filehippo.com, 1 +fileho.st, 1 fileio.io, 1 filejet.io, 1 filek.ga, 1 @@ -33164,6 +32883,7 @@ filipinadating.online, 1 filipinasdailynews.tk, 1 filipinochinese.tk, 1 filippo.io, 1 +filipposalvioni.com, 1 filipsebesta.com, 1 filleritemsindia.com, 1 filli-it.ch, 1 @@ -33230,6 +32950,7 @@ finda.ae, 1 findaffordablehousing.ca, 1 findapinball.com, 1 findautoloan.ml, 1 +findcarspecs.com, 0 finde-kleinanzeigen.de, 1 findelahistoria.com, 1 findheim.at, 1 @@ -33288,7 +33009,6 @@ finlandcook.top, 1 finlito.tk, 1 finmarket.tk, 1 finn-svoboda.cf, 1 -finn-thorben.me, 1 finn.io, 1 finnclass.cz, 1 finneas.net, 1 @@ -33435,6 +33155,7 @@ fishtacos.blog, 1 fishycam.com, 1 fishygames.ml, 1 fishyscans.tk, 1 +fishystuff.cf, 1 fisinfomanagerdr.com, 1 fisiobox.eu, 1 fisioterapista.roma.it, 1 @@ -33478,7 +33199,6 @@ fix-ru.ga, 1 fix-the-timeline.com, 1 fix-the-timeline.org, 1 fix.mk, 1 -fixatom.com, 1 fixdiabetesnaturally.com, 1 fixed.supply, 1 fixed.tech, 1 @@ -33501,11 +33221,9 @@ fizjoterapia.uk, 1 fizyoterapi.name.tr, 1 fizz.buzz, 0 fizzgi.gs, 1 -fj.je, 1 fj.search.yahoo.com, 0 fjchamber.org, 1 fjco.alsace, 1 -fjdekermadec.com, 1 fjharcu.com, 1 fjordboge.dk, 1 fjsb.com, 1 @@ -33523,6 +33241,8 @@ flagburningworld.com, 1 flagfox.net, 1 flaggorvarlden.se, 1 flagi-panstw.pl, 1 +flagipanstw.info.pl, 1 +flagipanstw.pl, 1 flagistrany.ru, 1 flagpedia.asia, 1 flagpedia.net, 1 @@ -33564,7 +33284,6 @@ flashgamedev.tk, 1 flashgot.net, 1 flashtek-uk.com, 1 flass.lu, 1 -flassetlocators.com, 1 flat.io, 1 flatart.pl, 1 flatbellyreview.com, 1 @@ -33614,6 +33333,7 @@ fletcherdigital.com, 1 fletchmusic.tk, 1 fletchto99.com, 1 fletemaritimo.online, 1 +fletesymudanzasbaratas.com, 1 flets-ms.com, 1 fleurenplume.fr, 1 fleurette.me, 1 @@ -33632,10 +33352,10 @@ flexinvesting.fi, 1 flexport.com, 1 flexstart.me, 1 flextribly.xyz, 1 +flexussolucoes.com.br, 1 flexve.com, 1 flfl.de, 1 fliacuello.com.ar, 1 -flibusta.appspot.com, 1 flicerdowneh.cf, 1 flickcritter.com, 1 flickor.tk, 1 @@ -33669,19 +33389,16 @@ flipsidevr.com, 1 fliptable.org, 1 flipweb.tk, 1 flirt-norden.de, 1 -flirtee.net, 1 flirtfaces.de, 1 flirtportalcheck24.de, 1 +flixcheck.de, 1 flixcost.com, 1 flixflex.tk, 1 flixports.com, 1 -flixsave.com, 1 flixstats.com, 1 -flmortgagebank.com, 1 floaternet.com, 1 floatifnghotel.cf, 1 floating-holidays.co.uk, 1 -floating-journey-64892.herokuapp.com, 1 flockbox.club, 1 flocktofedora.org, 1 floersheimer-openair.de, 1 @@ -33770,6 +33487,7 @@ flowreader.com, 1 flowscale.com, 1 flox.io, 1 flra.gov, 1 +flubio.de, 1 flucky.xyz, 1 fluconazole.gq, 1 fluffy.moe, 1 @@ -33779,6 +33497,7 @@ fluglektuere.com, 1 flugplatz-edvc.de, 1 flugrecht.de, 1 flugschule-usa.de, 1 +fluidbb.co.uk, 1 fluidmeterusa.com, 1 fluidpicturesinc.com, 1 fluids.ac.uk, 1 @@ -33798,13 +33517,13 @@ fluxforge.com, 1 fluxi.fi, 1 fluxoid.com, 1 flvyingeagle.ga, 1 -flw365365.com, 1 fly-en-drive.nl, 1 fly.moe, 1 flyadrenaline.com, 1 flyavantar.com, 1 flyawaybirds.ga, 1 flyboyfpv.com, 1 +flycheaps.com, 1 flydrivesicilie.nl, 1 flyer.tools, 1 flygon.pink, 1 @@ -33839,7 +33558,6 @@ fmbilder.se, 1 fmc.gov, 1 fmcs.gov, 1 fmdance.cl, 1 -fmeventcentre.com, 1 fmi.gov, 1 fminsight.net, 1 fmm-creative.com, 1 @@ -33894,7 +33612,6 @@ fol.tf, 1 folar.ga, 1 folclore.tk, 1 folio.no, 1 -foliumbiosciences.com, 1 foliumfinance.com, 1 foljeton.dk, 1 folk.as, 1 @@ -33986,6 +33703,7 @@ forcelinkamerica.com, 1 forcelinkamerica.nl, 1 forcerakodo.hu, 1 forces.army, 1 +forcewaterproofing.com, 1 forcewave.com, 1 ford-mustang.tk, 1 ford-shop.by, 1 @@ -34018,7 +33736,7 @@ forestcermegresik.com, 1 forestraven.net, 1 forever.gq, 1 forevermuslim.in, 1 -forevermuslim.store, 1 +foreverreem.com, 1 foreverssl.com, 1 foreversummertime.com, 1 foreverydream.com, 1 @@ -34069,7 +33787,6 @@ formulastudent.de, 1 fornoreason.net.au, 1 fornwall.net, 1 foro.io, 0 -foroaranda.com, 1 forodeespanol.com, 1 forodieta.com, 0 forojovensanfernando.tk, 1 @@ -34111,7 +33828,7 @@ fortress.sk, 1 fortresslinux.com, 1 fortresslinux.nl, 1 fortresslinux.org, 1 -fortricks.in, 0 +fortricks.in, 1 fortuna-apotheke-lahnstein.de, 1 fortuna-loessnitz.de, 1 fortuna-s.com, 1 @@ -34154,7 +33871,6 @@ foryourhealthybody.com, 1 fos-apps.org, 1 fos-games.org, 1 fosaudit.com, 1 -foscamcanada.com, 1 fosdem.org, 1 foselectro.ru, 1 fosgreece.com, 1 @@ -34178,6 +33894,7 @@ foto-janvanaefst.nl, 1 foto-leistenschneider.de, 1 foto-leitner.com, 1 foto-leitner.de, 1 +foto-mario.de, 1 foto-robitsch.at, 1 foto-roma.ru, 1 foto-znakomstva.ml, 1 @@ -34191,7 +33908,6 @@ fotofaerie.net, 1 fotoflits.net, 1 fotofon.tk, 1 fotografechristha.nl, 1 -fotografiadellalucerossa.com, 1 fotografiamakro.pl, 1 fotografies.tk, 1 fotografija.tk, 1 @@ -34201,9 +33917,11 @@ fotolectura.tk, 1 fotoleitner.com, 1 fotoleitner.de, 1 fotomodel.cf, 1 +fotomodels.tk, 1 fotonjan.com, 1 fotonza.ru, 1 fotopalacedigitalstudio.tk, 1 +fotopianka.pl, 1 fotostravestisbr.com, 1 fotostudio-leitner.com, 1 fotostudio-leitner.de, 1 @@ -34227,6 +33945,7 @@ foundsounds.me, 1 fourashesgolfcentre.co.uk, 1 fourashesgolfcentre.com, 1 fourashesgolfcentre.uk, 1 +fourcornerscb.com, 1 fourdesignstudio.com, 1 fourfourcrew.com, 1 fourmies.fr, 1 @@ -34238,6 +33957,7 @@ fourwaysplumber24-7.co.za, 1 fourxone.com, 1 fousetmoney.tk, 1 fowlsmurf.net, 1 +fox-zulu.de, 1 fox.my, 0 foxbnc.co.uk, 1 foxbnc.uk, 1 @@ -34312,7 +34032,6 @@ franceactivetravel.cf, 1 francepandi.fr, 1 francesca-and-lucas.com, 1 francescopalazzo.com, 1 -francescopandolfibalbi.it, 1 francescoyatesfansite.com, 1 francesfluente.cf, 1 francetraceur.fr, 1 @@ -34321,14 +34040,12 @@ franchini.engineer, 1 franchisehive.com, 1 francinebelanger.network, 1 francis.ph, 1 -franciscoviteripropiedades.com, 1 francisli.net, 0 francisplaza.com, 1 franckgirard.net, 1 francoexpeditionperu.com, 1 francois-occasions.be, 0 francoisbelangerboisclair.com, 1 -francoise-angelini.com, 1 francoise-paviot.com, 1 francoisharvey.ca, 1 francoislepage.com, 0 @@ -34374,7 +34091,7 @@ frappant.cc, 1 frappant.net, 1 frasch-umzuege.de, 1 fraselab.ru, 1 -fraserengineco.com, 1 +frasermurray.scot, 1 frasesconemocion.com, 1 frasesdodia.com, 1 frasesdodia.net, 1 @@ -34403,8 +34120,8 @@ frbracch.it, 1 frc.gov, 1 frccsgo.tk, 1 frdl.ch, 0 +freak-show.tk, 1 freaksites.dk, 1 -freaksports.com.au, 0 freakyawesome.agency, 1 freakyawesome.art, 1 freakyawesome.band, 1 @@ -34441,6 +34158,7 @@ frederikugarte.tk, 1 frederikvig.com, 1 fredhook.tk, 1 fredloya.com, 1 +frednet.tk, 1 fredriksslaktforskning.se, 1 fredriksslekt.se, 1 freds4buildings.com, 1 @@ -34480,6 +34198,7 @@ freebsdbrasil.com.br, 1 freebus.org, 1 freecam2cam.site, 1 freecloud.at, 1 +freecn.xyz, 1 freecodezilla.com, 1 freecookies.nl, 1 freecrypt.ga, 1 @@ -34510,6 +34229,7 @@ freefilesync.org, 1 freefinancialhelp.net, 1 freeform4u.de, 1 freegame-mugen.jp, 1 +freegamesmac.com, 1 freegovernmentcellphoneguide.com, 1 freegutters.com, 1 freeiconspng.com, 1 @@ -34535,7 +34255,6 @@ freelauri.com, 1 freelifer.jp, 1 freemagi.ga, 1 freeman-online.tk, 1 -freemania.eu, 1 freemania.nl, 1 freemanlogistics.com, 1 freemans.com, 1 @@ -34658,6 +34377,7 @@ freundinnen-ausflug.de, 1 freundinnen-kurzurlaub.de, 1 freundinnen-urlaub.de, 1 freundinnenausflug.de, 1 +frfiber.com, 1 frforms.com, 1 friarsonbase.com, 1 fribourgviking.net, 1 @@ -34703,6 +34423,7 @@ friezy.ru, 1 frigi.ch, 0 frign.de, 1 frigolit.net, 1 +friherrsindemarit.fi, 1 frikipedia.tk, 1 friller.com.au, 1 frillip.com, 1 @@ -34771,7 +34492,6 @@ frozencuisine.ga, 1 frozendurian.club, 1 frozenfutures.com, 1 frozenjam.com, 1 -frozensector.com, 1 frp-roleplay.de, 1 frpg.gov, 1 frprn.com, 1 @@ -34796,7 +34516,6 @@ fruition.co.jp, 1 fruitscale.com, 1 fruityten.co.uk, 1 frusky.de, 1 -frusky.net, 1 frutasyvejetales.com, 1 fruxnux.net, 1 fruxprivatebank.net, 1 @@ -34895,7 +34614,6 @@ fuentesdeleon.tk, 1 fuer-gerechte-steuern.at, 1 fuerstenfelder-immobilien.de, 1 fuerzaazul.tk, 1 -fugioninc.com, 1 fugle.de, 1 fuglede.dk, 1 fuite.ch, 0 @@ -34917,15 +34635,16 @@ fukushima-fun.com, 1 fukushimacoffee.com, 1 fulfilmentcrowd.com, 1 fulgenzis.com, 1 +fulijiejie.com, 1 fuliwang.info, 1 fuliwang.us, 1 full-race.com, 1 full-stack.ninja, 1 -fullautomotivo.com.br, 1 fullbajamode.com, 1 fullbundle.com, 1 fullcirclestudio.nl, 1 fullerlife.org.uk, 1 +fullfilez.com, 1 fullhost.com, 1 fullhub.ru, 1 fullmatch.net, 1 @@ -34933,6 +34652,7 @@ fullmetalconsulting.tk, 1 fullmoondesignhouse.tk, 1 fullsize.ml, 1 fullstacknotes.com, 0 +fulltextarchive.com, 1 fulltxt.ml, 1 fully-hair.tk, 1 fumblers.ca, 1 @@ -35032,7 +34752,6 @@ funidelia.se, 1 funidelia.sg, 1 funidelia.si, 1 funidelia.sk, 1 -funinbeds.org.uk, 1 funinfo.tk, 1 funkazoid-radio.com, 1 funken-networks.de, 1 @@ -35121,6 +34840,7 @@ fuseyahoken.com, 1 fushee.com, 1 fusionapps.com, 1 fusionapps.net, 1 +fusionauth.io, 1 fusionetics.plus, 1 fusiongaming.de, 1 fussball-xxl.de, 1 @@ -35172,7 +34892,6 @@ fwest.ovh, 1 fwest98.nl, 1 fwest98.ovh, 1 fws.gov, 1 -fwz.me, 1 fx-rating.com, 1 fx-rk.com, 1 fx110.com, 1 @@ -35299,7 +35018,7 @@ gabriele-kluge.de, 1 gabriele.tips, 1 gabrielemarino.tk, 1 gabrielgn.com.br, 1 -gabrielkoo.com, 1 +gabrielkoo.com, 0 gabriella.cf, 1 gabrielsimonet.ch, 1 gabrielsteens.nl, 1 @@ -35317,6 +35036,7 @@ gadanie.cf, 1 gadatel.ml, 1 gaddini.it, 1 gadget-freak.cf, 1 +gadget-tips.com, 0 gadgetadvisor.com, 1 gadgetanda.com, 1 gadgetflip.com, 1 @@ -35348,7 +35068,7 @@ gagne.tk, 1 gagnerenfant.tk, 1 gagnerplusdargent.info, 1 gagniard.org, 1 -gagor.pl, 0 +gagor.pl, 1 gagramore.cf, 1 gagygnole.ch, 0 gaiafood.co, 1 @@ -35392,7 +35112,6 @@ galaxymedia.tk, 1 galaxymimi.com, 1 galaxymusicpromo.com, 1 galaxyplex.tk, 1 -galaxyscientific.com, 1 galenreasoner.com, 1 galeria42.com, 1 galeriabunkers.tk, 1 @@ -35433,8 +35152,6 @@ gallifreypermaculture.com.au, 1 gallmeyer-consulting.com, 1 gallun-shop.com, 1 galoserver.org, 1 -galpaoap.com.br, 1 -galvincdn.com, 1 galvingao.com, 1 gamagam.gq, 1 gamanlu.com, 1 @@ -35647,7 +35364,6 @@ gardenstate.tech, 1 gardikagigih.com, 1 gardis.ua, 1 garduri-electrice-animale.ro, 1 -garedtech.com, 0 garethbowker.com, 1 garethkirk.com, 1 garethrhugh.es, 1 @@ -35674,6 +35390,7 @@ garycarmell.com, 1 garyjones.co.uk, 1 garyrh.com, 1 garystallman.com, 1 +garyswine.com, 1 garywhittington.com, 1 gasbarkenora.com, 1 gashalot.com, 1 @@ -35682,6 +35399,7 @@ gasnews.net, 1 gaspapp.com, 1 gaspard-ulliel.tk, 1 gasscc.id, 1 +gassero.com, 1 gassouthkenticoqa.azurewebsites.net, 1 gassyukumenkyoguide.com, 1 gastauftritt.net, 1 @@ -35694,6 +35412,7 @@ gastrotiger.de, 1 gatapro.net, 0 gate2home.com, 1 gateaucreation.fr, 1 +gatekala.ir, 1 gatekiller.co.uk, 1 gatemaster.ga, 1 gatemoves.com, 1 @@ -35755,6 +35474,7 @@ gbit.xyz, 1 gbl.selfip.net, 1 gboys.net, 0 gbs-uk.com, 1 +gbsapri.it, 1 gbthatcher.com, 1 gc-mc.de, 1 gc.de, 1 @@ -35836,6 +35556,7 @@ geekdama.com.br, 1 geekedin.ga, 1 geekeries.org, 0 geekerstech.com, 1 +geekgirltech.com, 1 geeklair.net, 1 geeklan.co.uk, 1 geekles.net, 1 @@ -35908,6 +35629,9 @@ geluk.io, 1 gelukkigehonden.nl, 1 geluleminceur.fr, 1 gelvetika.cf, 1 +gem-forex.net, 1 +gem-forex.org, 1 +gem-forex.pro, 1 gem-info.fr, 1 gem.forex, 1 gemax-online.de, 1 @@ -35915,6 +35639,8 @@ gemeentestein.nl, 1 gemeinderatswahl2020.de, 1 gemeinsam-ideen-verwirklichen.de, 1 gemelen.net, 1 +gemforex.pro, 1 +gemforex.top, 1 gemgroups.in, 1 gemonite.com, 1 gemquery.com, 1 @@ -35980,7 +35706,6 @@ genericlexaprocost.tk, 1 genericrhinocort.ga, 1 genericvytorin.ml, 1 generujdata.cz, 1 -genesiselectronica.com, 1 genesiseureka.com, 1 genesismachina.ca, 1 genesisplay.tk, 1 @@ -35988,13 +35713,13 @@ genesistrading.com, 1 genesysmi.com, 1 genetargetsolutions.com.au, 1 genetidyne.com, 1 +genevachauffeur.com, 1 genevacountyal.gov, 1 geneve-naturisme.ch, 0 geneve.guide, 1 genevoise-entretien.ch, 1 genfaerd.dk, 1 genia-life.de, 1 -geniedesjouets.fr, 1 geniofinanciero.org, 1 genioideal.com, 1 genioyfigura.tk, 1 @@ -36123,7 +35848,6 @@ geraintwhite.co.uk, 1 gerald-zojer.com, 1 geraldoazevedo.com.br, 1 geraldsonrealty.com, 1 -gerandroid.com, 1 gerardinden.nl, 1 gerardozamudio.mx, 1 gerbang-singkolo.ga, 1 @@ -36160,7 +35884,7 @@ geschenkly.de, 0 geschichtscheck.de, 1 geschmacksache.online, 1 geschwinder.net, 1 -gesditel.es, 0 +gesditel.es, 1 geseduc.cl, 1 gesevi.com, 1 gesica.cloud, 1 @@ -36208,7 +35932,6 @@ getcolq.com, 1 getcookie.ml, 1 getcreditscore.com.au, 1 getdash.io, 1 -getdeveloper.de, 1 getdoges.tk, 1 getdownon.it, 1 geteduroam.no, 1 @@ -36231,6 +35954,7 @@ getgeek.pl, 1 getgeek.se, 1 gethome.ru, 1 gethttpsforfree.com, 1 +gethyas.com, 1 geti2p.com, 1 getidmcc.com, 1 getimgs.com, 1 @@ -36267,6 +35991,7 @@ getresilience.org, 1 getsecure.nl, 1 getserum.xyz, 1 getsetbounce.co.uk, 1 +getshifter.io, 0 getsilknow.com, 1 getsmartaboutdrugs.gov, 0 getsport.mobi, 1 @@ -36318,9 +36043,13 @@ gfelite.de, 1 gfestival.fo, 1 gfk-kunststoff-luebben.de, 1 gflame.de, 1 +gfmp.com.pl, 1 gfms.ru, 1 gfnetfun.cf, 1 gforce.ninja, 1 +gforex.biz, 1 +gforex.pro, 1 +gforex.top, 1 gfoss.eu, 1 gfoss.gr, 1 gfourmis.co, 1 @@ -36428,7 +36157,6 @@ giemall.com, 1 gierds.de, 1 gieschke.de, 1 giethoorn.com, 1 -gietvloer-wand.nl, 1 gietvloergarant.nl, 0 giftcard.net, 1 giftcardgranny.com, 1 @@ -36471,7 +36199,6 @@ gigsoupmusic.com, 1 gigtroll.eu, 1 gijsbertus.com, 1 gijswesterman.nl, 1 -gikovatelojavirtual.com.br, 1 gilbertosimoni.tk, 1 gileadpac.com, 1 gilescountytn.gov, 1 @@ -36480,6 +36207,7 @@ gilium.com, 1 gillesmorelle.com, 0 gillfamily.de, 1 gillmanandsoame.co.uk, 1 +gilloteaux.be, 1 gillyscastles.co.uk, 1 gilme.net, 1 gilmourluna.com, 1 @@ -36533,7 +36261,6 @@ girlsgenerationgoods.com, 1 girlsnet.work, 1 girlz.jp, 1 giroskuter.ga, 1 -girsa.org, 1 girvas.ru, 1 gisac.org, 1 gisauto.ru, 1 @@ -36555,6 +36282,7 @@ gite-ambleteuse.tk, 1 gitecolombedesbois.com, 1 gitep.org.uk, 1 gitesdeshautescourennes.com, 1 +gitgud.eu.org, 1 github.com, 1 githubapp.com, 1 githubber.com, 1 @@ -36585,11 +36313,16 @@ giveasquare.org, 1 giveattheoffice.org, 0 giveaways.ph, 1 giveme.online, 1 +givemeaverse.com, 1 givemylife.cf, 1 givemylife.ga, 1 givemylife.gq, 1 givemylife.ml, 1 +given2.blog, 1 given2.com, 1 +given2.me, 1 +given2.us, 1 +given4.it, 1 giveoneup.org, 1 givepenny.com, 1 givesunlight.com, 1 @@ -36603,6 +36336,7 @@ gixtools.net, 1 gixtools.uk, 1 gizmo.ovh, 1 gj-bochum.de, 1 +gjan.info, 1 gjcampbell.co.uk, 1 gjengset.com, 1 gjspunk.de, 0 @@ -36621,7 +36355,6 @@ gl.search.yahoo.com, 0 glabiatoren-kst.de, 1 glaciernursery.com, 1 gladdy.co.uk, 1 -gladdy.uk, 1 gladdymedia.co.uk, 1 gladdymedia.com, 1 gladdymedia.uk, 1 @@ -36638,7 +36371,6 @@ glamira.de, 1 glammybabes.com, 1 glamour4you.de, 1 glamourdaze.com, 1 -glamouria.com.br, 1 glamur-video.com, 1 glasdon.com, 1 glasen-hardt.de, 1 @@ -36685,6 +36417,7 @@ gliihc.net, 1 glimhome.com, 1 glit.sh, 1 glitchcomic.tk, 1 +glitter-graphics.com, 1 glitzerstuecke.de, 1 glixee.com, 1 glloq.org, 0 @@ -36738,7 +36471,6 @@ globalonetechnology.com, 1 globalperspectivescanada.com, 1 globalpolarbear.com, 1 globalpro.info, 1 -globalprojetores.com.br, 1 globalresearchcouncil.org, 1 globalresistancecorporation.com, 1 globalrussia.tk, 1 @@ -36797,11 +36529,11 @@ glueckskindter.de, 1 gluedtomusic.com, 1 gluhov-ss.ru, 1 gluit.de, 1 -glutenfreeandtasty.com, 1 glutenfreehomemaker.com, 1 glutenfreelife.co.nz, 1 glutenfreeonashoestring.com, 1 glutenfreevr.com, 1 +glxnet.com, 1 glyburidemetformin.tk, 1 glyfadacoaststudio.gr, 1 glykofridis.nl, 1 @@ -36866,7 +36598,6 @@ gnulinux.gq, 1 gnulinuxforum.tk, 1 gnuplus.me, 1 gnuworldorder.ml, 1 -gnwp.eu, 1 gnylf.com, 1 go-away.xyz, 1 go-datasecurity.de, 1 @@ -36892,7 +36623,6 @@ goa8.com, 1 goa8.xyz, 1 goalbookapp.com, 1 goalie1998.duckdns.org, 1 -goalongtravels.com, 1 goanalyse.co.uk, 1 goand.run, 1 goarmy.eu, 1 @@ -36902,7 +36632,6 @@ goaudits.com, 1 gobarrelroll.com, 1 gobiernousa.gov, 1 gobiz.com.my, 1 -goblackcat.com, 0 goblinsatwork.com, 1 goblintears.com, 1 gobouncy.co.uk, 1 @@ -36931,6 +36660,7 @@ goddg.com, 1 godesb.com, 1 godesigner.ru, 1 godfilm.tk, 1 +godles.pl, 1 godmusicapp.com, 1 godofredo.ninja, 1 godrealms.com, 1 @@ -36960,6 +36690,7 @@ goetzinger-web.de, 1 goffrie.com, 1 gofigure.fr, 0 goflo.net, 1 +gofobo.com, 1 gofoiayourself.org, 1 gofriends.cf, 1 gogetssl.com, 0 @@ -37037,7 +36768,6 @@ goldwaterscholarship.gov, 1 goldytechspecialists.com, 1 goldzilla.eu, 1 golearn.gov, 1 -golf18network.com, 1 golf18staging.com, 1 golfburn.com, 1 golfhausmallorca.com, 1 @@ -37046,12 +36776,13 @@ golighthouse.com, 1 golik.net.pl, 0 golnet.hu, 1 goloaninsurance.tk, 1 +golosinascbd.com, 1 golosok.ml, 1 golosovanye4you.tk, 1 golser-schuh.at, 1 golser.info, 1 golsportsoccer.com, 1 -goluggo.com, 1 +golternet.com, 1 golvlyftarna.se, 1 gomasa.net, 1 gomasy.jp, 1 @@ -37084,7 +36815,6 @@ goo.gl, 1 gooch.io, 1 good-cd.ml, 1 good-know.gq, 1 -good-tips.pro, 1 gooday.life, 1 gooddomainna.me, 1 goodenglish.ga, 1 @@ -37112,6 +36842,7 @@ goodth.ink, 1 goodtrip.kr, 1 goodvibesblog.com, 1 goodyearsotn.co.uk, 1 +goofy.gr, 1 google, 1 google-analytics.com, 1 google.ax, 1 @@ -37287,6 +37018,7 @@ govloans.gov, 1 govno-site.tk, 1 govnohosting.cf, 1 govotecolorado.gov, 1 +govsales.gov, 1 govtjobs.blog, 1 govtrack.us, 1 govype.com, 1 @@ -37299,7 +37031,6 @@ gowildrodeo.co.uk, 1 gowin9.com, 1 gowin9.net, 1 gowithflo.de, 1 -gozadera.es, 1 gpalabs.com, 1 gpccp.cc, 1 gpcp.org, 1 @@ -37311,7 +37042,6 @@ gpfitness.com.br, 1 gpga.cf, 1 gpgscoins.com, 1 gpio.gq, 1 -gpl-elite.store, 1 gpl25.ml, 1 gplans.us, 1 gplintegratedit.com, 1 @@ -37319,6 +37049,7 @@ gplvilla.com, 1 gpm.ltd, 1 gpna.org, 1 gpolanco.com, 1 +gpony.fr, 1 gppro.com, 1 gprs.uk.com, 1 gps-fleettracking.ga, 1 @@ -37333,7 +37064,6 @@ gpswebsoft.ml, 1 gpu.nu, 0 gpz500s.tk, 1 gqjx.fun, 1 -gqmstore.com.br, 1 gqyyy.cc, 1 gr.search.yahoo.com, 0 gr8engineer2b.com, 1 @@ -37345,6 +37075,7 @@ grabadolasermonterrey.com, 1 grabatt.de, 1 graberbooks.gq, 1 grabi.ga, 1 +grabtech.vn, 1 grace-wan.com, 1 gracebaking.com, 0 gracedays.org, 1 @@ -37394,7 +37125,6 @@ graingert.co.uk, 1 graliv.net, 0 grallersdegegants.tk, 1 gramati.com.br, 1 -grammofono.gr, 1 grammysgrid.com, 1 grancellconsulting.com, 1 grand-books.cf, 1 @@ -37436,7 +37166,6 @@ grantpark.org, 1 grantplatform.com, 1 grantsmasters.com, 1 grantsplatform.com, 1 -graonatural.com.br, 1 grapee.jp, 1 grapeintentions.com, 1 grapevine.is, 1 @@ -37470,6 +37199,7 @@ grassenberg.de, 1 grasshoppervape.com, 1 grasso.io, 1 grassreinforcement.com.au, 1 +grast.jp, 1 gratis-hosting.cf, 1 gratis.market, 1 gratisgamecards.nl, 1 @@ -37517,6 +37247,7 @@ greathairtransplants.com, 1 greatislandarts.ca, 1 greatlakeside.de, 1 greatlifeinsurancegroup.com, 1 +greatlms.com, 1 greatnetsolutions.com, 1 greatrenumbering.tk, 1 greatscholars.tk, 1 @@ -37530,6 +37261,7 @@ greek.dating, 1 greeklish.gr, 1 greekmusic.academy, 1 greeknewspapers.tk, 1 +greekpistols.com, 1 greeks.tk, 1 greekweb.tk, 1 green-adn.com, 1 @@ -37596,6 +37328,7 @@ greenteamtwente.nl, 1 greenway-moving.com, 1 greenwaylog.net, 1 greenwithdecor.com, 1 +greenytimes.com, 1 greer.ru, 1 greg.red, 1 gregbrimble.com, 1 @@ -37634,7 +37367,7 @@ grengine.ch, 1 grenlandkiropraktor.no, 1 grepmaste.rs, 0 grepular.com, 1 -gresak.io, 0 +gresak.io, 1 gresik.info, 1 gresik.org, 1 gressnet.id, 1 @@ -37691,6 +37424,7 @@ grinday.tk, 1 grindgore.tk, 1 grinnellplanes.com, 1 grinnellplans.com, 1 +gripcoat.jp, 1 gripencrossfit.gq, 1 gripnijmegen.rip, 1 grippe-impftermin.de, 0 @@ -37757,7 +37491,6 @@ groupeatrium.net, 1 groupem6.fr, 1 groupescr.fr, 1 groupghistelinck-cars.be, 0 -grouphomes.com.au, 0 groupme.com, 1 groupramirez.com, 1 groups.google.com, 1 @@ -37771,7 +37504,6 @@ growingallthings.co.uk, 1 growinghumankindness.com, 1 growingmetrics.com, 1 growingsmiles.co.uk, 1 -growit.events, 1 growme.gq, 1 growth-rocket.com, 1 growthseedconsulting.com, 1 @@ -37781,6 +37513,8 @@ grozter.se, 1 grrmmll.com, 1 grsecurity.net, 1 grsknow.com, 1 +gruasiturra.cl, 1 +gruasllanos.cl, 1 gruebebraeu.ch, 1 gruelang.org, 1 gruenderlehrstuhl.de, 1 @@ -37880,6 +37614,7 @@ guanyembadalona.org, 1 guanyu.ml, 1 guanzhong.ca, 1 guardedbox.com, 1 +guardedbox.es, 1 guardian-codex.tk, 1 guardian360.nl, 1 guardianportal.us, 1 @@ -37930,6 +37665,7 @@ guiaextra.com, 1 guiascliente.com, 1 guiasescapate.tk, 1 guiaswow.com, 1 +guiaturisticanuevayork.com, 1 guid2steamid.com, 1 guid2steamid.pw, 1 guide-peche-cantal.com, 0 @@ -37948,6 +37684,7 @@ guidesorbetiere.com, 1 guidethailande.tk, 1 guidetoiceland.is, 0 guidopedia.ga, 1 +guilde-dissection.com, 1 guildgearscore.cf, 0 guildofmusicsupervisors.co.uk, 1 guillaume-briand.fr, 1 @@ -37987,7 +37724,6 @@ gundemguncel.tk, 1 gunerds.com.br, 1 gunhunter.com, 1 gunlukburc.net, 1 -gunnarhafdal.com, 1 gunshyassassin.com, 0 gunstatus.net, 1 gununsesi.info, 1 @@ -37998,7 +37734,6 @@ gunworld.com.au, 1 gunz.net, 1 guochang.fun, 1 guochang.xyz, 1 -guodong.net, 1 guogetv.com, 1 guohuageng.com, 1 guoke.com, 1 @@ -38026,6 +37761,7 @@ gusmiller.org, 1 gustaff.de, 1 gustarfsberg.tk, 1 gustavo-lima.ml, 1 +gustavovelasco.ml, 1 gustavscelmins.tk, 1 gustiaux.com, 0 gustom.io, 0 @@ -38096,6 +37832,7 @@ gxmyqy.net, 1 gxpconsultora.com, 1 gyas.nl, 1 gybol.com, 1 +gyengus.hu, 1 gymagine.ch, 1 gymbase.ml, 1 gymbunny.de, 1 @@ -38182,7 +37919,6 @@ haaldesignpro.com, 1 haancommunity.cf, 1 haarigerrattenarsch.com, 1 haarlemsesaxofoonschool.nl, 1 -haarstudiok99.nl, 1 haasonline.tk, 1 haavard.me, 1 haazen.xyz, 1 @@ -38192,6 +37928,7 @@ habarovsk.ml, 1 habbig.cc, 1 habbixed.tk, 1 habbplay.fr, 1 +habbstars.org, 1 habeo.si, 1 haberer.me, 1 habernet.tk, 1 @@ -38200,6 +37937,7 @@ habesha.bet, 1 habitable.ga, 1 habitat-domotique.fr, 1 habitatetbatiment.fr, 1 +hablemosclaro.blog, 1 hablemosdenutricion.com, 1 habr.com, 1 habr.ee, 1 @@ -38214,6 +37952,8 @@ hacettepeteknokent.com.tr, 1 hachimijiogan.info, 1 hachre.de, 0 hack.club, 1 +hack.fi, 1 +hackade.org, 1 hackademix.net, 1 hackadena.com, 1 hackanders.com, 1 @@ -38313,9 +38053,9 @@ hagsted.dk, 1 hagueaustralia.com.au, 1 haha-raku.com, 1 haha.nl, 1 -hahay.es, 1 haibara.top, 1 haiboxu.com, 1 +haigekassa.ee, 1 hailstorm.nl, 1 haim.bio, 1 haimablog.ooo, 1 @@ -38366,6 +38106,7 @@ hakkariradyo.tk, 1 hakkasan.com, 1 hakkasannightclub.com, 1 haklappar.nu, 1 +hakon.lol, 1 hakugin.me, 1 hal-9th.space, 1 halacs.hu, 1 @@ -38385,7 +38126,6 @@ halihali.cc, 1 halihali.me, 1 halilweb.tk, 1 halilyagcioglu.tk, 1 -halitopuroprodutos.com.br, 1 halkidikitransfers.eu, 1 halkirkbouncycastles.co.uk, 1 halkyon.net, 1 @@ -38416,6 +38156,7 @@ halovanic.org, 1 haltegame.com, 1 halyul.com, 1 hamacho-kyudo.com, 1 +hamada-syoji.co.jp, 1 hamali.bg, 1 hamamatsu-kotsu.co.jp, 1 hamarimarriage.tk, 1 @@ -38448,6 +38189,7 @@ hanakaraku.com, 1 hanakaru.tk, 1 hanami-web.tokyo.jp, 1 hanazono.tokyo, 1 +hanbin.me, 0 hanbing.it, 1 hancockcountyohioelections.gov, 1 hancocklawfl.com, 1 @@ -38495,6 +38237,7 @@ hannah.link, 1 hannahi.com, 1 hannasecret.de, 1 hannde.com, 1 +hannehovi.fi, 1 hannes.paris, 1 hannit.de, 1 hannoluteijn.nl, 1 @@ -38525,7 +38268,6 @@ hansvaneijsden.nl, 1 hantse.com, 1 hanu.la, 1 hanxv.pw, 1 -hanyibo.com, 1 hanying6.com, 1 hanys.xyz, 1 hanzcollection.online, 1 @@ -38534,7 +38276,6 @@ hao-zhang.com, 1 hao8.ag, 1 haocq3.com, 1 haogoodair.ca, 1 -haorenka.org, 1 haozhang.org, 1 haozhexie.com, 1 haozhuanfa.com, 1 @@ -38556,6 +38297,7 @@ happyagain.de, 1 happyagain.se, 1 happyandrelaxeddogs.com, 1 happyandrelaxeddogs.eu, 1 +happybaby-ec.com, 1 happybeerdaytome.com, 1 happybirthdaywisher.com, 1 happybounce.co.uk, 1 @@ -38587,6 +38329,7 @@ happyteamlabs.com, 1 happytiger.eu, 1 happyukgo.com, 1 happyweekend.ga, 1 +happywheels1.online, 1 hapronailz.tk, 1 hapsana.nl, 1 hapsfordmill.co.uk, 1 @@ -38623,6 +38366,7 @@ hardrain980.com, 1 hardrock.tk, 1 hardtfrieden.de, 1 hardtime.ru, 1 +hardware.info.pl, 1 hardwareforum.ga, 1 hardwarelog.in, 1 hardwarelogin.com, 1 @@ -38656,7 +38400,6 @@ haroldsharpe.com, 1 harp.gov, 1 harpersvilleal.gov, 1 harpoo.jp, 0 -harptechnologies.com, 1 harray.tk, 1 harrcostl.com, 1 harriedrecords.tk, 1 @@ -38698,7 +38441,6 @@ harveysautoservice.net, 1 harvilldesigns.com, 1 has-no-email-set.de, 0 has.report, 1 -has.software, 1 has.work, 1 hasabig.wang, 1 hasalittle.wang, 1 @@ -38728,6 +38470,7 @@ hashtagpatriot.com, 1 hashtagswimwear.com, 1 hashworks.net, 1 hashxp.org, 1 +hasilkeluaransgp.com, 1 hasilocke.de, 1 haskett.ca, 1 haskovec.com, 1 @@ -38741,10 +38484,8 @@ hastyllc.com, 1 hatachan.site, 1 hataonline.tk, 1 hatarisecurity.co.ke, 1 -hatcher.cloud, 1 hate.ga, 1 hatethe.uk, 1 -hatpakha.com, 1 hatsuharu.tk, 1 hatter.ink, 1 hatul.info, 1 @@ -38867,7 +38608,6 @@ hd-outillage.com, 1 hd2132.com, 1 hd5132.com, 1 hd5197.com, 0 -hd5454.com, 1 hd6132.com, 1 hd6729.com, 1 hd6957.com, 1 @@ -38887,6 +38627,7 @@ hdkandsons.com, 1 hdlooks.tk, 1 hdm.io, 1 hdmobilpornolar.com, 1 +hdmovies.blog, 1 hdnastudio.com, 1 hdpornose.com, 1 hdrezka2018.tk, 1 @@ -38954,6 +38695,7 @@ healthybeterlife.click, 1 healthyfitfood.com, 1 healthylifeelite.com, 1 healthymen.ml, 1 +healthynutritionguide.info, 1 healthypeople.gov, 1 healthyspirituality.org, 1 healthystyle.tk, 1 @@ -38979,7 +38721,6 @@ heartmdinstitute.com, 1 heartsintrueharmony.com, 1 heartsucker.com, 0 hearttruth.gov, 1 -heartview.com.br, 1 heartwoodart.com, 1 hearty.blog, 1 hearty.edu.pl, 1 @@ -39042,6 +38783,7 @@ hedweb.com, 1 hedweb.net, 1 hedweb.org, 1 hedys.de, 1 +heeftmijnwebsitehttpsnodig.nl, 1 heeler.blue, 1 heeler.red, 1 heello.es, 1 @@ -39056,7 +38798,6 @@ hegen.sk, 0 hegenshop.de, 1 heh.ee, 1 heha.co, 0 -hehaohan.com, 1 hehome.xyz, 1 heiaheia.com, 1 heid.ws, 1 @@ -39074,6 +38815,7 @@ heijmans.pm, 1 heijmans.xyz, 1 heikegastmann.com, 1 heikki-mikkola.tk, 1 +heikkileivonen.fi, 1 heikohessenkemper.de, 1 heikorichter.name, 1 heiland.io, 1 @@ -39094,9 +38836,7 @@ heiraten-venedig.de, 1 heisenberg.co, 1 heissluft-fritteuse.com, 1 heist-clan.tk, 1 -heistheguy.com, 1 heitepriem.info, 1 -heitland-it.de, 1 heiwa-valve.co.jp, 0 hejsupport.se, 1 heka.ai, 1 @@ -39118,6 +38858,8 @@ helenelefauconnier.com, 1 helenkellersimulator.org, 1 helensmithpr.co.uk, 1 helenssjoholm.cf, 1 +heleus.it, 1 +heleus.photo, 1 helfordriversc.co.uk, 1 helga-fest.tk, 1 helgaschultz.de, 1 @@ -39156,7 +38898,6 @@ hellomouse.cf, 1 hellomouse.net, 1 hellomouse.tk, 1 hellomyword.tk, 1 -helloneu.com, 1 hellonews.cf, 1 hellorussia.ga, 1 hellosalmon.com, 1 @@ -39181,7 +38922,6 @@ helpkoil.com, 1 helpmij.cf, 1 helppc.com.ua, 1 helpscoutdocs.com, 1 -helpstarloja.com.br, 1 helptasker.com, 1 helptasker.net, 1 helptasker.ru, 1 @@ -39273,6 +39013,7 @@ herberichfamily.com, 1 herbers.tk, 1 herbert.io, 1 herbertjanvandinther.nl, 1 +herbhuang.com, 1 herbolarigranvida.com, 1 herbsupplements.co.uk, 1 herbweb.net, 1 @@ -39306,6 +39047,8 @@ hermes.cat, 1 herminghaus24.de, 1 hermitant.fr, 1 hermiu.com, 1 +hermiyanto.com, 1 +herndl.org, 1 herni-kupony.cz, 1 hernn.com, 1 herocentral.de, 1 @@ -39325,6 +39068,7 @@ herranzramia.com, 0 herrderzeit.de, 1 herrenmuehle-wein.de, 1 herrfirm.com, 1 +herringadvancemachine.com, 1 herringboneeats.com, 1 herringsresidence.be, 1 herrkaschke.com, 1 @@ -39337,6 +39081,7 @@ hersmartchoice.com, 1 hertsbouncycastles.com, 1 hertz.bj, 1 herumixer.ga, 1 +herychreality.cz, 1 herz-und-gemuet.de, 1 herzbotschaft.de, 1 herzfuersoziales.at, 1 @@ -39345,6 +39090,7 @@ herzogglass.com, 1 herzwacht.de, 1 hes.com.cy, 1 hesaplama.net, 1 +hesbenergie.be, 1 hessen-liebe.de, 1 hessenheim.tk, 1 hesslag.com, 1 @@ -39435,12 +39181,12 @@ hgpowerglue.nl, 1 hguandl.com, 1 hgvnet.de, 1 hgw168.com, 1 +hgyo.me, 1 hgyoseo.com, 1 hh-medic.com, 1 hh-wolke.dedyn.io, 1 hh5197.co, 1 hh6729.co, 1 -hh6729.com, 1 hh6957.co, 1 hh9297.co, 1 hh9728.co, 1 @@ -39458,6 +39204,7 @@ hi.team, 1 hialatv.com, 1 hibanaworld.com, 1 hibari.moe, 1 +hibrid-turf.com, 1 hiccupsandjuice.co.uk, 1 hickorywinecellar.com, 1 hicl.org, 1 @@ -39483,8 +39230,6 @@ hideallip.com, 1 hidedd.com, 1 hideouswebsite.com, 1 hidglobal.com, 1 -hidroshop.com.br, 1 -hidroshoping.com.br, 1 hieisuki.ga, 1 hielscher.com, 1 hien.cf, 1 @@ -39492,7 +39237,6 @@ hierer.com, 1 hieu.com.au, 1 hif88.com, 1 hifala.de, 1 -hifdhblog.dk, 1 hiffo.de, 1 hifly.com.tw, 1 hifumi.us, 1 @@ -39519,10 +39263,10 @@ highlegshop.com, 1 highlevelwoodlands.com, 1 highlnk.com, 1 highnation.ml, 1 +highqappliance.com, 1 highriskpay.com, 1 highspeed-arnsberg.de, 1 highspeedinternet.my, 1 -highstreethomes.com.au, 1 hightechbasementsystems.com, 1 hightechgadgets.net, 1 hightechone.cf, 1 @@ -39678,7 +39422,6 @@ hitleap.com, 1 hitmanstat.us, 1 hitmyheart.tk, 1 hitn.at, 1 -hitocom.net.br, 1 hitokoto-mania.com, 1 hitokoto.cn, 1 hitomecha.com, 1 @@ -39709,14 +39452,14 @@ hj-mosaiques.be, 1 hj.rs, 1 hj111777.com, 0 hj2375.com, 0 -hj2565.com, 0 +hj2565.com, 1 hj3586.com, 0 hj3639.com, 0 hj5386.com, 0 hj555.cc, 1 hj556.cc, 1 hj6298.com, 0 -hj6585.com, 0 +hj6585.com, 1 hj6929.com, 0 hj9379.com, 1 hj99111.com, 1 @@ -39792,6 +39535,7 @@ hm1ch.ovh, 1 hm773.net, 1 hm773.org, 1 hmcdj.cn, 1 +hmeonot.org.il, 1 hmnd.io, 1 hmoegirl.com, 1 hmri.org.au, 1 @@ -39997,6 +39741,7 @@ homeoesp.org, 1 homeofjones.net, 1 homeogenium.com, 0 homeopata.tv, 1 +homeostase.pt, 1 homeownersinsurancenv.com, 1 homepage.shiga.jp, 1 homepal.ga, 1 @@ -40037,6 +39782,7 @@ hon-matsuba.co.jp, 1 honda-centrum.cz, 1 hondart.cz, 1 hondenoppasfraneker.nl, 1 +honey-tr.xyz, 1 honey.beer, 1 honey.is, 1 honeybadger.io, 0 @@ -40053,6 +39799,7 @@ honeyspot.de, 1 honeytracks.com, 1 hong.io, 1 hongbomiao.com, 1 +honggian.com, 1 hongki.tk, 1 hongoi.com, 1 hongorw.tk, 1 @@ -40109,6 +39856,7 @@ hopo.design, 1 hoponmedia.de, 1 hopps.me, 1 hoppyx.com, 1 +hopzone.net, 1 hor.website, 1 horaceli.com, 1 horaciolopez.pro, 1 @@ -40143,6 +39891,7 @@ horo.moe, 1 horoca.net, 1 horochx.org, 1 horodance.dk, 1 +horos.es, 1 horrell.ca, 1 horrendous-servers.com, 1 horror-forum.de, 1 @@ -40153,6 +39902,7 @@ horsehunter.co.uk, 1 horseplanet.tk, 1 horsky.me, 1 horstmanshof.eu, 1 +horstmanshof.nl, 1 horti-it.com, 1 horton-brasses.com, 1 horvathd.eu, 1 @@ -40160,8 +39910,6 @@ horvatia.tk, 1 horvatnyelvkonyv.hu, 1 hory.me, 1 horza.org, 1 -hoshimaq.com.br, 1 -hoshimaquinas.com.br, 1 hoshinplan.com, 1 hoshisato.com, 1 hosiery.tk, 1 @@ -40177,6 +39925,7 @@ host97.de, 1 hostadvice.com, 1 hostam.link, 1 hostarea51.com, 1 +hostatic.com, 1 hostcloud.ml, 1 hostco.nl, 1 hostcoz.com, 1 @@ -40188,7 +39937,6 @@ hostedghost.nl, 1 hostedghost.org, 1 hostedtalkgadget.google.com, 1 hostelacion.com, 1 -hostelaciones.com, 1 hosteleriauno.es, 1 hosteons.com, 1 hostfission.com, 1 @@ -40270,6 +40018,7 @@ hotelpalmas.com.br, 1 hotelpostaorvieto.it, 1 hotelpresident.co.in, 1 hotelpromo.codes, 1 +hotelreis.com.br, 1 hotels-insolites.com, 1 hotels3d.com, 1 hotels4teams.com, 1 @@ -40279,6 +40028,7 @@ hotelsfares.com, 1 hotelsinbuxton.com, 1 hotelsinformer.com, 1 hotelsinncoventry.com, 1 +hotelsinroatan.com, 1 hotelsolinebrela.com, 1 hotelsrit.tk, 1 hotelstanford.com.co, 1 @@ -40322,6 +40072,7 @@ houseboydesigns.com, 1 housekeeperlondon.co.uk, 1 houselocal.co.uk, 1 housemates.uk.com, 1 +houseofaceonline.com, 1 houseofherbs.gr, 1 houseofhouston.com, 1 houseofpertijs.com, 1 @@ -40355,6 +40106,7 @@ howellaccounts.co.uk, 1 howesky.com, 1 howgoodwasmysex.com, 1 howieisawesome.com, 1 +howinsider.com, 1 howlers.tk, 1 howlongtobeatsteam.com, 1 howmanymilesfrom.com, 1 @@ -40374,6 +40126,7 @@ howsyourhealth.org, 1 howtogeek.com, 1 howtogeekpro.com, 1 howtogosolar.org, 1 +howtoinstall.co, 1 howtolaser.com, 1 howtomovetheneedle.com, 1 howtopronounce.com, 1 @@ -40405,7 +40158,6 @@ hpepub.com, 0 hpic.net, 1 hpisavageforum.com, 1 hpkp-faq.de, 1 -hplace.com.br, 1 hps.digital, 1 hps.hu, 1 hpsdigital.hu, 1 @@ -40476,6 +40228,7 @@ hsn.com, 1 hsog.tk, 1 hspinc.ca, 1 hsr.gov, 0 +hst.tc, 1 hsts-preload-test.xyz, 1 hsts.eu, 1 hsts.me, 1 @@ -40497,6 +40250,7 @@ htcvina.com, 1 htdcomputer.vn, 1 hte.ovh, 1 hti.digital, 1 +htikeagkyaw.com, 1 htlball.at, 1 htmanager.fr, 1 htmdom.com, 1 @@ -40513,6 +40267,7 @@ htmlnet.tk, 1 htmlvalidator.com, 1 htmlweb.ml, 1 htmlyse.com, 1 +htmtools.com, 1 htmue.org, 1 htp2.top, 1 htsure.ma, 0 @@ -40546,12 +40301,10 @@ httptest.net, 1 hu-a-u.com, 1 hu.search.yahoo.com, 0 hua-chuan.com.tw, 1 -hua-chuan.tw, 1 hua-in.com, 1 hua-in.net, 1 hua-li88.com, 1 hua-li88.net, 1 -huabantxt.com, 1 huabanxs.com, 1 huagati.com, 1 huahinpropertylisting.com, 1 @@ -40598,6 +40351,7 @@ hubspot.de, 1 hubspot.es, 1 hubspot.fr, 1 hubspot.jp, 1 +hubtrinova.com, 1 huchet.me, 1 hucklebucks.com, 1 huckletree.com, 1 @@ -40613,7 +40367,6 @@ huersch.com, 1 huertoydesamparados.tk, 1 hues-in-lee.de, 1 huffduffer.com, 1 -huffsinsurance.com, 1 hugh-dancy.com, 1 hughfitzgerald.com, 1 hughtodd.ink, 1 @@ -40770,7 +40523,6 @@ hussam.eu.org, 1 hustlehope.com, 1 hustlerstate.tk, 1 huto.ml, 1 -huuduc.xyz, 1 huurwoordenaar.nl, 1 huutonauru.net, 1 huwcbjones.co.uk, 1 @@ -40784,7 +40536,6 @@ huzurmetal.net, 1 hv-huset.no, 1 hvdbox.de, 1 hvenetworks.cf, 1 -hvenetworks.net, 1 hveradistributions.com, 1 hverdagogkink.no, 1 hvgg.de, 1 @@ -40857,6 +40608,7 @@ hyhy85.com, 1 hyhy89.com, 1 hyhy98.com, 1 hyk.me, 1 +hylemorphica.org, 1 hylians.com, 1 hyncice.com, 1 hynek.me, 1 @@ -40869,6 +40621,7 @@ hyper-text.org, 1 hyper.ai, 1 hyper.lol, 1 hyperalgesia.com, 1 +hyperaonline.com.br, 1 hyperbolic-mayonnaise-interceptor.ovh, 1 hypercompetitions.com, 1 hyperd.sh, 1 @@ -40889,7 +40642,6 @@ hyphenpda.co.za, 1 hypnobb.com, 1 hypnose-hennigsdorf.de, 1 hypnoseduction.tk, 1 -hypnosesolutionsvives.com, 1 hypnotizedgirls.ml, 1 hypnovir.us, 1 hypolineweb.de, 1 @@ -40911,7 +40663,6 @@ hytzongxuan.com, 1 hytzongxuan.top, 1 hyundai.no, 1 hyundaisrilanka.lk, 1 -hyvanilmankampaamo.fi, 1 hyvinvointineuvoja.fi, 1 hyyen.com, 1 hztgzz.com, 1 @@ -40960,7 +40711,6 @@ i5197.co, 1 i5y.co.uk, 1 i5y.org, 1 i6729.co, 1 -i6729.com, 1 i6957.co, 1 i7.io, 1 i7sas.tk, 1 @@ -40970,7 +40720,6 @@ i879.com, 1 i88i.gq, 1 i8cp.com, 1 i9297.co, 1 -i95.me, 1 i9728.co, 1 i9s.in, 1 ia.cafe, 1 @@ -40983,6 +40732,7 @@ iaeste.no, 1 iaeste.or.jp, 1 iaf.gov, 1 iahemobile.net, 1 +iain.tech, 1 iainsimms.co.uk, 1 iainsimms.com, 1 iainsimms.me, 1 @@ -41062,9 +40812,7 @@ ibericarreicomsa.es, 1 ibericartechnik.es, 1 iberion.pl, 1 iberiserver.es, 1 -ibestproduct.com, 1 ibetora.com, 1 -ibex-lb.com, 1 ibexcore.com, 1 ibhgospel.com, 1 ibi.mt, 1 @@ -41088,11 +40836,13 @@ ibsglobal.co.za, 1 ibstyle.tk, 1 ibtraining.com, 1 ibugone.com, 1 +ibuildings.nl, 1 ibuki.run, 1 ibuprofens.gq, 1 ibwc.gov, 1 ibykos.com, 1 ic-lighting.com.au, 1 +ic1technologies.com, 1 ic3.gov, 1 icafecash.com, 1 icanhas.report, 1 @@ -41269,6 +41019,7 @@ idid.tk, 1 idinby.dk, 1 idiomasdelmundo.tk, 1 idiot.trade, 1 +idioumarou.com, 1 idkidknow.com, 1 idleleo.com, 1 idlethoughtsandramblings.com, 1 @@ -41296,11 +41047,13 @@ idrissi.eu, 1 idroserviceweb.com, 1 idrycleaningi.com, 1 idsafe.co.za, 1 +idstudio.tk, 1 idtechnowizard.com, 1 idtheft.gov, 1 idubaj.cz, 1 idunno.org, 1 idvl.de, 1 +idweblog.com, 1 idxforza.com, 1 idyl.fr, 1 idysse.com, 1 @@ -41324,13 +41077,13 @@ ient.me, 1 ies-italia.it, 0 ies911.com, 1 iesonline.co.in, 1 +iesucreipi.edu.co, 1 ieval.ro, 1 ievgenialehner.com, 1 iewar.com, 1 if-fashion.gr, 1 if0.ru, 1 ifacservice.be, 1 -ifamily.top, 1 ifan.ch, 1 ifan.ws, 1 ifangpei.cn, 1 @@ -41350,9 +41103,11 @@ ifightsurveillance.net, 1 ifightsurveillance.org, 1 ifisher.xyz, 1 ifiveglobal.com, 1 +ifleurs.com, 1 ifly.pw, 1 iflyi.me, 1 ifma.edu.br, 1 +ifnet.fr, 1 ifoa.it, 1 ifolder.ga, 1 iformbuilder.com, 0 @@ -41398,7 +41153,7 @@ igkabel.ga, 1 igkabel.gq, 1 igkabel.ml, 1 igkabel.tk, 1 -iglobus.cz, 1 +iglobus.cz, 0 iglosujemy.pl, 1 igmus.org, 1 ignace72.eu, 1 @@ -41427,7 +41182,6 @@ igrivi.com, 1 igrodrom-kvest.tk, 1 igrovoi-klub.tk, 1 igsmgmt.com, 1 -iguana.com.ec, 0 igust4u-archive.ga, 1 igva.or.kr, 1 ih8sn0w.com, 1 @@ -41446,6 +41200,7 @@ ihls.world, 0 ihmphila.org, 1 ihoey.com, 1 ihollaback.org, 1 +ihongchao.com, 1 ihongzu.com, 1 ihorizon.jp, 1 ihostup.net, 1 @@ -41459,7 +41214,6 @@ ihydra.net, 1 ihzys.com, 1 ii5197.co, 1 ii6729.co, 1 -ii6729.com, 1 ii6957.co, 1 ii74.com, 1 ii918.com, 1 @@ -41529,7 +41283,6 @@ ikudo.top, 1 ikulist.me, 1 ikumi.us, 1 ikvts.de, 1 -ikwillhout.nl, 1 ikx.me, 1 ikymbo.com, 1 ikzoekeengoedkopeauto.nl, 1 @@ -41587,6 +41340,7 @@ ilii.me, 1 ilikepenguins.tk, 1 ilimitar.tk, 1 iliny.hu, 1 +iliturkey.com, 1 iliz-kafe.fr, 1 ilkeakyildiz.com, 0 illaadventure.com, 1 @@ -41626,6 +41380,7 @@ ilove.fish, 1 ilove588.com, 1 ilove618.com, 1 ilove918.com, 1 +ilovecheesedip.com, 1 ilovecomputering.com, 1 iloveherb.ru, 1 ilovehoney.com.au, 1 @@ -41685,7 +41440,9 @@ imagr.io, 1 imakash.gq, 1 imanageproducts.co.uk, 1 imanageproducts.uk, 1 +imaniprima.co.id, 1 imanolbarba.net, 1 +imap.support, 1 imap2imap.de, 1 imaple.org, 1 imarkethost.co.uk, 1 @@ -41716,9 +41473,9 @@ imeria.tk, 1 imex-dtp.com, 1 imforza.com, 1 img.mg, 1 +img.ovh, 1 img.ren, 1 imgaa.com, 1 -imgal.vin, 1 imgbb.com, 1 imgbu.com, 1 imgencrypt.com, 1 @@ -41749,7 +41506,6 @@ imkerverein-moenchswald.de, 1 imkerverenigingzaanstreek.nl, 1 imkindofabigdeal.com, 1 imlec.net, 1 -imlhx.com, 1 imlinan.cn, 1 imlinan.com, 1 imlinan.info, 1 @@ -41778,7 +41534,6 @@ immobilien-zirm.de, 1 immobiliengutachter-holland.de, 1 immobilier-nice.fr, 1 immobilier92.net, 1 -immobiza.com, 0 immoraldoctors.tk, 1 immortal-it.tk, 1 immortal-pc.info, 1 @@ -41793,7 +41548,6 @@ imolights.net, 1 imolog.cl, 1 imoner.com, 1 imoner.ga, 1 -imoney.tw, 1 imouto.my, 0 imoveisavenda.rio.br, 1 imoxin.net, 1 @@ -41806,6 +41560,7 @@ impactparcels.co.uk, 1 impactparcels.com, 1 impactpub.ch, 0 impakho.com, 1 +impartesco.com, 1 impas.se, 1 impelup.com, 1 impendulo.org, 1 @@ -41834,6 +41589,7 @@ impossible.org, 1 impossiblechoisir.tk, 1 impossiblefitness.com, 1 impossiblehq.com, 1 +impossiblenutrition.com, 1 impossiblex.com, 1 impotsimple.ca, 1 imppac-schmuck.de, 1 @@ -41841,6 +41597,7 @@ imppac.de, 1 impra.com.ua, 1 imprendo.co, 1 imprendo.pro, 1 +imprensaglobal.com.br, 1 impresa-di-pulizie.milano.it, 1 impresa-di-pulizie.org, 1 impresa-pulizie.it, 1 @@ -41868,8 +41625,8 @@ impudence.tk, 1 impulse-clan.de, 1 impulsionsa.com, 1 impulsocristiano.com, 1 -impyus.com, 1 imququ.com, 1 +imqyw.com, 1 imreh.net, 1 imrunner.com, 1 imrunner.ru, 1 @@ -41896,7 +41653,6 @@ in.search.yahoo.com, 0 in.xero.com, 0 in1000worten.de, 1 in10tion.com, 0 -in2-comms.com, 1 inabox.ro, 1 inait.ai, 1 inalvittile.cf, 1 @@ -41948,7 +41704,7 @@ incowrimo.org, 1 incparadise.net, 1 increasetestosteronelevels.org, 1 incrediblenews.tk, 1 -incrementation.net, 1 +incrementation.net, 0 incrom.com, 1 ind.ie, 1 indasun.com, 1 @@ -42044,6 +41800,7 @@ industriafranchini.com, 1 industrial-remote-control.com, 1 industrialalpinism.tk, 1 industrialpaintservices.com, 1 +industriascruzcentro.com, 1 industriemeister.io, 1 industryperspectives.com, 1 indybay.org, 1 @@ -42300,6 +42057,7 @@ ingatlanjogaszok.hu, 1 ingatlanneked.hu, 1 ingber.com, 1 inge-r.nl, 1 +ingebroer.com, 1 ingeeibach.de, 1 ingeni.ink, 1 ingenias.es, 1 @@ -42454,6 +42212,7 @@ inputclub.com, 1 inputmodes.com, 1 inqorp.ca, 1 inquant.de, 1 +inquisition.is, 1 ins-kreativ.de, 1 ins.to, 1 ins1gn1a.com, 1 @@ -42473,12 +42232,10 @@ insertcoins.net, 1 insertface.com, 1 inserzioniticino.ch, 1 insgesamt.net, 1 -inshapenutrition.com.br, 1 inshop.hu, 1 insiberia.tk, 1 inside19.com, 1 insideaudit.com, 1 -insidebeach.com.br, 1 insidebedroom.com, 1 insideevs.com, 1 insideevs.fr, 1 @@ -42535,6 +42292,7 @@ instantluxe.com, 1 instantluxe.de, 1 instantmoron.com, 1 instantpage.tk, 1 +instaon.io, 1 instaquiz.ru, 1 instasex.ch, 1 instava.cz, 1 @@ -42552,6 +42310,7 @@ institutmaupertuis.hopto.org, 1 institutogiuseppe.com, 1 institutogiuseppe.com.ar, 1 institutointersistemico.com.br, 1 +institutolancaster.com, 1 institutomaritimocolombiano.com, 1 instrukci.tk, 1 instrumart.ru, 0 @@ -42580,6 +42339,7 @@ intalink.org.uk, 1 intarweb.ca, 1 intasky.cz, 1 intasky.sk, 1 +intcarshow.com, 1 intec.edu.pe, 1 integ.jp, 1 integralblue.com, 1 @@ -42646,7 +42406,6 @@ interesting.ac.cn, 1 interestingfacts.gq, 1 interferencias.tech, 1 interfloraservices.co.uk, 1 -interflores.com.br, 1 interfug.de, 1 intergenx.co.uk, 1 intergenx.com, 1 @@ -42712,6 +42471,7 @@ internetoffensive.fail, 1 internetofinsecurethings.com, 1 internetovehazardnihry.cz, 1 internetpro.me, 1 +internetprofitspro.com, 1 internetstaff.com, 1 internetstiftelsen.se, 1 internettoday.ga, 1 @@ -42808,6 +42568,7 @@ inversionesgalindo.com, 1 invest-stroj.tk, 1 investactiv.tk, 1 investarholding.nl, 1 +investarter.nl, 1 investcarpremium.com.br, 1 investforum.net, 1 investgold.ml, 1 @@ -42989,14 +42750,12 @@ iprim.ru, 1 ipripojeni.cz, 1 iproducemusic.com, 1 ips-consult.nl, 1 -ips-ihre-pflege-sachsen.de, 1 +ips-ihre-pflege-sachsen.de, 0 ips-sachsen.de, 1 ipschool.spb.ru, 1 -ipsec.pl, 1 ipsecurelink.com, 1 ipso.paris, 1 ipssl.li, 1 -ipstoragesolutions.com, 1 ipsum.dk, 1 ipswitch.com.tw, 1 iptechnology.tk, 1 @@ -43004,7 +42763,7 @@ iptops.com, 1 iptvmaxx.com, 1 iptvzoom.xyz, 1 ipty.de, 1 -ipura.ch, 1 +ipura.ch, 0 ipuservicedesign.com, 1 ipushmail.tk, 1 ipv4.cf, 1 @@ -43013,6 +42772,7 @@ ipv4.gr, 1 ipv4.rip, 1 ipv6-adresse.dk, 1 ipv6-handbuch.de, 1 +ipv6.cool, 1 ipv6.jetzt, 0 ipv6vpn.net, 1 ipv6wallofshame.com, 1 @@ -43044,6 +42804,7 @@ iranonline.tk, 1 iranophiles.com, 1 iranophiles.net, 1 iranophiles.org, 1 +iranpay.biz, 1 iranpedia.tk, 1 iranturkey.info, 1 iranwiki.ovh, 1 @@ -43054,6 +42815,7 @@ irayo.net, 1 irc-results.com, 1 ircica.org, 1 ircmett.de, 1 +ircnow.org, 1 ircoholik.ml, 1 ircsapiklari.tk, 1 ird.nz, 1 @@ -43063,6 +42825,9 @@ iready.ro, 1 ireef.tv, 1 ireland.gq, 1 irelandondemand.ie, 1 +irelandremembers.com, 1 +irelandremembers.ie, 1 +irelandremembers.org, 1 iren.ch, 1 irenekauer.com, 1 irenelove.com, 1 @@ -43104,7 +42869,6 @@ irmag.ru, 1 irmgard-woelfle.de, 1 irmgardkoch.com, 1 irmtrudjurke.de, 1 -irodorinet.com, 1 iroise.ch, 1 ironbelly.pro, 1 ironcarnival.com, 1 @@ -43147,6 +42911,7 @@ isaacpartnership.co.uk, 1 isaacphysics.org, 1 isaaczais.com, 1 isabelaflores.com, 1 +isabelcaviedes.com, 1 isabellavandijk.nl, 1 isabelle-delpech.com, 1 isabellehogarth.co.uk, 1 @@ -43167,6 +42932,7 @@ isbengrumpy.com, 1 iscert.org, 1 iscontrol.com.mx, 1 isdecolaop.nl, 1 +isdmgroup.in, 1 isdn.jp, 1 isdown.cz, 1 isecrets.se, 1 @@ -43270,6 +43036,7 @@ ispanika.tk, 1 ispaniola.ga, 1 ispfontela.es, 1 ispmedipv6.se, 1 +ispn.edu.ar, 1 ispro-ng.com, 1 ispsoft.pro, 1 ispymissions.ga, 1 @@ -43405,21 +43172,21 @@ itcbuerobedarf.de, 1 itchy.nl, 1 itchybrainscentral.com, 1 itconsulting-wolfinger.de, 1 +itcoolie.in, 1 itcs.services, 1 itdaan.com, 1 itdashboard.gov, 1 itdata.ro, 1 itdoneproperly.com, 1 itds-consulting.com, 1 -itds-consulting.cz, 1 itds-consulting.eu, 1 itdutchie.com, 1 -itechgeekology.com, 1 itecor.net, 0 iteecafe.hu, 1 iteha.de, 1 iteke.ml, 1 iteke.tk, 1 +iteli.eu, 1 itemcreator.tk, 1 itemmc.com, 1 itemorder.com, 1 @@ -43429,6 +43196,7 @@ iterror.co, 0 itezu.ml, 1 itfh.eu, 1 itfix.cz, 1 +itgalaxy.com.au, 1 itgirls.rs, 1 itgoesup.com, 1 itgoesupent.com, 1 @@ -43477,7 +43245,6 @@ itraffic.cf, 1 itraffic.tk, 1 itraveille.fr, 1 itreallyaddsup.com, 1 -itrendyworld.com, 1 itring.pl, 0 itruss.com.tw, 1 itruth.tk, 1 @@ -43553,7 +43320,6 @@ ivanovka.ga, 1 ivanovocity.tk, 1 ivanovolive.ru, 1 ivanpolchenko.com, 1 -ivanteevka.org, 1 ivaoru.org, 1 ivendi.com, 1 ivermectin.gq, 1 @@ -43577,6 +43343,7 @@ ivorvanhese.nl, 1 ivoryandgrace.com, 1 ivoryonsunset.com, 1 ivotemahdi.com, 1 +ivoucher-kuwait.com, 1 ivpn.net, 1 ivre.rocks, 1 ivsign.net, 1 @@ -43584,7 +43351,6 @@ ivusn.cz, 1 ivvl.ru, 1 ivxv.ee, 1 ivy-league-colleges.com, 1 -ivy.show, 1 ivystech.com, 0 iwader.co.uk, 1 iwalton.com, 1 @@ -43697,7 +43463,6 @@ j5lx.eu, 1 j5lx.io, 1 j605.tk, 1 j6729.co, 1 -j6729.com, 1 j6957.co, 1 j70101.com, 1 j70102.com, 1 @@ -43816,6 +43581,7 @@ jacobphono.com, 1 jacobs-implantate.at, 1 jacobsenarquitetura.com, 1 jacquesdedixmude.eu, 1 +jaculus.eu, 1 jacuzziprozone.com, 1 jadara.info, 1 jadchaar.me, 1 @@ -43829,6 +43595,7 @@ jaeger.link, 1 jaegerlacke.de, 1 jaepinformatica.com, 1 jaetech.org, 1 +jafarmehdipor.ga, 1 jagadhatrionline.co.in, 1 jagbouncycastles.co.uk, 1 jagerkin.tk, 1 @@ -43886,6 +43653,7 @@ jakub-boucek.cz, 1 jakubarbet.eu, 1 jakubboucek.cz, 1 jakubklimek.com, 1 +jakubsindelar.cz, 1 jakubtopic.cz, 1 jakubvrba.cz, 1 jala.co.jp, 1 @@ -43919,6 +43687,7 @@ jamesknd.uk, 0 jamesmarsh.net, 1 jamesmcdonald.com, 0 jamesmilazzo.com, 1 +jamesplumbingcompanypasadenatx.com, 1 jamesrains.com, 1 jamesrobertson.io, 1 jamesrobertson.sh, 1 @@ -44002,6 +43771,7 @@ janome.com.ua, 1 janostheil.de, 1 janschaumann.de, 1 janssen.fm, 1 +jantari.com, 1 janterpstra.eu, 1 jantinaboelens.nl, 1 janv.it, 1 @@ -44040,7 +43810,7 @@ jarl.ninja, 1 jarmandental.com, 1 jarmatys.pl, 1 jarniashop.se, 1 -jarods.org, 1 +jarods.org, 0 jaroku.com, 1 jarondl.net, 1 jaroslavc.eu, 1 @@ -44087,7 +43857,6 @@ javascriptlab.fr, 1 javaweb.site, 1 javaxxz.com, 1 javfree.me, 1 -javhdmovies.com, 1 javi-soleil.tk, 1 javierbalvin.com, 1 javierburgos.net, 1 @@ -44266,7 +44035,6 @@ jeffreyhaferman.com, 1 jeffri.me, 1 jeffsanders.com, 1 jefftickle.com, 1 -jeffwebb.com, 1 jefrydco.id, 1 jefsweden.eu, 1 jehelpdesk.nl, 1 @@ -44289,7 +44057,6 @@ jelleraaijmakers.nl, 1 jelly.cz, 1 jellybeanbooks.com.au, 1 jellyfish.co, 1 -jellyfloral.com, 1 jellypepper.com, 1 jellysquid.me, 1 jelmer.co.uk, 1 @@ -44392,7 +44159,6 @@ jessgranger.com, 1 jessica-weller.de, 1 jessicabarends.nl, 1 jessicabenedictus.nl, 0 -jessicaevrard.com, 1 jessicahrehor.com, 1 jessicharlie.com, 1 jessieabraham.tk, 1 @@ -44451,6 +44217,7 @@ jf-projects.de, 0 jf886.cc, 1 jfbst.net, 1 jfgselbitztal.tk, 1 +jfjtransport.com, 1 jfr.im, 1 jfreitag.de, 0 jftw.org, 1 @@ -44463,8 +44230,10 @@ jgoguen.ca, 1 jgoldgroup.com, 1 jgonzalezm.com, 1 jgregory.co.uk, 1 +jgtrainer.com, 1 jgwb.de, 1 jgwb.eu, 1 +jhatpatjobs.com, 1 jhaveri.net, 1 jhburton.co.uk, 1 jhcommunitysports.co.uk, 1 @@ -44472,6 +44241,7 @@ jhe.li, 1 jhill.de, 1 jhmrcm.com, 1 jhollandtranslations.com, 1 +jhonmurillo.ml, 1 jhost.gq, 1 jhuang.me, 1 jhw3d.com, 1 @@ -44616,6 +44386,7 @@ jlr-luxembourg.com, 0 jltcsecuritygroup.com, 1 jltctech.com, 1 jm-bea.net, 1 +jmap.support, 1 jmarciniak.it, 1 jmb.lc, 1 jmbeautystudio.se, 1 @@ -44664,7 +44435,6 @@ joaojunior.com, 1 joaopenteado.com, 1 joaosampaio.com.br, 1 job-chocolat.jp, 1 -job-ofertas.info, 1 job.biz.tr, 1 jobalicious.nl, 1 jobastudio.nl, 1 @@ -44680,7 +44450,6 @@ jobbsafari.se, 1 jobcorpsy2y.com, 1 jobfresh.ga, 1 jobfury.com, 1 -jobify.in, 1 jobindex.dk, 1 jobit.gr, 1 joblab.com.ua, 0 @@ -44770,6 +44539,7 @@ johanbissemattsson.se, 0 johand.io, 1 johanlog.com, 1 johannaojanen.com, 1 +johannavarmala.fi, 1 johannes-bauer.com, 1 johannes-schaefer.de, 1 johannes-sprink.de, 0 @@ -44821,8 +44591,6 @@ johnnybetstaging.com, 1 johnnybsecure.com, 1 johnnywan.net, 1 johnopdenakker.com, 1 -johnpenny.info, 1 -johnpenny.uk, 1 johnroach.io, 1 johnroberts.me, 1 johnrockefeller.net, 1 @@ -44842,6 +44610,7 @@ joinamericacorps.gov, 1 joinhonor.com, 1 jointotem.com, 1 joinus-outfits.nl, 1 +jojo.sg, 1 jojosplaycentreandcafeteria.co.uk, 1 jokedalderup.nl, 1 jokequebec.com, 1 @@ -44867,6 +44636,7 @@ jolokia.ch, 1 jomagus.de, 1 jomo.tv, 1 jomsolat.tk, 1 +jon8rfc.homeip.net, 1 jonahburke.com, 1 jonahperez.com, 1 jonale.net, 1 @@ -44924,7 +44694,6 @@ jonohewitt.com, 1 jonola.com, 1 jonpads.com, 1 jonpavelich.com, 1 -jons.org, 1 jonscaife.com, 1 jonssheds.direct, 1 jonstar.tk, 1 @@ -45065,7 +44834,6 @@ jp.md, 1 jp4f.de, 1 jpbe-network.de, 1 jpbe.de, 1 -jpbike.cz, 0 jpcrochetapparel.com, 1 jpdeharenne.be, 0 jpeg.io, 1 @@ -45076,7 +44844,6 @@ jplennard.com, 1 jpm-inc.jp, 1 jpmelos.com, 1 jpmelos.com.br, 1 -jpmguitarshop.com.br, 1 jpod.cc, 1 jppcadvertising.com, 1 jpph.org, 1 @@ -45099,7 +44866,6 @@ jr5proxdoug.xyz, 1 jrabasco.me, 1 jrc9.ca, 0 jrchaseify.xyz, 1 -jrcmo.com, 1 jreb.nl, 1 jreiff.de, 1 jreinert.com, 1 @@ -45132,6 +44898,7 @@ jscsteigerbouw.nl, 1 jsd-cog.org, 1 jsdelivr.com, 1 jsdelivr.net, 1 +jsdesign.mx, 1 jselby.net, 1 jsfloydlaw.com, 1 jsh918.com, 1 @@ -45146,6 +44913,7 @@ jslots.dk, 1 jsme.cz, 1 jsnfwlr.com, 1 jsnfwlr.io, 1 +json2bot.chat, 1 jsonsinc.com, 1 jsphys.org.cn, 1 jsproxy.tk, 0 @@ -45175,6 +44943,7 @@ juanjovega.com, 1 juanmaguitar.com, 1 juanmazzetti.com, 1 juanxt.ddns.net, 1 +jub0bs.com, 1 jubileum.online, 1 jubileumfotograaf.nl, 1 jubodarpan.in, 1 @@ -45201,11 +44970,15 @@ juezz.top, 1 jugendfeuerwehr-vechta.de, 1 jugendhackt.org, 1 jugendsuenden.info, 1 +juggo.me, 1 jugh.de, 1 jugwallonie.be, 1 juhakoho.com, 1 +juhanihakala.fi, 1 juice.codes, 1 juk.life, 0 +jukkakivi.fi, 1 +jukkakivimaki.fi, 1 jukovka.tk, 1 juku-wing.jp, 1 jule-spil.dk, 1 @@ -45257,9 +45030,7 @@ jumbopan.net, 1 jumeirashoes.com, 1 jump-zone.co.uk, 1 jump.wtf, 1 -jump4funinflatables.co.uk, 1 jumpandbounce.co.uk, 1 -jumpandjivechildrensparties.co.uk, 1 jumparoundbouncycastles.co.uk, 1 jumparty.co.uk, 1 jumpbuttonnorth.com, 1 @@ -45297,7 +45068,7 @@ junias-fenske.de, 1 juniorhandball.com, 1 juniorsambo.tk, 1 juniperroots.ca, 1 -junjhome.com, 1 +junjie.pro, 1 junjun-web.net, 1 junkdrome.org, 1 junkfoodcafe.com, 1 @@ -45306,6 +45077,7 @@ juno.co.uk, 1 junoaroma.com, 1 junodownload.com, 1 junomessenger.cf, 1 +junta.pl, 1 juozasveza.lt, 1 jupiterchiropractic.com, 1 juppy.tk, 1 @@ -45372,6 +45144,7 @@ justpaste.it, 1 justpdf.cf, 1 justquoteme.ga, 1 justrighthsc.com, 1 +justsellmycar.com, 1 justsmart.io, 1 justsome.info, 1 justtalk.site, 1 @@ -45384,7 +45157,6 @@ juszkiewicz.com.pl, 1 jutella.de, 0 jutlander-netbank.dk, 1 jutlander.dk, 1 -juttaheitland.com, 1 juusujanar.eu, 0 juventusmania1897.com, 1 juwelierstoopman.nl, 1 @@ -45396,6 +45168,7 @@ jvbouncycastlehire.co.uk, 1 jvdham.nl, 1 jvdz.nl, 1 jvega.me, 1 +jvianes.ddns.net, 1 jvlandscapingservices.com, 1 jvlfinance.cz, 1 jvn.com, 1 @@ -45715,7 +45488,6 @@ k87021.com, 1 k87022.com, 1 k87023.com, 1 k87024.com, 1 -k87025.com, 1 k87026.com, 1 k87027.com, 1 k87028.com, 1 @@ -45986,7 +45758,6 @@ k8meinv.com, 1 k8n.de, 1 k8r.eu, 1 k8slot.com, 1 -k8top.com, 1 k8v02.com, 1 k8v03.com, 1 k8v04.com, 1 @@ -46013,13 +45784,11 @@ k8v29.com, 1 k8v30.com, 1 k8vn001.com, 1 k8vn002.com, 1 -k8vn003.com, 1 k8vn005.com, 1 k8vn008.com, 1 k8vn009.com, 1 k8vn010.com, 1 k8vn011.com, 1 -k8vn9999.com, 1 k9297.co, 1 k955.vip, 1 k966.vip, 1 @@ -46055,6 +45824,7 @@ kabinett.cz, 1 kabinettindia.in, 1 kabluchek.tk, 1 kabluchok.tk, 1 +kabodo.com, 1 kabos.art, 1 kabu-abc.com, 1 kabukpsikoloji.com, 1 @@ -46079,16 +45849,15 @@ kafel-ufa.tk, 1 kaffad.site, 1 kaffau.com, 1 kaffeekrone.de, 1 +kaffeeringe.de, 1 kafoom.de, 1 kagawa-net.org, 1 kaggle.com, 1 kagicomb.org, 1 -kaginalycloud.com, 1 kagitreklam.com, 1 kagomesashi.tk, 1 kagucho.net, 1 kahootkings.works, 1 -kahopoon.net, 1 kai-ratzeburg.de, 1 kai-ruecker.tk, 1 kai.cool, 0 @@ -46154,7 +45923,6 @@ kakacon.nz, 1 kakao-karten.de, 1 kakaravaara.fi, 1 kakdolgonline.cf, 1 -kakie-gobocha.jp, 1 kakie-kolesa.ru, 1 kakofotmitzaim.cf, 1 kakofotmitzaim.ga, 1 @@ -46322,6 +46090,7 @@ kapanlagi.gq, 1 kapelya.gq, 1 kapiorr.duckdns.org, 1 kapital-kredit.cf, 1 +kaplan.se, 1 kaplanco.com, 1 kaplatzis.com, 1 kapler.family, 0 @@ -46331,6 +46100,7 @@ kappershuis-meppel.nl, 1 kappharn.com, 1 kappie.xyz, 1 kappit.dk, 1 +kapsalondigo.nl, 1 kapsalonlinds.nl, 1 kapseli.net, 1 kaptadata.com, 1 @@ -46354,6 +46124,12 @@ karanlyons.com, 1 karantholdings.ga, 1 karantyn.pro, 1 karaoglanis.tk, 1 +karaokerentalcalgary.com, 1 +karaokerentaledmonton.com, 1 +karaokerentalmontreal.com, 1 +karaokerentalottawa.com, 1 +karaokerentaltoronto.com, 1 +karaokerentalvancouver.com, 1 karapuzz.tk, 1 karasik.by, 1 karateka.org, 1 @@ -46397,7 +46173,6 @@ karmabaker.com, 1 karmaflux.com, 1 karmaful.de, 1 karmainsurance.ca, 1 -karmaplatform.com, 1 karmaspa.se, 1 karmatrend.cf, 1 karn.nu, 1 @@ -46411,6 +46186,7 @@ karopc.com.pl, 1 karopc.pl, 1 karoverwaltung.de, 1 karpanhellas.com, 0 +karpat.space, 1 karr.ga, 1 karramba.tk, 1 karriharju.tk, 1 @@ -46423,7 +46199,6 @@ karta-baikala.ml, 1 karta-paliwowa.pl, 1 kartacha.com, 1 kartar.net, 0 -kartatopia.com, 1 kartbird.com, 1 kartec.com, 1 karten-verlag.de, 1 @@ -46440,6 +46215,7 @@ kas.ie, 1 kasasaprotect.com, 1 kaseban.com, 1 kasei.im, 1 +kasettilamerit.fi, 1 kashadriskill.com, 1 kashbet.com, 1 kashbet.net, 1 @@ -46476,7 +46252,6 @@ kasual.id, 1 kat.al, 1 kat.marketing, 0 kat4at.tk, 1 -katabra.gr, 1 katagena.com, 1 kataiszilveszter.hu, 1 katalog-serverov.ga, 1 @@ -46486,6 +46261,7 @@ katalogbutikker.dk, 1 katalogharga.cf, 1 katalogkapsli.pl, 1 katan-stroi.tk, 1 +katapult-impuls.com, 1 katapult.es, 1 katarsisuib.no, 1 katazuketai.net, 1 @@ -46570,7 +46346,6 @@ kayleen.net, 1 kaylyn.ink, 0 kayo.digital, 1 kayon.cf, 1 -kayon.tj, 1 kaypasocks.com, 1 kayscs.com, 1 kaysis.gov.tr, 1 @@ -46913,7 +46688,7 @@ keelove.net, 1 keemail.me, 1 keematdekho.com, 1 keen.media, 1 -keengamer.com, 0 +keengamer.com, 1 keepa.com, 1 keepdecor.com, 1 keeperapp.com, 1 @@ -47046,7 +46821,6 @@ keramed.gq, 1 kerameion.com, 1 kerebro.com, 1 kerijacoby.com, 1 -kermadec.com, 1 kermadec.fr, 1 kernel-error.de, 1 kernel-panik.me, 1 @@ -47071,6 +46845,7 @@ kescher.site, 1 kesef.org.il, 1 keshausconsulting.com, 1 keskeces.com, 1 +kessawear.com, 1 kessel-runners.com, 1 kesslerandsons.com, 1 kesslerwine.com, 1 @@ -47103,7 +46878,6 @@ kevindekoninck.com, 0 kevindienst.blog, 1 kevinfoley.cc, 1 kevinfoley.org, 1 -kevinfumbles.com, 1 kevingsky.com, 1 kevinhill.nl, 1 kevinhq.com, 1 @@ -47128,7 +46902,7 @@ keybase.io, 1 keybored.co, 1 keybored.me, 1 keycdn.com, 1 -keycenter.com.br, 1 +keycdn.xyz, 1 keycontainers.co.za, 1 keyerror.com, 1 keyex.com.br, 1 @@ -47147,8 +46921,9 @@ keynes.id.au, 1 keyphotojs.cf, 1 keypointfrancine.nl, 1 keys.fedoraproject.org, 1 -keys247.co.uk, 1 +keyschip.com, 1 keyserver.sexy, 0 +keysmedspa.com, 1 keysofart.com, 1 keysso.net, 1 keystoneok.com, 0 @@ -47398,7 +47173,7 @@ kfzjeugd.nl, 1 kg7.pl, 1 kgcarpetandupholsterycleaning.com, 1 kgm-irm.be, 1 -kgnk.ru, 1 +kgnk.ru, 0 kgt10.ru, 1 kha.com, 1 khaganat.net, 1 @@ -47451,7 +47226,6 @@ kiarayoga.com, 1 kiasarnews.tk, 1 kiasystems.com, 1 kibea.net, 1 -kibibit.net, 1 kibriscicek.net, 1 kick-in.nl, 1 kickasscanadians.ca, 1 @@ -47510,6 +47284,7 @@ kievradio.com, 1 kiffmarks.com, 1 kifid.nl, 1 kigmbh.com, 1 +kigurumi-party.ru, 1 kii91.com, 1 kiinteistot-lidl.fi, 1 kiir.net, 1 @@ -47597,8 +47372,8 @@ kingcannabisshop.com, 1 kingclass.cn, 1 kingdomexperiments.org, 1 kingdominnergy.com, 1 -kingdoms.gg, 1 kingfast.eu.org, 1 +kingforex.co, 1 kingiescastles.co.uk, 1 kingjamesbibleonline.org, 1 kingjamesgospel.com, 1 @@ -47632,9 +47407,7 @@ kinkcafe.net, 1 kinkenonline.com, 1 kinkyhookup.com, 1 kinmunity.com, 1 -kinnettmemorial.org, 1 kinnikinnick.com, 1 -kinniyaonlus.com, 0 kino-boom.tk, 1 kino-doma.tk, 1 kino-room.ga, 1 @@ -47884,7 +47657,6 @@ klarika.com, 1 klarmobil-empfehlen.de, 1 klassika.tk, 1 klauke-enterprises.com, 1 -klausbijou.com.br, 1 klausbrinch.dk, 0 klausen.dk, 1 klauswissmann.com, 1 @@ -47969,18 +47741,19 @@ klop.info, 1 klose.family, 1 klosko.net, 1 kloudboy.com, 1 +kls-platform.com, 1 klssn.com, 1 klu.io, 1 klub-zajmov.ga, 1 klub.tk, 1 kluck.me, 1 klugemedia.de, 1 -klupper.com, 1 klusbedrijfdupau.nl, 1 klushka.cf, 1 klusservice-utrecht.nl, 1 klustermedia.com, 1 klusweb-merenwijk.nl, 1 +klute.spdns.de, 1 klva.cz, 1 kmashworth.co.uk, 1 kmkz.jp, 1 @@ -48007,9 +47780,9 @@ kneli.co.il, 1 knep.me, 1 kneppe.me, 1 knetterbak.nl, 1 -kngk-group.ru, 1 +kngk-group.ru, 0 kngk-transavto.ru, 1 -kngk.org, 1 +kngk.org, 0 kngkng.com, 1 kniga-ru.tk, 1 kniga.market, 0 @@ -48019,7 +47792,6 @@ knighkidoma.tk, 1 knightsblog.de, 1 knightsbridge.net, 1 knightsbridgewine.com, 1 -knightsofcolumbus867.com, 1 knightsweep.com, 1 knighulki.cf, 1 knigi-free.cf, 1 @@ -48134,7 +47906,6 @@ kogotok.ml, 1 kogro.de, 1 kogudesi.com, 1 kohlistkool.tk, 1 -koho.fi, 1 kohoutsautomotive.com, 1 kohparadise.com, 1 kohsandra.com, 0 @@ -48143,6 +47914,7 @@ koicenter-thuine.de, 1 koifish.org, 1 koineuno.com, 1 koirala.email, 1 +koishi.pro, 1 koji-tsujitani.net, 1 kojip.com, 1 kojipkgs.fedoraproject.org, 1 @@ -48150,7 +47922,6 @@ kojy.fr, 1 koka-shop.de, 1 kokensupport.com, 1 koketteriet.se, 1 -koki.cl, 1 kokoiroworks.com, 1 kokomo.xyz, 1 kokomu.com, 1 @@ -48216,6 +47987,7 @@ komment.ml, 1 kommotiv.nl, 1 kommunermeddnssec.se, 1 kommunermedipv6.se, 1 +kommunikation-czw.de, 1 kommunistienliitto.tk, 1 kommx.de, 1 komodo.com.tr, 1 @@ -48303,7 +48075,6 @@ kopfootdoctor.com, 1 kopfsalat.eu, 0 kopfschaschlik.de, 1 kopfundseele.de, 1 -kopidingin.xyz, 1 kopjethee.nl, 1 koplancpa.com, 1 koplax-online.com, 1 @@ -48344,7 +48115,6 @@ korrelzout.nl, 1 kortarsmagyarfesto.tk, 1 kortgebyr.dk, 1 korund.tk, 1 -korup.com, 1 koryfi.com, 1 kos4all.com, 1 kos9078.com, 1 @@ -48563,9 +48333,9 @@ krmeni.cz, 0 kroell.net, 1 krok.gq, 1 krokedil.se, 1 -kromamoveis.com.br, 1 kromax.it, 1 kromciri.gq, 1 +krome.sg, 1 kromonos.net, 1 kronopolo.com, 1 krony.de, 1 @@ -48577,6 +48347,7 @@ krossakorven.tk, 1 krouzkyliduska.cz, 0 krovatka.tk, 1 kroy.io, 1 +krpaforum.org, 1 krsaustralia.com.au, 1 krsn.de, 1 krsvrs.nl, 1 @@ -48599,7 +48370,6 @@ krutka.cz, 1 kruu.de, 1 kry.no, 1 kry.se, 1 -kryglik.com, 1 kryha.io, 0 krypmonet.com, 1 krypsys.com, 1 @@ -48732,6 +48502,7 @@ ks1908.com, 1 ks1909.com, 1 ks191.com, 1 ks196.com, 1 +ks1athome.co.uk, 1 ks2.vip, 1 ks20.vip, 1 ks200.vip, 1 @@ -49287,7 +49058,6 @@ kuropatina.tk, 1 kurrende.nrw, 0 kurschies.de, 1 kurserne.dk, 1 -kursk-otoplenie.ru, 1 kursk.cf, 1 kurswahl-online.de, 1 kursyjezykowelublin.pl, 1 @@ -49306,6 +49076,7 @@ kushner-cpa.co.il, 0 kushtikidsparties.co.uk, 1 kusochi.eu, 1 kustod.io, 1 +kustom-kitchens.com, 1 kustosija.tk, 1 kutamo.com, 1 kutekeiki.com, 1 @@ -49395,7 +49166,6 @@ kyj57.com, 1 kyj577.com, 1 kyj59.com, 1 kyj599.com, 1 -kyj611.com, 1 kyj622.com, 1 kyj633.com, 1 kyj644.com, 1 @@ -49424,7 +49194,6 @@ kyobostory-events.com, 1 kyochon.fr, 1 kyoko.org, 1 kyosaku.org, 1 -kyoto-k9.com, 0 kyoto-mic.com, 1 kyoto-sake.net, 1 kyoto-tomoshibi.jp, 1 @@ -49514,6 +49283,7 @@ labelfactory.nl, 1 labequipvn.com, 1 labiblioafronebrulepas.com, 0 labirint.cf, 1 +lablic-beta.work, 1 lablnet.tk, 1 labobooks.com, 1 laboiteanem.fr, 1 @@ -49557,7 +49327,6 @@ lacicloud.net, 1 lackan.tk, 1 lackierereischmitt.de, 1 laclaque.ch, 0 -lacledeslan.com, 1 lacledeslan.org, 1 lacledor.ch, 0 laclefdor.ch, 0 @@ -49600,12 +49369,13 @@ ladyofhopeparish.org, 1 ladyofsongstv.com, 1 ladysecrets.cf, 1 ladysecrets.ga, 1 +laemen.com, 0 +laemen.nl, 0 laemiliafutbol.tk, 1 laencina.tk, 1 laermschmiede.de, 1 laeryn.com, 1 laesisvefurinn.is, 1 -laestacionmontevideo.com, 1 laextra.mx, 1 lafansite.tk, 1 lafantasticatravel.com, 1 @@ -49619,7 +49389,6 @@ lafka.org, 1 laflash.com, 1 lafr4nc3.xyz, 1 lag-gbr.gq, 1 -lagaia.com.br, 1 lagazzettadigitale.it, 1 lagerauftrag.info, 1 lagier.xyz, 1 @@ -49681,9 +49450,9 @@ lakeview.photography, 1 lakewinnipegdatastream.ca, 1 lakewoodcityglass.com, 1 lakewoodcomputerservices.com, 1 +lakewylietax.com, 1 lakiernictwo.auto.pl, 1 lakkt.de, 1 -lakonia.com.br, 1 lakorntoday.com, 1 lakorona.tk, 1 lalalab.com, 1 @@ -49747,7 +49516,6 @@ lamppostpublishing.com, 1 lampsh.ml, 1 lampy.pl, 1 lamujerquesoy.com, 0 -lamunyonfoundationrepair.com, 1 lan-divy.com, 1 lan-divy.fr, 1 lan.biz.tr, 1 @@ -49756,6 +49524,7 @@ lana.swedbank.se, 1 lanahallen.com, 1 lanbroa.eu, 1 lancashirecca.org.uk, 1 +lancea.pl, 1 lancejames.com, 1 lancelafontaine.com, 1 lancelhoff.com, 1 @@ -49808,6 +49577,7 @@ lanetix.com, 1 lanforalla.se, 1 lang-php.com, 1 langadeduero.tk, 1 +langages-programmation.tk, 1 langapi.com, 1 langatang.com, 1 langbein.org, 1 @@ -49817,7 +49587,6 @@ langhun.me, 1 langjp.com, 0 langkahteduh.com, 1 langkawihomestay.net, 0 -langleyporter.com, 1 langly.fr, 1 langotie.com.br, 1 langsam-dator.se, 1 @@ -49968,6 +49737,7 @@ lasix-medication.cf, 1 lask.in, 1 laskas.pl, 1 lasmesas.tk, 1 +lasmoarquitectos.com, 1 lasnoticias.info, 1 lasowy.com, 1 laspequenassemillas.com, 1 @@ -50052,6 +49822,7 @@ launchpadder2.com, 1 launchyourcareer.com, 1 laupv.online, 1 lauraandwill.wedding, 0 +laurabailo.com, 1 laurable.com, 1 lauraenvoyage.fr, 1 laurainnes.tk, 1 @@ -50087,13 +49858,12 @@ lauzon-hitter.com, 1 lavabit.com, 1 lavabit.no, 1 lavaggista.it, 1 -lavalite.de, 1 lavalon.tk, 1 lavamine.tk, 1 lavamob.com, 1 lavanderia.roma.it, 1 lavasing.eu.org, 1 -lavaux.lv, 1 +lavaux.lv, 0 lavenderx.org, 1 lavhire.tk, 1 laviedalex.ovh, 1 @@ -50179,6 +49949,8 @@ lbgconsultores.com, 1 lbihrhelpdesk.com, 1 lbls.me, 0 lbmblaasmuziek.nl, 1 +lbpc.pro, 1 +lbph.org, 1 lbphacker.pw, 1 lbrlh.tk, 1 lbrli.tk, 1 @@ -50413,6 +50185,22 @@ lc8036.com, 1 lc8038.com, 1 lc8050.com, 1 lc8052.com, 1 +lc80803.com, 1 +lc80804.com, 1 +lc80805.com, 1 +lc80806.com, 1 +lc80807.com, 1 +lc80808.com, 1 +lc80809.com, 1 +lc80810.com, 1 +lc80811.com, 1 +lc80812.com, 1 +lc80813.com, 1 +lc80815.com, 1 +lc80817.com, 1 +lc80818.com, 1 +lc80819.com, 1 +lc80820.com, 1 lc818.net, 1 lc8181.com, 1 lc8282.com, 1 @@ -50703,8 +50491,6 @@ learnpianogreece.com, 1 learnplayground.com, 1 learntale.com, 1 learnthetruth.tk, 1 -learntohack.me, 1 -learolstore.com, 1 leaseit24.com, 1 leaseit24.de, 1 leaseourthings.com, 1 @@ -50764,6 +50550,7 @@ lecheng988.com, 1 lechenietravami.cf, 1 lechiennoir.net, 1 lechite.ga, 1 +lechompenchaine.fr, 1 lechucero.com, 1 leclubnestleantillesguyane.fr, 1 leclubnestlereunion.re, 1 @@ -50775,7 +50562,6 @@ ledburyvets.co.uk, 1 ledcross.eu, 1 leddeluxe.ml, 1 leddingplasticsurgery.com, 1 -ledecologie.com.br, 1 ledeguisement.com, 1 ledensite.com, 1 lederer-it.com, 1 @@ -50784,7 +50570,6 @@ ledlampor365.se, 1 ledlight.com, 1 ledlights.ca, 1 lednavi.de, 1 -ledscontato.com.br, 1 ledspadova.eu, 1 ledspalluto.de, 1 ledwereld.nl, 1 @@ -50798,13 +50583,12 @@ leebiblestudycentre.net, 1 leebiblestudycentre.org, 1 leech.ga, 1 leeclemens.net, 0 -leedev.org, 1 leefindlow.com, 1 leekspin.ml, 1 leelaylay.com, 1 leelou.wedding, 1 -leemachinetools.com, 1 leemankuiper.nl, 1 +leenaluhtanen.net, 1 leendebroekertfonds.nl, 1 leere.me, 1 leerkotte.eu, 1 @@ -50822,6 +50606,7 @@ leeyoungaeph.tk, 1 lefcoaching.nl, 0 lefebvristes.com, 1 lefebvristes.fr, 1 +lefilradio.fr, 1 leflibustier.ru, 1 leflox.cf, 1 lefonddeloeil.com, 0 @@ -50878,6 +50663,7 @@ legkie-recepty.tk, 1 legko-pohudet.cf, 1 legland.fr, 1 legnami24.it, 1 +legoktm.com, 1 legoutdesplantes.be, 1 legrandvtc.fr, 1 legumeinfo.org, 1 @@ -50902,6 +50688,7 @@ leisure-blog.com, 1 leisure-supplies-show.co.uk, 1 leisurepools.com.au, 1 leiyinan.com, 1 +lejade.fr, 1 lejardindesmesanges.fr, 1 leko.tk, 1 lektier.cf, 1 @@ -51016,6 +50803,7 @@ lepenetapeti.com, 1 leper.ga, 1 lephilnet.tk, 1 lepidum.jp, 1 +leporem.com.br, 1 leppis-it.de, 1 leprado.com, 1 leprekon.tk, 1 @@ -51139,6 +50927,7 @@ letterbox-online.de, 1 letterdance.de, 1 letteringinstitute.com, 1 lettersblogatory.com, 1 +letterzaken.nl, 1 lettori.club, 1 lettres-motivation.net, 1 letturaveloce.tk, 1 @@ -51149,7 +50938,6 @@ leuenhagen.com, 1 leulu.com, 1 leumi-how-to.co.il, 1 leutgeb.xyz, 1 -leuthardtfamily.com, 1 lev103.com, 1 levans.fr, 1 levanscatering.com, 1 @@ -51160,6 +50948,7 @@ level-10.de, 1 level6.me, 1 level9hvac.com, 1 levelaccordingly.com, 1 +levellock.com.ua, 1 levelonetrainingandfitness.com, 1 levels.one, 1 levels3d.com, 1 @@ -51212,6 +51001,7 @@ lexpierce.social, 1 lexway.pk, 1 leybelsgarden.cf, 1 leybold.co.id, 1 +leyendaluzrenacer.com, 1 leymaritima.com, 1 lezdomsm.com, 1 lf112.net, 1 @@ -51219,6 +51009,7 @@ lfashion.eu, 1 lfaz.org, 1 lffweb.ga, 1 lfgss.com, 1 +lfnaturopathie.com, 1 lforum.tk, 1 lfrconseil.com, 1 lfyhokk.tk, 1 @@ -51236,7 +51027,6 @@ lgbusiness.es, 1 lgesteticaautomotiva.com.br, 1 lghfinancialstrategy.ch, 0 lgnsh.fr, 1 -lgpecasoriginais.com.br, 1 lgsg.us, 1 lgygf.com, 1 lhajn.cz, 1 @@ -51367,6 +51157,7 @@ libuni.eu, 1 libyanexpert.ml, 1 libzik.com, 1 licence-registry.com, 1 +licensediscovery.io, 1 liceo.cn, 1 liceserv.com, 1 lichess.org, 1 @@ -51433,13 +51224,13 @@ life-element.com, 1 life-emotions.pt, 1 life-in-hell.tk, 1 life-tec.tk, 1 -life-time.nl, 1 life29.com, 1 lifeandhealthtips.tk, 1 lifeartstudios.net, 1 lifeasgame.tk, 1 lifebetweenlives.com.au, 1 lifeboxhealthcare.co.uk, 1 +lifebymargot.co.uk, 1 lifecism.com, 1 lifecoachkatrien.be, 1 lifecraft.cf, 1 @@ -51458,7 +51249,6 @@ lifemstyle.com, 1 lifenews24.tk, 1 lifenexto.com, 1 lifeqa.net, 1 -lifesafety.com.br, 1 lifesavvy.com, 1 lifesavvymedia.com, 1 lifeset.pp.ua, 1 @@ -51480,14 +51270,15 @@ lifewithdyna.com, 1 lifexpert.tk, 1 lifi.digital, 1 lifi.is, 1 -lift-wise.com, 1 liftie.info, 1 liftmastercloud.com, 1 liftoff.rocks, 1 ligadelconsorcista.org, 1 ligadosgames.com, 1 light-vision.com.ua, 1 +light.blue, 1 light.mail.ru, 1 +lightbluelearning.com, 1 lightbox.co, 1 lightcraftmc.tk, 1 lightdark.xyz, 1 @@ -51537,6 +51328,7 @@ lignite.com, 1 lignoma.com, 1 ligonier.com, 1 lihaul.dnsalias.net, 1 +lihuenjardin.com, 1 lije-creative.com, 1 lijero.co, 1 lijncoaching.nl, 1 @@ -51591,6 +51383,7 @@ liljohnsanitary.net, 1 lille.ml, 1 lillepuu.com, 1 lilliputpreschool.co.nz, 1 +lillyfox.de, 1 lilomatrixcorner.fr, 1 lilosaludable.com, 1 lilpwny.com, 1 @@ -51611,6 +51404,7 @@ limbo-online.tk, 1 limbo.services, 1 lime-host.cf, 1 lime-host.tk, 1 +limecho.net, 1 limehost.com, 1 limit.xyz, 1 limitededitioncomputers.com, 1 @@ -51629,7 +51423,7 @@ limsia.co, 1 limsia.com, 1 limstash.com, 1 limstash.me, 1 -limules.ch, 1 +limules.ch, 0 limx.win, 1 lin.fi, 1 lina-stores.co.uk, 1 @@ -51643,7 +51437,6 @@ lince-bonares.tk, 1 lincnaarzorg.nl, 1 lincoln.com.cn, 1 lincoln.mx, 1 -lincolnboolefoundation.org, 1 lincolncountytn.gov, 1 lincolnfinewines.com, 1 lincolnpedsgroup.com, 1 @@ -51675,12 +51468,10 @@ lineshop.ml, 1 linestep.jp, 1 linfamilygc.com, 1 linge-ma.ro, 1 -lingerie.com.br, 1 lingeriecollect.ga, 1 lingeriesilhouette.com, 1 lingolia.com, 0 lingroove.com, 1 -lingting.vip, 1 linguaromanica.tk, 1 linguatrip.com, 1 linherest.tk, 1 @@ -51796,7 +51587,6 @@ linuxarequipa.tk, 1 linuxbabe.com, 1 linuxbg.eu, 1 linuxbierwanderung.com, 1 -linuxcbt.com, 1 linuxchick.se, 1 linuxcode.net, 1 linuxcommand.ru, 1 @@ -51821,6 +51611,7 @@ linzgau.de, 1 linzyjx.com, 1 lion7.de, 1 lionchita.tk, 1 +lionelsfarm.com, 1 liongueststudios.com, 1 lionhosting.nl, 1 lionland.tk, 1 @@ -51875,6 +51666,7 @@ lishayut-prav.ga, 1 lishayut-prav.gq, 1 lishayut-prav.ml, 1 lishayut-prav.tk, 1 +lishup.com, 1 lisieuxarquitetura.com.br, 1 lisinphotography.com, 1 lisius.ga, 1 @@ -51945,9 +51737,9 @@ littledev.nl, 1 littleduck.xyz, 1 littlefamilyadventure.com, 1 littlegreece.ae, 1 +littleireland.co.uk, 1 littlelife.co.uk, 1 littlelucifercafe.tk, 1 -littlelundgrenladies.com, 1 littlemaster.tk, 1 littlenina.nz, 0 littlenlargeevents.co.uk, 1 @@ -52062,7 +51854,9 @@ living.video, 1 living24.de, 1 livingafrugallife.com, 1 livingforreal.com, 1 +livinghealthywithchocolate.com, 1 livinginhimalone.com, 1 +livinglifesecurely.com, 1 livingmachines.nl, 1 livingspace.co.nz, 1 livingtohearsix.com, 1 @@ -52158,7 +51952,6 @@ lms-luch.ru, 1 lmsptfy.com, 1 lmsuitespagna.it, 1 lmtls.me, 1 -lmtm.eu, 1 lmtravis.com, 1 lmvsci.gov, 1 ln.io, 1 @@ -52244,6 +52037,9 @@ locapos.com, 1 location-appartement-dakar.com, 1 location-fichier-email.com, 1 locationfontaine.fr, 1 +locationkaraokemontreal.com, 1 +locationkaraokeottawa.com, 1 +locationkaraokequebec.com, 1 locationvoitureallemagne.com, 1 locationvoitureangleterre.com, 1 locationvoitureaustralie.com, 1 @@ -52271,14 +52067,10 @@ locker.plus, 1 locker3.com, 1 lockerroomstories.com, 1 lockify.com, 1 -locklock.com.br, 1 -locklockbrasil.com.br, 1 lockme.at, 1 lockme.ch, 1 lockme.de, 1 lockme.pl, 1 -locknlock.com.br, 1 -locknlockbrasil.com.br, 1 lockoutgroup.com, 1 lockpick.nl, 1 lockpicks.se, 1 @@ -52304,7 +52096,6 @@ locksmithfourways24-7.co.za, 1 locksmithfriendswoodtexas.com, 1 locksmithgarland-tx.com, 1 locksmithgermiston24-7.co.za, 1 -locksmithgrapevinetx.com, 1 locksmithhillcrest.co.za, 1 locksmithhumbletx.com, 1 locksmithindurban.co.za, 1 @@ -52332,6 +52123,9 @@ locksmithssanmarcostx.com, 1 locksmithstaffordtx.com, 1 locksmithswestville.com, 1 locksmiththewoodlands.com, 1 +locksmithunit.cat, 1 +locksmithunit.com, 1 +locksmithunit.es, 1 locksport.org.nz, 1 lockwoodchristmastreefarm.com, 1 locomen.me, 1 @@ -52398,6 +52192,7 @@ logitel.de, 1 logitheque.tk, 1 logitrack.tk, 1 logo-vogtland.de, 1 +logodzyn.com, 1 logoesun.com, 1 logoglo.com, 1 logojoes.net, 1 @@ -52411,8 +52206,6 @@ logtalk.org, 1 logtenberg.eu, 1 logue.be, 1 logue.tk, 1 -logze.nl, 1 -lohanaflores.com.br, 1 loheprobado.com, 1 lohkoketju.fi, 1 lohmeier.it, 1 @@ -52425,30 +52218,13 @@ loire-en-bateau.fr, 1 loisircreatif.net, 1 loisirsdouville.com, 1 loja351.com, 0 -lojacriativos.com.br, 1 -lojadamimo.com.br, 1 -lojadanidrea.com.br, 1 -lojadarenda.com.br, 1 -lojadeessencia.com.br, 1 lojadelicatojatai.com.br, 1 -lojadewhisky.com.br, 1 lojadoanime.com, 1 -lojadoarcomprimido.com.br, 1 -lojadoprazer.com.br, 1 lojadosomautomotivo.com.br, 1 -lojafazendoarte.com.br, 1 -lojafilipaper.com.br, 1 lojahunamarcenaria.com.br, 1 lojamagicalx.com, 1 -lojamascate.com.br, 1 -lojamoleco.com.br, 1 lojapos.eu, 1 -lojaprojetoagua.com.br, 1 -lojas25online.com.br, 1 -lojastec.com.br, 1 lojatema.com.br, 1 -lojaterrazul.com.br, 1 -lojavisamed.com.br, 1 lojix.com, 0 lojj.pt, 1 lok.space, 1 @@ -52469,6 +52245,7 @@ loli.net, 1 loli.pet, 1 loli.today, 1 loli.tube, 1 +loli.world, 1 loliblogs.cf, 1 loliblogs.ga, 1 loliblogs.gq, 1 @@ -52495,7 +52272,6 @@ lolnames.gg, 1 lolpatrol.de, 1 lolpatrol.wtf, 1 loma.ml, 1 -lomaem-nsk.ru, 1 lomayko.ml, 1 lombri-agro.com, 1 lomerhouse.com, 1 @@ -52506,7 +52282,6 @@ lomza.tk, 1 lon-so.com, 1 lona.io, 1 lonal.com, 1 -lonasdigital.com, 1 lonavla.tk, 1 lonay.me, 0 london-mafia.tk, 1 @@ -52533,6 +52308,7 @@ lonestarlandandcommercial.com, 1 long-6.com, 1 long-8.com, 1 long-9.com, 1 +long-journey.com, 1 long008.com, 1 long0310.com, 1 long0311.com, 1 @@ -52555,39 +52331,28 @@ long0556.com, 1 long0557.com, 1 long0559.com, 1 long0596.com, 1 -long0598.com, 1 -long0599.com, 1 long0728.com, 1 -long0730.com, 1 long0732.com, 1 long0733.com, 1 long0735.com, 1 long0736.com, 1 long0737.com, 1 -long0738.com, 1 long0739.com, 1 long0755.com, 1 long0756.com, 1 long0768.com, 1 -long0770.com, 1 long0776.com, 1 long0777.com, 1 long0778.com, 1 -long0779.com, 1 -long0798.com, 1 -long0799.com, 1 long08.com, 1 long0812.com, 1 long0816.com, 1 long0818.com, 1 long0833.com, 1 long0855.com, 1 -long0856.com, 1 -long0876.com, 1 long0877.com, 1 long0878.com, 1 long0886.com, 1 -long0887.com, 1 long0888.com, 1 long0896.com, 1 long0897.com, 1 @@ -52658,13 +52423,6 @@ looka.photo, 1 lookagain.co.uk, 1 lookart.ch, 1 lookasik.eu, 1 -lookastic.co.uk, 1 -lookastic.com, 1 -lookastic.de, 1 -lookastic.es, 1 -lookastic.fr, 1 -lookastic.mx, 1 -lookastic.ru, 1 lookatmysco.re, 1 lookbetweenthelines.com, 1 looker.wang, 0 @@ -52676,7 +52434,6 @@ looneymooney.com, 1 looneytunesdashgame.com, 1 loony.info, 0 loonylatke.com, 1 -loopback.kr, 1 loopool.tk, 1 loopower.com, 1 loopstart.org, 1 @@ -52720,6 +52477,7 @@ loritaboegl.de, 1 lorn.tk, 1 lornabenes.com, 1 los-diablos.tk, 1 +losangelesescorts.net, 1 losangelestown.com, 1 losaucas.tk, 1 loschilums.tk, 1 @@ -52770,10 +52528,10 @@ lotos-ag.ch, 1 lotro-wiki.com, 1 lottodatabase.com, 1 lottoland.pt, 1 +lottosonline.com, 1 lottospielen24.org, 0 lotusweb.tk, 1 lotw.de, 1 -lotz.li, 1 lou-castelet.com, 0 lou.ist, 1 lou.lt, 1 @@ -52845,7 +52603,6 @@ lovelive-anime.tk, 1 lovelive.us, 1 lovelivewiki.com, 1 lovelivinghere.co.za, 1 -lovelocalbmore.com, 1 lovelovenavi.jp, 1 loveluna.com, 1 lovelybook4u.gq, 1 @@ -52869,7 +52626,6 @@ loverngifts.com, 1 loverussiangirls.tk, 1 loveskin.co, 1 lovesmagical.com, 0 -lovesove.com, 1 lovessentials.com, 1 lovestar.wang, 0 lovesupremefestival.com, 1 @@ -52904,6 +52660,7 @@ loyaltyondemand.eu, 1 loyisa.cn, 1 lozhka-mernaya.tk, 1 lp-support.nl, 1 +lp177.fr, 1 lpacademy.com.br, 1 lpbk-bethel.de, 0 lpchemicalsolution.tk, 1 @@ -52970,7 +52727,6 @@ lty.space, 1 lu.search.yahoo.com, 0 lual.tk, 1 luan.ma, 1 -luav.org, 1 lubar.me, 1 lubbockyounglawyers.org, 1 lubersacr.com, 1 @@ -52978,7 +52734,7 @@ lubot.net, 1 luc-oberson.ch, 0 luca-steeb.com, 1 luca.swiss, 1 -lucacastelnuovo.nl, 1 +lucacastelnuovo.nl, 0 lucade.ddns.net, 1 lucafontana.net, 1 lucafrancesca.me, 1 @@ -52999,6 +52755,7 @@ lucciolachile.com, 1 luce.life, 1 lucentioluo.space, 1 lucerin.ga, 1 +lucesledsbaratas.shop, 1 luchscheider.de, 0 luchthavenmaastricht.nl, 1 lucia-art.cf, 1 @@ -53081,6 +52838,7 @@ luginbuehl.eu, 1 lugros.tk, 1 lugui.in, 1 luisa-birkner.de, 1 +luisabreu.pt, 1 luisanalopilatogrecia.tk, 1 luisaviles.tk, 1 luiscapelo.info, 1 @@ -53112,7 +52870,6 @@ lukasw.tk, 1 lukaswiden.com, 1 lukasztkacz.com, 1 lukaszuk.net, 1 -lukaszuk.pl, 1 lukaszwojcik.com, 1 lukaszwojcik.net, 1 luke.ch, 1 @@ -53153,6 +52910,7 @@ lumoria.eu, 1 lumpenrock.tk, 1 lumpy.ga, 1 lums.se, 1 +luna-zen.fr, 1 lunademiel.org, 1 lunafag.ru, 1 lunakit.org, 1 @@ -53161,6 +52919,7 @@ lunanova.moe, 1 lunapps.com, 1 lunar6.ch, 0 lunares.pl, 1 +lunaretna.com, 1 lunarflake.com, 1 lunarhost.cf, 1 lunarlog.com, 1 @@ -53235,6 +52994,7 @@ lux-house.tk, 1 luxarchive.tk, 1 luxcraft.eng.br, 1 luxecalendar.com, 1 +luxedentalfl.com, 1 luxemburgsite.tk, 1 luxeturf.com.au, 1 luxfosdecoenterprise.com, 1 @@ -53245,6 +53005,7 @@ luxstil.ga, 1 luxur.is, 1 luxury-inside.vn, 1 luxurydistribution.cz, 1 +luxuryislandtrips.com, 1 luxurynsight.net, 0 luxuryspeed.tk, 1 luxurytimepieces.net, 1 @@ -53266,6 +53027,8 @@ lvee.org, 1 lvftw.com, 1 lvguitars.com, 1 lvmoo.com, 1 +lvna.capital, 1 +lvnacapital.com, 1 lvrsystems.com, 1 lvtrafficticketguy.com, 1 lw-addons.net, 1 @@ -53288,7 +53051,9 @@ lycly.me, 1 lydiawebfans.tk, 1 lydudlejning.net, 1 lyfbits.com, 1 +lyfebotanicals.com, 1 lyftrideestimate.com, 1 +lyhathu.com, 1 lykope.com, 1 lymia.moe, 1 lyna.ml, 1 @@ -53305,6 +53070,7 @@ lynsec.com, 1 lynthium.com, 1 lynx.nl, 1 lynxbroker.de, 1 +lynxlab.io, 1 lynxpro.nl, 1 lynxriskmanager.com, 1 lyon-interactive.com, 1 @@ -53324,8 +53090,6 @@ lysbed.com, 1 lyscnd.com, 1 lysergion.com, 1 lyst.co.uk, 1 -lyteclinic.com, 1 -lytemedical.com, 1 lyubov-sovmestimost.cf, 1 lyuda.tk, 1 lyukaacom.ru, 1 @@ -53429,7 +53193,6 @@ macaroons.tk, 1 macaroonshindig.tk, 1 macautocouture.ga, 1 macaws.org, 1 -macbay.net, 1 macbook.es, 1 macc.org.my, 1 macedonian-hotels.com.mk, 1 @@ -53483,6 +53246,7 @@ macosxfilerecovery.com, 1 macpress.com.br, 1 macramos.co.za, 1 macreosolutions.com, 1 +macrofox.nl, 1 macros.co.jp, 1 macroseo.tk, 1 macrostudent.com, 1 @@ -53575,8 +53339,8 @@ mafiaclan.tk, 1 mafiaclub.ml, 1 mafiaforum.de, 1 mafiapenguin.club, 1 +mafiasi.de, 1 mafworld.com, 1 -magaconnection.com, 1 magadan.gq, 1 magadan.ml, 1 magaria.ml, 1 @@ -53592,7 +53356,6 @@ magazin3513.com, 1 magazin4ik.ga, 1 magazinecards.ga, 1 magazinedabeleza.net, 1 -magazinedotreino.com.br, 1 magazone.ml, 1 magbt.net, 1 magdeburg.directory, 1 @@ -53645,12 +53408,13 @@ magicstay.com, 1 magictable.com, 1 magicvodi.at, 1 magilio.com, 1 +magisterjuris.com, 1 magisternegi.tk, 1 magliner.com, 1 magnacarebroker.com, 1 magnacumlaude.co, 1 +magnamus.it, 1 magnate.co, 1 -magnatronic.com.br, 1 magnes.priv.pl, 1 magnesium-biomed.ch, 1 magnesy-neodymowe.com.pl, 1 @@ -53777,6 +53541,7 @@ mainone.net, 1 mainquest.org, 1 mainston.com, 1 maintenance-traceur-hp.fr, 1 +maintenancemtp.fr, 1 mainzelmaennchen.net, 1 maioresemelhores.com, 1 mairie-sornay.fr, 1 @@ -53798,6 +53563,7 @@ maiti.info, 1 maitrise-orthopedique.com, 1 maitriser-son-stress.com, 1 majahoidja.ee, 1 +majalmirasol.com, 1 majameer.com, 1 majaweb.cz, 1 majemedia.com, 1 @@ -53823,6 +53589,7 @@ makedin.net, 1 makefoodrecipes.com, 1 makeh2o.com, 1 makeit-so.de, 0 +makeitshort.ml, 1 makelinks.online, 1 makemejob.com, 1 makemoney-plan.tk, 1 @@ -53867,6 +53634,7 @@ malahov.tk, 1 malamutedoalasca.com.br, 1 malardalenvvs.se, 1 malariaadvice.gq, 1 +malariabehaviorsurvey.org, 1 malash.me, 0 malasuk.com, 1 malaysia.cf, 1 @@ -53915,9 +53683,7 @@ mall.pl, 1 mall.sk, 1 mallach.net, 1 mallgastronomico.com.ar, 1 -mallhonda.com, 1 mallner.me, 1 -mallonline.com.br, 1 mallpass.ga, 1 malmyzh.tk, 1 malnex.de, 1 @@ -53929,7 +53695,7 @@ malscan.org, 1 malta-firma.com, 1 maltasite.tk, 1 maltaultrastifo.tk, 1 -maltegegner.de, 1 +maltegegner.de, 0 malu.style, 1 malufs.com.br, 1 malvertise.xyz, 1 @@ -54060,6 +53826,7 @@ manicode.com, 1 manicur-salon.tk, 1 manicuradegel.com, 1 manicuradegel.es, 1 +manilacrawl.com, 1 manilaprinciples.org, 1 maniorpedi.com, 1 maniosglass.gr, 1 @@ -54078,6 +53845,7 @@ mannenzang.tk, 1 mannheimbloggt.tk, 1 manns-solutions.co.uk, 1 mannschafft.ch, 1 +manoek.dynu.net, 1 manoirdecontres.com, 1 manojsharan.me, 1 manonamission.de, 1 @@ -54144,6 +53912,7 @@ manyetikboya.com, 1 manyhotfiesta.ml, 1 manyiu.com, 1 manylots.ru, 1 +manyproservices.com, 1 manytubes.ga, 1 manyue.org, 1 maocular.org, 1 @@ -54170,6 +53939,7 @@ maplegate.info, 1 maplehome.tk, 1 mapletime.com, 1 mappingfutures.org, 1 +mappingspaceperu.com, 1 mapresidentielle.fr, 1 mapstack.org, 1 maquena.org, 1 @@ -54192,7 +53962,6 @@ marbree.eu, 1 marbrerie-segur.fr, 1 marc-beninca.fr, 1 marc-hammer.de, 1 -marc-hoffrichter.de, 1 marc-schlagenhauf.de, 1 marcaixala.me, 1 marcanhoury.com, 1 @@ -54271,6 +54040,7 @@ margays.de, 1 margecommunication.com, 0 margo-co.ch, 0 margolis.gq, 1 +margotlondon.co.uk, 1 margots.biz, 1 margots.life, 1 margots.tech, 1 @@ -54304,12 +54074,12 @@ marie-pettenbeck-schule.de, 1 marie.club, 1 mariehane.com, 1 mariejulien.com, 1 +marielouise-oliwkiewicz.nl, 1 marielouise.tk, 1 mariemiramont.fr, 1 mariendistel-tee.de, 1 mariereichl.cz, 1 mariescountymo.gov, 1 -marietrap.ch, 1 marijnfidder.nl, 1 marijuanajobscannabiscareers.com, 1 marikafranke.de, 1 @@ -54343,6 +54113,7 @@ marioberluchi.by, 0 mariogarcia.tk, 1 mariogeckler.de, 0 marioserver.ml, 1 +mariouniversalis.fr, 1 mariposah.ch, 1 marisamorby.com, 0 marisasitaliankitchen.com, 1 @@ -54371,7 +54142,6 @@ markantalyamasajsalonu-bayanmasoz-cim.cf, 1 markantoffice.com, 1 markbiesheuvel.nl, 1 markdain.net, 1 -markel.com.es, 1 markepps.com, 1 market-vanna.ru, 1 market.android.com, 1 @@ -54383,13 +54153,13 @@ marketia.ml, 1 marketindex.com.au, 1 marketing-2.de, 1 marketing-advertising.eu, 1 +marketing1-0-1.com, 1 marketing4trends.com, 1 marketing91.com, 1 marketingbrandingnews.com, 1 marketingbrandingnews.net, 1 marketingco.nl, 1 marketingconcafe.com, 1 -marketingconverts.com, 1 marketingdesignu.cz, 1 marketingforfood.com, 1 marketingpalace.tk, 1 @@ -54406,11 +54176,13 @@ marketplace.org, 1 marketplacestrategy.com, 1 marketsearch.ga, 1 marketvalue.gq, 1 +marketwau.com, 1 marketwingsmobile.com, 1 markf.io, 1 markfisher.photo, 1 markfordelegate.com, 1 -markhaehnel.de, 1 +markhaehnel.de, 0 +markhamfair.ca, 1 markholden.guru, 1 markhoodphoto.com, 1 markhoodwrites.com, 1 @@ -54420,6 +54192,7 @@ markitzeroday.com, 1 markjansen.tk, 1 markkirkforillinois.com, 1 markkirkforsenate.com, 1 +markkusilvennoinen.fi, 1 marklauman.ca, 1 markllego.com, 1 markoglou.com.gr, 1 @@ -54443,7 +54216,7 @@ marktgorman.com, 1 marktguru.at, 1 marktguru.de, 1 markup-ua.com, 1 -markus-blog.de, 0 +markus-blog.de, 1 markus-dev.com, 1 markus-keppeler.de, 1 markus-musiker.de, 1 @@ -54455,6 +54228,7 @@ markusjanzen.de, 1 markusjochim.de, 1 markuskeppeler.de, 1 markuskeppeler.no-ip.biz, 1 +markuslintula.fi, 1 markusritzmann.ch, 1 markusueberallassetmanagement.de, 1 markusueberallconsulting.de, 1 @@ -54487,6 +54261,7 @@ marriage-shrine.jp, 1 marriageawareness.com, 1 marrickvilleapartments.com.au, 1 marron-dietrecipe.com, 1 +marropax.com, 1 mars.army, 1 mars.navy, 1 marsafc.tk, 1 @@ -54547,6 +54322,7 @@ martinvillalba.com.ar, 1 martinvillalba.info, 1 martinvillalba.net, 1 martinvillalba.org, 1 +martinvolenec.cz, 1 martonmihaly.hu, 1 martonveronika.tk, 1 martynhare.co.uk, 1 @@ -54560,6 +54336,7 @@ marvell.cat, 1 marvelmoviemarathon.com, 1 marvelo.cf, 1 marvelousdesigners.com, 1 +marvelweed.ru, 1 marvin.rocks, 1 marvman.me, 1 marvnet.cf, 1 @@ -54667,13 +54444,13 @@ masterdemolitioninc.com, 1 masterdesingweb.tk, 1 masterdigitale.com, 1 masterdrilling.com, 1 +masterin.it, 1 masterkitchen.com.br, 1 mastermindcesar.com, 1 masternetix.ga, 1 masterofallscience.com, 1 masterofbytes.ch, 1 masterpassword.org, 1 -masterpc.co.uk, 1 masterplc.com, 1 masterplumber.coach, 1 masters.black, 1 @@ -54717,7 +54494,6 @@ matel.org, 1 matematikkulubu.tk, 1 matematyka.wiki, 1 materassi.roma.it, 1 -materiaischiquinho.com.br, 1 material-ui.com, 1 material-world-fuyouhin.com, 1 materialism.com, 1 @@ -54725,6 +54501,8 @@ materialyinzynierskie.pl, 1 materiel-grand-format.fr, 1 maternalsafety.org, 1 maternum.com, 1 +mateu.us, 1 +mateusmeyer.com.br, 1 mateuszmajewski.com, 1 mateuszpilszek.pl, 1 matex-tokyo.co.jp, 1 @@ -54784,10 +54562,12 @@ matrimonio.com.pe, 1 matrimonios.cl, 1 matrimonybest.com, 1 matriterie-sdv.ro, 1 +matrix.org, 1 matrixglobalsms.com, 1 matrixim.cc, 1 matrixmedia.ro, 1 matrixreq.com, 1 +matronal.ru, 1 matryoshka-travel.club, 1 matsu-semi.com, 1 matt-brooks.com, 1 @@ -54860,6 +54640,7 @@ mattprojects.com, 1 mattrude.com, 1 matts.wiki, 1 matts.world, 1 +mattshi.com, 1 mattwservices.co.uk, 1 matucloud.de, 1 matuslab.net, 1 @@ -54879,6 +54660,7 @@ maurice-walker.com, 0 mauricedb.nl, 1 mauriceje.ga, 1 mauricio-ochmann.tk, 1 +mauriciodulce.com, 1 mauriciog.com.ar, 0 mauricioghiorzi.com.ar, 0 mauricioquadradoconsultor.com.br, 1 @@ -54907,14 +54689,14 @@ max-phone.com, 0 max-went.pl, 1 max.gov, 1 max00365.com, 1 -max0365.com, 0 +max0365.com, 1 max11365.com, 1 -max1365.com, 0 +max1365.com, 1 max22365.com, 1 max2365.com, 1 max33365.com, 1 max3365.com, 1 -max4365.com, 0 +max4365.com, 1 max44365.com, 1 max5365.com, 1 max55365.com, 1 @@ -55009,11 +54791,10 @@ mayomarquees.com, 1 mayopartyhire.com, 1 mayorcahill.com, 1 mayper.net, 0 -maypolevilla.co.uk, 1 mayre-idol.tk, 1 mayrhofer.eu.org, 0 maysambotros.tk, 1 -maytalkhao.com, 1 +maytinhxachtay.vn, 1 maywoodpark.com, 1 mazartdesign.tk, 1 mazavto.ml, 1 @@ -55065,6 +54846,7 @@ mbsr-barmstedt.de, 1 mbsync4supply.com, 1 mbte365.com, 0 mbtt365.com, 0 +mburaks.com, 1 mburns.duckdns.org, 1 mbusi.com, 1 mbwemmel-usedcars.be, 1 @@ -55168,7 +54950,6 @@ mcuuid.net, 1 mcversions.net, 1 mcvs.net, 1 mcwrapper.com, 1 -mcynews.com, 1 mcyukon.com, 1 md-clinica.com.ua, 1 md-progressistes.fr, 1 @@ -55210,6 +54991,7 @@ mdf-bis.com, 0 mdhosting.co.uk, 1 mdihi.com, 1 mdinashop.com, 1 +mdinstituteplasticsurgery.com, 1 mdinvest.nz, 1 mdir.tk, 1 mdiv.pl, 1 @@ -55224,6 +55006,7 @@ mdpraha.cz, 1 mdrsp.de, 1 mdrthmcs.io, 1 mdsave.com, 1 +mdsconcept.fr, 1 mdsglobal.com, 1 mdtorelli.it, 1 mdwftw.com, 1 @@ -55235,6 +55018,7 @@ me-center.com, 1 me-groups.com, 1 me-news.tk, 1 me-soft.nl, 1 +me.com.br, 1 me.net.nz, 1 me.tc, 1 me.vu, 1 @@ -55250,6 +55034,7 @@ meamod.com, 0 meandb.net, 1 meanevo.com, 1 meangirl.club, 1 +meaningfulaction.org, 1 meany.xyz, 1 meap.xyz, 1 meapbot.com, 1 @@ -55266,6 +55051,7 @@ mebaneattorney.com, 1 mebanesteakhouse.com, 1 mebel-voronezh.cf, 1 mebelshik.tk, 1 +mec000.net, 1 mec010.com, 1 mec020.com, 1 mec021.com, 1 @@ -55565,17 +55351,26 @@ mec0975.com, 1 mec0976.com, 1 mec0977.com, 1 mec0991.com, 1 +mec111.net, 1 +mec222.net, 1 +mec333.net, 1 mec444.com, 1 mec555.com, 1 +mec555.net, 1 +mec666.net, 1 +mec777.net, 1 mec825.com, 1 mec888.com, 1 +mec888.net, 1 mec999.com, 1 +mec999.net, 1 mecanicoautomotriz.org, 1 mecaniquemondor.com, 1 meccano.srl, 1 mechanics-schools.com, 1 mechanixdirect.co.uk, 0 mechanus.io, 1 +mechasdepelo.com, 1 mechaspartans6648.com, 1 mechbattlegrounds.com, 1 mechmk1.me, 1 @@ -55607,7 +55402,6 @@ medasset.gr, 1 medba.se, 1 medbreaker-friends.at, 1 medcartoon.com, 1 -medcir.com.br, 1 medcorfu.gr, 1 medcrowd.com, 1 meddatix.com, 1 @@ -55622,7 +55416,6 @@ medeurope.info, 1 medexpress.co.uk, 1 medguide-bg.com, 1 medhy.fr, 1 -medi.com.br, 1 media-courses.com, 0 media-credit.eu, 1 media-instance.ru, 1 @@ -55645,6 +55438,7 @@ mediafamous.com, 1 mediafart.fr, 1 mediafly.com, 1 mediafocus.biz, 1 +mediaforkids.org, 1 mediagenic.ch, 0 mediagetnews.tk, 1 mediagold.it, 1 @@ -55682,6 +55476,7 @@ medicalauction.ga, 1 medicalcountermeasures.gov, 1 medicalsite.tk, 1 medicaltools.de, 1 +medicano.site, 1 medicare-providers.net, 1 medicarecoveragefinder.com, 1 medicareful.com, 1 @@ -55698,6 +55493,7 @@ medicm.jp, 1 medicocompetente.it, 1 medicoleads.com, 1 medicoresponde.com.br, 1 +medicoway.ru, 1 medicsz.co, 0 medictools.de, 1 medienweite.de, 1 @@ -55710,6 +55506,7 @@ medikuma.com, 1 medinacountyohio.gov, 1 medinc.tk, 1 medino.com, 1 +medinorte.es, 1 medinside.ch, 1 medinside.li, 1 medinsider.ch, 1 @@ -55721,12 +55518,14 @@ meditarenargentina.org, 1 meditateinolympia.org, 1 meditation-rennes.org, 1 meditel.nl, 1 +meditez.ca, 1 meditrak.ml, 1 medium.com, 1 mediums.cf, 1 medivox.tk, 1 mediweed.tk, 1 medja.net, 1 +medklee.com, 1 medlineplus.gov, 1 medo64.com, 1 medovea.ru, 1 @@ -55785,12 +55584,14 @@ medyotan.ga, 1 medzinenews.com, 0 meedoenhartvanwestbrabant.nl, 0 meedoennoordkop.nl, 0 +meekhak.com, 1 meeko.cc, 1 meekru.com, 1 meepbot.net, 1 meepbot.org, 1 meepbot.pro, 1 meeplegamers.com, 0 +meer-der-ideen.de, 1 meeras.ga, 1 meereskunst.de, 1 meerman.nl, 1 @@ -55890,6 +55691,7 @@ mehrnevesht.com, 1 mehrwert.de, 1 meia.ir, 1 meidev.co, 1 +meier-stracke.de, 1 meierhofer.net, 1 meikampf.de, 1 meikan.moe, 1 @@ -56015,10 +55817,9 @@ members-arbourlake.com, 1 members-only-shopping.com, 1 members.nearlyfreespeech.net, 0 membersense.com, 1 -membershipnetworksite.com, 1 membershipservices.org.uk, 1 memberstweets.com, 1 -membrive.net, 1 +membrive.net, 0 memdoc.org, 1 meme.fi, 1 meme.institute, 1 @@ -56051,6 +55852,9 @@ mendel.tk, 1 menden.com, 1 mendipbouncycastles.co.uk, 1 mendozagenevieve.com, 1 +mendrala.eu, 1 +mendrala.io, 1 +mendrala.net, 1 mendy.jp, 1 menfis.es, 1 menfis.info, 1 @@ -56120,7 +55924,6 @@ meran.in, 1 meransuedtirol.com, 1 meraseo.com, 1 mercadohype.tk, 1 -mercadoleal.com.br, 1 mercadolibre.cl, 1 mercadolibre.co.cr, 1 mercadolibre.com.ar, 1 @@ -56155,6 +55958,7 @@ merchant.agency, 1 merchcity.com, 1 mercici.com, 1 mercredifiction.io, 1 +mercury.foundation, 1 mercury.photo, 1 mercuryamericas.com, 0 mercurycards.com, 1 @@ -56163,6 +55967,7 @@ merdacz.pl, 1 meremeti-online.gr, 1 meremobil.dk, 1 merenbach.com, 1 +mereni.cz, 1 merenita.com, 1 merenita.eu, 1 merenita.net, 1 @@ -56172,7 +55977,6 @@ meridanas.me, 1 meridianenvironmental.com, 1 meridiangroup.ml, 1 meridianmetals.com, 1 -meridianoshop.com.br, 1 merikserver.tk, 1 merimatka.fi, 1 merite.cloud, 1 @@ -56200,7 +56004,6 @@ mes10doigts.ovh, 1 mesa.aero, 1 mesabi.ga, 1 mesappros.com, 1 -mesareal.com.br, 1 mescaline.com, 1 mescaline.org, 1 mesec.cz, 1 @@ -56209,6 +56012,7 @@ mesh.org.ua, 1 meshok.info, 1 meshok.ru, 1 meskdeals.com, 1 +meskimonos.fr, 1 meskiukas.tk, 1 mesomeds.com, 1 mesotheliomacentre.tk, 1 @@ -56279,6 +56083,7 @@ metaword.com, 1 metaword.net, 1 metaword.org, 1 metayou.gq, 1 +metdijital.com.tr, 1 metebalci.com, 0 meteenonline.nl, 1 meteo-parc.com, 1 @@ -56318,6 +56123,7 @@ metricmutt.com, 1 metrika.ml, 1 metrix-money-ptc.com, 1 metrix.design, 0 +metro-detroit.com, 1 metro-lawn-care.com, 1 metro-web.net, 1 metroairvirtual.com, 1 @@ -56343,6 +56149,7 @@ metroval.tk, 1 metsasta.com, 1 mettekopp.dk, 1 mettin.org, 1 +metyweb.ga, 1 metz-metropolitain.fr, 1 metzgermark.com, 1 meu-solutions.com, 0 @@ -56458,14 +56265,13 @@ micado-software.com, 1 micah.soy, 1 micalodeal.ch, 0 micamisetaestampada.com, 1 -micaritafeliz.com, 1 micbase.com, 1 -micelius.com, 1 michadenheijer.com, 1 michael-contento.de, 1 michael-glaser.de, 1 michael-rigart.be, 1 michael-schefczyk.de, 1 +michael-schilling.de, 1 michael-steinhauer.eu, 1 michael.band, 1 michaelabbas.tk, 1 @@ -56486,6 +56292,7 @@ michaeljacksonforsale.com, 1 michaeljdennis.com, 1 michaelklos.nl, 1 michaelkorsgill.tk, 1 +michaelkosiba.com, 1 michaelkuchta.me, 1 michaelkuehn.tk, 1 michaell.io, 1 @@ -56558,7 +56365,6 @@ microbiologist.tk, 1 microbiote-insectes-vecteurs.group, 1 microblading.pe, 1 microco.sm, 1 -microcomploja.com.br, 1 microcyber.net, 1 microdesic.com, 1 microdots.de, 1 @@ -56594,9 +56400,11 @@ middletonshoppingcentre.co.uk, 1 middletowndelcopa.gov, 1 mideo.tk, 1 midgawash.com, 1 +midi-coquillages.com, 1 midi-ctes.fr, 1 midia.tk, 1 midiaid.de, 1 +midiarioalcoholico.com, 1 midislandrealty.com, 0 midistop.org, 1 midkam.ca, 1 @@ -56644,6 +56452,7 @@ migrantskillsregister.org.uk, 1 migrations.tk, 1 miguel-platteel.fr, 1 miguel.pw, 1 +miguelcolmenares.com, 1 migueldemoura.com, 1 migueldominguez.ch, 0 miguelgaton.es, 1 @@ -56661,11 +56470,13 @@ mihgroup.eu.org, 1 mihgroup.net, 1 mihnea.net, 1 mihu233.com.cn, 1 +miisy.com, 1 +miisy.eu, 1 +miisy.me, 1 mijam.xyz, 1 mijcorijneveld.nl, 1 mijn-financien.be, 1 mijn.computer, 1 -mijnbeijesweb.nl, 1 mijngeldcoach.nl, 1 mijnkantoor.net, 1 mijnkerstkaarten.be, 1 @@ -56726,6 +56537,7 @@ mikewillia.ms, 1 mikewrites.online, 1 mikewritesstuff.com, 1 mikeybot.com, 1 +mikeyroxtravels.com, 1 mikhirev.ru, 1 mikhlevich.ru, 1 miki-boras.de, 1 @@ -56771,6 +56583,7 @@ milavica.tk, 1 milcahsmusings.com, 1 milcarteles.com, 1 milchbuchstabe.de, 1 +milchweg.com, 1 milehighmaniac.com, 1 mileme.com, 1 milenaria.es, 1 @@ -56779,7 +56592,6 @@ milesdewitt.com, 1 mileyweasel.de, 1 milfpornograph.com, 1 milhistwiki.tk, 1 -milhoazul.com.br, 1 milieuland.com, 1 militaryaviationsafety.gov, 1 militaryconsumer.gov, 1 @@ -56798,6 +56610,7 @@ milktea.info, 0 milkypond.org, 1 mill.ml, 1 millanova.wedding, 0 +millbrookbedandbreakfast.co.uk, 1 milldyke.com, 1 milldyke.nl, 1 millefleurs.eu, 1 @@ -56811,6 +56624,7 @@ millersminibarns.com, 1 millerwalker.com, 1 millettable.com, 1 millhousenchurch.com, 1 +milliarden-liste.de, 1 millibitcoin.jp, 1 millionairessecrets.com, 1 millionen-von-sonnen.de, 1 @@ -56874,6 +56688,7 @@ mindcraft.ga, 1 minddrive.cf, 1 mindercasso.nl, 1 mindfactory.de, 1 +mindfulnessjourney.ca, 1 mindhunter.info, 1 mindjee.tk, 1 mindleaking.org, 1 @@ -56904,6 +56719,7 @@ minecraftforum.ovh, 1 minecraftgoldwar.tk, 1 minecraftjson.com, 0 minecraftjustone.ga, 1 +minecraftrealgold.gq, 1 minecraftrealgold.ml, 1 minecraftruns.ml, 1 minecrafts.gq, 1 @@ -56932,7 +56748,6 @@ minf3-games.de, 1 minfin.gov.ua, 1 mingky.net, 1 mingkyaa.com, 1 -mingming.info, 1 mingram.net, 1 mingtreerealty.com, 1 mingwah.ch, 0 @@ -56977,6 +56792,7 @@ mining.diamonds, 1 miningtronics.com, 0 minirizhi.com, 1 miniskipper.at, 1 +minisoft4u.ir, 1 ministeriumfuerinternet.de, 1 ministryofinternet.eu, 1 minitruckin.net, 1 @@ -57045,13 +56861,13 @@ miraiex.com, 0 miramar-obgyn.com, 1 miramar.ca, 1 mirasmun.tk, 1 +miratechgroup.com, 1 miravelli.ro, 1 miraxe.cf, 1 miraxe.ga, 1 mirazonline.tk, 1 mirazperu.com, 1 mircarfinder.ru, 1 -mirch.com, 1 mirdetaley.tk, 1 mireiaseuba.com, 1 mireillewendling.com.br, 1 @@ -57080,6 +56896,7 @@ mirshak.com, 0 mirtazapine.gq, 1 mirtes.cz, 1 mirtouf.fr, 1 +mirumhongkong.com, 1 mirvolgograda.ml, 1 mirwild.cf, 1 mirwild.gq, 1 @@ -57111,6 +56928,7 @@ missaocadastrobv.com.br, 1 missblisshair.com.au, 1 missdream.org, 1 missevent.pl, 1 +missfuli.com, 1 missguidedus.com, 1 mission-orange.de, 1 missionflare.com, 1 @@ -57122,9 +56940,9 @@ misskey.site, 0 misskey.xyz, 1 missmaid.co.uk, 1 missmaid.com, 1 +misson.ovh, 1 missoy.me, 1 misspoliticsaustralia.cf, 1 -misssex.de, 1 missthetoro.tk, 1 misstika-bijoux.com, 1 misstress.cf, 1 @@ -57149,7 +56967,7 @@ misuzu.moe, 1 mit-dem-rad-zur-arbeit.de, 1 mit-dem-rad-zur-uni.de, 1 mit-uns.org, 1 -mitaines.ch, 1 +mitaines.ch, 0 mitarbeitermotivation-anleitungen.de, 1 mitchellhandymanservices.co.uk, 1 mitchelmore.ca, 1 @@ -57165,7 +56983,6 @@ mitior.net, 1 mitnetz-gas.de, 1 mitnetz-strom.de, 1 mitratech.com.br, 1 -mitrax.com.br, 1 mitre10.com.au, 0 mitrecaasd.org, 1 mitremai.org, 1 @@ -57206,8 +57023,9 @@ mix-channel.ml, 1 mix-recruit.jp, 1 mixedreality.football, 1 mixedrecipe.com, 1 -mixify.ga, 1 +mixify.ga, 0 mixinglight.com, 1 +mixmastermiguel.com, 1 mixmister.com, 1 mixmix.tk, 1 mixposure.com, 1 @@ -57221,13 +57039,13 @@ miyatore.com, 1 miyoshi-kikaku.co.jp, 1 miyoshi-kikaku.com, 0 miyugirls.com, 1 -mizanexpert.com, 1 mizar.im, 0 mizik.cz, 1 mizoey.se, 1 mizque.ch, 1 mizternational.com, 1 mizu.coffee, 1 +mizuasobi.work, 1 mizucoffee.net, 1 mizuhobank.co.id, 1 mizumax.me, 1 @@ -57239,6 +57057,7 @@ mjbulgaria.com, 1 mjdmetal.com, 1 mjec.net, 1 mjforan.com, 1 +mjguo.com, 1 mjjlab.com, 1 mjmedia.co.za, 1 mjniessen.com, 1 @@ -57262,7 +57081,6 @@ mkbouncycastles.co.uk, 1 mkbouncyhire.co.uk, 1 mkcert.org, 1 mkchandler.com, 1 -mkes.com, 1 mkfs.fr, 1 mkg-chirurgie-bruchsal.de, 1 mkg-scherer.de, 1 @@ -57278,6 +57096,7 @@ mklenterprises.com, 1 mklenterprisesacademy.com, 1 mklenterprisescoaching.com, 1 mklpedia.de, 1 +mkm.ee, 1 mkm.szczecin.pl, 1 mkmedien.tk, 1 mknclab.info, 1 @@ -57303,6 +57122,7 @@ mlathrom.com, 1 mlcnfriends.com, 1 mlcrosoftonlline.ml, 1 mlfaw.com, 1 +mlfitnesscenter.com, 1 mlii.net, 1 mllz.com, 1 mlmjam.com, 1 @@ -57351,6 +57171,7 @@ mmmm.mn, 1 mmogah.com, 1 mmoneko.com, 1 mmonit.com, 1 +mmoveisplanejados.com.br, 1 mmpaymentsystem.com, 1 mmphub.com, 1 mmprojects.nl, 1 @@ -57435,6 +57256,7 @@ mobilelooper.com, 1 mobilemedics.com, 1 mobilepartner.tk, 1 mobileread.com, 1 +mobilerhandwerker.de, 1 mobileritelushi.com, 1 mobilesector.de, 1 mobilesnewsworld.ga, 1 @@ -57445,6 +57267,7 @@ mobiletry.com, 1 mobilewikiserver.com, 1 mobilinnov.it, 1 mobilisation-generale.org, 0 +mobilise.solutions, 1 mobility-events.ch, 1 mobilize.us, 1 mobilmobil.co, 1 @@ -57482,18 +57305,17 @@ mochoko.com, 1 mockerel.com, 1 mocking-bird.org, 1 mocknen.net, 1 +mockups.com.co, 1 mococo.co.uk, 1 mod.af, 1 moda-donna.cf, 1 moda-line.ml, 1 -modaexecutiva.com.br, 1 modafo.com, 1 modalogi.com, 1 modalrakyat.com, 1 modanacrho.tk, 1 modav.org, 1 modbom.com.tw, 1 -modcasts.video, 1 modcover.com, 1 modded-minecraft-server-list.com, 1 modderday.com, 1 @@ -57557,7 +57379,6 @@ moebel-vergleichen.com, 1 moebelschreinerei-engelhardt.de, 1 moec.top, 1 moechel.com, 1 -moeclue.com, 1 moecraft.net, 1 moefactory.com, 1 moefi.xyz, 1 @@ -57620,7 +57441,6 @@ mojleksikon.com, 1 mojnet.eu, 1 mojnet.net, 1 mojoco.co.za, 1 -mojomusic.org, 1 mojt.net, 1 mojtabaemadi.com, 1 mojzis.com, 1 @@ -57632,6 +57452,7 @@ mokeedev.review, 1 mokhan.ca, 1 mokhtarmial.com, 1 moki.org.pl, 1 +mokujinken.tokyo, 1 mokum-organics.com, 0 molb.org, 1 moldova-online.ml, 1 @@ -57702,6 +57523,7 @@ monarchpartnersgroup.com, 1 monarcjuexpo.ch, 1 monays.ga, 1 monbudget.org, 0 +moncarnetdesante.fr, 1 moncoach.ch, 0 monde-oriental.tk, 1 mondechenoafrance.tk, 1 @@ -57710,6 +57532,7 @@ mondial-movers.nl, 1 mondo-it.ch, 1 mondocellulari.tk, 1 mondonet.org, 0 +mondsee-psychotherapie.at, 1 mondzorgaanzee.nl, 1 monelephantapois.com, 1 moneni.com, 1 @@ -57745,13 +57568,13 @@ mongolie.net, 1 mongolieenfrance.fr, 1 mongolito.tk, 1 mongooselock.com.ua, 1 +monicahq.com, 1 monicajean.photography, 1 monicapotter.tk, 1 monika.tk, 1 moninformaticien.ovh, 1 moninformaticien.shop, 1 monique.io, 1 -moniquedekermadec.com, 1 moniquemunhoz.com.br, 1 monitman.com, 1 monitman.solutions, 1 @@ -57788,6 +57611,7 @@ monolithindustries.com, 1 monolithinteractive.com, 1 monopoly-one.com, 1 monorail.ga, 1 +monorthopedagogue.ca, 1 monospazzole.roma.it, 1 monothesis.com, 1 monoworks.co.jp, 1 @@ -57831,7 +57655,6 @@ montrain.fr, 1 montrealcatadoptions.com, 1 montredeal.fr, 1 montsaintaignan.fr, 1 -montsearias.com, 1 montychristie.com, 1 monwarez.ovh, 1 monzo.com, 1 @@ -57853,6 +57676,7 @@ moonbot.io, 1 moonboys.de, 1 moonchart.co.uk, 1 moondrop.org, 1 +moondsee.de, 1 moonkin.eu, 1 moonlabs.nl, 1 moonlightcapital.ml, 1 @@ -57890,6 +57714,7 @@ moot-info.co.za, 1 moovablestorage.com, 1 moove-it.com, 1 mooveo.co, 1 +moovhl.com, 1 moparcraft.com, 1 moparcraft.net, 1 moparcraft.org, 1 @@ -57919,6 +57744,7 @@ morbiceramicindustry.com, 1 morbitzer.de, 1 morbius.cz, 1 morbotron.com, 1 +morc.me, 1 morchino.ch, 1 morchstore.com, 1 mordovia.tk, 1 @@ -57969,13 +57795,13 @@ morningtime.cloud, 1 moroccanews.tk, 1 moroccomiami.com, 1 moroccotodaynews.ga, 1 +moromsmile.com, 1 moron-mu.com, 1 morox.top, 1 morozko.gq, 1 morozyaka.tk, 1 morrellllc.com, 0 morris.computer, 1 -morrisby.com, 1 morritosfelices.com, 1 morrowind-finland.tk, 1 morse-ti.net, 1 @@ -58064,9 +57890,9 @@ motodb.co.uk, 1 motodb.eu, 1 motodb.net, 1 motodb.uk, 1 +motoforce.lt, 1 motogb.net, 1 motohell.com, 1 -motojato.com.br, 1 motoland.ml, 1 motomorgen.com, 1 motor-agro.com, 1 @@ -58189,6 +58015,7 @@ mpetroff.net, 1 mpg.ovh, 1 mpgaming.pro, 1 mpgu.tk, 1 +mphold.ru, 1 mphwinkel.nl, 1 mpintaamalabanna.it, 1 mpkrachtig.nl, 1 @@ -58214,12 +58041,12 @@ mr-anderson.org, 1 mr-bills.com, 1 mr-coffee.net, 1 mr-labo.jp, 1 -mr-moulding-knives.com, 1 mr-nachhilfe.de, 1 mr-wolf.nl, 0 mr3.io, 1 mraag.xyz, 1 mrafrohead.com, 1 +mrak.blog, 1 mralonas.cf, 1 mrandmrsparrot.gr, 1 mranimal.tk, 1 @@ -58281,6 +58108,7 @@ mrschristine.com, 1 mrsheep.win, 1 mrsiding.net, 1 mrsk.me, 1 +mrssclaus.ca, 1 mrstat.co.uk, 1 mrston.ml, 1 mrstuudio.ee, 1 @@ -58382,6 +58210,7 @@ mtlconcerts.com, 1 mtltransport.com, 1 mtludlow.co.uk, 1 mtouch.facebook.com, 0 +mtp-services.fr, 1 mtr.md, 1 mtravelers.net, 1 mtrip.com, 1 @@ -58414,6 +58243,7 @@ mudastudio.com, 1 mudbenesov.cz, 1 mudcomplex.ga, 1 mudcrab.us, 0 +mudey.pt, 1 mudgezero.one, 1 mudit.xyz, 0 mueblesemporium.com, 1 @@ -58438,6 +58268,7 @@ muhelheim.com, 1 muhibbulislam.tk, 1 muhlenbergtwppa.gov, 1 muilties.com, 1 +muir.fun, 1 muitoalemdobolo.com.br, 1 mujerfutura.com, 1 muk-kobetsu.com, 1 @@ -58460,7 +58291,6 @@ muloft.com, 1 multi-fruit.tk, 1 multi-tool.ml, 1 multibit.org, 1 -multibomasm.com.br, 1 multiclinicacardio.com.br, 1 multicomhost.com, 1 multicore.cl, 1 @@ -58517,13 +58347,11 @@ munch.me, 1 munchcorp.com, 1 mundismart.com, 1 mundo-otaku.tk, 1 -mundoarabe.com.br, 1 mundoconejos.com, 1 mundodapoesia.com, 1 mundodasmensagens.com, 1 mundofoto.tk, 1 mundogamers.top, 1 -mundokinderland.com.br, 1 mundolarraz.es, 1 mundomagicotv.com, 1 mundoperros.es, 1 @@ -58531,12 +58359,12 @@ mundosteampunk.club, 1 mundosuiri.ml, 1 mundotortugas.com, 1 mundschenk.at, 1 -mundtec.com.br, 1 munduch.cz, 1 munduch.eu, 1 muneni.co.za, 1 munera.ca, 1 munfordtn.gov, 1 +munialajuela.go.cr, 1 munich-eventlocations.de, 1 munirajiwa.com, 1 munivice.gob.pe, 1 @@ -58546,7 +58374,7 @@ muntproever.nl, 1 munwr.com, 1 munzlocal10.org.nz, 1 muoivancauhoivisao.com, 1 -muot.tv, 0 +muot.tv, 1 mup-republicanos.tk, 1 muqu.co, 1 mur-vegetal-interieur.fr, 1 @@ -58568,8 +58396,8 @@ murmansk.cf, 1 murmanskforum24x7.tk, 1 murmashi.ru, 1 murmu.re, 1 -murof.com.br, 1 murphy-law.net.ru, 1 +murphycraftbeerfest.com, 1 murray.xyz, 1 murraya.cn, 1 murraycoin.org, 1 @@ -58592,6 +58420,7 @@ musearchengine.com, 1 museclef.com, 1 musedash.moe, 1 musehelix.com, 1 +museloveurania.com, 1 museodelistmo.tk, 1 muserver.io, 1 muses-success.info, 1 @@ -58605,6 +58434,7 @@ mushman.tk, 1 music-is-my-life.de, 1 music-privilege.fr, 1 music-project.eu, 1 +music-store-download.com, 1 music-world.pl, 1 music.amazon.com, 1 musica.com, 1 @@ -58626,6 +58456,7 @@ musicindustrydb.org, 1 musicinsiderdigest.com, 1 musickhouseleveling.com, 1 musiclenta.tk, 1 +musicnotesroom.com, 1 musicompare.com, 1 musicradio.ga, 1 musicrainbow.tk, 1 @@ -58655,6 +58486,7 @@ musketonhaken.nl, 0 muskokavoltz.ca, 1 muskuratimorning.tk, 1 muslim.singles, 1 +muslimah.boutique, 1 muslimbanter.co.za, 1 muslimsoul.cf, 1 musmann.io, 1 @@ -58680,7 +58512,6 @@ mutuals.cool, 1 mutuelle.fr, 1 muuglu.es, 1 muunnin.net, 1 -muurlingoogzorg.nl, 1 muusika.fun, 1 muwatenraqamy.org, 1 muy.ooo, 1 @@ -58702,6 +58533,7 @@ mvbug.com, 1 mvccp.co.za, 1 mvisioncorp.com, 1 mvistatic.com, 1 +mvmm.fr, 1 mvno.io, 1 mvorisek.com, 1 mvorisek.cz, 1 @@ -58729,7 +58561,6 @@ mx.search.yahoo.com, 0 mx5international.com, 1 mxawei.cn, 1 mxbids.com, 1 -mxcrs.com, 1 mxdanggui.org, 1 mxdvl.com, 1 mxes.net, 1 @@ -58781,7 +58612,7 @@ myactivity.google.com, 1 myadpost.com, 1 myaggic.com, 1 myalliancechurch.com, 1 -myamend.com, 0 +myamend.com, 1 myamihealth.com, 1 myamity.info, 1 myammo.com, 1 @@ -58791,7 +58622,6 @@ myanimelist.net, 1 myapexcard.com, 1 myarcade.org, 1 myartsjournal.com, 1 -mybagofcoffee.com, 1 mybakkupakku.com, 1 mybarcelona.tk, 1 mybasementdoctor.com, 1 @@ -58830,6 +58660,7 @@ mycard.moe, 1 mycareersfuture.sg, 1 mycarinsurance123.com, 1 mycarwashers.com, 1 +mycbils.uk, 1 mycc.be, 1 mychamberlain.co.nz, 1 mychamberlain.com, 1 @@ -58846,6 +58677,9 @@ myclinicalstudybuddy.com, 1 myclon.tk, 1 mycloud-system.com, 1 mycloudbits.me, 1 +mycloudhome.site, 1 +mycloudhome.top, 1 +mycloudhome.xyz, 1 mycloudsaas.com, 1 mycodes.com.au, 1 mycofairtrade.com, 0 @@ -59054,7 +58888,6 @@ mymanagement.ml, 1 mymartinbeckeropenhab.de, 1 mymb.pm, 1 mymedia.gotdns.com, 1 -mymedz.nl, 1 mymerlin.co.nz, 1 mymerlin.com.au, 1 mymixtapez.com, 1 @@ -59082,7 +58915,6 @@ mynetworkingbuddy.com, 1 mynewsspot.com, 1 mynext.events, 1 mynextmove.org, 1 -mynn.io, 1 mynook.info, 1 mynovus.de, 1 myoddlittleworld.com, 1 @@ -59113,7 +58945,6 @@ myparfumerie.at, 0 mypartnernews.com, 1 mypartybynoelia.es, 1 mypay.fr, 1 -mypayoffloan.com, 1 mypcb.tk, 1 mypenza.tk, 1 myperfecthome.ca, 1 @@ -59210,6 +59041,7 @@ myresidence.de, 1 myrevery.com, 1 myreviews.ga, 1 myrewardspoints.com, 1 +myriadlex.com.tw, 1 myriadof.com, 1 myrig.com, 1 myrig.io, 1 @@ -59275,6 +59107,7 @@ mystudy.me, 1 mystudycart.com, 1 mystudymap.tk, 1 mysupplements.ga, 1 +myswimmingclub.uk, 1 myswissmailaddress.com, 0 mytc.fr, 1 myte.ch, 1 @@ -59306,7 +59139,6 @@ mytuleap.com, 1 mytun.com, 1 mytuzla.tk, 1 mytweeps.com, 1 -myunicornshops.com, 1 myunox.com, 1 myupdatestar.com, 1 myupdatestudio.com, 1 @@ -59314,7 +59146,6 @@ myupdatesystems.com, 1 myusagepayments.com, 1 myvacompany.com, 1 myvalleymarketing.com, 1 -myvegan.menu, 1 myvirtualserver.com, 1 myvitalhealthsolutions.com.au, 1 myvoipnews.com, 0 @@ -59333,6 +59164,7 @@ mywebpharmacy.tk, 1 mywebserver.ml, 1 myweddingreceptionideas.com, 1 myweightlosstips.tk, 1 +mywestondental.com, 1 mywetpussycams.com, 1 mywindscreen.my, 1 mywiwe.com.au, 1 @@ -59372,10 +59204,12 @@ n16.co, 0 n26.com, 1 n29.co, 0 n2diving.net, 1 +n2ray.xyz, 1 n30365.com, 1 n36533.com, 1 n36594.com, 1 n37.co, 0 +n3oxid.fr, 1 n3rd0rama.tk, 1 n3twork.net, 1 n4v.eu, 1 @@ -59466,7 +59300,6 @@ nagb.gov, 1 nagb.org, 1 nagel-dentaltechnik.de, 1 nageler.org, 1 -nagelfam.com, 1 naggie.net, 1 nagoonline.com, 1 nah.nz, 1 @@ -59542,7 +59375,6 @@ namaanakperempuan.net, 1 namacindia.com, 1 namaleaks.com, 0 namalelaki.com, 1 -namamala.com, 1 namaperempuan.com, 1 namazon.org, 1 namazvakitleri.com.tr, 1 @@ -59563,6 +59395,7 @@ nami.exchange, 1 nami.trade, 1 namikawatetsuji.jp, 1 naminam.de, 1 +namisens.de, 1 namrs.net, 1 namskra.is, 1 namu.games, 1 @@ -59710,6 +59543,7 @@ nasosvdom.com.ua, 1 nasr.mobi, 1 nasrabady.tk, 1 nasrsolar.com, 1 +nasserver-test.de, 0 nassi.me, 1 nast.tk, 1 nastrojka-pianino.spb.ru, 1 @@ -59731,6 +59565,7 @@ natariusadvokat.ga, 1 natasa-theodoridou.tk, 1 natasabekvalac.tk, 1 natasasavija.tk, 1 +nataschaskraamzorg.nl, 1 natashki.tk, 1 natasjaversantvoort.nl, 1 natation-nsh.com, 0 @@ -59806,6 +59641,7 @@ naturaleza.com.ar, 1 naturalezafengshui.com, 1 naturalfit.co.uk, 1 naturalkitchen.co.uk, 1 +naturallyvegan.de, 1 naturalspacesdomes.com, 1 naturaum.de, 1 nature-et-bio.fr, 1 @@ -59818,18 +59654,15 @@ natureshive.org, 1 naturesorganichaven.com, 1 naturheilpraxis-grauer.de, 1 naturheilpraxis-oida.de, 1 -naturheilpraxis-orlowsky.de, 1 naturheilpraxis-p-grote.de, 1 naturliga.tk, 1 naturline.com, 1 naturtint.co.uk, 1 -natusvita.com.br, 1 natuterra.com.br, 1 natuurlijk.tk, 1 natverkstekniker.se, 1 naude.co, 1 naufalpanjwani.com, 1 -naughton.ie, 1 naughty.audio, 1 nauris.fi, 1 nausicaahotel.it, 1 @@ -59901,11 +59734,11 @@ nbis.gov, 1 nbl.org.tw, 1 nbm.gov, 1 nbnnetwork.com, 1 -nbook.org, 1 nbrain.de, 1 nbrii.com, 1 nbriresearch.com, 1 nbrown.us, 1 +nbsgames.at, 1 nc-beautypro.fr, 1 nc-formation.fr, 1 nc-network.io, 1 @@ -59914,7 +59747,6 @@ nca.ink, 1 ncamarquee.co.uk, 1 ncands.net, 1 ncarmine.com, 1 -ncascade.com, 1 ncc-efm.com, 1 ncc-efm.org, 1 ncc-qualityandsafety.org, 1 @@ -59971,6 +59803,8 @@ neartothesky.com, 1 neasahourigan.com, 0 neat-patch.de, 1 neatlife.co.uk, 1 +neatnestsdesign.com, 1 +neatnestsorganizing.com, 1 neatous.cz, 1 neatous.net, 1 neave.tv, 1 @@ -59992,11 +59826,12 @@ nebuso.com, 1 necessaryandproportionate.net, 1 necessaryandproportionate.org, 1 neckbeard.xyz, 1 +necord.com, 1 necormansir.com, 1 necromantia.tk, 1 necsol.ru, 1 -nectardigit.com, 1 nectarleaf.com, 1 +nectere.ca, 1 nectir-staging.com, 1 nectir.co, 1 nedcdata.org, 1 @@ -60040,8 +59875,8 @@ negai.moe, 0 negativecurvature.net, 1 negativeentropy.org, 1 negativex.gq, 1 -neglecteddiseases.gov, 1 negocios-imatore.com, 1 +negociosurbanos.net, 1 negoya-shokai.info, 1 negril.com, 1 nehalem.gov, 1 @@ -60068,6 +59903,7 @@ neio.uk, 1 nejenpneu.cz, 1 nejlevnejsi-parapety.cz, 1 nejmaklerka.cz, 1 +nejrecept.cz, 1 neko-nyan-nuko.com, 1 neko-nyan.org, 1 neko.am, 1 @@ -60099,7 +59935,6 @@ nemagiya.tk, 1 nemcd.com, 1 nemecl.eu, 1 nemez.net, 1 -nemhaisan.com, 1 nemiroth.net, 1 nemirow.tk, 1 nemkoff.tk, 1 @@ -60153,7 +59988,6 @@ neowa.tk, 1 neowin.net, 1 neowlan.net, 1 neoxcrf.com, 1 -neoz.com.br, 1 nepal-evolution.org, 1 nepal.ga, 1 nepali-fonts.tk, 1 @@ -60280,11 +60114,9 @@ nethunter.top, 1 netica.fr, 0 netki.com, 1 netkigestioncomercial.com, 1 -netlentes.com.br, 1 netlevel.ga, 1 netliste.com, 1 netlocal.ru, 1 -netmagicas.com.br, 1 netmania.tk, 1 netmeister.org, 1 netmouse.tk, 1 @@ -60326,6 +60158,7 @@ netsphere.cloud, 1 netsphere.cz, 1 netsplit.fr, 1 netsyms.com, 1 +netsys.com.tr, 1 netsystems.pro, 1 nettamente.com, 1 nette.org, 1 @@ -60370,6 +60203,7 @@ networkmidlands.uk, 1 networkmon.net, 1 networkofarts.com, 1 networkposting.com, 1 +networkprosecurity.net, 1 networksolutionsconsultant.com, 1 networktools.tk, 1 networkuser.de, 1 @@ -60381,7 +60215,6 @@ netzer.ml, 1 netzfabrik.com, 1 netzfrauen.org, 1 netzklad.de, 1 -netzona.org, 1 netzspielplatz.de, 0 netzwerk-lq.com, 1 netzwerkwerk.de, 1 @@ -60497,8 +60330,8 @@ newguidance.ch, 0 newhamyoungbloods.co.uk, 0 newhomedesign.tk, 1 newhopeofindiana.org, 1 +newikis.com, 1 newillusion.tk, 1 -newimage.io, 1 newind.info, 1 newinf.at, 1 newinternet.media, 1 @@ -60507,7 +60340,6 @@ newjianzhi.com, 1 newknd.com, 1 newlegalsteroid.com, 1 newlifehempoil.com, 1 -newline.online, 1 newlovers.ga, 1 newlovers.gq, 1 newlynamed.com, 1 @@ -60515,7 +60347,6 @@ newlytricks.ml, 1 newmall.org, 1 newmanwebsolutions.com, 1 newmarketbouncycastlehire.co.uk, 1 -newmed.com.br, 1 newmediaone.net, 1 newmovements.net, 1 newmusicjackson.org, 1 @@ -60562,6 +60393,7 @@ newsforyou.cf, 1 newsgroups.io, 1 newsheaders.net, 1 newshell.it, 1 +newshour.media, 1 newsinformer.ga, 1 newsinkansas.ml, 1 newsinpolitics.ga, 1 @@ -60685,7 +60517,6 @@ nfls.io, 1 nflsic.org, 1 nfltshirt.com, 1 nfluence.org, 1 -nfpors.gov, 1 nframe.io, 1 nfrost.me, 1 nfsec.pl, 1 @@ -60724,6 +60555,7 @@ nhakhoabella.com, 0 nhakhoangocanh.net, 1 nhanlucnhatban.com, 1 nhaoi.com, 1 +nhasicuibap.com, 1 nhatrang.tk, 1 nhbp-nsn.gov, 1 nhccnews.org, 1 @@ -60747,6 +60579,7 @@ niagarafalls.ca, 1 niagarafallsmuseums.ca, 1 niagaraschoice.org, 1 niallator.com, 1 +nianubo.net, 1 nibb13.tech, 0 nibletllc.com, 1 nibo.blog, 1 @@ -60795,6 +60628,7 @@ nic.xn--q9jyb4c, 1 nic.youtube, 1 nic.zip, 1 nic199.ru, 1 +nicaieri.ro, 1 nicapollo.com, 1 nicastrosalvatore.tk, 1 nicat.cf, 1 @@ -60821,6 +60655,7 @@ nicht-blau.de, 1 nichteinschalten.de, 0 nichthelfer.de, 1 nicic.gov, 1 +niciunde.ro, 1 nick-slowinski.de, 1 nickcleans.co.uk, 1 nickcraver.com, 1 @@ -60836,8 +60671,8 @@ nickloose.de, 1 nicklord.com, 1 nickmandler.tk, 1 nickmchardy.com, 1 -nickmorri.com, 1 -nickmorris.name, 1 +nickmorri.com, 0 +nickmorris.name, 0 nickplotnek.co.uk, 1 nickrickard.co.uk, 1 nicks-autos.com, 1 @@ -61009,6 +60844,7 @@ nimfomanki.tk, 1 nimidam.com, 1 nimus.tk, 1 nina-woerz.tk, 1 +ninaafenehjelm.com, 1 ninaforever.com, 1 ninaundandre.de, 1 ninchat.com, 1 @@ -61082,6 +60918,7 @@ nitrous-networks.com, 1 nitschinger.at, 1 nitter.net, 1 niumactive.it, 1 +nivalandemarit.fi, 1 nivarussia.ml, 1 nivelul2.ro, 1 nivoit.cf, 1 @@ -61108,6 +60945,7 @@ nja.id.au, 1 njast.net, 1 njcareers.org, 1 njguardtraining.com, 1 +njhq.org, 1 njilc.com, 1 njpjanssen.nl, 1 nkapliev.org, 1 @@ -61133,12 +60971,10 @@ nlagstage.in, 1 nlap.ca, 0 nlc-business.com, 1 nlc.org.au, 1 -nlegall.fr, 1 nllboard.co.uk, 1 nlleisure.co.uk, 1 nlm.gov, 1 nlpdiscovery.ro, 1 -nlt.by, 0 nmb.gov, 1 nmbtz.com, 1 nmd.so, 1 @@ -61171,14 +61007,15 @@ no-terrorism.tk, 1 no-war-on-iraq.tk, 1 no-xice.com, 0 no.search.yahoo.com, 0 +no9vip.com, 1 noagendahr.org, 1 noah-witt.com, 1 -noahenco.nl, 1 noahjacobson.com, 1 noahmodas.com.br, 1 noahsaso.com, 1 noahwitt.me, 1 noart.tk, 1 +noatec.eu, 1 nob.ro, 1 nobilefoods.com, 1 nobledust.com, 1 @@ -61224,6 +61061,9 @@ nofrillsdns.com, 1 noga4you.de, 1 nogerondier.eu, 1 nogetime.com, 1 +nogfw.org, 1 +nogfw.pro, 1 +nogfwsite.com, 1 noglobalwarrants.org, 1 nogradhont.hu, 1 nohats.ca, 1 @@ -61265,6 +61105,7 @@ nomadichome.com, 1 nomadichome.org, 1 nomadichomes.com, 1 nomadichomes.org, 1 +nomadicrootsco.com, 1 nomadproject.io, 0 nomagic.software, 1 nomaster.cc, 1 @@ -61273,6 +61114,7 @@ nomesbiblicos.com, 1 nomial.co.uk, 1 nomifensine.com, 1 nomik.xyz, 1 +nomo.my, 1 nomoondev.azurewebsites.net, 1 nomsing.tk, 1 nomsy.net, 1 @@ -61367,6 +61209,7 @@ normankranich.de, 1 normansolutions.co.uk, 1 normantobar.com, 1 normapro.es, 1 +normco.re, 1 norml.fr, 1 noroshi-burger.com, 1 norrisautomotiveinc.com, 1 @@ -61396,7 +61239,6 @@ northern-lakes.com, 1 northerngate.net, 1 northernhamsterclub.com, 1 northernmuscle.ca, 1 -northernpage.com, 1 northernpowertrain.com, 1 northernselfstorage.co.za, 1 northfieldyarn.com, 1 @@ -61409,6 +61251,7 @@ northpost.is, 1 northridgeelectrical.com, 1 northrose.net, 1 northscottsdaleloan.com, 1 +northstate.net, 1 northtek.tk, 1 northtexasvasectomy.com, 1 northumbriagames.co.uk, 1 @@ -61451,7 +61294,6 @@ not-equal.me, 1 not4me.ga, 1 nota-web.com, 1 nota.moe, 1 -notablepeeps.com, 1 notabug.org, 1 notacooldomain.com, 1 notadd.store, 1 @@ -61539,7 +61381,6 @@ novanetwork.ml, 1 novascan.net, 1 novasprint.tk, 1 novawatch.de, 1 -novawave.ca, 1 nove.city, 1 noveciti.com, 1 novecity.cloud, 1 @@ -61621,19 +61462,18 @@ noydeen.com, 1 noyocenter.org, 1 noypark.top, 1 nozel.gq, 1 +nozier.com, 1 np-edv.at, 1 np.search.yahoo.com, 0 np39.de, 1 npaccel.com, 1 npath.de, 1 npc.org.au, 1 -npchosting.com, 1 npcrcss.org, 1 npdigital.com, 1 nphrm.com, 1 npmcdn.com, 1 npod.me, 1 -npool.org, 1 npregion.org, 1 npsas.org, 1 nptn.tk, 1 @@ -61785,8 +61625,10 @@ numero1.ch, 0 numerologist.com, 1 numerouno.ml, 1 numis.tech, 1 -numismatica.info.ve, 1 +numismatica.info.ve, 0 numismed-seniorcare.de, 1 +numista.com, 1 +numit.com.au, 1 numo.co, 1 numwave.nl, 1 nunesgh.com, 1 @@ -61817,7 +61659,6 @@ nursemom.ca, 1 nurseregistry.com, 1 nurses.dating, 1 nursingschool.network, 1 -nuryahan.com.br, 1 nusaceningan.io, 1 nusantaratv.com, 1 nusatrip-api.com, 1 @@ -61833,7 +61674,6 @@ nutleyef.org, 1 nutpanda.com, 1 nutra-creations.com, 1 nutradian.com, 1 -nutrafitsuplementos.com.br, 1 nutralivbio.com, 1 nutrashop.fr, 1 nutri-spec.me, 1 @@ -61851,7 +61691,6 @@ nutritious.cf, 1 nutrizionista.roma.it, 1 nuva.hu, 1 nuvechtdal.nl, 1 -nuverabusiness.com, 1 nuveratechtrends.com, 1 nuvini.com, 1 nuxer.fr, 1 @@ -61899,6 +61738,7 @@ nya.as, 1 nyaa.am, 1 nyadora.com, 1 nyadora.moe, 1 +nyamulab.net, 1 nyan.it, 1 nyan.kim, 1 nyan.stream, 1 @@ -62026,11 +61866,9 @@ oakshield.nl, 1 oakslighting.co.uk, 1 oaktree-realtors.com, 1 oakwood-park.tk, 1 -oanalista.com.br, 1 oasiristorantebagno.it, 1 oasis-conference.org.nz, 0 oasis9.net, 1 -oasisdabeleza.com.br, 1 oasisim.net, 0 oasisorthodontics.com.au, 1 oatmealdome.me, 1 @@ -62083,9 +61921,7 @@ obocat.tk, 1 oboeta.com, 1 obomne.tk, 1 obozrevatel.tk, 1 -obra.com.br, 1 obrabotka-zakazow.tk, 1 -obrienswine.ie, 1 obrobka-zdjec.pl, 1 obs.group, 1 obscur.us, 1 @@ -62216,8 +62052,10 @@ odhosc.ca, 1 odinraz.ga, 1 odinseye.net, 1 odnostranichnik.tk, 1 +odo-pro.ru, 1 odolbeau.fr, 1 odontologia-online.com, 1 +odontologiawilliampizarro.com, 1 odoo.co.th, 1 odosblog.de, 1 odpikedoslike.com, 1 @@ -62228,6 +62066,7 @@ odyssey44.com, 1 odysseyofthemind.eu, 1 odysseytraining.com.au, 1 odzyskaniedomeny.pl, 1 +odzywianie.info.pl, 1 oe-boston.com, 1 oe0fcdncxjpdd05b.myfritz.net, 1 oe2018.gov.pt, 1 @@ -62248,7 +62087,7 @@ oemwolf.com, 1 oenings.eu, 1 oepsbanaan.nl, 1 oessi.eu, 1 -of2m.fr, 1 +oetzies-quiz.com, 1 ofcampuslausanne.ch, 0 ofda.gov, 1 ofertasadsl.com, 1 @@ -62306,7 +62145,7 @@ ofggolf.com, 1 ofileo.fr, 1 ofisescort.tk, 1 oflow.me, 1 -ofo.moe, 1 +ofo.moe, 0 oformit-zajm-kruglosutochno.ga, 1 oformlaj.ga, 1 ofrion.lu, 1 @@ -62325,6 +62164,7 @@ oglen.ca, 1 ognemet.net, 1 ognyan.tk, 1 ogo-knigi.ml, 1 +ogocare.com, 1 ogogo-knigi.ml, 1 ogorod-money.tk, 1 ogretmenimsanat.com, 1 @@ -62389,9 +62229,7 @@ oisd.nl, 1 oiseaux-mania.com, 1 oita-homes.com, 1 ojaioliveoil.com, 1 -ojdip.net, 1 ojeremy.com, 1 -ojojz.com, 1 ojomovies.com, 1 ojp.gov, 1 ok-ex.io, 1 @@ -62417,7 +62255,6 @@ okburrito.com, 1 okcasino.ga, 1 okchousebuyer.com, 1 okeeferanch.ca, 1 -okewp.com, 1 okhanvatansever.tk, 1 okhrana.agency, 1 okib.ca, 1 @@ -62462,6 +62299,7 @@ okusiassociates.com, 1 okviz.com, 1 okweb.mx, 1 okwu.cz, 1 +ola-xyma.com, 1 olafnorge.de, 1 olafvantol.nl, 1 olafwalther.de, 1 @@ -62513,10 +62351,11 @@ olegon.ru, 1 olegrpg.in.ua, 1 olegs.be, 1 oleksii.name, 1 +olenergie.com, 1 olenergie.fr, 1 olenergies.eu, 1 olenergies.fr, 1 -oleodecopayba.com.br, 1 +oleron.fr, 1 oles-hundehaus.de, 1 olesaindustrial.cat, 1 olesaradio.tk, 1 @@ -62639,8 +62478,9 @@ omniaclubs.com, 1 omniasig.ro, 1 omniasl.com, 1 omniatv.com, 1 -omnibnk.cl, 1 +omniballot.us, 1 omnibot.tv, 1 +omnicourt.jp, 1 omnienviro.com, 0 omnienviro.com.au, 0 omnifurgone.it, 1 @@ -62649,7 +62489,7 @@ omnigon.network, 1 omnimoto.it, 1 omniscimus.net, 0 omnisiens.se, 1 -omnisinal.pt, 1 +omnisinal.pt, 0 omniteck.com, 1 omniverse.ru, 1 omny.info, 1 @@ -62665,6 +62505,8 @@ omsknews.tk, 1 omskrock.com, 1 omskweb.tk, 1 omtleden.nl, 1 +omveda.org, 1 +on-air.today, 1 on-targettrainingcourses.com, 1 on-tech.co.uk, 1 on-the-wave.com, 1 @@ -62837,7 +62679,6 @@ onlinedivorce.com, 1 onlinefashion.it, 1 onlinegamesforgirls.tk, 1 onlinehaircuts.com, 1 -onlinehashfollow.com, 1 onlineinfographic.com, 1 onlinekmc.com, 1 onlineknighki.ga, 1 @@ -62884,6 +62725,7 @@ onlylibya.com, 1 onlylithiumhere.gq, 1 onlylovastatin.gq, 1 onlysim.nl, 1 +onlyssd.com, 1 onlyveg.tk, 1 onmaps.de, 1 onmarketbookbuilds.com, 1 @@ -62912,7 +62754,6 @@ ontariocountyny.gov, 1 ontdekhetzelf.nu, 1 onthe.network, 1 ontheballbuilding.com.au, 1 -onthebriteside.com, 1 onthecheap.store, 1 onthegosystems.com, 1 onthehook.ru, 1 @@ -63022,6 +62863,7 @@ openclub24.ru, 1 opencluster.at, 1 openconf.uk, 1 openconnect.com.au, 1 +opencovidpledge.org, 1 opencpes.com, 1 opencpes.info, 1 opencpes.io, 1 @@ -63081,7 +62923,6 @@ opensourcex.tk, 1 openspa.webhop.info, 1 openssl.org, 1 openstackid.org, 1 -openstakes.com, 1 openstandia.jp, 1 openstem.com.au, 1 openstreetmap.is, 1 @@ -63182,6 +63023,7 @@ optimisedlabs.co.uk, 1 optimisedlabs.info, 1 optimisedlabs.net, 1 optimisedlabs.uk, 1 +optimism.ru, 1 optimist.bg, 1 optimize-jpg.com, 1 optimizedlabs.co.uk, 1 @@ -63189,6 +63031,7 @@ optimizedlabs.info, 1 optimizedlabs.net, 1 optimizedlabs.uk, 1 optimo.com.tr, 1 +optimumterapia.pl, 1 optimumwebdesigns.com, 1 optimus.io, 1 optimuscrime.net, 1 @@ -63231,6 +63074,7 @@ orangtua.tk, 1 orangutan-appeal.org.uk, 1 orangutan.org, 1 oranjee.net, 0 +orano.vn, 1 oratto.co.uk, 1 orbeimaginario.com, 1 orbisbi.com, 1 @@ -63359,6 +63203,7 @@ orthodoxy.lt, 0 orthograph.ch, 1 orthopedic-shoes.tk, 1 orthopedicsalon.tk, 1 +orthosportiv.de, 1 orthotictransfers.com, 1 ortizmario.com, 1 ortlepp.eu, 1 @@ -63462,7 +63307,6 @@ oswbouncycastles.co.uk, 1 oszri.hu, 1 ot-vinta.tk, 1 ota365.com, 1 -otakubox.de, 1 otakuie.tk, 1 otakunopaw.net, 1 otakurepublic.com, 1 @@ -63479,13 +63323,13 @@ otg-drives.tk, 1 other98.com, 1 otherkinforum.com, 1 otherlandlabs.com, 1 -oticasaopaulo.com.br, 1 oticasvisao.net.br, 1 otinane.eu, 1 otisko.com, 1 otiumtech.com, 1 otixz.com, 1 otocenterfelix.com.br, 1 +otokirala.com, 1 otokiralama.name.tr, 1 otoma.tk, 1 otomania.tk, 1 @@ -63522,7 +63366,7 @@ ouattara.ch, 1 ouestfrance-auto.pro, 1 ouestsolutions.com, 1 ouglor.com, 1 -ouin.land, 1 +ouin.land, 0 oulunjujutsu.com, 1 ounage.de, 1 ouowo.gq, 1 @@ -63550,12 +63394,14 @@ ourmemoriesonline.com, 1 ournewsindia.ga, 1 ourocg.cn, 1 ouruglyfood.com, 1 +ourwits.com, 1 ourworldindata.org, 1 ourworldspeaks.com, 1 oussoren-vinetomatoes.com, 1 out-of-england.cf, 1 out-of-scope.de, 1 outdoorfurniture.ie, 1 +outdoorhaber.com, 1 outdoorimagingportal.com, 1 outdoorlightingagoura.com, 1 outdoorlightingagourahills.com, 1 @@ -63601,6 +63447,7 @@ outstack.vote, 1 outstandingpromotion.com, 1 outurnate.com, 0 outwesthunts.com, 1 +ouvindo.com.br, 1 ouwerling.tk, 1 ouxiang.me, 1 ovabastecedoraindustrial.com, 1 @@ -63730,6 +63577,7 @@ p-s-b.com, 1 p-soc.com.br, 1 p-store.net, 1 p-t.io, 1 +p10.ru, 1 p1979.com, 1 p1984.nl, 0 p1cn.com, 1 @@ -63857,6 +63705,7 @@ paardenhulp.nl, 1 paardenpro.nl, 1 paardensportbak.nl, 1 paas-inf.net, 1 +paaspasst.de, 1 paass.net, 1 paazmaya.fi, 1 pablikado.cz, 1 @@ -63992,7 +63841,6 @@ pahealthbilling.com, 1 pahira.gq, 1 pahlawanpulsa.com, 1 pahom.gq, 1 -pahub.io, 1 paichai.space, 0 paidikasymeon.gr, 1 paiementdp.com, 1 @@ -64070,6 +63918,8 @@ palladium46.com, 1 palletflow.com, 1 palli.ch, 0 palmaprop.com, 1 +palmavile.us, 1 +palmaville.com, 1 palmbeachcuisine.com, 1 palmbeachwebsitehosting.com, 1 palmen-apotheke.de, 1 @@ -64077,12 +63927,15 @@ palmiye.tk, 1 palner.eu, 1 palomalopez.tk, 1 palomardisplays.com, 1 +palucamoveis.com.br, 1 +pama.fun, 1 pamaniqu.nl, 1 pamc.tk, 1 pamm.tk, 1 pamsorel.co.za, 1 pan-lleveme.com, 1 pan.digital, 1 +panamacascoviejo.com, 1 panamateakforestry.com, 1 panamatravel.tk, 1 panamatrippin.com, 1 @@ -64243,6 +64096,7 @@ paradependentesquimicos.com.br, 1 paradies-baar.ch, 1 paradiesgirls.ch, 1 paradigma-med.ru, 1 +paradiscapacitados.site, 1 paradise-engineer.com, 1 paradise-engineering.com, 1 paradise-engineers.com, 1 @@ -64290,6 +64144,7 @@ parcoursup-nouvelle-caledonie.fr, 1 parcoursup.fr, 1 pardnoy.com, 1 pareachat.com, 1 +pareaki.com, 1 paredesdecoura.pt, 0 paremvasi.net, 1 parentelement.com, 1 @@ -64298,6 +64153,7 @@ parentinterview.com, 1 parentmail.co.uk, 1 parentsandzebrasunited.com, 1 parentsintouch.co.uk, 1 +parenttv.com, 1 parfum-best.ml, 1 parfum-selbermachen.de, 1 parfumer.tk, 1 @@ -64448,6 +64304,7 @@ pascovotes.gov, 1 pascualberniz.tk, 1 pascualinmuebles.com, 1 pasearch.nl, 1 +paseelite.co, 1 pashminacachemire.com, 1 pasito.se, 1 pasnederland.tk, 1 @@ -64548,6 +64405,7 @@ patechmasters.com, 1 patentados.com, 1 patentchallenges.com, 1 patentfamily.de, 1 +patentmanufaktur.com, 1 pathagoras.com, 1 pathsha.re, 1 pathwaytofaith.com, 1 @@ -64584,7 +64442,6 @@ patriksima.cz, 1 patriksimek.cz, 1 patrikzk.eu, 1 patriquefashion.tk, 1 -patrocinio.com.br, 1 patrycjamichera.com, 1 patryk.cf, 1 patrz.eu, 1 @@ -64606,7 +64463,6 @@ paul-online.tech, 0 paul-sitarz.com, 1 paul.reviews, 1 pauladamsmith.com, 1 -paulalutz.com, 0 paulandmadge.com, 1 paulbdelaat.nl, 1 paulborza.com, 1 @@ -64705,7 +64561,6 @@ payments.google.com, 1 paymerang.com, 1 paymill.de, 1 paymon.tj, 1 -paymongo.com, 1 paymongo.help, 1 paymyphysician.com, 1 paynet.com.co, 1 @@ -64863,6 +64718,7 @@ peawo.com, 1 pebbleparents.com, 0 pebblepointapartmentsstl.com, 1 pebbles.net.in, 1 +pebkac.gr, 1 pebmarketing.nl, 1 pebook.tk, 1 pecheneg.tk, 1 @@ -64884,9 +64740,9 @@ pedicureduiven.nl, 1 pedigreetechnologies.com, 1 pedikura-vitu.cz, 1 pedimanie.cz, 1 -pedimoda.com.br, 1 pedro.com.es, 1 pedrobotias.tk, 1 +pedrolamas.com, 1 pedromunoz.tk, 1 pedrosaurus.com, 1 pedrosillo-delosaires.tk, 1 @@ -64897,7 +64753,6 @@ peelland-fm.tk, 1 peen.ch, 1 peenor.xyz, 1 peep.gq, 1 -peepsfoundation.org, 0 peer.travel, 1 peerbanking.com.au, 1 peercraft.at, 1 @@ -65036,13 +64891,13 @@ penza-today.tk, 1 penzaonline.cf, 1 penzionvzahrade.cz, 1 peoplelikemeapp.com, 1 +peopleorders.xyz, 1 peoplescu.com, 1 peoplesdecade.org, 1 peoplesguardian.org, 1 peoplesliberationfront.tk, 1 pepeelektro.sk, 1 pepegym.cz, 1 -pepemodelismo.com.br, 1 peperstraat.online, 1 pepfar.gov, 0 pepgrid.net, 1 @@ -65058,6 +64913,7 @@ per-olsson.se, 1 peraavcilar.com, 1 perakampus.com, 1 perala.me, 1 +perali.com, 1 perantiguru.com, 1 peraparker.cz, 1 perceptivemeded.com, 1 @@ -65082,6 +64938,7 @@ perevedut.cf, 1 perewall.tk, 1 perez-marrero.com, 1 perezdecastro.org, 1 +perezplumbinginc.com, 1 perf1.com, 1 perfect-carstyle.de, 1 perfect-dream.tk, 1 @@ -65110,7 +64967,6 @@ performancepiers.com, 1 performetric.net, 1 performing-art-schools.com, 1 performio.co, 1 -perfumes.com.br, 1 perfumestudio.in, 1 pericsope.gq, 1 perini.com.au, 1 @@ -65190,7 +65046,6 @@ pervomaysk-city.ml, 1 perzeidi.hr, 1 pescadorcomunicacao.com, 1 pescanetworks.tk, 1 -pescco.com.br, 1 pesnik.tk, 1 pesnitut.ga, 1 pestcontrol.co.uk, 1 @@ -65292,7 +65147,6 @@ petscams.com, 1 petschnighof.at, 1 petsnews.ga, 1 petspark.tk, 1 -petstok.com.br, 1 petstoredog.com, 1 petto.com.co, 1 peturnashes.ga, 1 @@ -65338,7 +65192,7 @@ pfotentour-berlin.de, 1 pfrost.me, 1 pfteprofessionals.com, 1 pfudor.tk, 1 -pg-forum.de, 1 +pg-forum.de, 0 pg-mana.net, 1 pgazette.tk, 1 pgh-art.com, 1 @@ -65363,7 +65217,6 @@ phantastikon.de, 1 phantomfund.ml, 1 phantomphans.tk, 1 pharma-display.com, 1 -pharmaabsoluta.com.br, 1 pharmaboard.de, 1 pharmaboard.org, 1 pharmaceuticalcannabis.org, 1 @@ -65384,7 +65237,6 @@ pharynx.nl, 1 phasme-2016.com, 1 phattea.tk, 1 phaux.uno, 1 -phbits.com, 1 phc-sa.com, 1 phcimages.com, 1 phcnetworks.net, 0 @@ -65400,7 +65252,6 @@ phenixairsoft.com, 1 phenonline.com, 1 phenq.com, 1 pheramoan.com, 1 -pheramoans.com, 1 phero.com, 1 pheroforce.com, 1 pherologie.com, 1 @@ -65448,6 +65299,7 @@ philippe-metayer-platrier.fr, 1 philippe-mignotte.fr, 1 philippebonnard.fr, 1 philippegoffin.be, 1 +philippehannes.fr, 1 philippekhau.tk, 1 philipperoose.be, 0 philippestudiopro.com, 1 @@ -65530,7 +65382,6 @@ photo-travel.tk, 1 photoancestry.com, 1 photoartelle.com, 1 photobooth-romania.ro, 1 -photobooth.id, 1 photobosco.tk, 1 photochka.tk, 1 photocode.co.rs, 1 @@ -65635,9 +65486,6 @@ pianyigou.com, 1 piaohong.tk, 1 piasto.com.cy, 1 piata.com.br, 1 -piataborrachas.com.br, 1 -piatabrasil.com.br, 1 -piatatem.com.br, 1 piatenko.ml, 1 piatika.com, 1 piazzafrancesco.com, 1 @@ -65698,6 +65546,7 @@ pieces-or.com, 0 piechart.ga, 1 piedrahita.tk, 1 piedrasblancas.gov, 1 +piedroshop.nl, 1 piekacz.co.uk, 1 piekacz.eu.org, 1 piekacz.net, 1 @@ -65711,7 +65560,6 @@ piepermail.nl, 1 pieq.eu, 1 pieq.eu.org, 1 pier1url.com, 1 -pier23.org, 1 pier28.com, 1 piercing.hu, 1 piercraft.com, 1 @@ -65738,6 +65586,7 @@ pietermaene.be, 0 pietron.name, 1 pietrosoft.tk, 1 pietz.uk, 1 +piezus.ru, 1 pif.email, 1 piferdal.pt, 1 piffer.ind.br, 1 @@ -65772,11 +65621,11 @@ pillowfort.pub, 1 pilot-colleges.com, 1 pilot.co, 0 pilotgrowth.com, 1 +pilotpov.com, 1 pilvi.pw, 1 pilvi.space, 1 pilvin.pl, 1 pimanta.com, 1 -pimg136.com, 1 pimhaarsma.nl, 1 pimhaarsmamedia.nl, 1 pimichi.com, 1 @@ -65878,6 +65727,7 @@ piratebay.ml, 1 piratebayproxy.tf, 1 piraten-basel.ch, 1 piraten-bv-nord.de, 1 +piraten-kleinbasel.ch, 1 pirateparty.org.uk, 1 piratepay.io, 0 piratepcs.com, 1 @@ -66017,9 +65867,6 @@ pj21499.com, 1 pj21566.com, 1 pj21599.com, 1 pj21866.com, 1 -pj21886.com, 1 -pj21887.com, 1 -pj21899.com, 1 pj21990.com, 1 pj21992.com, 1 pj21aa.com, 1 @@ -66050,6 +65897,7 @@ pj539999.com, 1 pj5588.cc, 1 pj83.duckdns.org, 1 pjax.xyz, 1 +pjdigitalmarketing.com, 1 pjentertainments.co.uk, 1 pjleisure.co.uk, 1 pjo.no, 1 @@ -66082,7 +65930,6 @@ pkwebsolutions.cf, 1 pl-cours.ch, 0 pl-trans.tk, 1 pl.search.yahoo.com, 0 -placasonline.com.br, 1 placedaffiliate.com, 1 placedapps.com, 1 placedsupport.com, 1 @@ -66126,7 +65973,6 @@ planetadeti.org, 1 planetanim.fr, 1 planetarian.moe, 1 planetarydesign.com, 1 -planetasuboficial.com.br, 1 planetau2.com, 1 planetbreath.ch, 0 planetchiropracticga.com, 1 @@ -66159,6 +66005,7 @@ planning.ga, 1 plano.gq, 1 planolowcarb.com, 1 planosylicencias.de, 1 +planovivofibra.com.br, 1 planrow.com, 1 planshetnik.tk, 1 plansight.com, 1 @@ -66195,6 +66042,7 @@ plastiflex.it, 1 plastischechirurgie-linz.at, 1 plastovelehatko.cz, 1 plateformecandidature.com, 1 +platform-med.org, 1 platform.ltd.uk, 1 platform161.com, 1 platformadmin.com, 1 @@ -66228,11 +66076,8 @@ playelephant.com, 1 playerdb.co, 1 playerhunter.com, 0 playface.ml, 1 -playfinder.com, 1 -playform.cloud, 0 playfrank.com, 1 playhappywheelsunblocked.com, 1 -playinfinity.com, 1 playinfinityvr.com, 1 playit.rs, 1 playlisten.radio.br, 1 @@ -66243,6 +66088,7 @@ playnation.io, 1 playnow.com, 1 playnuganug.com, 1 playocean.net, 1 +playorigin.com, 1 playpirates.com, 1 playreal.city, 1 playsawdust.com, 1 @@ -66251,6 +66097,7 @@ playsoftware.tk, 1 playsprout.industries, 1 playstation-network.ga, 1 playstation.com, 1 +playstationplus.es, 1 playstationtrophies.org, 1 playtictactoe.org, 1 playtimebouncycastles.co.uk, 1 @@ -66319,7 +66166,6 @@ plugcubed.net, 0 plugin-planet.com, 1 pluginfactory.io, 1 plugins-telechargement.com, 1 -pluginsetemaswp.com, 1 pluginsloaded.com, 1 pluimveeplanner.nl, 1 plumbalot.co.za, 1 @@ -66349,6 +66195,7 @@ plus.sandbox.google.com, 1 plus15.ml, 1 plus1s.site, 1 plus1s.tk, 1 +plus36.hu, 1 plusbot.tk, 1 pluslink.co.jp, 1 plusmobile.fr, 1 @@ -66397,7 +66244,6 @@ pmg-offshore-company.com, 1 pmg-p4p.de, 1 pmg-purchase.com, 1 pmg-purchase.net, 1 -pmi.gov, 1 pmk.ddns.net, 0 pmklaassen.com, 1 pmnaish.co.uk, 1 @@ -66547,7 +66393,6 @@ pocketfruity.com, 1 pocketinsure.com, 1 pocketpasta.com, 1 pocobelli.ch, 0 -pocqipai.com, 1 pocze.ch, 1 podari.tk, 1 podarki-deda-moroza.tk, 1 @@ -66591,8 +66436,8 @@ pogotowiekomputeroweolsztyn.pl, 1 pogrebisky.net, 1 pogs.us, 1 pohatta.com, 1 -pohlednice-tap.cz, 1 pohlmann.io, 1 +poi-radary.eu, 1 poiema.com.sg, 0 poimel.ga, 1 poinsot.info, 1 @@ -66778,6 +66623,7 @@ pontodogame.com.br, 1 ponxel.com, 1 pony-cl.co.jp, 1 pony.tf, 1 +ponyar.net, 1 ponychan.net, 1 ponycyclepals.co.uk, 1 ponydesignclub.nl, 1 @@ -66808,6 +66654,7 @@ pop-corn.ro, 1 pop-culture.tk, 1 pop.dk, 1 pop3.jp, 0 +pop3.support, 1 popcat.ru, 1 popcorncult.ru, 1 popcornpalacefundraising.com, 1 @@ -66821,6 +66668,7 @@ popkins.cf, 1 popkins.ga, 1 popkins.gq, 1 popkins.tk, 1 +popkultura.info.pl, 1 poplavok77.tk, 1 popmagz.com, 1 popmundoforum.tk, 1 @@ -66866,7 +66714,9 @@ pornfacefinder.com, 0 pornflare.net, 1 pornforwomentube.com, 1 porngay.co, 1 +pornhib.xyz, 1 pornhubhd.biz, 1 +pornhun.xyz, 1 pornimg.net, 1 porniwi.com, 1 pornjunkiesxxx.com, 1 @@ -67023,6 +66873,7 @@ postoyanstvo.cf, 1 postpot.co.kr, 1 postsubmeta.net, 1 posttigo.com, 1 +posukovskaschola.cz, 1 posutochno.ml, 1 posyperfume.com, 1 potatiz.com, 1 @@ -67037,7 +66888,6 @@ potature.rimini.it, 1 potature.roma.it, 1 potbar.com, 1 potentialproject.com, 0 -poterepersonale.it, 1 potgrowersunion.com, 1 pothe.com, 1 pothe.de, 1 @@ -67267,6 +67117,7 @@ precisiondigital-llc.com, 1 precisionhealthpilot.org, 1 precisionhockey.net, 1 precisionicerinks.com, 1 +precisionlender.com, 1 precisionmachineservice.com, 1 precisionvaccinations.com, 1 precode.eu, 1 @@ -67422,7 +67273,6 @@ previousmagazine.com, 1 previsora.gov.co, 0 prexxorvita.com, 1 prgrmmr.nl, 1 -priboutiquedasflores.com.br, 1 price.bond, 1 pricegg.com, 1 priceholic.com, 1 @@ -67431,7 +67281,6 @@ priceofdollar.com, 1 priceremoval.net, 1 pricesim.com, 1 pricesniffer.co, 1 -pricope-stefan.com, 1 prideindomination.com, 1 pridnestrovye.gq, 1 prielwurmjaeger.de, 1 @@ -67475,7 +67324,6 @@ princetonradiationoncology.com, 1 princezna.club, 1 principalsexam.com, 1 principalship.net, 1 -principalstest.com, 1 principaltoolbox.com, 1 principia-journal.de, 1 principia-magazin.de, 1 @@ -67487,6 +67335,7 @@ print-street.tk, 1 printeknologies.com, 1 printerinktoutlet.nl, 1 printerleasing.be, 1 +printerpoint.co.in, 1 printertonerkopen.nl, 1 printexpress.cloud, 1 printfn.com, 0 @@ -67530,6 +67379,7 @@ prismacloud.xyz, 1 prismapixel.studio, 1 prisminfosys.com, 1 prismintl.org, 1 +prisonerresource.com, 1 pristal.eu, 1 prisync.com, 1 pritalk.com, 1 @@ -67546,7 +67396,7 @@ privacychick.com, 1 privacychick.io, 1 privacyforjournalists.org.au, 1 privacyget.tk, 1 -privacyinternational.org, 1 +privacyinsights.nl, 1 privacymanatee.com, 1 privacynow.eu, 1 privacyscore.org, 1 @@ -67564,12 +67414,10 @@ private-mail-for.me, 1 privatebanks.uk, 1 privatebin.info, 1 privatecapsecurity.org, 1 -privatecollection.ae, 1 privateger.me, 1 privategiant.com, 1 privateideas.de, 1 privateimarketing.com, 1 -privatemediaserver.tech, 1 privatenebula.eu, 1 privatepokertour.com, 1 privatepropertymallorca.com, 1 @@ -67604,6 +67452,7 @@ pro-ben.sk, 1 pro-bike.ro, 1 pro-clean.org, 1 pro-co.at, 1 +pro-dog.ru, 1 pro-esb.com, 1 pro-esb.net, 1 pro-ing.com, 0 @@ -67623,7 +67472,6 @@ pro-taucher.de, 1 pro-wiert.pl, 1 pro100blogger.com, 1 pro100systems.com.ua, 1 -pro3ozonio.com.br, 1 proact-it.co.uk, 1 proactive.run, 1 proactivenews.ml, 1 @@ -67642,7 +67490,7 @@ probooks.gq, 1 procar-rheinland.de, 1 procarservices.com, 1 procarswoking.com, 1 -procens.us, 1 +procens.us, 0 procensus.com, 1 procert.ch, 0 procesadorafenix.com.mx, 1 @@ -67689,7 +67537,6 @@ productionscime.com, 1 productlondon.com, 1 productosfitness.com, 1 productpeo.pl, 1 -products88.com, 1 productsblockbuster.com, 1 productsbrandleader.com, 1 productscastle.com, 1 @@ -67720,6 +67567,8 @@ professionallawyer.tk, 1 professions.org.ru, 1 professors.ee, 1 professorwidget.tk, 1 +proficiodigital.com, 1 +proficiodigital.sk, 1 profidea.cz, 1 profielektrik.tk, 1 profile.tf, 1 @@ -67767,6 +67616,7 @@ program-and.work, 1 programador-web-freelance.es, 1 programadorwp.com, 1 programarya.com, 1 +programer21.com, 1 programistka.com, 1 programlama.tk, 1 programmaticmagic.com, 1 @@ -67794,14 +67644,15 @@ prohost24.tk, 1 prohrcloud.com, 1 proibidoler.com, 1 proimpact.it, 1 +proitsecurity.cl, 1 proj.org.cn, 1 proj3ct.me, 1 +proj6.site, 1 project-novis.org, 1 project-rune.tech, 1 project-splash.com, 0 project-stats.com, 1 project86fashion.com, 1 -projectarmy.net, 0 projectbenson.com, 0 projectborealisgitlab.site, 1 projectbotticelli.com, 1 @@ -67905,7 +67756,6 @@ properticons.com, 1 property-catalogue.eu, 1 property-tax.cf, 1 property-tax.ga, 1 -propertyauctionaction.co.uk, 1 propertycrawl.com, 1 propertyfindercdn.com, 1 propertyflare.com, 1 @@ -67973,11 +67823,13 @@ prosurveillancegear.com, 1 protanki.ml, 1 protanki.tk, 1 protapnews.tk, 1 -protech.ge, 1 +protech.ge, 0 proteco.sk, 1 protectedpayments.net, 1 protectedreport.com, 1 protectem.de, 1 +protection-plexi.com, 1 +protection-plexi.fr, 1 protection.ga, 1 protectionformula.com.ua, 1 protectoraanimalesalicante.org, 1 @@ -68060,6 +67912,7 @@ proxybay.bet, 1 proxybay.bz, 1 proxybay.cc, 1 proxybay.co, 1 +proxybay.info, 1 proxybay.ist, 1 proxybay.la, 1 proxybay.lat, 1 @@ -68069,13 +67922,11 @@ proxybay.onl, 1 proxybay.red, 1 proxybay.tv, 1 proxybay.uno, 1 -proxyportal.org, 1 proxytool.cf, 1 proyectafengshui.com, 1 proyecto13.com, 1 proyectosinelec.com, 1 proyectostep.tk, 1 -proyectosx.net, 1 prozac20mg.cf, 1 prozorlivec.tk, 1 prpferrara.it, 1 @@ -68088,7 +67939,6 @@ prtpe.com, 1 prtscloud.ddns.net, 1 pru.com.hk, 1 pru.hk, 1 -pruebapg.cl, 1 pruikshop.nl, 1 pruma.com.br, 1 pruna.org, 1 @@ -68103,7 +67953,6 @@ prylarprylar.se, 1 prynhawn.com, 1 prynhawn.net, 1 prynhawn.org, 1 -prytkov.com, 1 przemas.pl, 1 przerabianiezdjec.pl, 1 ps-provider.co.jp, 1 @@ -68145,6 +67994,7 @@ psicologajanainapresotto.com.br, 1 psicologasandrabernal.es, 1 psicologo-especialista-barcelona.com, 1 psicologo-infantil-barcelona.com, 1 +psicologomogidascruzes.com.br, 1 psicometricas.mx, 1 psihologonline.tk, 1 psihology.gq, 1 @@ -68174,6 +68024,8 @@ pssgcsim.org, 1 pst.moe, 1 pstrozniak.com, 1 psu.je, 1 +psucompare.com, 1 +psv-herford-badminton.de, 1 psw-consulting.de, 1 psw-group.de, 1 psw-training.de, 1 @@ -68197,6 +68049,7 @@ psychologbruksela.be, 1 psychologi.cf, 1 psychologic.tk, 1 psychologie-hofner.at, 1 +psychologue-grenoble.org, 1 psychologytests.tk, 1 psychometrictest.ca, 1 psychometrictest.co.il, 1 @@ -68232,6 +68085,7 @@ pszinfo.hu, 1 pt-d.ru, 1 pt-server.de, 1 pt.im, 1 +pta-security.nl, 1 pta.world, 1 ptab2pt.ga, 1 ptal.eu, 1 @@ -68239,6 +68093,7 @@ ptasiepodroze.eu, 1 ptbi.org.pl, 1 ptboys.tk, 1 ptcbooks.gq, 1 +ptcmonitoring.ir, 1 pteceng.com, 1 pterodactyl.org.cn, 1 pterodactylus.cz, 1 @@ -68274,7 +68129,6 @@ public-measures.com, 1 public-projects.com, 1 public-projects.de, 1 public-vocals.de, 1 -publicard.es, 1 publiccarauctionscalifornia.com, 1 publicholidays.im, 1 publicintegrity.org, 1 @@ -68291,6 +68145,7 @@ publivate.ca, 1 publixphere.net, 1 pubmire.com, 0 pubreview.com.au, 1 +pubsasiedzi.pl, 1 pubsavoy.tk, 1 pucogid.ga, 1 pucsr.tech, 1 @@ -68347,6 +68202,8 @@ pungatv.ml, 1 punikonta.de, 1 punishment.institute, 1 punitsheth.com, 1 +punjabdirectory.in, 1 +punjabitube.xyz, 1 punjabprime.com, 1 punkapoule.fr, 1 punkart.tk, 1 @@ -68359,7 +68216,6 @@ puntacananetwork.com, 1 puntacanatransporte.com, 1 puntaprop.com, 1 puntcunts.com, 1 -punte-juwelier.nl, 1 puntoestadodemexico.com, 1 puntonium.hu, 1 puntoseguro.com, 0 @@ -68367,7 +68223,7 @@ pupboss.com, 1 pupok.cf, 1 pupok.gq, 1 puppet.pl, 1 -puppo.space, 0 +puppo.space, 1 pupset.net, 1 pupsikstudio.com, 1 puq.moe, 1 @@ -68451,7 +68307,6 @@ putman-it.nl, 1 putnamcollision.com, 1 putney.io, 1 putnik.tk, 1 -putomani.rs, 1 putrock.be, 1 puttymonos.club, 1 puxlit.net, 1 @@ -68473,6 +68328,7 @@ pvmotorco.com, 1 pvpagario.tk, 1 pvpcraft.ca, 1 pvpctutorials.de, 1 +pvpheroes.gg, 1 pvpheroes.no, 1 pvphs98.com, 1 pvplist.ml, 1 @@ -68545,6 +68401,7 @@ q1q2q3.tk, 1 q1z.net, 1 q30365.com, 1 q36594.com, 1 +q3jlzwq.com, 1 q5118.com, 1 q5197.co, 1 q6729.co, 1 @@ -68567,6 +68424,7 @@ qadmium.com, 1 qadmium.tk, 1 qalab.tk, 1 qambarraza.com, 1 +qanatnews.tk, 1 qandavision.com, 0 qani.me, 1 qaq.cloud, 1 @@ -68578,9 +68436,9 @@ qatartimes.tk, 1 qaz.cloud, 1 qaz.link, 1 qb928.com.tw, 1 +qbacano.com, 1 qbasicsite.tk, 1 qbd.eu, 1 -qbiju.com.br, 1 qbiltrade.com, 1 qbtechs.com, 1 qc.immo, 1 @@ -68641,6 +68499,7 @@ qivonline.pt, 1 qiwi.be, 1 qixi.biz, 1 qiyan.email, 1 +qjg.com.br, 1 qkek.tk, 1 qkka.org, 1 qklshequ.com, 1 @@ -68673,7 +68532,6 @@ qosmoschools.edu.my, 1 qotw.net, 1 qp666d.com, 1 qpaypro.com, 1 -qpcna.org, 1 qponverzum.hu, 1 qpsinc.com, 1 qq5197.co, 1 @@ -68741,7 +68599,6 @@ qualith.tk, 1 quality-life.gr, 1 qualityconcreteraising.com, 1 qualitydns.net, 1 -qualityfactory.com, 1 qualityhomesystems.com, 1 qualityhvacservices.com, 1 qualityofcourse.com, 0 @@ -68760,7 +68617,6 @@ quantolytic.de, 1 quantomaisconsorcios.com.br, 1 quantoras.com, 1 quantrix.com, 1 -quanttydesignweb.com.br, 1 quantum-evolution.jp, 1 quantum-lviv.pp.ua, 1 quantum-mechanics.com, 1 @@ -68781,11 +68637,11 @@ quartz.im, 1 quartzclinical.com, 1 quarus.net, 1 quasarelectronics.co.uk, 1 +quasetio.ml, 1 quasiproxy.com, 1 quasseldroid.info, 1 quatermass.tk, 1 quatrefoiscent.fr, 1 -quatulo.net, 1 quaxio.com, 1 quay.net, 1 qubes-os.org, 1 @@ -68814,6 +68670,7 @@ queercinema.ch, 1 queextensiones.com, 1 queirozmiotto.adv.br, 1 queirozmiotto.com.br, 1 +quel-dj.com, 1 quelle-catalog.tk, 1 quelle.at, 1 quelle.ch, 1 @@ -68826,10 +68683,10 @@ quenecesitopara.com, 1 quenotejodan.cl, 1 quentar.tk, 1 quentin-sauvetre.fr, 1 +quentinaurat.com, 1 quentinchevre.ch, 1 quera.ir, 1 querenciavirtual.com.br, 1 -queropescar.net, 1 query-massage.com, 0 queryquinton.com, 1 quest-medica.com, 1 @@ -68914,6 +68771,7 @@ quiz4math.gr, 1 quizandmoney.com, 1 quizhub.co, 1 quizhub.ml, 1 +quizinn.live, 1 quizogames.com, 1 quizstore.net, 1 quizz.biz, 1 @@ -68980,7 +68838,6 @@ r1ch.net, 1 r1h3.nl, 1 r2d2pc.com, 1 r30365.com, 1 -r33.space, 1 r36533.com, 1 r36594.com, 1 r3bl.blog, 1 @@ -69010,6 +68867,7 @@ raadgiverborsen.com, 1 raadvanstate.nl, 1 raah.co, 1 raailto.com, 1 +raamattuopisto.fi, 1 raaynk.com, 1 raballder.tk, 1 rabatcity.tk, 1 @@ -69019,6 +68877,7 @@ rabbit.wales, 0 rabbitcallcenter.com, 1 rabbitfinance.com, 1 rabbitinternet.com, 1 +rabec.com.sa, 1 rabica.de, 1 rabinson2005.tk, 1 rabis.co, 1 @@ -69047,12 +68906,11 @@ racheldiensthuette.de, 1 rachelmoorelaw.com, 1 rachelreagan.com, 1 rachelsbouncycastles.co.uk, 1 -rachida-dati.eu, 1 rachnacollege.tk, 1 racing-planet.cz, 1 racingfanclub.tk, 1 rackblue.com, 1 -rackerlab.com, 1 +rackerlab.com, 0 raclet.co.uk, 1 raconconsulting.co.uk, 1 racoo.net, 1 @@ -69067,7 +68925,6 @@ radarcupao.pt, 1 radarcupom.com.br, 1 radarcupon.com.mx, 1 radarcupon.es, 1 -radarequation.com, 1 radarnext.com, 1 radartatska.se, 1 radartek.com, 1 @@ -69085,7 +68942,6 @@ radicaldream.tk, 1 radicalepil-haguenau.fr, 1 radicalfuture.tk, 1 radicaloptimism.org, 1 -radicalsub.com.br, 1 radicalwebdesign.co.uk, 1 radio-az.tk, 1 radio-bandit.ml, 1 @@ -69101,7 +68957,7 @@ radioactivenetwork.xyz, 1 radioafibra.com.br, 1 radioaltamar.tk, 1 radioborges.tk, 1 -radiobox.net, 1 +radiobox.net, 0 radiocappissima.tk, 1 radiocartel.tk, 1 radiocommande-industrielle.fr, 1 @@ -69158,9 +69014,9 @@ radiozetta.tk, 1 radis-adopt.com, 1 radiumcode.com, 1 radiumone.io, 1 -radiumtree.com, 1 radixsalon.tk, 1 radlina.com, 1 +radnas.com, 1 radnickapartija.tk, 1 radomir-online.ru, 1 radon.tk, 1 @@ -69199,6 +69055,7 @@ raghughphotography.tk, 1 raghuspeaks.com, 1 raginggaming.ga, 1 ragingserenity.com, 1 +ragnarokhpg.com, 1 ragnaroktop.com.br, 1 ragu.co.uk, 1 rahayi.tk, 1 @@ -69327,6 +69184,7 @@ ramatola.uk, 0 rambedjeans.com, 1 ramblingrf.tech, 1 rambo.codes, 1 +ramdigital.xyz, 1 rametrix.com, 1 ramiabusalah.tk, 1 ramieres.cf, 1 @@ -69338,7 +69196,6 @@ rammstein-portugal.com, 1 rammsteinzone.tk, 1 rampestyuma.com, 1 ramrecha.com, 0 -ramsaver.com.br, 1 ramsdensforcash.co.uk, 1 ramsdensplc.com, 1 ramsor-gaming.de, 1 @@ -69420,6 +69277,7 @@ rapidoo.com.br, 1 rapidshit.net, 1 rapidstone.com, 1 rapidsurvival.com, 1 +rapidxray.biz, 1 raportdnia.pl, 1 rapport.link, 1 rapportdecoracoes.com.br, 1 @@ -69447,7 +69305,6 @@ rashbogota.tk, 1 rasheed-nuss.tk, 1 raskruti.ml, 1 raskrutka.cf, 1 -raspberid.com.es, 1 raspii.tech, 1 raspitec.ddns.net, 1 rassadacvetov.com, 1 @@ -69494,6 +69351,8 @@ ravenrockrp.com, 1 ravensbuch.de, 1 ravenx.me, 1 ravhaaglanden.org, 1 +ravihotel.com, 1 +ravijuhend.ee, 1 ravik.tk, 1 ravindran.me, 1 raviparekh.co.uk, 1 @@ -69602,6 +69461,7 @@ rcraigmurphy.com, 1 rcraigmurphy.net, 1 rcsda.net, 1 rcsolutions.nl, 1 +rcsscontractors.com, 1 rct.sk, 1 rct.uk, 1 rctalk.com, 1 @@ -69775,6 +69635,7 @@ rebellecare.com, 1 rebellion.global, 1 rebelonline.nl, 1 rebelrebel.com.au, 1 +rebelsewerservices.com, 1 rebelz.se, 1 rebeportillo.com, 1 rebirthia.me, 1 @@ -69792,6 +69653,7 @@ recebersms.com, 1 receitasdebacalhau.pt, 1 receptionpoint.com, 1 receptionsbook.com, 1 +recepty-s-foto.ru, 1 recessmonkeyz.tk, 1 recetin.com, 1 recettemedievale.fr, 1 @@ -69829,6 +69691,7 @@ reconexion.life, 1 recordmeeting.jp, 1 recordmeeting.net, 1 recordstudio.tk, 1 +recoveringfromfaith.com, 1 recoveringircaddicts.org, 1 recoveringspirit.com, 1 recoveryohio.gov, 1 @@ -69870,7 +69733,6 @@ redable.nl, 1 redacted.life, 1 redactedmedia.org, 1 redactieco.nl, 1 -redback.tech, 1 redballoonsecurity.com, 1 redburn.com, 1 redcabbage.tk, 1 @@ -69910,6 +69772,7 @@ rede-reim.de, 1 rede-t.com, 1 redecsirt.pt, 1 redeemingbeautyminerals.com, 1 +redelectrical.co.uk, 0 redeshoprural.com.br, 1 redessantaluzia.com.br, 1 redeyeguatemala.tk, 1 @@ -69968,7 +69831,6 @@ redrafting.ga, 1 redray.org, 1 redrichindia.com, 1 redrowcareers.co.uk, 1 -redscan.com, 1 redsequence.com, 1 redshiftcybersecurity.co.za, 1 redshoeswalking.net, 1 @@ -70012,6 +69874,7 @@ reeson.org, 1 reevaappliances.co.uk, 1 reeves-family.com, 1 refaaygroup.com, 1 +refansta.com, 1 refer.codes, 1 referat.club, 1 referat.me, 1 @@ -70037,7 +69900,6 @@ reformatreality.com, 1 refreshcartridges.co.uk, 1 refreshingserum.com, 1 refreshliving.us, 1 -refrigeracionpeinado.com.mx, 1 refu.net, 1 refundo.cz, 1 refundo.sk, 1 @@ -70117,14 +69979,13 @@ reichel-steinmetz.de, 1 reichelt-cloud.de, 1 reichl-online.net, 1 reiciunas.lt, 1 -reidasbombas.com, 1 -reidope.com.br, 1 reifr.net, 1 reignoftroy.com, 1 reignsphere.net, 1 reiki-coaching.nl, 0 reiki-france.fr, 1 reikicentrumdelft.nl, 1 +reikimontreal.org, 1 reilly.io, 1 reimaginebelonging.de, 1 reimaginebelonging.org, 1 @@ -70150,7 +70011,7 @@ reinout.nu, 1 reinouthoornweg.nl, 1 reintjens.de, 1 reinventetoi.com, 0 -reinventfit.ro, 1 +reinventfit.ro, 0 reirei.cc, 1 reisenbauer.ee, 1 reiseversicherung-werner-hahn.de, 1 @@ -70200,6 +70061,7 @@ relaybox.io, 1 release-monitoring.org, 1 releasepoint.com, 1 releasetimes.io, 1 +reliabledegree.com, 1 reliablemaids.co.uk, 1 reliableremovals-blackpool.co.uk, 1 reliablesigningsllccrm.com, 1 @@ -70285,6 +70147,7 @@ rene-eizenhoefer.de, 1 rene-schwarz.com, 1 rene-stolp.de, 1 renearends.nl, 1 +renedekoeijer.com, 1 renee.today, 1 renefloresphotography.com, 1 renehsz.com, 1 @@ -70404,7 +70267,6 @@ republicmo.gov, 1 republictelecom.net, 1 republik-sombora.tk, 1 republique.org, 1 -repuestosmedellin.com, 1 repugnant-conclusion.com, 1 repugnantconclusion.com, 1 reputationweaver.com, 1 @@ -70419,6 +70281,7 @@ reroboto.org, 1 resama.eu, 1 resanebartar.tk, 1 resc.la, 1 +resch.io, 1 rescms-secure.com, 1 rescuer.gq, 1 research-panel.jp, 1 @@ -70427,6 +70290,7 @@ research.md, 1 researchchempro.nl, 1 researchgate.net, 1 researchstory.com, 1 +reseau-protestant.ch, 1 reseau.io, 1 reseausyndic.ca, 1 resepimok.com, 1 @@ -70508,6 +70372,7 @@ restauriedili.roma.it, 1 rester-a-domicile.ch, 1 rester-autonome-chez-soi.ch, 1 restioson.me, 1 +restock.ninja, 1 restoran-radovce.me, 1 restoran.cf, 1 restorethegulf.gov, 1 @@ -70560,7 +70425,7 @@ retraitebysaulsplace.nl, 1 retro-game.org, 1 retro.camp, 1 retro.rocks, 1 -retro.sx, 1 +retro.sx, 0 retroarms.com, 1 retroarms.cz, 1 retrocdn.net, 1 @@ -70572,8 +70437,7 @@ retropack.org, 1 retroride.cz, 1 retroroundup.com, 1 retroslave.ga, 1 -retrotown.ws, 1 -retrotracks.net, 1 +retrotracks.net, 0 retrovideospiele.com, 1 rets.org.br, 0 rettig.xyz, 0 @@ -70764,7 +70628,6 @@ riceadvice.info, 1 richadams.me, 1 richardbloomfield.blog, 1 richardcrosby.co.uk, 1 -richardfaber.nl, 1 richardharpur.com, 1 richardinesrolltop.com, 1 richardjgreen.net, 1 @@ -70824,6 +70687,7 @@ rico.ovh, 1 ricobaldegger.ch, 1 ricochet.im, 1 ricomp.com.br, 1 +ricor.cl, 1 ricordisiciliani.it, 1 ricoydesign.com, 1 ricozienke.de, 1 @@ -70837,7 +70701,6 @@ rident-estetic.ro, 1 riders.ga, 1 rides-japan.jp, 1 rideyourdamn.bike, 1 -ridgarou.no-ip.org, 1 ridhaan.co, 1 ridingboutique.de, 1 ridingoklahoma.com, 1 @@ -70892,6 +70755,7 @@ riku.pw, 1 rikunori.com.tw, 1 rikuras.cl, 1 rile5.com, 1 +riley.love, 1 rileyevans.co.uk, 1 rileyskains.com, 1 rilish.cf, 1 @@ -70913,6 +70777,7 @@ ringtune.ir, 1 rinkhill.com, 1 rinprom.com, 1 rinsepimp.com, 1 +rinton.ru, 1 rinvex.com, 1 rinzler.io, 1 rio-weimar.de, 1 @@ -71002,7 +70867,6 @@ rivoflor.it, 1 rivus.net, 1 riweco.ga, 1 riwick.com, 0 -rixter.com, 0 rixzz.ovh, 1 riyadbankacademy.com, 1 riyono.com, 1 @@ -71011,7 +70875,6 @@ rizoma.tech, 1 rizospastis.gr, 1 rj-onderneemt.nl, 1 rjan.nl, 1 -rjcrafts.com, 1 rjrplay.com, 1 rk-links.ml, 1 rk.mk, 1 @@ -71034,12 +70897,12 @@ rmb.li, 1 rmc.edu, 1 rmcbs.de, 1 rmdb.tk, 1 -rmdscreen.com, 1 rmeuropean.com, 1 rmf.io, 1 rmit.me, 1 rmm-i.com, 1 rmmanfredi.com, 1 +rmp-gebaeudedienste.de, 1 rmrig.org, 1 rms.sexy, 1 rmshg.com, 1 @@ -71104,11 +70967,14 @@ robertoullan.tk, 1 robertreiser.photography, 1 robertrijnders.nl, 1 robertsmits.be, 0 +robeschinoises.fr, 1 robgorman.ie, 1 robhorstmanshof.nl, 1 +robi-aesch.ch, 1 robi-net.it, 1 robicue.com, 1 robigalia.org, 0 +robin-kusch.de, 1 robin-novotny.com, 1 robin.co.kr, 1 robin.info, 1 @@ -71142,6 +71008,7 @@ robotkvarnen.se, 1 robototes.com, 1 robots-ju.ch, 1 robotsbigdata.com, 1 +robotstxt.com, 1 robottip.com, 0 robpol86.com, 1 robspc.repair, 1 @@ -71198,7 +71065,7 @@ rodab.party, 1 rodafe.sk, 1 rodarion.pl, 1 rodchapman.com, 1 -roddis.net, 0 +roddis.net, 1 rodehutskors.net, 1 rodelstein.eu, 1 rodeobull.biz, 1 @@ -71213,7 +71080,6 @@ rodinka.tk, 1 rodinnebyvanie.eu, 1 rodinneodpoledne2018.cz, 1 roditely.cf, 1 -rodkidesings.com, 1 rodolfo.gs, 1 rodolphe-lebrun.fr, 1 rodomonte.org, 1 @@ -71247,6 +71113,7 @@ rogell.tk, 1 rogerdat.ovh, 1 rogerdeflor.tk, 1 rogerhub.com, 1 +rogeriosantos.pt, 1 rogerkunz.ch, 1 rogerriendeau.ca, 1 rogersaam.ch, 0 @@ -71255,6 +71122,7 @@ rogersremovals.co.uk, 1 rogersvilleumc.org, 1 rogiershikes.tk, 1 rognhaugen.no, 1 +rogo.cz, 1 rogoff.xyz, 1 rogue-e.xyz, 1 roguefortgame.com, 1 @@ -71265,13 +71133,11 @@ roguesignal.net, 1 roguetechhub.org, 1 roh.one, 1 rohanbassett.com, 1 -rohanisuhadi.xyz, 1 rohansingh.cf, 1 rohde.de, 1 rohedaten.de, 1 rohitagr.com, 1 rohlik.cz, 1 -roi.ovh, 1 roiblozyxfswe.ga, 1 roidsstore.com, 1 rointe.online, 1 @@ -71297,6 +71163,7 @@ roldeco.nl, 1 rolecontj.com, 1 roleplaybdsm.com, 1 roleplayhome.com, 1 +rolibo.com, 1 roligh.cf, 1 roligt.tk, 1 roliki.ml, 1 @@ -71345,6 +71212,7 @@ romastantra.com, 1 romatours.pt, 1 romatrip.it, 1 rome.dating, 1 +romeing.it, 1 rommelhuntermusic.tk, 1 rommelmark.nl, 1 rommelwood.de, 1 @@ -71452,7 +71320,6 @@ rosabellas.co.uk, 1 rosabrasiv.ga, 1 rosahijab.com, 1 rosakkreditatsiya-forum.ru, 1 -rosalindgreenllc.com, 1 rosalindturner.co.uk, 1 rosalopezcortes.tk, 1 rosamystica.tk, 1 @@ -71554,7 +71421,6 @@ roundtoprealestate.com, 1 roussos.cc, 1 roussosmanos.gr, 1 rout0r.org, 1 -route-wird-berechnet.de, 1 routerclub.ru, 1 routeto.com, 1 routetracker.co, 1 @@ -71645,8 +71511,6 @@ royalpainters.co, 1 royalpalacenogent.fr, 1 royalpratapniwas.com, 1 royalrace.tk, 1 -royalrangers.fi, 1 -royalstylefit.com, 1 royaltube.net, 1 royalty-market.com, 1 royalvortex.co, 1 @@ -71675,13 +71539,13 @@ rpadovani.com, 0 rpasafrica.com, 1 rpattisonroofing.co.uk, 1 rpauto.ru, 1 -rpgcampaign.website, 1 rpgchan.cf, 1 rpgmaker.es, 1 rpguru.com, 1 rpherbig.com, 1 rphl.net, 1 rphyncice.cz, 1 +rpi-pihole-mon.ddns.net, 1 rpine.net, 1 rpmdrivingschool.com.au, 1 rpoplus.nl, 1 @@ -71717,7 +71581,6 @@ rs-maschinenverleih.de, 1 rs.wiki, 1 rs200.org, 1 rs2ap33.com, 1 -rsa-erp.com, 1 rsa-services.com, 1 rsanahuano.com, 1 rsap.ca, 1 @@ -71741,6 +71604,7 @@ rsmmail.com, 1 rsp-blogs.de, 1 rsquare.nl, 1 rsridentassist.com, 1 +rsrnd.org, 1 rss.sh, 0 rssfeedblast.com, 1 rssfeedonline.tk, 1 @@ -71828,7 +71692,6 @@ rubenpeeters.ml, 1 rubenroy.com, 1 rubenruiz.org, 1 rubens.cloud, 1 -rubenschulz.nl, 1 rubia.ca, 1 rubiales.tk, 1 rubidium.ml, 1 @@ -71867,6 +71730,7 @@ rudrastyh.com, 1 rudy.ga, 1 rudymendoza.tk, 1 rue-de-la-vieille.fr, 1 +rueckgr.at, 1 rueder.com, 1 ruediger-voigt.eu, 1 ruedigervoigt.de, 1 @@ -71883,6 +71747,7 @@ ruffbeatz.com, 1 ruffinstorage.com, 1 ruffnecks.tk, 1 ruflay.ru, 1 +rugbugecoflooring.com, 1 rugby.tk, 1 rugby.video, 1 rugcleaninglondon.co.uk, 1 @@ -71898,8 +71763,10 @@ ruhproject.kz, 1 ruhrmobil-e.de, 1 ruhrnalist.de, 1 ruicore.cn, 1 +ruifu.tech, 1 ruika.ru, 1 ruimarques.xyz, 1 +ruiming.me, 0 ruimoreira.co.uk, 1 ruin.one, 1 ruinme.tk, 1 @@ -71938,6 +71805,8 @@ runbo-nz.ga, 1 runboaustralia.ga, 1 runcarina.com, 1 rundesign.it, 1 +rundh-audio.de, 1 +rundh.de, 1 rundumcolumn.xyz, 1 runebet.com, 1 runefake.com, 1 @@ -71960,6 +71829,7 @@ runners.yoga, 1 running.org, 1 runningfast.cf, 1 runningrabb.it, 1 +runningshoeshq.com, 1 runreport.fr, 1 runrocknroll.com, 1 runschrauger.com, 1 @@ -72023,6 +71893,7 @@ russian-knights.ru, 1 russian-page.tk, 1 russianbearsmotorsport.tk, 1 russianbristol.tk, 1 +russianescortsmumbai.com, 0 russianews.cf, 1 russianpunkrock.tk, 1 russianrandom.ru, 1 @@ -72055,6 +71926,7 @@ rutiger.com, 1 rutika.ru, 1 rutracker.appspot.com, 1 rutten.me, 0 +ruttenadvocaat.be, 1 ruudkoot.nl, 1 ruurdboomsma.nl, 1 ruwhof.net, 1 @@ -72114,7 +71986,6 @@ rybox.info, 1 rychlikoderi.cz, 0 ryejuice.sytes.net, 1 ryland.consulting, 1 -rylandgoldman.com, 1 rylore.com, 1 rymanow.tk, 1 rymergames.tk, 1 @@ -72136,6 +72007,7 @@ s-a.xyz, 1 s-c.se, 1 s-cubed.net, 1 s-culture.co.kr, 1 +s-geiser.de, 1 s-gong.com, 1 s-huset.dk, 1 s-ip-media.de, 1 @@ -72162,7 +72034,6 @@ s30365.com, 1 s36533.com, 1 s36594.com, 1 s3cur3.it, 1 -s3dservices.io, 1 s3gfault.com, 1 s3n.se, 1 s3robertomarini.it, 1 @@ -72188,6 +72059,7 @@ s5g8.com, 1 s64.cz, 1 s6729.co, 1 s6957.co, 1 +s6academy.com, 1 s6jl.com, 1 s6o.de, 1 s81365.com, 1 @@ -72202,6 +72074,7 @@ s9297.co, 1 s95.de, 1 s9728.co, 1 sa-blog.net, 1 +sa-hc.com, 1 sa-mp.me, 1 sa-mp.ro, 1 sa.net, 1 @@ -72231,9 +72104,6 @@ sabineforschbach.de, 1 sabkappers.nl, 1 sable.gq, 1 saborcaribe.tk, 1 -sabrinajoias.com.br, 1 -sabrinajoiasprontaentrega.com.br, 1 -sabrinajoiasvarejo.com.br, 1 sabrine.tk, 1 sabworldtricks.tk, 1 sac.moe, 1 @@ -72249,7 +72119,7 @@ sacians.tk, 1 sacibo.ga, 1 sackmesser.ch, 1 saclier.at, 1 -saco-ceso.com, 1 +sacodecuentos.com, 1 sacprincesse.com, 1 sacramentocounty.gov, 1 sacramentum.tk, 1 @@ -72257,7 +72127,6 @@ sacred-knights.net, 1 sacredheart-cliftonheights.net, 1 sacrome.com, 1 sacrosanctus.tk, 1 -sad-berezka.ru, 1 sadbox.es, 1 sadbox.org, 1 sadbox.xyz, 1 @@ -72400,7 +72269,6 @@ saint-petersburg.ml, 1 saintaardvarkthecarpeted.com, 1 saintanne.net, 1 saintanthonylakin.org, 1 -saintanthonyscorner.com, 1 saintaugustineschool.tk, 1 saintereso.tk, 1 sainteugenechurch.net, 1 @@ -72460,7 +72328,6 @@ saksonski-szlak-parowozow.pl, 1 sakura-paris.org, 1 sakura.zone, 1 sakuracdn.com, 1 -sakuracommunity.com, 1 sakuradata.com, 1 sakurapalace.tk, 1 sakuraplay.com, 1 @@ -72537,6 +72404,7 @@ saltstack.cz, 1 saltsugarlove.de, 1 saltydogpaddle.org, 1 saltyfish.tech, 1 +salud-paratodos.com, 1 salud.top, 0 saluddecalidad.com, 1 saludmas.site, 1 @@ -72544,9 +72412,9 @@ saludnutrivida.com, 1 saluels.servemp3.com, 1 salukinet.tk, 1 salut-butovo.cf, 1 +salutenaturale.com.br, 1 salutethefish.com, 1 salutethegrains.com, 1 -salutethepig.com, 1 salva.re, 1 salvaalocombia.com, 1 salvadoralevin.tk, 1 @@ -72571,6 +72439,7 @@ samappleton.com, 1 samar-leyte.tk, 1 samara-avia.ru, 1 samara-hosting.tk, 1 +samaresane.com, 1 samaritainsmeyrin.ch, 0 samaritan.tech, 1 samatva-yogalaya.com, 1 @@ -72612,7 +72481,6 @@ sammamish--locksmith.com, 1 sammyjohnson.com, 1 sammyservers.com, 1 sammyservers.net, 1 -samodding.com, 1 samodel.tk, 1 samogonka.tk, 1 samokhin.cf, 1 @@ -72635,6 +72503,7 @@ samui-samui.de, 0 samuidiving.net, 1 samuirehabcenter.com, 1 samuraicafeauc.com, 1 +samuraiskye.com, 1 samusil.org, 1 samvanderkris.com, 1 samvanderkris.xyz, 1 @@ -72659,6 +72528,7 @@ sanatori-elochka.tk, 1 sanatori-teterev.tk, 1 sanatorii-sverdlovskoy-oblasti.ru, 1 sanatorionosti.com.ar, 1 +sanatstore.ir, 1 sanbornteam.com, 1 sancaktepehaber.tk, 1 sanchez.adv.br, 0 @@ -72689,7 +72559,6 @@ sandervankasteel.nl, 0 sandgatebaysidedental.com.au, 1 sandhaufen.tk, 1 sandiegoluxuryhomes.org, 1 -sandiegoopticas.com, 1 sandiegotown.com, 1 sandiuno.ml, 1 sandmanintel.com, 1 @@ -72821,7 +72690,7 @@ sarah-brown.tk, 1 sarah-harding.tk, 1 sarah-jane.nl, 1 sarahbeckettharpist.com, 1 -sarahjanecreates.co.uk, 1 +sarahjaneethan.co.uk, 1 sarahlicity.co.uk, 1 sarahlicity.me.uk, 1 sarahplusdrei.de, 1 @@ -72835,7 +72704,6 @@ saraleebread.com, 0 sarariman.com, 1 sarasotadentistry.com, 1 sarasotaroboticurology.com, 1 -sarasturdivant.com, 1 saratov24.tk, 1 saratovlive.tk, 1 saratovnews.ml, 1 @@ -72855,7 +72723,6 @@ sarindia.com, 1 sarink.eu, 1 sarjakuvakauppa.fi, 1 sarkisianbuilders.com, 1 -sarkoziadam.hu, 1 sarmpel.tk, 1 sarndipity.com, 1 sarny.at, 1 @@ -72863,11 +72730,13 @@ saro.me, 1 sarogiw.tk, 1 saronikos.guide, 1 saropa.com, 1 +sarouel.fr, 1 sarpsb.org, 1 sartoria.roma.it, 1 sarumtechnologies.com, 1 sas-snowboarding.sk, 1 sasakala.tk, 1 +sascha-brockel.de, 1 sascha.io, 1 sascha.is, 1 saschaeggenberger.ch, 1 @@ -72881,7 +72750,6 @@ sashka.com.ua, 1 sashleighaust.com, 1 sasioglu.co.uk, 1 saskadoodle.com, 1 -sasquatt.com.br, 1 sasrobotics.xyz, 1 sasroli.tk, 1 sassandbelle.co.uk, 1 @@ -72905,7 +72773,6 @@ satinn.pl, 1 satisfaction.su, 1 satisperfectacollections.com, 1 sativatunja.com, 1 -satmali.az, 1 satmd.de, 1 satoshilabs.com, 1 satoshinumbers.com, 1 @@ -72926,6 +72793,7 @@ saudeealimentos.com, 1 saudeintimadamulher.com.br, 1 saudenoclique.com.br, 1 sauenytt.no, 1 +sauer-systems.net, 1 sauerbrey.eu, 1 sauerland-rundflug.de, 1 sauerland-schnittgruen.de, 1 @@ -72955,6 +72823,7 @@ savbus.com, 1 savbus.net, 1 savbus.ws, 1 save-me-aachen.de, 1 +save-me-koeln.de, 1 savebees.org, 1 savebt.net, 1 savecrypto.org, 1 @@ -72979,6 +72848,7 @@ savoir.fr, 1 savorvip.ir, 1 sawiday.at, 1 sawiday.be, 1 +sawiday.com, 1 sawiday.cz, 1 sawiday.de, 1 sawiday.es, 1 @@ -73031,6 +72901,7 @@ sbir.gov, 1 sbirecruitment.co.in, 1 sbit.com.br, 1 sbivc.jp, 1 +sbl250.com, 1 sbm.cloud, 1 sbmsitelist.tk, 1 sbo-dresden.de, 1 @@ -73067,6 +72938,7 @@ scallywagsbouncycastles.co.uk, 1 scallywagskids.co.uk, 1 scalpel.com, 1 scamblockplus.org, 1 +scambusters.club, 1 scan.co.uk, 1 scanamed.tk, 1 scanbetting.ga, 1 @@ -73081,6 +72953,7 @@ scanmailx.com, 1 scanpay.dk, 1 scapdoors.ca, 1 scarabcoder.com, 1 +scaracloud.ddns.net, 1 scarafaggio.it, 1 scarinex.tk, 1 scatsbouncingcastles.ie, 1 @@ -73180,10 +73053,11 @@ schmidtplasticsurgery.com, 1 schmiggywibblits.net, 1 schmitt-etienne.fr, 1 schmitt-max.com, 1 -schmitt.ws, 1 +schmitt.ws, 0 schmitz.link, 1 schmuggelware.de, 0 schnapke.name, 1 +schnaube.de, 1 schneckenhilfe.de, 0 schnegg.name, 0 schneidr.de, 1 @@ -73237,6 +73111,7 @@ school16-tob.tk, 1 school173.tk, 1 school43.tk, 1 schoolantwoorden.tk, 1 +schoolbuddy.ch, 1 schoolcafe.com, 1 schooli.io, 1 schoolofphilosophy.org.au, 1 @@ -73303,6 +73178,7 @@ schutzwerk.com, 1 schwabenhaus-ka.de, 1 schwalliers.com, 1 schwanke.in, 0 +schwano-dent.at, 1 schwarz-gelbe-fuechse.de, 1 schwarzegar.de, 1 schwarzenberg.tk, 1 @@ -73340,7 +73216,6 @@ scienceweb.tk, 1 sciencex.com, 1 scientia.ga, 1 scientific-socialism.cf, 1 -scientific.boston, 1 scigov.xyz, 1 sciguyryan.com, 1 scijinks.gov, 1 @@ -73394,13 +73269,12 @@ scouting-kontiki.nl, 1 scouting-wageningen.nl, 1 scoutingkontiki.nl, 1 scoutingridderkerk.nl, 1 -scoutingtheworld.co.uk, 1 scoutingtungelroy.nl, 1 scoutnet.de, 1 scoutreinosa.tk, 1 scoutsanbartolome.tk, 1 scoutsanpieropatti.tk, 1 -scoutsberg.be, 1 +scoutsberg.be, 0 scouttrails.com, 1 scp-079.org, 1 scp-trens.notaires.fr, 1 @@ -73484,6 +73358,7 @@ scurtam.tk, 1 scuters.club, 1 scvoet.me, 1 scw.nz, 1 +scwildflours.com, 1 scwilliams.co.uk, 1 scwilliams.uk, 1 sd.af, 1 @@ -73595,6 +73470,7 @@ sebarin.tk, 1 sebastiaandouma.co.uk, 1 sebastiaandouma.com, 1 sebastiaanwijnimport.nl, 1 +sebastian-bravo.com, 1 sebastian-janich.de, 1 sebastian-kraus.me, 1 sebastian-kuhnert.de, 1 @@ -73668,6 +73544,7 @@ secretosbolivia.tk, 1 secretpanties.com, 1 secretpigeon.com, 1 secretsanta.fr, 0 +secretsauceangel.com, 1 secretsdujeu.com, 1 secretserveronline.com, 1 secretstomartialarts.tk, 1 @@ -73676,6 +73553,7 @@ secretworld.ml, 1 secrium.io, 1 secs.london, 1 secta.cf, 1 +secteer.com, 1 sectelligence.nl, 1 sectember.com, 1 sectember.events, 1 @@ -73715,7 +73593,6 @@ securegovernment.us, 1 secureheaders.com, 1 securehugs.com, 1 secureim.de, 1 -secureindia.co, 1 securejabber.me, 1 securelect-inspection.com, 1 securelogin.nu, 1 @@ -73817,6 +73694,7 @@ seekfirstthekingdom.ca, 1 seeks.ru, 1 seeksupply.ga, 1 seekthe.net, 1 +seeme.ai, 1 seemeagain.com, 1 seemomclick.com, 1 seemyreality.tk, 1 @@ -73853,7 +73731,6 @@ seguridadsistem.tech, 1 seguridadsistemtienda.tech, 1 seguridadysaludeneltrabajo.com.co, 1 seguros-de-salud-y-vida.com, 1 -segurosbalboa.com.ec, 0 segurosmaurobracchieri.com, 1 segurosocial.gov, 0 seguroviagem.srv.br, 0 @@ -73961,7 +73838,6 @@ semantica.cz, 0 semao.org, 1 semaphore-studios.com, 1 sembosihosting.tk, 1 -sembrando-amor.com, 1 sembyotic.com, 1 semen3325.xyz, 0 semenov.ml, 1 @@ -74002,7 +73878,6 @@ sendc.at, 1 sendcat.com, 1 sender.services, 1 senderismoinfantil.tk, 1 -sendfile.online, 1 sendingbee.com, 1 sendmeback.de, 0 sendonce.io, 1 @@ -74051,7 +73926,6 @@ sentandsecure.com, 1 sentencing.net, 1 sentenza.tk, 1 senterada.tk, 1 -sentic.info, 1 sentidosdelatierra.org, 1 sentiments.io, 1 sentinel.gov, 1 @@ -74106,16 +73980,19 @@ seolib.org, 1 seoline.cf, 1 seolister.cf, 1 seolisting.cf, 1 +seolotsen.de, 1 seomag.tk, 1 seomarketing.bg, 1 seomaton.com, 1 seomaton.org, 1 seomen.biz, 1 seon.me, 1 +seondigo.com, 1 seonoco.com, 1 seoonline.cf, 1 seoonlinejaipur.tk, 1 seopiar.tk, 1 +seoprnews.cf, 1 seopromotion.tk, 1 seoquake.com, 1 seoranker.tk, 1 @@ -74134,6 +74011,7 @@ seostrit.cf, 1 seoteam.tk, 1 seotoolset.tk, 1 seoul.dating, 1 +seounlock.com, 1 seovision.se, 1 seovisits.tk, 1 seoviziti50.tk, 1 @@ -74210,11 +74088,11 @@ seroquelonline.tk, 1 serpenteq.com, 1 serphost.ml, 1 serpic.photo, 1 +serptoolsuite.com, 1 serrande.roma.it, 1 serrano-chris.ch, 0 serrature.roma.it, 1 serruriersarcelles.org, 1 -sertaobom.eco.br, 1 seru.eu, 1 servcom.net.au, 1 serve-a.com.au, 1 @@ -74249,6 +74127,7 @@ serveroffline.net, 0 serverpedia.de, 1 serversfrom.space, 1 serversftw.com, 1 +serverstatus.tk, 1 serverstuff.info, 1 serversuit.com, 1 servertastic.com, 1 @@ -74302,7 +74181,9 @@ servtraqazure.com, 1 servx.org, 1 serw.org, 1 serwetki-papierowe.pl, 1 +serwis-telewizorow.pl, 1 serwis-wroclaw.pl, 1 +serwistomy.pl, 1 seryovpn.com, 1 seryox.com, 1 ses.hu, 1 @@ -74350,6 +74231,7 @@ seva.fashion, 1 sevastopol.tk, 1 sevathian.com, 1 seven-purple.com, 1 +sevenartzpublicidad.com, 1 sevenhillsapartments.com.au, 1 sevenicealimentos.com.br, 1 sevenmatches.com, 1 @@ -74365,7 +74247,7 @@ sevsey.ru, 1 sevwebdesign.com, 1 sewa.nu, 1 sewafineseam.com, 1 -sewamobilperdana.com, 1 +sewamobilperdana.com, 0 sewatec.com, 1 sewavillamurah.tk, 1 sewfarsewgood.co.uk, 1 @@ -74377,7 +74259,6 @@ sewoo.co.uk, 1 seworld.ml, 1 sex-education.com, 1 sex-sex-cam.com, 1 -sex5.com, 1 sexaki.com, 1 sexar.info, 1 sexara.co, 1 @@ -74399,14 +74280,15 @@ sexshopnet.com.br, 1 sextacy.tk, 1 sextop.net, 1 sextop1.me, 1 -sextop1.pro, 1 sexvideos.tel, 1 sexvirtualspace.com, 1 sexwork.net, 1 sexy-store.nl, 1 sexyblonds.net, 1 +sexychatakides.com, 1 sexyfish.com, 1 sexyfotosvandep.nl, 1 +sexymassageoil.com, 1 sexytagram.com, 1 seyfarth.de, 1 seyhanlar.com, 1 @@ -74426,6 +74308,7 @@ sfg-net.net, 1 sfg-net.org, 1 sfg-nordholz.de, 1 sfi.sh, 0 +sfiane.com, 1 sfil.fr, 1 sfile.eu, 1 sfirat-haomer.com, 1 @@ -74510,7 +74393,6 @@ shadowsocks.se, 1 shadowsocks.software, 1 shadowsocks.to, 1 shadowvolt.net, 1 -shadsupershop.com, 1 shadwe.com, 1 shadynook.net, 1 shadypark.tk, 1 @@ -74546,7 +74428,7 @@ shalott.org, 1 shalyapin.by, 1 sham-group.fr, 1 shamans.ga, 1 -shamara.info, 1 +shamara.info, 0 shamariki.ru, 0 shambala.cf, 1 shambhu.info, 1 @@ -74566,6 +74448,7 @@ shanhay.tk, 1 shanju.tk, 1 shankangke.com, 1 shannapeeples.com, 1 +shanoviyam.com, 1 shanoviyam.in, 1 shansen-online.de, 1 shanshushu.com, 1 @@ -74581,6 +74464,7 @@ shapin.tv, 1 sharanyamunsi.net, 1 shard.vc, 1 share-io.com, 1 +share.gy, 1 sharealo.org, 1 shareasale-analytics.com, 1 sharebot.ga, 1 @@ -74620,6 +74504,7 @@ sharisharpe.com, 1 shark-host.tk, 1 shark.cat, 1 shark5060.net, 1 +sharkeyscuba.com, 1 sharking.gq, 1 sharmafamily.tk, 1 sharpe-practice.co.uk, 1 @@ -74639,6 +74524,8 @@ shavegazette.com, 1 shavingks.com, 1 shavit.space, 1 shawcentral.ca, 0 +shawclan.id.au, 1 +shawfamily.id.au, 1 shawiah.tk, 1 shawnalucey.com, 1 shawngvs.com, 1 @@ -74798,6 +74685,7 @@ shipmonk.com, 1 shippercenter.info, 1 shipping-trade.ga, 1 shipping24h.com, 0 +shippingbo.com, 1 shippinglabel.de, 1 shiqi.ca, 1 shiqi.lol, 1 @@ -74815,6 +74703,7 @@ shiresvets.com, 1 shirevirtual.tk, 1 shirhashirim.org.il, 1 shiriforum.tk, 1 +shirlygilad.com, 1 shiroanime.es, 1 shiroki-k.net, 1 shiropaev.tk, 1 @@ -74825,7 +74714,6 @@ shishamania.de, 1 shishkabobnc.com, 1 shishkin.us, 1 shishlik.net, 1 -shit.software, 1 shitagi-shop.com, 1 shitbeast.institute, 1 shitcountries.org, 1 @@ -74952,7 +74840,6 @@ shortcutable.com, 1 shortdiary.me, 1 shorten.ninja, 1 shortr.li, 1 -shortwave.fun, 1 shoshin-aikido.de, 1 shoshin.technology, 1 shossain.tk, 1 @@ -75056,7 +74943,6 @@ siamericas.com, 1 siamojo.com, 1 siamrehab.com, 1 siamsnus.com, 1 -sianbryn.co.uk, 1 sianjhon.com, 1 siava.ru, 1 sibekoaircons.co.za, 1 @@ -75075,7 +74961,6 @@ siccardisport.it, 1 sice-si.org, 1 sich-fight.club, 1 siciliadisinfestazioni.it, 1 -siciliamconsulting.com, 1 sicilianbalm.com, 1 siciliapulizie.it, 1 sicken.eu, 1 @@ -75111,6 +74996,7 @@ siebeve.be, 1 siecledigital.fr, 1 siegemund-frankfurt.de, 1 siegprod.tk, 1 +sieh.es, 1 sieiro.tk, 1 siel.nl, 1 sielsystems.nl, 1 @@ -75140,8 +75026,17 @@ sigint.pw, 1 sigismonda.ch, 0 sigma-signalisation.com, 1 sigma957.net, 1 +sigmalux.ca, 1 +sigmalux.co.nz, 1 +sigmalux.co.uk, 1 +sigmalux.com.au, 1 +sigmalux.es, 1 +sigmalux.fr, 1 sigmalux.ltd, 1 +sigmalux.lu, 1 +sigmalux.nz, 1 sigmalux.sarl, 1 +sigmalux.uk, 1 sigmapramuka.com, 1 sigmasensors.com.br, 1 sigmateca.tk, 1 @@ -75197,6 +75092,7 @@ silashes.ru, 1 silaslova-ekb.ru, 1 sildenafilcitrate.cf, 1 sildenafilcitrate100mg.ga, 1 +silensky.com, 1 silent-clean.de, 1 silent-yachts.com, 1 silentexplosion.de, 1 @@ -75214,7 +75110,6 @@ silicon-vision.com, 1 silina.tk, 1 silkebaekken.no, 1 silken-madame.tk, 1 -silkon.net, 1 silkproducts.tk, 1 sillisalaatti.fi, 1 sillysnapz.co.uk, 1 @@ -75360,6 +75255,7 @@ simmonshome.cloud, 1 simmtronic.com, 1 simnovo.net, 1 simoesgoulart.com.br, 1 +simokala.ir, 0 simon-agozzino.fr, 1 simon-hofmann.org, 1 simon-mueller.de, 1 @@ -75382,7 +75278,6 @@ simonmanuel.com, 1 simonreich.de, 1 simonreynoldsfavesunfaves.cf, 1 simonschmitt.ch, 1 -simonsmh.cc, 1 simonspeich.ch, 1 simonsreich.de, 1 simonssh.ddns.net, 1 @@ -75454,16 +75349,15 @@ simplyfixit.co.uk, 1 simplyheadwear.com.au, 1 simplyhelen.de, 1 simplyml.com, 1 -simplymozzo.se, 1 simplyowners.net, 1 simplypromo.com.au, 1 simplyregister.net, 1 simplysmartgardening.com, 1 simplytiles.com, 1 simplyuniforms.com.au, 1 -simpte.com, 1 simrail.nl, 1 sims4hub.ga, 1 +simsalafresh.de, 1 simsimi.ml, 1 simsnieuws.nl, 1 simstarstyle.tk, 1 @@ -75543,7 +75437,6 @@ sintas.lt, 1 sintaxis.org, 1 sinterama.biz, 1 sinuate.gq, 1 -sinuelovirtual.com.br, 1 sinusbot.online, 1 sinusinfectionhelp.org, 1 sinusitis-bronchitis.ch, 1 @@ -75669,6 +75562,7 @@ siusto.com, 1 sivale.mx, 1 sivaru.tk, 1 sivers.org, 1 +sivizius.eu, 1 sivyerge.com, 1 siw64.com, 1 siwek.xyz, 1 @@ -75800,7 +75694,6 @@ sklepwielobranzowymd.com, 1 sklisen.tk, 1 sklotechnik.cz, 1 skmedia.ga, 1 -sknasirali.com, 1 sknclinics.co.uk, 1 skoda-im-dialog.de, 1 skol.bzh, 1 @@ -75821,7 +75714,6 @@ skoroff.com, 1 skoropolnolunie.gq, 1 skorovsud.ru, 1 skorpil.cz, 1 -skortekaas.nl, 0 skory.us, 1 skotobaza.tk, 1 skotty.io, 1 @@ -75875,6 +75767,7 @@ skyfone.cz, 1 skyfpicture.tk, 1 skyger.cz, 1 skyhigh-mizell.tk, 1 +skyhighescaperoom.nl, 1 skyhooks.tk, 1 skyla.tk, 1 skylander.cf, 1 @@ -75965,6 +75858,7 @@ sldev.ovh, 1 sldlcdn.com, 1 sleeker.es, 1 sleeklounge.com, 0 +sleep-go.info, 1 sleep-tight.cf, 1 sleepawaycampseries.tk, 1 sleepet.tw, 1 @@ -76027,6 +75921,7 @@ slotfara.com, 1 slotfara.net, 1 slothless.com, 1 sloths.org, 1 +slothy.cloud, 1 slotlist.info, 1 slotmad.com, 1 slouching.ga, 1 @@ -76158,7 +76053,6 @@ smartlogtower.com, 1 smartlybuy.com, 1 smartmachine.com, 1 smartmail24.de, 1 -smartmeal.ru, 1 smartmessages.net, 1 smartminibushire.co.uk, 0 smartmomsmartideas.com, 1 @@ -76193,7 +76087,6 @@ smartvideo.io, 1 smartviewing.com, 1 smartwank.com, 1 smartweb.ge, 1 -smartwelve.com, 1 smartwoodczech.cz, 1 smartwritingservice.com, 1 smartwurk.nl, 0 @@ -76305,12 +76198,12 @@ smspujcka24.eu, 1 smszone.tk, 1 smtenants.cn, 1 smtouseef.com, 1 -smtp.in.th, 1 smtparish.org, 1 smtpdev.com, 1 smuhelper.cn, 1 smuncensored.com, 1 smuns.ch, 1 +smurffi.net, 1 smutek.net, 1 smvcm.com, 1 smx.net.br, 1 @@ -76325,6 +76218,7 @@ snabbit-support.nu, 1 snabbit-support.se, 1 snabblim.tk, 1 snackbesteld.nl, 1 +snafarms.com, 1 snafu.cz, 1 snakafya.com, 1 snakeanarchy.tk, 1 @@ -76343,6 +76237,7 @@ snargol.com, 1 snatch-note.tk, 1 snatch.com.ua, 1 snatti.com, 1 +snazel.co.uk, 1 snazzie.nl, 1 sncdn.com, 1 sndbouncycastles.co.uk, 1 @@ -76426,12 +76321,10 @@ snowpaws.de, 1 snowplane.net, 1 snowraven.de, 1 snowreport.io, 1 -snowrippers.ro, 0 snowsubs.moe, 1 snowvictoria.ga, 1 snowy.ink, 1 snowy.land, 1 -snowyluma.com, 1 snowyluma.me, 1 snp-media.de, 1 snperformance.gr, 1 @@ -76485,7 +76378,6 @@ socialblaze.com.au, 1 socialclimb.com, 1 socialdevelop.biz, 0 socialhams.net, 1 -socialief.com, 1 socialistyouth.tk, 1 socializam.com, 1 socializator.tk, 1 @@ -76559,14 +76451,13 @@ sofpedia.ro, 0 soft-key.tk, 1 soft-office.tk, 1 soft41.ru, 1 -soft64.me, 1 softandbouncy.co.uk, 1 softanka.com, 1 softbit.pt, 1 softblinds.co.uk, 1 softchin.ir, 1 softcreatr.com, 1 -softcreatr.de, 0 +softcreatr.de, 1 softfay.com, 1 softlan.com.py, 1 softly.sk, 1 @@ -76598,12 +76489,12 @@ softwerk-edv.de, 1 softwing.de, 1 softwsabri.be, 1 sogola.com, 1 -sogravatas.com.br, 1 sogravatas.net.br, 1 sogutma.com.tr, 1 sohamroy.me, 1 sohanakhan.tk, 1 soia.ca, 1 +soilegustafsson.fi, 1 sointelcom.com.co, 1 soinvett.com, 1 sojournsaffairs.com, 1 @@ -76622,7 +76513,6 @@ sol24.net, 1 solacyre.ch, 0 solana-active.tk, 1 solanum-games.com, 1 -solar-aydinlatma.com, 1 solar-ec.com, 1 solar-floodlight.ca, 1 solar-systems.ca, 1 @@ -76702,8 +76592,10 @@ solomo.pt, 1 solomonsklash.io, 1 solonotizie24.it, 1 soloparati.cf, 1 +soloroboto.com, 1 solos.im, 1 solovey.su, 1 +solovyovalawfirm.com, 1 solsi.ga, 1 solsocog.de, 1 solucionesihd.com, 1 @@ -76731,7 +76623,6 @@ somali-derp.com, 1 somaliagenda.com, 1 somaliaonline.com, 1 somalilandtalk.tk, 1 -somanao.com, 1 sombemerchant.com, 1 somecrazy.com, 1 somefe.pt, 1 @@ -76777,6 +76668,7 @@ sonesisonesi.tk, 1 sonesonesisi.tk, 1 songdew.com, 1 songesdeplumes.fr, 1 +songlifty.com, 1 songsmp3.co, 1 songsmp3.com, 1 songsmp3.cool, 1 @@ -76826,6 +76718,7 @@ soohealthy.nl, 1 soolid.tech, 1 soomee.be, 1 soomee1.be, 1 +soon.lk, 0 soontm.de, 1 soontm.net, 1 soopure.nl, 1 @@ -76836,19 +76729,17 @@ soph.jp, 1 soph.tk, 1 soph.us, 1 sopheos.com, 0 +sophi.online, 1 sophiaandmatt.co.uk, 1 sophiahatstudio.com, 1 sophiakligys.com, 1 sophiebbeauty.co.uk, 1 sopo.me, 1 sopra.tk, 1 -soprabalao.com.br, 1 soquee.net, 1 -sor.so, 1 soraharu.com, 1 soraiaschneider.com.br, 1 sorakumo.jp, 1 -sorblack.com, 1 sorcix.com, 1 sorellecollection.com.au, 1 soren.xyz, 1 @@ -76904,10 +76795,10 @@ soufastnet.com.br, 1 sougou.com, 1 souked.com, 1 souki.cz, 1 +soukka-seura.fi, 1 soukodou.jp, 1 soul-source.co.uk, 1 soulc.ml, 1 -soulcasa.com.br, 1 soulcrazy.org, 1 soulema.com, 1 souletter.com, 1 @@ -76967,6 +76858,7 @@ sourceway.de, 1 sourcitec.com, 0 sourdough.vc, 1 souris.ch, 0 +sourmatt.xyz, 1 sous-surveillance.net, 0 souspind.com.br, 1 southafrican.dating, 1 @@ -77007,7 +76899,7 @@ sovendus.com, 1 sovendus.de, 1 sovereignartfoundation.com, 1 sovereignpcs.com, 1 -soverin.net, 0 +soverin.net, 1 sovhoz.tk, 1 sovmestimost-goroskop.cf, 1 sovmestimost-goroskop.ga, 1 @@ -77028,6 +76920,7 @@ soyuznik.ml, 1 soyvigilante.com, 1 sozai-good.com, 1 sozdanie-krana.ml, 1 +sozialabstand.de, 1 soziale.email, 1 sozialstation-ritterhude.de, 1 sozialy.com, 1 @@ -77122,8 +77015,10 @@ sparkwood.org, 1 sparkz.no, 1 sparmedo.de, 1 sparprofi.at, 1 +sparqmedia.nl, 1 sparta-en.org, 1 sparta-szczekociny.tk, 1 +spartac.be, 1 spartacuslife.com, 1 spartaermelo.nl, 1 spartamet.tk, 1 @@ -77136,16 +77031,14 @@ spasicilia.it, 1 spatzenwerkstatt.de, 1 spawn.cz, 1 spaysy.com, 1 -spaziobenedetti.com.br, 1 -spaziopervoi.com.br, 1 spazturtle.co.uk, 1 spazzacamino.roma.it, 1 spbet99.com, 1 spd-porta-westfalica.eu, 1 -spdepartamentos.com.br, 1 spdf.net, 1 spdillini.com, 1 spe.org.co, 1 +speac.jp, 1 speak-polish.com, 1 speaker-animateur.com, 1 speakersbusiness.com, 1 @@ -77203,11 +77096,11 @@ spegeltankar.tk, 1 speich.net, 1 speights-law.com, 1 spek.tech, 1 -speletrodomesticos.com.br, 1 spellcheck24.net, 1 spellchecker.net, 1 spellic.com, 1 speme-design.com, 1 +spendleex.com, 1 spendwise.com.au, 1 spenglerei-shop.de, 1 spenny.tf, 1 @@ -77266,7 +77159,7 @@ spinalien.net, 0 spindle.com.ph, 1 spingenie.com, 1 spinner.dnshome.de, 1 -spinor.im, 1 +spinpay.com.br, 1 spins.fedoraproject.org, 1 spira.kiev.ua, 1 spirella-shop.ch, 1 @@ -77361,7 +77254,6 @@ sports-online.cf, 1 sports-sites.ml, 1 sports-wear.tk, 1 sports.dating, 1 -sportsdrobe.com, 1 sportsjaw.com, 1 sportsmanadvisor.com, 0 sportsmansblog.com, 1 @@ -77376,7 +77268,6 @@ sportugalia.ru, 1 sportvereine.online, 1 sportverzorging.tk, 1 sportvoedingspecialist.nl, 1 -sportwette.eu, 0 sportwetten-anbieter.de, 1 sportxt.ru, 1 spot-cleaner.tk, 1 @@ -77442,7 +77333,6 @@ spteam.net, 1 sptk.org, 1 spuffin.com, 1 spufpowered.com, 1 -spur.com.br, 1 spurghi.roma.it, 1 sputnik1net.org, 1 spyclub.tk, 1 @@ -77565,9 +77455,11 @@ srizer.com, 0 srkarra.com, 1 srkb.net, 1 sro.center, 1 +sro.fi, 1 srochno-pohudeti.tk, 1 srochnozaim.gq, 1 srochnyj-zajm.ga, 1 +sros.fi, 1 sroturkey.tk, 1 srpx.de, 1 srqpedals.com, 1 @@ -77604,7 +77496,7 @@ ss9721.com, 0 ss9728.co, 1 ssa.gov, 0 ssbgportal.net, 1 -ssbkk.ru, 1 +ssbkk.ru, 0 ssbrm.ch, 1 ssc.vg, 1 ssc8689.com, 1 @@ -77618,13 +77510,14 @@ ssenberg.nl, 1 ssfbank.no, 1 ssh-vault.com, 1 sshbox.tk, 1 +sshcrack.com, 1 sshd.site, 1 sshool.at, 1 sshx.top, 1 +ssk.ovh, 1 ssky.cn, 1 ssl-zertifikate.de, 1 ssl.do, 1 -ssl.doctor, 1 ssl.google-analytics.com, 1 ssl.md, 1 ssl24.pl, 1 @@ -77640,6 +77533,7 @@ sslcheck.nl, 1 ssldecoder.org, 1 ssldev.net, 1 sslmate.com, 1 +sslmonkey.net, 1 sslok.com, 0 sslping.com, 1 sslpoint.com, 1 @@ -77647,7 +77541,6 @@ ssls.cz, 1 sslsurvey.de, 1 ssmato.me, 1 ssmca.com, 1 -ssmic.com, 1 ssmm88.cc, 1 ssmpuc.com, 1 ssmut.be, 1 @@ -77664,6 +77557,7 @@ ssrfq.com, 1 ssrvpn.tech, 1 sssldurban.co.za, 1 sssljohannesburg.co.za, 1 +sssnet.xyz, 1 sssppp.gq, 1 sstaging.com, 1 sstr5.ch, 1 @@ -77672,6 +77566,7 @@ ssuiteoffice.com, 1 ssuitesoft.com, 1 st-bede.org, 1 st-innovationcup.com, 1 +st-jitsi.com, 1 st-kilian-markt-erlbach.de, 1 st-li.com, 1 st-news.de, 1 @@ -77694,6 +77589,8 @@ stackhub.cc, 1 stacklasvegas.com, 1 stackpath.com, 1 stackptr.com, 1 +stackstartup.com, 1 +stackstartup.tech, 1 stacktile.io, 0 stacktrace.sh, 1 stackunderflow.com, 1 @@ -77783,6 +77680,7 @@ standard.co.uk, 1 standardequipment.com, 1 standards.gov, 1 standartgost.ru, 1 +standdownofnorthjersey.org, 1 standheizung-shop.de, 1 standoff-magic.ru, 1 standoffdrop.ru, 1 @@ -77845,6 +77743,7 @@ starlim.org, 1 starlux.cz, 1 starmtech.fr, 1 starmyworld.ga, 1 +staroch.name, 1 starorusing.com, 1 starover.tk, 1 starpeak.org, 1 @@ -77858,7 +77757,6 @@ starryvoid.com, 1 starsam80.net, 1 starsandmanifolds.xyz, 1 starsbattle.net, 1 -starsdream.win, 1 starsguru.com, 1 starsing.bid, 1 starskim.cn, 1 @@ -77882,14 +77780,27 @@ startpage.com, 1 startpage.info, 1 startplats.tk, 1 startrek.in, 1 +startstack.tech, 1 startstunter.com, 1 starttls-everywhere.org, 1 starttraffic.uk, 1 +startup-stack.com, 1 +startup-stack.tech, 1 startup.melbourne, 1 startupisland.tw, 1 startuplevel.com, 1 +startupstack.llc, 1 +startupstack.net, 1 +startupstack.online, 1 +startupstack.pro, 1 +startupstack.services, 1 +startupstack.site, 1 +startupstack.software, 1 startupstack.tech, 1 +startupstack.technology, 1 +startupstacktech.com, 1 startupswitzerland.com, 1 +startuptechstack.com, 1 startupum.ru, 1 startupyourmind.com, 1 startw.cf, 1 @@ -77948,7 +77859,6 @@ stavropol-news.ga, 1 stavros.ovh, 1 staxflax.tk, 1 stay-curious.at, 1 -stay.black, 1 staycurrent.eu, 1 staycurrent.nl, 1 stayme.cz, 1 @@ -78043,6 +77953,7 @@ steffentreeservice.com, 1 steffi-in-australien.com, 1 steffi-knorn.de, 1 stefpastoor.nl, 1 +steggemachine.com, 1 stehlik.co.uk, 1 stehlik.sk, 1 steidlewirt.de, 1 @@ -78180,7 +78091,7 @@ stevengoodpaster.com, 1 stevengrech.com, 1 stevenkendypierre.com, 1 stevenpilger.com, 1 -stevenroddis.com, 0 +stevenroddis.com, 1 stevensautotopsandupholstery.com, 1 stevenselectricllc.com, 1 stevenski.com, 0 @@ -78194,6 +78105,7 @@ stevenz.science, 1 stevenz.xyz, 1 stevepacheco.com, 1 stevereedmp.co.uk, 1 +stevesbriefmovierecommendations.com, 1 stevesdrivingschooltyneside.com, 1 stevezheng.cf, 1 stevezheng.tk, 1 @@ -78298,6 +78210,7 @@ stjude-ettekkar.tk, 1 stjustin.org, 1 stkevin-stbenedict.org, 1 stkildaosteopathy.com.au, 1 +stl.news, 1 stleonardmn.org, 1 stln.ml, 1 stlouisinsuranceco.com, 1 @@ -78335,6 +78248,7 @@ stockportpyramid.co.uk, 1 stockslam.ga, 1 stocksnews.tk, 1 stockstuck.com, 1 +stocktonengineering.co.uk, 1 stocktout.info, 1 stocktrader.com, 1 stockway.tk, 1 @@ -78434,6 +78348,7 @@ stormylegions.tk, 1 stortiservices.com, 1 storvann.net, 1 storvann.no, 1 +storybuilder.me, 1 storycollective.film, 1 storycollective.nl, 1 storycycle.tk, 1 @@ -78481,6 +78396,7 @@ strandbyfysio.dk, 1 strandedinotter.space, 1 strandhaus-claassen.de, 1 strandhaus-hinter-der-duene.de, 1 +strandkorb-jentzsch.de, 1 strandom.ru, 1 strandschnuppern.de, 1 strange.ga, 1 @@ -78519,6 +78435,7 @@ strauser.com, 1 stravers.shoes, 1 strawberries.tk, 1 strawberry-laser.gr, 1 +straydio.co.uk, 1 straylight.tk, 1 strd.co, 1 stream-box.tk, 1 @@ -78528,7 +78445,6 @@ streamchan.org, 1 streamelements.com, 1 streaming-download.net, 1 streaminginternacional.com, 1 -streaminginternacional.net, 1 streamkit.gg, 1 streamlineaudio.co.za, 1 streampanel.net, 1 @@ -78542,6 +78458,7 @@ street-hoops.tk, 1 street-legal.tk, 1 street-medics.fr, 1 street-tek.com, 1 +streetboards.lt, 1 streetdancecenter.com, 1 streetlightdata.com, 1 streetmarket.ru, 1 @@ -78549,7 +78466,6 @@ streets.mn, 1 streetshirts.co.uk, 1 streetspotr.com, 1 streetstunters.tk, 1 -streetview.wien, 1 strefapi.com, 1 strefapi.pl, 1 strehl.tk, 1 @@ -78571,6 +78487,7 @@ strictlyguitar.de, 1 strictlynormal.com, 1 strijkshop.be, 1 strikeout.ga, 1 +strily.com, 1 strings.cf, 1 stringtoolbox.com, 1 stringvox.com, 0 @@ -78585,7 +78502,6 @@ strivephysmed.com, 0 strl-tunis.tk, 1 strm.hu, 1 strm.pl, 1 -strming.com, 1 strobe.cool, 1 strobeltobias.de, 1 strobeto.de, 1 @@ -78703,7 +78619,6 @@ studioadevents.com, 1 studioandrew.tk, 1 studioavvocato.roma.it, 1 studioavvocato24.it, 1 -studiobergaminloja.com.br, 1 studiobrandano.com, 1 studiodelbenessere.com, 1 studiodentisticomasi.com, 1 @@ -78724,7 +78639,6 @@ studiomarcella.com, 1 studiomko.com, 1 studionowystyl.pl, 1 studiopirrate.com, 1 -studiopop.com.br, 1 studioproapp.com, 1 studioriehl.com, 1 studioscherp.nl, 1 @@ -78747,6 +78661,7 @@ studium.cz, 1 studius.gq, 1 studport.rv.ua, 1 studsovet.cf, 1 +studujdigital.cz, 1 studwebs.ml, 1 study-support-beans.com, 1 studyin.jp, 1 @@ -78812,6 +78727,7 @@ stylewish.me, 1 stylingstudio.ga, 1 stylle.me, 1 styloeart.com, 1 +styloplumeblog.fr, 1 styplon.cf, 1 stypr.com, 1 stzur.com, 1 @@ -78942,6 +78858,7 @@ sulkmen.tk, 1 sultangroup.ru, 1 suluvir.com, 1 sulytics-tool.com, 1 +sumareaguas.com.br, 1 sumatphoto.com, 1 sumatrabarat.ml, 1 sumatraselatan.ml, 1 @@ -78959,6 +78876,7 @@ sumitchahal.com, 1 summa.eu, 0 summarized.gq, 1 summer.ga, 1 +summer.today, 1 summerbo.at, 1 summercampthailand.com, 1 summermc.cc, 1 @@ -78973,6 +78891,7 @@ summitlighthousela.org, 1 summusglobal.com, 1 sumochki.tk, 1 sumthing.com, 1 +sumutoday.com, 1 sun-beach.com.ua, 1 sun-host.ml, 1 sun-wellness-online.com.vn, 1 @@ -79051,6 +78970,7 @@ sunshinesf.org, 1 sunsong.org, 1 sunsquare.cz, 1 sunstar.bg, 1 +suntzuparadirectivos.com, 1 sunwolf.studio, 1 suomenkielisetnettikasinot.com, 1 suomika.pl, 1 @@ -79087,6 +79007,7 @@ supercentenarian.com, 1 supercharged.co.uk, 1 supercinebattle.fr, 1 supercombinata.by, 1 +supercours.net, 1 supercreepsvideo.com, 0 superdaddy.club, 1 superdolly.cf, 1 @@ -79130,7 +79051,6 @@ superpase.com, 1 superpi.noip.me, 1 supersahnetorten.de, 1 supersandro.de, 1 -supersec.es, 1 superservers.ml, 1 supersisi.cf, 1 supersisi.ml, 1 @@ -79138,6 +79058,7 @@ superskidki.cf, 1 supersonnig-festival.de, 1 supersonnigfestival.de, 1 superspeller.ng, 1 +supersprowtz.com, 1 superstargossip.com, 1 superstarhost.tk, 1 superstart.tk, 1 @@ -79163,6 +79084,7 @@ supplies24.es, 1 supplynation.org.au, 1 support-ticino.ch, 1 support.mayfirst.org, 0 +support96.ru, 1 supportdesk.nu, 1 supportericking.org, 1 supportfan.gov, 1 @@ -79174,7 +79096,6 @@ suprem.biz, 0 suprem.ch, 0 supreme-court.tk, 1 supremestandards.com, 1 -supriville.com.br, 1 sur-v.com, 1 suranganet.tk, 1 surasak.io, 1 @@ -79242,6 +79163,8 @@ sustainabilityknowledgegroup.com, 1 sustainabilitysociety.hk, 1 sustainoss.org, 1 sustc.ac.cn, 1 +sustcarchive.org, 1 +suste.ch, 0 susthx.com, 1 sustsol.com, 1 sutabi.tk, 1 @@ -79274,6 +79197,7 @@ svantner.sk, 1 svarka22.ml, 1 svarnyjunak.cz, 1 svarovani.tk, 1 +svarta.cz, 1 svartx.com, 1 svatbamisiaviti.tk, 1 svatyjur.tk, 1 @@ -79344,6 +79268,7 @@ swallowgateway.com, 1 swallsoft.co.uk, 1 swallsoft.com, 1 swampcoolerservice.com, 1 +swanbitcoin.com, 1 swansdoor.org, 1 swap.gg, 1 swapfin.com, 1 @@ -79356,6 +79281,7 @@ swatee.com, 1 swattransport.ae, 1 sway-cdn.com, 1 sway.com, 1 +swayampaaka.com, 1 swc-cfc.gc.ca, 1 swcloud.io, 1 swd.agency, 1 @@ -79388,6 +79314,7 @@ sweethorses.tk, 1 sweetintrigue.tk, 1 sweetlegs.jp, 1 sweetll.me, 0 +sweetologist.co, 1 sweetparis.cf, 1 sweets-mimatsu.com, 1 sweetspot.co.kr, 1 @@ -79414,14 +79341,12 @@ swiftirc.net, 1 swiftpak.co.uk, 1 swiftqueue.com, 1 swilly.org, 1 -swimminglessons.com.sg, 1 swimmingpoolaccidentattorney.net, 1 swimmingpoolpumpsbassonia.co.za, 1 swimready.net, 1 swimturk.com.tr, 1 swimwear365.co.uk, 1 swindontennisclub.azurewebsites.net, 1 -swindontennisclub.org, 1 swineson.me, 1 swing-belleville.de, 1 swingerclub.in, 1 @@ -79431,6 +79356,7 @@ swingtimeinthegardens.com, 1 swingular.com, 1 swipedon.com, 1 swipetv.ie, 1 +swish-ict.com, 1 swiss-apartments.com, 1 swiss-connection.net, 0 swiss-cyber-experts.ch, 1 @@ -79445,7 +79371,6 @@ swisservers.com, 1 swissfreshaircan.ch, 0 swissfreshaircan.com, 0 swissid.ch, 1 -swissinternationalva.com, 1 swissj.com, 1 swisslifestyletips.ch, 1 swisslinux.org, 1 @@ -79465,7 +79390,6 @@ switcheo.exchange, 1 switcheo.rocks, 1 switchur.com, 1 swivells.com, 1 -swj.red, 1 swkdevserver.tk, 1 swktestserver.tk, 1 swmcfcu.org, 1 @@ -79567,7 +79491,6 @@ synergisticsoccer.com, 1 synergy-logistics.tk, 1 synergyfitness.com.au, 1 synergyflare.com, 1 -synergyworkingdogclub.com, 1 synergyzone.tk, 1 synerionagile.com, 1 synfin.org, 1 @@ -79631,12 +79554,12 @@ systemblog.tk, 1 systemchile.com, 1 systemd.ch, 0 systemd.eu.org, 1 +systemd.info, 1 systemeprod.fr, 0 systemerr.tk, 1 systemintegra.ru, 1 systemisbusy.info, 1 systemli.org, 1 -systemnik.store, 1 systemonthego.com, 1 systemspace.link, 1 systemtoto.ml, 1 @@ -79645,11 +79568,11 @@ systemweb.no, 1 systemzeit.info, 1 systime.dk, 1 systoolbox.net, 1 +sysv-consult.de, 1 syswiki.org, 1 sysystems.cz, 1 syt3.net, 1 syuez.com, 1 -syuez.org, 1 syunpay.cn, 1 sywnthkrawft.tk, 1 syy.hk, 0 @@ -79664,13 +79587,13 @@ szasz.me, 1 szaszm.tk, 0 szc.me, 1 szclsya.me, 1 -szczurek-zelazko.pl, 1 szechenyi2020.hu, 1 szentistvanpt.sk, 1 szepsegbennedrejlik.hu, 1 szeptylasu.eu, 1 szerbnyelvkonyv.hu, 1 szerelem.love, 1 +szerver1.ml, 1 szetowah.org.hk, 1 szlovaknyelv.hu, 1 szlovennyelv.hu, 1 @@ -79795,12 +79718,13 @@ t9297.co, 1 t9728.co, 1 t9i.in, 1 ta-65.com, 1 -ta-nuth.nl, 1 +ta-nuth.nl, 0 ta-soest.nl, 0 ta65.com, 1 taabe.net, 1 taalcursusvolgen.nl, 1 taalmeisje.nl, 1 +taaltaal.nl, 1 taanishsaifu.gq, 1 taartbesteld.nl, 1 taartenvanthea.nl, 1 @@ -79857,7 +79781,6 @@ tadu.de, 1 tadzkitchen.com, 1 taekwondo-berlin.tk, 1 taffe-elec.com, 1 -tag-coin.com, 1 tagabrand.co.uk, 1 tagana-anindustrialpark.tk, 1 tagderinspiration.ch, 1 @@ -79897,11 +79820,11 @@ taiklus.lt, 1 taikodom.tk, 1 tail.id.lv, 1 tail.ml, 1 +taildb.com, 1 tailpuff.net, 0 tails.boum.org, 1 tailwag.party, 1 taim.io, 1 -taimane.com, 1 taipak-krasnoyar.tk, 1 taipei-101.tk, 1 taiphanmem.net, 1 @@ -79996,6 +79919,7 @@ talsi.eu, 1 talun.de, 1 talusan.tk, 1 talxis.com, 1 +talyllyn.co.uk, 1 tam-moon.com, 1 tam-safe.com, 1 tam7t.com, 0 @@ -80048,7 +79972,6 @@ tandem-trade.ru, 0 tandemexhibits.com, 1 tandempartnerships.com, 1 tandemwise.net, 1 -tandk.com.vn, 1 tandoanh.vn, 1 tandzorg.link, 1 tangel.me, 1 @@ -80105,6 +80028,7 @@ taoofbeauty.tk, 1 taotic.eu, 1 taowa.ca, 1 taoyingchang.tk, 1 +tapbutdao.com, 1 tapchiphaidep.info, 1 tapestries.tk, 1 tapissier-schall.fr, 1 @@ -80134,6 +80058,7 @@ tarasevich.by, 1 tarba-schluesseldienst-duesseldorf.de, 1 tarchive.xyz, 1 tardics.com, 1 +tardics.net, 1 tardis.io, 1 tarek.link, 1 tarek.wtf, 1 @@ -80156,7 +80081,6 @@ tarotsgratuits.com, 1 tarsan.cz, 1 tarsashaz-biztositas.hu, 1 tartaneagle.org.uk, 1 -tartanhamedshop.com.br, 1 tartu.ee, 1 taruntarun.net, 0 tarzanka.ml, 1 @@ -80196,6 +80120,7 @@ tatary.cf, 1 tatary.tk, 1 tate.com, 1 tateishi-ip.com, 1 +tathanhson.com, 0 tatiana-kpb.tk, 1 tatildekirala.com, 1 tatler.com, 1 @@ -80216,6 +80141,7 @@ tauflight.com, 1 taunusstein.net, 1 tauran.net, 1 tauriscia.tk, 1 +tauschen.info, 1 taustyle.ru, 1 tavolaquadrada.com.br, 1 tavsys.net, 1 @@ -80238,9 +80164,9 @@ taxi-puck.pl, 1 taxi-zakaz.ml, 1 taxi24.ml, 1 taxicab4you.com, 1 -taxichic.com, 1 taxicollectif.ch, 0 taxid-k.be, 1 +taxiindenbosch.nl, 1 taximinvody.ml, 1 taxis-collectifs.ch, 0 taxisaeropuertomadrid.com, 1 @@ -80263,6 +80189,7 @@ tazamobile.ga, 1 tazarelax.es, 1 tazemama.biz, 1 tazendaforever.tk, 1 +tazj.in, 1 tb-bolshevik.tk, 1 tb-devel.de, 1 tb-itf.de, 1 @@ -80326,7 +80253,6 @@ tdelmas.ovh, 1 tdfbfoundation.org, 1 tdolar.com, 1 tdr.today, 1 -tdrcartuchos.com.br, 1 tdro.cf, 1 tdrs.info, 1 tds-forum.tk, 1 @@ -80338,7 +80264,6 @@ tdstoragebay.com, 1 tdude.co, 1 tdvg.nl, 1 tdyx-china.com.cn, 1 -tea-empire.co.uk, 1 tea.in.th, 1 teabagdesign.co.uk, 1 teach.gq, 1 @@ -80391,7 +80316,6 @@ teamrevolution.tk, 1 teams.microsoft.com, 1 teams.microsoft.us, 1 teamsimplythebest.com, 1 -teamspeak-serverlist.xyz, 1 teamsuccess.io, 1 teamsudan.cf, 1 teamtouring.net, 1 @@ -80448,7 +80372,6 @@ techaulogy.com, 1 techbelife.com, 1 techbrawl.org, 1 techbrown.com, 1 -techbymemo.com, 1 techcentral.ml, 1 techcentral.my, 0 techcenturion.com, 1 @@ -80477,6 +80400,7 @@ techgadgetry.in, 1 techgo.re, 1 techhappy.ca, 1 techie-show.com, 1 +techiecomputers.com, 1 techiehall.com, 1 techiesmart.tk, 1 techindo.cf, 1 @@ -80494,6 +80418,7 @@ techmanstan.com, 1 techmasters.io, 1 techmoviles.com, 1 techmunchies.net, 1 +technews360.in, 1 technewsetc.tk, 1 techni-grav.com, 1 technic3000.com, 1 @@ -80513,6 +80438,7 @@ technicwaladost.com, 1 techniekutrecht.nl, 1 technifocal.com, 1 technik-boeckmann.de, 1 +techno-iptv.com, 1 technochat.in, 1 technofirstonline.com, 1 technogps.com, 1 @@ -80534,6 +80460,8 @@ technoscoots.com, 1 technosorcery.net, 1 technospeakco.com, 1 technoswag.ca, 1 +technoteers.com, 1 +technotronikcanada.ca, 0 technoweb.ga, 1 technowise.tk, 1 techold.ru, 0 @@ -80552,7 +80480,6 @@ techshift.eu, 1 techshift.nl, 1 techshift.se, 1 techsmartstore.com, 1 -techsna.com, 1 techsocial.nl, 1 techsolvency.com, 1 techsys.cz, 1 @@ -80565,7 +80492,6 @@ techtrader.io, 1 techunit.org, 1 techusers.de, 1 techvalue.gr, 1 -techvhow.com, 1 techview.link, 1 techviewforum.com, 1 techvrse.com, 1 @@ -80591,7 +80517,6 @@ tecnikan.com.ar, 1 tecnipuntoseguridad.com, 1 tecnoarea.com.ar, 1 tecnoblog.net, 1 -tecnobrasilloja.com.br, 1 tecnocomp-systems.com, 1 tecnodritte.it, 1 tecnogaming.com, 1 @@ -80655,6 +80580,7 @@ teknemodus.com.au, 1 teknik.io, 1 teknikaldomain.me, 1 tekniksnack.se, 1 +teknisetdemarit.fi, 1 tekniskakustik.se, 1 tekno.de, 1 teknoforums.com, 1 @@ -80671,7 +80597,6 @@ telamon.eu, 1 telangananews.ml, 1 telco.at, 1 telcodb.net, 1 -telcotronics.com, 1 teldak.pt, 1 tele-alarme.ch, 1 tele-assistance.ch, 1 @@ -80723,6 +80648,7 @@ teleradio.tk, 1 teleshop.be, 1 teleskell.org, 1 telesoftware.tk, 1 +telesonicengineering.com.my, 1 telestepina.ru, 1 telesto.online, 1 teletaxe.fr, 1 @@ -80734,7 +80660,6 @@ televizeseznam.cz, 1 televotia.ch, 1 telework.gov, 1 telford.codes, 1 -telhabrasil.com.br, 1 telling.xyz, 1 tellingua.com, 0 tellthemachines.com, 1 @@ -80839,6 +80764,7 @@ teplomash24.ru, 1 teplotehnik.tk, 1 teppich-frisch.de, 1 teppichfrisch.de, 1 +tepui.io, 1 teq-automotive.com, 1 teqip-pms.gov.in, 1 tequilazor.com, 1 @@ -80863,7 +80789,6 @@ termee.com, 1 termeh-store.com, 1 termin-online.com, 1 terminalhrd.com, 1 -terminalvelocity.co.nz, 1 termino.eu, 1 terminsrakning.se, 1 termitinitus.org, 1 @@ -80879,6 +80804,7 @@ terra-x.net, 1 terra.by, 0 terrab.de, 0 terracloud.de, 0 +terraco.ga, 1 terracom.gr, 1 terraelectronica.ru, 1 terrafinanz.de, 1 @@ -80902,7 +80828,7 @@ territory.cf, 1 terrorbilly.com, 1 terrorblast.tk, 1 terrty.net, 1 -terrybutler.co.uk, 1 +terrybutler.co.uk, 0 terryjohnsononline.com, 1 ters.ga, 1 terudon.com, 1 @@ -80922,7 +80848,7 @@ tespent.cn, 1 tessai.ga, 1 tesseractinitiative.org, 1 tessierashpool.de, 1 -test-greavesindia.pantheonsite.io, 1 +test-dns.eu, 1 test-iq.gq, 1 test-my.tk, 1 test-online.tk, 1 @@ -80962,6 +80888,7 @@ testoon.com, 1 testosterone-complex.com, 1 testosteronedetective.com, 1 testovaci.ml, 1 +testowapianka.pl, 1 testpool.gq, 1 testpornsite.com, 1 testpsicotecnicos.com.es, 1 @@ -80981,6 +80908,7 @@ teto.nu, 1 tetrabyte.tk, 1 tetracycline500mg.ga, 1 tetraetc.com, 1 +tetragir.com, 0 tetraktus.org, 1 tetrarch.co, 1 tetsai.net, 1 @@ -81010,10 +80938,12 @@ texasurodoc.com, 1 texasvolunteerattorneys.org, 1 texaswinetrail.com, 1 texby.com, 1 +texcolors.com.co, 1 texel.es, 1 texhnolyze.net, 1 texiafinishing.com, 1 texier.mx, 1 +texnogu.ru, 1 texosmotr.tk, 1 text-shirt.com, 0 textbrawlers.com, 1 @@ -81038,6 +80968,7 @@ texy.info, 1 teysens.com, 1 tezcam.tk, 1 tezwifi.com, 1 +tf-network.de, 1 tf2b.com, 1 tf2calculator.com, 1 tf7879.com, 1 @@ -81049,7 +80980,7 @@ tfk.fr, 1 tfle.xyz, 1 tflite.com, 1 tfnapps.de, 1 -tfq.me, 1 +tfq.me, 0 tfreeman.org, 1 tfrei.de, 1 tft-cheat-sheet.com, 1 @@ -81082,12 +81013,12 @@ tgoaa.com, 1 tgoall.com, 1 tgoasia.com, 1 tgod.co, 1 -tgtv.tn, 1 tgtw.cc, 1 tgui.eu, 1 tgui.net, 1 tgw.com, 1 tgwork.com, 1 +th-nuernberg.de, 1 th.search.yahoo.com, 0 thablubb.de, 1 thackbarth.net, 1 @@ -81143,6 +81074,7 @@ thca.ca, 1 thcdev.de, 1 thconsulting.co.uk, 1 thcpbees.co.uk, 1 +thddns.net, 1 the-alan-parsons-project.com, 1 the-allmighty-mike.tk, 1 the-archimedeans.org.uk, 1 @@ -81154,7 +81086,6 @@ the-body-shop.hu, 0 the-busbys.com, 1 the-digitale.com, 0 the-earth-yui.net, 0 -the-fermenter.com, 1 the-finance-blog.com, 1 the-forgotten.net, 1 the-gist.io, 1 @@ -81170,6 +81101,7 @@ the-pack.nl, 1 the-pcca.org, 1 the-race.com, 1 the-red.pp.ua, 1 +the-spellcaster.com, 1 the-spoonfeed.club, 1 the-train.de, 1 the-trophy-company.com, 1 @@ -81245,6 +81177,7 @@ thebimhub.com, 1 thebinarys.com, 1 thebirchwoods.com, 1 thebirthdaysite.co.uk, 1 +thebismarckmarathon.com, 1 thebit.link, 1 theblackboard.gr, 1 theblackknightsings.com, 1 @@ -81277,6 +81210,7 @@ thebridalcollection.com, 1 thebrightons.co.uk, 1 thebrightons.uk, 1 thebroadcastknowledge.com, 1 +thebrookeb.com, 1 thebss.tk, 1 thebte.com, 1 thebucknetwork.com, 1 @@ -81289,7 +81223,6 @@ thecameradivision.com, 1 thecandidforum.com, 1 thecarolingconnection.com, 1 thecarpenters.tk, 1 -thecavalries.com, 1 thecellulitediet.com, 1 thechallenge.fit, 1 thechandigarhcity.com, 1 @@ -81303,6 +81236,7 @@ theclonker.de, 1 thecloudshelter.com, 1 thecluster.xyz, 1 thecoffeecamp.com, 1 +thecomfortcollection.com, 1 thecompany.pl, 1 thecomparativist.com, 1 theconcordbridge.azurewebsites.net, 1 @@ -81312,6 +81246,7 @@ theconsultingpeople.tk, 1 theconverter.net, 1 thecorianderkitchen.com, 1 thecowquerie.tk, 1 +thecr3ative.com, 1 thecr3ative.tk, 1 thecraftingstrider.net, 1 thecrazybrains.tk, 1 @@ -81384,7 +81319,6 @@ thefashionpolos.com, 1 thefasterweb.com, 1 thefastmode.com, 1 thefbstalker.com, 1 -thefengshuioffice.com, 1 theferrarista.com, 0 thefestivals.uk, 1 thefishshop.ga, 1 @@ -81416,6 +81350,7 @@ thefusion.net.in, 1 thefussyeater.ie, 1 thegadgetsuperstore.com, 1 thegarrowcompany.com, 1 +thegatewaytoanewworld.com, 1 thegatheringocala.com, 1 thegaucompany.healthcare, 1 thegeekdiary.com, 1 @@ -81447,6 +81382,7 @@ thehairstandard.com, 1 thehamiltoncoblog.com, 1 thehappyxwife.ga, 1 thehardylawfirm.com, 1 +thehasanyildirim.tk, 1 thehassanmusic.tk, 1 thehasty.com, 1 thehaxbys.co.uk, 1 @@ -81454,12 +81390,10 @@ theheadplug.tk, 1 theheatingoilclub.co.uk, 1 thehiddenbay.cc, 0 thehiltonfirm.tk, 1 -thehimachal.com, 1 thehivedesign.org, 1 thehobincompany.com, 1 thehoff.ddnss.de, 1 theholloways.tk, 1 -thehomeicreate.com, 1 thehonorguard.org, 1 thehookup.be, 1 thehopefuture.com, 1 @@ -81499,6 +81433,7 @@ thekev.in, 1 thekeymusic.com, 1 thekeytobusiness.co.uk, 1 thekiddz.com, 1 +thekidszone.in, 1 thekingofhate.com, 0 theknockout.tk, 1 thekodester.ca, 1 @@ -81514,8 +81449,8 @@ thelearningenterprise.co.uk, 1 thelegionshirley.co.uk, 1 thelencystore.com, 1 thelevelman.com, 1 -thelicagency.com, 1 thelifeofmala.com, 1 +thelimitededition.in, 1 thelinuxspace.com, 1 thelinuxtree.net, 1 thelittlejewel.com, 1 @@ -81541,6 +81476,7 @@ themattresswarehouse.co.za, 1 thematyper.tk, 1 themeaudit.com, 1 themecraft.studio, 1 +themedicalmedia.com, 1 themegteam.com, 1 themenzentrisch.de, 1 themerchandiser.net, 0 @@ -81549,7 +81485,6 @@ themesurgeons.net, 1 themiddle.co, 1 themigraineinstitute.com, 1 themilanlife.com, 1 -themimitoof.fr, 0 theminiacs.com, 1 themist.cz, 1 themodernreviewer.ga, 1 @@ -81563,6 +81498,7 @@ themusicinnoise.net, 1 themusthaves.de, 1 themusthaves.nl, 1 thenanfang.com, 1 +thenational.academy, 1 theneatgadgets.com, 1 thenerdic.com, 1 thenest.se, 1 @@ -81587,20 +81523,20 @@ theocharis.org, 1 theocjournal.tk, 1 theocratic.cf, 1 theodeboer.nl, 1 -theodorahome.co, 1 -theodorahome.com.br, 1 theofleck.com, 0 theojellis.com, 1 theojones.name, 1 theokouzelis.com, 1 theoldbrewhouse.info, 1 theoldmill.tk, 1 +theoldsewingfactory.com, 1 theolivetreerestaurants.com, 1 theolodewijk.nl, 1 theologyz.com, 1 theomg.co, 1 theonegroup.co.uk, 1 theonethaimassage.de, 1 +theonlinecentre.com, 1 theoosmetalart.nl, 1 theophil.tk, 1 theoptechnation.com, 1 @@ -81636,6 +81572,7 @@ thephp.cc, 1 thepieslicer.com, 1 thepillclub.com, 1 thepilotwoman.cf, 1 +thepinfluencers.com, 1 thepiratebay.cf, 1 thepiratesociety.org, 1 theplasticsurgerycenterofnashville.com, 1 @@ -81656,6 +81593,7 @@ thepromisemusic.com, 1 theptclist.tk, 1 theptpractitioner.com.au, 1 thepurplemaids.com, 1 +thequalitycleaning.com, 1 thequillmagazine.org, 1 theralino.de, 1 theramo.re, 1 @@ -81715,7 +81653,6 @@ therworth.net, 1 therworth.org, 1 thesacreds.com, 1 thesalonthing.com, 0 -thesandboxchicago.com, 1 thesanta.biz, 1 thesarogroup.com, 1 thesassynut.com, 1 @@ -81777,6 +81714,7 @@ thestralbot.com, 1 thestrangenessofthings.tk, 1 thestrategyagency.com.au, 1 thestreamable.com, 1 +thestreet.cz, 1 thestylebouquet.com, 1 thesunshinecoasttourcompany.com.au, 1 thesuppercircle.com, 1 @@ -81805,6 +81743,7 @@ thetorrentfunk.com, 1 thetotalemaildelivery.com, 1 thetradinghall.com, 0 thetradingletter.com, 1 +thetrafficgeek.com, 1 thetravelczar.com, 1 thetravelhack.com, 1 thetree.ro, 1 @@ -81826,6 +81765,7 @@ thevanishedvoyager.ml, 1 theveils.net, 1 thevenueofhollywood.com, 1 thevenuevr.com, 1 +thevern.co.za, 1 theverybusyoffice.co.uk, 1 thevgg.com, 0 theviewat55th.com, 1 @@ -81858,7 +81798,6 @@ thewindow.com, 1 thewinedelivery.ga, 1 thewizardsmanse.com, 1 thewoodkid.com.au, 1 -thewoosh.me, 1 theworkingeye.nl, 1 theworld.tk, 1 theworldexchange.com, 1 @@ -81894,6 +81833,7 @@ thierrymazue.fr, 1 thietbithoathiem.net, 1 thietkegianhangtttm.com, 1 thietkenoithatshop.com, 1 +thijmen.xyz, 1 thijmenmathijs.nl, 1 thijs.amsterdam, 1 thijs.fr, 1 @@ -82002,10 +81942,8 @@ thomasvochten.com, 1 thomaswoo.com, 0 thomien.de, 1 thompsonfamily.cloud, 1 -thomsons.com, 1 thomsonscleaning.co.uk, 1 thomspooren.nl, 1 -thomwiggers.nl, 1 thooka.com, 1 thor.edu, 1 thor.re, 1 @@ -82021,6 +81959,7 @@ thoughtlessleaders.online, 1 thoughtsynth.com, 1 thoughtsynth.net, 1 thoughtsynth.org, 1 +thoughtworthy.info, 1 thouni.de, 1 thouqi.com, 1 thousandoakselectrical.com, 1 @@ -82094,11 +82033,13 @@ thycotic.ru, 1 thyngster.com, 1 thynx.io, 1 thyrex.fr, 1 +thzone.net, 1 ti-js.com, 1 ti-pla.net, 1 ti-planet.org, 1 ti615.com, 1 ti780.com, 1 +tiagoealine.com.br, 1 tiagoneves.tk, 1 tiagonunes.pt, 1 tiagosimao.com, 1 @@ -82135,7 +82076,6 @@ ticketcity.com, 1 ticketdriver.com, 1 ticketpro.ca, 0 ticketrunway.com, 1 -ticketscol.com, 1 ticketslover.com, 1 ticketsmate.com, 1 ticketsource.co.uk, 1 @@ -82153,6 +82093,7 @@ tidton.com, 1 tidy.chat, 1 tidych.at, 1 tiekoetter.com, 1 +tiempoalegria.com, 1 tiendadolca.com, 1 tiendaengeneral.com, 1 tiendafetichista.com, 1 @@ -82161,7 +82102,6 @@ tiener-herentals.be, 1 tienerdienst-johanneskapel.tk, 1 tiens-ib.cz, 1 tierarzt-karlsruhe-durlach.de, 1 -tierarztpraxis-bogenhausen.de, 1 tierarztpraxis-illerwinkel.de, 1 tierarztpraxis-weinert.de, 1 tiergear.com.au, 1 @@ -82169,7 +82109,6 @@ tiernanx.com, 1 tieronegraphics.com, 1 tierra-indomables.tk, 1 tierradeayala.com, 1 -tierraprohibida.net, 1 tierschutz-niederrhein.de, 1 ties.com, 1 tiew.pl, 1 @@ -82285,11 +82224,11 @@ timespowerofprint.com, 1 timestamp.uk, 1 timetab.org, 1 timetastic.co.uk, 1 -timetech.io, 1 timetotrade.com, 1 timetrade.com, 1 timewasters.nl, 1 timewk.cn, 1 +timeworld.su, 1 timfiedler.net, 1 timgame.tk, 1 timhbw.com, 1 @@ -82297,7 +82236,6 @@ timhieuthuoc.com, 1 timi-matik.hu, 1 timich.ga, 1 timilion.tk, 1 -timing.com.br, 1 timjk.de, 0 timklefisch.de, 1 timmersgems.com, 1 @@ -82425,11 +82363,11 @@ tis.ph, 1 tischlerei-geher.at, 1 tischlerei-klettke.de, 1 tisgroup.com.my, 1 -tishopsv.com, 1 tism.in, 1 tisparking.com, 1 tissot-mayenfisch.com, 0 tissus-paris.com, 1 +tisvapo.it, 1 tit-cdn.de, 1 tit-dev.de, 1 tit-dns.de, 1 @@ -82473,7 +82411,6 @@ tkacz.pro, 1 tkanemoto.com, 0 tkat.ch, 1 tkbuilders.net, 1 -tkcafe.net, 1 tkeycoin.com, 0 tkgpm.com, 1 tkhirianov.tk, 1 @@ -82498,6 +82435,7 @@ tldtattoo.com, 1 tlehseasyads.com, 1 tleng.de, 1 tlo.xyz, 1 +tloschinski.de, 1 tloxygen.com, 1 tls-proxy.de, 1 tls.builders, 1 @@ -82527,6 +82465,7 @@ tmc.com.mt, 1 tmcjobs.com, 1 tmcreationweb.com, 1 tmdb.biz, 1 +tmf.ru, 1 tmf22.ru, 1 tmhanoi.com, 1 tmheatingcooling.com, 1 @@ -82560,6 +82499,7 @@ tnwioa.gov, 1 tny.link, 0 to-med.ru, 1 to-riktari.gr, 1 +to.gt, 1 to.md, 1 to2mbn.org, 1 toad.ga, 1 @@ -82585,6 +82525,7 @@ tobias-bauer.net, 1 tobias-haenel.de, 1 tobias-kleinmann.de, 1 tobias-kluge.com, 1 +tobias-kluge.de, 1 tobias-picha.de, 1 tobias-weidhase.de, 1 tobias.gr, 1 @@ -82614,6 +82555,7 @@ tobis.cloud, 1 tobischo.de, 1 tobisworld.ch, 1 tobtennis.tk, 1 +toby.website, 1 tobyalden.com, 1 tobyschrapel.com, 0 tobyx.cc, 1 @@ -82716,7 +82658,6 @@ tokyo-onkyo.jp, 1 tokyo-powerstation.com, 1 tokyo.dating, 1 tokyoadultguide.com, 1 -tokyobarbershop.com, 1 tokyomakino.com, 1 tokyotimeline.com, 1 tokyovipper.com, 1 @@ -82869,6 +82810,7 @@ tonermaus.de, 1 tonermonster.de, 1 tonex.de, 1 tonex.nl, 1 +tongli.eu.org, 1 tonguetechnology.com, 1 toni-dis.ch, 0 tonifarres.net, 1 @@ -82892,10 +82834,9 @@ tonymanning.com, 1 tonymaster21.me, 1 tonytan.cn, 1 tonytan.io, 1 -tonytron.com.br, 1 tonyw.xyz, 1 tonywebster.com, 1 -too.gy, 1 +tonyzhao.xyz, 1 toobug.net, 1 tool.lu, 1 toolbox-bodensee.de, 1 @@ -82922,7 +82863,6 @@ toool.nyc, 1 toool.org, 1 toopopular.ga, 1 toorfor.com, 1 -toorl.com, 1 toot.center, 1 tootbitco.ml, 1 toothdoc.ca, 1 @@ -82949,6 +82889,7 @@ top10antivirus.review, 1 top10media.tk, 1 top10mountainbikes.info, 1 top2servers.tv, 1 +top4c.com, 1 top4shop.de, 1 top6casinos.com, 1 top9.fr, 1 @@ -82959,7 +82900,6 @@ toparkinfo.hu, 1 topas.tk, 1 topaxi.ch, 1 topaxi.codes, 1 -topbdnews.xyz, 1 topbigdeals.com, 1 topbookmarking.cf, 1 topbouncycastles.co.uk, 1 @@ -83017,9 +82957,7 @@ topotom.tk, 1 toppercan.es, 1 toppointrea.com, 1 topprice.ua, 1 -topproductidea.com, 1 topproductsanalysis.com, 1 -toppsychiatristkolkata.com, 1 topradiosbrasil.tk, 1 toprci.com.br, 1 toprelatos.com, 1 @@ -83063,7 +83001,6 @@ toretame.jp, 1 toretfaction.net, 1 torfbahn.de, 1 torg-room.ru, 1 -torisamaahirusama.com, 1 torkware.com, 1 torlinnhe.com, 1 torlock.com, 1 @@ -83126,12 +83063,10 @@ tortillas-duras.cf, 1 tortocan.com, 1 tortoises-turtles.com, 1 tortuga.ga, 1 -tortugan.com.br, 1 torwart-jugend.de, 1 tosainu.com.br, 1 tosatopsicologabologna.com, 1 toscer.me, 0 -toschool.com.br, 1 toshen.com, 1 toshkov.com, 1 tosolini.info, 1 @@ -83141,7 +83076,6 @@ tostu.de, 1 totaku.ru, 0 total-destruction.tk, 1 totalaccessnicaragua.co, 1 -totalbike.com.br, 1 totalcarcheck.co.uk, 1 totalchecklist.com, 1 totalclean.co.uk, 1 @@ -83157,6 +83091,7 @@ totalforcegym.com, 0 totalhomecareinc.com, 1 totalhost.gq, 1 totalityservices.co.uk, 1 +totalleedee.com, 1 totallemaiildelivery.com, 1 totallemaildelivery.com, 1 totally-dakota.tk, 1 @@ -83296,6 +83231,7 @@ toysperiod.com, 1 toysplace.ml, 1 toystory3.ga, 1 tozdev.com, 1 +tozein.com, 1 tp-iryuubun.com, 1 tp-kabushiki.com, 1 tp-kyouyufudousan.com, 1 @@ -83348,7 +83284,6 @@ trackeye.dk, 1 trackify.tk, 1 tracking-app.tk, 1 tracking.best, 1 -trackingstream.com, 1 trackrecordpro.co.uk, 1 tracksa.com.ar, 1 trackulo.us, 1 @@ -83386,6 +83321,7 @@ trading-analytics.com, 1 tradinghelper.be, 1 tradingview.com, 1 tradingyourownway.com, 1 +traditionalturk.com, 1 traditions.nl, 1 traditionskapperscollege.nl, 1 traditionsvivantesenimages.ch, 1 @@ -83489,6 +83425,7 @@ trangcongnghe.com, 1 trangell.com, 1 tranhsondau.net, 0 tranquillity.se, 1 +trans-pel.com, 1 transacid.de, 1 transappealrights.com, 1 transcend.org, 1 @@ -83543,7 +83480,6 @@ transmisjeonline.pl, 1 transmithe.net, 1 transmitit.pl, 1 transmutatie.nl, 1 -transmute.review, 1 transnexus.com, 1 transoil.co.uk, 1 transpak-cn.com, 1 @@ -83559,11 +83495,13 @@ transsexualpantyhose.com, 1 transsrit.tk, 1 transumption.com, 1 transwank.com, 1 +trantuanminh.com, 1 tranzron.ga, 1 trapkitchen.ml, 1 trappednerve.org, 1 trasandino.tk, 1 trash2treasurecreations.co.za, 1 +trashexpert.ru, 1 trashnothing.com, 1 trashwagon.club, 1 trashylingerie.ga, 1 @@ -83572,7 +83510,6 @@ traslocare.roma.it, 1 traslocatore.roma.it, 1 traslochi-trasporti-facchinaggio.it, 1 trasloco.milano.it, 1 -trastornoevitacion.com, 1 trastornolimite.com, 1 tratamentoparacelulite.net, 1 tratamientodelvitiligo.es, 1 @@ -83686,6 +83623,7 @@ treeschat.com, 1 treestarmarketing.com, 1 treestumpgrindingnearme.com, 1 treeworkbyjtec.com, 1 +treezone.net, 1 trefcon.cz, 1 trefle.io, 1 trefpuntdemeent.nl, 1 @@ -83731,7 +83669,7 @@ tresredatores.tk, 1 tretail.net, 1 tretkowski.de, 1 treurtransport.tk, 1 -trevo-lotofacil.com.br, 1 +trevo-lotofacil.com.br, 0 trevormarron.co.uk, 1 trevorng.vision, 1 trevsanders.co.uk, 1 @@ -83750,6 +83688,8 @@ trialbyfire.tk, 1 trialcentralnet.com, 1 trialmock.com, 1 trials.tk, 1 +triangela.com, 1 +triangela.se, 1 triangle-energie.com, 1 trianglecastles.co.uk, 1 trianglelawngames.com, 1 @@ -83820,8 +83760,8 @@ trinnes.net, 1 trio.online, 1 triop.se, 1 triozon.hu, 1 +tripartie.com, 1 triphop.com, 1 -triplecrownoutfitters.com, 1 triplejprints.com, 1 triplekeys.net, 1 triplethreatband.tk, 1 @@ -84016,7 +83956,6 @@ tryti.me, 1 tryupdates.com, 1 trywesayyes.com, 1 trz.cz, 1 -trzepak.pl, 1 ts-folienmontage.de, 1 ts-public.tk, 1 ts-publishers.com, 1 @@ -84166,6 +84105,7 @@ tuffmail.com, 1 tuffmail.net, 1 tuffsruffs.se, 1 tufilo.com, 1 +tugafm.eu.org, 1 tugesha.com, 1 tuimprenta.com.ar, 1 tuingereedschappen.net, 0 @@ -84176,6 +84116,7 @@ tukdesigns.com, 1 tula-city.tk, 1 tula-news.ga, 1 tulenceria.es, 1 +tulevaisuusdemarit.fi, 1 tuliha.ga, 1 tulikajain.cf, 1 tuller.tk, 1 @@ -84221,12 +84162,14 @@ tuoicay.vn, 1 tuotteet.org, 1 tuou.xyz, 0 tupa-germania.ru, 1 +tupahost.net.br, 1 tupass.pw, 1 tupatane.gq, 1 tupeuxpastest.ch, 0 tupianku.com, 1 tupizm.com, 1 tuppenceworth.ie, 1 +tupperwaresalamanca.com, 1 turadionline.cf, 1 turalt.com, 1 turbaza.tk, 1 @@ -84286,18 +84229,19 @@ turpinpesage.fr, 1 tursiae.org, 1 turteka.com, 1 turtlearmy.net, 1 +turtledigital.co.uk, 1 turtleduckstudios.com, 1 turtlehead.tk, 1 turtlepay.io, 1 turtles.ga, 1 turtunis.ml, 1 turul.tk, 1 -turuncu-sepet.com, 1 turunculevye.com, 1 turystyczny-system.pl, 1 tus-kikishinkyo.jp, 1 tusar.ga, 1 tuscanyleather.it, 1 +tusconsultorex.com, 1 tuseodigital.com, 1 tusharwalaskar.com, 1 tusi.co, 1 @@ -84326,13 +84270,13 @@ tutorio.ga, 1 tutorme.com, 1 tuts4you.com, 1 tuttimundi.org, 0 -tuttopappagalli.net, 1 tutu.green, 1 tutu.ro, 1 tuversionplus.com, 1 tuwaner.com, 1 tuxcloud.net, 1 tuxflow.de, 0 +tuxforums.com, 1 tuxgeo.com, 0 tuxhound.org, 1 tuxie.com, 1 @@ -84431,7 +84375,6 @@ twinkseason.com, 1 twinztech.com, 1 twiri.net, 1 twisata.com, 1 -twist.com, 1 twistdevelopment.co.uk, 1 twisted-brains.org, 1 twistedwave.com, 1 @@ -84466,7 +84409,6 @@ twojfaktum.pl, 1 twolinesmedia.eu, 1 tworaz.net, 1 twotube.ie, 1 -twtimmy.com, 1 twtr.email, 1 twtremind.com, 1 twun.io, 1 @@ -84481,6 +84423,7 @@ txlrs.org, 1 txm.pl, 1 txpi.nsupdate.info, 1 txtd.io, 1 +txtdb.com, 1 txtdirect.com, 1 txtdirect.dev, 1 txtdirect.io, 1 @@ -84664,6 +84607,7 @@ uat-activesg.com, 1 uat-mypfp.co.uk, 1 uateach.tk, 1 uatgootax.ru, 0 +uatx.mx, 1 uawoptout.com, 1 ub3rk1tten.com, 0 ub889.com, 1 @@ -84847,6 +84791,7 @@ ullah.se, 1 ulli.ml, 1 ulmer-schneesport.de, 1 ulovelc88.com, 1 +ulrichracing.com, 1 ulrichs.ch, 1 ulrik.moe, 1 ulsters.cf, 1 @@ -84865,7 +84810,6 @@ ultimatemapping.tk, 1 ultimatepaleoguide.com, 1 ultortech.com, 1 ultra-pro.ga, 1 -ultra.group, 1 ultrabeautycream.com, 1 ultracentr.ml, 1 ultrafine.cf, 1 @@ -84875,7 +84819,6 @@ ultramax.biz, 1 ultramookie.com, 1 ultraonline.ml, 1 ultraporn.biz, 1 -ultrasdesign.co.uk, 1 ultraseopro.com, 1 ultrasite.tk, 1 ultrasocial.ml, 1 @@ -84924,9 +84867,9 @@ unaffectedsound.tk, 1 unai-yus.tk, 1 unapp.me, 1 unasim.gq, 1 +unataly.gq, 1 unataz.tk, 1 unatco.noip.me, 1 -unausa.com.br, 1 unbelievableplaces.de, 1 unblock-zh.org, 1 unblockall.xyz, 1 @@ -84956,10 +84899,12 @@ unblocked.sh, 1 unblocked.uno, 1 unblocked.vc, 1 unblocked.vet, 1 +unblocked.vip, 1 unblocked.win, 1 unblockit.bid, 1 unblockit.biz, 1 unblockit.ca, 1 +unblockit.one, 1 unblockit.pro, 1 unblockit.red, 1 unblockweb.co, 1 @@ -85003,6 +84948,7 @@ unearaigneeauplafond.fr, 1 unece-deta.eu, 1 unefleur.be, 1 unefuite.ch, 0 +unepierrepourlui.fr, 1 unerosesurlalune.fr, 0 unescoclub.tk, 1 unetyr.gq, 1 @@ -85044,7 +84990,6 @@ unicefkepeslapok.hu, 1 unicefvoscilnice.si, 1 unicioushop.com, 1 unicode.gq, 1 -unicode.website, 1 unicolabo.jp, 1 unicool.tk, 1 unicorn-systems.net, 1 @@ -85066,7 +85011,6 @@ unidevgroup.ru, 1 unidostransportes.com.br, 1 unidrogas.com, 0 unieducar.org.br, 1 -uniekglas.nl, 1 unifashion.ro, 1 unifestal.com, 1 unifiednetwork.me, 1 @@ -85087,6 +85031,7 @@ unionplat.ru, 1 unionreports.gov, 1 unionstreetskateboards.com, 1 uniontestprep.com, 1 +unionvilleheating.com, 1 unipart.digital, 0 unipass.ga, 1 unipig.de, 1 @@ -85118,6 +85063,7 @@ unitedfitness.com.au, 1 unitedkingdoms-guild.com, 1 unitedprovinces.nl, 1 unitedpsychological.com, 1 +unitehelivy.be, 1 uniteinhealth.com, 1 unitel2000.de, 1 unitencup.tk, 1 @@ -85207,6 +85153,8 @@ unpause.io, 1 unpkg.com, 1 unpleasant.tk, 1 unpluggedjuice.dk, 1 +unplugstore.it, 1 +unpoditalia.se, 1 unpossible.xyz, 1 unpr.dk, 1 unprovided.cf, 1 @@ -85223,7 +85171,6 @@ unstable.network, 1 unstamps.org, 1 unstockd.org, 1 unstoppable.money, 1 -unstoppableever.com.br, 1 unstoppableunits.com, 1 unsuspicious.click, 1 unterhaltungsbox.com, 1 @@ -85239,6 +85186,7 @@ unusedrooms.com, 1 unusualhatclub.com, 1 unusualworldd.com, 1 unveiledgnosis.com, 1 +unvoyageenvelo.com, 1 unwa.tk, 1 unworthy.ml, 1 unx.dk, 1 @@ -85293,7 +85241,6 @@ upholsterycleanerslondon.co.uk, 1 upholsterydesign.com.au, 1 uphuntingland.com, 1 upitnik.rs, 1 -uplaqui.com.br, 1 uplead.com, 1 uplinkgame.tk, 1 uplinklabs.net, 1 @@ -85327,11 +85274,11 @@ upscope.io, 1 upsdelperu.com.pe, 1 upsettunnel.com, 1 upsihologa.com.ua, 1 +upsilonsigmaphi.us, 1 upskilllearning.ml, 1 upskirtmania.tk, 1 upstaa.com, 1 upstart.com, 1 -uptechbrasil.com.br, 1 uptimed.com, 1 uptional.gq, 1 uptodateinteriors.com, 1 @@ -85371,7 +85318,6 @@ uraniumhost.ga, 1 uranius.eu, 1 uranmoney.ml, 1 uranus.cf, 1 -urb-budex.pl, 1 urbackups.com, 1 urbalex.ch, 0 urban-culture.fr, 1 @@ -85380,6 +85326,7 @@ urban.melbourne, 1 urbanagriculturesummit.cf, 1 urbanbikeweamr.ga, 1 urbanbooks.tk, 1 +urbancoffee.com.mx, 1 urbancreators.dk, 1 urbanemc.net, 1 urbanesecurity.com, 1 @@ -85470,7 +85417,6 @@ usa.gov, 1 usa250.gov, 1 usaa.com, 0 usaautoaz.com, 1 -usabackground.com, 1 usability.com.gr, 1 usability.gov, 1 usadba.net.ru, 1 @@ -85488,7 +85434,6 @@ usamultimeters.com, 1 usanewsposts.ga, 1 usanewstrends.ga, 1 usap.gov, 0 -usapublicrecords.com, 1 usarp.org, 1 usaseanconnect.gov, 1 usashopex.com, 1 @@ -85538,9 +85483,9 @@ uskaria.com, 1 usleep.net, 1 usleravnekrog.dk, 1 uslugi-advokata.ga, 1 +uslugi-online.pl, 1 uslugi-voronezh.tk, 1 usmammy.com.tw, 1 -usmiddleclass.net, 1 usmint.gov, 1 usninosnikrcni.eu, 1 usnti.com, 1 @@ -85557,7 +85502,6 @@ ussm.gov, 0 ussm.tk, 1 ussst.org, 1 ussuka.com, 0 -ustaywell.com, 1 ustensiles-cuisine.boutique, 1 ustr.gov, 0 ustugov.kiev.ua, 1 @@ -85607,7 +85551,6 @@ utopianrealms.org, 1 utopicestudios.com, 1 utopique.net, 1 utorg.com.ua, 1 -utox.io, 1 utrace.me, 1 utrantor.org, 1 utterberry.io, 1 @@ -85688,7 +85631,6 @@ uzemobility.org, 1 uzhas-uzhasny.ml, 1 uzsvm.cz, 1 uztop.ml, 1 -uzzamari.com, 1 v-bank.com, 1 v-bokhorst.eu, 1 v-d-p.net, 1 @@ -85731,13 +85673,13 @@ v1sit0r.ru, 1 v2bet365.com, 1 v2bv.net, 1 v2bv.win, 1 -v2cn.win, 1 v2ex.com, 1 v2mcdev.com, 1 v2ray6.com, 1 v2ray66.com, 1 v2ray666.com, 1 v2x.sk, 1 +v2xxoo.com, 1 v3025.com, 1 v30365.com, 1 v33v33.com, 1 @@ -85809,7 +85751,6 @@ v88522.com, 1 v88559.com, 1 v88656.com, 1 v88799.com, 1 -v8abc.com.br, 1 v8bet365.com, 1 v9037.com, 1 v9285.com, 0 @@ -85844,6 +85785,7 @@ vaclan.tk, 1 vaclavambroz.eu, 1 vacontractortraining.com, 1 vacuumpump.co.id, 1 +vadasztanyabuk.hu, 1 vademekum.com, 1 vadennissanofhiltonheadparts.com, 1 vadiar-angola.tk, 1 @@ -85918,11 +85860,14 @@ validatis.com, 1 validator.nu, 1 validbrands.com, 1 validius.fi, 1 +validius.net, 1 valika.ee, 1 valimised.ee, 1 valioncolonialcompany.com, 1 valkohalla.dk, 1 valkohattu.fi, 1 +valkoi-konyvtar.hu, 1 +valkoi-ksk.tk, 1 valkova.net, 1 valledeleresma.tk, 1 vallei-veluwe.nl, 1 @@ -85936,7 +85881,6 @@ valleyshop.ca, 1 valleystories.ga, 1 valleywidetvrepair.ml, 1 vallutaja.eu, 1 -valokuva-albumi.fi, 1 valopv.be, 1 valor-host.ml, 1 valordolarblue.com.ar, 1 @@ -85970,6 +85914,7 @@ valueofblog.com, 1 valueseed.net, 1 valuesetters.com, 1 valunet.co.za, 1 +valuskills.co.za, 1 valutienda.com, 1 valuuttamuunnin.com, 1 valx.jp, 1 @@ -85981,6 +85926,7 @@ vampire-studios.tk, 1 vampire142.fr, 1 vampyrium.com, 0 vampyrium.net, 0 +van-assen.com, 1 van-brandevoort.tk, 1 van11y.net, 1 vanbinnenuit.nl, 1 @@ -86002,6 +85948,7 @@ vanderkroon.nl, 1 vandermeer.frl, 1 vanderrijt.nl, 0 vanderstraeten.dynv6.net, 1 +vanderziel.org, 1 vandeth.net, 1 vandijkmaatwerk.nl, 1 vandommelenart.com, 1 @@ -86052,7 +85999,9 @@ vapehour.com, 1 vapeking.co.za, 1 vapekingusa.com, 1 vapemania.eu, 1 +vapemate.co.uk, 1 vapensiero.co.uk, 1 +vaperion.me, 1 vaperolles.ch, 0 vapesense.co.uk, 1 vapetaclope.cf, 1 @@ -86074,10 +86023,9 @@ varghese.de, 1 variable.agency, 0 variable.dk, 1 variablyconstant.com, 1 -variag-group.ru, 1 -variag-montazh.ru, 1 +variag-group.ru, 0 +variag-montazh.ru, 0 varied.ga, 1 -variedades.store, 1 varimedoma.com, 1 variomedia.de, 1 varizh.by, 1 @@ -86126,6 +86074,7 @@ vat-eu.com, 1 vat.direct, 1 vatav.tk, 1 vatikantour.tk, 1 +vatitsolutions.com, 1 vato.nl, 1 vats.im, 1 vattulainen.fi, 1 @@ -86133,7 +86082,6 @@ vauceri.hr, 1 vaugarnier.fr, 1 vaughanrisher.com, 1 vault.investments, 1 -vault21.net, 1 vault647.com, 1 vault81.de, 1 vaultproject.io, 0 @@ -86154,7 +86102,6 @@ vazue.com, 1 vb.media, 1 vbazile.com, 1 vbelgorode.tk, 1 -vbestproduct.com, 1 vbezhenar.com, 1 vbql.me, 1 vbsoft.cz, 1 @@ -86238,6 +86185,7 @@ vegangaymer.blog, 1 veganism.co.uk, 1 veganism.com, 1 veganmasterrace.com, 1 +veganoos.com, 1 veganrecipereviews.com, 1 vegasluxuryestates.com, 1 vegavio.com, 1 @@ -86245,7 +86193,6 @@ vegculinary.com, 1 vege-tables.fr, 1 vegekoszyk.pl, 1 vegepa.com, 1 -vegetalvalley.org, 1 vegetariantokyo.net, 1 vegetarier-sind-moerder.tk, 1 vegetus.ua, 1 @@ -86260,6 +86207,7 @@ vehicletax.service.gov.uk, 1 vehicletransportservices.co, 1 veiergangvermut.dk, 1 veii.de, 1 +veikkosimpanen.fi, 1 veil-framework.com, 1 veilofsecurity.com, 1 veincenterbrintonlake.com, 1 @@ -86379,7 +86327,6 @@ verifiny.com, 1 verifpal.com, 1 verifyos.com, 1 verifyyourip.com, 1 -veriny.tf, 1 veriomed.com, 1 veritafineviolins.com, 1 veritalife.com, 1 @@ -86503,7 +86450,7 @@ vetsmarketing.co.za, 1 vettenburg.eu, 1 vetustainversion.com, 1 vetwebsuccess.com, 1 -vev.com.vn, 1 +vev.com.vn, 0 veverusak.cz, 1 vextraz.co, 1 vezirecenzii.ro, 1 @@ -86539,7 +86486,6 @@ viagusto.pl, 1 viajandoporelmundo.com.ar, 1 viajaramsterdam.com, 1 viaje-a-china.com, 1 -vialibido.com.br, 1 viaprinto.de, 1 viasinc.com, 0 viasun.ru, 1 @@ -86552,10 +86498,10 @@ vibrant-america.com, 1 vibrato1-kutikomi.com, 1 vicarious.cf, 1 vicenage.com, 1 +vicenez.agency, 1 vicentediaz.mx, 1 vicentee.com, 1 vicentejr.com.br, 1 -viceversa2013.org, 1 vichama.pe, 1 vichiya.com, 1 vician.cz, 1 @@ -86608,7 +86554,6 @@ victusrp.gq, 1 vicugna.nl, 1 vicyu.com, 1 vid.me, 0 -vida.es, 1 vidadu.com, 1 vidady.com, 1 vidaforanea.com.mx, 1 @@ -86691,6 +86636,7 @@ vietnamguide.co.kr, 1 vietnamhost.vn, 0 vietnamluxurytravelagency.com, 1 vietnamphotoblog.com, 0 +vietnamtravelmart.com.vn, 1 vietnamwomenveterans.org, 1 vieux.pro, 1 vievolution.tk, 1 @@ -86703,6 +86649,7 @@ viewey.com, 1 viewflix.win, 1 viewing.nyc, 1 viewmythoughts.com, 1 +vifranco.cl, 1 vifsoft.com, 1 viga.me, 1 vigilanciatotal.com, 1 @@ -86712,6 +86659,7 @@ vigilantnow.com, 1 vigira.com.ar, 1 vigliano.com, 1 vignaud.fr, 1 +vigneshkumar.com, 1 vignoblesdeletat.ch, 1 vigo-krankenversicherung.de, 1 vigo-tarife.de, 1 @@ -86761,29 +86709,29 @@ villacarralon.tk, 1 villach.at, 1 villadelprado.tk, 1 villaespanola.tk, 1 -villafiore.com.br, 1 villagebridalbyomnibus.com, 1 villagecardshop.co.uk, 1 villagecenterpediatrics.com, 1 villagemagazines.co.uk, 1 villagenscamuria.it, 1 villagephysicians.com, 0 -villageunique.com.br, 1 villagockel.de, 1 villainsclothing.com.au, 1 +villakarma.at, 1 villalmanzo.tk, 1 villamariaamalfi.it, 1 villanew.tk, 1 villasenor.online, 1 -villasfinistere.fr, 1 villasforsale-bali.com, 1 villasoasissanur.com, 1 villaumbrales.tk, 1 villavaltava.fi, 1 +villavasco.ovh, 1 villaville.com, 1 villawirz.it, 1 ville-aime.fr, 1 villehardouin.fr, 1 +villek.fi, 1 villekaaria.eu, 1 villenavedornon.fr, 1 villenvinkit.com, 1 @@ -86820,11 +86768,11 @@ vineta.tk, 1 vinetalk.net, 1 vinetech.co.nz, 1 vingt.me, 1 -vinhodragao.com.br, 1 vinicius.sl, 1 vinifriuli.sk, 1 vinigas.com, 1 vinilosdecorativos.net, 1 +vinisol.com.co, 1 vinistas.com, 1 vinit.tk, 1 vinktwebdesign.nl, 0 @@ -86964,6 +86912,7 @@ virala.tk, 1 viralboombox.xyz, 1 viralcreate.com, 1 viraljobs.ga, 1 +viralme.in, 1 viraloffer.ga, 1 viralpop.it, 0 viralsv.com, 1 @@ -86988,6 +86937,7 @@ virtualcitehuallaga.com, 1 virtualcloud.ddns.net, 1 virtualcommodities.org, 1 virtualcomputer.ml, 1 +virtualdawgs.com, 1 virtualdesignmedia.com, 1 virtuality4d.com, 1 virtuallifestyle.nl, 1 @@ -87010,6 +86960,7 @@ viruscare.info, 1 virvum.ch, 1 visa-master.tk, 1 visadaifu.com, 1 +visadoparausa.com, 1 visalist.io, 1 visalogy.com, 1 visaop.com, 1 @@ -87019,11 +86970,11 @@ visatitans.ae, 1 visatitans.ca, 1 visatitans.com, 1 visaya.com.co, 1 -viscoelastico.com.br, 1 viscopic.com, 1 viserproject.com, 0 viseum.co.uk, 1 vishenka.tk, 1 +vishwashantiyoga.com, 1 visibleone.com, 1 visibox.nl, 1 visikom.de, 1 @@ -87031,7 +86982,6 @@ vision-painting.com, 0 visionarymedia.nl, 1 visiondetails.ru, 1 visiondigitalsog.com, 1 -visiondirectionaldrilling.com, 1 visionduweb.fr, 1 visionexpresscareers.com, 1 visiongamestudios.com, 1 @@ -87073,6 +87023,7 @@ visualdrone.co, 1 visualgnome.com, 1 visualgrafix.com.mx, 1 visualideas.org, 1 +visualiti.co, 1 visualizing.info, 1 visualmarketingdeals.com, 1 visualmasters.nl, 1 @@ -87180,13 +87131,13 @@ vizit-obmen.tk, 1 vizitfree.ml, 1 vizitnik.tk, 1 vizualbits.com, 1 -vizzboard.com, 1 vjeff.com, 1 vjeff.net, 1 vjhfoundation.org, 1 vjpatel.me, 1 vk-k.com, 1 vk-random.ml, 1 +vk1fj.net, 1 vkarpaty.tk, 1 vkavkaz.tk, 1 vkb-remont.ru, 1 @@ -87314,7 +87265,6 @@ vocab.guru, 1 vocaloid.my, 1 vocalviews.com, 1 vocationnetwork.org, 1 -voceempaz.com, 1 vocescruzadasbcs.mx, 1 vocus.aero, 1 vocustest.aero, 1 @@ -87348,10 +87298,10 @@ voicesoflabor.com, 1 voicesofspirit.at, 1 voicr.nl, 1 voicu.ch, 0 -voidancerecords.com, 1 voidbot.ai, 1 voidbot.tk, 1 voidcore.org, 1 +voidge.cf, 1 voidi.ca, 1 voidma.in, 1 voidnya.com, 1 @@ -87438,6 +87388,7 @@ voodoochile.at, 1 voodoocomedy.com, 1 voodooshaman.com, 1 voolik.pw, 1 +voom.live, 1 vooreenveiligthuis.nl, 0 voorjou.com, 1 vop.li, 1 @@ -87574,7 +87525,6 @@ vroedvrouwella.be, 1 vrostove.tk, 1 vrpornmovies.net, 1 vrsgames.com.mx, 0 -vrsystem.com.br, 1 vrtouring.org, 1 vrzl.pro, 1 vs106.com, 1 @@ -87638,7 +87588,6 @@ vsx.ch, 1 vtanki.tk, 1 vtaxi.se, 1 vtbs.moe, 1 -vthebest9.com, 1 vtt-hautsdefrance.fr, 1 vttnordisere.fr, 1 vtuber-schedule.info, 1 @@ -87647,7 +87596,6 @@ vtuber.land, 1 vtul.io, 1 vtupro.com, 1 vuakhuyenmai.vn, 1 -vuasinhly.com, 1 vubey.yt, 1 vucdn.com, 1 vuelacaruru.com, 1 @@ -87671,6 +87619,7 @@ vultrhxl.com, 1 vulyk-medu.com.ua, 1 vunn.com, 1 vuotila.eu, 1 +vutumusic.com, 1 vuvanhon.com, 1 vux.li, 1 vuzi.fr, 1 @@ -87705,6 +87654,7 @@ vwt-event.nl, 1 vww-8522.com, 1 vx.hn, 1 vxapps.com, 1 +vxl.sh, 1 vxz.me, 1 vybavzahradu.cz, 1 vybeministry.org, 1 @@ -87777,6 +87727,7 @@ w365.vip, 0 w36533.com, 1 w36594.com, 1 w3app.nl, 1 +w3ctag.com, 1 w3ctag.org, 1 w3d.io, 1 w3n.org, 1 @@ -88099,6 +88050,7 @@ wannaridecostarica.com, 1 wantocode.com, 1 wanybug.cf, 1 wanybug.cn, 1 +wanybug.com, 1 wanybug.ga, 1 wanybug.gq, 1 wanybug.tk, 1 @@ -88125,6 +88077,7 @@ warbox.ga, 1 warcraftjournal.org, 1 wardonat.tk, 1 wardow.com, 1 +wardpieters.nl, 1 wardslager.com, 1 warebouncycastles.co.uk, 1 warehost.de, 0 @@ -88144,7 +88097,6 @@ warmestwishes.ca, 1 warmlyyours.com, 1 warmservers.com, 1 warmtepomp.express, 1 -warmteshop.com, 1 waroengkoe-shop.com, 1 waroengkopigazebo.net, 1 warofelements.de, 1 @@ -88200,6 +88152,7 @@ wastrel.ch, 1 watashi.bid, 1 watboeithet.nl, 1 watch-wiki.org, 1 +watchco.com, 1 watchcom.org.za, 1 watchcow.org, 0 watchdogs.tk, 1 @@ -88247,7 +88200,6 @@ watgroeitwaar.org, 1 watoo.tech, 1 watthasawang.com, 1 wattmaedchen.de, 1 -wattnow.io, 1 watvindtnederland.com, 1 watzijnmijnkerntalenten.nl, 1 waukeect.com, 1 @@ -88344,6 +88296,7 @@ wearandcare.net, 1 weare1inspirit.com, 1 wearebase.com, 1 wearebfi.co.uk, 1 +wearedevs.net, 1 wearefrantic.com, 1 wearegenki.com, 1 wearehackerone.com, 1 @@ -88351,6 +88304,7 @@ weareincognito.org, 1 wearepapermill.co, 1 wearepapermill.com, 1 wearethreebears.co.uk, 1 +wearetravellers.nl, 1 wearetuzag.com, 1 wearewithyou.org, 1 wearvintage.ml, 1 @@ -88391,9 +88345,12 @@ web-town.tk, 1 web-wakakusa.jp, 1 web-warrior.de, 1 web-wave.jp, 1 +web-worker.cn, 1 web.bzh, 1 web.cc, 0 web.de, 1 +web.hr, 1 +web1n.com, 1 web2033.com, 1 web2ldap.de, 1 web2screen.tv, 1 @@ -88504,6 +88461,7 @@ webhostplan.info, 1 webhotelli.website, 1 webhotels.tk, 1 webhotelsoversigt.dk, 1 +webhr.co, 1 webia.in.th, 1 webies.ro, 1 webinator.tk, 1 @@ -88551,6 +88509,7 @@ webminders.it, 1 webmining.gq, 1 webmotelli.fi, 1 webmr.de, 1 +webmyhealth.com, 1 webnames.ca, 1 webnetforce.net, 1 webnetmail4u.com, 1 @@ -88635,7 +88594,6 @@ webssupport.ga, 1 webstaff.xyz, 1 webstart.nl, 1 webstats.tk, 1 -webstellung.com, 1 webstijlen.nl, 1 webstore.be, 0 webstu.be, 1 @@ -88647,6 +88605,7 @@ websuccess.co.za, 1 websvetaines.lt, 1 webtasarim.pw, 1 webtaxi.cf, 1 +webteammate.com, 1 webtek.nu, 1 webtex.limited, 1 webtheapp.com, 1 @@ -88736,6 +88695,7 @@ wegethitched.co.uk, 1 weggeweest.nl, 1 wegiveloans.com, 1 wegner.no, 1 +wego.ca, 1 wegonnagetsued.org, 1 wegotcookies.com, 1 wegrzynek.org, 1 @@ -88782,11 +88742,11 @@ weitergedacht.eu, 1 weitsolutions.nl, 1 weixiaojun.org, 0 weizenke.im, 1 -wejdmark.com, 1 wekibe.de, 1 weknowhowtodoit.com, 1 welches-kinderfahrrad.de, 1 welcome-tahiti.com, 0 +welcome-to-the.wedding, 1 welcome-werkstatt.com, 1 welcome26.ch, 0 welcomehelp.de, 1 @@ -88816,6 +88776,7 @@ wellnessever.com, 1 wellnesshotel-weimar.de, 1 wellreachlogistics.com, 1 wellsolveit.com, 0 +wellsplasticsurgery.com, 1 wellspringsga.com, 1 wellsprung.net, 1 welltycoon.com, 1 @@ -88890,7 +88851,6 @@ wereldplanner.nl, 1 wereoutthere.nl, 1 werhatunsverraten.eu, 1 werk-34.de, 1 -werkemotion.com, 1 werken-bij-inwork.nl, 1 werkenbijdfzs.nl, 1 werkenbijsanitairwinkel.be, 1 @@ -88970,7 +88930,6 @@ wetofu.top, 1 wetpussylipsex.com, 1 wetravel.company, 1 wetrepublic.com, 1 -wettbonus.eu, 0 wetter.de, 1 wetthost.com, 1 wevenues.com, 1 @@ -89019,6 +88978,7 @@ wgec-fegc.gc.ca, 1 wgom.org, 0 wgplatform.co.uk, 1 wgraphics.ru, 1 +wgrfoods.co.uk, 1 wgsuyi.cf, 1 wgtrm.com, 1 wh-guide.de, 1 @@ -89066,6 +89026,7 @@ whatsthisword.com, 1 whatsupgold.com.tw, 1 whatsupoutdoor.com, 0 whatthefile.info, 1 +whatthefoxhat.com, 1 whatthingsweigh.com, 1 whattodo.com, 1 whattominingrigrentals.com, 1 @@ -89171,7 +89132,7 @@ whm.gc.ca, 1 whmcs.hosting, 1 whnpa.org, 1 who-calledme.com, 1 -who.pm, 1 +who.pm, 0 whoami.io, 1 whocalld.com, 1 whocalled.us, 1 @@ -89199,6 +89160,7 @@ whowherewhen.net, 1 whqqq.com, 1 whqtravel.org, 0 whs-music.org, 1 +wht.one, 1 whta.eu, 1 whta.se, 1 whtcsj.com, 1 @@ -89215,6 +89177,7 @@ whytls.com, 1 whyworldhot.com, 1 whyy.eu.org, 1 whyz1722.tk, 1 +wiadomosci-lodz.pl, 1 wiagencies.com, 1 wiapply.com, 1 wibbe.link, 1 @@ -89240,6 +89203,7 @@ widely.io, 1 widemann.de, 1 widememory.com, 1 widenews.org, 0 +wideworks.agency, 1 widgetmaker.co.uk, 1 widmer.bz, 1 widoj.gov, 1 @@ -89372,7 +89336,7 @@ wildmine.su, 1 wildnisfamilie.net, 1 wildrideproject.tk, 1 wildsafety.com, 1 -wildtrip.blog, 1 +wildtrip.blog, 0 wildwildtravel.com, 1 wildwind.world, 1 wildzoopark.co.uk, 1 @@ -89401,7 +89365,7 @@ williamboundsltd.com, 1 williamfeely.info, 1 williamgoldberg.cf, 1 williamjohngauthier.net, 1 -williamk.ga, 1 +williamk.ga, 0 williamle.com, 1 williampuckering.com, 1 williamscomposer.com, 1 @@ -89485,6 +89449,8 @@ winepress.org, 1 wineworksonline.com, 1 winfieldchen.me, 1 winfilestorage.tk, 1 +winfuture.de, 1 +winfuture.mobi, 1 wing-tsun.ga, 1 wing-tsun.gq, 1 wingchunboxtribe.com, 1 @@ -89523,6 +89489,7 @@ wintermeyer.de, 1 winteromeo.tk, 1 winterschoen.nl, 1 wintersportscompany.com, 1 +winterstyle.com, 1 winterzine.cf, 1 wintodoor.com, 1 winwares.com, 1 @@ -89596,6 +89563,7 @@ wisweb.no, 1 wit-creations.fr, 1 wit.ai, 1 witae.com, 1 +witch-anastasia.com, 1 witch-spells.com, 1 witchthicktits.tk, 1 with-environment.com, 1 @@ -89714,7 +89682,6 @@ wofford-ecs.org, 0 woffs.de, 1 wofox.com, 1 wogo.org, 1 -wohao.ga, 1 woheni.de, 1 wohlgemuth.rocks, 1 wohlpa.de, 1 @@ -89773,7 +89740,6 @@ womenfashionshirt.tk, 1 womens-suits.tk, 1 womensalespros.com, 1 womensbiz.tk, 1 -womenshairlossproject.com, 1 womensmedassoc.com, 1 womenswellnessobgyn.com, 1 woms.top, 1 @@ -89843,7 +89809,6 @@ woorocket.com, 1 wootkit.tk, 1 wootware.co.za, 1 wopplan.de, 1 -wopr.network, 1 wops.cc, 1 worca.de, 1 worcade.com, 1 @@ -89880,6 +89845,7 @@ work-at-home.ga, 1 work-at-home.gq, 1 work-in-progress.website, 1 workahealthic.de, 1 +workaround.run, 1 workathomenoscams.com, 1 workcelerator.com, 1 workcheck.bz, 1 @@ -89887,6 +89853,7 @@ workcloud.jp, 1 workcost.me, 1 workemy.com, 1 worker.gov, 1 +workeria-personal.de, 1 workerselforganisation.cf, 1 workfromhomebusinessopportunities.cf, 1 workfromhomelegitjob.com, 1 @@ -89917,7 +89884,6 @@ workupapp.com, 1 workwithgo.com, 0 world-documentary.ml, 1 world-education-association.org, 1 -world-in-my-eyes.com, 1 world-lolo.com, 1 world-of-tes.tk, 1 world-politics.tk, 1 @@ -89928,7 +89894,6 @@ worldcarding.tk, 1 worldcareers.dk, 1 worldcharteronline.ga, 1 worldchess.london, 1 -worldcigars.com.br, 1 worldcubeassociation.org, 1 worldessays.com, 1 worldeventscalendars.com, 1 @@ -90042,6 +90007,7 @@ wpac.de, 0 wpandup.org, 1 wpbeter.nl, 1 wpboot.com, 1 +wpbox.cc, 1 wpcanban.com, 0 wpcc.io, 1 wpccu-cdn.org, 1 @@ -90049,6 +90015,7 @@ wpcdn.bid, 1 wpcheck.io, 1 wpcs.pro, 1 wpdivitheme.nl, 1 +wpdo.it, 1 wpdublin.com, 1 wpexplorer.com, 1 wpformation.com, 1 @@ -90096,6 +90063,7 @@ wqaw3.tk, 1 wr.su, 1 wrap.in.ua, 1 wrapit.hu, 1 +wrara.org, 1 wrathofgeek.com, 1 wrbunderwriting.com, 0 wrc-results.com, 1 @@ -90129,6 +90097,7 @@ writingcities.net, 1 writingtoserve.net, 1 writtenworld.bg, 1 writtit.com, 1 +wrkflowmedia.de, 1 wrmea.org, 1 wrong.wang, 1 wrongware.cz, 1 @@ -90210,9 +90179,7 @@ wuppertal-2018.de, 0 wuppertaler-kurrende.de, 1 wuwuwu.me, 1 wuxiaohen.com, 1 -wuyiwa.net, 1 wuyue.photo, 1 -wuz.it, 1 wuzigackl.de, 0 wv-n.de, 1 wvg.myds.me, 1 @@ -90236,7 +90203,6 @@ wweichen.com.cn, 1 wwgc2011.se, 1 wwin818.com, 1 wwjd.dynu.net, 1 -wwtext.com, 1 wwv-8522.com, 1 wwv-8722.com, 1 wwvip88.com, 1 @@ -90269,6 +90235,7 @@ www.amazon.es, 1 www.amazon.fr, 1 www.amazon.it, 1 www.amazon.nl, 1 +www.apollo-auto.com, 0 www.banking.co.at, 0 www.braintreepayments.com, 0 www.capitainetrain.com, 0 @@ -90310,7 +90277,7 @@ www.org.gg, 1 www.paypal.com, 0 www.python.org, 1 www.re, 1 -www.rememberthemilk.com, 1 +www.rememberthemilk.com, 0 www.sb, 1 www.simbolo.co.uk, 0 www.simple.com, 0 @@ -90405,9 +90372,9 @@ x00738.com, 1 x00776.com, 1 x00786.com, 1 x0r.be, 1 -x10006.com, 1 -x10007.com, 1 -x10008.com, 1 +x10006.com, 0 +x10007.com, 0 +x10008.com, 0 x13.com, 1 x1616.tk, 1 x17.cafe, 1 @@ -90470,7 +90437,7 @@ x6729.co, 1 x69.biz, 1 x6957.co, 1 x6r3p2yjg1g6x7iu.myfritz.net, 1 -x7008.com, 1 +x7008.com, 0 x7713.com, 1 x7718.com, 1 x7719.com, 1 @@ -90526,12 +90493,12 @@ x81xx.com, 1 x81yy.com, 1 x81zz.com, 1 x82365.com, 1 -x9015.com, 1 +x9015.com, 0 x9016.com, 1 -x9017.com, 1 +x9017.com, 0 x9297.co, 1 -x9701.com, 1 -x9718.com, 1 +x9701.com, 0 +x9718.com, 0 x9728.co, 1 x98d.com, 1 x98e.com, 1 @@ -90570,6 +90537,7 @@ xab789.com, 1 xab799.com, 1 xab899.com, 1 xaba.tk, 1 +xabifk.com, 1 xacker.tk, 1 xaffit.com, 1 xahbspl.com, 1 @@ -90697,14 +90665,10 @@ xbdmov.com, 1 xbertschy.com, 1 xbjt11.com, 1 xbjt2.com, 1 -xbjt22.com, 1 xbjt3.com, 1 xbjt33.com, 1 -xbjt5.com, 1 -xbjt55.com, 1 xbjt66.com, 1 xbjt666.com, 1 -xbjt7.com, 1 xbjt77.com, 1 xblau.com, 1 xbots.tk, 1 @@ -90858,7 +90822,7 @@ xiamuzi.com, 1 xiangblog.com, 1 xianguocy.com, 1 xiangweiqing.co.uk, 1 -xiangwenquan.me, 1 +xiangwenquan.me, 0 xianjianruishiyouyiyuan.com, 1 xiao-sheng.gq, 1 xiaocg.xyz, 1 @@ -91120,6 +91084,7 @@ xn--3lqp21gwna.cn, 1 xn--3st814ec8r.cn, 1 xn--3stv82k.hk, 1 xn--3stv82k.tw, 1 +xn--43-6kc4be0fbz.xn--p1ai, 1 xn--48jwg508p.net, 1 xn--4brt03c.xn--io0a7i, 1 xn--4kro7fswi.xn--6qq986b3xl, 1 @@ -91318,7 +91283,6 @@ xn--keditr-0xa.biz, 1 xn--kkcon-fwab.nz, 1 xn--kl-oja.is, 1 xn--klmek-0sa.com, 1 -xn--krpto-lva.de, 1 xn--ktha-kamrater-pfba.se, 1 xn--kuerbiskernl-fjb.de, 1 xn--l8js6h476m.xn--q9jyb4c, 1 @@ -91357,6 +91321,7 @@ xn--n8j7dygrbu0c31a5861bq8qb.com, 1 xn--n8jp5083dnzs.net, 1 xn--n8jtcugp92n4wc738f.net, 1 xn--nda.fit, 1 +xn--nicieri-b4a.ro, 1 xn--nidar-tib.org, 1 xn--nide-loa.ee, 1 xn--nordlicht-hrnum-jtb.de, 1 @@ -91457,6 +91422,7 @@ xn--zr9h.cf, 1 xn--zr9h.ga, 1 xn--zr9h.ml, 1 xn--zr9h.tk, 1 +xn--zsr042b.fun, 1 xn5.de, 1 xnaas.info, 1 xnativi.pl, 1 @@ -91464,7 +91430,7 @@ xnet-x.net, 1 xnetwork.ml, 1 xninja.xyz, 1 xnix.tk, 1 -xnode.org, 1 +xnode.org, 0 xntrik.wtf, 1 xnu.kr, 1 xo.tc, 1 @@ -91500,7 +91466,6 @@ xpertairctx.com, 1 xpertairtx.com, 1 xpertairwaco.com, 1 xpertcube.com, 1 -xpiuat.global, 1 xpj000444.com, 1 xpj000555.com, 1 xpj000666.com, 1 @@ -91579,6 +91544,7 @@ xstreamable.com, 1 xsuper.net, 1 xtaboo3d.com, 1 xtarget.ru, 1 +xtensio.com, 1 xtips.us, 1 xtom.africa, 1 xtom.al, 1 @@ -91648,7 +91614,6 @@ xtremealaskainsulation.com, 1 xtremebouncepartyhire.com.au, 1 xtremecoatingtechnologies.com, 1 xtremegaming.it, 1 -xtrememidlife.nl, 1 xtronics.com, 1 xts.bike, 1 xts3636.net, 1 @@ -91720,6 +91685,7 @@ xy7272.com, 1 xy7373.com, 1 xybabyshop.com, 1 xybnb.com, 1 +xyconsultoresasociados.com, 1 xyenon.bid, 1 xyfun.net, 0 xyj22.com, 1 @@ -91728,6 +91694,7 @@ xyloefarmoges.gr, 1 xyndrac.net, 0 xynta.ch, 1 xyrexwolf-sebastien-izambard.tk, 1 +xyuya.com, 1 xywing.com, 1 xyzulu.hosting, 1 xyzyz.xyz, 1 @@ -91737,7 +91704,6 @@ xzclip.cn, 1 xzibits.com, 1 xztech.co, 1 xzy.es, 0 -y.gy, 1 y09a.com, 0 y09app.com, 0 y09app.vip, 0 @@ -91948,7 +91914,7 @@ yalcinkaya.ninja, 0 yalecleaners.com, 1 yallamotor.com, 1 yalook.com, 1 -yama.su, 1 +yama.su, 0 yamadaya.tv, 1 yamal-online.ml, 1 yamal159263.ml, 1 @@ -91980,11 +91946,13 @@ yangmaodang.org, 1 yangmi.blog, 1 yangruixin.com, 1 yanik.info, 1 +yanjicg.com, 1 yann.tw, 1 yanngraf.ch, 0 yannic.world, 0 yannick.cloud, 1 yannickb.de, 1 +yannickkordel.eu, 1 yannickvdvelde.tk, 1 yanniclandsmann.de, 1 yannik-buerkle.de, 1 @@ -91998,6 +91966,7 @@ yans.io, 1 yanservices.be, 1 yantox.com, 1 yantrasthal.com, 1 +yanwo.com.tw, 1 yao-in.com, 1 yao-in.net, 1 yao28.com, 1 @@ -92193,6 +92162,7 @@ yeyi.site, 1 yezishurb.site, 1 yf128.cc, 1 yfengs.moe, 1 +yg-crew.eu, 1 ygets.com, 1 yggdar.ga, 1 ygm.org.uk, 1 @@ -92257,7 +92227,6 @@ yjsoft.me, 1 yjsp.tv, 1 yjsp07.com, 1 yjsp333.com, 1 -yjsp45.com, 1 yjst.cn, 1 yjsw.sh.cn, 1 ykhut.com, 1 @@ -92300,6 +92269,7 @@ yoba.co.uk, 1 yobai-grouprec.jp, 1 yobasystems.co.uk, 1 yobbelwobbel.de, 0 +yobda.tk, 1 yobniyulyu.tk, 1 yobst.tk, 0 yocto.xyz, 1 @@ -92310,7 +92280,6 @@ yoga-bad-toelz.de, 1 yoga-in-aying.de, 1 yoga-prive.de, 1 yoga-school.xyz, 1 -yoga-schwerin.de, 1 yoga-zentrum-narayani.de, 1 yoga.is-an-engineer.com, 1 yogacentric.co.uk, 1 @@ -92332,11 +92301,13 @@ yogshrihealing.com, 1 yohanesmario.com, 1 yoitoko.city, 1 yoitsu.moe, 1 +yojanahub.com, 1 yojnaa.com, 1 yokoda.okinawa, 1 yokohama-legaloffice.jp, 1 yokone3-kutikomi.com, 1 yolandgao.me, 1 +yolifestylenow.online, 1 yolo-csgo.com, 1 yolo.jetzt, 1 yolobert.de, 1 @@ -92347,6 +92318,7 @@ yolops.net, 1 yoloyolo.top, 1 yombo.net, 1 yomena.in, 1 +yomi.moe, 1 yon.co.il, 1 yonema.com, 1 yongbin.org, 1 @@ -92381,8 +92353,8 @@ yoticonnections.com, 1 yotilabs.com, 1 yotta-zetta.com, 1 yotubaiotona.net, 1 -you.com.br, 1 you2you.fr, 1 +youbehero.com, 1 youber.cz, 1 youc.ir, 1 youcanfinance.com.au, 1 @@ -92418,6 +92390,7 @@ youngauthentic.cf, 1 youngdogs.org, 1 youngmodelsagency.tk, 1 youngpeopleunited.co.uk, 1 +youngsigncompany.com, 1 youngsoad.com, 1 youngsook.com, 1 youngsook.org, 1 @@ -92455,7 +92428,6 @@ yourconscious.life, 1 yourcopywriter.it, 1 yourdailyalerts.net, 1 yourdemowebsite.ml, 1 -yourdomain.host, 0 yourdrive.tk, 1 youreallyneedthis.co, 1 youregeeks.com, 1 @@ -92539,7 +92511,6 @@ yspa.tv, 1 ystream.tv, 1 ysun.xyz, 1 ysuna.xyz, 1 -yt220.com, 1 yt605.com, 1 yt606.com, 1 yt629.com, 1 @@ -92703,6 +92674,7 @@ yuxiangyuan.com, 1 yuxuan.org, 1 yuy.info, 1 yuyantang.club, 1 +yuyiyang.eu.org, 1 yuyo.com, 1 yuzei.tk, 1 yuzu-tee.de, 1 @@ -92714,6 +92686,7 @@ yveslegendre.fr, 0 yvesx.com, 1 yvonnehaeusser.de, 1 yvonnethomet.ch, 1 +ywyz.cc, 1 ywyz.tech, 1 yxt521.com, 1 yxzero.xyz, 1 @@ -92757,7 +92730,6 @@ z00228.com, 1 z0rro.net, 1 z1h.de, 1 z2a4.com, 1 -z30365.com, 1 z36533.com, 1 z36594.com, 1 z3u5.net, 1 @@ -93040,6 +93012,7 @@ zadroweb.com, 1 zaem.tv, 1 zaferaniehearing.com, 1 zaffke.co, 1 +zagainov.com, 1 zaghyr.org, 1 zagruz.tk, 1 zahe.me, 1 @@ -93066,6 +93039,7 @@ zaimexpress.cf, 1 zaimi.ml, 1 zaimin.ga, 1 zaimlime.ga, 1 +zaimponuj.pl, 1 zaimvkredit2.gq, 1 zaimvkredit3.ga, 1 zaimvkredit3.gq, 1 @@ -93123,7 +93097,6 @@ zambranopublicidadvideo.com, 1 zamenim.tk, 1 zamok-love.tk, 1 zamok.cf, 1 -zamor.com.br, 1 zamow.co, 1 zandcell.com, 1 zander.dk, 1 @@ -93171,7 +93144,6 @@ zaufanatrzeciastrona.pl, 1 zavarkin.tk, 1 zavec.com.ec, 0 zavedu.org, 1 -zavetaji.lv, 1 zawo-electric.de, 1 zayats.tk, 1 zaym.tk, 1 @@ -93442,7 +93414,6 @@ zenlogic.com, 1 zenluxuryliving.com, 1 zenmail.ga, 1 zenmate.com.tr, 1 -zenmod.in.rs, 1 zeno-dev.com, 1 zenofa.co.id, 1 zenrtal-online-russia.ml, 1 @@ -93497,6 +93468,7 @@ zerozero.gq, 1 zertif.info, 1 zertitude.com, 1 zeryn.net, 1 +zesgoes.nl, 1 zespia.tw, 1 zestadionu.pl, 1 zestylemon.co.uk, 1 @@ -93516,10 +93488,8 @@ zevelev.net, 1 zevenbergenbos.tk, 1 zewtie.com, 1 zf1898.com, 1 -zfast.com.br, 1 zfg.li, 1 zfj.hk, 1 -zfj.la, 1 zfly.me, 1 zfo.gg, 0 zfree.co.nz, 1 @@ -93647,6 +93617,7 @@ zillertaleralpen.net, 1 zilon.com.co, 1 zilore.com, 1 zilsen.com, 1 +zilsoft.net, 1 zilv.life, 1 zima.io, 1 zimaoxy.com, 1 @@ -93662,7 +93633,7 @@ zingarastore.com, 1 zingjerijk.nl, 1 zinglix.xyz, 1 zings.eu, 1 -zinniamay.com, 1 +zinniamay.com, 0 zinniazorgverlening.nl, 1 zinnowitzer-ferienwohnung.de, 1 zinoui.com, 1 @@ -93674,6 +93645,7 @@ zipextractor.com, 1 zipfworks.com, 1 zipkey.de, 1 ziqijiang.com, 0 +zir-online.com, 1 zircode.com, 1 zirka24.net, 1 ziroh.be, 1 @@ -93954,6 +93926,7 @@ zombmage.tk, 1 zomerschoen.nl, 1 zomiac.pp.ua, 1 zona-bellepop.tk, 1 +zonaairsoft.com, 1 zonadigital.co, 1 zonaperu.tk, 1 zonatelevision.tk, 1 @@ -93975,6 +93948,7 @@ zoogbook.ml, 1 zoohaus.de, 1 zooish.net, 1 zook.systems, 1 +zook.tk, 1 zoola.io, 1 zoological-gardens.eu, 1 zoom.earth, 1 @@ -94013,6 +93987,7 @@ zovirax-cream.ml, 1 zowe.ru, 1 zowedo.com, 1 zoyride.com, 1 +zoznamrealit.sk, 1 zozzle.co.uk, 1 zp.do, 1 zp25.ninja, 1 @@ -94066,6 +94041,7 @@ zukix.com, 1 zula.africa, 1 zulaoyun.ml, 1 zulu.ro, 1 +zuluconnect.net, 1 zum-baur.de, 1 zum-ziegenhainer.de, 1 zumba.com, 1 @@ -94077,7 +94053,6 @@ zundapp.one, 1 zundapp529.nl, 1 zundappachterhoek.nl, 1 zunlong0.com, 1 -zunlong918.net, 1 zuolan.me, 0 zup.me, 1 zupago.pe, 1 diff --git a/security/manager/ssl/tests/unit/test_osreauthenticator.js b/security/manager/ssl/tests/unit/test_osreauthenticator.js index 5bcde2afc6a907d27d1be3a4bdf53aa869a124a7..01784a5fef7ee533132997119c19b1da435b92d7 100644 --- a/security/manager/ssl/tests/unit/test_osreauthenticator.js +++ b/security/manager/ssl/tests/unit/test_osreauthenticator.js @@ -4,20 +4,24 @@ "use strict"; // Tests nsIOSReauthenticator.asyncReauthenticateUser(). -// Currently this always resolves to false on all platforms. As this gets implemented on various -// platforms, running this rest will result in a prompt from the OS. Consequently, we won't be able +// As this gets implemented on various platforms, running this test +// will result in a prompt from the OS. Consequently, we won't be able // to run this in automation, but it will help in testing locally. add_task(async function test_asyncReauthenticateUser() { const reauthenticator = Cc[ "@mozilla.org/security/osreauthenticator;1" ].getService(Ci.nsIOSReauthenticator); ok(reauthenticator, "nsIOSReauthenticator should be available"); + const EXPECTED = false; // Change this variable to suit your needs while testing. ok( - !(await reauthenticator.asyncReauthenticateUser( - "this is the prompt string", - "this is the caption string", - null - )), - "nsIOSReauthenticator.asyncReauthenticateUser always resolves to false for now" + ( + await reauthenticator.asyncReauthenticateUser( + "this is the prompt string", + "this is the caption string", + null + ) + )[0] == EXPECTED, + "nsIOSReauthenticator.asyncReauthenticateUser should return a boolean array with the first item being the authentication result of: " + + EXPECTED ); }); diff --git a/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp b/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp index db80f007bf3896eb9287fa1a96b3113d2e37640f..40501bff581fd83d2bb9ee16c5e01c8b980cda1e 100644 --- a/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp +++ b/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp @@ -32,6 +32,10 @@ #include "sandbox/win/src/security_level.h" #include "WinUtils.h" +#if defined(MOZ_LAUNCHER_PROCESS) +# include "mozilla/LauncherRegistryInfo.h" +#endif // defined(MOZ_LAUNCHER_PROCESS) + namespace mozilla { sandbox::BrokerServices* SandboxBroker::sBrokerService = nullptr; @@ -300,6 +304,16 @@ bool SandboxBroker::LaunchApp(const wchar_t* aPath, const wchar_t* aArguments, TerminateProcess(targetInfo.hProcess, 1); CloseHandle(targetInfo.hThread); CloseHandle(targetInfo.hProcess); + +#if defined(MOZ_LAUNCHER_PROCESS) + // The launcher process had started the browser process successfully, but + // the browser process failed start to a content process. We're entering + // into a situation where the browser is opened without content processes. + // To stop it next time, we disable the launcher process. + LauncherRegistryInfo regInfo; + Unused << regInfo.DisableDueToFailure(); +#endif // defined(MOZ_LAUNCHER_PROCESS) + return false; } } else { diff --git a/services/settings/dumps/blocklists/addons.json b/services/settings/dumps/blocklists/addons.json index 3520bf72b9cfc01ea517a173771c0bd96f18a8ad..bc1eb62cedbd87b4a8e26c27a9d149daff9f73b9 100644 --- a/services/settings/dumps/blocklists/addons.json +++ b/services/settings/dumps/blocklists/addons.json @@ -1 +1 @@ -{"data":[{"guid":"{171cdcfa-d6d3-4bc2-8e5d-dfcbb67c7695}","prefs":[],"schema":1585597291445,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1625509","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Sushkom AV"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a51c888f-234f-4f0b-a76c-c0a036bfa6ca","last_modified":1585730548574},{"guid":"{b7410e57-0452-47d5-a7cf-a1a91e7fd0b7}","prefs":[],"schema":1585424490920,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1625922","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eaa5e3c2-1be6-4eb9-9357-f2d0686448be","last_modified":1585575900465},{"guid":"/^((\\{e2e34cff-c7d2-4c87-8195-d206ac928969\\})|(\\{aea3f9d0-909d-4c39-9282-25b11aa29d61\\})|(\\{ec5c4eed-0275-4148-a7f0-b21c05121703\\}))$/","prefs":[],"schema":1585158977245,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1625025","why":"This add-on violates Mozilla's add-on policies by using a deceptive name or collecting ancillary user data.","name":"Deceptive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"034951cb-7614-4202-af35-18123476eb03","last_modified":1585238797372},{"guid":"/^((\\{927f6d6a-104f-4e69-b99a-e62e856899d9\\})|(\\{edf2d18c-ba07-4f30-bd59-85520b7259d8\\})|(\\{2128e9bc-aa97-4f9e-9327-bdce611538fb\\})|(\\{41a71134-b81e-49c5-be44-154c1b981153\\})|(\\{e00696fa-7731-40c6-81f1-5507d0435347\\})|(\\{f6dee727-c6cf-4d4a-b108-d59c3d9723ce\\})|(\\{48935666-26c5-484a-ade3-1660eca6a219\\})|(\\{06b9fcaa-45df-4fb3-a8fa-775d68690f5b\\})|(jid1-4P0kohSJxU1qGa@jetpack)|(jid1-93WyvptyvzGATw@jetpack)|(addon@ytdownloader1\\.info)|(\\{f4817c52-46ac-4b98-b682-f900701c5778\\}))$/","prefs":[],"schema":1585177209604,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1625186","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"abcf90de-7322-4232-a59c-06e4b3a33c68","last_modified":1585238797365},{"guid":"/^ext@bettersurfplus$/","prefs":[],"schema":1585140126652,"blockID":"i506","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=939254","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware and is installed silently in violation of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BetterSurf (malware)","created":"2013-12-10T15:10:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b4da06d2-a0fd-09b6-aadb-7e3b29c3be3a","last_modified":1585158976536},{"guid":"/^((\\{7aeae561-714b-45f6-ace3-4a8aed6e227b\\})|(\\{01e86e69-a2f8-48a0-b068-83869bdba3d0\\})|(\\{77f5fe49-12e3-4cf5-abb4-d993a0164d9e\\}))$/","prefs":[],"schema":1585140060946,"blockID":"i436","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=891606","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, changing Firefox default settings and not reverting them on uninstall. If you want to continue using this add-on, it can be enabled in the Add-ons Manager.","name":"Visual Bee","created":"2013-08-09T15:04:44Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ad6dc811-ab95-46fa-4bff-42186c149980","last_modified":1585158976531},{"guid":"/^((\\{0b24cf69-02b8-407d-83db-e7af04fc1f3e\\})|(\\{6feed48d-41d4-49b8-b7d6-ef78cc7a7cd7\\})|(\\{8a0699a0-09c3-4cf1-b38d-fec25441650c\\}))$/","prefs":[],"schema":1585138327934,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1434759","why":"These add-ons use remote scripts to alter popular sites like Google or Amazon.","name":"Malicious remote script add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"32ffc62d-40c4-43ac-aa3f-7240978d0ad0","last_modified":1585158976522},{"guid":"/^(({41c14ab8-9958-44bf-b74e-af54c1f169a6})|({78054cb2-e3e8-4070-a8ad-3fd69c8e4707})|({0089b179-8f3d-44d9-bb18-582843b0757a})|({f44ddcb4-4cc0-4866-92fa-eefda60c6720})|({1893d673-7953-4870-8069-baac49ce3335})|({fb28cac0-c2aa-4e0c-a614-cf3641196237})|({d7dee150-da14-45ba-afca-02c7a79ad805})|(RandomNameTest@RandomNameTest\\.com)|(corpsearchengine@mail\\.ru)|(support@work\\.org))$/","prefs":[],"schema":1585145454357,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1458330","why":"These are malicious add-ons that inject remote scripts and use deceptive names.","name":"\"Table\" add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3a123214-b4b6-410c-a061-bbaf0d168d31","last_modified":1585158976514},{"guid":"/^((@mixclouddownloader)|(all-down@james\\.burrow)|(d\\.lehr@chello\\.at)|(easy-video-downloader@addonsmash)|(easy-youtube-mp3@james\\.burrow)|(gid@addonsmash)|(gmail_panel@addon_clone)|(idm@addonsmash)|(image-picka@addonsmash)|(instant-idm@addon\\.host)|(jdm@awesome\\.addons)|(open-in-idm@addonsmash)|(open-in-idm@james\\.burrow)|(open-in-vlc@awesome\\.addons)|(saveimage@addonsmash)|(thundercross@addonsmash)|(vk-download@addon\\.host)|(vk-music-downloader@addonsmash)|(whatsapp_popup@addons\\.clone)|(ytb-down@james\\.burrow)|(ytb-mp3-downloader@james\\.burrow)|(\\{0df8d631-7d88-401e-ba7e-af1425dded8a\\})|(\\{3c74e141-1993-4c04-b755-a66dd491bb47\\})|(\\{5cdd95c7-5d92-40c5-8e2a-8c52c90191d9\\})|(\\{40efedc0-8e48-404a-a779-f4016b25c0e6\\})|(\\{53d605ce-599b-4352-8a06-5e594b3d1822\\})|(\\{3697c1e8-27d7-4c63-a27e-ac16191a1545\\})|(\\{170503FA-3349-4F17-BC86-001888A5C8E2\\})|(\\{649558df-9461-4824-ad18-f2d4d4845ac8\\})|(\\{27875553-afd5-4365-86dc-019bcd60594c\\})|(\\{27875553-afd5-4365-86dc-019bcd60594c\\})|(\\{6e7624fa-7f70-4417-93db-1ec29c023275\\})|(\\{b1aea1f1-6bed-41ef-9679-1dfbd7b2554f\\})|(\\{b9acc029-d62b-4d23-b921-8e7aea34266a\\})|(\\{b9b59e13-4ac5-4eff-8dbe-c345b7619b3c\\})|(\\{b0186d2d-3126-4537-9186-a6f198547901\\})|(\\{b3e8fde8-6d97-4ac3-95e0-57b797f4c56b\\})|(\\{e6a9a96e-4a08-4719-b9bd-0e91c35aaabc\\})|(\\{e69a36e6-ee12-4fe6-87ca-66b77fc0ffbf\\})|(\\{ee3601f1-78ab-48bf-89ae-0cfe4aed1f2e\\})|(\\{f4ce48b3-ad14-4900-86cb-4604474c5b08\\})|(\\{f5c1262d-b1e8-44a4-b820-a834f0f6d605\\}))$/","prefs":[],"schema":1585149409880,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1476020","why":"Add-ons repeatedly violated several of review policies.","name":"Several youtube downloading add-ons and others"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0"}],"id":"ae8ae617-590d-430b-86d4-16364372b67f","last_modified":1585158976511},{"guid":"/^(({a4d84dae-7906-4064-911b-3ad2b1ec178b})|({d7e388c5-1cd0-4aa6-8888-9172f90951fb})|({a67f4004-855f-4e6f-8ef0-2ac735614967})|({25230eb3-db35-4613-8c03-e9a3912b7004})|({37384122-9046-4ff9-a31f-963767d9fe33})|({f1479b0b-0762-4ba2-97fc-010ea9dd4e73})|({53804e15-69e5-4b24-8883-c8f68bd98cf6})|({0f2aec80-aade-46b8-838c-54eeb595aa96})|({b65d6378-6840-4da6-b30e-dee113f680aa})|({e8fc3f33-14b7-41aa-88a1-d0d7b5641a50})|({c49ee246-d3d2-4e88-bfdb-4a3b4de9f974}))$/","prefs":[],"schema":1585138540335,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1484536","why":"Add-ons that don't respect user choice by overriding search.","name":"Search hijacking add-ons (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"01c22882-868b-43e1-bb23-29d5dc7bc11b","last_modified":1585158976508},{"guid":"/^((\\{0b47ef96-f7c9-4017-97b6-51c1280eaf6e\\})|(\\{2c65ed54-5215-4f10-a7bd-39445a6450fd\\})|(\\{80dbc30a-168b-4a18-bd5b-51f9b1807d7f\\})|(\\{93a106e3-e70b-48af-9282-30e3d6c87af9\\})|(\\{2120dc72-6040-45ed-9655-aaabed57fc93\\})|(\\{c3c9f1ee-4192-4d5a-b753-a62c19b16c98\\})|(\\{d0fc8cf9-66aa-4f08-8c96-3f882c2e9c9b\\})|(\\{da69b9e2-c2d1-4b90-93be-4cc3976e452d\\})|(\\{eb70585e-76bb-4eae-9f06-7fc5efbc877e\\})|(fairshare-unlock@burstworks-test\\.com)|(fairshare-unlock@burstworks\\.com)|(freevideodownloader-hosted@funnerapps\\.com)|(freevideodownloader-test-hosted@funnerapps\\.com)|(gmo-panel@ddmr\\.com)|(helper-sig@savefrom\\.net)|(ihmgiclibbndffejedjimfjmfoabpcke@chrome-store-foxified--?\\d+)|(ihmgiclibbndffejedjimfjmfoabpcke@chromeStoreFoxified--?\\d+)|(panel-branded@ddmr\\.com)|(panel-canadaTalkNow@ddmr\\.com)|(panel-community@ddmr\\.com)|(panel-digaYgane@ddmr\\.com)|(panel-ecglobal@ddmr\\.com)|(panel-fusionCash@ddmr\\.com)|(panel-grindaBuck@ddmr\\.com)|(panel-measurement@ddmr\\.com)|(panel-mysoapbox@ddmr\\.com)|(panel-ofernation@ddmr\\.com)|(panel-rewarding@ddmr\\.com)|(panel-superpay@ddmr\\.com)|(panel-zippy@ddmr\\.com)|(test_fairshare-unlock@burstworks\\.com)|(test-fairshare-unlock@burstworks\\.com)|(vindale@ddmr\\.com))$/","prefs":[],"schema":1585151995695,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562965","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"04c27082-2b78-4005-a6c5-8e0a13f83288","last_modified":1585158976505},{"guid":"/^((\\{3c8970fa-1340-45ad-82fe-81f3beccfbdc\\})|(\\{4ab99b95-4d05-438c-8a3e-adb1b3fe8d81\\})|(\\{7f87a05d-dba7-448e-9af2-ee0f4a294c01\\})|(\\{59a219a8-45cd-458d-9b3e-8d86c19dfc31\\})|(\\{79f4bfc7-b1da-4dc4-85cc-ecbcc5dd152e\\})|(\\{484dc5ad-4d6a-4ee4-91b7-b5b8166e6b3d\\})|(\\{2643d75f-9d64-47ef-9c23-78f0f055c7b8\\})|(\\{76399bf2-8354-4b11-bf43-6c863b195b1d\\})|(\\{110791c0-2883-4301-8214-90be7549df43\\})|(\\{a33e004d-2ac0-4d77-8e14-50780bc231a3\\})|(\\{aaaa5840-6b3b-49d8-92c2-9696798c4e2a\\})|(\\{bfc55377-7210-4e7a-828f-6fdb9df02847\\})|(\\{c6c78b9a-370d-49c5-b9c6-96d7e38861c5\\})|(\\{c115eb3a-4746-472b-8f1f-d8596c49b3b6\\})|(\\{deaa22e5-33ed-440f-a734-c3175e6228a7\\})|(\\{e34d5840-6b3b-49d8-92c2-9696798c4e2a\\})|(aapbdbdomjkkjkaonfhkkikfgjllcleb@[cC]hrome-?[sS]tore-?[fF]oxified--?((\\d+)|(unsigned)))|(babelfox_client@rami)|(blndkmebkmenignoajhoemebccmmfjib@chrome-store-foxified--?\\d+)|(bridge-translate-app@chrome-store-foxified--?\\d+)|(dephbpajmknbniclommefdlnflkfnpgh@chrome-store-foxified--?\\d+)|(extension@newtab\\.biz)|(generated-74o6bact7xu7y32fvfju4s@chrome-store-foxified--?\\d+)|(generated-axbwzwbksnnig1ug9v5dly@chrome-store-foxified--?\\d+)|(googletranslateelement@developer\\.org)|(icdahkkjdchifpnbebileaelbcgipepe@chrome-store-foxified--?\\d+)|(ifgljfjnflaadalpmkkgdailepedeehd@chrome-store-foxified--?\\d+)|(knpgbkpddpcepnloiijojmgbdhihkjkl@chrome-store-foxified--?\\d+)|(translate-4@chrome-store-foxified--?\\d+))$/","prefs":[],"schema":1585157952678,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1593243","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"11fd123a-e67d-44ab-909f-b776ea2e8d0a","last_modified":1585158976501},{"guid":"/^((graph-helper@thegraph\\.co)|(lab@uneg\\.edu\\.ve)|(ponyhoofbeta@ponyhoof\\.little\\.my)|(\\{75080f0e-3dbe-455d-a1d1-33850f36e2ff\\})|(\\{27883109-b35d-4b6b-9e5b-89b26496fb5e\\})|(\\{cf407827-6739-4514-ad2e-8af25c0e1d97\\})|(\\{c9efb61c-f0bb-42a2-a3e5-ca75da67007c\\})|(\\{c671463f-7bd2-4a35-839c-2097aa52b1d2\\})|(\\{83d16411-a3d6-4268-a95f-1e9abcbdd521\\})|(\\{3835f36e-a8a8-4247-a731-6e1ed7d52c5f\\})|(\\{8d13fb0d-e6b6-4301-9865-3c438a1a347f\\})|(\\{21262c5a-3c8e-46a1-b504-7d16ccddf656\\})|(\\{3e1f3207-8b6c-493b-91f3-0eb43326e273\\})|(\\{9fe1f0bb-c24d-4eab-90f5-9471905132f6\\})|(\\{8b189632-155f-4478-bf51-285c3a54de8c\\})|(\\{3854ac9e-7c1c-4d2a-84f7-edc8656ac7ae\\})|(\\{ec82c419-3cc7-4789-bad0-a069ef80211e\\})|(\\{C0D03FFD-391A-41CE-ACA2-64557D9440CC\\})|(\\{D4A86045-8722-4289-93C4-7C80970F0E7D\\})|(\\{5f23a0d5-ff0e-4e18-8afc-cf50c468ea1d\\})|(\\{6b67941f-2544-468d-b371-ad5c2d99687b\\})|(\\{d6a07a0c-cad7-4e08-987a-099c1add5fc4\\})|(web-signer@softplan\\.com\\.br)|(\\{251eec9f-108a-4864-960f-e07cee35a991\\})|(\\{9cd44027-9d26-4cbd-bfd9-da7eaa495261\\})|(\\{4244357f-568b-477b-802a-db9d6551a719\\})|(\\{1ed0819f-e210-4089-8e24-af2dba6451bb\\})|(\\{e02dba27-b975-4dcb-9adb-ea74ed6cd632\\})|(\\{1240d113-0410-418b-b99f-047aad6ddae3\\})|(\\{115d13bd-f95d-4a61-9dd7-fb3ab816a8dd\\})|(mydesires@mydesires\\.com)|(mesenvies@mesenvies\\.fr)|(\\{0f250607-4465-49bb-a56c-12c8514a3e7d\\})|(\\{12a290cc-2b60-4efb-96f0-dde41f27769d\\})|(\\{9ac03a7d-f80f-4868-8b95-35074f8cdf62\\})|(\\{ce1da0e5-133b-4828-8cbb-66c5ea97e78e\\})|(\\{0da8fe99-30f7-462c-85d0-db66f4f70a97\\})|(\\{9aca9f23-d9aa-4680-9dcb-837291ff6854\\})|(\\{d86d1438-56ef-4294-ab9b-ac1f2c6420e6\\})|(\\{6280d3e5-a444-4823-be7d-317090d3b175\\})|(\\{faccc7b3-b0c7-4fcc-9d4d-b12721ea7f0d\\})|(\\{b84f4632-26f1-4fb5-9082-1f2ca7685afa\\})|(\\{a543f841-3613-4a52-bce8-58bd6e7eb100\\})|(\\{5b1c9b32-9dd3-461c-85c6-bbac4ef2af19\\})|(\\{0207f077-7f95-47ba-b0f9-b356d456f914\\})|(teste@addon\\.com)|(\\{6da58723-1757-42a4-a2db-849f6159c880\\})|(\\{4a122670-da9d-4257-b2bc-27440af385af\\})|(\\{f39035e7-e7f6-4dc1-b13b-04d7a365ab41\\})|(\\{3b3201ca-d7a1-48ab-a89b-ad97cd688590\\})|(\\{bb0179bf-3435-4924-8ae5-19f35e7f1a7f\\})|(\\{d2f6e317-3957-4931-b9b1-6b3ebef25aab\\})|(luckypdf@luckypdfconverter\\.com)|(\\{755ae77a-2901-4177-99aa-ac3fe15974e0\\})|(\\{6e5cab8f-78da-45fe-90af-4cfaf3d95d0e\\})|(\\{cd0c26ad-5150-42cb-bec1-2da0db715a90\\})|(\\{357d3c5d-5c68-4943-b49e-df20c6ff931e\\})|(\\{8b5d6a2c-d18c-47b6-9b13-cebab7425838\\})|(\\{d26b38f2-1ec0-43d8-8d05-8e14a09955bc\\})|(\\{d3b4d997-cf97-4ffe-9401-3efcbc816fd9\\})|(\\{506848ee-e612-4d2f-8645-70c26e577efd\\})|(\\{c0272d15-248c-4f93-80cd-684c0f360da1\\})|(\\{7a478659-43ba-4054-8d67-9ad75f66f0f6\\})|(\\{351b37fb-6d84-4820-8dbe-a517d8f856ce\\})|(\\{f0031513-5b7e-4cc6-9a16-616c82e79d48\\})|(\\{adf2ee6b-ef1c-4350-b35f-369e6b0dc64a\\})|(\\{06a6425d-0e31-4703-a0e2-72d4a552477c\\})|(\\{6f8a85a2-d83b-4a2c-ac38-d06bf3fb1b92\\})|(\\{9d96147e-9418-4493-bedb-380bf065f8b0\\})|(\\{3055992b-3fda-44bf-9065-8514ea2c2acb\\})|(\\{602ade61-49fc-4a40-9287-53949c8f0462\\})|(\\{c28dd807-0b3f-4bc4-984c-ff9578202712\\})|(\\{495e077c-0015-4e70-80f3-4b1b71e9c866\\})|(\\{19ebc477-304c-4d75-990b-6d47c230c19d\\})|(\\{08df44a4-ef6a-4828-9ebe-a730dd47ee5e\\})|(allsigningoffline@nextsense\\.com)|(\\{cc304579-73e2-4fa7-9863-f1cda545e542\\})|(\\{bf0d9dc8-ca00-4bba-88a0-535e20b089ea\\})|(\\{00dd06ff-7392-449b-9e87-8a39c5f5cb05\\})|(\\{c8882c78-ee4f-4c9c-8380-ab8f1d333e0d\\})|(\\{1bf5b2e0-14aa-49a4-9642-d2f28bb44730\\})|(\\{8afde9a0-bd2d-48f4-939c-8e7ec4210085\\})|(\\{8bd4cf33-e9c2-4a9c-84f5-ef0f3a512c53\\})|(\\{390d4afb-83c3-4a8c-93a0-587f9c52eb10\\})|(\\{3624218a-2799-478f-84bf-8f6ddd4fe8f5\\})|(\\{5303ae90-10ef-4c9c-bc51-d7062883b9a1\\})|(vivoinforma@tutanota\\.com)|(\\{8e638a74-6131-40b9-b64e-4341cf67d491\\})|(\\{f9295774-e455-4986-832c-cc4863769e66\\})|(thisisummsstrikethroughhighlighting@example\\.com)|(frigate@loranrendel)|(\\{ff4dc908-b851-42b7-adee-d9a5bb1e6813\\})|(\\{3ec50eaf-e36b-4b26-b255-0d75abe112b9\\})|(@LmXEarthZoomToolOneShot)|(\\{91be62bd-8752-45bf-a20a-b6b2d4abf87e\\})|(cloud-support@wildfire\\.ai)|(YoutubeUploader@ArcAvalon\\.com)|(\\{2e3be1f1-fb5c-40fb-b578-d2c9184ce470\\}))$/","prefs":[],"schema":1585146642510,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"92ac1ebd-7dcd-4446-a7b3-7e359ad1c4b5","last_modified":1585158976498},{"guid":"/^((Smart_Search_voIhxkbgGH@www\\.convertmyfile\\.co)|(Smart_Search_vRIICPGhwx@www\\.job-portal\\.co)|(Smart_Search_wsRtgwiOcH@www\\.search-smart\\.live)|(Smart_Search_xCropjfsuc@www\\.searchsmart\\.live)|(Smart_Search_yCAOHFcvfi@www\\.smart-search\\.live)|(Smart_Search_yDaEiIzkQK@www\\.smartsearch\\.live)|(Smart_Search_yhCKmmAXWz@www\\.searchsmart\\.online)|(Smart_Search_yrwXRZHXLh@www\\.search-smart\\.online)|(Smart_Search_YXySavVGVt@www\\.search-smart\\.work)|(SMART_SEARCH_YZaevPNtHc@www\\.localweathertoday\\.net)|(Smart_Search_ZsEjqVBHGd@www\\.convertthefile\\.net)|(Smart_Searches_FuCzQWfGWa@www\\.smartsearches\\.co)|(SMART-SEARCH_sHhQFGpFhV@www\\.coupondealer\\.co)|(Smart-Search_UasOSUTNhv@www\\.map-buddy\\.net)|(Smart\\.Search_631e8da2146d6187149c9206fac1a89e@www\\.convertthepdf\\.co)|(Smart\\.Search_IfzjxIabfy@www\\.convertthepdf\\.co)|(SmartSearch_clone_DyqkuEZPRF@www\\.search-smart\\.co)|(SmartSearch_DSuyKfIhTM@www\\.convertmypdf\\.online)|(SmartSearch_gkOEsQztVd@www\\.search-smart\\.co)|(SmartSearch_ohUbxjDpNV@www\\.search-smart\\.co)|(Speed_Check_01c5dfe0109bc6cb0e711840b239846c@www\\.checkmyspeed\\.co)|(Speed_Check_07449674bdae85845b4fc92e2695caf3@www\\.checkmyspeednow\\.com)|(Speed_Check_2098fea3a2c7a807bdeb61111c2de48f@www\\.checkmyspeed\\.co)|(Speed_Check_2305caaa9793a7577aa6283a89da7971@www\\.checkmyspeednow\\.com)|(Speed_Check_25ae2975d89f06e814b2e421109be7ef@www\\.checkmyspeednow\\.com)|(Speed_Check_55750cbafa724e361805677e2c1a0ea7@www\\.checkmyspeednow\\.com)|(Speed_Check_56ad7958c2981e0f1cad6d4de2abcb4b@www\\.checkmyspeed\\.co)|(Speed_Check_616286717d187249f5d29d2bc8771294@www\\.checkmyspeednow\\.com)|(Speed_Check_87ec83e10e18545948a0d739589fa6c0@www\\.checkmyspeed\\.co)|(Speed_Check_917a4c229b30f0ac1bca0aa5a43f8f2e@www\\.checkmyspeednow\\.disabled\\.com)|(Speed_Check_94cbe40b6d2b11c86b07bbb606fe11e2@www\\.checkmyspeednow\\.com)|(Speed_Check_a4d8b86ff6fa408ee87b70d65c41d1dd@www\\.checkmyspeed\\.co)|(Speed_Check_cdeb8d6f1f2426379a89eac745d5853a@www\\.checkmyspeed\\.co)|(Speed_Check_clone_aqksrBHRvi@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_CrMqWRFYTl@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_ec2c77c7b610b83c9f6bef2573e4d3a1@www\\.checkmyspeed\\.co)|(Speed_Check_clone_IchkKEIlVC@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_nmRPlvUEJv@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_OczJkeuXDq@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_QlPnYtcPGo@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_RjaZbJQbEk@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_WPgSSdchao@www\\.checkmyspeed\\.co)|(Speed_Check_ed30669ac9901d20415ead7770db761a@www\\.speedchecktool\\.com)|(Speed_Check_FZSVtPegfX@www\\.checkmyspeed\\.co)|(Speed_Check_iQueDNOXmF@www\\.checkmyspeed\\.co)|(Speed_Check_LUlQBGtuOE@www\\.checkmyspeednow\\.com)|(Speed_Check_MNeDWiZeoo@www\\.checkmyspeed\\.co)|(Speed_Check_XckNwcWvNE@www\\.checkmyspeed\\.co)|(Speed_Check_xSObhPOTMw@www\\.checkmyspeed\\.co)|(Speed_Checker_Pro_260678188808c41791fdd9d9ed445802@www\\.speedcheckerpro\\.com)|(Speed_Checker_Pro_esgyoKewQa@www\\.speedcheckerpro\\.com)|(Speed_Test_Ace_0e5d46c255d8ceec71018d460c702e40@www\\.speedtestace\\.com)|(Speed_Test_Ace_b81323c0334e1c3f409c1dd14aa60f61@www\\.speedtestace\\.co)|(Speed_Test_Ace_clone_DKdXeTMeZx@www\\.speedtestace\\.co)|(Speed_Test_Ace_kcEikItaOC@www\\.speedtestace\\.co)|(Speed_Test_Ace_ppoJbdaucW@www\\.speedtestace\\.co)|(Speed_Test_Now_ZDIRLnXzms@speedtestnow\\.co)|(Speed_Test_OoJkZnYICK@www\\.speed-test\\.live)|(Speed_Test_uJpXMlaztD@www\\.testyourspeed\\.co)|(sportsbulletin@www\\.sportsupdates\\.co)|(sportseveryday@www\\.sportseveryday\\.co)|(sportseverydayco@www\\.sportseveryday\\.co)|(sportsupdates\\.website_SdCnLxLIxY@www\\.sportsupdates\\.website)|(Spot_Flight_Now_6b388ff946e79dc3fd82eec51958d550@www\\.spotflightnow\\.com)|(Spot_Flight_Now_clone_eb4c54758e45589d6039415632c1e319@www\\.spotflightnow\\.com)|(Spot_Flight_Now_clone_eTPyUPJmtK@www\\.spotflightnow\\.com)|(Spot_Flight_Now_clone_UZIlZeQYAb@www\\.spotflightnow\\.com)|(Spot_Flight_Now_EtIsXJyXXm@www\\.spotflightnow\\.com)|(Spot_Flight_Now_f268f21c4c60f3e78601d20b97453943@www\\.spotflightnow\\.com)|(staging\\.checknetspeed\\.co_nREaqypDrX@staging\\.checknetspeed\\.co)|(Start_A_Career_RXEBmchKFm@www\\.jobs\\.startacareer\\.co)|(Stream_TV_Live_KrYxWrtCtv@www\\.streamtvlive\\.co))$/","prefs":[],"schema":1585146841367,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aae4b574-f195-4f18-8bc0-c3b712e4316b","last_modified":1585158976495},{"guid":"/^((Easy_Doc_Converter_b4ab66ebed6d4f9148bd9024b5b45266@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_egpEGOXPkz@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_f5e570a648be4d82f02fa2106a21a43f@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_IteaxXKJex@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_jJGqUHYgCN@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_KPOmYhpWMq@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_KyppGVLzlw@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_PuJVSyMdMn@www\\.easydocconverter\\.com)|(Easy_Email_Center_clone_LWcJzWsabx@www\\.easyemailcenter\\.com)|(Easy_Email_Center_clone_WroHXxYaWe@www\\.easyemailcenter\\.com)|(Easy_Email_Center_fhZhWrvhNZ@www\\.easyemailcenter\\.com)|(Easy_Email_Checker_54b7a48dd3773a01313275df62afd4cf@www\\.easyemailchecker\\.net)|(Easy_Email_Plus_GqrjVlzgJP@www\\.easyemailplus\\.com)|(Easy_Forms_Finder_gmYexjlshO@www\\.easyformsfinder\\.com)|(Easy_Inbox_Access_clone_BHQcoGwBXJ@www\\.easyinboxaccess\\.com)|(Easy_Inbox_Access_pXyLNbavvp@www\\.easyinboxaccess\\.com)|(Easy_Inbox_Access_yVECZMgzTG@www\\.easyinboxaccess\\.com)|(Easy_Mail_Login_FRPUoJrXUl@www\\.easymail-login\\.co)|(Easy_Mail_Logins_AGDDyUpIjb@www\\.easymaillogin\\.co)|(Easy_Map_Finder_a811a7fb227baf4b89b3ed4d017fcfc4@www\\.easymapsfinder\\.com)|(Easy_Map_Tab_44b8d948ebfb6010e7fe17ad02606c6e@www\\.easymaptab\\.com)|(Easy_Map_Tab_rfqbzWtygp@www\\.easymaptab\\.com)|(Easy_Maps_VsjiCqbVfo@www\\.mapdirectionspront\\.co)|(Easy_Online_Recipe_IzyMoUNAGs@www\\.easyonlinerecipe\\.co)|(Easy_Online_Recipe_oEqObvsniN@www\\.easyonlinerecipe\\.net)|(Easy_Recipes_277ea1aa5aaed20cbb145291ebf0cdc1@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_35f61f2bee1a01e94edbbb868bbb66ca@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_5d97b38952cbd818b53669ee377f4a4e@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_JkInlZZXKJ@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_qwPPMUMPbm@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_VZjydpXYuD@www\\.dailyrecipesearch\\.net)|(Easy_Search_3ce2d360291c0435253c279a003f4bee@www\\.easy-search\\.co)|(Easy_Search_9259a3968f7a7a407cf8a9c5b5aac8b5@www\\.easy-search\\.co)|(Easy_Search_Access_41cd311e7ebb5abe48a68600a41b6a6e@www\\.easysearchaccess\\.com)|(Easy_Search_Access_zBaMiEnnEw@www\\.easysearchaccess\\.com)|(Easy_Search_bJrePoApTo@www\\.easy-search\\.co)|(Easy_Search_gFyxFnsAsY@www\\.easy-search\\.co)|(Easy_Search_Online_8d5692e3bf9af4e8d0fcb27b753b4bb0@www\\.easysearchonline\\.co)|(Easy_Search_Online_YJpastaXEE@www\\.easysearchonline\\.co)|(Easy_Search_Pro_edc3f4614998d63f6bddb8cddf1eca75@www\\.easysearchpro\\.co)|(Easy_Search_Pro_JDFkWEUATn@www\\.easysearchpro\\.co)|(Easy_Weather_Checker_b96bc45b78e94fcc92bbf66eabb4c7e0@www\\.easyweatherchecker\\.com)|(Easy_Weather_Checker_OZbmtCpDgx@www\\.easyweatherchecker\\.com)|(Easy_Weather_Forecast_6b2ee7704b4f8f93b4e4c42c707dadc1@www\\.easyweatherforecast\\.com)|(Easy_Weather_Forecast_pNIPnyHOJG@www\\.easyweatherforecast\\.com)|(EasyMailLogin\\.net_usETGyzdRX@www\\.easymaillogin\\.net)|(EasyOnlineRecipe\\.co_CVOjgBfTWs@www\\.easyonlinerecipe\\.co)|(EasyOnlineRecipe\\.net_icOMrzwKiN@www\\.easyonlinerecipe\\.net)|(EasySearchGo_JMJgGKKsKw@www\\.easysearchgo\\.com)|(Email_Access_7ad642481026e05b4ff4a7da92468bdb@www\\.accessmymails\\.co)|(Email_Access_JVuQrQxsXR@www\\.accessmymails\\.co)|(Email_Checker_MguwpDKJMd@www\\.easyemailchecker\\.net)|(Email_Inbox_Now_OVfDpBfbuk@www\\.emailinboxnow\\.com)|(Email_Login_CofCwMXmYY@www\\.easymaillogin\\.net)|(Email_Login_eVRzKHiywW@www\\.easymaillogin\\.net)|(Email_Login_KABgNaGQJZ@www\\.easymaillogin\\.net)|(Email_Login_Pro_80b99340e1bcedf5f0a1f4d1345538e1@www\\.emailloginpro\\.com)|(Email_Login_Pro_SHHHqfDSTO@www\\.emailloginpro\\.com)|(Email_Login_Pro_xvgHLfPbBB@www\\.loginemailpro\\.net)|(Email_Tab_13d31aa17a541c3018f2625a09486686@www\\.emailtab\\.co)|(Email_Tab_ZdbwsMpyuq@www\\.emailtab\\.co)|(Everyday_Astro_clone_bOSsysyaan@www\\.everydayastro\\.co)|(Everyday_Astro_CMqmHgpSTg@www\\.everydayastro\\.co)|(Everyday_Astro_dVNMgQmXws@www\\.everydayastro\\.online)|(Everyday_Astro_NHOKASspnT@www\\.everydayastro\\.online)|(Everyday_Astro_sDIIbCNITP@www\\.everydayastro\\.online)|(Everyday_Astro_xiJdwxnNom@www\\.everydayastro\\.online)|(Everyday_Astro_YGSUqIslKW@www\\.everyday-astro\\.com))$/","prefs":[],"schema":1585145745119,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"21ecfbe4-1255-4f86-b78c-c4fd06a6f197","last_modified":1585158976491},{"guid":"/^((\\{441a1a1f-ba4f-4f2e-ade8-88c2950323a6\\})|(\\{81faa316-ef9f-4fc9-9db8-af17eabc776b\\})|(\\{e2ee901b-44cb-430f-be5e-23ab0291d8f4\\})|(\\{d1e6ace8-9623-4a5d-a94f-81fd289fe834\\})|(\\{0de5c9e4-4488-489a-a130-0e192cc6bb08\\}))$/","prefs":[],"schema":1584906090910,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1624545","why":"This add-on violates Mozilla's add-on policies by redirecting requests without user disclosure or consent.","name":"Add-ons redirecting requests"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9b936d20-0a13-42de-b735-11409c3e4881","last_modified":1585130632165},{"guid":"/^((\\{9263519f-ca57-4178-b743-2553a40a4bf1\\})|(\\{d97223b8-44e5-46c7-8ab5-e1d8986daf44\\})|(\\{0111c475-01e6-42ea-a9b4-27bed9eb6092\\})|(\\{36a4269e-4eef-4538-baea-9dafbf6a8e2f\\})|(\\{2cac0be1-10a2-4a0d-b8c5-787837ea5955\\})|(\\{6072a2a8-f1bc-4c9c-b836-7ac53e3f51e4\\})|(\\{2134e327-8060-441c-ba68-b167b82ff5bc\\})|(\\{a3fbc8be-dac2-4971-b76a-908464cfa0e0\\})|(\\{de3b1909-d4da-45e9-8da5-7d36a30e2fc6\\})|(\\{02328ee7-a82b-4983-a5f7-d0fc353698f0\\})|(\\{28044ca8-8e90-435e-bc63-a757af2fb6be\\})|(\\{63df223d-51cf-4f76-aad8-bbc94c895ed2\\})|(\\{3f4191fa-8f16-47d2-9414-36bfc9e0c2bf\\})|(\\{a0c54bd8-7817-4a40-b657-6dc7d59bd961\\})|(\\{f0b809eb-be22-432f-b26f-b1cadd1755b9\\})|(\\{919fed43-3961-48d9-b0ef-893054f4f6f1\\})|(\\{cd28aa38-d2f1-45a3-96c3-6cfd4702ef51\\})|(\\{829827cd-03be-4fed-af96-dd5997806fb4\\})|(\\{7d932012-b4dd-42cc-8a78-b15ca82d0e61\\})|(\\{ed352072-ddf0-4cb4-9cb6-d8aa3741c2de\\})|(\\{a0ab16af-3384-4dbe-8722-476ce3947873\\})|(\\{23c65153-c21e-430a-a2dc-0793410a870d\\})|(\\{31680d42-c80d-4f8a-86d3-cd4930620369\\})|(\\{f4262989-6de0-4604-918f-663b85fad605\\})|(\\{e341ed12-a703-47fe-b8dd-5948c38070e4\\})|(\\{cd89045b-2e06-46bb-9e34-48e8799e5ef2\\})|(\\{ac296b47-7c03-486f-a1d6-c48b24419749\\})|(\\{5da81d3d-5db1-432a-affc-4a2fe9a70749\\})|(\\{72c1ca96-c05d-46a7-bce1-c507ec3db4ea\\})|(\\{869b5825-e344-4375-839b-085d3c09ab9f\\})|(\\{81ac42f3-3d17-4cff-85af-8b7f89c8826b\\})|(\\{df09f268-3c92-49db-8c31-6a25a6643896\\})|(\\{5f4e63e4-351f-4a21-a8e5-e50dc72b5566\\})|(\\{4479446e-40f3-48af-ab85-7e3bb4468227\\})|(\\{09c8fa16-4eec-4f78-b19d-9b24b1b57e1e\\})|(\\{be37931c-af60-4337-8708-63889f36445d\\})|(\\{71639610-9cc3-47e0-86ed-d5b99eaa41d5\\})|(\\{0432b92a-bfcf-41b9-b5f0-df9629feece1\\})|(\\{83d38ac3-121b-4f28-bf9c-1220bd3c643b\\})|(\\{01166e60-d740-440c-b640-6bf964504b3c\\})|(\\{76ce213c-8e57-4a14-b60a-67a5519bd7a7\\})|(\\{226b0fe6-f80f-48f1-9d8d-0b7a1a04e537\\})|(\\{be981b5e-1d9d-40dc-bd4f-47a7a027611c\\})|(\\{37f8e483-c782-40ed-82e9-36f101b9e41f\\})|(\\{01c9a4a4-06dd-426b-9500-2ea6fe841b88\\})|(\\{7d5e24a1-7bef-4d09-a952-b9519ec00d20\\})|(\\{408a506b-2336-4671-a490-83a1094b4097\\})|(\\{7f8bc48d-1c7c-41a0-8534-54adc079338f\\})|(\\{cf9d96ff-5997-439a-b32b-98214c621eee\\})|(\\{302ef84b-2feb-460e-85ca-f5397a77aa6a\\})|(\\{0c9970a2-6874-483b-a486-2296cfe251c2\\})|(\\{e5bc3951-c837-4c98-9643-3c113fc8cf5e\\})|(\\{93017064-dfd4-425e-a700-353f332ede37\\})|(\\{28092fa3-9c52-4a41-996d-c43e249c5f08\\})|(\\{a893296e-5f54-43f9-a849-f12dcdee2c98\\})|(\\{fc0d55bd-3c50-4139-9409-7df7c1114a9d\\})|(\\{c661c2dc-00f9-4dc1-a9f6-bb2b7e1a4f8d\\})|(\\{419be4e9-c981-478e-baa0-937cf1eea1e8\\})|(\\{449e185a-dd91-4f7b-a23a-bbf6c1ca9435\\})|(\\{1c981c7c-30e0-4ed2-955d-6b370e0a9d19\\})|(\\{9ce2a636-0e49-4b8e-ad17-d0c156c963b0\\})|(\\{a2de96bc-e77f-4805-92c0-95c9a2023c6a\\})|(\\{a42e5d48-6175-49e3-9e40-0188cde9c5c6\\})|(\\{86d98522-5d42-41d5-83c2-fc57f260a3d9\\})|(\\{05a21129-af2a-464c-809f-f2df4addf209\\})|(\\{446122cd-cd92-4d0c-9426-4ee0d28f6dca\\})|(\\{bfd92dfd-b293-4828-90c1-66af2ac688e6\\})|(\\{f9e1ad25-5961-4cc5-8d66-5496c438a125\\})|(\\{8a61507d-dc2f-4507-a9b7-7e33b8cbc31b\\})|(\\{84406197-6d37-437c-8d82-ae624b857355\\})|(\\{11df9391-dba5-4fe2-bd48-37a9182b796d\\})|(\\{e9ccb1f2-a8ba-4346-b43b-0d5582bce414\\})|(\\{79db6c96-d65a-4a64-a892-3d26bd02d2d9\\})|(\\{214cb48a-ce31-4e48-82cf-a55061f1b766\\})|(\\{4c140bc5-c2ad-41c3-a407-749473530904\\})|(\\{c5cf4d08-0a33-4aa3-a40d-d4911bcc1da7\\})|(\\{591d1b73-5eae-47f4-a41f-8081d58d49bf\\})|(\\{f1bce8e4-9936-495b-bf48-52850c7250ab\\})|(\\{7c1df23b-1fd8-42b9-8752-71fff2b979de\\})|(\\{3c27c34f-8775-491a-a1c9-fcb15beb26d3\\})|(\\{ddae89bd-6793-45d8-8ec9-7f4fb7212378\\})|(\\{c488a8f5-ea3d-408d-809e-44e82c06ad9d\\})|(\\{2f8aade6-8717-4277-b8b1-55172d364903\\})|(\\{2eb66f6c-94b3-44f5-9de2-22371236ec99\\})|(\\{216e0bcc-8a23-4069-8b63-d9528b437258\\})|(\\{d14acee6-f32b-4aa3-a802-6616003fc6a8\\})|(\\{b26bf964-7aa6-44f4-a2a9-d55af4b4eec0\\})|(\\{e2139287-2b0d-4f54-b3b1-c9a06c597223\\})|(\\{3f4dea3e-dbfc-428f-a88b-36908c459e20\\})|(\\{92111c8d-0850-4606-904a-783d273a2059\\})|(\\{2aa275f8-fabc-4766-95b2-ecfc73db310b\\})|(\\{f01c3add-dc6d-4f35-a498-6b4279aa2ffa\\}))$/","prefs":[],"schema":1585040894048,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1439702","why":"This malicious add-on claims to be a Firefox \"helper\" or \"updater\" or similar.","name":"FF updater (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"48b14881-5f6b-4e48-afc5-3d9a7fae26a3","last_modified":1585130632161},{"guid":"/^((__TEMPLATE__APPLICATION__@ruta-mapa\\.com)|(application-3@findizer\\.fr)|(application2@allo-pages\\.fr)|(application2@bilan-imc\\.fr)|(application2@lettres\\.net)|(application2@search-maps-finder\\.com)|(application-imcpeso@imc-peso\\.com)|(application-meuimc@meu-imc\\.com)|(application-us2@factorlove)|(application-us@misterdirections)|(application-us@yummmi\\.es)|(application@amiouze\\.fr)|(application@astrolignes\\.com)|(application@blotyn\\.com)|(application@bmi-result\\.com)|(application@bmi-tw\\.com)|(application@calcolo-bmi\\.com)|(application@cartes-itineraires\\.com)|(application@convertisseur\\.pro)|(application@de-findizer\\.fr)|(application@de-super-rezepte\\.com)|(application@dermabeauty\\.fr)|(application@dev\\.squel\\.v2)|(application@eu-my-drivingdirections\\.com)|(application@fr-allo-pages\\.fr)|(application@fr-catizz\\.com)|(application@fr-mr-traduction\\.com)|(application@good-recettes\\.com)|(application@horaires\\.voyage)|(application@imc-calcular\\.com)|(application@imc-peso\\.com)|(application@it-mio-percorso\\.com)|(application@iti-maps\\.fr)|(application@itineraire\\.info)|(application@lbc-search\\.com)|(application@les-pages\\.com)|(application@lovincalculator\\.com)|(application@lovintest\\.com)|(application@masowe\\.com)|(application@matchs\\.direct)|(application@mein-bmi\\.com)|(application@mes-resultats\\.com)|(application@mestaf\\.com)|(application@meu-imc\\.com)|(application@mon-calcul-imc\\.fr)|(application@mon-juste-poids\\.com)|(application@mon-trajet\\.com)|(application@my-drivingdirections\\.com)|(application@people-show\\.com)|(application@plans-reduc\\.fr)|(application@point-meteo\\.fr)|(application@poulixo\\.com)|(application@quipage\\.fr)|(application@quizdeamor\\.com)|(application@quizdoamor\\.com)|(application@quotient-retraite\\.fr)|(application@recettes\\.net)|(application@routenplaner-karten\\.com)|(application@ruta-mapa\\.com)|(application@satellite\\.dev\\.squel\\.v2)|(application@search-bilan-imc\\.fr)|(application@search-maps-finder\\.com)|(application@slimness\\.fr)|(application@start-bmi\\.com)|(application@tests-moi\\.com)|(application@tousmesjeux\\.fr)|(application@toutlannuaire\\.fr)|(application@tuto-diy\\.com)|(application@ubersetzung-app\\.com)|(application@uk-cookyummy\\.com)|(application@uk-howlogin\\.me)|(application@uk-myloap\\.com)|(application@voyagevoyage\\.co)|(application@wikimot\\.fr)|(application@www\\.plans-reduc\\.fr)|(application@yummmi\\.es)|(application@yummmies\\.be)|(application@yummmies\\.ch)|(application@yummmies\\.fr)|(application@yummmies\\.lu)|(application@zikplay\\.fr)|(applicationY@search-maps-finder\\.com)|(cmesapps@findizer\\.fr)|(findizer-shopping@jetpack)|(\\{8aaebb36-1488-4022-b7ec-29b790d12c17\\}))$/","prefs":[],"schema":1585060581210,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1452648","why":"Those add-ons do not provide a real functionality for users, other than silently tracking browsing behavior.","name":"Tracking Add-ons (harmful)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"36f97298-8bef-4372-a548-eb829413bee9","last_modified":1585130632157},{"guid":"firefox@browser-addon.xyz","prefs":[],"schema":1584609109987,"details":{"bug":"https://bugzilla.mozilla.org/","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Adblock Premium"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eafece33-b993-443e-b944-8bcefb4389ec","last_modified":1584737928024},{"guid":"/^((\\{bb5254c6-92a2-4361-b000-816bc4d34c55\\})|(\\{2fb3aa6a-4ab8-4071-a0f9-379100ac95a2\\})|(\\{0cd3acae-0589-41e3-9525-61786e493188\\})|(\\{3f259f0b-ad11-48c5-a7c4-a5a0897a6d1c\\})|(\\{02b6b8e0-f3b6-4f0a-8055-2baf79c606c1\\})|(\\{9419fd2e-894c-4aa8-aa14-18b5982c5889\\})|(\\{7d0d82e8-308b-4039-b3df-577b41483946\\}))$/","prefs":[],"schema":1584447915622,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1623342","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-os collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b107267-ee8d-4ecf-b7d5-64966911681d","last_modified":1584609109587},{"guid":"/^((\\{e3d1040d-ea1e-4337-b51b-9f353817184f\\})|(\\{205c14a6-8b6f-49ef-b0d6-41bad99ad5e8\\})|(\\{08ac7dd2-8595-4966-a00b-1ef6a5bdb6f3\\})|(\\{8e937b56-4242-4cb5-b92a-f64452da816e\\})|(\\{9a1ded7e-5fe2-43ad-90a6-3732ceae3d08\\})|(\\{b384b75c-c978-4c4d-b3cf-62a82d8f8fff\\})|(\\{6133a4ea-818f-4e22-bbde-0437d80142bf\\})|(\\{aaf2b501-9d4f-4966-be95-0334bd16b291\\}))$/","prefs":[],"schema":1584542165088,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1623343","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1dd9652a-c6cf-4cb0-b6f7-7bea8990b4fb","last_modified":1584609109583},{"guid":"/^((\\{cde82615-f0be-9aff-872d-31da1bc93923\\})|(\\{85a8a08c-52a8-7d1d-5b80-f1b5cd4751bf\\})|(\\{3d1468f8-abbd-4a7a-95f1-fa5a1201adb4\\})|(\\{386056fc-2697-4a54-bd35-02de8d62fe1b\\})|(\\{1ae2bde0-f2ea-4bf1-a075-08853f9fcf31\\})|(\\{382056fc-2627-2a54-bd25-02de1d62fe1b\\})|(\\{926abf23-d2b0-4142-9aaa-5338b33a0000\\})|(\\{ffedd9c9-45b9-4e11-bbf0-a1408fa0975d\\})|(\\{b35ef07a-7c1b-4b6a-b7aa-de1e918396cb\\}))$/","prefs":[],"schema":1584542307136,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1623345","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5c8fccf9-b1bb-41f0-bdc3-3a5790fdd4be","last_modified":1584609109580},{"guid":"{4e820bcf-688e-4b4e-8773-3861dad6a7e0}","prefs":[],"schema":1584387693606,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1623047","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d65d4593-d2bb-41ab-b485-9818bc6f285f","last_modified":1584447915216},{"guid":"/^((\\{c89232c3-39bb-41e5-a197-7f4412b45fe6\\})|(oniria@valid-install\\.com))$/","prefs":[],"schema":1583964274652,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621940","why":"This add-on violates Mozilla's add-on policies by collecting search data going to a third party provider or collecting search data without user disclosure or consent.","name":"Add-ons violating policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6d431a97-5d54-4de7-a012-5b030c5324eb","last_modified":1584054334501},{"guid":"/^((\\{93475144-dae7-452c-a9e4-ef9da092517d\\})|(\\{cfc5bfc9-3dc0-483d-8dc8-27d05f6cff30\\})|(\\{498bc33d-979f-4d5d-93e4-ba608752ad10\\}))$/","prefs":[],"schema":1583875388267,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621571","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"965435ff-2bb1-4b17-9e0b-b157d5c53a91","last_modified":1583964274232},{"guid":"/^((\\{eb5bd821-bb2c-4968-bf17-8e9336fbdfc4\\})|(\\{84be56c9-16ae-4bde-a556-0b9f7946c1be\\}))$/","prefs":[],"schema":1583914825954,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621578","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dc0fc5f1-511f-4fc3-9558-fc7d9fa61e75","last_modified":1583964274228},{"guid":"{dcfd7c5e-ca9e-461f-a748-74f187332e5f}","prefs":[],"schema":1583788354663,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621247","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Emoji Library (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"320f94ad-5e02-4209-a066-22f415100d06","last_modified":1583875387847},{"guid":"/^((\\{d8e66734-06c1-44f4-968e-9af179ca3fcb\\})|(\\{3e836ac4-d85f-4e8b-8647-6e922b3b2b2a\\})|(\\{71d690cd-dff7-4d28-9cfb-d92bd6522d1f\\})|(\\{f20a4998-3973-4094-b61b-cbaeff99ff84\\}))$/","prefs":[],"schema":1583757249813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1620356","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d10ec091-688b-4906-9ed1-42aedc998e1e","last_modified":1583788354268},{"guid":"/^((\\{8890a066-99e3-417d-96b6-f71db4f5fec0\\})|(\\{49f9bb4f-f470-48e7-a04e-25baa35209d4\\})|(\\{38799169-e35a-4034-8e62-8d82ae8b8a85\\})|(\\{a67a2dc1-081e-4efb-aa62-5dc7f499fe86\\}))$/","prefs":[],"schema":1583759516487,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1620970","why":"This add-on violates Mozilla's add-on policies by loading remote content into the new tab page.","name":"Add-ons using remote new tab pages"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d4568b40-4efd-4cca-9680-ba50dea36ec9","last_modified":1583788354265},{"guid":"/^((\\{16004b4c-8fcd-43e8-8867-233023c6fdeb\\})|(\\{79fa9c23-e61f-4434-8b27-0bd44c37edff\\})|(\\{15d5bc6f-15f8-4d0d-9483-7dbbcf722c56\\}))$/","prefs":[],"schema":1583759652565,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1620971","why":"This add-on violates Mozilla's add.on policies by collecting searches to 3rd party providers.","name":"Add-ons collecting search terms"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a1caad16-4ec4-43ca-a145-04fbd5fd81c9","last_modified":1583788354262},{"guid":"/^((test@WhatsMySpeed)|(ext@630e3b49-decc-4d5e-8a9e-242df04e8ba1)|(ext@6bbf8f72-c54d-4731-b455-e164685c5914)|(sp@FindingFormsPro)|(sp@EmailAccessHere)|(sp@WatchTelevision)|(sp@WatchTVOnline)|(sp@QuickEmailAccess)|(sp@QuickNEasyRecipes)|(sp@MyFlightFinder)|(sp@BreakingNewsPlus)|(sp@WeatherDiscover)|(sp@MyRecipeFinder)|(sp@AppDiscoveryTools)|(sp@FileConversionNow)|(sp@TemplatesHere)|(sp@SpeedCheckerPlus)|(sp@MapsNDirectionHub)|(sp@FormsHere)|(sp@ConvertPDFHub)|(sp@ProPDFConverters)|(sp@DLOfficeTools)|(sp@MapNDirectionHub)|(sp@GamerHubPro)|(sp@MyLoginHub)|(sp@LocalForecast)|(sp@GoGamesHub)|(sp@LiveRadioPro)|(sp@MyOnlineCoupons)|(sp@TrackYourPackages)|(sp@MapsProHub)|(sp@ShipmentTrackers)|(sp@ConvertPDFTo)|(sp@EmailProHub)|(sp@FreeConverterHub)|(sp@AccessFreeTemplates)|(sp@ViewOnlineRecipes)|(sp@MySweeps)|(sp@SatelliteandEarthMaps)|(sp@SatelliteandEarthMap)|(sp@PackageTrackingOnline)|(sp@DirectionsandMapsNow)|(sp@ClassifiedsListApp)|(sp@MyHoroscope)|(sp@meinemailzentrum)|(web@meinemailzentrum)|(web@meinemailzentrum\\.com)|(sp@MyVideoConverter)|(sp@EasyClassifieds)|(sp@WatchSportsHere))$/","prefs":[],"schema":1583766889752,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618984","why":"The add-ons violate our no surprises policy","name":"Various add-ons violating no surprises"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"076d3556-68cb-4a5d-83cc-e4cca29d3f48","last_modified":1583788354259},{"guid":"/^((\\{deb55b0e-7064-4552-955c-15ba6a46ad79\\})|(\\{15d967ca-cb54-444c-a7ad-b0dad1dbb723\\})|(\\{7953fef3-37b3-4954-a0e0-806cbec35a63\\})|(\\{2deadd5b-1edc-4634-b342-4e20ad03fd2d\\})|(\\{f74e5fe2-4f8a-489a-8f75-f965a9d4a98d\\})|(\\{0df2d5d8-b197-4022-ad3f-c24a44e9d23f\\})|(\\{e972a079-8e0f-4426-91e9-2c1cf9c8b89e\\})|(\\{d9ce0e4f-e41e-4160-b58e-b99300fa5d83\\})|(\\{43473acc-f92a-445c-9ce3-efc297fb62d0\\})|(\\{5b86a98e-5ce8-4664-9051-3d8f7127d1c5\\})|(\\{5f1e99d2-147f-48bc-aa87-41ed02d65965\\})|(\\{ffd007b3-c085-4bcb-9629-19a528f346ba\\})|(\\{df4e0189-a17d-41aa-af86-b6de65952842\\})|(\\{06880fd6-ffaa-4c77-a5bb-97dcd0ce554b\\})|(\\{f4e654cc-7ee1-401d-ac52-ced86f38e575\\})|(\\{d207c7e2-8a92-4f8e-807d-027fa2eed42b\\})|(\\{8d9fbceb-756f-417a-a691-de9a2c1c5648\\})|(\\{3602c279-d63c-4f81-b832-ef82fda60514\\})|(\\{2f27430f-99b9-4594-83ae-60a4df917e38\\})|(\\{be81f239-4a22-4b02-8878-358a3dcd6539\\})|(\\{e7c3277a-c312-4072-837a-4417aae7269a\\})|(\\{d5783778-d85e-4768-9b91-16b9068df780\\})|(\\{8c6f409e-f740-4807-9a28-c898266c518c\\})|(\\{9b1a4630-5873-4b3c-bcf2-4b4d59cc9739\\})|(\\{8522aad0-47c1-47e6-afbc-1e53a113bb2d\\})|(\\{d0e1738e-e2ce-4e75-bcdf-fdef4c0b7403\\})|(\\{4ac16c6e-ff72-45b2-b641-bf92144e1118\\})|(\\{e9c99267-487c-4fcc-9585-4a8e08d4342d\\})|(\\{0fdf70d2-0dbd-4ead-b746-9cbf4cacac6c\\})|(\\{0393ecde-cfd9-4a72-aa9d-6b64949b890c\\})|(\\{e80bc052-25fe-40ea-813a-dc98dffc2a77\\})|(\\{bfbe94d8-3389-4e4b-8cad-67eedd3bfa08\\})|(9\\.1\\.2\\.1@qamypersonalzodiac\\.xyz)|(9\\.1\\.2\\.1@qafungamesnetwork\\.xyz)|(9\\.1\\.3\\.1@qafungamesnetwork\\.xyz)|(\\{1985b6a7-5f69-484d-b462-667392e9ceae\\})|(\\{0d802f03-a2bf-433b-8124-7a2126bc53d9\\})|(\\{4c7d34ec-3bae-40ab-8300-38136f1bbcaf\\})|(\\{f0a11d18-866f-475d-8804-93d16729e59b\\}))$/","prefs":[],"schema":1583769750285,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621039","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e3a700b8-0177-4b11-bf7a-ae7c97e5115b","last_modified":1583788354256},{"guid":"{2abaf8da-5ca6-4896-8bf4-33cced7d1eec}","prefs":[],"schema":1583770759014,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621043","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Pluto TV"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6b7c877c-cf5b-478c-bc1a-d1a4f17f5599","last_modified":1583788354253},{"guid":"/^((\\{cf7362f7-d34e-423d-ade0-ff408145d75d\\})|(\\{225a2fd0-2266-4bbf-b1db-b4cd7ee3b774\\})|(\\{89ac12b3-2da6-423f-afdd-a755925070d9\\})|(\\{3c56ddf2-a46b-4338-9dc4-bf79a6947838\\})|(\\{4aec95dd-4720-4b7b-9032-c53c71c69531\\})|(\\{19efb4dd-72e6-4e76-9814-9185f0cebe1a\\})|(\\{a73d9f4d-dff4-47ff-ad33-1747dc74faf8\\})|(\\{58c16ee9-4ac8-466c-b8ac-5d8b019945f3\\})|(\\{a88f8f80-e2f4-4357-9f85-d49fcc22662e\\})|(\\{a623f590-df10-4f74-a281-27457212e744\\})|(\\{14df2d69-1ca8-4e68-8289-23816420eebe\\})|(\\{7789cecb-ccd2-4a7f-a75b-8d0243ab68b8\\})|(\\{0e2b182e-05c6-4830-9d20-b402c5598e55\\})|(\\{fd03573a-9361-4f90-9c60-be6013ebfb8e\\})|(\\{5ae01022-7989-4620-b46e-7ba5859e20d3\\})|(\\{d3ced839-59e1-4389-8631-a9f153187990\\})|(\\{07d66467-bc14-433c-84d7-905e8d2f550f\\})|(\\{3019ef01-bffd-45cf-8cd1-46f6c56cdda4\\})|(\\{1f0c9873-0598-4132-b20a-f0ab42c5c8a3\\})|(\\{b955bec7-392d-4074-bac8-60c6d1f402f5\\})|(\\{9f45dcf0-549e-4f15-a0ad-99ac2821fd8d\\})|(\\{16d5d1cf-0aef-4adf-99ce-214eb32d38fa\\})|(\\{b38602ca-4ac6-40b1-b20c-55828f514b3d\\})|(\\{55318007-10db-4d47-b4df-3946ed3653af\\})|(\\{cd2d96b3-e8ec-4ef9-95ba-72ee0dae011a\\})|(\\{b8250196-9419-4b06-9634-48f6c3570b53\\})|(\\{2a738b9e-5147-4441-91cd-e40a1ef50a27\\})|(\\{777580ee-50ee-4c37-98a9-844111149404\\})|(\\{a44f69d9-9c70-4b33-9502-b19e79399e3c\\})|(\\{2e6daca8-d5b4-4611-bd81-b964ab97bee8\\})|(\\{6fda5ac5-a41f-4905-a5c0-860313ab535b\\})|(\\{d51b14e2-4c5f-4601-b2b6-af8b572171cc\\})|(\\{dc5b9553-f925-43c5-936a-fd9ff0e56e47\\})|(\\{b0d8908e-ac38-473b-b20f-3a8d775c23f9\\})|(\\{d96abf04-438b-45a6-b6ec-3036124b5458\\})|(\\{469003fe-c00d-45db-82b7-c04635c227e9\\})|(\\{7d04eb8b-023a-4966-b6b9-06c706081d74\\})|(\\{41987721-6948-46f5-9e68-bcaf776e35ea\\})|(\\{127f13e3-f58a-44f6-bff8-955dd3688448\\})|(\\{09c02fc4-4a23-43c4-b1ad-854a3e1e6a29\\})|(\\{d061e0a3-7554-4a78-b7cf-e3f57df09b00\\})|(\\{28e445aa-892e-42e3-a0f1-30ab0ebba44c\\})|(\\{bc158e4c-6514-4b0e-9da4-6018326fe634\\})|(\\{fde60598-cfe6-4e9c-9f7a-28ea348a7f09\\})|(\\{a7addae9-82ab-4d91-a2b9-be373207bd9b\\})|(\\{71cc8c13-7aab-49d4-a419-b6e2880daaf0\\})|(\\{9a43f082-11c5-4062-bbad-04b63e6ed433\\})|(\\{19cdad5d-2a97-46b4-ba28-3a191d18b174\\})|(\\{99ee7e8c-61c2-4ffc-8f7a-c70c0bd4f1f9\\})|(\\{47706cc2-917e-4a2d-aba1-ee5c05613e0d\\})|(\\{a1a40297-cfac-455a-ad94-ef20eda2672a\\})|(\\{d807c94c-fbd3-48b7-9c07-a54336ace9f3\\})|(\\{0645230a-9e65-4a9d-ae90-97416f33f29d\\})|(\\{064d021b-9424-4700-b550-80c7a983c240\\})|(\\{59722380-31f0-4588-ac19-670f021cd67b\\})|(\\{0f504621-b4e1-4d5b-89dc-b57399b10c29\\})|(\\{ba135229-de15-41d9-8a35-fd198698fda4\\})|(\\{2117ec43-2df6-4bf2-a468-f067ea721432\\})|(\\{fd3fa8d5-be30-4e57-ba9e-ad11d0f70c41\\})|(\\{cb8e0410-17e0-4866-8075-b3224d52ea6b\\})|(\\{dff54861-9936-440e-94a0-92d39794be5c\\})|(\\{72c03815-0ef1-427f-b577-9c73bd19a7ca\\})|(\\{f13a447c-857b-4d93-a5cd-cb2578ede3d9\\})|(\\{8717ef97-76f5-4729-8a94-1ce396c0d2e9\\})|(\\{5e192df0-d31d-42b7-b866-155068118d2a\\})|(\\{d9238c4c-4259-4c0a-92c5-d03006959c1b\\})|(\\{95716b5d-ce17-4a97-9691-40f62291649e\\})|(\\{a0f9afee-bc26-4fa9-a1df-c705ad21cc94\\})|(\\{8f02a7c1-c6a1-4d3c-923a-59bd7e373205\\})|(\\{2452d750-d1dd-4cef-be51-3cc75f7a62d7\\})|(\\{e077a5e8-62c9-41a6-8427-10445a3d7818\\})|(\\{1685d632-1737-4bae-83a4-b0df6541f187\\}))$/","prefs":[],"schema":1583005290759,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618688","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons violating multiple policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"41a53d4b-120a-4ab0-9dbc-8a8d3802b734","last_modified":1583233056644},{"guid":"/^((jid1-h7qSFwT2a1FJOp@jetpack)|(jid1-w4wG5nJhx4LJZr@jetpack)|(\\{74b0af75-8791-44e2-95a6-7f0ab94143ec\\}))$/","prefs":[],"schema":1582980182934,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1619067","why":"This add-on violates Mozilla's add-on policies by adding abusive content to websites.","name":"Add-ons including abusive functionality"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"0.1.7","minVersion":"0.1.6"}],"id":"c4c0b595-6481-42a6-9e94-998b808dd143","last_modified":1582981347968},{"guid":"monstercropper@gmail","prefs":[],"schema":1582726441204,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618273","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Extensions Manager (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4c706648-260d-42c3-8461-3ddcf9db11f9","last_modified":1582916527189},{"guid":"{df73c71d-e4b6-46e1-a853-9831ad860a7b}","prefs":[],"schema":1582752497018,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618518","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Dark Theme (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"59f951ab-6183-4ae8-9ed0-99b667fa2a86","last_modified":1582916527186},{"guid":"/^((\\{fa59fb58-b15e-4dec-a9e4-145fbdaa2f03\\})|(somethingadguard@ok)|(somethingsmartadblock@ok)|(somethingublockorigin@ok)|(somethingadblockpro@ok)|(somethingadblocker@ok)|(somethingadblockerforyoutube@ok)|(somethingadblockerlite@ok)|(somethingfacebookadblock@ok)|(somethinghostadblocker@ok)|(somethingnanoadblocker@ok)|(somethingublockmobile@ok)|(somethingurbanfreeadblocker@ok)|(somethingwebmailadblocker@ok)|(somethingyoutubeadblock@ok)|(somethingyoutubeadscleaner@ok)|(somethingyoutubevideoadblocker@ok)|(\\{d3360051-c575-4f6e-938e-ac3bd4598573\\})|(\\{e16f9fba-1ccc-4b59-b52b-69c452bddfd1\\})|(somethingadblockforfirefox@ok)|(\\{b707de34-1ebb-40e3-b44c-d46a2d10443f\\})|(somethingadblockforyoutubeyoutubeadblocker@ok)|(somethingadblockplus@ok)|(\\{4fead186-a35f-41b4-b794-6c90e6f8886b\\})|(somethingadblockerultimate@ok)|(somethingadblockerx@ok)|(somethingfacebookadblocker@ok)|(somethinggmailadblock@ok)|(somethingpandaadblock@ok)|(somethingyoutubeadblocker@ok)|(somethingmublock@ok)|(\\{b49fea32-c666-4259-98bc-50348f3909c5\\})|(somethingdudenmentortextprufung@ok)|(somethingemaillanguageproofreadingandgrammar@ok)|(somethinggrammalectefr@ok)|(somethinggrammarandspellcheckerlanguagetool@ok)|(somethinggrammarcom@ok)|(somethinggrammarlyforfirefox@ok)|(somethinggrammarlytomarkdown@ok)|(somethinggrammarnazimkd@ok)|(somethingjacindaspellchecker@ok)|(somethinglinguixcom@ok)|(somethingmaxigramar@ok)|(somethingngspellingandgrammarchecker@ok)|(somethingpruuf@ok)|(somethingspellcheckanywhere@ok)|(somethingthaispellchecker@ok)|(somethingwordeepproofreading@ok)|(somethingwordy@ok)|(\\{8097be72-4409-4b72-809c-062d67ec1a9e\\})|(something1passwordx@ok)|(somethingapricofreepasswordmanager@ok)|(somethingavirapasswordmanager@ok)|(somethingbitwarden@ok)|(somethingbondarpass@ok)|(somethingbrowserpass@ok)|(somethingclearlogin@ok)|(somethingcpmautofill@ok)|(somethingcyclonis@ok)|(somethingdatavault@ok)|(somethingelpass@ok)|(somethingethernom@ok)|(somethinggpass@ok)|(somethinghakopasswordmanager@ok)|(somethingheroauth@ok)|(somethingid50@ok)|(somethingikeyvaultdev@ok)|(somethingintuitivepassword@ok)|(somethingkeepasswordmanager@ok)|(somethingkeepasstuskpasswordaccess@ok)|(somethingkeepasshelperpasswordmanager@ok)|(somethingkeepasshttpconnector@ok)|(somethingkeepassxcbrowser@ok)|(somethingkeeperpassword@ok)|(somethingkeycatopensource@ok)|(somethingkeydepot@ok)|(somethingkeywi@ok)|(somethinglastpass@ok)|(somethinglesspass@ok)|(somethingmanageengine@ok)|(somethingmasterpassword@ok)|(somethingmaxaccessmanagement@ok)|(somethingmonapassword@ok)|(somethingmyki@ok)|(somethingnextcloudpasswordsclient@ok)|(somethingnordpasspasswordmanager@ok)|(somethingnortonpassword@ok)|(somethingonetouchprotect@ok)|(somethingpassb@ok)|(somethingpassbolt@ok)|(somethingpasscamp@ok)|(somethingpasscell@ok)|(somethingpasscodepro@ok)|(somethingpassff@ok)|(somethingpassfort@ok)|(somethingpassman@ok)|(somethingpasswordcrypt@ok)|(somethingpassworddepotaddon@ok)|(somethingpasswordconfidential@ok)|(somethingpasswordstate@ok)|(somethingpersipass@ok)|(somethingpersonaforfirefox@ok)|(somethingpfppainfreepasswords@ok)|(somethingphashword@ok)|(somethingpsonofree@ok)|(somethingpwdmgr@ok)|(somethingroboformpasswordmanager@ok)|(somethingsafeincloudpasswordmanager@ok)|(somethingsafelypasswordmanager@ok)|(somethingsavemypassword@ok)|(somethingsecurden@ok)|(somethingsteganospasswordmanager@ok)|(somethingstickypasswordmanager@ok)|(somethingsubsfreepasswordmanager@ok)|(somethingmteasierpass@ok)|(somethingtrustloginidaas@ok)|(somethingtweakpassfreepasswordmanager@ok)|(somethinguniqkeysecurepasswordmanager@ok)|(somethingvivokeyvault@ok)|(somethingwebsphinx@ok)|(somethingwebvault@ok)|(somethingxtambroker@ok)|(somethingxton@ok)|(somethingyotipasswordmanager@ok)|(somethingzohovault@ok))$/","prefs":[],"schema":1582832492598,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618810","why":"This add-on violates Mozilla's add-on policies by using a deceptive name and/or injecting remote code.","name":"Deceptive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c21543e2-3f39-4ac9-b39e-6a2a18249351","last_modified":1582916527183},{"guid":"/^((\\{0aa583da-e323-42f2-b4d2-0bc61b493171\\})|(\\{20a15a74-371f-5098-a362-bd127db4f8bc\\})|(\\{c11016db-e96e-4eb7-bc19-7121d96d0e2f\\})|(\\{0fadbf07-bb25-4737-9800-b879a6e1c417\\})|(\\{e7fefcf3-b39c-4f17-5215-ebfe120a7031\\})|(\\{f85238e5-862b-45aa-9d66-0ab56a032375\\})|(\\{ea3f3dc3-6fbc-450d-9120-07b3b03cd9ec\\})|(\\{aa909324-7520-4dcd-9eb0-9f0a9ec3c003\\})|(\\{807833d9-8ea7-42f8-a8a4-46ff7519dd8b\\})|(\\{92047279-0910-4abb-beb7-a7f2cd6cf04b\\})|(\\{94036cd5-1829-4480-ab0b-e2455deafb9c\\})|(\\{05d0e324-7d90-3e2d-2eb0-6f1a9ec3c003\\})|(\\{abd0e324-7120-3dcd-3eb0-9f1a9ec3c003\\})|(\\{578e48b0-7c9b-4890-91ff-f6ce3e958edb\\})|(\\{0aa583da-e323-42f2-b4d2-0bc61b493183\\})|(\\{72d08da8-8277-47f0-8bee-ba5ad40dda6c\\})|(\\{9fd0e085-1545-13de-a831-ab9a05dcf253\\})|(\\{ced9def2-2d86-4a1b-a9eb-29e2f3c9eb48\\})|(\\{364f2138-c271-47a3-9ddc-466c4a27feef\\}))$/","prefs":[],"schema":1582891948231,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618814","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ae0ffe5f-a7a2-48ec-9b01-2c0c9d3eb2e8","last_modified":1582916527180},{"guid":"/^((o-o-0-o-o@codobir)|(o-o-0-o-oSearchBar@codobir)|(o-o-0-o-oAdBlocker@codobir)|(\\{93e2581c-ec13-4be8-bb22-d2544356fca7\\})|(\\{7582f270-d0ea-4f78-a1fe-851def5d06d0\\})|(\\{089fbef0-49fc-4237-ba6c-2604af7a6e18\\})|(\\{7f897f01-98aa-4e5b-b40d-dbdd7c968b8b\\})|(\\{5f6ae810-5186-466b-b7d6-29ab4355e3dc\\})|(\\{02dc7465-0eaf-44ef-999f-9dad3f9502ed\\})|(\\{0135039f-a362-4296-9c30-e8626bb484d4\\})|(\\{8775e445-b777-451b-8d4a-dd10985bf95c\\})|(\\{a244077a-0017-472a-b1af-8f0b4a167a3a\\})|(\\{ebcf3de2-902e-4690-a35a-d6160175639d\\})|(\\{209a92d8-da4f-4342-81b7-ed2b92863cbe\\})|(\\{a2cd102f-34e4-4ef8-87e9-b1d642b6716d\\})|(\\{6382c930-913c-4bfb-a82d-f098cf3e84e8\\})|(\\{323aca10-65de-4392-8ea2-591642470c58\\})|(\\{70508e0e-9f91-4bad-853f-cd76764a5a5a\\})|(\\{b673c390-83d1-43d7-b0e3-a7a2c79b23a4\\})|(\\{b74e188a-c975-4725-a6a7-53fe0645d424\\})|(\\{46ed97fb-8411-4e04-9332-0c89ea8cfbfd\\})|(\\{2b484d2d-5b4b-411d-b8bb-bc3e7d9672bc\\})|(\\{6e707a00-b889-4b91-8cf9-19674f09d849\\})|(\\{f24e3561-ecb6-4539-b9cb-95af4624811d\\})|(\\{46f41d8d-4bb0-4549-86e7-34c09c65b5fd\\})|(\\{99a15fc0-dcf0-4669-a895-664f286c6a88\\})|(\\{0585f5cb-8f50-4e76-82e2-75a0cf852d35\\})|(\\{783f9072-d29c-4567-93f9-ca424cd71fcb\\})|(\\{05d62c84-a9f1-401c-85f8-a657e6a85940\\})|(\\{8c44b1c4-364a-431c-98ec-9c7a88b8fef1\\})|(\\{44da520a-6bd8-40bd-8992-87ab3f866cad\\})|(\\{4dc3d7a3-58bc-4ace-ac3e-2776377595e1\\})|(\\{5cd1ffd4-2899-4b2c-a226-453c85d957c1\\})|(\\{74c7755a-16dd-4cf8-b407-20c47cb4b78e\\})|(\\{865fc230-1a34-4c95-a718-a53276d77a02\\})|(\\{a233e339-2ae5-4d5a-ad1e-d82db722a85d\\})|(\\{23e06ed5-bb15-4cd9-828f-df483e65e1f5\\})|(\\{840e5e73-880e-45dd-a2d0-fbefd09f368f\\})|(\\{dcc9f6a8-5306-4662-a2d5-9da72e9e6641\\})|(\\{a7714acb-7a85-472c-97e7-3310eb47fbc2\\})|(\\{88aeeecb-1924-4c1f-aa22-9d43e8757004\\})|(\\{55295427-ab86-40e0-a56e-f913aba2ae8d\\})|(\\{b80386b3-c4ae-426a-b755-e38999447aff\\})|(\\{71a36a35-73cf-4d33-8f9e-3e1b1f838f2a\\})|(\\{504212ab-b2e3-4157-a36a-b02bca78e727\\})|(\\{c4a86ea8-34d1-4a72-aeff-8b227a52f562\\})|(\\{c1413369-3202-4ec7-873a-23dc5715e180\\})|(\\{97ea8e7f-a2f9-4009-95bc-d9f8be5405dc\\})|(\\{76c146d0-ad1a-4457-979a-a0b84a7ca86d\\})|(\\{ea6a2984-78b8-473f-9850-f3406a8c2b79\\})|(\\{b005573e-35ca-4c55-a87a-25cb53ff526e\\})|(\\{00a73039-4695-4559-820e-e17b5fb5ccac\\})|(\\{fc05507e-2482-4928-b943-a7a6ad59d166\\})|(\\{e8cb2def-d6ab-435c-b2f0-af701a40350a\\})|(\\{524b9704-5aca-4283-aadb-fba6eead9b92\\})|(\\{7d629677-6ad7-43f1-b182-8734474c3fc7\\})|(\\{0edbf5ac-c258-4c65-af7e-8dffbdf847f5\\})|(\\{c5c906de-c84e-4b48-a738-e8e32546f496\\})|(\\{3a9abaab-8451-4909-978a-bf1d4e716137\\})|(\\{1195cc1e-0cc5-4e48-8b08-7160bdab5511\\})|(\\{3e3217ad-344f-4a2b-97ba-d4380a6d4f91\\})|(\\{ee4a70aa-687c-4176-9392-7e47b5c09afe\\})|(\\{7d1d1676-b23a-4249-9c01-f7f1dbcb18bf\\})|(\\{51e9d221-2349-4764-a4a4-00552369c210\\})|(\\{30b40c71-198b-4b3e-8ff1-569860189be4\\})|(\\{beef68e8-c078-45c0-a593-64a9bfb4b2bc\\})|(\\{6ce76b14-1c76-4774-919d-7a3c820a4d56\\})|(\\{522b149a-3a6f-4bc3-ab7d-1bf41e4c29cb\\})|(\\{17a2d3ca-1505-46aa-836a-85ea62b5b617\\})|(\\{d7b81889-d34f-467a-a690-9507b5d72647\\})|(\\{66463498-8185-4874-9fdf-be281b08df26\\})|(\\{5a144fd3-9e6b-4b3a-ba29-bba7fa187e40\\})|(\\{bb405e27-949e-41e2-9930-26cb8360dc19\\})|(\\{f7a40a38-b3e4-4852-9981-8078ae99374a\\})|(\\{8675dfc9-9953-474f-8b2c-16b1307f66ee\\})|(\\{62d44bdc-60ea-4a78-a738-e59dd50589bc\\})|(\\{a7875dff-b031-4588-9d4a-1f989704ebe5\\})|(\\{3cfd3ce1-f358-48a5-a30b-5cc144d14f38\\})|(\\{9ce2677c-ede7-45be-b281-2e0c9d24fff3\\})|(\\{d13d4d9d-e9ec-4833-948f-a8e2c4bb1ec1\\})|(\\{87d402fc-7bbe-4b48-8c1a-38984a9dff7e\\})|(\\{69b186c0-e619-46b9-a978-b6ac97abd26b\\})|(\\{408bfadf-6f2b-428e-aca7-e4b95037bd72\\})|(\\{2a047ecb-a3cf-4ef5-8420-d45ea9cb246b\\})|(\\{c171fea9-aa8e-4348-8b9a-1b371f4821ea\\})|(\\{4f24b616-1f23-4c60-aadb-2386900b690d\\})|(\\{766d6d39-6592-4f47-bd1f-84639a2e5ad9\\})|(\\{b7caa882-3108-487e-9f69-3f43168789ac\\})|(\\{e96c08ad-1eff-4687-94ed-a14a76c7152c\\})|(\\{cfddeb9b-5339-4df3-af2e-88e26987cb8a\\})|(\\{d558cc36-a306-4288-9888-a68c419b2cf7\\})|(\\{0765615e-cc53-4ed8-9501-8e33b627db77\\})|(\\{0de24de8-5130-43bd-b041-2d284a26b9f0\\})|(\\{114a7625-4642-4013-bf25-9d8c8a1e428c\\})|(\\{d2554ad1-d14c-43b1-9f3f-84ae454748be\\})|(\\{374319ec-ad46-450b-928c-feff04666d58\\})|(\\{f8a572d2-a614-45aa-a8a3-3cb6bdec3388\\})|(\\{d55d0631-bd77-42b3-8ca3-ff5889d69e4d\\})|(\\{4bf71a8f-3f21-4de0-8cc6-12a53df60922\\})|(\\{5787258d-5a12-4153-bd9c-5825c53786a0\\}))$/","prefs":[],"schema":1582892445504,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618862","why":"This add-on violates Mozilla's add-on policies by using a deceptive name, violating Mozilla's No Surprises policy or including non-disclosed monetization","name":"Misleading or deceptive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7c948a9b-2340-4886-b8fc-29ca66c1790f","last_modified":1582916527177},{"guid":"/^((\\{e78b3b45-89ad-4210-9a6b-3150506851e1\\})|(\\{c5874e9e-f46f-4220-b356-476122247a0b\\})|(\\{941c102c-7b8d-40af-9f49-a0496d89b486\\})|(\\{97c53a72-d50f-4e1c-8d26-f0aa8578a4aa\\})|(\\{65d9977d-e895-490e-ac9e-83031d46551f\\})|(\\{6e27edd2-f950-4b69-9a4a-f4941f2b0621\\})|(\\{af4d7096-c51a-4cb6-a30d-d2790fd66325\\})|(\\{b666da6b-b171-465d-ac69-20ea2a8a9971\\})|(\\{8e83ab0b-d34a-49ce-9d64-6394637cd9e4\\})|(\\{763aa5bc-8faf-4103-bad2-d15aab97146d\\})|(\\{40613d6c-a8f9-4a8f-a048-72ca8f1206a5\\})|(\\{865cf362-afee-472d-b2ae-6186e59f8e3c\\})|(\\{6778c1de-8ab3-4ee8-9e3d-788b17060ffa\\})|(\\{a501a160-de33-4c20-96a8-b660fd18db01\\})|(\\{b27d330c-3ac1-4421-9c96-1a5781ee9bff\\})|(\\{3997ee99-bd51-4f18-95b1-3b8a887ea014\\})|(\\{ffb40ecd-2ef3-4dfa-8c69-9a847c853b0e\\})|(\\{061c317b-b050-46a9-a7a5-2f9dfc0ef3c7\\})|(\\{e30d3343-fc0f-4526-8b9a-eebd6b7b1af2\\}))$/","prefs":[],"schema":1582898093853,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618862","why":"This add-on violates Mozilla's add-on policies by using a deceptive name, violating Mozilla's No Surprises policy or including non-disclosed monetization","name":"Misleading or deceptive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7548e625-f059-4976-ab43-de78a1124dd2","last_modified":1582916527173},{"guid":"/^((jid1-C96jkOWH1jEZ5A@jetpack)|(@pdfit)|(@youtube_downloader)|(\\{503b5ae9-dcb1-41c4-9cf8-0c70a5c2bc70\\})|(\\{a9de7157-1c27-45bf-ab59-bedcbf57cff9\\})|(\\{908c4278-9f44-4b59-ad6f-91e2aabc8682\\}))$/","prefs":[],"schema":1582659695507,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618172","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"98dbf563-0a8e-4796-ac48-1be0e4520610","last_modified":1582726440807},{"guid":"{6059d268-eb5b-491c-9879-964e1c67c854}","prefs":[],"schema":1582723099417,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618174","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Second Tab Search (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e15a83e1-60c6-475d-977c-83e180646e6a","last_modified":1582726440804},{"guid":"@searchencrypt","prefs":[],"schema":1582723268591,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618185","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Search Encrypt"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3c782d96-5d25-45d3-8f07-016a791e316c","last_modified":1582726440801},{"guid":"/^((\\{374c327c-fbd0-4769-a378-1cb0fef54b1c\\})|(\\{11d9b7d9-acea-4a66-94ff-3fbbcca15abc\\})|(\\{e9e3ac53-8384-4f2a-a451-78af21417b13\\})|(\\{61539a14-2728-448f-a071-45043287cf10\\})|(\\{9ca7082d-0e18-465e-8588-8d3990c5b9ae\\})|(\\{0444bcb0-66d3-49b1-ac1f-b79f7f682f15\\}))$/","prefs":[],"schema":1582486893083,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617571","why":"This add-on violates Mozilla's add-on policies by intercepting page loads with affiliate urls.","name":"Affiliate add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f8ce5794-a1db-4a63-af32-1750de36a383","last_modified":1582562264396},{"guid":"/^((bazaarhero@jetpack)|(boingdeals@jetpack)|(boingdeals-1@jetpack)|(boingdeals-200@jetpack)|(\\{e9edde2d-5dda-46b5-b6ca-f732d96d941a\\})|(\\{29c11376-f72c-489b-a9eb-8fe309b1623e\\}))$/","prefs":[],"schema":1582548114995,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617577","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1406ee6a-4eab-441d-ad1f-ce09b650ce2d","last_modified":1582562264393},{"guid":"{6ac0938d-7ca6-43ac-9c26-653d37820440}","prefs":[],"schema":1582549126839,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617578","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"414cf401-fbc9-4218-85fe-5880068e8452","last_modified":1582562264389},{"guid":"/^((\\{d551e6af-55af-4295-92f0-ba0e3d15bb00\\})|(\\{36858137-f125-47fc-8e0c-499f161abaf0\\})|(\\{7edb2ea5-61a9-4447-87b2-d37ed4198d1c\\})|(\\{0ea11f50-96b6-4a8b-92f4-1eb6ca77acac\\})|(\\{1449de8a-cdb8-4f65-b909-c6391e49615f\\})|(\\{e7cdc797-edcb-46a0-a66e-f5dab3c808d6\\})|(\\{d57b5f9f-b35d-4879-84a3-3547d44249ec\\})|(\\{d4e41bc4-cb00-42d0-b756-ed8deb827cbc\\})|(\\{083acfab-6228-439a-b796-62647803b216\\})|(\\{ed2df6fc-df45-43ac-a923-bd3fbc3534c2\\})|(\\{ebc63925-e43d-4cc1-b234-4c8b6abc331c\\})|(\\{231652e4-ad9a-4dd7-89b1-d79876c0dca7\\})|(\\{2cb0bdaf-5789-415b-a92d-2adbc695cb63\\})|(\\{429a08cf-84c4-4eae-9ecf-fc6c3a07249c\\})|(\\{ec4fb55e-d94d-4196-9ee6-a6f19e3c9405\\})|(\\{bd55549f-9853-427c-a45d-6aba2b4776d2\\})|(\\{bbfa0b1d-c75b-4483-8331-b5b01c82fe5d\\}))$/","prefs":[],"schema":1582237690303,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617192","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Lusha"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b12eaf8d-77ff-4bd6-8b9f-797af110f86c","last_modified":1582301451440},{"guid":"beeline@beelinereader.com","prefs":[],"schema":1582298543556,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617198","why":"This add-on violates Mozilla's add-on policies by making use of obfuscated code.","name":"Beeline Reader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.10.1","minVersion":"0"}],"id":"42642ca5-9342-4e51-a2ec-b5eed799468f","last_modified":1582301451437},{"guid":"/^((\\{e046e345-918c-4fe8-89a2-0987c5d12636\\})|(adi@fmt-tools\\.com)|(\\{90e41842-755d-40e0-9136-8129df55a64b\\}))$/","prefs":[],"schema":1582296975853,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1605160","why":"These add-ons violate Mozilla's add-on policies by making use of obfuscated code.","name":"Add-ons with obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b96957ff-ca4e-4ec4-97f7-3dbb4ddbc479","last_modified":1582301451434},{"guid":"jid0-G6461UajDjhNAwSukoedlkhD0XA@jetpack","prefs":[],"schema":1582141291510,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616735","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control and by collecting ancillary user data against our policies.","name":"Ratings Preview for YouTube"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dca3181b-35a3-4dd0-9efb-8e7a19fab4d5","last_modified":1582237689888},{"guid":"{e0a905db-294f-4e91-be75-8b5c7c5df90a}","prefs":[],"schema":1582103702651,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1614333","why":"This add-on violates Mozilla's add-on policies by making use of obfuscated code.","name":"Gladiatus Time Saver"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.2.7","minVersion":"0"}],"id":"a98992d1-8a30-406f-944d-c0161d0aaa21","last_modified":1582237689885},{"guid":"bookmark-this@page.xpi","prefs":[],"schema":1581968493407,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616217","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"24b4f43e-106f-44a6-a992-7d07634bb5eb","last_modified":1582103702173},{"guid":"/^((addon@faster\\.com)|(\\{09bfa06b-5e73-4daa-96bd-88092fe71c52\\})|(\\{eb4d44d6-4ad4-4b77-9509-8e6eadaef074\\})|(Blockfbunseenads@addon\\.com)|(Blockfbunseenads0@addon\\.com)|(\\{a8180cdc-19f4-4299-9bb5-5b6b2f2c2de6\\})|(\\{2454bb7d-4cf7-40f3-a5da-40e6889d83fa\\})|(\\{cd6999f9-c84e-47b4-a355-d54bedfe9c17\\})|(\\{53d5a956-eecc-456b-a6ce-b137c511a04d\\})|(\\{9b2dba6e-c179-47ca-bbd8-6b7033c4f2fc\\})|(\\{d77d7463-a323-4b3a-9b96-69b31e4d488e\\}))$/","prefs":[],"schema":1582023416031,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616233","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e9119771-cb28-4853-8aae-72aedfe27b2f","last_modified":1582103702167},{"guid":"/^((\\{6fb37444-4339-4a36-9e4f-c4c47b550c4e\\})|(\\{430b4bcb-4487-471e-82b8-a3056ae137ba\\})|(\\{394990b1-4ede-4bdd-a3fe-58506591f00b\\})|(\\{3ca06113-1cea-4e7a-b775-19666a9c77a2\\})|(\\{deebf5b9-62b8-4b5c-8e1b-8f8d83939441\\})|(\\{15c41cbc-18a2-4756-80a9-418ba03f533d\\}))$/","prefs":[],"schema":1582027274373,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616234","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons injecting remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cc8e1b77-eab1-42d7-9625-bf4153547903","last_modified":1582103702162},{"guid":"/^((\\{9664bedb-6f24-4672-8b72-2565e0b3fc21\\})|(alex\\.todor@gmail\\.com)|(alex1233\\.todor@gmail\\.com)|(alex123333\\.todor@gmail\\.com)|(alex131\\.todor@gmail\\.com)|(alex13\\.todor@gmail\\.com)|(alex12223\\.todor@gmail\\.com)|(alex1214122223\\.todor@gmail\\.com)|(alex1222214123\\.todor@gmail\\.com)|(alex1222214fawfaw123\\.todor@gmail\\.com)|(a\\.todor@gmail\\.com)|(abvcaasgawgaw\\.todor@gmail\\.com)|(abvcaasgawgaw122141\\.todor@gmail\\.com)|(abvcaasgawgaw122fwafaw141\\.todor@gmail\\.com)|(abvcaasgawgaw122fwaaaafaw141\\.todor@gmail\\.com)|(abvcaasgawgaw12aa2fwaaaafaw141\\.todor@gmail\\.com)|(abvc\\.todor@gmail\\.com)|(ateststn@example\\.com)|(abvc1\\.todor@gmail\\.com)|(test@gmail\\.com)|(test1112@gmail\\.com)|(as@test\\.com)|(stagod@test\\.com)|(stagod_qa@test\\.com)|(stagod_as@test\\.com)|(fop@test\\.com)|(\\{e83eb1bf-7847-4253-8108-4c1ec0601757\\})|(\\{3cfa4fd4-a747-4666-b97e-2262f6255eeb\\}))$/","prefs":[],"schema":1582038056642,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616286","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Addons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"32ebf2f0-a321-48fd-a5a4-94a4980f4697","last_modified":1582103702156},{"guid":"/^((\\{04871291-3f6e-4969-a991-4183decfacef\\})|(\\{9493fc95-5a66-445e-9200-c9b617942c05\\})|(\\{a89d4fea-98ea-42bf-aeb7-e14059e809a2\\})|(\\{aabe1376-bc1f-440d-a275-284d026f3058\\})|(\\{b6aefc39-259d-4485-b8fa-c9b2ea77223e\\})|(\\{5ce16faf-66ca-401c-bf43-7c75cf75487e\\})|(\\{dfdf383a-eff4-4ae4-a8b8-97640748e795\\})|(\\{6a563873-967b-4644-afb1-bc3e9da68128\\}))$/","prefs":[],"schema":1581545094971,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1615250","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1c5195a4-afb7-47ef-83c6-7c3c6f5d0ed1","last_modified":1581702872026},{"guid":"/^((something@ok)|(\\{4eefc8e1-086b-43a3-bb21-17c05f43cd3a\\})|(adv@blocker)|(adv\\.3\\.2\\.8@blocker)|(\\{f56e22e4-f6f9-48ca-aca3-480d9b293a16\\})|(\\{b26aabf7-6b17-424f-a71d-e8ca37ccb672\\}))$/","prefs":[],"schema":1581687835975,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1615601","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons injecting remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d5259975-b1c3-4f50-861b-d7b4c082b58a","last_modified":1581702872020},{"guid":"/^((\\{6e27c586-e50c-49b1-9925-5427f3e9f028\\})|(\\{ae6dcbb6-d0a6-494b-bdfc-ea9d7b8f7667\\})|(\\{14aec2a8-0289-43f3-85fb-5d52491a0538\\})|(\\{b541ce5d-e99a-4629-9167-e71ac65bf32f\\}))$/","prefs":[],"schema":1581450092560,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1614884","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ba0f5f7c-8998-49f1-89a8-7f3a15c41cc8","last_modified":1581545094556},{"guid":"/^((\\{0bbf5ce8-0bfb-4589-a4e8-4f1e435389d2\\})|(\\{820847ac-fb62-47a4-a6be-00d863584c76\\})|(\\{703d2caf-edff-4198-baa3-615135f97890\\})|(\\{f459049d-939d-432e-83c7-07ced47e629a\\})|(\\{0d56e009-957a-4575-a984-ecd22ccf3120\\})|(\\{88386103-f99d-4aab-83c2-64106a77748e\\})|(\\{29e30d06-1030-4a82-8e29-25706012da97\\})|(\\{c0d5c1cb-e676-4ff7-8189-793efc86fa2f\\})|(\\{aade33ec-2184-4759-8de5-5d61f1e29e72\\})|(\\{72dc5fd5-179b-40b6-9218-e88434939ed8\\})|(\\{8c9ec486-bd7b-40dd-ab49-1ca3ff452484\\})|(\\{67c0ce2e-2359-44e7-b9d9-1061a3c4a041\\})|(\\{149c0e63-b3f6-4f8d-bb1d-94b7e36d8aea\\})|(\\{c3a1e646-c155-4a40-b5bf-ac9252e6b632\\})|(\\{6876f3d2-97d6-46d6-b9bf-aa46264f6c3c\\})|(\\{330a08b1-d93e-48a2-9081-e93e25190eec\\})|(\\{443305ec-55d7-411c-bb4a-96e83b4e631e\\})|(\\{945964bd-5c29-48e3-9dd6-26741626c1ba\\})|(\\{ec8513c5-2bcc-45b0-ae77-da6685cfafd9\\})|(\\{57703f70-e1b7-462d-bf7e-657bac5eb30c\\})|(\\{8c1d6a6c-3745-429e-8ec5-2a374320e703\\})|(\\{2ff583b8-72a9-40bd-877b-b355ad33ce44\\})|(\\{f2ed910e-ab21-4ad3-a70a-8adca5e683f6\\})|(\\{4ae1f921-575e-4599-8b77-e8e7ab337860\\})|(\\{cfe7c709-6df6-4d54-9f4c-6fc3967904ce\\})|(\\{4e0cceff-558b-4902-9870-55ecb16f78a6\\})|(\\{093726f6-5907-480b-81fc-fafe4f04b5e8\\})|(\\{4a2650e6-fb1b-4e83-b0ad-4e991c9ac01e\\})|(\\{2dcd1f94-6a18-47c3-826a-d8f1044b3ade\\})|(\\{90e61a54-35d6-44c8-bb33-88623e6a03ae\\})|(\\{61389b8e-55eb-43ad-a68d-bebefe7476ad\\})|(\\{f8890846-fcc1-479f-a90b-dce3e486b0ba\\}))$/","prefs":[],"schema":1581438380344,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1614707","why":"This add-on violates Mozilla's add-on policies by collecting search terms or intecepting searches that are going to a third-party search provider.","name":"Add-ons collecting search information"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d33858b8-d192-4be2-a844-b151f0f287ca","last_modified":1581441570691},{"guid":"/^((\\{312951c4-a455-4886-a2f1-e4fb05b9fee7\\})|(traderibis@gmail\\.com))$/","prefs":[],"schema":1581429986729,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613706","why":"The add-on injects remote HTML code not compliant with our policies.","name":"TraderBiS"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"52b9033d-de65-48ad-9062-7c340835feb0","last_modified":1581438379932},{"guid":"/^((\\{ebba9c65-d04c-4c02-afd1-476d7c06fc2f\\})|(\\{117f05e4-3403-4cbe-a041-30fa60054e9f\\})|(\\{03417bad-eb5b-4bd4-89f8-f10d78fce082\\})|(\\{42f0a4e1-710d-4154-b34a-731dbbe2097b\\})|(\\{6a0a9103-3482-4717-aca8-f22ee2228d25\\})|(\\{23d5c4a6-1231-4f87-ebf9-e5800eae221b\\})|(\\{99a32eb1-5da4-4a35-beb6-7c3b5222ce04\\}))$/","prefs":[],"schema":1581277291027,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1614308","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"39473bb3-638d-4b7e-a847-f197e6320564","last_modified":1581340917940},{"guid":"/^((\\{0E64F71A-6B21-4324-A5D9-69231DE8C20C\\})|(\\{747e7f5b-c9Fa-4e4f-b466-639b88c8998f\\})|(\\{8693cb76-1caf-4115-9bd7-6bab02330326\\})|(\\{cf8452e1-0ddb-44d2-95eb-4cb8e7a35707\\})|(\\{79bbada5-9050-4d8c-9367-0aad8185cd90\\})|(\\{C7928956-827D-4649-A234-BB758377C005\\})|(\\{512d597b-9bbb-47cf-b0e6-526456ee6d26\\})|(\\{fd591fc9-480d-4f04-8ae5-0be02121b425\\})|(\\{e3258209-0248-4092-bc59-3032565d2f0a\\})|(\\{725fc0a6-1f6b-4cf9-ae17-748d111dc16d\\})|(\\{3e30848f-3b39-425b-8538-d85da166cb19\\})|(\\{9e27a3ff-0131-4aed-bc7c-2364bd89d7c9\\})|(\\{74e039b8-a2db-4a41-9155-4ccfc2c86682\\})|(\\{cfd9177e-c8c6-4d94-b5e9-d87850e2c8aa\\})|(\\{e21459c1-5604-4324-a3a0-8d23800725ec\\})|(\\{a563f3c0-d631-442f-ae27-1467cd47f1f4\\})|(\\{cbb3237c-ed1f-4735-a364-1849c0907b3b\\})|(\\{5c88311a-c457-4d3a-961c-3dc0cf01e6f9\\})|(\\{0bdf29c1-0c18-40cf-b3a2-c938b5cfdabc\\})|(\\{56e0ce0d-ffff-46a4-b2cf-1260d6898b94\\})|(\\{673d181c-5a1f-42c9-a8a2-f2f5af4a2a2a\\})|(\\{63dc2763-30bb-45fc-90ce-0d2a5c07a46a\\})|(\\{2751af61-65b3-4e7b-b098-497d6d6d7629\\})|(\\{5ce7c96e-2e99-4a6d-8f5e-cbcd68fd64b6\\})|(\\{e7e1a9ef-2755-445f-a639-d9bbf5e1982f\\})|(\\{ef5483ba-d634-468b-93d0-1bed3f09306b\\})|(\\{10367a10-912e-47c8-ab86-9a752230e097\\})|(\\{bf13ca91-6471-45c9-999a-e6176ffa9681\\})|(\\{7b8ddd2d-c2cc-428c-8Ede-604995d8B4da\\})|(\\{d05d4f3c-74ba-40bf-afa0-ad944df067ae\\})|(\\{fed8f5bc-0324-4007-8e90-84709e0c57c8\\})|(\\{9ef981d5-0b21-41fd-9412-008633de79f2\\})|(\\{1569b001-9f51-46a2-a4ed-f2122c475799\\})|(\\{340eab9c-f3c6-4a6c-9439-79733e12df5d\\})|(\\{1ab78f66-5390-4db2-8d1e-c759599ef2a4\\})|(\\{ce00b27c-1a7d-40f9-be61-57ae046ebe1a\\})|(\\{9fc1abcd-3044-4bbb-b04f-c233f1d20bfc\\})|(\\{78255a39-463e-4fce-9a2a-acca442414f3\\})|(\\{159bf803-5c0e-4863-bfb1-7a036174bef5\\})|(\\{7828da87-6bf1-4799-91cd-6e9167511fa5\\})|(\\{9aa7920f-677b-4904-9ea3-cae4c4320d15\\})|(\\{3e78b05f-90aa-496c-ac3f-cbc92a738fa1\\})|(\\{cd9d2474-fff2-4f19-8452-0ec2f4422117\\})|(\\{c7722662-0964-4341-9232-0fdebb37811e\\})|(\\{fdb0fb76-f05d-4732-9348-6f8765673e14\\})|(\\{05abc1ee-f871-4ce6-a51d-6011cdf545ba\\})|(\\{300e263c-aed7-4df7-b197-82d5122ccf6a\\})|(\\{14775497-c7c4-4209-9d6b-a8a40c0aed1a\\})|(\\{10f8343f-0f77-4cb4-8266-e06dde15e8ca\\})|(\\{d2a58c6b-be02-4ea5-9e7e-6982454e9ef3\\})|(\\{0f27c13a-5921-4e7c-86c0-b43ad63a4bea\\})|(\\{f1922123-3aad-41cb-8ab5-281ec8cbe351\\})|(\\{be0f8a88-522f-43a3-8146-5b2ad0985987\\})|(\\{44056c1f-6259-4ec2-8e60-b1c65f9b1039\\})|(\\{1e4c4a84-ea2a-45c0-935e-59cc375575ee\\})|(\\{62a11f62-84b9-425f-b506-93c3711b73e7\\})|(\\{bcb5539d-0913-4d90-94a0-e3144ab239ac\\})|(\\{e4dd1b2b-dcd2-494e-b69f-8c76e89a6234\\})|(\\{48eeddb6-f7f9-415d-9835-b859e37ed024\\})|(\\{ddf2a2fa-a5ed-4765-a44c-4b56077cd588\\})|(\\{2a208cb8-5297-47b4-91a7-0e66475218d8\\})|(\\{7ec57eac-456d-442a-85f2-477cb20c3dde\\})|(\\{20aa1960-d5c2-48fb-ae09-fa6261381537\\})|(\\{b4ebedae-d18f-46d6-8b87-679d1fd27f3d\\})|(\\{67fa631f-29fe-4001-892c-1dfdd56e5ed3\\})|(\\{ae92cb39-b2a6-4865-a125-1b273ffb4a1c\\})|(\\{5b2245da-f41b-4fb3-88b3-5e9a097e06c7\\})|(\\{69272cbc-110d-4b5c-b903-16bd118ddf45\\})|(\\{d4d22de7-54af-40a1-99f7-c2b0f2d86a23\\})|(\\{e1445f3b-92ee-4085-a57f-380e96ed8316\\})|(\\{f9830d93-3782-44e9-b199-d2355f61b98f\\})|(\\{218769cc-3b47-4978-ac59-8a9447bcb193\\})|(\\{f472ddca-60dd-4d6b-90c7-244a84d0a487\\})|(\\{8af6985d-1eef-47be-8213-bd6e25dad273\\})|(\\{da95491a-1812-442a-bde4-7a29f69044d4\\})|(\\{f8d10888-29b8-48d3-8e5f-e02e41fb642e\\})|(\\{e9091337-2af8-440e-a318-ca9e0f053fc0\\})|(\\{3ba1e00c-8339-4ae3-a87e-f4af9f1ee33f\\})|(\\{b40e5bcd-5966-424f-8a15-6ecc3dba050a\\})|(\\{c376e851-c30c-48a1-9f59-d528d34560b8\\})|(\\{8ad33b1d-31a7-47e6-bb46-6c91bc1daea3\\})|(\\{dac8f2fe-662b-4017-bf62-5052d0b23af9\\})|(\\{c27b6b15-fd63-458e-91b8-5974a7b2242b\\})|(\\{b222e127-a52c-4884-8a0a-065342b0c74d\\})|(\\{f53f1857-3f7f-4cf2-9e4e-2533f2c253ee\\})|(\\{eb260b8d-f7d3-48d8-a29a-c2b07e1ed36e\\})|(\\{49f6227b-4803-46aa-b189-466869e8dc5d\\})|(\\{a8694ce8-04ee-49c6-81cf-cf005e7009b4\\})|(\\{c53aa3f1-3385-4e2d-9d38-daf09b0db7bd\\})|(\\{9b230441-bb88-4060-bcc9-637cc5a54639\\})|(\\{895ac4f5-bd07-41c9-bbe1-cdb4d2be9975\\})|(\\{6886d657-954f-427b-b52f-9ddb1b52da62\\})|(\\{d1bc06d5-8470-4120-a2af-8e05b252ccca\\})|(\\{2aad1b2d-c29f-4623-83ac-6291c169c4d5\\})|(\\{e54137a1-794f-482d-93b6-13e2dddf7bf7\\})|(\\{773b7d0b-dc32-4125-83b4-a74887588698\\})|(\\{dd8a0577-a2ef-4719-b138-8aae7cf05add\\})|(\\{9b0dc71f-13e1-42f7-9e64-518cf228c079\\}))$/","prefs":[],"schema":1581005656992,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613891","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8b5feaac-be07-4612-a090-4714b80191f0","last_modified":1581082030075},{"guid":"/^((\\{7b931d6c-4721-482d-8fcb-8c789bafc9a4\\})|(\\{03ea1c25-7fae-4ca7-9e9a-4b161936232a\\})|(\\{06580af3-ba0f-4e49-966d-932b19f6914d\\})|(\\{7f2afade-1aa3-4acd-8161-4a7d111535c4\\})|(\\{45fc7dea-37bf-46ca-9ccd-4b156778ed55\\})|(\\{b8f12b3f-ebe5-4599-9c51-1414ba5783be\\})|(\\{6440c999-2444-49d0-b8b4-188503a14a32\\})|(\\{0741d175-fd06-414e-91ad-095d6484b8e9\\})|(\\{db88d1a7-fc18-46b5-b015-bd9599966cad\\})|(\\{4f3df885-1268-43ce-9e2a-45668ce523c3\\})|(\\{938ec54b-e728-4e04-9a05-108b2246cf51\\})|(\\{bd474d1d-02ad-40a4-9237-4cd64d16de55\\})|(\\{622b8278-44d4-4f9a-ad96-1363247ae6c6\\})|(\\{9fd1d710-ebe9-4da5-a488-d51eb1e88ac7\\})|(\\{ee4314d4-00a2-48ce-bd11-4364496faa8c\\})|(\\{a06cfa87-55e7-4c65-a71c-a5e984c38e94\\})|(\\{1e36e1a3-6756-4ecc-9138-6939b23ed54c\\})|(\\{219cb4e4-5e4a-484a-844f-fee741dc65fc\\})|(\\{057669e1-0925-4d28-bd20-0fb643ad290e\\})|(\\{466bf5d6-c235-4731-9539-ebf90346f096\\})|(\\{a96faf19-5035-4149-9664-773abbc0881b\\})|(\\{656b685b-a458-4651-bb39-66242c67dd6d\\})|(\\{1acdd00a-744a-4875-be39-5a136aa20d7d\\})|(\\{58873ce7-60eb-46b9-a4af-ae62095b3fb1\\})|(\\{387033d3-4292-486e-80f4-44e531349a54\\})|(\\{5b8b07d1-4e0a-4c96-aad5-672a00c1358e\\})|(\\{15a8fac7-2bf1-4536-b4a3-7f51c9b7fa1a\\})|(\\{668952b1-4609-453e-9972-e9557192070a\\})|(\\{5f017950-0824-4806-9cda-e17d454f1b18\\})|(\\{008db332-feb7-447c-8359-829c2e5fc374\\})|(\\{3d412505-479b-47c0-b330-3599533e783a\\})|(\\{117a7b8a-6c7e-4fff-8d48-e12b02871b91\\})|(\\{8753c4a4-e083-49db-872c-eef47d1d58ab\\})|(\\{f439338b-3af7-4afe-bd48-77ee1039077e\\})|(\\{32588122-b871-43fa-b845-60b548a30235\\})|(\\{89a92c73-87b1-48b1-bc68-b814d1348d1d\\})|(\\{dbb477cc-8be4-44f4-9cc2-845632a7e433\\})|(\\{da48acfb-08ed-484d-90b3-0e63c759a4f4\\})|(\\{af40910c-c446-4a65-843e-5c39b6ef38f7\\})|(\\{0121e1fe-e88a-452f-ba88-7c330f87c137\\})|(\\{9cc2b320-5edf-4b20-be94-108583cc9b66\\})|(\\{babab679-6c9b-40c2-b62b-e21a3b4b5734\\})|(\\{5e4d38a3-eefd-4fb6-bbe6-5eb69295f37e\\})|(\\{ffb5e280-9fb1-42c8-bfbc-ac2db8232d9c\\})|(\\{50198f5f-f09b-4d09-96e7-ca94e327ce7b\\})|(\\{eee19d83-6edb-4b9d-b483-1070d60595a7\\})|(\\{7c5e2b18-56ad-4249-8390-03dd99aa5b09\\})|(\\{61af5d39-dd37-46fb-8ead-c7756764458c\\})|(\\{fb0dabc2-2a3d-45b2-8ed4-dc22b74f0ab4\\})|(\\{e3eb4df8-0cfb-4380-a7c0-856d4deda887\\})|(\\{180a38cb-115e-4794-a039-696446dc6b4a\\})|(\\{91dc3cb5-ab77-4e1c-af09-d827a0df9e08\\})|(\\{c4fec1da-703f-49fa-bd3a-5d7f939d2ae0\\})|(\\{a75f51d6-8d4b-4a28-b706-300403b82859\\})|(\\{d79394db-944c-4820-a90c-a2f48ab5fff1\\})|(\\{d6f11f95-a27b-47cd-bbcf-a9b5f2dd2a36\\})|(\\{3e64646d-9618-44ca-bf27-e424e76bd622\\})|(\\{43b57421-3ba8-4116-82c8-afd142c05674\\})|(\\{30935b8f-9a74-4e49-b6f5-8bb95d3ab3a7\\})|(\\{1ec5af15-c738-492d-bdcf-c14fd5be5e13\\})|(\\{feff2b30-7349-4e7b-9a9c-541f97dbc9e5\\})|(\\{48dbfb68-13d3-4372-820d-d52ea58ebdfd\\})|(\\{1a3a904a-3daa-4d1a-8260-c20b44fec6e3\\})|(\\{3794f3f1-6a11-48fb-a7c9-b33344ee82ca\\})|(\\{e3587df7-7358-4a36-aeff-944db7ab30ff\\})|(\\{43a526a3-28ea-409f-933c-2ef3d9a0629b\\})|(\\{2d3e88ab-b4af-47d4-b79b-a0becf1437b2\\})|(\\{0e02d0ec-97b5-4b46-b42e-d4179b067478\\})|(\\{dc7083b2-64f5-4ec0-a84b-3e5fdd552f11\\})|(\\{69d07419-67e5-4465-ad46-b969d5e5c3f8\\})|(\\{f31bdeec-878f-4465-b9f5-e844b45eb9a2\\})|(\\{9b63b79e-32c8-425b-ad18-753b58b73cbe\\})|(\\{8caf71a8-6c65-4cd4-95c6-9913dd169278\\})|(\\{e1f6fe90-e0fe-418d-9ff6-566cdd5b60e9\\})|(\\{e34bd75e-5e7e-48e6-a84e-1d18e5fcfb2d\\})|(\\{087940d8-dc20-4e9e-829b-7bd96c37b02d\\})|(\\{48defe55-de7a-4051-a5cf-ac6a649e66bc\\})|(\\{8bd54503-66cb-49dc-81ec-9fa0e9c42fe3\\})|(\\{ed9f9df1-9f6c-4e4a-a4ac-5d422a7c2a5c\\})|(\\{13261711-0eeb-457e-9035-7c415e286830\\})|(\\{E3F6115C-B027-11E8-AD5B-6E4CAE35F1A2\\})|(\\{93654046-f548-4d3e-9370-cc2244406725\\})|(\\{943ba377-5410-47cb-a025-30d55960622c\\})|(\\{426123a8-3e04-4887-a4a7-18931eaa428e\\})|(\\{4c50cefd-8f14-41ab-b719-8606b116d1c2\\})|(\\{ab2d09e4-07c0-461b-94f3-b2ea2a6773b9\\})|(\\{3f20ebf2-5869-431e-a73d-53d435176b04\\})|(\\{5b845034-25ed-4b92-bfac-ed7b305a3e13\\})|(\\{24c45b33-30e2-4d41-adb1-2a1bd9942ca6\\})|(\\{46f426fa-dc37-4b1f-ae63-11370ec65b39\\})|(\\{d678f055-e538-4c58-8a61-746166ac5063\\})|(\\{f852266a-7f88-47d8-b610-6ca130d9774c\\})|(\\{dce62517-e86a-40e0-9361-64c2e61f011a\\})|(\\{f7883a1d-0f04-4f8b-85ec-f339b791335a\\})|(\\{204f251f-feba-487a-9bbc-ca8b22b222af\\})|(\\{59c8031e-40de-485b-9988-69a4f4f51e52\\})|(\\{a5207f0f-109a-406f-8d86-3a2c806c9c7b\\})|(\\{3b66b98a-8782-4f16-a2f6-33175f9b0101\\}))$/","prefs":[],"schema":1581076280856,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613891","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0e546e4e-6d89-41a0-92fb-987b98efea6f","last_modified":1581082030072},{"guid":"/^((\\{0970b6b2-6702-443d-84fa-90f5b5cf7c10\\})|(\\{9ba7732f-7e77-4dae-9885-a9cb91930b0b\\})|(\\{dd43f6d2-30c7-43df-bce6-6edc46c84d9d\\})|(\\{72207416-61e9-4960-9cb2-87d2df8486fa\\})|(\\{d53274cb-43e2-4cbc-b1f4-5463cc026ab0\\})|(\\{e1faa92b-b124-463e-b247-2609d534733c\\})|(\\{654068ac-aa86-4f05-aab3-f9dbea380021\\})|(\\{58d9fc43-39c7-41be-96a6-a27b1e179191\\})|(\\{f5469e0b-d4cc-4c30-9922-f0c82f1e04e2\\})|(\\{2ebc9fc9-8642-4f97-935a-6885e66ed6db\\})|(\\{b7d87fb6-afc7-4544-b798-7fcc1c8114f0\\})|(\\{d36916ad-9b5b-4390-b302-321c43d85753\\})|(\\{1e67d5ab-aff2-4540-a2e7-cd19ee112ab7\\})|(\\{82f9d6fb-cbbb-4862-8c18-c0876aa00c3a\\})|(\\{2a78a205-7363-4d76-9eea-a862be445724\\})|(\\{bb65aeb0-db01-4f8b-893a-634d2977269f\\})|(\\{5cac0db7-8b8d-44e1-8932-687b152feb8b\\})|(\\{6cade252-0973-49b2-acda-36960804c0f3\\})|(\\{61e466b4-00e9-4ed2-94bc-dbfade21f066\\})|(\\{316b549c-841f-4f2e-9e91-5a8cf5c22808\\})|(\\{73571d19-5073-4b32-915a-a2350e814cf1\\})|(\\{2e5d7ab6-cdea-4a23-8bb5-3245ccec2c5f\\})|(\\{fbf35eb0-14de-483f-90aa-3f8c4ea773f0\\})|(\\{4a9619bf-edd4-4f6c-a787-c919cd4b1d17\\})|(\\{167fc8e3-1bcf-4f46-a8f1-1722db81c4a0\\})|(\\{b861c901-a92c-475a-9efd-805d01a1c6bf\\})|(\\{6800f73d-3133-4697-a368-16c1f6e63894\\}))$/","prefs":[],"schema":1581076281891,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613891","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1dbaa501-a6b0-439b-9871-79f081f4afdd","last_modified":1581082030069},{"guid":"/^((Search_Secure_clone_oRrmYYtiAX@www\\.searchsecurepro\\.co)|(Search_Secure_clone_rHXTjLgNGR@www\\.searchsecureprime\\.co)|(Search_Safe_pHUandPyRQ@www\\.searchsafe\\.site)|(SearchSafe_IEHxXeEbnC@www\\.searchsafe\\.site)|(Search_Secure_ByKsqSMauFtest@www\\.testsearchsecurepro\\.co)|(Search_Secure_GyQyTTzqnYtest@www\\.searchsecuretest\\.co)|(Search_Secure_NhrEwtJEhM@www\\.searchsecurenow\\.com)|(Search_Cipher_bBzgbIQyiC@www\\.searchcipher\\.co)|(Protect_My_Search_Online_clone_jtypmmXRwz@www\\.protectmysearchonline\\.com)|(MyAstroFinder_LTEnkWRkmt@www\\.myastrofinder\\.co)|(Live_Weather_Check_PZjCbwpxyH@www\\.liveweathercheck\\.com)|(Travel_Deals_Center_clone_GvEXeOfSMc@www\\.traveldealscenter\\.co)|(Dictionary_Pro_ARbsoVmMdl@www\\.dictionarypro\\.co))$/","prefs":[],"schema":1580931692537,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613657","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e480bd4d-7ff0-425c-9c1d-4153fa55ea81","last_modified":1581005656617},{"guid":"/^((\\{0fc22c4c-93ed-48ea-ad12-dc8039cf3795\\})|(\\{0A2C2098-F04D-11E5-A933-5334BC8E7F8B\\})|(\\{8504399b-e635-40fe-8943-977a58521db3\\})|(\\{347d4451-8da5-4d67-96b2-a2e8a6de8e09\\})|(\\{176c8b66-7fc3-4af5-a86b-d0207c456b14\\})|(\\{8692b95e-1a13-4118-b5b9-be8f3d2fc9b7\\})|(\\{b3e1e418-986b-4231-8579-0fc754574d9c\\})|(\\{88619e16-f0f3-4606-837f-a4496d11c0b4\\})|(\\{b4229471-001b-4960-bea9-795d91cb943e\\})|(\\{16390554-6fc5-4dfe-b7bb-809e378df660\\})|(\\{5fa01132-d07b-40e1-b958-e7825b878422\\})|(\\{07ebc943-2c8a-44a9-8d4d-5bbb78b2d2e5\\})|(\\{02405c0b-a202-483f-ba02-b09bab55cebd\\})|(\\{094f9b39-0561-4cb4-8b51-cb8ee5bd5b90\\})|(\\{a66e7db5-fc74-42c8-8e8c-d7a401a577d2\\})|(\\{58f9a1bb-0635-4b79-bb41-166c3e810329\\})|(\\{9da80afe-bcd4-4271-8f70-f986370d954c\\})|(\\{2671041f-f659-43b1-a400-0f7a3b852f74\\})|(\\{d9c98668-f0a1-43d7-800d-0c6d11321663\\})|(\\{1d6f99a8-d100-446e-8cc5-85231e7ab7fa\\})|(\\{ae170991-a8c8-4caf-b6cc-a3cc994abe83\\})|(\\{bfdd7357-3692-4d5b-86c5-4d86cd5e39e3\\})|(\\{aa5e865e-1e21-4ed9-b80a-f374be86b5cc\\})|(\\{26c58d0d-8514-42d5-87fd-701fd53ce3b8\\})|(\\{c934c41a-5de5-4086-b2da-1afc7d744162\\})|(\\{e87de7b9-5994-4b91-9c1a-a1d4d12a3969\\})|(\\{0eeab47a-73f3-48e7-977f-08815b4ee5ad\\})|(\\{1df850c2-38cb-46f1-87a5-308af6409c14\\})|(\\{1f481c59-fe50-4148-83d1-ff551f6dddf9\\})|(\\{70cfab72-ee99-428a-b5fb-26d924be3acb\\})|(\\{b156eeb6-cf37-48d8-b15b-bb863c431ba1\\})|(\\{a81f7ce6-0cc3-41fe-a33a-eb856636c887\\})|(\\{3949b4a3-bbb6-4119-9fa0-249fdff22c45\\})|(\\{abe2755c-a3b3-4714-a354-51eb5b8129fe\\})|(\\{547f048f-4fbd-40ef-9365-3d54559eae61\\})|(\\{e3e293e3-f18a-42f1-98bf-71d8166aef54\\})|(\\{ca742d81-6e6d-473e-ab68-f757d480e159\\})|(\\{6ac89db3-5ee1-43d8-a12b-a1b6e0ceafe0\\})|(\\{4eac966b-28db-477f-a471-a3bf74621110\\})|(\\{2c413992-ba94-4917-bd57-57eef39b4f8a\\})|(\\{6935560b-a856-42be-baa8-a06459785ed7\\})|(\\{503d9872-3db8-4f05-9c9c-b8bcd6d08ae3\\})|(\\{2055799b-b1ed-44ab-9200-4190467a3c59\\})|(\\{fe27a89e-a1b6-408e-b0b3-b2ccc0cbdf3c\\})|(\\{3fab2a05-1bfa-458d-93f8-16c523d72804\\})|(\\{32939492-d835-4540-9c03-1af0b715268d\\})|(\\{e9c96255-4eed-49fa-9740-54ef684b8197\\})|(\\{45fc39ef-f2c8-449a-b533-77e4d6202777\\})|(\\{d3ce94d3-a9ee-49e2-9290-031e56a4a5d0\\})|(\\{6b8a371e-ce42-4355-b4bc-ad4c83d5f932\\})|(\\{cfacd4cc-9f18-40f2-8711-795e738d51be\\})|(\\{d41f259b-c827-46d9-891a-33b6caf2370c\\})|(\\{3e90457a-815b-4b0a-812d-f02a43c23951\\})|(\\{063de0bf-2da4-48c6-bed2-ed11ecb3bfb8\\})|(\\{cd253156-e140-433a-a0fc-ccab28bf069b\\})|(\\{9a6f884b-3b8a-4925-8f7e-a975e2f6ec20\\})|(\\{5986d98c-b75c-46d8-9c5a-0fef03cddd5b\\})|(\\{8d586a4b-f00f-4a5b-940b-2fe00dc2905c\\})|(\\{ab0f5841-11f0-4c92-9bf8-b885f4431253\\})|(\\{eb1bafab-7f4d-43a6-8f78-fb0dbb099cff\\})|(\\{e6b152f0-5457-44ab-a6cc-d7869dc694a4\\})|(\\{942fe5ef-e9a6-4791-b840-a2e74baaeb4a\\})|(\\{d1c67270-c2af-47af-a4bc-2c020df200c5\\})|(\\{8a934de2-3238-4c24-aa29-52e1fafc64d4\\})|(\\{c65f3bbe-684e-43d6-b030-615118b38e54\\})|(\\{286f65d2-6b01-4f04-871e-2cef4095065f\\})|(\\{2FF4B97E-A47A-11E7-B621-7403A54193D8\\})|(\\{da482f08-4b6f-4c59-942a-75e1fedc8c6b\\})|(\\{3a961d08-8ca9-45af-9c30-2ba4d673e10f\\})|(\\{e87de7b9-59a4-4b91-9c1a-a1d4d12a3969\\})|(\\{942fe5ef-e9a6-4a91-b840-a2e74baaeb4a\\})|(\\{b15a65af-8dbe-46ac-9537-f91fb1640809\\})|(\\{da48af08-4b6f-4c59-942a-75e1fedc8c6b\\})|(\\{ce2c3653-8d63-4cd0-ad8a-31f03703820a\\})|(\\{5d987ae9-c201-4352-a219-a34ee28a6f9e\\})|(\\{b15ac5af-8dbe-46ac-9537-f91fb1612309\\})|(\\{3fa556a3-3bfd-4e4b-b403-072938701c66\\})|(\\{57baae18-26fa-4ec0-9fe8-a0e197c1a220\\})|(\\{4de7b432-e5e2-45d3-95cc-df3e913b68d4\\})|(\\{a15a65af-89be-4fac-9127-f91fb16c0809\\})|(\\{c2c8b504-f5bb-489e-858f-38ca5224d033\\})|(\\{7f458bd6-4841-4373-97a4-a3d140b02552\\})|(\\{e20bc238-0831-4d4b-9386-d2fa5abe804a\\})|(\\{e51fa7b7-4c3f-4f66-8bc7-e864a413b790\\})|(\\{f9c04a94-59d8-47f7-a97d-980ff99f81cf\\})|(\\{d6ea5103-78ff-4736-b2e0-c0ce94bee77e\\})|(\\{f8fd0172-1b1a-4084-b440-4119996ab2c9\\})|(\\{a52e4eea-9923-443b-98a6-942eb27ba324\\})|(\\{a1fcb660-c2cd-49b7-a327-88e887afb43d\\})|(\\{cea42340-da28-4c95-89c4-0a66d69050d4\\})|(\\{c2f47878-f9d3-4c89-be58-a69dd9d1484a\\})|(\\{7ddf85d3-7014-4fdb-836a-fbbe4385347f\\})|(\\{36f452d0-6154-4be8-a388-174fc98d9333\\})|(\\{c69d7a2e-ad00-4e9f-80d7-fa0604ac3954\\})|(\\{8d40db57-9287-473d-b398-259d702d92f1\\})|(\\{bf51b8cc-a07d-475a-9013-91e2c089ae60\\})|(\\{32030663-2a21-4d20-a2e6-ed3d4a51b704\\})|(\\{1204abf0-0409-4934-ab58-1f5424134bc1\\}))$/","prefs":[],"schema":1580758890801,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613073","why":"This add-on violates Mozilla's add-on policies by redirecting searches or collecting search terms without user disclosure or consent or other privacy violations","name":"Add-ons violating Mozilla's policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2c6f59bf-90a6-4fdb-a12d-f1b4a1446331","last_modified":1580842055124},{"guid":"/^((\\{a88e625f-b840-43b2-9feb-99c259b6751e\\})|(\\{0cc6c564-63c6-481d-9dbb-ddfd40ced202\\})|(\\{329e1c15-fcee-4063-83bc-59c894861cbc\\})|(\\{98e2e7ef-e544-4426-a182-621e8b85c15d\\})|(\\{d8869a56-bccc-4011-9b86-2962a57d7377\\})|(\\{255138e4-d9f7-4779-8713-e5970090ab67\\})|(\\{ee5907df-603f-4684-8f2a-425742ed37cb\\})|(\\{0e725b0e-9f26-4bb5-b9b1-738df2692e19\\})|(\\{2bf69cca-c4cc-4200-ab56-1d27fef48e03\\})|(\\{4edc1ea7-7037-4b54-8a64-a43339545710\\})|(\\{6edff7c6-97a8-4355-a074-e191b0a9a4ff\\})|(\\{79c5d05b-a6ba-470b-b06d-d33fe04418e5\\})|(\\{a1ebe305-b540-4dc5-91a2-8a2a0d646efa\\})|(\\{1211b4db-1ed4-4630-82e6-cdf69d58f035\\})|(\\{4d4e8ee2-78aa-42f5-a30a-c3727241cb96\\})|(\\{b6178891-7400-4b86-8a96-d57b1b7eee20\\})|(\\{3cfcb0bb-f7fc-440b-bae9-1050a966013b\\})|(\\{747931c3-bf5f-49d0-a4d2-615847200653\\})|(\\{989fcf36-da63-4d83-a036-b996788e7a4c\\})|(\\{a0dc99d3-7b9c-4fa2-8d42-39179b1e1e5a\\})|(\\{d4ce8b88-6b17-4ed8-b695-29da839dfb41\\})|(\\{cb2af2e8-ca55-4545-864f-96686760b59e\\})|(\\{3961b434-016c-4598-9ab2-38425197f32e\\})|(\\{b4e25be7-a4a7-408b-8759-8b185b4421f7\\})|(\\{0cb56fc3-e3f8-4ea3-aba7-4a2d351f82be\\})|(\\{b3e9621c-3194-4cf8-8b28-4ad32a988d5a\\})|(\\{241b64a7-7b2e-475b-b195-b1cfeb099745\\})|(\\{b727f9fe-9345-4ce4-8797-f65f85dfad7d\\})|(\\{a90d260f-7c39-4539-9948-8f3ee4406a9e\\})|(\\{35a57c90-ce66-42f6-ad0f-52b92690f4c2\\})|(\\{83048c90-baca-477c-8774-054f80eca4e6\\})|(\\{91c1e004-2e1a-4103-89c2-2f585c2d306d\\})|(\\{a5701591-3a6d-43b1-b74b-c47a1b7aa5b7\\})|(\\{641eef82-a96a-4702-b3fb-f50f8d7cdc85\\})|(\\{b436362d-94e9-4209-a3e5-26dc7d1ec86a\\})|(\\{70dc19f1-1312-402f-a370-cd8a1e231116\\})|(\\{c9a68220-ad02-4b09-9456-12ed03121344\\})|(\\{dc0d8992-0c9e-4473-b8c4-72240fc7be39\\})|(\\{1c3ca6ca-1427-4b6e-85be-315e18f81135\\})|(\\{96309a2c-339e-4c3e-84ff-ef7dac131a18\\})|(\\{95d07270-fb53-40c3-9b9f-46ed78658a1a\\})|(\\{15700ca0-8d4b-40d3-99aa-bff59aa48676\\})|(\\{5d308759-368c-4b5a-804c-acb6e18c6436\\})|(\\{b47ace66-3443-4d26-a858-7bbcfe1c18b6\\})|(\\{10dc172a-38b3-441b-a2d4-52b4ce8e4b7b\\})|(\\{73a47b20-be2c-43e4-a728-c46d33612ccb\\})|(\\{5f3f1314-618c-4c3d-ac4d-f83ae6d247ac\\})|(\\{bb81241e-b093-4c55-8c3e-7dca2250ada6\\})|(\\{4d8be4aa-4790-4807-add9-af62132e675d\\})|(\\{4295e30f-80bc-4d48-b794-c609de6f2dc0\\})|(\\{057c6b57-46f3-43b4-9576-438afdd3b3ca\\})|(\\{60a58bf1-08ae-46d7-9010-5cfe8eb5f282\\})|(\\{bffd69a1-5a8a-4b0d-ae14-f8744adb92b2\\})|(\\{b5c0b80e-dbc6-4701-98c2-3b0b8e182404\\})|(\\{48306d77-a699-4cbe-9ed3-b3162dfff00b\\})|(\\{f1f285dd-4a5c-48ad-81bd-78fe204ed582\\})|(\\{da0b9335-8edc-4429-8889-c5872ad02417\\})|(\\{6e834570-8580-44c2-91b2-d30f687aeb07\\})|(\\{9ea1bae9-5dca-4a1f-9fcf-a325a39b85c1\\})|(\\{69149c7f-92c7-4d41-b88f-e68c237d1d63\\})|(\\{985e1bca-d152-4fc3-89a0-cba2c0ac44bb\\})|(\\{746c7167-56bf-48b1-bd6c-08b05b48a863\\})|(\\{4bc87632-de6e-4c23-8192-f561f185a823\\})|(\\{1d21ed2a-94c9-4bae-983e-5c1e5094060a\\})|(\\{148df2dd-451b-42eb-952b-f608f26cfb6f\\})|(\\{2c6d6dea-438c-442a-ae11-a943804d90b4\\})|(\\{2c7e143c-9f4d-412b-b552-17033d4992c6\\})|(\\{e2309514-8386-413c-856e-21b54ebc3d9c\\})|(\\{4b417a17-ff90-4f16-bb8b-fb1e0d9ca824\\})|(\\{7c68360c-d03c-4c26-bbfa-2f9c9064701f\\})|(\\{eefb2906-cb27-4801-9ae8-67b49807b151\\})|(\\{b7c790c9-aaf6-46f2-9462-812d3e129ce7\\})|(\\{aac68138-e60d-48e2-92dc-d28577e553d9\\})|(\\{5959fff0-d04a-4147-8d4d-aaa7bb314a00\\})|(\\{40bf9b7a-9c36-40a8-8e68-91b79eb3bd44\\})|(\\{96429801-73cc-403b-be68-fb8a992f9307\\})|(\\{218e967f-59b5-41f6-a22f-7fe3c1580956\\})|(\\{ba51f209-a2f6-42a1-9608-536058540d0c\\})|(\\{d993e7df-00f9-445f-9082-294017eeec36\\})|(\\{f1990255-00e8-4d34-91d5-11d09066e4f3\\})|(\\{dbb78ed6-8449-475f-a152-0148596539eb\\})|(\\{ac798a99-00f0-421c-a3c9-a13bea8ef728\\})|(\\{e486268f-9299-422e-91df-9706ea220c46\\})|(\\{ecf1e24d-cfeb-4fa1-9953-202c3e62a820\\})|(\\{caf7fac5-0784-4701-a50d-2d0c27074b9a\\})|(\\{8f85f7d7-7182-4a53-a18a-bf83f0bfd1b4\\})|(\\{be556a9a-df8f-45b9-87aa-ae0eaf50a2b4\\})|(\\{9f80406a-ba8a-4548-bb0e-e987fb1d7921\\})|(\\{d0386a6e-e364-4e67-b340-782492bdb3ee\\})|(\\{cb0d2b3a-929c-42f1-8874-07a0650d0298\\})|(\\{cd9f2f81-3674-4d3e-a1b3-824fd3e5e906\\})|(\\{58366e2d-3a39-4fea-b631-521e3e73162b\\})|(\\{d854ae81-f759-48a9-8732-2371664fe2fe\\})|(\\{4747285e-3ec6-4d8f-9d1d-d0430297f182\\})|(\\{2f1919a8-4ca8-4a80-9175-c2da3a98490b\\})|(\\{32b30902-43a3-4f37-8e86-860ea525e923\\})|(\\{60376450-fe48-4d30-b551-b35535df6e96\\})|(\\{22456782-c5e4-437f-9369-5b23b875cd6a\\}))$/","prefs":[],"schema":1580814638830,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613073","why":"This add-on violates Mozilla's add-on policies by redirecting searches or collecting search terms without user disclosure or consent or other privacy violations","name":"Add-ons violating Mozilla's policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b3ee1de-0c37-4883-a22f-822c8d6f8991","last_modified":1580842055121},{"guid":"/^((\\{35417623-1a2c-4e75-846f-e2a7b95b3b24\\})|(\\{d6dfebf0-51d4-490b-b03d-a17bf7fe4a6d\\})|(\\{50c7fb39-c03e-4d82-a071-fac7eaf960b7\\})|(\\{28999f9d-6e83-4c52-bb2b-5d2c46b7ef58\\})|(\\{9409fdd1-d78d-4df8-bb5e-f178f42702f6\\})|(\\{4c356115-33da-49e5-877b-090c64d76a66\\})|(\\{cf674a88-861f-4357-aea7-37f09e534552\\})|(\\{43238f2d-ddba-4604-803f-889bfaa22ebf\\})|(\\{36405669-81af-44c0-83cc-32ae8f901db0\\})|(\\{2ca5cfff-58dc-47d4-b56c-c206d281a9cf\\})|(\\{b22df1a7-f312-41a8-8fd7-cdd160ba7be2\\})|(\\{cf019c95-1c49-438a-9398-3863642fb606\\})|(\\{c7a9d852-c30d-4e6d-b040-a445551bee61\\})|(\\{379932ed-2938-4ccb-b57e-2dc44c3b5121\\})|(\\{d2395ba4-96e4-4ffb-a4da-608f27328c9f\\})|(\\{7ffbda76-3f9f-403b-a5e1-559c4f18c1f3\\})|(\\{361db730-4c11-49e8-b189-fa461f738786\\})|(\\{677456f1-2716-4a23-9a74-f3867e860dbf\\})|(\\{46c19d03-16ce-45f2-82ce-d8ccaeb3ceea\\})|(\\{6339b6ff-da02-4821-b5a0-48490a54b14e\\})|(\\{7d4d815d-798c-4cc0-9561-2f84b4598f94\\})|(\\{40fc3311-9612-4cb7-b337-fd581dead5f2\\})|(\\{9e639048-d366-4db0-a15a-f1953130fc8e\\})|(\\{ce2d009a-47af-4e94-94aa-23bd8973addf\\})|(\\{41984c46-3ec2-4684-99db-a5c4356f7ba0\\})|(\\{a63f9261-e05c-45f8-8b43-f987eaf5b27e\\})|(\\{37e06cae-3367-43e2-bdb2-0c087f2603c6\\})|(\\{f9d80e53-acb1-4483-bf3c-f58920551ded\\})|(\\{1672a22a-f6cc-4318-9616-22e1e3b3049d\\})|(\\{1cc6cbe4-38ad-44c4-a462-a2a222bab5be\\})|(\\{0255dcf8-ac71-4403-ab5a-c8f7abf66a39\\})|(\\{564f7511-ba68-48a0-9a85-636a100ce3d1\\})|(\\{4ebf29d7-102f-497c-bc8d-696dd66ecde6\\})|(\\{4c4139ca-ffbc-4f10-a534-22dd4c787944\\})|(\\{a12c1827-a5fa-4c11-8403-e02e9520f0ec\\})|(\\{2178817b-1d32-4068-9675-8fffe11a88f8\\})|(\\{b779151f-7a4c-46b2-83e4-3dbad231a9b9\\})|(\\{fe8a8186-80ef-4112-a41f-7d00ffceb63e\\})|(\\{0ee72846-9a34-422e-b202-382aa19bc0bb\\})|(\\{c92d2fba-d002-426d-acc4-0891fa40040f\\})|(\\{e3bdfd08-fa29-4a56-9851-f6d0b965004f\\})|(\\{0017666d-27b7-4347-bbbf-6d389b4430dc\\})|(\\{c9db55d0-61e4-4515-a9a7-24e3783bf106\\})|(\\{fbf87239-ec23-4907-bb6c-93daa5015ea3\\})|(\\{44801e5e-a635-455e-b08f-f3da88b06bed\\})|(\\{59517a31-ea51-44cd-ac7c-02d952ecf04e\\})|(\\{ee075bcc-2101-4c9e-8f04-7e7281ca5c74\\})|(\\{fd073c3a-d7d8-43f6-9d1c-1865bc0ff940\\})|(\\{a15f4275-8f19-4508-b548-a88597092bbd\\})|(\\{568ad6c6-0b91-46bd-9093-bc394a84c257\\})|(\\{11f798d4-003b-41a8-aa65-1f566ff53f06\\})|(\\{a02f26f3-49f7-4e95-a69f-78b1ce2d3471\\})|(\\{ed48226c-94b9-4878-86ba-de38851290d7\\})|(\\{97e5276c-a627-4c62-8659-4772a81203c0\\})|(\\{4cb19fea-1568-4f0b-809a-0763fbb36888\\})|(\\{599cff19-2ba7-4bf3-93a9-87f7f277cadc\\})|(\\{f0564e7e-f154-4612-b50e-e0d11c47b359\\})|(\\{3cc8efd6-4808-428a-9e0c-ef6fa45d17b4\\})|(\\{3842feba-bb44-49f6-9511-de1a1b78d348\\})|(\\{ebc3de57-de6d-43ee-b76b-676893dd7035\\})|(\\{a5f552f7-7279-49e5-92cc-70f952534726\\})|(\\{3ece0c93-9723-4280-8356-d1eb2025e2d5\\})|(\\{8579047e-a427-4ac8-87b9-ee9651c1f856\\})|(\\{c9bfdfd9-4617-4749-afd1-265f0b7158cf\\})|(\\{0c570e22-54e7-4d93-86f2-36e19707018a\\})|(\\{cfc0fa6e-0d6a-4fcb-9dc2-58b220307293\\})|(\\{8640eaec-8d51-4d6c-b01b-a671f4aac012\\})|(\\{a0ca05be-c6f2-4c18-993f-de55abca7000\\})|(\\{de066e14-6527-4be4-9751-e53ea16fd60f\\})|(\\{5a8f8da1-3994-43da-98be-3a58ed4d2ec6\\})|(\\{bcd8524a-8f39-4eba-a795-aabdd95305b4\\})|(\\{7d76001d-fda5-4abf-93f6-a947dd3cca24\\})|(\\{d18219fc-b632-47dc-bea1-73451164d187\\})|(\\{e97fbca9-d513-4fa7-9524-576620470399\\})|(\\{069b10e7-f7ef-40df-87bb-95783401a54a\\})|(\\{12a978dd-a7b9-42c2-b431-65aaa56c2a77\\})|(\\{66ba2e20-9378-493b-837f-4b3a028ab5d9\\})|(\\{9ad5b1e9-a19c-4a65-be1b-8b888da7cf58\\})|(\\{87ce9b48-e659-4b14-ab54-c80ffbeaa77f\\})|(\\{4da94d09-4730-4277-a544-f3b7890b6666\\})|(\\{30e6c020-4ec6-4b18-8f29-3dc294fbbb44\\})|(\\{5bfbdd70-ce54-4686-9351-0d90a7dd011f\\})|(\\{17eb23ec-f059-4857-a405-9d06242e99b5\\})|(\\{b4170b6a-0af2-45b1-9214-3665e870ab3a\\})|(\\{bc20b5b7-46c3-4af6-942f-f0323445b576\\})|(\\{44edc268-9242-461f-9d8a-fb59337101b0\\})|(\\{301321f7-e0a2-4cc2-9cc6-7ee1390ea895\\})|(\\{b57a503c-6370-4ed1-90ed-1b6444ca1e52\\})|(\\{c4707969-efc7-46ce-845d-28a46c78fda6\\})|(\\{22714afe-0f06-496d-9897-31e52e83a12e\\})|(\\{a07fb8cb-91fa-4799-9ff5-115e8a88b57f\\})|(\\{f539ec45-16dd-47a3-a9d5-8643b021d4c9\\})|(\\{b9348282-9380-4e55-9939-e4c10254a496\\}))$/","prefs":[],"schema":1580814639945,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613073","why":"This add-on violates Mozilla's add-on policies by redirecting searches or collecting search terms without user disclosure or consent or other privacy violations","name":"Add-ons violating Mozilla's policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ae074a33-05f8-4721-a9ff-7111502291c2","last_modified":1580842055117},{"guid":"antimalware@titansurfer.com","prefs":[],"schema":1580240491748,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611797","why":"This add-on contains deceptive code that is not in line with our data collection policies.","name":"Titan Surfer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c703b7fd-4b40-44f8-9de6-786b66ef8e1b","last_modified":1580742890204},{"guid":"app@OnlineFilesConverter","prefs":[],"schema":1580380822975,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612169","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Online Files Converter"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bcb1821a-25e6-4b9b-a54c-bf4543f895c0","last_modified":1580742890201},{"guid":"{f83128d7-ef15-47a2-a99a-70d181413b81}","prefs":[],"schema":1580381170095,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612294","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake banking add-on"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1ca7b6ce-30d5-4290-b46f-9fad59b65f9c","last_modified":1580742890197},{"guid":"{d281b854-0c99-4e4b-b647-32038ae53c27}","prefs":[],"schema":1580727235989,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612868","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"SApp+ (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"93cceac3-803b-412a-b413-fdb1b0689626","last_modified":1580742890194},{"guid":"/^((\\{236a5a66-132c-4d7b-a62f-66f1a76bb7b7\\})|(\\{0fadbf07-bb25-4737-9800-b879a6f1c417\\})|(\\{c8ec696d-935c-45d0-a604-180244e839e3\\}))$/","prefs":[],"schema":1580740785659,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612869","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"183a1de1-2625-44d6-90df-cbdbee9d23bd","last_modified":1580742890191},{"guid":"/^((mozilla_cc4@internetdownloadmanager\\.com)|(\\{4509d977-32a4-480a-ab95-6ddb5bfc6616\\}))$/","prefs":[],"schema":1580741006002,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612871","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ad2f927a-eb67-4360-92e0-87f567608c1a","last_modified":1580742890188},{"guid":"/^((\\{f2431eaf-2b0d-4f0b-8148-3188db294d73\\})|(\\{c43e5363-2c61-4c3d-afa4-9cbe06e767d0\\})|(\\{bb8eab9f-4611-496b-bd31-a1b2ee66d8f9\\})|(\\{5f61d055-ae45-4ecd-9570-555609f66f5a\\})|(\\{532d8a77-86b6-4a7a-87a4-d973dc0cf9d0\\})|(\\{bfd10065-670d-4477-98dd-8bb4285040d5\\})|(\\{79f33a52-631a-406b-afcf-9be8b4bb480a\\})|(\\{fd994367-ecfe-44dc-a595-cb155110492d\\})|(\\{9a01416a-758c-4fd7-8e56-998acc588f9b\\})|(\\{517a72f3-e9cb-4e9f-8a2a-9639f4daed76\\})|(\\{4fda7f17-eaa0-44d1-91e5-7d8305a2de0e\\})|(\\{695bd646-ba09-4a3d-9616-191b355aec33\\})|(\\{6893ed50-b006-430c-bbfe-5f049e57470b\\})|(\\{7a2f84c6-d1ef-4902-bae7-b6c7807cb32f\\})|(\\{afde1624-c4a4-4494-9ed5-1ad15799dbd4\\})|(\\{e05b53dc-910d-47ce-9c9d-5195e8e8f3e5\\})|(\\{11b0ec0d-ae49-4ce8-a13c-198affdb4d9e\\}))$/","prefs":[],"schema":1580741081005,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612872","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dd36267c-dbd3-4df1-bc01-5f566ba56de0","last_modified":1580742890185},{"guid":"/^((\\{6b7df170-e6fa-4b9b-bd76-d6b866a5bc6c\\})|(\\{7e1c1f98-4c89-4668-b9ea-e258e7c9e22b\\})|(\\{1f2128cd-bcaa-4e60-b555-0713054df0f9\\})|(\\{9043971c-ce88-400b-b56f-7a9e3853eb32\\})|(\\{afcbdf71-be6d-46cf-b5ff-6a6b9ec7f920\\}))$/","prefs":[],"schema":1580067691094,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611725","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b4a4d34-1341-49ea-8b53-96a1ecfac49e","last_modified":1580207330647},{"guid":"/^((\\{0ded4ebe-965f-4de0-89d2-91ed13ae15ee\\})|(\\{5c143da2-6a9e-4afe-9ca2-b758aebe6e64\\})|(\\{c6566b12-297b-41fb-8189-f32a7d1c1b87\\}))$/","prefs":[],"schema":1580078568605,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611806","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"70af2927-6552-4eae-a91a-89e4cdd61b88","last_modified":1580207330645},{"guid":"/^((\\{9237d0ab-aaf0-41a2-b873-c0f131b09ce4\\})|(\\{18b14b7d-e228-416a-bab8-37acf6d6dfca\\})|(rwkaddon@racewarkingdoms\\.com)|(\\{2e2d6d72-2634-496c-a8db-db869b639a21\\}))$/","prefs":[],"schema":1580137101921,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611807","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons injecting remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"303a149e-8262-4d16-b24b-348b84d5051e","last_modified":1580207330642},{"guid":"{c6ce41ee-a4e3-4fd7-ab6a-988b6916d66a}","prefs":[],"schema":1580137557625,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611810","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Qwicky Advertisements (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"18581952-6448-4728-9fd4-2860b3e6534e","last_modified":1580207330639},{"guid":"djuvt@czgnp","prefs":[],"schema":1579817517633,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611297","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Update De (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ad789bcb-4c12-401d-b6fe-202a5b6697b6","last_modified":1579987441268},{"guid":"/^((zdphb@swlguy)|(czgnp@hhjl)|(mjrxg@zdphb)|(fuevm@czkvq)|(bgufa@djuvt)|(czkvq@bgufa)|(axvij@fuevm)|(swlguy@axvij))$/","prefs":[],"schema":1579863493098,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611403","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"83d7f7c0-8a56-4feb-9e66-b77af6343430","last_modified":1579987441264},{"guid":"/^((\\{50fc0c97-b405-4f63-9c10-465cab131ec7\\})|(\\{e08f09a1-e8e4-421c-a460-ada7b13077c1\\})|(\\{887c8e31-c11d-4b67-8bbc-e5b5e8fea9dc\\})|(\\{d67b6e83-976d-458f-aece-0af986c16db7\\})|(\\{d0c0679f-9fa1-448c-a78b-f8fa1591597b\\})|(\\{23747ea4-fb31-4349-9954-2728f1d4bda2\\})|(\\{5d492e1a-7e3a-48ca-9745-784a5b61980a\\})|(\\{bec8dea7-eed3-464a-b99e-92cab1e10373\\})|(\\{48d63231-1796-4b26-a3f7-1aa7f5bed1f4\\})|(\\{fdc94eff-5212-416e-b2e4-d67c088c4907\\})|(\\{ffd2c868-9f15-48f1-a77b-c5a1842a2e41\\})|(\\{9b0e5b96-2b47-4ee4-b511-7402c05ab43a\\})|(\\{f01f803c-fb6a-4c0f-9dfa-d8f6173b3b17\\})|(\\{b2ed387a-02c8-4bff-bf6f-00ce6b5f067f\\})|(\\{7222c5ee-8154-4e47-8521-1dafcd00d902\\})|(\\{c085ea8c-57cf-41c5-a41e-38dd6288e808\\})|(\\{2cc9608c-dc69-4bc0-8d3b-95852face3ac\\})|(\\{5977f159-e17c-48d4-8e2a-8b48962a57cd\\})|(\\{10e4d201-689d-4864-a04e-f21186f3d4e2\\})|(\\{79119982-95ef-4cfd-9fe2-b193018503ee\\})|(\\{520dd821-08e0-4821-abf8-347474c78f72\\})|(\\{6ff93655-17b6-4bab-bb0e-40abfcd5a853\\})|(\\{af670583-4dde-4e1f-b169-efc5aec481f0\\})|(\\{b053d2ab-0c28-41a6-99c4-4d276af55169\\})|(\\{4b70886d-6215-492d-8330-c220b714a216\\})|(\\{21855045-7800-4467-923b-096efe6ded40\\})|(\\{6c1f8c3a-47dc-480f-8007-3204db00a8c2\\})|(\\{2dc676a9-bc76-405c-9252-b76c60cc172d\\})|(\\{d464e0a4-8798-4356-8cb1-b1b819d80d2d\\})|(\\{b4cc995f-aca5-43dc-bde2-dc5b5de620ba\\})|(\\{448b1043-fc5e-471a-8a10-5ec74fb16054\\})|(\\{becb255d-985e-4f59-9e7b-a3f678bb53ba\\})|(\\{f200084c-a7cc-46a1-a84e-289a8c033124\\})|(\\{c6b5b880-ae5e-4cad-8eaf-fce059892c0b\\})|(\\{0ea7199a-707d-457c-95d3-cc84436c5634\\})|(\\{dc702775-072a-42c4-8a7f-0e02b202a48f\\})|(\\{4a1c6922-5b77-4f07-84f7-47e504ec5249\\})|(\\{145fa75f-ba31-4f91-8664-c2559887a664\\})|(\\{b9d3f331-5a3c-494e-a0dd-5b7dc1b949b3\\})|(\\{f7801e2a-e119-434d-83c5-e87eedffecf2\\})|(\\{1b88498d-c70e-41ab-98ef-4239582e77d6\\})|(\\{b0162d70-142b-43f2-8414-30414a2b1ea0\\})|(\\{1f7166b4-c765-4129-b727-ef077814e0af\\})|(\\{ee2cd2a1-b4f8-4ef1-9fe8-db89e8844e47\\})|(\\{569c8641-f0f7-4eda-afd2-4ca6f6fc8bc9\\})|(\\{85c5a731-0b8b-4d91-bbad-07790b7a0165\\})|(\\{02197da2-c4b2-4a55-b323-f56aba8d3ed2\\})|(\\{d5250fb9-6db6-4eb3-bfe7-b8d3bf326c6e\\})|(\\{947c328f-b462-4618-bc4a-a967d1d7bc77\\})|(\\{c04bf263-7edd-481f-a3b1-0ea9d2aff14b\\})|(\\{f69637b8-b48a-46b5-b1ad-132afc1dcaa0\\})|(\\{8f2b4de9-599f-452e-9fe5-a3ea7ee2d633\\})|(\\{ebc34c54-8004-4281-8321-84145bda54ec\\})|(\\{c3f94bd2-0391-44c0-89a1-212ca3844abe\\}))$/","prefs":[],"schema":1579863851954,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611277","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2af6cf76-8f55-405b-8f5b-d784616768ba","last_modified":1579987441261},{"guid":"/^((zddx9wbjta9g23vk5ejo@zddx9wbjta9g23vk5ejo\\.com)|(\\{0629026f-e941-4a98-8975-b8cdcc20fbdc\\}))$/","prefs":[],"schema":1579796394954,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611198","why":"This add-on violates Mozilla's add-on policies by using obfuscated code and/or showing malicious behavior on third-party websites.","name":"Browser Kompatibilit\u00e4t (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d94be063-b34b-4ec1-bb02-59bc343029a4","last_modified":1579817517239},{"guid":"{c77fdf50-1880-4914-b553-6e3500f43f2e}","prefs":[],"schema":1579617431416,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610552","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Pdfviewer - tools (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cb6be8a0-0600-439e-85f1-512cc1d0e48f","last_modified":1579796394592},{"guid":"{669207af-aef4-42e5-b1fa-675995be9cf9}","prefs":[],"schema":1579604778159,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610480","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"54396dc1-f469-4a88-b0f8-352985a85b13","last_modified":1579609877650},{"guid":"/^((crisstehn@ffmust)|(jjwalter@junior)|(qlobthedark@ggmay)|(ficlever@roentgen)|(nzclever@roentgen)|(ukkinda@rottaai)|(GOEORG_RF_ANA_N@BDOFsKOKK)|(ioadjf9340joif024rf@ioadjf9340joif024rf\\.com)|(f1a1cz46o6rzl335xcrg@f1a1cz46o6rzl335xcrg\\.com)|(03t4joaijlcvjja@03t4joaijlcvjja\\.com)|(bdojfkobidjfo9e@bdojfkobidjfo9e\\.com)|(0iwtjvpvfhqyv2go1237@0iwtjvpvfhqyv2go1237\\.com)|(g68xhmxwozq8xtp4emty@g68xhmxwozq8xtp4emty\\.com)|(idyzvr0haermejvwfaqm@idyzvr0haermejvwfaqm\\.com)|(czaoyj52ki5owo07318z@czaoyj52ki5owo07318z\\.com)|(4sgly4c7s5pca7o220g0@4sgly4c7s5pca7o220g0\\.com)|(8sd351lwavakull4dcqd@8sd351lwavakull4dcqd\\.com)|(ukkindaa@rottaai)|(besth@lgimm)|(canaddxd@ptrx)|(nlextt@awes)|(bestseg@bbcd)|(swlguy@swlg)|(germctr@prx)|(pro@socialsmonetization\\.com)|(nicejohnus@lg)|(beta@lvvtqmq4qrhgmjb2zd7o\\.com)|(beta@b96mupkh82zywdrmxecz\\.com)|(dvhi19naabzond6ikvl6@dvhi19naabzond6ikvl6\\.com)|(approver@vdmqsgm5nyfiirwh8ryy\\.com))$/","prefs":[],"schema":1579603732879,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610462","why":"This add-on is violating Mozilla's add-on policies by showing malicious behavior on third-party websites.","name":"Malicious add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"448ff9b0-94eb-4d24-af8e-b56141824c80","last_modified":1579604777796},{"guid":"/^((f53pabhktayw2qusajt8@f53pabhktayw2qusajt8\\.com)|(weatherpool@bwv9ggnrvitryck9k8tf\\.com))$/","prefs":[],"schema":1579549290940,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610359","why":"These add-ons collect ancillary user data or take action on behalf of the user without consent.","name":"WeatherPool and Your Social"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"30ab36b8-c080-4ded-8531-07259112779c","last_modified":1579603732509},{"guid":"/^((\\{293476ee-263e-4cad-8dc4-2fe03209adc7\\})|(\\{622303be-705e-4247-bc2e-9016d8867e3d\\})|(\\{6ac09a19-8de3-418f-a4e1-1ee3e8810990\\}))$/","prefs":[],"schema":1579601336651,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610456","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Fake premium products"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3db3364a-0e20-4635-bc63-f2bba4a10415","last_modified":1579603732505},{"guid":"/^((\\{525f4b51-8ea1-4db8-bc81-829cf10a14a0\\})|(\\{2411143d-8afe-41ea-874d-ea4a8dc8b1c7\\}))$/","prefs":[],"schema":1579250266121,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610061","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b6f17555-93b5-4721-a92d-53500d1fe0fe","last_modified":1579530103133},{"guid":"/^((\\{5335fd1c-3baf-4578-b339-516dbdcec832\\})|(\\{1bf381aa-a819-4067-a537-eadb0d6538ba\\})|(\\{0e3703a0-46ae-4d18-bd04-8f8f570fdb77\\})|(\\{b350dc7e-cfcc-4ffe-9225-9feefe922bdb\\})|(\\{eeb3bf29-f1db-4f75-a6cb-8675ace58390\\})|(\\{9a216bb4-d664-4535-baef-ee1f4db012d2\\}))$/","prefs":[],"schema":1579191500704,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609718","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Tamo Junto Caixa"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d845bc55-9b05-4dc7-ba4a-57462a51be39","last_modified":1579250265716},{"guid":"/^((_65Members_1202@download\\.fromdoctopdf\\.com)|(_65Members_1202test@download\\.fromdoctopdf\\.com))$/","prefs":[],"schema":1579193594086,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609721","why":"This ad-don violates Mozilla's add-on policies by loading remote content into the new tab page.","name":"FromDocToPDF"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ebca1ceb-555d-4ce0-8c06-5b1475f08d45","last_modified":1579250265714},{"guid":"/^((\\{61e9b862-ef9b-4cc1-9dc2-ec00e437118c\\})|(\\{29828604-0f21-4ce2-8df7-b840aa53d713\\})|(\\{9430316a-f94c-40b6-9cea-8ac0df5c6638\\})|(\\{87ad96b4-86e8-4d94-aee1-7b607d02effb\\})|(\\{26f61847-2e07-4b10-a030-267eea1bf3b7\\})|(\\{450eb888-9bba-4de7-8821-4bb806ff82bc\\}))$/","prefs":[],"schema":1579193819569,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609365","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7e5aad13-e8ee-43bc-91fc-4805c8195f3e","last_modified":1579250265710},{"guid":"{f6766565-1c5d-4eff-bda7-20f00aaedd11}","prefs":[],"schema":1579101106448,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609550","why":"This add-on violates our policies by attempting to install other malware","name":"Fake Youtube Downloader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"21b59bc5-57db-4f31-9e18-614c03858e5c","last_modified":1579191500334},{"guid":"/^((\\{15ebdf9b-c3d7-4aee-9568-b42a11a7b071\\})|(\\{a3d09db2-d3ac-4403-9bfa-878de450fbb4\\}))$/","prefs":[],"schema":1579039175200,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609265","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake anti-malware add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2e3a3e97-c35a-4ec8-abce-a95c17d96f27","last_modified":1579039687654},{"guid":"/^((\\{976ef2b7-3bae-470e-84d9-3212d9200733\\})|(\\{d8fa8e34-e84c-4554-bfd7-16fd023b1c71\\})|(\\{d1ad5122-5caa-4986-a639-ce19bd1bc582\\})|(\\{599fb5a5-a334-4547-8a42-afccc1ddb347\\})|(\\{4bff9999-2ede-4b60-8572-a2915411abbf\\})|(\\{3a9a4c90-d87d-48e9-a799-072a7aa5be64\\})|(\\{822d29f8-9376-4da8-a7a0-4fa2eb5964c7\\})|(\\{c4926e5b-5b37-4781-87a2-28ce0b522d6b\\})|(\\{e36ea66b-30c3-481c-9e00-057b364c1c4a\\}))$/","prefs":[],"schema":1578927737593,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608886","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"361f3333-3cdf-43cd-b99e-78b666ec33ae","last_modified":1579039174816},{"guid":"{b7037d81-2c5c-4747-99e4-f4fc1c888b85}","prefs":[],"schema":1578938241613,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608887","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"RoliTrade"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bd9c30ab-d112-4f58-be0d-0e213350b6e7","last_modified":1579039174813},{"guid":"{5cc1b399-c98f-483e-9799-be29c6627246}","prefs":[],"schema":1578656865603,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608432","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Rolimons Plus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"05061ed7-378d-45a0-b105-3216c256b486","last_modified":1578927737176},{"guid":"/^((hddenobdjekcmnkgfpkodhohcjghiijm@chrome-store-foxified-1800284493)|(\\{90e41842-755d-40e0-9136-8129dd44a65c\\})|(\\{edf47ed5-7efe-4725-85d9-5e7a30d42998\\}))$/","prefs":[],"schema":1578665901864,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608433","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6975177c-1dc8-4fad-94f0-7a43ed397977","last_modified":1578927737173},{"guid":"/^((\\{3acb1e80-e126-4024-840f-3297659f9448\\})|(\\{44e3f210-6036-4364-90b9-3e8bb6fb3d98\\})|(\\{51e7e0fa-69e1-43f8-9578-d8372c2885b7\\})|(\\{1c2393b0-f2f7-497d-a34e-399dc6002d26\\})|(\\{a6a02c49-fafc-45d0-bb60-9f940a64c99a\\})|(\\{02a0090d-026a-4d02-a530-1b4d96e80c14\\})|(\\{9a988579-6773-48c2-91ab-8e917b20ab90\\})|(\\{22dfee7d-aa7c-4765-95e6-e81513cc7d37\\})|(\\{8c6d03f8-db65-4d5c-8431-ff66365847c4\\})|(\\{168b7acd-43d3-46d5-b76a-de3139dd9570\\})|(\\{abc95bbf-2548-4bf3-a0b9-9cb028496277\\})|(\\{d1282b8a-c467-4b02-9c11-e63e614ee8a8\\})|(\\{338422e6-bcf6-4171-9541-1c0f8c3dc3db\\})|(\\{10d5b345-535a-472b-8e8f-4f1a1cec9f2b\\})|(\\{64813672-8b55-4ac3-8dd2-c1da80132b77\\})|(\\{00e7df6e-7a0f-44d1-9fc1-0ddbdb473f4e\\})|(\\{564c2b95-b70b-4243-84dd-21fead791642\\})|(\\{71deda20-495f-4061-9c90-f46d1f7dfedd\\})|(\\{054d7610-9edb-47a7-af57-aed4be023015\\})|(\\{2b3f6877-99b0-4d35-8b85-9f75dd53ac92\\})|(\\{299f2568-3330-4466-8b47-4240643f8200\\})|(\\{077ead0f-8e84-4d6e-8fb1-a22126f9bf4f\\})|(\\{8ae52853-efd8-4d3d-b8f4-f70b048a389c\\})|(\\{36321783-e1c3-4f95-859a-d1c88eb75327\\})|(\\{7f878add-6b95-4b57-ab16-d8688819373a\\})|(\\{10148e15-b7f7-43bd-89c0-01957aad8188\\})|(\\{65e3540e-c3d9-4831-9dbf-598f2ef38d7f\\})|(\\{6fe77565-de36-4d06-ae30-59e3c98fc974\\})|(\\{7c79599d-ddde-4f62-9561-3c7aaea788a6\\})|(\\{d2fb1b99-98c4-48ea-ac43-8d729a1a8963\\})|(\\{38387674-fcc2-4292-a20b-08931ea0936e\\})|(\\{f00678a9-4b60-4a24-bdb0-4ce6c960cd28\\})|(\\{15d08bce-4f8a-451f-bdb5-5d1f720dde7d\\})|(\\{3a1da641-0fcc-4c06-b4b9-21d8d5dd3720\\})|(\\{6b7a8c7d-3956-4ac3-8c98-423a0bed1d75\\})|(\\{28f786b3-64a1-4152-9629-efabdede0b4c\\})|(\\{b1535617-e25a-48fe-b47d-c57affc65d5a\\})|(\\{255f303c-d5ce-47af-a925-1ad2c84c710f\\})|(\\{0ab25c60-4750-45f1-85f2-913440d6c6fc\\})|(\\{6cf0ef3e-d911-44c0-8b58-7abcb99d0243\\})|(\\{991c3933-0b3b-49f5-b3a3-1a60bf62f269\\})|(\\{bc5e31d7-42da-49c2-9624-1b4d5707b5ec\\})|(\\{8d8320f0-df3c-48f1-8839-f6969cbd3c17\\})|(\\{35f35aaa-506e-41d4-8468-3c4f4a56b434\\})|(\\{f1f6e2bb-32d1-4d79-8e5a-659e5af15b78\\})|(\\{1109f231-559f-44dd-bd84-85fac05f845b\\})|(\\{b6111372-b58f-4130-a6ae-a1445a196d85\\})|(\\{b21099c0-e496-443b-8d43-610a9aae60fb\\})|(\\{d8a40da5-bbca-417e-9ea5-e77332739366\\})|(\\{5dcaea9a-e152-4667-a4d5-b29f5afe9e61\\})|(\\{98b95d2a-1de8-4234-a73f-568531785850\\})|(\\{b11ad72d-2f64-4494-9f5e-6ad2e36bfc16\\})|(\\{3503a09e-76e5-4fba-8d65-d8bbb198b2c1\\})|(\\{f45fac5e-f3b0-4932-8c8b-254c6dcd3219\\})|(\\{4210d4ec-9e2a-40d1-83de-53a9728c01d5\\})|(\\{10691e9c-7399-4fb2-b824-256ed6c8c08e\\})|(\\{148338c2-ee0d-4659-baed-5b9aca28407f\\})|(\\{f3a2a32b-ec49-4fc5-bb46-f00f86d4cbff\\})|(\\{425bd894-b282-4a58-a2d0-3054fe3fd856\\})|(\\{7ccc3a62-7f92-4a1e-8e32-af734721a136\\})|(\\{91c939ae-00db-400d-a814-a964dc85fcf8\\})|(\\{83fdf43f-c064-4ae0-ac5f-6668fca576b0\\})|(\\{824f975f-a740-47d5-b4c8-0868fdcb154f\\})|(\\{2404f236-28ae-4852-b50d-50e66312f69f\\})|(\\{3f307709-bdf8-4dc5-afd7-4aaeb2a85176\\})|(\\{24f3c174-f09b-41fe-8c26-dfc051b2f352\\})|(\\{ecb81864-05bd-45f9-a1a3-5f56ad62c1c0\\})|(\\{fecad0e5-5f8c-4539-8893-9a4c9e4ab567\\})|(\\{03badfb9-bba5-4a3b-ae1e-0bde1bef38f3\\})|(\\{1f2defb6-af80-4822-b1d2-816c0575dd8b\\})|(\\{195450ff-844e-4ec7-b111-166c28e54b6b\\})|(\\{abd20b0f-3f79-4cdd-b2f7-6ed4f9a3e546\\})|(\\{b1a2d328-e1bc-46b5-b6d3-d4c5366a6262\\})|(\\{49d113aa-c37c-4a49-b73e-69eaaaec519d\\})|(\\{f9fe81b9-29be-4e30-ba7e-821e96b74c00\\})|(\\{c47a57e5-9486-4b58-b4e9-2e49e02c39df\\})|(\\{48aecb91-709c-4660-b0f8-681c177628bb\\})|(\\{0033af2c-0017-4237-821d-24e1ce20ed20\\})|(\\{d95d2ab6-2728-4d89-b4f2-74fc3abcfe26\\})|(\\{813bec70-cac2-497b-9117-8873b5e33cbc\\})|(\\{b613e7fc-3274-4874-b59c-b2afaaba60b5\\})|(\\{f88e19b5-9434-455a-a2bf-de13250a642b\\})|(\\{562fec92-ba72-4461-a73b-48b0cc87c943\\})|(\\{c8d2d52a-5617-420e-9568-983c0c7a6982\\})|(\\{7e32bebe-f9ef-4328-a4f8-7a86afdb9568\\})|(\\{b95fa449-7f1d-44dd-84c7-65565334d1e1\\})|(\\{788d6386-606f-45fb-83a6-af4956d9aa11\\})|(\\{00a646ad-3d34-4ca9-9633-9ea96be7a225\\})|(\\{a745c5df-b386-4906-80ba-ec9b6aa6b37a\\})|(\\{a3b508d5-864d-43c5-a4ec-9d5523cd01a6\\})|(\\{4e945e2a-b553-45e6-8dcb-495c60a663a0\\})|(\\{1a6ea1a0-1a2a-4a57-91c8-07cb629588ce\\})|(\\{20ef853f-2c16-496c-bcd2-5109a7a1be59\\})|(\\{cb5604d4-d166-4060-978e-1c7ddfda4a94\\})|(\\{9207a89d-db88-4ef1-bf2e-a89c12d882fa\\})|(\\{f561afa7-165c-45c5-beef-754e16b40794\\})|(\\{09021ead-28e3-415a-8f9d-ed250954147c\\})|(\\{1d6ef53c-0407-4eb6-aa80-b672788f9d0a\\}))$/","prefs":[],"schema":1578858092043,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608815","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"2Ring"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1491ea56-7723-431d-be05-5808a3101bf5","last_modified":1578927737169},{"guid":"/^((\\{2b046d1e-b392-4073-ad8d-bb882b073be0\\})|(\\{69a8db6c-b55c-4560-bfa7-edf21ed9f265\\})|(\\{d41d46ca-a557-48df-a951-e968a1168137\\})|(\\{845d89e8-e3c0-4447-ad36-9fcba4d3d28c\\})|(\\{da572bae-f959-4f9d-aade-afda00b83e2b\\})|(\\{fe334432-8ba6-4444-8cf9-1bb59c308aa0\\})|(\\{b8242421-8cd0-4064-a6e8-bbfdd62d67fa\\})|(\\{7d863da3-4f8f-4b2c-87cf-5bc7a03b24c8\\})|(\\{fc53c14b-9bdf-4a0b-9f07-421109bcab31\\})|(\\{7771103f-bf4a-4757-b679-2ec30eae8cfb\\})|(\\{66196147-9b28-4050-a46c-c9bf668511d2\\})|(\\{a41db617-17b7-429d-b135-5fd5d54b9ad6\\})|(\\{aa0e1b27-728c-4e45-9b7e-7731e8d6451f\\})|(\\{6e12cb13-d166-47e9-b1a6-ce980e1489bb\\})|(\\{3b3e3db5-2710-4bfd-bce8-bf3a1b5e0bc0\\})|(\\{3e4763fc-2175-4a69-9854-f437774da824\\})|(\\{63708597-3f14-494c-981c-bbecb10fddcc\\})|(\\{ec2c5f61-37e6-49dd-a430-6f0060f6e152\\})|(\\{8eb7ade7-96d3-4be9-b20e-f321fe07c9ec\\})|(\\{b9b60c96-b158-495b-87ab-db97fe2aecac\\})|(\\{5d885234-3fff-4c81-bfe0-7e01ca9701f1\\})|(\\{79cb8cb6-a0fe-434f-a6d6-2af167fbb069\\})|(\\{ec41b4cb-5c60-471f-a68a-d52e91f54292\\})|(\\{fc64c6fc-4356-42e4-8253-75facb478836\\})|(\\{d68b6b30-81e6-450b-aa7d-b0e3f1b11e2e\\})|(\\{6E01B689-3E52-44B7-A33A-197C48498C0D\\})|(\\{D4EE626F-0BE2-4CE3-B635-11498D2EAF24\\})|(\\{bea54a21-f8e6-4a47-a739-84aa5a03a391\\})|(\\{57FE0157-8BDB-4C11-BCD6-6654E0C1AE3D\\})|(\\{8B8E2B7E-7DBE-4EDD-ADA1-8AA93098E3F3\\})|(\\{66c281ce-2682-4182-91da-6d3742ce9a9a\\}))$/","prefs":[],"schema":1578922331209,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608815","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"2Ring"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d8ef0aae-2659-4076-be2a-ef0cf0388c49","last_modified":1578927737166},{"guid":"/^((\\{d26e41d8-8dfa-4a08-ad90-6df0240c8290\\})|(\\{9ee44d55-47d9-45bb-b56c-79ab2fecd93e\\}))$/","prefs":[],"schema":1578582285426,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608291","why":"This add-on violates Mozilla's add-on policies by executing remote code and/or collecting user data without disclosure or consent.","name":"Converto Wiz Ads Search & PDF Converter HD Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0c502c85-3f2d-4a3b-9abf-249eff0968f0","last_modified":1578656865193},{"guid":"/^((browser-safety@browser-safety\\.org)|(facebook-bookmark-manager@fbtools\\.io)|(facebook-video-downloader@fbtools\\.io)|(extensiondist@browser-safety\\.org)|(selfdestroyingcookies@dirtylittlehelpers\\.com)|(googlenotrackpro@dirtylittlehelpers\\.com)|(youtubemp3@yttools\\.io)|(youtubeadblockerpro@yttools\\.io)|(videodownloaderpro@dirtylittlehelpers\\.com)|(simplysearchpro@dirtylittlehelpers\\.com))$/","prefs":[],"schema":1578653962604,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608387","why":"This add-on has been blocked by Mozilla.","name":"Several add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6368943f-3d77-491c-82bc-f29591e170d6","last_modified":1578656865190},{"guid":"/^((\\{1c1a344c-b8d3-4783-ac5b-9a9d241c29b6\\})|(\\{a4fccc0e-a372-4127-983e-c0f607427a89\\})|(\\{275f2631-9a1b-4ab3-8c6a-4529ecd8512b\\})|(\\{0b1104bc-8ec5-437e-9d81-2cc641cbe8c6\\})|(\\{4e373c31-1942-4c9d-93b3-38b0ad701f27\\})|(\\{7f1af5f0-b450-44f2-aa5f-bc4c793553db\\})|(\\{68c84054-b43a-4a78-bb35-27ec06974d1d\\})|(\\{f959a2e9-f211-424b-b0cd-ea7ecf269753\\})|(\\{fef99996-e542-45b6-b383-86132e67a93f\\})|(\\{c1bd56b2-4b48-4366-8d04-16a0f69f7b4b\\})|(\\{17456fc3-4777-484a-b177-9b82752a738e\\})|(\\{9c746226-1a87-49e2-a083-725c5fc10885\\})|(\\{3056ec65-736e-4a77-abf7-9d0b44ba0b74\\})|(support@seovpn\\.net)|(\\{fbb6a675-8923-40da-86cc-a547eae63594\\})|(\\{bf9abe9d-4589-41f2-acd4-e5dd9d4a4595\\})|(\\{d012bf08-e9b1-43a2-b6b4-b60c0fdd6fb7\\})|(\\{0cc696dc-6214-406f-8831-1d0ae14c2eed\\})|(\\{39ef127b-a7c5-4cf6-8383-333ce2300707\\})|(\\{77af48b1-2786-430a-a2f8-f0e666ecdb86\\})|(\\{9807c7c0-0d7b-4ee9-b39e-4a2b10f74b74\\})|(\\{21ceb717-4e26-4843-9229-b0a55c629c6b\\})|(\\{ba87282f-fb6a-464b-b2b4-18ab718a6b9e\\})|(\\{f844e48e-929c-4dc7-8224-c829b67d453f\\})|(\\{2af80abc-e031-42c6-b800-02dd4dade3bc\\})|(\\{849583eb-dd9d-424e-af82-d64205b79bb2\\})|(\\{8d8963e3-810b-4e72-85d9-d6e8affbe8e1\\})|(\\{aa385b5c-14b4-4d2a-ad81-db3cd054efe6\\})|(\\{c30a6fea-44b9-4f3e-945a-401485d7e152\\})|(\\{327735cb-5842-4296-a8c9-660118c9dbe8\\})|(\\{2809097a-41e3-468b-9c33-2ce449bc18f9\\})|(\\{91b36c25-1dd4-4a1c-a722-a1868deed9a1\\})|(\\{3b61770f-a22e-4704-be5b-310a729e6652\\})|(\\{b1741149-382d-447a-b8fe-bd2dbf03b252\\})|(\\{8a5d399d-3716-4627-ad97-750cd10783e6\\})|(\\{a1bb458d-6a71-4efb-a032-04f44f638a0d\\})|(\\{8a86326c-5b59-4c87-af77-becea91bdc7f\\})|(\\{21b022a6-b739-4787-a071-268f45bd4f0f\\})|(\\{59e225c1-5a78-40b4-bb6a-9cd783eea9fd\\})|(\\{d0ba8c04-3d8d-4c87-8eec-355d3c1dbc57\\})|(\\{d0b408ae-c1b4-45b1-8d0f-5a9135dab115\\})|(\\{c802afcc-8fb2-410c-a50b-0dfc4e502364\\})|(\\{8ef92c49-fe9b-4354-b943-8fbce6156ab5\\})|(\\{40d41864-a14a-45e9-bc75-ff95189975cc\\})|(\\{b5f5f423-85e5-4641-8517-2549ef2597ff\\})|(\\{bd4e3180-94a8-4d2a-9186-b15ccbca2abb\\})|(\\{1099ff05-78d0-4a0f-a348-0e60d8e627f3\\})|(\\{9d7450f3-9f39-4dda-820b-ac50797229a5\\})|(\\{9762a546-d483-4d82-9e97-e8293b67ab3b\\})|(\\{233e675a-f2e9-494e-a62a-56a8e75440d1\\})|(\\{44b31737-7370-41ad-9a16-7e92f993d651\\})|(\\{5e8c48e7-43a3-4f5c-8f61-018e994ed581\\})|(\\{cabb5a82-b018-40eb-b551-08b7c6b28d25\\})|(\\{19c2d564-4774-4b52-b175-0d9a674a1ee7\\})|(\\{4d6bc7a3-8d17-44d9-a1c9-34b6c72d2a82\\})|(lin\\.Vin@userx\\.com)|(\\{a74a99d0-f5ac-4775-8af5-ad48341865de\\})|(\\{b8331308-eaa2-40ca-94e3-d5184b9555ab\\})|(\\{43a11cab-4d48-468d-88ac-6632c2b90f0a\\})|(\\{13fde54f-87aa-4966-801b-189946617b03\\})|(\\{051e900e-73a7-42e9-bf92-54a05b592814\\})|(\\{389a79d4-7af9-4c22-8e3f-0a424a9d16a6\\})|(\\{d80ce712-fad0-470f-bb42-7f0f5d10ac66\\})|(\\{b08e2ddf-304e-4336-b7b8-15698239be1a\\})|(\\{5bdae4dc-1859-4766-97c6-5d4b7d5ccb68\\})|(\\{a8b80325-5125-4d50-95b8-e3548eca99f9\\})|(\\{16f5bfef-6792-48da-9458-c15a904a3202\\})|(\\{821251e6-48aa-4eee-aca2-d2003047eba7\\})|(\\{e4d3e60e-2980-4899-aaa5-aa2c8571e8af\\})|(\\{00bde975-f669-4fef-aca4-de3335e5e629\\})|(\\{815e064e-df14-440a-a9c7-6191d47f302d\\})|(\\{12267241-c4e5-49b7-afc0-1ba02cd86146\\})|(\\{1461d5d5-0180-4e5c-870c-1648fd13eb3d\\})|(\\{09f52a46-5e5e-4bb7-92e4-5a802ba2dc65\\})|(\\{89fd7bd0-b6cf-49cb-981d-6eaa3515e09e\\})|(\\{309cf23f-2ca7-4308-9c31-03ef0cf0e8df\\})|(\\{604184f4-c000-4071-8b27-ae7c191dd575\\})|(\\{45c9a869-b55f-4792-aefd-e353229b48f1\\})|(\\{1b7f62a2-5dfb-4a7c-8613-a2333ae83337\\})|(\\{6e7e98a6-d7e7-4319-92bf-283cdcbf06b0\\})|(\\{2e60f9f6-f57f-46e5-9876-b50f84154a04\\})|(ali_nasiri@mefa\\.com)|(\\{d7909c43-9b01-44e8-aec2-d569a3461183\\})|(\\{d64d110d-2783-4663-b533-036338b0fabc\\})|(\\{8c5a0a9e-480c-4571-acb3-602cb081f9b9\\})|(\\{1efb16f1-34cb-4179-b27b-301f1a8d023a\\})|(ali@mefa\\.com)|(nasiri@mefa\\.com)|(nasiri_ali@mefa\\.com)|(\\{de57334f-24fb-4b0d-9087-d2945212ba76\\})|(\\{e45a208c-582f-4549-8c39-3e3b6c3f503d\\})|(\\{7cf37c0c-5cf2-4945-8c82-ffd5a1206abb\\})|(\\{aea2f3bb-b278-4ab3-a2b1-370b74a2795d\\})|(\\{c0d80342-fa84-4366-90d5-0d2c965a6c71\\})|(\\{e7953669-b2cb-49bf-8f53-9b2cedbe4df7\\})|(\\{0f5248f4-bb0b-41ee-9162-397ac92538c8\\})|(\\{f2a73021-b834-410c-95c9-6e9e826c5523\\})|(\\{ac9759e0-3657-40c0-8da8-aa83b2df14e1\\})|(\\{AABB3453-4EAC-421A-34FA-4789107489AE\\})|(\\{e471c14f-775a-474c-afde-e2562f35a1ee\\})|(\\{8a420af6-7de8-4d13-bc74-1b90e3a7c45e\\}))$/","prefs":[],"schema":1578325482610,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1607277","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"87a59976-a41c-48e0-a05f-b00ceddc3990","last_modified":1578409770946},{"guid":"/^((\\{29e8ec68-5717-4d25-8465-c8ad11c2493e\\})|(\\{1807ab11-ce49-47e8-b29f-2c7f3b27957c\\})|(\\{d497ce7b-9308-4a00-81c8-f1e20769d9f4\\})|(\\{3e2a7fe2-d800-4300-adbc-85d45101ccbb\\})|(\\{41a6db99-eb5a-436f-add8-6655030cd3c4\\})|(\\{d0041bb0-914b-4105-8335-f19dfe4000c5\\})|(\\{16c0318f-441f-4996-9420-9582cd8dc4a8\\})|(\\{11560f98-1a72-428e-901d-19eee028703d\\})|(\\{200fc207-8d2d-491f-a14d-898c2af6005c\\})|(\\{6098201e-19fe-4930-8235-507abc271c92\\})|(\\{47247604-b3df-42ef-a7d6-e6f54f3ed34d\\})|(\\{d9e45250-0a78-4fad-bda9-435289e1117d\\})|(\\{7897756a-f527-42fc-8327-23afa5a73037\\})|(\\{ebb45fe8-b626-4d4a-9b51-4c61be7d8ec8\\})|(\\{17a3a525-b5e9-4bdf-9f2f-0a6b82489261\\})|(\\{7d5e14ab-7973-45ee-9b5e-fb2af9105a58\\})|(\\{3db27392-c030-4b1d-a461-df246030e8ed\\})|(\\{687dbc1c-4640-420e-b5e0-69ffbff851a4\\})|(\\{99f71699-61a0-407e-9a1e-4f7f2b24032e\\})|(\\{9608a917-807d-426d-8b3d-4bd8e6669d3c\\})|(\\{6d0d1145-1b99-4c1b-9112-a0698ce1ad93\\})|(\\{02373fa8-bfe0-4f6d-bf65-cf843ae16ca9\\})|(\\{76e05242-0ea0-47dc-99ab-85a5768d24ee\\})|(\\{b2671579-9ae7-4e10-9aad-e484189f2599\\})|(\\{f8574a50-a306-455d-96b3-9a95590e3351\\})|(\\{d2a79680-fab2-40d5-93c7-3842a3c7a170\\})|(\\{6d3d4ff6-42b4-4ae6-8273-e55309e194ef\\})|(\\{e26d666b-5437-4b51-9a35-6a32ef2ebc93\\})|(\\{1d1e0112-694e-499e-9a6f-fd4fdd8a0400\\})|(\\{8fef18c6-29cc-44db-a373-2476eaa98d07\\})|(\\{bca08103-f769-42c1-9e83-c3dac1d073e5\\})|(\\{9be3ea2f-3def-4ace-a4ca-a36bd350ebe3\\})|(\\{e4a7d768-fe07-4b2d-8722-782ecd2d857d\\})|(\\{ed0bae9a-6c29-4615-b7b0-8134008f866d\\})|(\\{6a230256-13ad-4912-88fb-35dfe6fc8405\\})|(\\{f33c98b2-f1fb-4e82-a472-b27aa763b697\\})|(\\{692d8158-fc1a-43b9-901c-9211c5f00129\\})|(\\{f43b5702-0a0d-4f50-a012-a9fa25d19ac4\\})|(\\{e5d75e88-cd31-492b-a63c-ab6759658d4f\\})|(\\{706dac82-d1ce-43b6-81fd-77652fad15a9\\})|(\\{8c403e0e-104d-46ec-8355-5b7d57d35e6b\\})|(\\{c5a32b03-4044-4085-91d8-af1d688c0c66\\})|(\\{76e7835b-8600-473e-870f-aa1e9ac922de\\})|(amz@userx\\.com)|(\\{d2b50060-69cd-422b-bc5a-77590580adfa\\})|(\\{e9d1c5e0-e297-439d-a536-efd94b0baa06\\})|(\\{80816d1d-664a-4710-915a-99c298970b38\\})|(\\{3cf55a2e-ab5b-4a2a-8b5a-0760f46ffcc1\\})|(\\{be762a22-7fcf-4c67-a8e4-7f2b085a9f50\\})|(\\{2df2d33c-e1fb-4eeb-b276-a84bd3338e0f\\})|(\\{133ce0f4-83f3-4fec-b672-0067748ccf1f\\})|(\\{b575f7f6-5afe-40f8-8bb3-92c0ca24371f\\})|(\\{d514a041-1260-4512-9759-55c30b63bc20\\})|(\\{4129ed8c-e3ad-4e88-832e-66314cf44268\\})|(\\{9e97ac90-9eb9-429f-99f5-d61f60052068\\})|(\\{3366bcb1-8b0d-4451-9c1b-cf8aeb8e5df0\\})|(\\{3d06b84f-0b8b-4a7b-9a55-22c226c85a55\\})|(\\{e2f8e0bc-62bf-40f4-9dcd-3379a64db2bf\\})|(\\{3e998c2a-c05c-4445-9567-7a1948077970\\})|(\\{51cefcff-f7a1-4c57-b6bc-bad9fc9f275d\\})|(\\{84d6d305-ccc0-4879-b80f-708318ebcaa6\\})|(\\{05a2137a-9dde-476d-a63e-d80400d6bf36\\})|(\\{c2627d22-c3cc-4c5a-a69a-eca6cfe9ac90\\})|(\\{3cfe4756-4994-4c92-a97b-adc57243a277\\})|(\\{5a05e509-59a9-4358-b994-a062d97a7d0f\\})|(\\{791bc86d-dae4-45d5-957c-fe56843770f3\\})|(\\{8976df61-4480-4d4d-bfd1-2e9d0635eaa8\\})|(\\{f4ee4889-fed0-4598-a8b2-c3e224250d82\\})|(\\{e26b2735-47b6-4239-a3d2-0e4ca4293076\\})|(\\{ae9589dd-3141-47d1-9449-8e719044ff92\\})|(\\{ff18147b-3853-4938-b15f-241d99f4e590\\})|(\\{758126c6-d156-4eed-8870-477eefb17281\\})|(ella@fmt-tools\\.com)|(\\{e4df007c-60db-418b-97f3-d7896c441515\\})|(\\{90e41842-755d-40e0-9136-8129df55a65c\\})|(\\{faeee13b-39fb-49dd-82c5-47604a2e2e9a\\})|(\\{c3583bcf-271e-4b41-8207-32bd3db491a0\\})|(\\{cbe6f8d9-bd60-4f27-acd1-388a976e3749\\})|(\\{18be83e0-4bc9-469a-bde5-cc671acb022b\\})|(\\{97152370-246f-4059-999d-92f26f358e71\\})|(\\{8a975636-e12e-4532-ad35-9d9e691a246d\\})|(\\{3eb5ea84-a445-4dab-8074-d29dbf4e66f0\\})|(\\{f19cf85e-47ea-446b-808d-38f4010594b3\\})|(\\{b28a1358-5cdc-442e-b851-613bdf118320\\})|(\\{90f0ad05-0267-4ea6-9809-1098ec724905\\})|(\\{d18372a9-89d9-4799-87f1-ccd4cfac80d4\\})|(\\{d18372a9-89d9-4799-87f1-ccd4cfac80d5\\})|(\\{4625fcb8-6b60-49e7-9447-31cb1e2a2d59\\})|(\\{7dc2d526-d11b-4e6f-9301-a4bc620f5838\\})|(\\{d763ea47-6889-4e23-9b6c-ac56087c96a7\\})|(\\{3c7f00c4-4e4a-411b-960a-4ce782ece6c9\\})|(\\{8c1db2e7-c550-4d76-8009-ad9fca9c0813\\})|(\\{0b23f4db-0f49-44b7-9d27-b424ba9f6d62\\})|(\\{d798f753-a0e4-4d8b-866b-3b817b7b6d25\\})|(\\{e3d7ec01-ada7-4330-899b-bce60c64471b\\})|(\\{3a210e15-601e-4204-8690-cb05ed14019d\\})|(\\{51226db3-500d-45d1-bbc3-a9bf560caf39\\})|(\\{0aa6f915-ed71-4de8-aaeb-63f799d83af7\\})|(\\{3d46809c-6c20-469c-a608-3ece3121da4a\\}))$/","prefs":[],"schema":1578335483666,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1607277","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0bb0f9b4-6807-4642-9199-026411426eb2","last_modified":1578409770942},{"guid":"/^((\\{af51d321-202e-49af-9a3c-78a5ebb22b63\\})|(\\{749b293a-1e19-494b-8a3a-cb79d5464226\\})|(\\{fbe6ff3f-2675-466a-916e-352080c27adb\\})|(\\{ad0378a7-5153-4e6d-999c-6c8e49868293\\})|(\\{2f7de182-3427-4386-a880-c601050580ab\\})|(\\{99bad30d-3792-4a03-ab9d-8e88f5f1cccf\\})|(\\{475b8326-3218-492c-b4c3-32307053c21a\\})|(\\{18571b27-500b-4604-a4ea-e0e7d8b61ce6\\})|(\\{fad11a52-2f9a-4d89-b712-f61184d756e7\\})|(\\{113c9d19-e80a-4c72-9a23-58f7b08144cf\\})|(\\{a0b384d9-c275-4670-a4be-8b0be45d562e\\})|(\\{19bac525-be97-4470-b76a-c24168d5e6e8\\})|(\\{2a40afd4-e56b-425b-bff2-62f190d80fac\\})|(\\{cbc65b60-2350-4b7f-8c83-1b9182a56430\\})|(\\{6adb7178-1105-46e6-9a4d-1824385cef5d\\})|(\\{6d46665c-4708-495d-a929-096ea137a08d\\})|(\\{fd6273bc-3b55-4bf0-872c-146b3feb73f9\\})|(\\{707783a0-6669-4e1f-8036-53f5c936304b\\})|(\\{7086907a-f6fd-46f4-b51c-a7dd2b10509c\\})|(\\{0ed69e4f-6cec-4bfa-9004-076ebd0be34f\\})|(\\{d051ddb8-1de2-403c-84d2-afd96a3f4550\\})|(\\{52699f66-62fe-4970-83eb-5ad82bf72497\\})|(\\{6c32d68b-4866-4277-b454-d824a3a3209c\\})|(\\{d608864f-5573-47eb-a2d7-46d158ee3fa7\\})|(\\{38c59c7e-bc02-4e7f-89ea-c4d9555362c6\\})|(\\{981a212a-52b0-4413-976c-a4730f1df128\\})|(\\{06e004dc-40a8-4123-addc-c6b6eb5234c7\\})|(\\{c87d86f9-d5df-4a24-9fe0-dd39232e4d88\\})|(\\{86baf51d-21b6-456e-889b-c7d96ba2fd63\\})|(\\{db83a6c1-efb7-45a1-b074-8e3e5a53793e\\})|(\\{70c00ae0-5b15-4ee8-99f9-23d85c63c07e\\})|(\\{ff72e707-d6e2-446f-a760-6ff187f107c9\\})|(\\{6f65c53b-596f-4238-afa2-347150b3ada3\\})|(\\{95da423e-90ec-43d9-b5c8-e195bff7b432\\})|(\\{4a792129-a244-4a39-a416-ce4f7743918f\\})|(\\{d69204d4-610c-4144-9d26-8cf8b2ad6e16\\})|(\\{49242aa4-83ba-4e25-a827-4d1ec86972a8\\})|(\\{d69204d4-610c-4144-9d26-8cf8b2ad6e19\\})|(\\{3505b15c-533a-4c2e-9065-6d7b2381a7f9\\})|(\\{07daa733-944d-4b0b-9bce-01638b9d9b42\\})|(\\{ebb69cbc-b69f-4d3d-a676-83811a061baa\\})|(\\{f9327eb7-2532-4e45-a551-a9f8233e4ef7\\})|(\\{4fcb9938-6716-46ce-8107-73f3cc7b3900\\})|(\\{cee1ccee-5508-4927-a939-9a557e63bbc8\\})|(\\{c6973149-51bd-443a-898c-e4b26d4ee44b\\})|(@mouselessjj)|(\\{39772968-f7e5-4a84-87d2-adcd2d032c69\\})|(\\{3ba568f0-bb3a-4744-b64f-46c428f3bd99\\})|(benalio@gmail\\.com)|(\\{70c50468-54be-4d7c-b1b4-b7378d0ff45d\\})|(\\{f77c3471-806a-40d6-9fdc-7df832f7ae74\\})|(\\{cf660d66-4aac-461b-a05f-b71b62f549c6\\})|(\\{1c58ca6f-91ad-4423-b8bd-f5323df92eb3\\})|(\\{1a393581-d6ce-454f-a503-8a321ba0f022\\}))$/","prefs":[],"schema":1578339693692,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1607422","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"18cdf7c5-6650-46d5-a536-364ce9dcfa92","last_modified":1578409770937},{"guid":"/^((pro@affiliatebrowserguard\\.com)|(beta@affiliatebrowserguard\\.com))$/","prefs":[],"schema":1578394762485,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1607211","why":"This add-on violates Mozilla's add-on policies by redirecting requests without user consent or control.","name":"Affiliate Browser Guard"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c8aa2f43-2c48-4628-af4f-0987125d0441","last_modified":1578409770930},{"guid":"/^((@adultdownloader)|(\\{6391a084-dd1c-41b8-aefb-ce207da8bf21\\})|(\\{19e997bc-8449-4ab3-b4f2-f24db1053fa9\\})|(\\{e65a0802-7bbd-4c83-9bec-50ec16dadcdf\\})|(\\{6928cfc2-eda9-4971-8d8c-de26747c27ea\\})|(\\{93c15410-f7c9-41a7-a13d-28dba750f15e\\})|(\\{d7c369d6-74e2-4da7-8eef-dc134914facb\\})|(\\{e3109828-453d-4fc1-8019-488f891720d5\\})|(\\{d825dcfa-4340-4330-b4e7-b208439ee961\\})|(\\{8e7d2b8c-6167-496d-8e4c-45d9040a4a7a\\})|(\\{62935c48-c7bb-4a6c-a1b0-449fdc8737c0\\}))$/","prefs":[],"schema":1578166891954,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1605959","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c086bfd7-15ff-41eb-ac43-d84e95606eec","last_modified":1578325482223},{"guid":"/^((\\{943773bb-c8a8-4576-bf3a-7cacca534887\\})|(\\{0afab6d1-c267-4ff6-9289-4a2b2ad78f33\\})|(\\{4278c56e-7b67-43ab-8c87-f68a6a883df6\\})|(\\{f146cde8-6dcf-4ebf-9d67-b7eccc9bc8a6\\})|(\\{d0e43d96-0e73-48d7-9a60-b235022f4330\\})|(\\{a94ed9b8-24a6-4719-97af-08eaac91a42b\\})|(\\{d62ca114-0f4e-4d25-813e-292d0c682e05\\})|(\\{908b1c05-3766-45e1-b56b-f0b4457c6451\\})|(\\{068054b5-46c0-47c2-be37-dd015fb1c050\\})|(\\{1c1cde54-c8e9-4c61-a2be-30411888ac8a\\})|(\\{b06648df-3c80-49e8-9d9e-71741ba28c72\\})|(\\{a085da90-cc10-4c26-954e-ae4eb773c6d7\\})|(\\{1d53aa0d-eca3-4bb1-947c-aebfdd0770fd\\})|(\\{83ebd575-b66b-4b02-a628-d2764194d0a6\\})|(\\{fd5f7e74-2e60-454b-b702-05e9d66b334b\\})|(\\{fdd2f5a3-9061-4fc8-87d2-cf7f7668d336\\})|(\\{f890d432-ce0b-4857-b030-dc36fc791423\\})|(\\{d5b4e84c-7991-4be5-9c26-c3e92ba0901a\\})|(\\{8d54459a-34cb-461f-b1fe-2266484cc098\\})|(\\{67b21df3-a1da-48ee-aee8-18ae8ad7fe21\\})|(\\{18feff20-5892-43cd-8606-83e8e7c33ebd\\})|(\\{554e901f-5476-4fad-8714-a08b8249068b\\})|(\\{248c9c9f-404d-4284-bd12-2fa988edb0ad\\})|(\\{9c347568-2528-4dea-8a0d-6e9fa7f88512\\})|(\\{0447e445-abb9-450b-b12c-de16fa40e176\\})|(\\{3015019d-1c2f-4310-adf1-1b33c4566d9e\\})|(\\{a3aca1ed-74b4-46d4-9c73-ca9ba8c91ac6\\})|(\\{7b2aabfa-673f-4afb-9cba-7a9329a24d79\\}))$/","prefs":[],"schema":1578083875760,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1606925","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"New Tab add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"de533f3a-d0e3-4704-916e-fd2a297cee93","last_modified":1578084466436},{"guid":"/^((\\{a91c41b7-4196-4867-84b4-d417a1b10da2\\})|(\\{e3d3ea5c-c8c0-4c9e-89c6-f6b5677186cc\\})|(\\{fa3b6777-4f64-476c-9ace-a79709ccd0a6\\})|(\\{6251b844-0c54-44bc-8c5e-891e3ba86c2e\\})|(\\{8e588566-afb2-4612-a420-3e3bd18693e7\\})|(\\{a0bf35ec-76cc-4d86-875b-09d46e8790c2\\})|(\\{fd257beb-d772-4333-9901-dc5913aee499\\})|(\\{a9acb248-93fb-4081-9d88-92468f229842\\})|(\\{7e1b62bc-3ab4-4c4d-8182-b095a492eab4\\}))$/","prefs":[],"schema":1577994095119,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1606132","why":"This add-on violates Mozilla's add-on policies by using obfuscated code and/or executing remote code.","name":"CodeScript and WorldScript"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3d3f2971-9764-4b6d-94ef-2a0b97da7619","last_modified":1578066343576},{"guid":"@mendeleyimporter","prefs":[],"schema":1576845976756,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600910","why":"The add-on does not comply with Mozilla's requests to provide reviewable source code and is suspected to violate Mozilla's add-on policies by collecting data without disclosure or consent.","name":"Mendeley Importer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e028ecb3-be1e-48fb-9681-9c04ff7fad3d","last_modified":1576881756956},{"guid":"s3firefox@translator","prefs":[],"schema":1576845555478,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1605007","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"S3.Translator \u2013 s3firefox@translator"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"31a14241-2af8-4ec8-b597-d5c3ebedc30c","last_modified":1576845976374},{"guid":"/^((\\{cee1ccee-5503-4927-a923-9a557e63bbc8\\})|(\\{8a84b40d-84a4-40d6-96de-c504a4fcd114\\}))$/","prefs":[],"schema":1576784492013,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1605289","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Adobe Flash Player"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d940ce81-7ac8-4741-9fc8-2699cb92d4ef","last_modified":1576845555097},{"guid":"/^((therill@mozilla\\.com)|(Updates@mozilla\\.com))$/","prefs":[],"schema":1576756361317,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1480591","why":"These add-ons violate the no-surprises and user-control policy.","name":"Search engine hijacking malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e235a161-aaa1-4afd-8e9b-61ab2aeaf82e","last_modified":1576771657205},{"guid":"/^((\\{5620c992-8683-4ce1-b19d-3633b4c28bd0\\})|(\\{cbc29a75-5858-4b7b-98e4-c813a4e6a085\\})|(\\{4cf619a8-2de2-41cb-bf23-dfa52e4e7d5a\\})|(\\{3b013e48-d683-45ed-8715-a6ece06f0753\\})|(\\{9834ff7f-e3ea-485a-b861-801a2e33f822\\}))$/","prefs":[],"schema":1576756618517,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554606","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Various remote script injection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7c324513-5792-495d-a389-d7527a0433b2","last_modified":1576771657202},{"guid":"/^((\\{ab70d6ee-9d0a-4349-919f-2e3c9aa77927\\})|(\\{fe94f94a-75ff-48a9-9cab-03e626e30352\\})|(\\{085590fa-c340-423d-9b45-d8e963349513\\})|(\\{c06005f4-a53f-4503-b631-9c6fbea45e9e\\})|(\\{a1904bba-73b5-4fab-8556-95fdf0200c19\\})|(\\{4548ed4c-964e-4a53-acec-b24f5b9ea6a6\\})|(\\{99d68c16-4f64-463a-ad09-470a5ac07981\\})|(\\{14338345-a844-4c6e-9fca-d200a93f1d9b\\})|(\\{2bc78397-6bd3-4a2f-a737-dbc639ee9940\\}))$/","prefs":[],"schema":1576756684025,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1565184","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Private Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"92cedc61-c6c7-485e-98b0-a03c71eb2c5a","last_modified":1576771657198},{"guid":"/^((application@uk-manulap\\.com)|(application@uk-misafou\\.com)|(application@uk-nedmaf\\.com)|(application@uk-optalme\\.com)|(application@uk-plifacil\\.com)|(application@uk-poulilax\\.com)|(application@uk-rastafroc\\.com)|(application@uk-ruflec\\.com)|(application@uk-sabrelpt\\.com)|(application@uk-sqadipt\\.com)|(application@uk-tetsop\\.com)|(application@uk-ustif\\.com)|(application@uk-vomesq\\.com)|(application@uk-vrinotd\\.com)|(application@us-estuky\\.com)|(application@us-lesgsyo\\.com)|(applicationY@search-lesgsyo\\.com)|(\\{88069ce6-2762-4e02-a994-004b48bd83c1\\}))$/","prefs":[],"schema":1576756765926,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1487627","why":"Add-ons whose main purpose is to track user browsing behavior.","name":"Abusive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"42d1f27b-9cbf-4a3e-a18a-5c4418c2f5b6","last_modified":1576771657195},{"guid":"/^((\\{d1b87087-09c5-4e58-b01d-a49d714da2a2\\})|(\\{d14adc78-36bf-4cf0-9679-439e8371d090\\})|(\\{d64c923e-8819-488c-947f-716473d381b2\\})|(\\{d734e7e3-1b8e-42a7-a9b3-11b16c362790\\})|(\\{d147e8c6-c36e-46b1-b567-63a492390f07\\})|(\\{db1a103d-d1bb-4224-a5e1-8d0ec37cff70\\})|(\\{dec15b3e-1d12-4442-930e-3364e206c3c2\\})|(\\{dfa4b2e3-9e07-45a4-a152-cde1e790511d\\})|(\\{dfcda377-b965-4622-a89b-1a243c1cbcaf\\})|(\\{e4c5d262-8ee4-47d3-b096-42b8b04f590d\\})|(\\{e82c0f73-e42c-41dd-a686-0eb4b65b411c\\})|(\\{e60616a9-9b50-49d8-b1e9-cecc10a8f927\\})|(\\{e517649a-ffd7-4b49-81e0-872431898712\\})|(\\{e771e094-3b67-4c33-8647-7b20c87c2183\\})|(\\{eff5951b-b6d4-48f5-94c3-1b0e178dcca5\\})|(\\{f26a8da3-8634-4086-872e-e589cbf03375\\})|(\\{f992ac88-79d3-4960-870e-92c342ed3491\\})|(\\{f4e4fc03-be50-4257-ae99-5cd0bd4ce6d5\\})|(\\{f73636fb-c322-40e1-82fb-e3d7d06d9606\\})|(\\{f5128739-78d5-4ad7-bac7-bd1af1cfb6d1\\})|(\\{fc11e7f0-1c31-4214-a88f-6497c27b6be9\\})|(\\{feedf4f8-08c1-451f-a717-f08233a64ec9\\}))$/","prefs":[],"schema":1576756852767,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1476369","why":"These add-ons contain unwanted features and try to prevent the user from uninstalling themselves.","name":"Smash/Upater (malware) and similar"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0896a86b-a211-4c64-968c-8671a21b2b5a","last_modified":1576771657191},{"guid":"/^((\\{2926cc6a-5f5d-4ef7-9cd0-0417408e8809\\})|(\\{569a3468-ebdc-4d95-84ef-0b6cbbcb2119\\})|(\\{6ef88cf3-c31c-4a9b-973b-765c21bc6f81\\})|(\\{a36b6921-0b70-4fad-b39b-786b23716b74\\})|(\\{fcc6a194-c627-4bf1-b185-e9611dc8d56d\\})|(\\{ddc71014-7997-421d-bb86-3b70b2ab24d5\\})|(\\{453638fc-e7f1-4a3d-acfb-724a0c750686\\})|(\\{0283d25d-25e6-4710-845f-b112fb264d3f\\})|(\\{071b1860-ff82-46d0-816c-a458382beaa7\\})|(\\{f0f6892f-6d0d-4146-9de5-21cc7eb3672a\\})|(\\{845c7444-bd97-4200-8144-c95ce77c07be\\})|(\\{8bc84806-edbd-4713-8a53-19a8c345fdfb\\})|(\\{959dfd6a-fbc5-49f0-8284-34e8606c7fd2\\})|(\\{9f90e1c8-a63e-43a9-8cd5-ad1d6fdf0f3a\\})|(\\{6b7cde7b-a79d-4012-b36c-86719ebcc308\\})|(\\{57f57692-7ef1-473a-adf7-7507e0e31c7d\\})|(\\{34bc568b-4243-4001-b528-118df3310667\\})|(\\{521e44f0-374e-466a-8829-2a98af75104b\\})|(\\{a4de65f7-33ae-4622-bb17-15053f0383f2\\})|(\\{f5ca8ea6-e854-4163-bc55-1a6f4086c1b2\\})|(\\{45765127-988a-4f3e-807d-f7784d76ecd0\\})|(\\{dc95db1e-68c5-44f4-a924-daac966373d2\\})|(\\{4119a8f1-508c-490d-87d4-203e93bbc5fb\\})|(\\{85997b97-ae1f-49e2-b42b-60f9c78c2d03\\})|(\\{a39c31c3-a57a-4c26-8454-267414494eed\\})|(\\{fa47c7ee-e855-41b0-9d3d-3c1d46d98a19\\})|(\\{6255931b-744a-49a2-bf6d-69ba35556760\\})|(\\{54112e17-779d-4275-9a04-81760931d356\\})|(\\{cea0dfab-286c-44c5-b41e-79d8ca5d097e\\})|(\\{fd6b2837-7828-4ad8-9bfe-361336aba33e\\})|(\\{0a56d404-ece2-441d-8d0b-e276ae1a07c2\\})|(\\{be54a202-b6e0-485d-b60b-f77f117ae602\\})|(\\{ff927da8-a634-4b4f-9010-2e76e3a6db2d\\})|(\\{a91f82ce-675b-4940-b58f-96095eb004af\\})|(\\{885c70f6-e286-433e-8f42-d7f319321d9d\\})|(\\{3e52fa7b-34c5-48e3-9cc2-3e33464db303\\})|(\\{ca94cd4e-3aec-41af-aa3c-1a8ddba9b9be\\})|(\\{0971aa7e-3a32-418a-acca-fdb5dacfca2f\\})|(\\{4d16cfea-bbe5-4254-b98b-70267cf2a2bc\\})|(\\{5cb20af8-1a98-43b0-9f09-0ee6d494ce65\\}))$/","prefs":[],"schema":1576756919670,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558136","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various fake Flash/Avast/etc clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c81cb302-2519-4997-84de-75aa01f2dee9","last_modified":1576771657188},{"guid":"/^((jabcajffpafebcdcaddoegpenicdipdk@chrome-store-foxified-1110252619)|(jpegcert@freeverify\\.org)|(kmrfree@yahoo\\.com)|(lets-kingw@empotrm\\.com)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-29039950)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-77744803)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-357866719)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-447115206)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-549146896)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-1084455972)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-1602969934)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-2271560562)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-2595595173)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-3103352300)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-3116340547)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-3959272483)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-4076222235)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-4090031097)|(media-certificates@auth0\\.io)|(mingle-cash-extension@minglecash\\.com)|(MiningBlocker@MiningBlockerAddOn\\.com)|(multimedia@certifications\\.us)|(nominer-block-coin-miners@tubedownload\\.org)|(open-in-idm@tubedownload\\.org)|(sabqo@yolla\\.net)|(search-by-image@addonsmash)|(selfdestructingcookies@addonsmash)|(streaming-certficate@mdn\\.org)|(swt@gobck\\.com)|(tabs-re-open@gtk\\.cc)|(user-agent-rewriter@a\\.org)|(vba@vba\\.com)|(verification@bexp\\.co)|(vidcert@certs\\.org)|(xplayer@gobck\\.com)|(youtube_download_express@free-downloader\\.online)|(youtube_downloader@downloaders\\.xyz)|(youtube_grabber@utubegrabber\\.co)|(youtube-lyrics-by-rob-w@awesome\\.addons)|(youtube-mp4-downloader@tubedownload\\.org)|(ytdownloader@ytdownloader\\.org)|(yttools\\.download@youtube\\.com))$/","prefs":[],"schema":1576757015029,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1525880","why":"Add-ons that include abusive or malicious remote code.","name":"Various abusive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eaa146be-e47f-4c20-bdbd-c8046a929100","last_modified":1576771657184},{"guid":"/^((\\{ed4c3ce2-5372-429c-ae20-fa5b1f540fd7\\})|(\\{cd11da28-330d-4f09-a21f-fae7509f1b60\\})|(\\{74bc7a66-d4e6-4f1c-a0ef-1b65baa41cbf\\})|(\\{8069effc-45bb-4caf-8b27-a135431cd6b9\\})|(\\{577fc233-25bf-4e43-a164-aa75eb9d053a\\})|(\\{f5626996-f5cd-4d00-bcea-20dda6d9edd6\\})|(\\{9bb810ef-716e-4dc5-9f03-491a2c59384e\\})|(\\{02634a24-04d0-439f-9faf-a323ab4a1bac\\})|(\\{b73f7a43-a43a-47f5-8b1f-1ef7caa7857d\\})|(\\{3b5bf07b-5964-408a-8e43-e0239219c524\\})|(\\{73d3a404-150f-4594-ac2c-24f9beec78b1\\})|(\\{ef6a2133-5ed9-4dbc-a735-6ffe8490062e\\})|(\\{76b61321-01a1-4a17-850f-b064a0366b57\\})|(\\{bc41ca18-9209-4500-a847-4e514fea2536\\})|(\\{32c4c845-9bd7-4b20-97fa-a7616e7802ef\\})|(\\{410d9002-b517-471f-956e-30129e307af3\\})|(\\{43366e90-e4be-4ba6-bec0-3fb149128480\\})|(\\{8ebc90a4-f7a1-420a-8380-f85545403f80\\})|(\\{6d3fa41f-e896-4f85-ba59-321f4b26f380\\})|(\\{05c811f2-f828-4d3e-ad02-7386373e9a28\\})|(\\{e10a0ee6-8083-42a7-bed1-35400b029bf2\\})|(\\{c925be5a-ae0e-4958-be36-44dc2e64d4f7\\})|(\\{3803ed37-c101-4b21-a678-762f51b7eabf\\})|(\\{08a15cc0-d6cb-43c5-9a40-27443554b455\\})|(\\{d0953283-5970-4ebe-b270-940c6befdbb7\\})|(\\{7c983689-80c7-46dd-b9d2-4d2db1cf94a6\\})|(\\{8f320a17-868c-43dc-94fb-9d1ab7f4fe73\\})|(\\{843b406a-9593-49bf-9365-684fe8cb2f5a\\})|(\\{42cd0cbd-248d-4a44-88b6-1a3680d159ac\\})|(\\{23efa05d-99b1-49e0-a67d-5378f2afc20d\\})|(\\{f91c606c-dd33-42a4-9219-824187730f59\\})|(\\{9e233d16-18ae-4519-a83c-2806f4fee321\\})|(\\{a93cdf30-75da-463b-865b-f49cc7fd2697\\})|(\\{dcacb62c-9096-482d-845d-10413199a89b\\})|(\\{9d5da26f-c366-46b2-b3e7-5c8e3e0b9788\\})|(\\{dd176d1f-8cd5-4b5b-8b06-839449e87b5e\\})|(\\{9ada3b66-4412-427d-8696-ac0fe0ac891e\\})|(\\{9695495e-cb65-4cd6-8a93-52c9e2b8d767\\})|(\\{e9d1a027-a84c-4e90-b602-66ffe22a0ad6\\})|(\\{f71bda5e-c591-44aa-8f84-2f04989f7e7a\\})|(\\{e6e67c6f-c010-406d-8575-1835341ec4cf\\})|(\\{22fbf524-38be-4ead-b6ce-e55cb23ed74b\\})|(\\{866dafe9-1c49-47d7-a46c-1cb50ca52461\\})|(\\{3479fadc-41b1-492e-bb16-d8f9e514d488\\})|(\\{8c02daf2-79ed-4650-89ca-1e099d28c5e7\\})|(\\{65e6b805-7f0c-455f-b1b4-c34621056b46\\})|(\\{78de7006-944c-4c18-a33a-d6931619f2b0\\})|(\\{16c8051b-2c16-4641-bf29-2daee7883fd0\\})|(\\{19263ccc-a97f-49f4-867a-b49351c42c0c\\})|(\\{bfe416d8-e8c3-469c-908e-6926770152f0\\})|(\\{a29a4a96-2fcd-48f8-bfe1-a1d1df46e73d\\})|(\\{2d651636-a0fa-45b7-a97e-ebc85959ff23\\})|(\\{ac8a3af8-e264-4a0b-b813-d7fab03ae3fe\\})|(\\{4719ad8b-354b-443d-b1e6-4d60b851c465\\})|(\\{7679a9f9-29d8-4979-86e7-a5b5cf0e2fd3\\})|(\\{099e1648-58e7-492e-8019-3418263b9265\\})|(\\{9a83d154-4ea3-45f9-ae21-28f3c1f86773\\})|(\\{475b88fd-574c-4881-98e0-0184a03593cb\\})|(\\{d7b586f8-a22d-4986-9dfb-67d49ba46a68\\})|(\\{50b79e30-a649-4477-8612-7085c0ee3ad4\\})|(\\{e9b2d453-9a98-41e4-9837-c0d68ff1aeac\\})|(\\{b1814ce5-0d9f-495f-b260-a7e1e5538263\\})|(\\{9b06d35e-2eb0-4653-886f-a3f4cdcbb754\\})|(\\{e7d6a360-69d4-4f8c-a96f-fd63388995b2\\})|(\\{68a50af6-ddad-4750-a9a7-a71c55e019b7\\})|(\\{8286a0e0-ba89-48b3-871b-8c9acff32023\\})|(\\{b3c79903-9bc5-4ddf-aeeb-7d91989ae819\\})|(\\{7c5cc4ec-9637-428c-bcf7-28bba279cf84\\})|(\\{93d460ee-879f-4d8f-8599-a1c69ed59ec2\\})|(\\{207c95d5-2bb9-4760-b3a4-8c58ea173bff\\})|(\\{b3482681-1abf-4dfa-bace-dc7b51e6a150\\})|(\\{d3516cf6-d531-434a-b80a-df72c7166744\\})|(\\{da01a2aa-0cbb-4f57-a395-2256d142c519\\}))$/","prefs":[],"schema":1576757089378,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549214","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"71f2c72f-b4d7-4ea9-bb8f-70d4d86eb184","last_modified":1576771657180},{"guid":"/^((\\{84a9ae69-5c01-4a73-80d3-c2201410d8c1\\})|(\\{852c68da-c573-42f8-85f8-9dcf57684f87\\})|(\\{85a31d9e-063f-421f-9d3f-649a393e94ec\\})|(\\{876778c8-5329-461d-882e-d4983ae6062a\\})|(\\{8913da4a-46fb-461c-9e60-3e257ef2c0e6\\})|(\\{8aa0118c-998e-40ac-84e9-12c936e5d70e\\})|(\\{8b4a6441-811f-4461-b136-7ebf3aebe3dc\\})|(\\{8bc41c3b-e052-4fd8-8de3-970ef5224bd9\\})|(\\{8e03b200-aad9-434b-9a99-e7aae7493a5f\\})|(\\{8fe94d0d-4746-401c-ad05-e0e1be97ea0e\\})|(\\{900f3c9c-b327-4608-950b-9765119c2e7a\\})|(\\{915080f5-97a3-4584-861f-70cd91f56474\\})|(\\{91d034a6-1765-4a59-85e5-9ddeb371ed9b\\})|(\\{9207dfae-06fc-4545-9fa6-6466b7ed2559\\})|(\\{926b2440-8443-4de3-9025-9a448cf3b838\\})|(\\{952bfd34-d195-4b10-8a3c-b103786cf090\\})|(\\{95315ff2-427b-427c-a433-236fb3b5eda4\\})|(\\{971db1e5-a5cb-46f9-91f9-9b687f4e5832\\})|(\\{982e11b3-e092-4713-81d4-5da1eadd278e\\})|(\\{98a2b9a7-13fa-49ff-aaa4-83786fad7862\\})|(\\{99f52d4d-1cd2-4e17-8f57-fa2493848f3f\\})|(\\{9a467b2c-be87-4d55-80d9-998dc6243e8b\\})|(\\{9abfecfa-d53e-4aea-bb6c-4fe47367f61e\\})|(\\{9b0243a5-92fb-43a4-adcc-3161f0ec030c\\})|(\\{9c7bb0bf-1534-4805-b9fa-a91004bd7e30\\})|(\\{a00e65f6-bf34-4ef9-a0e5-b63002c823e9\\})|(\\{a0dce648-f703-4867-9f3f-9bfa7601d1b1\\})|(\\{a16a700a-35ff-4ed1-ab81-164e3c823342\\})|(\\{a1f14b23-0c36-44e8-8f0d-9c732acbb550\\})|(\\{a4ea8038-65ae-4d7c-92e2-dd95caf007f4\\})|(\\{a55cd5be-89e4-40ba-8c3b-0023a1f41c8e\\})|(\\{a57ec9eb-cbab-4ddb-bafd-80cf5fd38891\\})|(\\{a5aa1d1e-dec7-4e25-bead-0861099f9628\\})|(\\{a604a85d-ba8f-4e8f-8ca1-867ca8d13a13\\})|(\\{a7a33aad-9e17-4db3-a127-d185e31607ae\\})|(\\{a9404f9f-6ac9-4366-bfcf-50d0d3bdeac3\\})|(\\{aaf2dd6b-5ca9-47aa-b41f-5b00c5c82d2e\\})|(\\{abf10dee-7cc9-4b79-ad5b-1e4300ab24a7\\})|(\\{ac97e702-b2e2-4a91-ae3e-bf0856300737\\})|(\\{ae03577f-2d20-4775-8286-685cdbee76e4\\})|(\\{aef2e959-90c0-44cf-bbb5-e0789af93efe\\})|(\\{af0d8090-d04f-4e9a-a3fb-1c9ac89e9f68\\})|(\\{b0da2032-0da5-4cff-b91b-e0efda4d6b36\\})|(\\{b2777372-311f-4a15-81e5-c84dd845c93d\\})|(\\{b44ac98d-6101-467d-a959-d6ada2259f01\\})|(\\{b50daf26-3983-4516-836f-0b8777bc44ab\\})|(\\{b5ca55b9-d06a-4538-be4a-38b29f3a4359\\})|(\\{b783327e-a675-40c2-95c7-59eb3f00b75d\\})|(\\{b91f2cd5-4051-4e13-8848-8e92afb99217\\})|(\\{ba32ffe1-dabb-41d6-a45f-f4d3e1304ff1\\})|(\\{bb80ea9f-8263-4183-a52d-e5d45ca6e0fe\\})|(\\{c0ba2c3c-55a6-4d28-bb27-67f71de78feb\\})|(\\{c0ecc589-04de-4243-9279-100b781f7443\\})|(\\{c2f6447c-e2db-43d1-8c53-fec7c29b22bb\\})|(\\{c4492fc0-70ed-4d36-8904-61ccb663eaac\\})|(\\{c58e10ce-d69e-478d-8270-0d73599a8cfc\\})|(\\{c72781ce-8377-41ae-984e-ed5755af28de\\})|(\\{c7f51f89-f47c-45e6-aa57-177deba406a0\\})|(\\{c859eaff-3dde-4d83-9703-0a6cf9e95308\\})|(\\{ca51951b-5c9e-4c26-bca3-ed6e754ae5c0\\})|(\\{ce9f05c7-6246-4918-8505-fdc455bc0aab\\})|(\\{cf0ec4e1-5d0d-4846-aa97-380806e72e46\\})|(\\{cfa73be4-9e64-4aea-bb0a-2ab0defb27b3\\})|(\\{d12c5edd-1182-4bf7-bdb1-f2662b7ce1be\\})|(\\{d2343e30-0253-4556-9dd8-cb6cb461801d\\})|(\\{d7a1fad5-eb70-4f7f-a24d-98c3bb9a7aa4\\})|(\\{d7a7e3d1-e6f2-45e3-957a-4b2cde1b413b\\})|(\\{d946d1e8-38bd-41f4-8dc7-a255802046a8\\})|(\\{da7e77cd-4a7c-4282-a597-0694ada485b4\\})|(\\{dc905949-378e-4b8c-aacc-cff56b04370d\\})|(\\{dca4c8f5-5ef9-40fb-bd76-dcb4ec98c495\\})|(\\{dd275beb-f7dd-4ff6-8fec-23e8c0422b68\\})|(\\{de88be71-25f9-48d0-adc9-3d9a542cf303\\})|(\\{df148b39-f7c2-480d-ad8b-91b700e6642b\\})|(\\{df55df20-2e99-49fd-90bc-b548b833e2db\\})|(\\{e1348bc8-b378-45a3-95bb-4915b8910c1e\\})|(\\{e72aab9f-77f1-4e03-a4b7-9ea4b066fe50\\})|(\\{e8372510-9f1b-4b11-8e2f-dfc1d5d1a4a1\\})|(\\{eae5c7b6-8b67-4645-a1c1-a543e63ceda5\\})|(\\{eb1ed544-82e6-4785-b693-1e0799f7cffa\\})|(\\{ec37edc4-e1a6-4073-9cd4-7a5315c921e3\\})|(\\{ed240b54-8600-496b-a034-d9a153359906\\})|(\\{ee6e56cf-b963-4efb-b64e-cf6117dc9a5b\\})|(\\{f3337e21-4fbd-411c-b1fc-d0543052b499\\})|(\\{f5a4fafb-2f75-4acc-9dad-324ca00a1b84\\})|(\\{f9b00c32-2f31-436b-8cb1-720b12502cb6\\})|(\\{fdfd1815-cf54-4210-8883-a4154668b866\\})|(adobeflashplayer@flashplayeradobedeveloper\\.com)|(adobeflashplayer@flashplayeradobedevelopper\\.com)|(afplayer@firefox\\.pl)|(afplayerx@firefox\\.pl)|(aktualizacjaalamusowjeac@wp\\.pl)|(aktualizacjalamusowjeac@wp\\.pl)|(andrzej-ff@wp\\.pl)|(andrzej@gmail\\.com)|(au_addx@geckoaddon\\.org)|(au9c1660@auge\\.site)|(birghun@firefox\\.pl)|(birghuxxn@firefox\\.pl)|(btxyhuh@firefox\\.pl)|(elsee@geckoaddon\\.org)|(elseeau@geckoaddon\\.org)|(extensioner@firefox\\.pl)|(fr@ffget\\.xyz)|(fr9c1660@frge\\.site))$/","prefs":[],"schema":1576757184838,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552164","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"81f88c43-22e7-4602-8928-3a0b0f50689e","last_modified":1576771657176},{"guid":"/^((fruxuc@flashc\\.com)|(it_addx@geckoaddon\\.org)|(it9c1660@tige\\.site)|(marlenex@firefox\\.pl)|(nads@firefox\\.pl)|(newtabextension@newtabextensiond\\.com)|(pl@k4n\\.pl)|(playerro1@firefox\\.pl)|(socketextensionws1@geckoaddon\\.org)|(soxmuc@firefox\\.pl))$/","prefs":[],"schema":1576757189399,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552164","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a7e85b5b-7e0a-40c9-a900-99de7ba2a131","last_modified":1576771657173},{"guid":"/^((_hwMembers_@free\\.mapfinderz\\.com)|(_hxMembers_@free\\.mergedocsnow\\.com)|(_hyMembers_@free\\.formfetcherpro\\.com)|(_hzMembers_@free\\.televisionace\\.com)|(_i2Members_@free\\.streamlineddiy\\.com)|(_i4Members_@free\\.fileconvertonline\\.com)|(_i5Members_@free\\.mydiygenie\\.com)|(_i6Members_@free\\.dailyproductivitytools\\.com)|(_i7Members_@free\\.digismirkz\\.com)|(_i9Members_@free\\.cinematicfanatic\\.com)|(_iaMembers_@free\\.liveradiosweeper\\.com)|(_ijMembers_@www\\.freedirectionsonline\\.com)|(_isMembers_@free\\.mydigitalcalendar\\.com)|(_itMembers_@free\\.mycalendarplanner\\.com)|(_iuMembers_@free\\.productmanualsfinder\\.com)|(_ivMembers_@free\\.simplepictureedit\\.com)|(_iwMembers_@free\\.allinonedocs\\.com)|(_j1Members_@free\\.onlineworksuite\\.com)|(_j4Members_@free\\.createdocsonline\\.com)|(_j5Members_@ext\\.ask\\.com)|(_j6Members_@www\\.freemanualsindex\\.com)|(_j7Members_@www\\.convertdocsonline\\.com)|(_j8Members_@www\\.discoverliveradio\\.com)|(_j9Members_@www\\.internetspeedradar\\.com)|(_jaMembers_@www\\.testonlinespeed\\.com)|(_jbMembers_@www\\.onlinemapsearch\\.com)|(_jcMembers_@www\\.quickweathertracker\\.com)|(_jhMembers_@www\\.getcouponsfast\\.com)|(_jiMembers_@www\\.searchformsonline\\.com)|(_jjMembers_@www\\.onlineroutefinder\\.com)|(_jmMembers_@www\\.supercouponpro\\.com)|(_jnMembers_@www\\.pdfconverttools\\.com)|(_joMembers_@www\\.onlineformfinder\\.com)|(_jpMembers_@www\\.directionswhiz\\.com)|(_jqMembers_@www\\.convertpdfsnow\\.com)|(_jvMembers_@free\\.notehomepage\\.com)|(_k8Members_@www\\.mymapsexpress\\.com)|(_k9Members_@www\\.mytransitmapper\\.com)|(_kbMembers_@www\\.convertersnow\\.com)|(_kjMembers_@www\\.easydirectionsfinder\\.com)|(_knMembers_@www\\.getfamilyhistory\\.com)|(_koMembers_@www\\.quickpdfmerger\\.com)|(_kpMembers_@www\\.easytransithelper\\.com)|(_kqMembers_@www\\.easypackagefinder\\.com)|(_krMembers_@www\\.easyemailsuite\\.com)|(_ksMembers_@www\\.quickcouponfinder\\.com)|(_ktMembers_@www\\.easypackagetracker\\.com)|(_kvMembers_@www\\.radiofinder\\.com)|(_kwMembers_@www\\.productmanualspro\\.com)|(_kxMembers_@www\\.smarteasymaps\\.com)|(_kyMembers_@www\\.quickflighttracker\\.com)|(_kzMembers_@www\\.productmanualsguide\\.com)|(_l0Members_@www\\.getformshere\\.com)|(_l1Members_@www\\.videoconverterhd\\.com)|(_l3Members_@www\\.watchmytvshows\\.com)|(_l4Members_@www\\.quicktemplatefinder\\.com)|(_l5Members_@www\\.strictlyradio\\.com)|(_l6Members_@www\\.propdfconverter\\.com)|(_l7Members_@free\\.gifables\\.com)|(_laMembers_@free\\.gifsgalore\\.com)|(_lbMembers_@free\\.worldofnotes\\.com)|(_ohMembers_@chrome\\.google\\.com)|(_onMembers_@www\\.4thofjulypictureedit\\.com)|(_oxMembers_@free\\.anytimeastrology\\.com)|(_oyMembers_@free\\.getfreegifs\\.com)|(_ozMembers_@free\\.newnotecenter\\.com)|(_paMembers_@www\\.filmfanatic\\.com)|(_pbMembers_@www\\.holidayphotoedit\\.com)|(_pcMembers_@free\\.astrologysearcher\\.com)|(_pdMembers_@free\\.horoscopebuddy\\.com)|(_peMembers_@free\\.lovemyhoroscopes\\.com)|(_pjMembers_@free\\.gifapalooza\\.com)|(_pkMembers_@free\\.giffysocial\\.com)|(_pnMembers_@free\\.myeasylotto\\.com)|(_pqMembers_@www\\.freepdfcombiner\\.com)|(_psMembers_@www\\.freetemplatefinder\\.com)|(_ptMembers_@www\\.simplepackagefinder\\.com)|(_pvMembers_@www\\.mapmywayfree\\.com)|(_pxMembers_@www\\.simpleflighttracker\\.com)|(_pyMembers_@www\\.filesendfree\\.com)|(_pzMembers_@free\\.babynameready\\.com)|(_q0Members_@free\\.mywaynotes\\.com)|(_q1Members_@free\\.everydaymemo\\.com)|(_q7Members_@www\\.getflightupdates\\.com)|(_q8Members_@www\\.getformsfree\\.com)|(_qfMembers_@www\\.formfinderfree\\.com)|(_qhMembers_@free\\.presidentialbuzz\\.com)|(_qjMembers_@free\\.taxcenternow\\.com)|(_qlMembers_@free\\.cryptopricesearch\\.com)|(_qmMembers_@free\\.ontargetyoga\\.com)|(_qoMembers_@free\\.taxinfohelp\\.com)|(_qpMembers_@free\\.getpoliticalnews\\.com)|(_qqMembers_@free\\.thepresidentsays\\.com)|(_qtMembers_@www\\.formfinderhq\\.com)|(_quMembers_@free\\.myquicklotto\\.com)|(_qwMembers_@free\\.shoppingdealslive\\.com)|(_r0Members_@free\\.bitcoinpricesearch\\.com)|(_r1Members_@free\\.projectbabyname\\.com)|(_r2Members_@free\\.yogaposeonline\\.com)|(_r5Members_@www\\.quickdocsonline\\.com)|(_r6Members_@free\\.ezpdfconvert\\.com)|(_r7Members_@free\\.onlineformsdirect\\.com)|(_r8Members_@free\\.mapsboss\\.com)|(_raMembers_@www\\.fileconverterfree\\.com)|(_rcMembers_@extsb\\.searchbetter\\.com))$/","prefs":[],"schema":1576757318717,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598806","why":"These add-ons collect ancillary user data among other policy violations.","name":"New tab data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e87028d0-b5c8-4a76-9105-0229bafb5040","last_modified":1576771657169},{"guid":"/^((_rdMembers_@www\\.freeshoppingtool\\.com)|(_reMembers_@www\\.simpleholidayrecipes\\.com)|(_rfMembers_@www\\.myguidetoislam\\.com)|(_rgMembers_@free\\.entertainmentnewsnow\\.com)|(_rhMembers_@free\\.politicalnewscenter\\.com)|(_riMembers_@www\\.myfashiontab\\.com)|(_rjMembers_@www\\.mychristianportal\\.com)|(_rkMembers_@www\\.globaljewishworld\\.com)|(_rlMembers_@www\\.myvedictab\\.com)|(_rnMembers_@free\\.learnthelyrics\\.com)|(_roMembers_@free\\.dailyfunnyworld\\.com)|(_rpMembers_@free\\.myprivacymanager\\.com)|(_rqMembers_@free\\.getseniorresources\\.com)|(_rrMembers_@free\\.webtopdfprint\\.com)|(_rsMembers_@www\\.freeauctionfinder\\.com)|(_rwMembers_@free\\.getlyricsonline\\.com)|(_rzMembers_@free\\.pagesummarizer\\.com)|(_s0Members_@free\\.funnyjokesnow\\.com)|(_s2Members_@free\\.mybabyboomerhub\\.com)|(_s6Members_@free\\.celebgossiponline\\.com)|(_saMembers_@free\\.onlineprivacymanager\\.com)|(_scMembers_@free\\.freearticleskimmer\\.com)|(_sdMembers_@www\\.easywebpageprint\\.com)|(_swMembers_@www\\.homehelpguide\\.com)|(_szMembers_@www\\.mydocshere\\.com)|(_v4Members_@www\\.dictionaryboss\\.com))$/","prefs":[],"schema":1576757323000,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598806","why":"These add-ons collect ancillary user data among other policy violations.","name":"New tab data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"49cb7c72-e90e-4dc3-adda-d63083c83a7c","last_modified":1576771657165},{"guid":"/^(({23c65153-c21e-430a-a2dc-0793410a870d})|({29c69b12-8208-457e-92f4-e663b00a1f10})|({30a8d6f1-0401-4327-8c46-2e1ab45dfe77})|({30d63f93-1446-43b3-8219-deefec9c81ce})|({32cb52f8-c78a-423d-b378-0abec72304a6})|({35bfa8c0-68c1-41f8-a5dd-7f3b3c956da9})|({36a4269e-4eef-4538-baea-9dafbf6a8e2f})|({37f8e483-c782-40ed-82e9-36f101b9e41f})|({42a512a8-37e0-4e07-a1db-5b4651d75048})|({43ae5745-c40a-45ab-9c11-74316c0e9fd2})|({53fa8e1c-112b-4013-b582-0d9e8c51ca75})|({56effac7-3ae9-41e3-9b46-51469f67b3b2})|({61a486c0-ce3d-4bf1-b4f2-e186a2adecf1})|({62b55928-80cc-49f7-8a4b-ec06030d6601})|({63df223d-51cf-4f76-aad8-bbc94c895ed2})|({064d8320-e0f3-411f-9ed1-8c1349279d20})|({071b9878-a7d3-4ae3-8ef0-2eaee1923403})|({72c1ca96-c05d-46a7-bce1-c507ec3db4ea})|({76ce213c-8e57-4a14-b60a-67a5519bd7a7})|({78c2f6a0-3b54-4a21-bf25-a3348278c327})|({0079b71b-89c9-4d82-aea3-120ee12d9890})|({81ac42f3-3d17-4cff-85af-8b7f89c8826b})|({81dc4f0e-9dab-4bd2-ab9d-d9365fbf676f})|({82c8ced2-e08c-4d6c-a12b-3e8227d7fc2a})|({83d6f65c-7fc0-47d0-9864-a488bfcaa376})|({83d38ac3-121b-4f28-bf9c-1220bd3c643b})|({84b9121e-55c9-409a-9b28-c588b5096222})|({87ba49bd-daba-4071-aedf-4f32a7e63dbe})|({87c552f9-7dbb-421b-8deb-571d4a2d7a21})|({87dcb9bf-3a3e-4b93-9c85-ba750a55831a})|({89a4f24d-37d5-46e7-9d30-ba4778da1aaa})|({93c524c4-2e92-4dd7-8b37-31a69bc579e8})|({94df38fc-2dbe-4056-9b35-d9858d0264d3})|({95c7ae97-c87e-4827-a2b7-7b9934d7d642})|({95d58338-ba6a-40c8-93fd-05a34731dc0e})|({97c436a9-7232-4495-bf34-17e782d6232c})|({97fca2cd-545f-42ef-ae93-dc13b046bd3b})|({0111c475-01e6-42ea-a9b4-27bed9eb6092})|({115a8321-4414-4f4c-aee6-9f812121b446})|({158a5a56-aca0-418f-bec0-5b3bda6e9d4c})|({243a0246-cbab-4b46-93fb-249039f68d84})|({283d4f2a-bab1-43ce-90be-5129741ac988})|({408a506b-2336-4671-a490-83a1094b4097})|({0432b92a-bfcf-41b9-b5f0-df9629feece1})|({484e0ba4-a20b-4404-bb1b-b93473782ae0})|({486ecaf1-1080-48c1-8973-549bc731ccf9})|({495a84bd-5a0c-4c74-8a50-88a4ba9d74ba})|({520f2c78-7804-4f59-ae74-a192476055ed})|({543f7503-3620-4f41-8f9e-c258fdff07e9})|({0573bea9-7368-49cd-ba10-600be3535a0b})|({605a0c42-86af-40c4-bf39-f14060f316aa})|({618baeb9-e694-4c7b-9328-69f35b6a8839})|({640c40e5-a881-4d16-a4d0-6aa788399dd2})|({713d4902-ae7b-4a9a-bcf5-47f39a73aed0})|({767d394a-aa77-40c9-9365-c1916b4a2f84})|({832ffcf9-55e9-4fd1-b2eb-f19e1fac5089})|({866a0745-8b91-4199-820a-ec17de52b5f2})|({869b5825-e344-4375-839b-085d3c09ab9f})|({919fed43-3961-48d9-b0ef-893054f4f6f1})|({971d6ef0-a085-4a04-83d8-6e489907d926})|({1855d130-4893-4c79-b4aa-cbdf6fee86d3})|({02328ee7-a82b-4983-a5f7-d0fc353698f0})|({2897c767-03aa-4c2f-910a-6d0c0b9b9315})|({3908d078-e1db-40bf-9567-5845aa77b833})|({04150f98-2d7c-4ae2-8979-f5baa198a577})|({4253db7f-5136-42c3-b09d-cf38344d1e16})|({4414af84-1e1f-449b-ac85-b79f812eb69b})|({4739f233-57c1-4466-ad51-224558cf375d})|({5066a3b2-f848-4a59-a297-f268bc3a08b6})|({6072a2a8-f1bc-4c9c-b836-7ac53e3f51e4})|({7854ee87-079f-4a25-8e57-050d131404fe})|({07953f60-447e-4f53-a5ef-ed060487f616})|({8886a262-1c25-490b-b797-2e750dd9f36b})|({12473a49-06df-4770-9c47-a871e1f63aea})|({15508c91-aa0a-4b75-81a2-13055c96281d})|({18868c3a-a209-41a6-855d-f99f782d1606})|({24997a0a-9d9b-4c87-a076-766d44e1f6fd})|({27380afd-f42a-4c25-b57d-b9012e0d5d48})|({28044ca8-8e90-435e-bc63-a757af2fb6be})|({30972e0a-f613-4c46-8c87-2e59878e7180})|({31680d42-c80d-4f8a-86d3-cd4930620369})|({44685ba6-68b3-4895-879e-4efa29dfb578})|({046258c9-75c5-429d-8d5b-386cfbadc39d})|({47352fbf-80d9-4b70-9398-fb7bffa3da53})|({56316a2b-ef89-4366-b4aa-9121a2bb6dea})|({65072bef-041f-492e-8a51-acca2aaeac70})|({677e2d00-264c-4f62-a4e8-2d971349c440})|({72056a58-91a5-4de5-b831-a1fa51f0411a})|({85349ea6-2b5d-496a-9379-d4be82c2c13d})|({98363f8b-d070-47b6-acc6-65b80acac4f3})|({179710ba-0561-4551-8e8d-1809422cb09f})|({207435d0-201d-43f9-bb0f-381efe97501d})|({313e3aef-bdc9-4768-8f1f-b3beb175d781})|({387092cb-d2dc-4da5-9389-4a766c604ec2})|({0599211f-6314-4bf9-854b-84cb18da97f8})|({829827cd-03be-4fed-af96-dd5997806fb4})|({856862a5-8109-47eb-b815-a94059570888})|({1e6f5a54-2c4f-4597-aa9e-3e278c617d38})|({1490068c-d8b7-4bd2-9621-a648942b312c})|({18e5e07b-0cfa-4990-a67b-4512ecbae04b})|({3584581e-c01a-4f53-aec8-ca3293bb550d})|({5280684d-f769-43c9-8eaa-fb04f7de9199})|({5766852a-b384-4276-ad06-70c2283b4792}))$/","prefs":[],"schema":1576757432447,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479009","why":"Malicious add-ons disguising as updates or useful add-ons, but violating data collection policies, user-control, no surprises and security.","name":"Firefox Update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e3139834-609b-4726-8bfa-a28659ba14fc","last_modified":1576771657161},{"guid":"/^(({34364255-2a81-4d6e-9760-85fe616abe80})|({45621564-b408-4c29-8515-4cf1f26e4bc3})|({62237447-e365-487e-8fc3-64ddf37bdaed})|({7e7aa524-a8af-4880-8106-102a35cfbf42})|({71639610-9cc3-47e0-86ed-d5b99eaa41d5})|({78550476-29ff-4b7e-b437-195024e7e54e})|({85064550-57a8-4d06-bd4b-66f9c6925bf5})|({93070807-c5cd-4bde-a699-1319140a3a9c})|({11e7b9b3-a769-4d7f-b200-17cffa4f9291})|({22632e5e-95b9-4f05-b4b7-79033d50467f})|({03e10db6-b6a7-466a-a2b3-862e98960a85})|({23775e7d-dfcf-42b1-aaad-8017aa88fc59})|({85e31e7e-3e3a-42d3-9b7b-0a2ff1818b33})|({9e32ca65-4670-41e3-b6bb-8773e6b9bba8})|({6e43af8e-a78e-4beb-991f-7b015234eacc})|({57e61dc7-db04-4cf8-bbd3-62a15fc74138})|({01166e60-d740-440c-b640-6bf964504b3c})|({52e137bc-a330-4c25-a981-6c1ab9feb806})|({488e190b-d1f6-4de8-bffb-0c90cc805b62})|({5e257c96-bfed-457d-b57e-18f31f08d7bb})|({2134e327-8060-441c-ba68-b167b82ff5bc})|({1e68848a-2bb7-425c-81a2-524ab93763eb})|({8e888a6a-ec19-4f06-a77c-6800219c6daf})|({7e907a15-0a4c-4ff4-b64f-5eeb8f841349})|({a0ab16af-3384-4dbe-8722-476ce3947873})|({a0c54bd8-7817-4a40-b657-6dc7d59bd961})|({a0ce2605-b5fc-4265-aa65-863354e85058})|({a1f8e136-bce5-4fd3-9ed1-f260703a5582})|({a3fbc8be-dac2-4971-b76a-908464cfa0e0})|({a5a84c10-f12c-496e-80df-33386b7a1463})|({a5f90823-0a50-414f-ad34-de0f6f26f78e})|({a6b83c45-3f24-4913-a1f7-6f42411bbb54})|({a9eb2583-75e0-435a-bb6c-69d5d9b20e27})|({a32ebb9b-8649-493e-a9e9-f091f6ac1217})|({a83c1cbb-7a41-41e7-a2ae-58efcb4dc2e4})|({a506c5af-0f95-4107-86f8-3de05e2794c9})|({a02001ae-b7ed-45d7-baf2-c07f0a7b6f87})|({a5808da1-5b4f-42f2-b030-161fd11a36f7})|({a18087bb-4980-4349-898c-ca1b7a0e59cd})|({a345865c-44b9-4197-b418-934f191ce555})|({a7487703-02d8-4a82-a7d0-2859de96edb4})|({a2427e23-d349-4b25-b5b8-46960b218079})|({a015e172-2465-40fc-a6ce-d5a59992c56a})|({aaaffe20-3306-4c64-9fe5-66986ebb248e})|({abec23c3-478f-4a5b-8a38-68ccd500ec42})|({ac06c6b2-3fd6-45ee-9237-6235aa347215})|({ac037ad5-2b22-46c7-a2dc-052b799b22b5})|({ac296b47-7c03-486f-a1d6-c48b24419749})|({acbff78b-9765-4b55-84a8-1c6673560c08})|({acfe4807-8c3f-4ecc-85d1-aa804e971e91})|({ada56fe6-f6df-4517-9ed0-b301686a34cc})|({af44c8b4-4fd8-42c3-a18e-c5eb5bd822e2})|({b5a35d05-fa28-41b5-ae22-db1665f93f6b})|({b7b0948c-d050-4c4c-b588-b9d54f014c4d})|({b7f366fa-6c66-46bf-8df2-797c5e52859f})|({b9bb8009-3716-4d0c-bcb4-35f9874e931e})|({b12cfdc7-3c69-43cb-a3fb-38981b68a087})|({b019c485-2a48-4f5b-be13-a7af94bc1a3e})|({b91fcda4-88b0-4a10-9015-9365e5340563})|({b30591d6-ec24-4fae-9df6-2f3fe676c232})|({b99847d6-c932-4b52-9650-af83c9dae649})|({bbe79d30-e023-4e82-b35e-0bfdfe608672})|({bc3c2caf-2710-4246-bd22-b8dc5241693a})|({bc3c7922-e425-47e2-a2dd-0dbb71aa8423})|({bc763c41-09ca-459a-9b22-cf4474f51ebc})|({bd5ba448-b096-4bd0-9582-eb7a5c9c0948})|({be5d0c88-571b-4d01-a27a-cc2d2b75868c})|({be981b5e-1d9d-40dc-bd4f-47a7a027611c})|({be37931c-af60-4337-8708-63889f36445d})|({bea8866f-01f8-49e9-92cd-61e96c05d288})|({bf153de7-cdf2-4554-af46-29dabfb2aa2d})|({c3a2b953-025b-425d-9e6e-f1a26ee8d4c2})|({c3b71705-c3a6-4e32-bd5f-eb814d0e0f53})|({c5d359ff-ae01-4f67-a4f7-bf234b5afd6e})|({c6c8ea62-e0b1-4820-9b7f-827bc5b709f4})|({c8c8e8de-2989-4028-bbf2-d372e219ba71})|({c34f47d1-2302-4200-80d4-4f26e47b2980})|({c178b310-6ed5-4e04-9e71-76518dd5fb3e})|({c2341a34-a3a0-4234-90cf-74df1db0aa49})|({c8399f02-02f4-48e3-baea-586564311f95})|({c41807db-69a1-4c35-86c1-bc63044e4fcb})|({c383716f-b23f-47b2-b6bb-d7c1a7c218af})|({c3447081-f790-45cb-ae03-0d7f1764c88c})|({c445e470-9e5a-4521-8649-93c8848df377})|({c8e14311-4b2d-4eb0-9a6b-062c6912f50e})|({ca4fdfdb-e831-4e6e-aa8b-0f2e84f4ed07})|({ca6cb8b2-a223-496d-b0f6-35c31bc7ca2b})|({cba7ce11-952b-4dcb-ba85-a5b618c92420})|({cc6b2dc7-7d6f-470f-bccc-6a42907162d1})|({cc689da4-203f-4a0c-a7a6-a00a5abe74c5})|({ccb7b5d6-a567-40a2-9686-a097a8b583dd})|({cd28aa38-d2f1-45a3-96c3-6cfd4702ef51})|({cd89045b-2e06-46bb-9e34-48e8799e5ef2})|({cdda1813-51d6-4b1f-8a2f-8f9a74a28e14})|({ce0d1384-b99b-478e-850a-fa6dfbe5a2d4})|({ce93dcc7-f911-4098-8238-7f023dcdfd0d})|({cf9d96ff-5997-439a-b32b-98214c621eee})|({cfa458f9-b49b-4e09-8cb2-5e50bd8937cc})|({cfb50cdf-e371-4d6b-9ef2-fcfe6726db02})|({d1ab5ebd-9505-481d-a6cd-6b9db8d65977})|({d03b6b0f-4d44-4666-a6d6-f16ad9483593})|({d9d8cfc1-7112-40cc-a1e9-0c7b899aae98})|({d47ebc8a-c1ea-4a42-9ca3-f723fff034bd}))$/","prefs":[],"schema":1576757481582,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479009","why":"Malicious add-ons disguising as updates or useful add-ons, but violating data collection policies, user-control, no surprises and security.","name":"Firefox Update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4885bfb1-7859-4ebc-b42f-2545125a5522","last_modified":1576771657157},{"guid":"/^(({d72d260f-c965-4641-bf49-af4135fc46cb})|({d78d27f4-9716-4f13-a8b6-842c455d6a46})|({d355bee9-07f0-47d3-8de6-59b8eecba57b})|({d461cc1b-8a36-4ff0-b330-1824c148f326})|({d97223b8-44e5-46c7-8ab5-e1d8986daf44})|({d42328e1-9749-46ba-b35c-cce85ddd4ace})|({da7d00bf-f3c8-4c66-8b54-351947c1ef68})|({db84feec-2e1f-48f0-9511-645fe4784feb})|({dc6256cc-b6d0-44ca-b42f-4091f11a9d29})|({dd1cb0ec-be2a-432b-9c90-d64c824ac371})|({dd95dd08-75d1-4f06-a75b-51979cbab247})|({ddae89bd-6793-45d8-8ec9-7f4fb7212378})|({de3b1909-d4da-45e9-8da5-7d36a30e2fc6})|({df09f268-3c92-49db-8c31-6a25a6643896})|({e2a4966f-919d-4afc-a94f-5bd6e0606711})|({e05ba06a-6d6a-4c51-b8fc-60b461ffecaf})|({e7b978ae-ffc2-4998-a99d-0f4e2f24da82})|({e7fb6f2f-52b6-4b02-b410-2937940f5049})|({e08d85c5-4c0f-4ce3-9194-760187ce93ba})|({e08ebf0b-431d-4ed1-88bb-02e5db8b9443})|({e9c47315-2a2b-4583-88f3-43d196fa11af})|({e341ed12-a703-47fe-b8dd-5948c38070e4})|({e804fa4c-08e0-4dae-a237-8680074eba07})|({e8982fbd-1bc2-4726-ad8d-10be90f660bd})|({e40673cd-9027-4f61-956c-2097c03ae2be})|({e72172d1-39c9-4f41-829d-a1b8d845d1ca})|({e73854da-9503-423b-ab27-fafea2fbf443})|({e81e7246-e697-4811-b336-72298d930857})|({ea618d26-780e-4f0f-91fd-2a6911064204})|({ea523075-66cd-4c03-ab04-5219b8dda753})|({eb3ebb14-6ced-4f60-9800-85c3de3680a4})|({ec8c5fee-0a49-44f5-bf55-f763c52889a6})|({eccd286a-5b1d-494d-82b0-92a12213d95a})|({ed352072-ddf0-4cb4-9cb6-d8aa3741c2de})|({edb476af-0505-42af-a7fd-ec9f454804c0})|({ee97f92d-1bfe-4e9d-816c-0dfcd63a6206})|({f0b809eb-be22-432f-b26f-b1cadd1755b9})|({f5ffa269-fbca-4598-bbd8-a8aa9479e0b3})|({f6c543bf-2222-4230-8ecb-f5446095b63d})|({f6df4ef7-14bd-43b5-90c9-7bd02943789c})|({f6f98e6b-f67d-4c53-8b76-0b5b6df79218})|({f38b61f3-3fed-4249-bb3d-e6c8625c7afb})|({f50e0a8f-8c32-4880-bcef-ca978ccd1d83})|({f59c2d3d-58da-4f74-b8c9-faf829f60180})|({f82b3ad5-e590-4286-891f-05adf5028d2f})|({f92c1155-97b3-40f4-9d5b-7efa897524bb})|({f95a3826-5c8e-4f82-b353-21b6c0ca3c58})|({f5758afc-9faf-42bb-9543-a4cfb0bfce9d})|({f447670d-64f5-418f-9b4a-5352d6c8e127})|({f4262989-6de0-4604-918f-663b85fad605})|({fa8bd609-0e06-4ba9-8e2e-5989f0b2e197})|({fa0808f6-25ab-4a8b-bd17-3b275c55ff09})|({fac5816b-fd0f-4db2-a16e-52394b6db41d})|({fc99b961-5878-46b4-b091-6d2f507bf44d})|({fce89242-66d3-4946-9ed0-e66078f172fc})|({fcf72e24-5831-439e-bb07-fd53a9e87a30})|({fdc0601f-1fbb-40a5-84e1-8bbe96b22502})|({feb3c734-4529-4d69-9f3a-2dae18f1d896}))$/","prefs":[],"schema":1576757513203,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479009","why":"Malicious add-ons disguising as updates or useful add-ons, but violating data collection policies, user-control, no surprises and security.","name":"Firefox Update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"672db55e-49ce-4b00-88ab-46cc24277800","last_modified":1576771657153},{"guid":"/^((\\{666ff753-69f8-49da-8adf-8aa770d3e383\\})|(\\{51536072-b64d-4a34-bee0-49b8e8175bc1\\})|(addon@filestopdf\\.com)|(info@icdst\\.ir)|(\\{d22f9fb6-1488-4969-aa49-e3322d622b6a\\})|(\\{b9db7ded-77d6-489b-bc0e-570df3f3e527\\})|(\\{62d89bd6-0042-4342-a15f-fa0a8addfca9\\})|(\\{4d8dfb84-624e-48df-8eeb-60443b2afeee\\})|(\\{2b3ac8fa-f84c-4e8f-83b6-438735fb1406\\})|(\\{40999239-996a-48ee-835c-8a11f71e53eb\\})|(\\{6a670f43-0093-4f2c-a265-02754d9fcb42\\})|(\\{f8de8278-97b5-4da1-b810-658f5909cb3b\\})|(MiniSearch@Context)|(arksignermozillafirefoxextension@example\\.org)|(\\{8f073b13-8b8b-4fe1-bee3-ee7573420ddd\\})|(\\{dab4ccbf-7cc0-4611-9a49-e7975b4e35d4\\})|(\\{564f1733-6bfc-4a03-b7a7-4ddc79b4ec00\\})|(\\{4aa733fc-44b5-439a-b928-a90f0698ccd9\\})|(\\{1e5da97f-f7e6-4eff-9f59-5e933320929c\\})|(\\{c3acee78-2e6b-408a-a62b-3fd5765b5518\\})|(\\{d7ba7080-7f1d-466a-8c4f-6f12d2c31284\\})|(\\{42979ad6-680d-4bc6-84be-2c94eb3ce586\\})|(\\{9cb8385f-8f1d-40c3-b78c-d05e4f949ecc\\})|(\\{2e58d47d-b3e6-499a-83c4-536e3f8a9903\\})|(\\{8a554f9d-90fa-4fbd-aa53-8d03f3939baf\\})|(\\{267495e1-9990-4d67-bde6-f1774188c307\\})|(\\{eb4c0a5d-48e2-4984-ad4a-141b313a58d0\\})|(\\{ffbef674-f098-4406-be3f-e96987be1701\\})|(\\{cf0578ea-3b45-45f1-b8ff-5898106ded49\\})|(\\{5fbbbebd-ebb3-499a-b091-0d82ec5eff02\\})|(\\{f4065411-1929-4970-8516-bf875525e2a0\\})|(\\{40f2f6f9-e58d-47fa-bdb3-9fa0ff71ad03\\})|(\\{42f4554c-3e5f-4d21-98cf-3a3f5c968fa7\\})|(\\{c5ec86f0-ef3e-42c8-8537-bd111af62dd3\\})|(\\{fa20692f-ae7a-42c3-a98d-2e092679d455\\})|(\\{b4f5e691-5146-4a64-bf45-25126e673f72\\})|(\\{3c5c9a50-c00d-4a3c-9e6f-2785d3419cc0\\})|(\\{fb246a17-c9ff-4771-b9fb-9fc79477fc0b\\})|(\\{80409c03-07bf-4b33-b6c5-e6ef260478da\\})|(\\{196c766b-29e5-4de8-a35b-96a4c40a28c7\\})|(\\{d6f9a86d-bb00-4877-af5a-12ad3dba76b9\\})|(\\{73660d5e-451a-450c-8a6d-bb023252cf51\\})|(\\{70e7455b-6e99-49d1-97d5-0147c48af7d7\\})|(\\{f84d6912-ff8f-4e96-b3f4-72ba33e29584\\})|(\\{e9dc2e41-d607-4938-be21-a9f1faed2acc\\})|(\\{5c6da614-27de-4d9e-9c39-0e2517a8d31b\\})|(\\{3a379d30-7c89-4251-8158-8b7584ec7317\\})|(\\{fc32234f-df43-4afa-a2f0-be0e2753daba\\})|(\\{c7f39b82-24d0-4428-9348-afe7a2f88a45\\})|(\\{2b9c2d2c-a3bd-4837-b613-ce2bb5aefbe8\\})|(\\{7d0e4c77-d013-47f0-808c-028c98e3b10e\\})|(\\{f0eec3eb-367c-4ff1-9963-c211afad69ef\\})|(\\{bf2b8075-2aac-45e3-9351-0b3ad3dd708e\\})|(\\{632d24c3-7423-4384-a665-0bbd060c93c2\\})|(\\{bd4a9564-fe81-400f-817f-34ba2a8260b2\\})|(\\{810e482d-b665-47e2-b379-ec3467c20885\\})|(\\{ab4a0a76-c868-4d09-9c2a-eeb97cf9d619\\})|(\\{96af6f96-61e2-43a1-947c-6b64ae1ce4cc\\})|(\\{04506315-3a1e-438f-907e-911752779c4e\\})|(\\{84d60f20-bff3-4e8b-8f04-03772be12178\\})|(\\{b56e4968-96b5-4682-b5a2-0811d22de46a\\})|(\\{e231b78c-557a-4f25-8ebe-0e18b8250cd9\\})|(\\{ed8f73c8-837a-4f33-99e0-a732cd64b760\\})|(\\{d1e681c5-4a4a-48b6-9abc-94a7fef3ced0\\})|(\\{494316a8-ee80-4b55-bc54-7e8588c91ee0\\})|(\\{87ca6636-e805-4c4f-a18f-9ea116d7c54d\\})|(\\{13cbb51f-509a-4a48-91b4-a9d83dedacc8\\})|(cryptogenius@geniusvibez\\.org)|(\\{f6c2064a-4977-4a4b-bc5a-352e00a1f458\\})|(\\{3ead5ed5-287c-4e2e-b62f-c657fefb7535\\})|(\\{6b8288d6-ae78-4593-8867-def79fe67a0f\\})|(\\{0ddda455-fadc-43d5-91d1-d1ed196ad5c7\\})|(\\{532c54ab-68f0-4e14-9f5f-382c6528e094\\})|(\\{7b990d1b-6515-4b8d-b0b1-400263c66155\\})|(\\{aadc7d87-c1b9-4399-9de5-d72ecaff0979\\})|(epiplex500suite@gmail\\.com)|(afp\\.testmaster@orbium\\.com)|(\\{1d1fe9b8-775e-4e9b-99a0-6adcbf1fbe10\\})|(\\{4aee20b8-7deb-42d6-8444-a7b51ab9eabb\\})|(\\{8790c850-f399-4b6b-8a43-85c10c5cdbe3\\})|(\\{55488e07-6e49-4d3b-aec4-ee2e520a5ed4\\})|(\\{1608692a-88e8-4717-a776-7be334de6767\\})|(\\{8f137ffe-8aa6-4358-a1a8-210fa87e7e22\\})|(\\{0866afdf-a997-453d-91a9-7094f617cd65\\})|(\\{b1ffc188-73f6-4e92-95d0-a579164fbc6c\\})|(\\{3d776d4c-44f4-4924-97f0-e47429e384d3\\})|(\\{9d2cadf8-68e0-43db-b763-390969d86976\\})|(\\{a0b5a5aa-423d-4115-962e-768136b0fd14\\})|(\\{0d625dd9-5d09-49ce-a811-5ed9ae5ef12f\\})|(\\{7273612b-2c57-4058-a09f-e576e8921829\\})|(\\{70529e5c-b73d-4585-9573-6e21bd6e64de\\})|(\\{e7626ba4-02a1-40b5-8186-b49da9d46c8a\\})|(\\{81425682-f86d-42a7-a46e-f31d80ea32ce\\})|(\\{5349a75b-df13-45ac-b4d5-1384d3446288\\})|(\\{2ea5ae79-9f90-4b7a-bdc6-5a9c4ddf7e59\\})|(\\{c496f3dc-56db-41a8-a6d9-d9225231528c\\})|(\\{dd13f534-b713-4d14-a55f-b2e9a4946b1b\\})|(\\{26f3910e-2cff-4cf6-94ee-69169f9cae9e\\})|(web\\.testmaster@orbium\\.com)|(Linguify@LinguaNext\\.net)|(jmendez\\.developer@gmail\\.com))$/","prefs":[],"schema":1576757626491,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"96cd4440-6535-4d3a-a653-ae78abe6c312","last_modified":1576771657149},{"guid":"/^((\\{9c9cee47-6017-49ae-a8f5-36dacedfd9f5\\})|(inventoryspy@rebelsoftwarellc\\.com)|(\\{d5eb06b6-4f8c-4e98-9a46-180489db4bfb\\})|(\\{f539f4d9-5517-45a6-820e-91fd4d97ff24\\})|(\\{121701b4-d1f7-4328-80e7-34d7ce8d0d35\\})|(\\{af38d921-d151-4c46-a1f4-35f334bd5c2f\\})|(tvgitial@chmyway\\.com)|(\\{0b155b79-fa2d-453e-9a73-04b84a5f41db\\})|(\\{3833fb94-3b74-4ced-82d9-6e93cdcd073e\\})|(\\{9c3bbb7a-7c34-4073-9be9-241a3b10d521\\})|(\\{f06cfeac-c9d7-422d-b935-2e3cf7960a16\\})|(\\{9832fbba-ad56-41ad-9ef6-f91571fe0282\\})|(\\{887e6f78-084c-49da-9efe-410c6327dcfd\\})|(\\{48b31a31-0a1f-496c-8422-79991ec5f0d6\\})|(\\{32e7af7d-e621-4c6e-9fb5-ef31277a92b1\\})|(\\{29e731e0-47eb-40d3-a108-e3ba637ebd99\\})|(\\{265b0b17-caba-4eea-9822-fb669b603eee\\})|(\\{af6ecd70-5458-433c-a471-ca3221172ba2\\})|(\\{d9ac7759-d00e-4464-b110-362bcabf81d3\\})|(\\{4fb65352-528b-4f89-b66e-7fb6c4bd0a66\\})|(\\{588f4204-1a98-4ba0-b0d9-f48fe9a8c505\\})|(\\{5f553bb5-2139-4148-8cb6-a64f0664a148\\})|(\\{8d246dd2-72dc-4c84-aac2-c270a4beaae7\\})|(vk-downloader@addoncrop\\.com)|(privpow@gmail\\.com)|(home@bestools\\.net)|(themerapp11@gmail\\.com)|(privacysrched13@gmail\\.com)|(\\{1b9ad43b-33c7-49a1-91e3-de51de6392a7\\})|(\\{c92f123f-5300-4ca2-8e4b-2bdda8b60fd1\\})|(\\{5296e254-0b4e-4424-a044-9dbaa155e461\\})|(\\{ba633e33-46f7-402d-a98d-b6414baca4c8\\})|(\\{0e7f1d32-a30e-4be0-ad95-4433938d1aec\\})|(\\{1bc8ed9b-589a-45b8-90de-e372a98f7374\\})|(support@seogb\\.net)|(\\{9eeb49a7-2307-4eca-9ddc-946f29094497\\})|(\\{d8e7b5a5-6255-43b5-b371-8d76795705fd\\})|(\\{aa54cbfb-60a4-4aa0-a571-3594e718e9cf\\})|(\\{120023d0-20a4-4748-ad26-3de4a02452e7\\})|(\\{7472868d-16d8-45f8-bddd-6e32b5aac916\\})|(\\{177f7dc2-f9dc-4a79-bd4b-e6928bb86c82\\})|(\\{95313ed3-c9bf-46e0-baba-89e78b31709a\\})|(\\{54a9afac-8c97-4d7a-89a1-5f35858c2c5e\\})|(\\{914859e8-d803-4386-bd7b-10fc45586c3a\\})|(\\{8c965153-3a54-4b59-8b49-d89b1a46256b\\})|(\\{74eee9fc-da0e-4da1-8345-5a9b0be4012d\\})|(\\{6269bb9a-167f-4488-85b6-d3644bc5959e\\})|(\\{a0204e2a-ecf9-432c-a586-861172f77038\\})|(supportv8@seovpn\\.net)|(\\{52adc630-673b-44bb-9417-ab1ce1924465\\})|(version7@private\\.pitorr\\.com)|(version7\\.0@private\\.pitorr\\.com)|(version7\\.2@private\\.pitorr\\.com)|(version7\\.3@private\\.pitorr\\.com)|(\\{417a74a1-0d88-4240-8eab-53d1791f2bc0\\})|(\\{d7fe8027-22ef-4655-9c58-abcfb5b664fe\\})|(\\{9e666ac6-61f3-4e6f-bfe4-65162e35530e\\})|(\\{c6aed3ca-9da5-47fc-a828-9f5fa9aefe8c\\})|(\\{9f24dccf-d8b1-4316-90c9-3f516de2d2ef\\})|(\\{9d894603-93e5-4032-bc5e-3da1a50552d4\\})|(\\{00ca785e-6f23-4ca4-ab70-095a77a5de9e\\})|(\\{e233bed6-db39-40c4-b7f4-445e3239976c\\})|(\\{736a1e9c-8661-4f1c-9c93-396733caec96\\})|(\\{7ee265d9-0002-4f49-963b-93ccc9b0600d\\})|(addon@google\\.com)|(\\{a5bf6735-48b3-47bd-9258-e2d9dfe51467\\})|(\\{c6344599-1b07-444f-922b-7da1b12e086c\\})|(\\{e10cc63d-6a1d-4079-be47-ae0f6da9d821\\})|(\\{dc08bc05-97b7-4743-b433-fa5f85d3cf9f\\})|(\\{9eb8c864-3074-4469-8dbd-a0b212cbf8a5\\})|(\\{b43ab2ab-ca39-493c-b619-d93ddfc06440\\})|(\\{fab4cffc-c147-4bf0-8ba3-890609d47801\\})|(\\{45b8bc88-8c38-4447-9260-e0b2463cdcc6\\})|(\\{1938d918-a139-4881-8894-da9c8aff8ff0\\})|(\\{654b97fe-5daa-4314-a23c-2683ca5febb1\\})|(\\{e0b91972-8a76-4de0-bdaa-94418110552a\\})|(\\{8771d5d1-b560-41d0-8e0f-513238bc0153\\})|(\\{c49e5fd6-c3ea-47b6-85a8-d4d7cd4ac0d2\\})|(\\{7d7baa33-41c1-4001-b092-49a2d3ccdd16\\})|(\\{bb410263-f989-4bb3-a35d-fe96c07bc3be\\})|(\\{2e2d4e6a-e416-4e4c-9003-937e2c8016b1\\})|(\\{de458959-00f8-4f60-8d61-3fab157047e6\\})|(\\{9be4f97d-c6a1-42dd-a1c6-15adad9c2741\\})|(\\{59a3cf6c-584a-405a-b82d-c868f91d87e7\\})|(\\{7de1ff31-cf17-45b8-a55a-0e1608ac0627\\})|(\\{90375b4e-d778-442f-8113-212f3dbe9807\\})|(\\{8f3bf9d3-673a-421b-a326-9d8d6bcc4511\\})|(\\{8f250e7b-ea2a-4f86-ba1a-1bfef8ced945\\})|(\\{efca6935-6abb-4c28-acee-8f3ef1272640\\})|(\\{513bda76-dc3e-43f5-9f12-b9e85ac1006e\\})|(\\{9c5ea91f-d350-4521-b6d3-097d11fac75a\\})|(\\{302564ab-b478-4a60-a2a1-3aa79e3d4fa5\\})|(admin@fmt-tools\\.com)|(\\{efc8bdda-29d3-4212-8a61-6935da123d27\\})|(\\{5b3a9105-1845-4769-a64d-3c104fd07cae\\})|(\\{85b82e36-9da8-4c63-805f-5c6b994cd079\\})|(\\{d42fc5f0-9975-4955-887a-efb1d416762a\\})|(privacysecure@mybestprivacy\\.com)|(\\{205cd703-9bdc-49b6-a54b-b998de75a1fc\\})|(\\{8bcfc643-82ed-4cc0-89cb-3ed4bea284af\\})|(\\{1e2fbe56-fa52-4083-b128-91ecbdce727c\\})|(\\{b438893c-5d1d-48ee-87b0-6c9aa56d5689\\})|(\\{0f4c6635-5e84-44fd-afde-2755e2b920cf\\})|(\\{c6630e49-5bc9-4244-b70a-7a64db71228a\\}))$/","prefs":[],"schema":1576757655712,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"463ffae2-9ecf-483a-957a-9e57ed056b63","last_modified":1576771657145},{"guid":"/^((youtube-mp3-converter@addoncrop\\.com)|(\\{3c8a6237-d40f-4aa0-bc66-cb6dc0ded2d3\\})|(info@example\\.com)|(youtube-downloader@addon\\.partners)|(\\{9e8611a8-c441-4d6b-881f-d1d62c4f90a4\\})|(adb@stellarwind-android\\.de)|(\\{5364615d-4d6c-45cb-aee6-2db1b76006f7\\})|(\\{1bedde37-78d6-43e4-b3ab-54336f293345\\})|(\\{7853bd47-92eb-4734-8371-dad645895f23\\})|(\\{a878339f-334e-433d-b0ac-9c799c8a6df3\\})|(\\{5dd737e5-c9f4-4b1b-86f1-5a3aefecbe26\\})|(\\{5165c342-3181-49d1-bf23-2be2d8d8cd5f\\})|(\\{e94887d3-558f-415f-83d3-4500d0604e4e\\})|(\\{80f26b45-b5db-45df-b92b-dfedfccfe2d1\\})|(\\{ebaf3af1-cd42-44b0-8a0a-5adc22dbb152\\})|(\\{bce1fb2f-1bcd-4a25-a9cd-29cc3fe21dc4\\})|(\\{fc528fa4-3528-4575-93a0-f07428654105\\})|(\\{432a4cf4-8f0c-4ab5-b3e8-e78c17d4b9f8\\})|(\\{260bf76c-b563-41d1-8a7c-0f669306a9f0\\})|(\\{7346a6e5-aec7-43d1-9135-a3b99f538bf3\\})|(\\{22af4413-6bc5-47f4-824e-ab4f15452d02\\})|(\\{8f02443a-3e5e-4160-8eda-04e104dcd804\\})|(\\{b2580f2b-bd01-4f3d-af4c-89b8bf0d2d92\\})|(\\{9e5da5b0-02d9-45f0-869b-05014c2e70cd\\})|(\\{df8a06b4-e785-46d7-87c9-a32ac5700696\\})|(\\{6eeccf3d-479f-47ab-8b9e-3f8e98d6b1de\\})|(\\{d9f5995c-0f9f-4f61-99d3-bde3676f2fa6\\})|(\\{d7f04f66-50b5-47eb-9394-597e3f712c2f\\})|(blablatina@mailnesia\\.com)|(blablatinaa@mailnesia\\.com)|(mykibetesting@gmail\\.com)|(\\{c115630b-bf15-46d5-a5ae-b053e8a99ba9\\})|(mykibetesting@ghghgh\\.com)|(mykibetesting@testmyki\\.com)|(mykibetesting46\\.2@mykitext\\.com)|(\\{9917e548-009a-42bf-bfc7-54206e036ec7\\})|(\\{46e67e2e-236c-4ab9-82ad-12b412fa787f\\})|(\\{a1676ab3-281f-40d6-a636-ce19f7f5f859\\})|(\\{d43dfd69-7730-441d-937d-c437a6c437e6\\})|(\\{1fd94b47-2148-4b97-a4b5-623168904694\\})|(\\{a41a3038-1cc8-49ca-8390-a82f913e1b03\\})|(\\{8f554d4a-54b3-48e8-b2b9-883d80627758\\})|(\\{5d61791a-b908-44a2-9066-8ecd2f70a5bf\\})|(\\{5eaafeba-bb8b-487d-8a52-45862d820f4d\\})|(\\{a3cce15f-afbb-4a03-9ca9-60981827a93e\\})|(\\{dd1031d0-40ba-49f5-97e5-82f371d93ee7\\})|(\\{9f9e1012-2b04-4a3f-a4f9-bb841bc7a1be\\})|(\\{f0c68322-bd46-4993-a526-7791f702f086\\})|(\\{98a9898c-f2aa-4833-bc38-b3625647e49f\\})|(\\{75a72d8c-b801-4487-b83d-a210f2fab6b4\\})|(\\{75a72d8c-b801-4487-b83d-a210f2fab6b5\\})|(\\{dbc0aede-945c-4a9a-bc92-585c0e2835fd\\})|(\\{42d93019-2dd9-49a4-b386-af5d13dbb14c\\})|(\\{fd15bd74-4a8e-43e3-a5a6-8f7bfc316bfe\\})|(\\{9b7226b7-8a21-4dad-9766-7c94a06d69ae\\})|(nancyseopro@gmail\\.com)|(\\{b3ef58d1-d4eb-4e48-9eba-d17600bd2ce8\\})|(\\{9b99b90a-52e3-4e7b-a1e0-5c905bf86ca6\\})|(\\{ed754bf5-b0d0-4ae4-b19b-f240e591c213\\})|(\\{2800be5f-6e20-4b21-9a3c-eb5e94205d9f\\})|(\\{4321d5f9-9a06-4972-9480-6d32d0e9ed12\\})|(\\{2774d25b-053e-44a1-b903-4e86b5bbd2f8\\})|(\\{e155420f-e615-44bc-8d7e-bc73bd0e7ecc\\})|(\\{4e4ef05f-a637-4c4e-bd22-5533e0060ef9\\})|(\\{306f60e4-ef19-4037-9c82-c2898ff17432\\})|(\\{b9374b95-4938-46fa-9507-ef877582c0d2\\})|(\\{dc395849-97bb-4456-9b79-c263a83b40e0\\})|(\\{04ae852b-bbb5-475f-8b25-3da4b15893ba\\})|(\\{91f96cf6-7bde-474b-a0b1-dbfc60db6bdb\\})|(\\{b8aac9a1-08b9-47be-97a4-7e4e0462bdfa\\})|(\\{6db30b4c-0e2d-47d0-abe6-66b778818b42\\})|(\\{4e0ea2d4-786c-4c20-9f1f-12c3734de966\\})|(\\{98ec3e35-c63a-43db-aeb7-050b350f3036\\})|(\\{a6acb773-94f9-4440-9e48-393f50989f5f\\})|(\\{363faa67-80da-4378-a20f-d32492eaab78\\})|(\\{76d55e31-5870-45f3-8862-a7006951cedc\\})|(\\{a2ff5043-dc7b-4c20-b924-135349641b95\\})|(\\{a6cc4862-ac6d-41e9-b208-cf5b280aa41c\\})|(\\{88bfe254-1837-426c-8f48-15235d69663d\\})|(\\{0cffb3be-d34c-4e38-88cc-9e4c68aa5456\\})|(\\{543b980f-e6a4-4077-b633-64ba72cae82a\\})|(\\{d2f2d8e1-7809-44fa-8309-1d41fc09db31\\})|(cht@cobraro\\.com)|(\\{40aac576-c1cc-4ef4-9ff4-90016bf5b54e\\})|(mykibetesting46\\.18@mykitext\\.com)|(\\{afb010de-7961-41d0-ad72-6c6beb05e34c\\})|(\\{25d0b02c-3c47-11e9-8f6b-9be053c51313\\})|(\\{8a146307-6862-474c-b113-8ecf993f1cfd\\})|(\\{4c0f9c72-a81f-49bb-a921-ae24cca16d70\\})|(\\{bd3b1f37-4e61-46cd-b521-925eb3ad3c25\\})|(\\{8d0b1c60-ebb7-4b7b-ae63-c40cf90e68df\\})|(\\{80690353-afb7-455f-b93b-78c7acc19962\\})|(\\{ca593a7a-bd77-4abf-8014-d1fa89006c64\\})|(\\{850be3a2-ca5f-47ad-838c-fe39b006e0d1\\})|(\\{b865704b-ca40-4939-81f1-89ef3b4eca3b\\})|(\\{7ecf61aa-e961-4704-88ac-4d8547ac35e8\\})|(\\{c63d3200-dce7-4090-b383-140a906f9aa2\\})|(\\{14d487f8-6eaa-4bae-9cb4-f604a8e4ac89\\})|(\\{86131ede-587a-4900-8c8c-4779570bff3b\\})|(\\{02229a36-d71c-4999-a319-7a072017dd5c\\})|(\\{e31ad00a-45d1-4397-8b11-9eb0e160787f\\})|(\\{1491c081-4e0a-483f-bdc4-96f5a248438c\\}))$/","prefs":[],"schema":1576757686245,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e2dd31e1-4dfd-4dcc-ad4b-6d9ca4b7ed20","last_modified":1576771657140},{"guid":"/^((\\{df59cc82-3d49-4d2c-8069-70a7d71d387a\\})|(\\{ef78ae03-b232-46c0-8715-d562db1ace23\\})|(\\{4d12d613-99d9-4160-ae6c-5153e5ab0f3c\\})|(\\{41efa652-3fca-4f95-b828-8ed1fba66a84\\})|(\\{4c52e311-8d5b-4a10-95bc-b1b1e029c8d5\\})|(\\{cd627ef1-1059-4ed9-9217-1971806a9ed3\\})|(\\{c01e7fb9-2a24-4cf0-8562-896d53cd5a59\\})|(\\{83d91178-0a1e-4270-a901-b8e83aec3d0b\\})|(blabla@reallyimportantthing\\.com)|(\\{be2309ea-6113-4a99-bd3b-3b88c95cd41d\\})|(\\{02a5f8bb-9ffb-43c3-86d6-072d7316ff6d\\})|(\\{7e874309-fbf3-463b-8690-6ead9efccea0\\})|(\\{7420132f-055f-4f37-a962-3bf9ce42d798\\})|(\\{22c0c5ea-c554-498d-8a66-4c5b4be2f5e8\\})|(\\{ff95833e-5a0a-43cc-910a-e2859bc99ade\\})|(\\{92495a3e-062b-40e7-91e3-6b415c694c57\\})|(mykibetesting47\\.1@mykitext\\.com)|(\\{96cde09b-2d70-41ee-acf6-548728846d48\\})|(mykibetesting47\\.1000@mykitext\\.com)|(\\{98f556db-837c-489e-9c45-a06a6997492c\\})|(\\{bb19d814-d035-4f5d-b291-9b26e4a7fd37\\})|(\\{56a1e8d2-312d-4222-aca5-eee58e0f1234\\})|(\\{9cc56d18-c8fb-436a-861a-128cf2fc580c\\})|(\\{27eebcd1-7ef4-4de3-9d5e-db9e2348c990\\})|(\\{71d3ba6e-e461-44fa-8f27-02c6dbd9b653\\})|(connect@seovpn\\.net)|(\\{859bf655-0266-4f21-9c52-3bd156896259\\})|(\\{adc5c6d8-ac87-4b5f-b885-1adfd00265a7\\})|(\\{d826e099-f797-401f-b363-c03f29a8f9b7\\})|(\\{5621e792-bba7-4e66-a63b-56a9e145c089\\})|(\\{c3e4070e-7845-41fd-8996-8817bbc28790\\})|(\\{eb256992-3498-4262-9c7e-ac82f93aeaca\\})|(\\{da9d1606-dfde-429c-bb6a-63ebe5f8412c\\})|(\\{41e29257-1089-42c8-9d59-add5a0003ffa\\})|(seovpnv5@seovpn\\.net)|(direct-apk-s@eladkarako\\.com)|(\\{376063b4-f6b8-43e9-928f-437ad0ec5333\\})|(\\{b78bf75a-3cea-436b-b081-c9857f295618\\})|(\\{9b8ec882-b5dc-4df2-b9eb-097ba4dcb4b0\\})|(\\{8c0f6ff5-8ea2-4da0-be7b-e588baa02a03\\})|(\\{88295bde-3fc2-4bf9-8090-872d223f2f92\\})|(\\{67582ce8-8c5e-4207-9694-5b0ecc77887b\\})|(\\{db443bc5-4f91-4c82-a14a-298575ff6aba\\})|(\\{d7709ac2-bcde-4d15-a1a7-c459fe592d8e\\})|(\\{40fbe322-ca79-4472-9ac9-0d493f2623da\\})|(\\{77ca86a6-2042-4519-9cd5-4f5fd036d0eb\\})|(youtube-video-downloader@addoncrop\\.com)|(youtube-video-downloader-ff@addoncrop\\.com)|(\\{ed48a832-c064-4d79-bf2e-3c5b21242b3c\\})|(\\{1ce93624-96e6-449d-b038-3380db21cc48\\})|(\\{8957639f-8577-4df9-a1a7-f6d5a9fc9fcd\\})|(\\{c07d8367-6c2d-4a7d-a9ab-207b3104359f\\})|(\\{c4d3f949-60fd-45d5-9cc0-2501319bb60c\\})|(\\{b23bc17b-9fba-4a49-9afe-a1e9cd49c73b\\})|(\\{9f814c7c-0161-4cd4-9d19-50e203f5160c\\})|(\\{0a04ea15-85b4-40ac-a1d1-a6fb5967fb3b\\})|(\\{7bd5a0e9-e8c0-4e64-bda5-7b5310629777\\})|(unlazy@eladkarako\\.com)|(unsecure@eladkarako\\.com)|(xda@eladkarako\\.com)|(direct-filehippo@eladkarako\\.com)|(real-url@eladkarako\\.com)|(\\{63fcde93-baf6-40b5-892c-29cc34365b57\\})|(\\{2913327e-bd0b-4962-adce-2f44407fb521\\})|(\\{88f2e8f9-a7e1-4d68-901d-e5a9c805f4fa\\})|(\\{fd4fcb6a-cad2-43ab-b1c5-efd4d2102de8\\})|(youtube-mp3-converter-ff@addoncrop\\.com)|(\\{0a90b652-0de6-421a-bfee-1d2c5c3ee8fe\\})|(dropeextool@gmail\\.com)|(add_archive@ext\\.xpi)|(\\{47aa471f-3cf1-4a22-9c99-ab5baf326a60\\})|(\\{ac01f6a8-7c30-450b-9979-98d0c7795e11\\})|(\\{2c09761e-2c89-4537-b335-2bd30a7136c2\\})|(\\{c55ddee5-baab-4c90-9948-ca47033a82ce\\})|(\\{5cdb4845-56a8-45df-936b-de8279f2587d\\})|(\\{ea68dd52-2470-4d7c-b563-9a4c6d0e7eab\\})|(\\{01d33686-cab1-4f3b-b2ad-83bc1c35c60a\\})|(\\{fcb61a95-e861-4cf1-801b-f91c75c4714a\\})|(mg3a2mzdsug6fou4k8yk@mg3a2mzdsug6fou4k8yk\\.com)|(wh70nimqtlpwt951i12a@wh70nimqtlpwt951i12a\\.com)|(\\{b64109f0-5d2a-4c86-a38c-886589cb2703\\})|(legacy@context_search\\.com)|(\\{7b49d8bd-1e29-4887-9165-a272f553a154\\})|(\\{a49d6fa5-1967-43ed-b8bd-586f206326cd\\})|(\\{8b14f730-34fa-41e7-9590-d44df583a57f\\})|(\\{01dda21f-3b94-4297-b302-d92535b2e880\\})|(\\{6a33fb2c-3d3a-401f-be54-342ef4d57d1f\\})|(\\{887a4a9a-63ed-4af8-b82b-b68e9c23d39b\\})|(\\{6cae6de5-ff67-4682-a72b-39a1747fc682\\})|(\\{c5b5ac10-8592-4ee9-ad7b-003bb9706f87\\})|(\\{2fb3dc77-de0c-4e34-be3b-13a92bffe898\\})|(\\{82a92837-91de-4282-95d2-bda6d4ac682f\\})|(\\{dae5d3cf-42ba-40ad-85d9-482e25d4682c\\})|(\\{2328a4ad-9d5c-47fa-b580-c7d488bd7a7a\\})|(\\{deb5ba3b-3cf9-4333-99e3-ae2651a5297d\\})|(gespindola@unisuam\\.edu\\.br)|(\\{4518dbc6-fc51-4292-8d85-6eba66959dcb\\})|(\\{7864e12a-8628-415e-8ae8-5ac25edaa420\\})|(\\{b56e7db0-5504-4dd2-8c21-7fb645adae38\\})|(\\{c78ac5a8-0005-4cfb-8a01-5d116a225377\\})|(\\{468301ed-b30f-44f9-85aa-d5ff4c840008\\})|(\\{ae45b0a5-a02e-41df-8a2e-f745d7a7ede3\\})|(\\{f42b032c-3017-44d5-99a1-129524d02494\\}))$/","prefs":[],"schema":1576757713908,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0f3e4d6d-9b1c-4fe1-940a-2871943bac88","last_modified":1576771657136},{"guid":"/^((\\{7e81d973-d606-4f4b-a61f-9c37612c3947\\})|(\\{651d950b-9db7-445f-8263-2dd18265ed3b\\})|(\\{d408b96a-203d-462a-9577-84afb08aa951\\})|(\\{e1fc8acf-65d6-48a2-89d9-410a32bd86da\\})|(\\{1e9302af-a3e1-4c7c-8416-f814dd796cb9\\})|(\\{c4aba9b0-df06-4fc5-8e64-37f99df5e9e9\\})|(\\{24399e9e-50ef-47c3-a728-ebf3af91a0c6\\})|(\\{bdf866a5-ebdd-4e7d-b624-49b53be98a4b\\})|(\\{9ab09f29-f294-4bdd-a58a-c3abea54f032\\})|(\\{b678ee0d-0e1f-433d-8ce8-93e1b51b8834\\})|(\\{6ed0906f-7926-4fc2-ab60-1577631641b2\\})|(\\{0bed1847-54e3-40ac-9cee-0ffd6e4acf1f\\})|(\\{09041dc2-0caa-4955-bf87-de874a0c6b7b\\})|(\\{035ff918-be13-4906-bba3-25153c30b8c4\\})|(\\{e81cbba6-39d5-4f33-a6be-3b99545b54b1\\})|(\\{67d8820b-3078-4835-ab7a-11befb521d33\\})|(\\{c5ad3a58-824c-4db4-8f2c-33b91565417f\\})|(\\{6e289bc1-ab94-44be-adf7-deb1a85cf809\\})|(\\{f6a3d54b-bf6f-4878-881e-a521065412c4\\})|(latest-extension@surviv\\.io)|(\\{3ee8d899-be15-45e4-8c09-a1c10febfb4d\\})|(\\{7ccf5eca-d275-4967-939a-7b9b91d9e0f2\\})|(\\{cd8542c3-3c8e-4fa1-8463-4c5ea7aa25ce\\})|(\\{2994abd2-02a5-4c66-9fd2-38ad8d911324\\})|(\\{10a69518-499c-4339-a733-8ac27166a400\\})|(apzsqkoq0oxjal69l9zr@apzsqkoq0oxjal69l9zr\\.com)|(mbanzzhnky54hoe6jq62@mbanzzhnky54hoe6jq62\\.com)|(\\{ce926acf-d6ab-48b0-8e5d-82257de14011\\})|(\\{c42394d0-1c76-4e5e-8a94-f7c4a2de2ada\\})|(7eylx2qcpshoiehzcl2y@7eylx2qcpshoiehzcl2y\\.com))$/","prefs":[],"schema":1576757777185,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8f82683f-a1c2-4f61-bf9b-8f279d35f746","last_modified":1576771657132},{"guid":"/^((Astro_Connect_BHZNbNOGmL@www\\.astro-connect\\.com)|(Astro_Connect_HRMdSrojBR@www\\.astro-connect\\.com)|(Astro_Connect_lAOPFWMnqc@www\\.astro-connect\\.com)|(Astro_Connect_vMYMzqvERv@www\\.astro-connect\\.com)|(Astro_Daily_Online_1090c71e5da3cd9ab2d6af4985b43f5c@www\\.dailyastrotab\\.com)|(Astro_Daily_Online_clone_b82a3c2703d37e513b428067a34655d8@www\\.dailyastrotab\\.com)|(Astro_Daily_Online_clone_hqNzpeWZrm@www\\.astrodailyonline\\.com)|(Astro_Daily_Online_GzIzTViMnE@www\\.astrodailyonline\\.com)|(AstroDailyOnline\\.com_a7f59cbf31536249d41b97278115b17a@www\\.astrodailyonline\\.com)|(AstroDailyOnline\\.com_VqZjYRsphH@www\\.astrodailyonline\\.com)|(Bible_Quotes_97910bef6e96a7d0569f5fb44b2c607c@www\\.bible-quote\\.co)|(Bible_Quotes_clone_9699f1b771e162467f078c076eb9b695@www\\.bible-quote\\.co)|(Bible_Quotes_clone_wYibuualSr@www\\.bible-quote\\.co)|(Bible_Quotes_PHMyuAzCPa@www\\.bible-quote\\.co)|(blackfridaystoresco@www\\.blackfridaystores\\.co)|(Browse_Manuals_3ff31012f87f9a4c01e1ef723f48eff1@www\\.browsemanuals\\.co)|(Browse_Manuals_ca51c107572ab179fc1e8d4b652b19e1@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_2dbeb0fd48d84ff3a5d3e3a7b5fc3756@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_biPZDTWfln@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_ksNBKBSmge@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_lcMJgmivkD@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_UaWIZDqLBJ@www\\.browsemanuals\\.co)|(Calculate_Fast_uWtHrQKgWv@www\\.nowcalculatefast\\.com)|(cheapflightfaresco@www\\.cheapflightfares\\.co)|(Check_Astro_Today_wkptBasvVf@www\\.checkastrotoday\\.com)|(Check_Astro_Today_YgMcUMJFVL@www\\.checkastrotoday\\.com)|(Check_Astrology_GGZGReDTnd@www\\.checkastrology\\.co)|(Check_Directions_RmiiKOUYTf@www\\.checkdirection\\.com)|(Check_Mails_clone_tdpeulgItk@www\\.check-mail\\.co)|(Check_Mails_iLVZDNXtnY@www\\.checkmailsnow\\.link)|(Check_Mails_ITnrNsNpcj@www\\.checkmailsnow\\.today)|(Check_Mails_Now_clone_oOzxmNgfQn@www\\.checkmailsnow\\.net)|(Check_Mails_Now_clone_vVWZzkqahk@www\\.checkmailsnow\\.net)|(Check_Mails_Now_ePyetjMzel@www\\.checkmailsnow\\.link)|(Check_Mails_Now_IfFzRcCuJa@www\\.checkmailsnow\\.online)|(Check_Mails_Now_OqRkgMLHGo@www\\.checkmailsnow\\.live)|(Check_Mails_Now_pHoBMgvLtK@www\\.checkmailsnow\\.net)|(Check_Mails_Now_QMsZiFhjjH@www\\.checkmailsnow\\.online)|(Check_Mails_Now_qOSRXKCsHK@www\\.checkmailsnow\\.net)|(Check_Mails_Now_vnjdpXGSWk@www\\.checkmailsnow\\.net)|(Check_Mails_vNOoNISpGM@www\\.check-mail\\.co)|(Check_Maps_3ec1ffc98971e67fa854369f9e3486d0@www\\.check-maps\\.co)|(Check_Maps_BezZcNfeab@www\\.check-maps\\.link)|(Check_Maps_bKaiUcBTpN@www\\.check-maps\\.net)|(Check_Maps_clone_RUjCUUeRwF@www\\.checkmaps\\.co)|(Check_Maps_KzXAqTbRZi@www\\.check-maps\\.co)|(Check_Maps_ogQkeJhGuf@www\\.checkmaps\\.net)|(Check_Maps_SwGvtYCSWM@www\\.check-maps\\.org)|(Check_Maps_uYfjFOesyI@www\\.check-maps\\.org)|(Check_My_Mails_iAClnrnvyj@www\\.checkmymails\\.online)|(Check_My_Mails_TYlXbVPRXn@www\\.checkmymails\\.info)|(Check_My_Mails_XvyJVrZWQX@www\\.checkmymails\\.info)|(Check_My_Mails_ZAVfjZCgnv@www\\.checkmymails\\.co)|(Check_My_Speed_Now_OsGaqlODan@www\\.checkmyspeednow\\.com)|(Check_My_Speed_PQiWezZbqs@www\\.checkmyspeed\\.co)|(Check_My_Speed_qvklQhzugJ@www\\.checkmyspeed\\.co)|(Check_Net_Speed_aAaAYSEawi@www\\.checknetspeed\\.online)|(Check_Net_Speed_EKnEHmaiYm@www\\.checknet-speed\\.today)|(Check_Net_Speed_IcfzRgdvIx@www\\.checknet-speed\\.today)|(Check_Net_Speed_rqJpoOAXqE@www\\.checknet-speed\\.today)|(Check_Net_Speed_SoVZYFExRY@www\\.checknetspeed\\.today)|(Check_Net_Speed_sXCrVEDGiO@www\\.checknet-speed\\.today)|(Check_Net_Speed_VQGJrJvlIm@www\\.checknet-speed\\.today)|(Check_Net_Speed_wCexanRKNz@www\\.checknetspeed\\.link)|(Check_Net_Speed_yTZgqCpFPi@www\\.checknet-speed\\.today)|(Check_Net_Speed_zCCNoLFHOF@www\\.checknetspeed\\.online)|(Check_News_clone_qPYbwwKpgF@www\\.checknews\\.co)|(Check_News_dGPwUXsQpF@www\\.checknews\\.co)|(Check_Speed_Test_KohJtFpgLB@www\\.checkspeedtest\\.co)|(Check_Speed_Test_XcYMLbMdlh@www\\.checkspeedtest\\.co)|(Check_Weather_clone_FJgKgEEkzT@www\\.checkweather\\.co)|(Check_Weather_clone_TwXCcjNBdE@www\\.checkweather\\.co)|(Check_Weather_Daily_65ec7723f6fbbe7786d60bd4e2643b1c@www\\.checkweatherdaily\\.com)|(Check_Weather_Daily_YxdeQsIzIP@www\\.checkweatherdaily\\.com))$/","prefs":[],"schema":1576757846784,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ff5d3b75-f26c-47cd-85df-32c193a8d002","last_modified":1576771657128},{"guid":"/^((Check_Weather_Details_26e944ef07a6d60d7e6e109df96aadc6@www\\.checkweatherdetails\\.co)|(Check_Weather_NkuDUpBOfy@www\\.checkweathertoday\\.com)|(Check_Weather_Today_1b92f68f44010297e79e167abdbbad90@www\\.checkweathertoday\\.com)|(Check_Weather_Today_2b5b41fcbe35242dced42efd82346b62@www\\.checkweathertoday\\.com)|(Check_Weather_Today_37f90d6081f0f87dde0eca340268dd06@www\\.checkweathertoday\\.com)|(Check_Weather_Today_421f2bbc2e93713f42200c4cf4184b2f@www\\.checkweathertoday\\.com)|(Check_Weather_Today_647dda58dab18a066b5edcd1bf82f244@www\\.checkweathertoday\\.com)|(Check_Weather_Today_8d106128d380304fbf7cf760284ed189@www\\.checkweathertoday\\.com)|(Check_Weather_Today_a6606d84c174672bdc97a40ae26a7329@www\\.checkweathertoday\\.com)|(Check_Weather_Today_a7ec7b0d21c0b719949374759fa27f9e@www\\.checkweathertoday\\.com)|(Check_Weather_Today_AGSeXIfuyC@www\\.checkweathertoday\\.com)|(Check_Weather_Today_c72d09cea0b53ffdd1a496e376b22696@www\\.checkweathertoday\\.com)|(Check_Weather_Today_cbc523bdd189c28af1505f104443a1cf@www\\.checkweathertoday\\.com)|(Check_Weather_Today_e448585b8ce80f90b04ad34b57c00d6e@www\\.checkweathertoday\\.com)|(Check_Weather_Today_ed0f6099cd2a8e05500657b43f897afc@www\\.checkweathertoday\\.com)|(Check_Weather_Today_EppkRAhhSW@www\\.checkweathertoday\\.com)|(Check_Weather_Today_f06201395c0dc5e1aa9fd68e2059dc18@www\\.checkweathertoday\\.com)|(Check_Weather_Today_fd6b11d8d8cad6bb654cf46a0e100cbe@www\\.checkweathertoday\\.com)|(Check_Weather_Today_FdVgvyMTJo@www\\.checkweathertoday\\.com)|(Check_Weather_Today_leAPNcsALh@www\\.checkweathertoday\\.com)|(Check_Weather_Today_LFHBoYhhIu@www\\.checkweathertoday\\.com)|(Check_Weather_Today_MJoPqcUdAA@www\\.checkweathertoday\\.com)|(Check_Weather_Today_neiEtvLsDn@www\\.checkweathertoday\\.com)|(Check_Weather_Today_NvAaeiHaWs@www\\.checkweathertoday\\.com)|(Check_Weather_Today_OGjNKxAeXE@www\\.checkweathertoday\\.com)|(Check_Weather_Today_uABqfeATcz@www\\.checkweathertoday\\.com)|(Check_Weather_Today_WKqJGOJnJg@www\\.checkweathertoday\\.com)|(Check_Weather_Today_xCOMPlhuXu@www\\.checkweathertoday\\.com)|(Check_Weather_Today_XmOwlHQNSl@www\\.checkweathertoday\\.com)|(Check_Weather_wktudKPpvh@www\\.checkweather\\.co)|(Check_Your_Mail_5697289aed4cf7b184d93e5c53117e07@www\\.check-yourmail\\.co)|(Check_Your_Mail_BZSHAsKTzJ@www\\.check-yourmail\\.co)|(CheckMailPro\\.net_CheZLENbVx@checkmailpro\\.net)|(checkmaps@www\\.check-maps\\.co)|(CheckNetSpeed\\.co_tkZoSRvsPg@www\\.checknetspeed\\.co)|(checknetspeedco@www\\.checknetspeed\\.co)|(Convert_Doc_Online_ptdllbDbTd@www\\.convertdoconline\\.com)|(Convert_File_JHjKeEFAkZ@www\\.convert-file\\.net)|(Convert_File_ocNpurmujk@www\\.myfileconverter\\.org)|(Convert_File_Online_JfGXnualjV@www\\.convertfileonline\\.net)|(Convert_Files_Now_8390db80d295eac08ca91cc1687ebf6d@www\\.convertfilesnow\\.co)|(Convert_Files_Now_afb77fba2ab7b055f10896e538ebd2f6@www\\.convertfilesnow\\.online)|(Convert_Files_Now_fzusJnJyIU@www\\.convertfilesnow\\.co)|(Convert_Files_Now_YEHBPCVZfb@www\\.convertfilesnow\\.online)|(Convert_Files_Online_cf2d8484b67f12d038789a618bae5465@www\\.convertfilesonline\\.co)|(Convert_Files_Online_RptGXHLRjE@www\\.convertfilesonline\\.co)|(Convert_My_Doc_771b3d45ecf0ab980ab0dfdcb9dc1c16@www\\.convertmydoconline\\.com)|(Convert_My_Doc_ofLnqzQpvZ@www\\.convertmydoconline\\.com)|(Convert_My_Document_ynCvryXblL@www\\.convertmypdf\\.online)|(Convert_My_File_0e081da9309e2ee8cbe6e5e1ca3373d1@www\\.convertmyfile\\.co)|(Convert_My_File_2451d924787cf4b696596f09fde42c2f@www\\.convertmyfiles\\.net)|(Convert_My_File_35bbde2206c3bb498f5033610ab82af6@disable\\.convertthefiles\\.online)|(Convert_My_File_68884222b56f8d972093a20f7d5fcf94@www\\.convertmyfile\\.co)|(Convert_My_File_e4a4b99e91c46c64d75d2795ac8e8d58@www\\.convertthefiles\\.online)|(Convert_My_File_GHurKBBhRg@www\\.convertmyfile\\.co)|(Convert_My_File_HlOKyXsynN@www\\.convertmyfile\\.co)|(Convert_My_File_sdaXbdSqCR@www\\.convertmyfiles\\.net)|(Convert_My_File_SiQYEMQoEO@www\\.convertthefiles\\.online)|(Convert_My_File_SJjGzfwuEU@www\\.convertthefiles\\.online)|(Convert_My_File_SzhPQAPUZF@www\\.convertmyfile\\.co)|(Convert_My_File_zOqNatevtM@www\\.convertmyfiles\\.net)|(Convert_My_Files_41f090cd741517aacdcc2c939b5ba94e@disable\\.convertmyfiles\\.net)|(Convert_My_Files_AcwjJWzydY@www\\.convertmyfiles\\.co))$/","prefs":[],"schema":1576757889686,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"92d2dcba-9f62-4b16-8472-843bc53efef5","last_modified":1576771657124},{"guid":"/^((Convert_My_Files_clone_AtaaUykZUt@www\\.convertthefiles\\.co)|(Convert_My_Files_clone_iipeyamXvF@www\\.convert-myfiles\\.link)|(Convert_My_Files_GcaMuSvchr@www\\.convertmyfiles\\.co)|(Convert_My_Files_ITTiqkJdem@www\\.convertmyfiles\\.link)|(Convert_My_Files_mOqWpDqFfS@www\\.convertmy-files\\.link)|(Convert_My_Files_ObjwXXGRmQ@www\\.convertmyfiles\\.net)|(Convert_My_Files_OdEReOXPeW@www\\.convertmyfiles\\.link)|(Convert_My_Files_WdZEfGNUyl@www\\.convertmyfiles\\.link)|(Convert_My_Files_ZSVwsGAvMB@www\\.convert-myfiles\\.link)|(Convert_The_File_ajAXskmxxC@www\\.convertthefile\\.co)|(Convert_The_File_decdQgcxcJ@www\\.convertthefile\\.co)|(Convert_The_File_lfLaRLbLCX@www\\.convertthefile\\.online)|(Convert_The_File_pVtEvdXWNp@www\\.convertthefile\\.co)|(Convert_The_File_YeFOCclGsc@www\\.convertthefile\\.co)|(Convert_The_File_yfsuYhYdaU@www\\.convertthefile\\.net)|(Convert_The_PDF_clone_52933220d40bf58153ba067b1c9c2a0c@www\\.convertthepdf\\.com)|(Convert_The_PDF_clone_929829a88637d12dbf08fd4f782a93b8@www\\.convertthepdf\\.com)|(Convert_The_PDF_clone_WZNDVMgflh@www\\.convertthepdf\\.com)|(Convert_The_PDF_clone_xmrWNxzVTQ@www\\.convertthepdf\\.com)|(Convert_The_PDF_e8cd3270f4b0eec8bd7ec39dfe2b411c@www\\.convertthepdf\\.com)|(Convert_Your_Files_546ea793afdb11f0c3cb3866dcb02379@www\\.convertyourfiles\\.co)|(convertfilestopdfcom@www\\.convertfilestopdf\\.com)|(convertmypdfco@www\\.convertmypdf\\.co)|(convertmypdfonline@www\\.convertmypdf\\.online)|(convertthepdfco@www\\.convertthepdf\\.co)|(convertthepdfcom@www\\.convertthepdf\\.com)|(Cook_With_Me_oYyEsUWTmq@www\\.cookwithme\\.co)|(Coupon_Club_App_20ef9a3e126b1c339a97a60672528026@www\\.couponclubapp\\.co)|(Coupon_Club_App_295813467b3bbbd03ed2574a3a379041@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_dMsjQwVamC@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_pahxCWSfWG@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_tLIovhcRov@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_UKQIyoDcSk@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_wgpiIAHAQx@www\\.couponclubapp\\.co)|(Coupon_Club_App_imfeKPFBRv@www\\.couponclubapp\\.co)|(Coupon_Club_App_vqwFoUyfpL@www\\.couponclubapp\\.co)|(Coupon_Daily_DGaEVQJCVN@www\\.coupondaily\\.today)|(Coupon_Dealer_rRkzTRGEcA@www\\.coupondealer\\.co)|(Coupon_Finder_Hub_8f0b12e405b7568785bcc785d6be30d2@www\\.couponfinderhub\\.com)|(Coupon_Saver_Plus_ffb1e922e2994e938b8f9aeff598c90d@www\\.couponsaverplus\\.co)|(Coupon_Saver_Plus_GTTzegkxqL@www\\.couponsaverplus\\.co)|(Coupon_Store_MlfSWWimyu@www\\.mycouponstore\\.co)|(Coupon_Store_Search_clone_AbsQujloBm@www\\.thecouponstore\\.co)|(Coupons_Flash_clone_TCfVLxCpbB@www\\.couponsflash\\.co)|(Coupons_Flash_fYMZkaoiDb@www\\.couponsflash\\.co)|(Coupons_Flash_WRjXiQAOwJ@www\\.couponsflash\\.co)|(Coupons_Magic_AuVOPUiczY@www\\.couponsmagic\\.co)|(Coupons_Magic_MaDWggNxen@www\\.couponsmagic\\.co)|(Coupons_Magic_ZebFYzkzoN@www\\.couponsmagic\\.co)|(Coupons_Tab_9a56fd9df10d162f000ef7dac2689e8e@www\\.couponstab\\.co)|(Coupons_Tab_sFSnaAFdDP@www\\.couponstab\\.co)|(Coupons_Test_uyywuEAPjT@www\\.couponstab\\.co)|(couponstore@www\\.coupon-store\\.co)|(CutePuppyWallapers\\.com_nicLwcUsfw@www\\.cutepuppywallapers\\.com)|(Daily_Astrology_fPoifgshwY@www\\.daily-astrology\\.online)|(Daily_Astrology_WPGvllFIRz@www\\.my-dailyastrology\\.net)|(Daily_Coupon_Finder_XefkJELubc@www\\.dailycouponfinder\\.co)|(Daily_Coupon_Store_cdowGuTgIr@dailycouponstore\\.co)|(Daily_Coupons_Tab_2c96becddbca0072a93db91266fbfefa@www\\.recipeboardplus\\.com)|(Daily_Coupons_Tab_HRcyzwBTWg@www\\.dailycouponstab\\.com)|(Daily_Deals_Club_yIvuSLfnXr@www\\.dailydealsclub\\.co)|(Daily_Easy_Recipe_OlMvwdldaK@www\\.dailyeasyrecipe\\.com)|(Daily_Easy_Search_95c6b38eb0f04a21212c678a43291d12@www\\.dailyeasysearch\\.com)|(Daily_Easy_Search_MVXtvNQzSj@dailyeasysearch\\.com)|(Daily_File_Converter_23db4a874fc066754c187eef894ccbe7@www\\.dailyfileconverter\\.com)|(Daily_File_Converter_25b0c49fa35ba08d5b33edd7b48f2c92@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_9d4c9a6f7a5c796c84a594619c1e6993@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_b4b0ea08aa61314c75baffd0246b9bcf@www\\.dailyfileconverter\\.com)|(Daily_File_Converter_clone_RDUYhKAKFi@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_clone_yuTWwUVfoL@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_cVmGYeldAg@www\\.dailyfileconverter\\.co))$/","prefs":[],"schema":1576757965088,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6944f445-4df8-4331-93da-1b32fc130849","last_modified":1576771657120},{"guid":"/^((Daily_File_Converter_ooPlASGwFM@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_QMxMSpDXIk@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_UufmFacjfR@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_vaLEkEAYJg@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_VhHvpeSnpU@www\\.dailyfileconverter\\.com)|(Daily_Game_Search_EaLACFoFKS@www\\.daily-gamesearch\\.today)|(Daily_Game_Search_muvQxhbZNu@www\\.dailygamesearch\\.today)|(Daily_Game_Search_VSZsYHVLcK@www\\.dailygame-search\\.today)|(Daily_Game_Search_XpyakjSRnr@www\\.dailygamesearch\\.co)|(Daily_Games_40e88a4d6ecfd9f9af84e1e6c7d76ffe@www\\.gamesdaily\\.online)|(Daily_Games_53113db02f9dd623b086f331ade6d2a6@www\\.game-quest\\.co)|(Daily_Games_a3083ae69e261df3b7d43f5282b250d0@www\\.daily-games\\.co)|(Daily_Games_adebc8294b5d311f8d3b5abd659e09f6@disable\\.daily-games\\.co)|(Daily_Games_b0819ccb9f64203af68bb05e00f36c2a@www\\.dailygame\\.online)|(Daily_Games_BhJRTCwnnH@www\\.game-quest\\.co)|(Daily_Games_BYlaCwrbCa@www\\.dailygame\\.online)|(Daily_Games_c342718e3fb89df8a20b77f635ea0e0f@www\\.dailygame\\.online)|(Daily_Games_caf0a82b928c12c5d67d2e0d142acbcc@www\\.daily-games\\.online)|(Daily_Games_clone_MHxxZxsjgz@www\\.gamesdaily\\.co)|(Daily_Games_d859afcc6f811f0938e06c8b75ac15fc@www\\.gamesdaily\\.online)|(Daily_Games_e6da5a8f129fc23530fc715fd2f7b993@www\\.daily-games\\.today)|(Daily_Games_e858f8f836f17ab5e1c3b269639bc434@www\\.daily-games\\.co)|(Daily_Games_FHAIlDwdZF@www\\.gamesdaily\\.co)|(Daily_Games_IgqcabXnnH@www\\.dailygame\\.online)|(Daily_Games_NOgqDldYjE@www\\.daily-games\\.co)|(Daily_Games_qEgzrEJBZi@www\\.daily-games\\.co)|(Daily_Games_qFMKBgNfOc@www\\.gamesdaily\\.online)|(Daily_Games_vfGCbwKDjq@www\\.daily-games\\.online)|(Daily_Games_VoOHRAgAxg@www\\.daily-games\\.today)|(Daily_Games_vwRTUFvSbP@www\\.gamesdaily\\.online)|(Daily_Games_YoUYAafVuL@www\\.daily-games\\.co)|(Daily_Horoscope_Finder_f4f7f24d489880fa4779c5a4aff5278d@www\\.dailyhoroscopefinder\\.com)|(Daily_Local_Weather_RTvDyyEuxy@www\\.dailylocalweather\\.net)|(Daily_Mail_Tab_AMkImujKsG@www\\.dailymailtab\\.com)|(Daily_Mail_Tab_clone_BWhcKvnbJG@www\\.dailymailtab\\.com)|(Daily_Mail_Tab_clone_jkCRhwZjtG@www\\.dailymailtab\\.com)|(Daily_Mail_Tab_xMqjhKMBPX@www\\.dailymailtab\\.com)|(Daily_Net_Speed_gcVjCfMtcE@www\\.dailynetspeed\\.com)|(Daily_News_Reports_707e3c94519dc4f338e25415097fc409@disable\\.dailynewsreports\\.co)|(Daily_News_Reports_bc4cc8745c5c9113add6bbcc7a4e891d@www\\.dailynewsreports\\.co)|(Daily_News_Reports_MgfPHeboNM@www\\.dailynewsreports\\.co)|(Daily_News_Reports_RhfPUMZyKi@www\\.dailynewsreports\\.co)|(Daily_Package_Tracker_qJQSJblDIk@www\\.dailypackagetracker\\.com)|(Daily_PDF_Converter_cAlFsFtCmX@www\\.dailypdfconverter\\.com)|(Daily_Radio_Hub_4b6408c6028360c91e55070e8a8b6c07@www\\.dailyradiohub\\.com)|(Daily_Radio_Hub_CEgdHfrHfk@www\\.dailyradiohub\\.com)|(Daily_Recipe_Finder_LpHSZIWYdz@www\\.dailyrecipefinder\\.com)|(Daily_Recipe_Ideas_clone_xqrPqfTBif@www\\.dailyrecipeideas\\.co)|(Daily_Recipe_Ideas_dyhmXRtGGY@www\\.dailyrecipeideas\\.co)|(Daily_Recipe_Now_IXRimkpfYA@www\\.dailyrecipenow\\.com)|(Daily_Recipe_Search_wHQTXcltvc@www\\.dailyrecipesearch\\.co)|(Daily_Search_3e2f26bf46061e1fb6386bb2bc9fb3b1@www\\.dailysearch\\.co)|(Daily_Search_clone_RAfKSlJEDD@www\\.dailysearch\\.co)|(Daily_Search_Plus_b60c5575e4d5158e20036cb104c00bba@www\\.dailysearchplus\\.com)|(Daily_Search_Plus_f693ecbe1af3da784c31114acc402ec4@www\\.dailysearchplus\\.com)|(Daily_Search_Plus_oldtAgRAUL@www\\.dailysearchplus\\.com)|(Daily_Search_Plus_xCxtAmrZoI@www\\.dailysearchplus\\.com)|(Daily_Search_Web_f70aa46e9caf1e58a04aad7917c8d0aa@www\\.dailysearchweb\\.com)|(Daily_Search_Web_PvsRmlCiKL@www\\.dailysearchweb\\.com)|(Daily_Speed_Check_475174e16d0d170b447b7002797efade@www\\.dailyspeedcheck\\.com)|(Daily_Speed_Check_uqFEhmPbDE@www\\.dailyspeedcheck\\.com)|(Daily_Speed_Checker_1c6d34e9410cb2652228c18bed9eaf67@www\\.dailyspeedchecker\\.com)|(Daily_Speed_Checker_wcntWZhyvr@www\\.dailyspeedchecker\\.com)|(Daily_Transit_Guide_a4b1896ed15535c97cf0c19cb3960680@www\\.dailytransitguide\\.com)|(Daily_Transit_Guide_rOdLEeRGxw@www\\.dailytransitguide\\.com)|(Daily_Weather_Finder_94b59c3b4bf2e42f392be55572d25ac2@www\\.dailyweatherfinder\\.com)|(Daily_Weather_Finder_QhhPAMLPai@www\\.dailyweatherfinder\\.com)|(Daily_Weather_Forecast_cgMvSNkeBN@www\\.dailyweatherforecast\\.net))$/","prefs":[],"schema":1576757992072,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4acfb151-a1d2-4468-9794-5816fadef1b7","last_modified":1576771657116},{"guid":"/^((Daily_Weather_Forecast_clone_CSwGEuwNKr@www\\.dailyweatherforecast\\.co)|(Daily_Weather_Forecast_f7824fa0dfff1fdbe9f36ad33ecfa4b4@www\\.dailyweatherforecast\\.net)|(Daily_Weather_Forecast_kclkQdSlIO@www\\.dailyweatherforecast\\.co)|(DailyCoupons\\.store_zWkmEkoPgk@www\\.dailycoupons\\.store)|(DailyJobSearch\\.co_EKJtPSSMhB@www\\.dailyjobsearch\\.co)|(DailyJobsSearch\\.net_a2ba2cb41169ec0e7e1e381ae8cec363@www\\.dailyjobssearch\\.net)|(dailyjobssearch@www\\.dailyjobssearch\\.co)|(dailyjobssearchnet@www\\.dailyjobssearch\\.net)|(DailyLocalWeather\\.net_clone_jVyHpUvXAl@www\\.dailylocalweather\\.net)|(DailyLocalWeather\\.net_vzkDkoQoVN@www\\.dailylocalweather\\.net)|(DailyNetSpeedtest\\.co_HWGHkbkKGm@dailynetspeedtest\\.com)|(dailynewsupdatesinnet@www\\.dailynewsupdates\\.in\\.net)|(dailynewsupdatesonline@www\\.dailynewsupdates\\.online)|(DailyRecipeOnline\\.net_bVwwSbDKSk@www\\.dailyrecipeonline\\.net)|(DailyRecipeSearch\\.co_zXrOSYpFeH@www\\.dailyrecipesearch\\.co)|(DailyRecipeSearch\\.info_VJInpLJmig@www\\.dailyrecipesearch\\.info)|(Dictionary_Pro_App_HbjmnxLIZN@www\\.dictionaryproapp\\.com)|(Dictionary_Pro_PquztTZbLu@www\\.dictionarypro\\.co)|(Dictionary_Xpress_QeRWOLUqwj@www\\.mywordscribent\\.com)|(Directions_Finder_190cb6038fd06edbc48ea5423cc43227@www\\.finddirections\\.co)|(Directions_Finder_1e30de3303446cde1d03ee219a13f572@www\\.finddirection\\.online)|(Directions_Finder_868daddf032f443da0515e9c976159c9@www\\.finddirections\\.co)|(Directions_Finder_86fa782f7bd705c2e644aa07f6218661@www\\.finddirections\\.co)|(Directions_Finder_AcrlxGosjE@www\\.finddirections\\.co)|(Directions_Finder_BZDovhcQyV@www\\.findroutes\\.co)|(Directions_Finder_c005f28d896373d557e03e80f4b57d37@www\\.findroutes\\.co)|(Directions_Finder_e183b060f3f35940a9291cd2ed4791e3@www\\.finddirections\\.co)|(Directions_Finder_lHmoDZAZNo@www\\.finddirections\\.co)|(Directions_Finder_LKGiGUhRDf@www\\.finddirections\\.co)|(Directions_Finder_Now_NMzpPonhyb@www\\.directionsfindernow\\.com)|(Directions_Finder_QTCjmhKxhD@www\\.finddirection\\.online)|(Directions_Finder_V1_0c00deff96164188875cce59cb27ebb1@www\\.finddirections\\.co)|(Directions_Finder_V1_4668ec661e1b94a2474a1c1675158eb2@www\\.finddirections\\.co)|(Directions_Finder_V1_clone_BPDzngiFeD@www\\.finddirections\\.co)|(Directions_Finder_V1_clone_BPDzngiFeDic@www\\.finddirections\\.co)|(Directions_Finder_V1_clone_lkSfnVsTUN@www\\.finddirections\\.co)|(Directions_Finder_V1_clone_mPiHTaJZJi@www\\.finddirections\\.co)|(Directions_Finder_V1_de58f7b93a8d173bc071b3730806cf8c@www\\.finddirections\\.co)|(Directions_Finder_V1_ffc19350a43c8bf4db65930f95663016@www\\.finddirections\\.co)|(Directions_Finder_V1_xivwbBBnLX@www\\.finddirections\\.co)|(Directions_Found_1dc1261209c6647a8288498e180d5eef_2@www\\.directionsfound\\.com)|(Directions_Found_1dc1261209c6647a8288498e180d5eef_23@www\\.directionsfound\\.com)|(Directions_Found_1dc1261209c6647a8288498e180d5eef@www\\.directionsfound\\.com)|(Directions_Found_clone_hbtpEmPzTJ@www\\.directionsfound\\.com)|(Directions_Found_clone_hdjMdQYTvN@www\\.directionsfoundnt\\.com)|(Directions_Found_GLuiPTQCww@www\\.directionsfound\\.com)|(Directions_Found_mVBuOLkFzz@www\\.directionsfoundnt\\.com)|(Directions_Found_XmorLjjHtu@www\\.directionsfound\\.com)|(Directions_Quest_clone_qQtdSaDtmD@www\\.directionsquest\\.co)|(Directions_Quest_DuwqkuyNfU@www\\.directionsquest\\.co)|(Directions_Quest_FwNcHagZgz@www\\.directionsquest\\.co)|(Directions_Quest_XQDqehhuWR@www\\.directionsquest\\.co)|(Doc_Converter_0a0ede466240dc417f4f6d8594acd9a5@www\\.convertthepdf\\.co)|(Doc_Converter_Hub_sTIWsdHRFE@www\\.docconverterhub\\.com)|(Document_Converter_CZmoJDQssK@www\\.convertpdfnow\\.co)|(Driving_Directions_App_mUxSdxsgni@www\\.drivingdirectionsappn\\.org)|(Driving_Maps_Online_clone_jtpQCXsDzM@www\\.drivingmapsonline\\.com)|(Driving_Maps_Online_evmZdmROJS@www\\.drivingmapsonline\\.com)|(Easy_Directions_Now_a9718312f4e22a699b573a1cf508ccc9@www\\.easydirectionsnow\\.com)|(Easy_Directions_Now_TBmyGrTUZj@www\\.easydirectionsnow\\.com)|(Easy_Doc_Converter_393a2418db4856b1ec2d790e9b30ffc2@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_5a92e4df39328183b24ce0103f3dea19@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_79478769a5477116f6efd505f3b0cf15@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_a1be8989ddea6e7543bea0b843c6a2ba@www\\.easydocconverter\\.com))$/","prefs":[],"schema":1576758021535,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"125bc0c5-76dc-4426-b682-1c321843d645","last_modified":1576771657110},{"guid":"/^((Everyday_Astro_YjPsaMBBWj@www\\.everydayastro\\.online)|(Everyday_File_Converter_ed35274eecd2df2822fa50636b6d9c2c@www\\.everydayfileconverter\\.com)|(Everyday_File_Converter_NldTeZANPx@everydayfileconverter\\.com)|(Everyday_Horoscope_App_zsZEtFjPki@www\\.everydayhoroscopeapp\\.com)|(Everyday_News_Tab_eebc4520552865e4fa1472681eeb5a3d@www\\.everydaynewstab\\.com)|(Everyday_News_Tab_zARNxTxEiu@www\\.everydaynewstab\\.com)|(Everyday_Radio_1f1b997a2d674af1b684dd5457ae5356@www\\.myeverydayradio\\.com)|(Everyday_Radio_mTDVrswpBm@www\\.myeverydayradio\\.com)|(Everyday_Recipe_Guide_566183664fdda4ba4e650fa5115c6cfe@www\\.recipeboardplus\\.com)|(Everyday_Recipe_Guide_tiorNZIoRi@www\\.everydayrecipeguide\\.com)|(Everyday_Weather_Forecast_2a934b9a097e1f619a7066c2530ef60f@www\\.everydayweatherforecast\\.com)|(Everyday_Weather_Forecast_sPyCkYArmT@www\\.everydayweatherforecast\\.com)|(EverydayAstro\\.net_kTOmUMbUtk@www\\.everydayastro\\.net)|(ext_11637@www\\.map-buddy\\.net)|(extensionid@www\\.dailynewsupdates\\.in\\.net)|(extensionid@www\\.moviequest\\.co)|(Fast_Mail_Tab_BfwMzfJAdm@www\\.fastmailtab\\.com)|(Fast_Mail_Tab_clone_LPzCObgNLo@www\\.fastmailtab\\.com)|(Fast_Map_Finder_ae4f5334a91035cf082f4c9e0983fc15@www\\.fastmapfinder\\.com)|(Fast_Map_Finder_YxRYGsJekN@www\\.fastmapfinder\\.com)|(Federal_Forms_clone_NgrjNsxcUN@www\\.easyformsfinder\\.com)|(Federal_Forms_EBqDdPvCFF@www\\.easyformsfinder\\.com)|(File_Convert_Plus_clone_juAtPozquc@www\\.fileconvertplus\\.com)|(File_Convert_Plus_JfRqzQtMeK@www\\.fileconvertplus\\.com)|(File_Convert_Pro_hOblzzFvJL@www\\.fileconvertpro\\.co)|(File_Converter_37ced8ee9475a347afab0d20660cef63@www\\.pdf-convertn\\.co)|(File_Converter_clone_aWSjJQAWwa@www\\.pdf-convertn\\.co)|(File_Converter_Hub_wnuDyqJFOe@www\\.fileconverterhub\\.com)|(File_Converter_Live_hWXrCtYfna@www\\.fileconverterlive\\.com)|(File_Converter_Tab_63009c33f9d202492393146d23df95d0@www\\.fileconvertertab\\.com)|(File_Converter_Tab_bEfXMQovol@info\\.fileconvertertab\\.com)|(File_Converter_Tab_bHaEkegUAR@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_8d6f907bab9ab53a83b5d8a4505433f4@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_cCZhwgyHDr@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_gNPUWukwdG@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_pweczfyyvv@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_qygWFXkHri@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_XpUyfDDJsm@info\\.fileconvertertab\\.com)|(File_Converter_Tab_dd756ad1b37f999650834591ffd21464@www\\.fileconvertertab\\.com)|(File_Converter_Tab_deb5d97364d6e9ba4d04089f90afa043@www\\.fileconvertertab\\.com)|(File_Converter_Tab_V2_8fe7b393ec2d293e54abf1aada3bcb94@www\\.fileconvertertab\\.com)|(File_Converter_Tab_V2_clone_DrmwsZhTkw@www\\.fileconvertertab\\.com)|(File_Converter_Tab_XHmAqSTCbP@www\\.fileconvertertab\\.com)|(File_Converter_xdbvCaJxrb@www\\.myfileconverter\\.co)|(FileConvertPro_clone_gDJuPpeLjD@www\\.fileconvertpro\\.co)|(FileConvertPro_mLscTidBER@www\\.fileconvertpro\\.co)|(Find_Coupons_Daily_dxJFJCQcpS@www\\.finddaily-coupons\\.today)|(Find_Coupons_Daily_lIKYSwDOhr@www\\.findcouponsdaily\\.co)|(Find_Coupons_Daily_RjrQWQzreq@www\\.findcoupons-daily\\.today)|(Find_Coupons_Daily_UhahUhrtxP@www\\.find-couponsdaily\\.today)|(Find_Coupons_Daily_wUpPOFfkzc@www\\.findcouponsdaily\\.today)|(Find_Coupons_OWfYsAQras@www\\.findcoupons\\.live)|(Find_Daily_Coupons_6ea44d6d01a700e213070c692343e03d@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_71b6faf57612a3de273a55a228ec1703@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_a4c3252d270bd03507cfe77d8397e8b6@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_cf887ce0c30cf483939356fd9dc4753a@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_clone_sCMBPIejep@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_dBVmCxAeYJ@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_gSKACLrhGQ@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_sVYmYFumfX@www\\.finddailycoupons\\.com)|(Find_Daily_Games_gZnVxpnfzi@www\\.finddailygames\\.com)|(Find_Daily_Games_JHwXAakSOO@www\\.finddailygames\\.com)|(Find_Daily_Games_osIGANaBXk@www\\.finddailygames\\.com)|(Find_Daily_Games_rcRvgxUzAu@www\\.finddailygames\\.net)|(Find_Directions_euMftZJtWV@www\\.finddirections\\.co)|(Find_Easy_Directions_2252eb9a9264ef1685d45b8fe13f6a43@www\\.findeasydirections\\.com))$/","prefs":[],"schema":1576758100930,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a69a7be4-4f76-4c00-aa17-d1bbe66fd2db","last_modified":1576771657102},{"guid":"/^((Find_Easy_Directions_541d5ace0c28764eb8e88d98d0e28740@www\\.findeasydirections\\.com)|(Find_Easy_Directions_90d67b798ba3070d90d32d74ff70d1c8@www\\.findeasydirections\\.com)|(Find_Easy_Directions_gbailzSvPb@www\\.findeasydirections\\.com)|(Find_Easy_Directions_YiGOrfTNFT@www\\.findeasydirections\\.com)|(Find_Easy_Directions_zcYSFoeMgF@www\\.findeasydirections\\.com)|(Find_Jobs_Daily_clone_ZryioBAtLo@www\\.findjobsdaily\\.co)|(Find_Jobs_Daily_FpBesVkFoN@www\\.findjobsdaily\\.co)|(Find_Jobs_Daily_TxUobqrfTu@www\\.findjobsdaily\\.co)|(Find_Jobs_Daily_ZLJpRXDhXK@www\\.findjobsdaily\\.co)|(Find_Recipes_Online_kSjCdoBAFX@www\\.findrecipesonline\\.co)|(Find_Templates_Quick_LyRzafuNXE@www\\.findtemplatesquick\\.com)|(FindJobsDaily\\.net_ilHEYezmJM@www\\.findjobsdaily\\.net)|(FlirtyWallPapers\\.online_IEZjVbwbSl@www\\.flirtywallpapers\\.online)|(Forbes_Search_aOPKgBmHyw@forbes\\.dailynewsupdates\\.online)|(Free_Directions_Finder_KEDDaoHBQl@www\\.freedirectionsfinder\\.com)|(Free_Manuals_KkQAhLuDkf@www\\.browsemanuals\\.co)|(Game_Buddy_632c7a501a256d43af845a6c03d36c65@www\\.game-buddy\\.co)|(Game_Buddy_ef910a8045b370e3df14a73fb05c0ee1@www\\.game-buddy\\.co)|(Game_Buddy_emPnaqsxzR@www\\.game-buddy\\.co)|(Game_Buddy_ISrmuaRAHN@www\\.game-buddy\\.co)|(Game_Quest_3c4a7895681b0a9d0860d5397036f146@www\\.game-quest\\.co)|(Game_Quest_bd98408b6a98a0b19825f9ff5023f0e7@www\\.game-quest\\.co)|(Game_Quest_bTqWKJtOPG@www\\.games-quest\\.co)|(Game_Quest_clone_40442f8034b58a60951b7a3cdf5fe97a@www\\.game-quest\\.co)|(Game_Quest_clone_rajfrvipoU@www\\.game-quest\\.co)|(Game_Quest_GHFSWLkdAO@game-quest\\.com)|(Game_Quest_hMqLrbOzmC@www\\.game-quest\\.co)|(Game_Quest_NDifumcXqQ@www\\.games-quest\\.org)|(Game_Quest_nilKwpfZen@www\\.game-quest\\.co)|(Game_Quest_rXONqXzsZj@www\\.games-quest\\.org)|(Game_Search_BbtNWEfPKy@www\\.daily-gamesearch\\.today)|(Game_Search_eOUjptBQzk@www\\.gamessearch\\.live)|(Game_Search_eymrhMPxLu@www\\.dailygame-search\\.today)|(Game_Search_kZDJlntNQs@www\\.gamesearch\\.link)|(Game_Search_MdsPFfXaXl@www\\.game-search\\.link)|(Game_Search_mgkCKPquHh@www\\.dailygamesearch\\.co)|(Game_Search_mvoOwLJOeY@www\\.games-search\\.link)|(Game_Search_nKMbWrakmm@www\\.dailygamesearch\\.today)|(Game_Search_PDKlEPjhDw@www\\.games-search\\.link)|(Game_Tab_BoRsmjioSA@www\\.gametab\\.co)|(Game-Quest_WhVgUeMwZI@www\\.game-quest\\.co)|(GameQuest\\.website_IwplUMSUhd@www\\.gamequest\\.website)|(GameQuest\\.website_ZGhTUTKRhi@www\\.gamequest\\.website)|(Games_Daily_clone_UAnrFPWGxF@www\\.games-daily\\.net)|(Games_Daily_EVSeZYmPYK@www\\.games-daily\\.today)|(Games_Daily_nRQyywoJPm@www\\.games-daily\\.net)|(Games_Daily_SPRlOvPjlj_clone@www\\.games-daily\\.co)|(Games_Daily_SPRlOvPjlj@www\\.games-daily\\.co)|(Games_Daily_WnvPyaqCdX@www\\.games-daily\\.today)|(Games_Finder_Online_98e08661ac2ba2826d702b9de87c3fbc@www\\.gamesfinderonline\\.com)|(Games_Finder_Online_YCDTopLIiv@www\\.gamesfinderonline\\.com)|(Games_Quest_antJJCJcBk@www\\.games-quest\\.website)|(Games_Quest_clone_aTlPJPmJEm@www\\.games-quest\\.today)|(Games_Quest_OxdmpwtACa@www\\.games-quest\\.today)|(Games_Quest_qmlUmTihvS@www\\.gamesquest\\.today)|(Games_Quest_vnzuqLPUQQ@www\\.gamesquest\\.today)|(Games_Quest_WEpNvcmerl@www\\.games-quest\\.today)|(Games_Quest_wKWBKbLjpl@www\\.games-quest\\.today)|(Games_Quest_Zafeeizthl@www\\.games-quest\\.today)|(Games_Quest_ZVRwioHOnh@www\\.games-quest\\.online)|(Games_Search_FPDqSSnSlY@www\\.game-search\\.today)|(Games_Search_HAfeXALvGY@www\\.gamesquest\\.online)|(Games_Search_LSrSMudgNL@www\\.gamessearch\\.co)|(Games_Search_mDdAwBVasx@www\\.gamesearch\\.today)|(Games_Search_RgMSPqlluj@www\\.gamessearch\\.xyz)|(Games_Search_sfZySehUmo@www\\.gamessearch\\.online)|(Games_Search_shZkWBHwut@www\\.gamessearch\\.online)|(Games_Search_USoWCKOlGq@www\\.finddailygames\\.com)|(Games_Search_uXqDhnPDBw@www\\.gamesearch\\.today)|(Games_Search_vCVYFXcOnV@www\\.gamessearch\\.org)|(Games-Daily\\.net_NainTzjpve@www\\.games-daily\\.net)|(Get_Coupons_awAkTqqCxd@www\\.getcoupons\\.live)|(Get_Coupons_RGWEhnHIbr@www\\.getcoupons\\.live)|(Get_Directions_07d014a7ed5bba404eb7f2b1058ad2cb@www\\.getdirectionsmapsn\\.com)|(Get_Directions_CBakCNUUbo@www\\.map-finder\\.link)|(Get_Directions_clone_kxIvsTsDgE@www\\.getdirectionsmapsn\\.com)|(Get_Directions_HlEHEMFRkj@www\\.getdirectionsmapsn\\.com))$/","prefs":[],"schema":1576758133784,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f6c1160a-fa98-4541-bb03-cd6d02b825e3","last_modified":1576771657097},{"guid":"/^((Get_Directions_Quick_89a733fca5e8b5436c95fcec40ca5573@www\\.getdirectionsquickn\\.online)|(Get_Easy_Directions_b3f03018f3d77ab1327550851c2a2f94@www\\.geteasydirections\\.com)|(Get_Easy_Directions_FeEnVDLKMP@www\\.geteasydirections\\.com)|(Get_Easy_Maps_a92ae443f4d44fdbcf507f73934c5bff@www\\.geteasymaps\\.co)|(Get_Easy_Maps_clone_RsVkJokaAq@www\\.geteasymaps\\.co)|(Get_Easy_Maps_clone_TgEXtwRoQx@www\\.geteasymaps\\.co)|(Get_Easy_Maps_e66ef79b1701806812d764c8b2e87673@www\\.geteasymaps\\.co)|(Get_Easy_Maps_eUfwfdzBJN@www\\.geteasymaps\\.co)|(Get_Easy_Maps_f9341eebd729ecc7e5389769a7ac8c27@www\\.geteasymaps\\.com)|(Get_Easy_Maps_NoApMGqlhQ@www\\.geteasymaps\\.com)|(Get_Easy_Maps_PiUUlEtxCz@www\\.geteasymaps\\.co)|(Get_Easy_Maps_uopDIWsrOB@www\\.geteasymaps\\.co)|(Get_Easy_Maps_VZVoDVzTZP@www\\.geteasymaps\\.co)|(Get_Easy_Search_5a1bd32b3bb3d079d253b6fe048c6d4e@www\\.geteasysearch\\.com)|(Get_Easy_Search_b1272ab7a446984d2e1ddbf0b94016d0@www\\.geteasysearch\\.com)|(Get_Easy_Search_zjvfbWwXrA@www\\.geteasysearch\\.com)|(Get_Forms_Today_HmKpwNqqgw@www\\.getformstoday\\.com)|(Get_Local_Forecast_KSKPskMcZy@www\\.getlocalforecastn\\.com)|(Get_Map_Finder_clone_AVJpxOfDmZ@www\\.getmapfinder\\.link)|(Get_Map_Finder_clone_BGAfKOwTad@www\\.getmapfinder\\.link)|(Get_Map_Finder_clone_hwWbfqrHDh@www\\.getmapfinder\\.link)|(Get_Map_Finder_clone_YUnreTXyJo@www\\.getmapfinder\\.link)|(Get_Map_Finder_RDbuumWRlP@www\\.getmapfinder\\.link)|(Get_Map_Finder_vJqBDvfVEi@www\\.getmapfinder\\.link)|(Get_Map_Finder_zORQiNFbOh@www\\.getmapfinder\\.co)|(Get_Online_Converter_AbNmflhxCb@www\\.getonlineconverter\\.com)|(Get_Online_Converter_clone_255e60767a18e291b0b8b3cabd6f382c@www\\.getonlineconverter\\.com)|(Get_Online_Converter_clone_oCShEwyADp@www\\.getonlineconverter\\.com)|(Get_Online_Maps_clone_hGHOrvKQpE@www\\.getonlinemapsnow\\.com)|(Get_Package_Tracker_5a92260cd5155c5f26b16207532e9c5e@www\\.getpackagetracker\\.com)|(Get_Package_Tracker_clone_CztbvYsSLz@www\\.getpackagetracker\\.com)|(Get_Speed_Checker_CdqYfmDnVO@www\\.getspeedchecker\\.com)|(Get_Speed_Test_Ace_efd65663a0f689684ed5b60337c519ac@www\\.getspeedtestace\\.com)|(Get_Speed_Test_Ace_uNUzxBsIBO@www\\.getspeedtestace\\.com)|(GetOnlineConverter_62dc3ed61ba55b471bc5952d64f22e34@www\\.getonlineconverter\\.com)|(GetOnlineConverter_clone_hmwBWihZaf@www\\.getonlineconverter\\.com)|(Global_Weather_2abbd1bfe1f92474dc556a6abd23c97e@www\\.global-weathern\\.online)|(Global_Weather_qPjJvKHHjn@www\\.global-weathern\\.online)|(Go_Package_Tracker_CDyUCsNhYI@www\\.gopackagetracker\\.com)|(Go_Search_Easy_3b073071b9f9727f2a3c22961bc6aae7@www\\.gosearcheasy\\.com)|(Go_Search_Easy_fCSPxmpWqN@www\\.gosearcheasy\\.com)|(Go_Search_Easy_MTOfbhqqMt@www\\.gosearcheasy\\.com)|(Go_Video_Converter_clone_AtpxxXDpvq@www\\.govideoconverter\\.com)|(Go_Video_Converter_clone_b78d64ef3f6d32d836cb9cb45f64f3d4@www\\.govideoconverter\\.com)|(Go_Video_Converter_clone_ENqGVUhAYo@www\\.govideoconverter\\.com)|(Go_Video_Converter_cXhEAmNOBA@www\\.govideoconverter\\.com)|(Go_Video_Converter_daef20a38c38415e2819357035444fa2@www\\.govideoconverter\\.com)|(Go_Video_Converter_YLdugTFiBs@www\\.govideoconverter\\.com)|(holidaygiftingco@www\\.holidaygifting\\.co)|(Holy_Bible_daily_22c0372905eb878bf90eb726cf1c4cd7@www\\.holybibledaily\\.com)|(Holy_Bible_Daily_36d9839f134dba7393dcd1ce19e35114@www\\.holybibledaily\\.com)|(Holy_Bible_daily_clone_BwGilqVxow@www\\.holybibledaily\\.com)|(Holy_Bible_Daily_clone_TdHKbGqxyp@www\\.holybibledaily\\.com)|(Holy_Bible_daily_WRzbIpWLfR@www\\.holybibledaily\\.com)|(Horoscope_Finder_CQAkIhPhib@www\\.horoscopefinder\\.co)|(Hunt_New_Jobs_MQlcPgVQSY@www\\.huntnewjobs\\.com)|(Hunt_New_Jobs_TeypdaDdsy@www\\.huntnewjobs\\.com)|(Inbox_Tab_1549897502@www\\.inboxtab\\.com)|(Inbox_Tab_LTnzVZlfKv@www\\.inboxtab\\.com)|(Inbox_Tab_rOksOtIddG@www\\.inboxtab\\.com)|(Instant_Doc_Converter_1264fb8b31af7c6c3f56c4c33b825dab@www\\.instantdocconverter\\.com\\.removed)|(Instant_Doc_Converter_clone_LWgHiMFzyN@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_clone_OeEmGVRjdr@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_fe41778b25f65137ed606033eea89902@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_hMMLIeTKQH@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_UJTpBaxVPV@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_vZPKbExySk@www\\.instantdocconverter\\.com))$/","prefs":[],"schema":1576758169317,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9acbbf4c-ef5c-46d4-bc1d-f520b8ced595","last_modified":1576771657093},{"guid":"/^((Instant_Email_Login_3fff03c5bbd668d2f7093d5491f66518@www\\.instantemaillogin\\.com)|(Instant_Email_Login_WRGGywlQTy@www\\.instantemaillogin\\.com)|(Instant_Email_Plus_KAZiCvZFWB@www\\.instantemailplus\\.com)|(Instant_Inbox_clone_QKZmbMSVkA@www\\.instantinbox\\.co)|(Instant_Inbox_clone_QmVdpyuWwT@www\\.instantinbox\\.co)|(Instant_Inbox_clone_VlVOmivYUN@www\\.instantinbox\\.co)|(Instant_Inbox_clone_XLjUGcrTgI@www\\.instantinbox\\.co)|(Instant_Inbox_clone_YxmUgAsOrZ@www\\.instantinbox\\.co)|(Instant_Inbox_pzclglfDGq@www\\.instantinbox\\.co)|(Instant_Inbox_qnRYsobGem@www\\.instantinbox\\.co)|(Instant_Maps_clone_clone_zqdkjyMgdQ@www\\.checkmaps\\.co)|(Instant_Maps_ZefayBJOcD_test@www\\.checkmaps\\.co)|(Instant_Maps_ZefayBJOcD@www\\.checkmaps\\.co)|(Instant_Net_Speed_7291e707ced30428e6ed71611c3071ed@www\\.instantnetspeed\\.com)|(Instant_Net_Speed_iEjKvJreAi@www\\.instantnetspeed\\.com)|(Internet_Speed_Test_cf6c9b84dd607bc049898130dd8aa403@www\\.fastinternetspeedtestn\\.com)|(Internet_Speed_Test_RCgVciwcSD@www\\.fastinternetspeedtestn\\.com)|(Job_Search_Online_53e3be5488ce961c12d4341c2e3c830d@www\\.jobssearchonline\\.co)|(Job_Search_Online_clone_20bb80efe94b528ef6fa06730d560cbb@www\\.jobssearchonline\\.co)|(Job_Search_Online_clone_fUDgRmLxrl@www\\.jobssearchonline\\.co)|(Job_Search_Online_clone_jxgyVIROvt@www\\.jobssearchonline\\.co)|(Job_Search_Online_qNOPIVBSge@www\\.jobssearchonline\\.co)|(Job-Portal_dPNxZEZiQF@www\\.job-portal\\.co)|(Jobs_Now_jkAqvfwqNy@jobsnow\\.com)|(Just_Search_Easy_PJxNIOGbZS@www\\.justsearcheasy\\.com)|(justlovepetsonline@www\\.justlovepets\\.online)|(KC_Recipe_Finder_f8541026d8d56f16ba1db6664ac76ed8@www\\.testextension\\.online)|(LifeLock_Safe_Search_LDKQZxofGQ@searchsafe\\.lifelock\\.com)|(Live_Email_4cacc77ba79f2e88d808404b1487e27d@www\\.liveemail\\.co)|(Live_Email_clone_avmFyKjGHH_ach@www\\.liveemail\\.co)|(Live_Email_clone_avmFyKjGHH@www\\.liveemail\\.co)|(Live_Inbox_clone_HSqMlnurhx@www\\.liveinbox\\.co)|(Live_Inbox_ITUElbGJyq@www\\.liveinbox\\.co)|(Live_News_90155c3a670c030b75d27b2b060bab76@www\\.get-news\\.co)|(Live_News_ab96451cfc686d1903b9bd5bbefc58df@www\\.get-news\\.co)|(Live_News_Daily_coRwlwVUtL@www\\.livenewsdaily\\.net)|(Live_News_RoTkoRyzKW@www\\.get-news\\.co)|(Live_News_sQHxsfPWHn@www\\.get-news\\.co)|(Live_News_UPeYgtCNWH@www\\.get-news\\.co)|(liveemail@www\\.liveemail\\.co)|(LiveNewsDaily\\.co_Qrkavccepk@www\\.livenewsdaily\\.co)|(Local_Weather_Now_clone_CGdqWGvDuk@www\\.localweathernow\\.co)|(Local_Weather_Now_clone_PsfbncWCpz@www\\.localweathernow\\.co)|(Local_Weather_Today_af62b67de6656cd77ec1232ce28b0847@www\\.localweathertoday\\.co)|(Local_Weather_Today_b6bdb9471dfdbbe166ebba101bf87987@www\\.localweathertoday\\.co)|(Local_Weather_Today_clone_25d0f678c3de41078bfebfedb36f3e5e@www\\.localweathertoday\\.co)|(Local_Weather_Today_clone_ozBsMkxlfM@www\\.localweathertoday\\.co)|(Local_Weather_Today_clone_QFZOuAbpBy@www\\.localweathertoday\\.co)|(Local_Weather_Today_MoAsKEYZyC@www\\.localweathertoday\\.co)|(localweathertodayco@www\\.localweathertoday\\.co)|(localweathertodaynet@www\\.localweathertoday\\.net)|(Locate_Packages_JIjwUKeces@www\\.locatepackages\\.com)|(loginpro_bTqvLMpNXn@www\\.easy-maillogin\\.link)|(loginpro@www\\.loginemailpro\\.com)|(manifestdata_Check_clone_AraOARfaeL@hjm)|(manifestdata_Check_HFkEdcMQtX@hjm)|(manifestname@www\\.wallpaperonlinepro\\.com)|(Map_Buddy_svMNjHoVFQ@www\\.map-buddy\\.net)|(Map_Directions_Pro_hFzkEkDBXw@www\\.mapdirectionspro\\.co)|(Map_Directions_Pro_JAlSTUeoZW@www\\.mapdirectionspro\\.co)|(Map_Directions_Pro_vnuUbjddlF@www\\.mapdirectionspro\\.co)|(Map_Finder_GaEdNdyQoi@www\\.mapfinder\\.live)|(Map_Finder_Online_clone_HAzjiKHVFr@www\\.mapfinderonline\\.com)|(Map_Finder_Online_clone_vxRStAVXsj@www\\.mapfinderonline\\.com)|(Map_Finder_Online_DWFqZBeElh@www\\.mapfinderonline\\.com)|(Map_Finder_RIBbQLtJhY@www\\.map-finder\\.link)|(Map_Finder_ubFbNkPLbu@www\\.map-finder\\.co)|(Map_My_Journey_clone_dbZghybkTf@www\\.mapmyjourney\\.co)|(Map_My_Journey_gWimMkbjcf@www\\.mapmyjourney\\.co)|(Map_My_Journey_hwaFtGeeRF@www\\.mapmyjourney\\.co)|(Map_My_Journey_lOKajIjWRX@www\\.mapmyjourney\\.co)|(Map_My_Travel_3d7340d4339df15d23c823030d0b3dd4@www\\.mapmytravel1\\.co)|(Map_My_Travel_4c1060a52cb966087a862f50c66cff76@www\\.mapmytravel1\\.co)|(Map_My_Travel_66a1df798c97eecbcbc5ce97f5bb58ce@www\\.mapmytravel\\.co))$/","prefs":[],"schema":1576758213475,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f0cac174-d15f-427f-b310-9409e69a2ca6","last_modified":1576771657088},{"guid":"/^((Map_My_Travel_77440f39b0fc3ac74a9e894ff2e26617@www\\.mapmytravel\\.co)|(Map_My_Travel_ac398c1a8442efc53c141095c6e386f1@www\\.mapmytravel1\\.co)|(Map_My_Travel_b47128735efb1ae5232811bf674a5598@www\\.mapmytravel1\\.co)|(Map_My_Travel_c520fe83319115df915325944097f2d7@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_906668a067200f92f67c8a1d4934ca53@www\\.mapmytravel\\.co)|(Map_My_Travel_clone_agEGcivVyr@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_AojrINyqec@www\\.mapmytravel\\.co)|(Map_My_Travel_clone_CaXjHVvzvR@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_CmwkGssriz@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_KUUHhqDlkF@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_xjdUmTvEZE@www\\.mapmytravel\\.co)|(Map_My_Travel_clone_ZJilbRDhlx@www\\.mapmytravel1\\.co)|(Map_My_Travel_ea415ecadf91d96c596c61d748dfab3a@www\\.mapmytravel\\.co)|(Map_My_Travel_FGYxkNvlYu@www\\.mapmytravel1\\.com)|(Map_My_Travel_GnhWycuRWw@www\\.mapmytravel\\.co)|(Map_My_Travel_KoRBtjTOaQ@www\\.mapmytravel\\.co)|(Map_My_Travel_V2_1136cc214788f6e2c4fbd748c875f289@www\\.mapmytravel1\\.co)|(Map_Your_Way_dba6e11787a9a4c0ff802d30e2d84655@www\\.mapyourway\\.online)|(Map_Your_Way_RRrntXMhmV@www\\.mapyourway\\.online)|(Map-Buddy\\.net_YDYeEFqMMB@www\\.map-buddy\\.net)|(MapAssistant\\.net_IxpgMrxoal@www\\.mapassistant\\.net)|(Maps_Finder_clone_lXfNOQsASa@www\\.getmapfinder\\.com)|(Maps_Finder_clone_OHRJTSZWsp@www\\.getmapfinder\\.com)|(Maps_Finder_clone_qjbEfuxypy@www\\.getmapfinder\\.com)|(Maps_Finder_clone_sVixvNGfvq@www\\.getmapfinder\\.com)|(Maps_Finder_clone_XiwisRQHED@www\\.mapsfinder\\.co)|(Maps_Finder_cxamiyXEhG@www\\.maps-finder\\.co)|(Maps_Finder_ikDztWsXOS@www\\.mapsfinder\\.co)|(Maps_Finder_ISFXVmdcMZ@www\\.getmapfinder\\.com)|(Maps_Finder_NEJbQoRTxu@www\\.mymapfinder\\.co)|(Maps_Finder_OAXSzUFBAz@www\\.getmapfinder\\.com)|(Maps_Finder_Online_cb9ff9fa82db81028ec8b5a9c738c3d0@www\\.mymapsfinderonline\\.com)|(Maps_Finder_Online_fa0d46585631975dfefb9653fbdc5ae5@www\\.mapsfinderonline\\.com)|(Maps_Finder_Online_VBUnFyZArH@www\\.mapsfinderonline\\.com)|(Maps_Finder_OyeiUXSYyC@www\\.mymap-buddy\\.com)|(Maps_Finder_yiomudinei@www\\.mapsfinder\\.co)|(Maps_Now_1a47fbf8546a43d949f229efca9a2f34@www\\.mapsnow\\.co)|(Maps_Now_23f9f3cd0b483c22be85bb2568a2df4f@www\\.mapsnow\\.co)|(Maps_Now_85bb8ec9ca1c2baab2dc307af81964c2@www\\.mapsnow\\.co)|(Maps_Now_cbd62915225f7f059c5d15daa3a59cad@www\\.mapsnow\\.co)|(Maps_Now_clone_daDccVKFiR@www\\.mapsnow\\.co)|(Maps_Now_clone_eaIVjwJWMX@www\\.mapsnow\\.co)|(Maps_Now_clone_HmcRPOcjzE@www\\.mapsnow\\.co)|(Maps_Now_clone_QnqJIECgrq@www\\.mapsnow\\.co)|(Maps_Now_clone_VNlrSBkTlM@www\\.mapsnow\\.co)|(Maps_Now_clone_yDfyuWvMMp@www\\.mapsnow\\.co)|(Maps_Now_clone_YDpyMtVaLW@www\\.mapsnow\\.co)|(Maps_Now_clone_ZyNlPAcxdc@www\\.mapsnow\\.co)|(Maps_Now_tmnjrLnmFO@www\\.mapsnow\\.co)|(Maps_Now_uwqucqWEGq@www\\.mapsnow\\.co)|(Maps_Now_XSqhhyPFiH@www\\.mapsnow\\.co)|(Maps_Today_UoKEAlMYFh@www\\.mapmyjourneynt\\.co)|(mapsfinder@www\\.mapsfinder\\.co)|(Metric_Converter_Pro_437e424a1d8a287713fd991b4babb241@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_48e7e1cd7ea7a150ce498c7f4c1a8525@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_c1043f9d35c4300be27a136d2956b8bd@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_b151705ba46c35bf8530f6fcccad39ff@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_HoBPpUTrbw@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_KaiswSnKUV@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_SzGHQnHNkN@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_WchvzpVULZ@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_rEvcfmsuJW@www\\.metricconverterpro\\.com)|(Movie_Delight_LVlUUJCTfd@www\\.movie-delight\\.com)|(Movie_Delight_xWRWlvWNGj@www\\.movie-delight\\.com)|(Movie_Hunt_GzAuVRhAph@www\\.moviequest\\.online)|(Movie_Hunt_ioLSsIUbVX@www\\.themoviesearch\\.org)|(Movie_Hunt_jbuqRPUUVt@www\\.moviehunt\\.today)|(Movie_Hunt_jHPrIKUDZi@www\\.moviehunt\\.today)|(Movie_Hunt_Online_jJicoNDurf@www\\.moviehunt\\.online)|(Movie_Maniac_2462069208dfe0b3d754ec0d11bf7b40@www\\.themoviemaniac\\.co)|(Movie_Maniac_a84cd1cd277e4886cbd535cafddb9248@www\\.themoviemaniac\\.co)|(Movie_Maniac_clone_4b2e8fc1efa469664fbfe3b1cfd600ce@www\\.themoviemaniac\\.co)|(Movie_Maniac_clone_bbe030355b07de5cd10dee52a60db3e3@www\\.themoviemaniac\\.co))$/","prefs":[],"schema":1576758242842,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b009e1d2-ed9c-42b3-b795-b63d15b15deb","last_modified":1576771657084},{"guid":"/^((Movie_Maniac_clone_FhKByuyzfD@www\\.themoviemaniac\\.co)|(Movie_Maniac_clone_OzkDkQoxcV@www\\.themoviemaniac\\.co)|(Movie_Maniac_clone_pNBsVugeLv@www\\.themoviemaniac\\.co)|(Movie_Maniac_qNRzbWPyVh@www\\.themoviemaniac\\.co)|(Movie_Quest_DgloGEcqoQ@www\\.movie-quest\\.online)|(Movie_Quest_DHlTecEnbH@www\\.moviequest\\.online)|(Movie_Quest_lSUIfjeATU@www\\.movie-quest\\.org)|(Movie_Quest_ogkgHKpiCu@www\\.movie-quest\\.org)|(Movie_Quest_oIbDMPkLHN@www\\.the-moviequest\\.today)|(Movie_Quest_OYXdMYNGlQ@www\\.moviequest\\.online)|(Movie_Quest_WwjFqvwace@www\\.moviequest\\.online)|(Movie_Search_4634ea60272d58007cb594bddf4c2d14@www\\.moviesearchtoday\\.com)|(Movie_Search_5adb28a06e6a557580f892b00df54fe9@www\\.moviesearchtoday\\.com)|(Movie_Search_5e2468caef8b002ec4af47d33347d946@www\\.moviesearchtoday\\.com)|(Movie_Search_6a2835fbcfa21f071a72cf4b1d768ee1@www\\.moviesearchtoday\\.com)|(Movie_Search_82956306d33016e1612f6b93238abb8c@www\\.movie-searchtoday\\.com)|(Movie_Search_amo_hosting_clone_cdvWgyZchs@staging\\.themovie-portal\\.com)|(Movie_Search_clone_BPUjteCIKH@www\\.moviesearchtoday\\.com)|(Movie_Search_clone_hOjSGlUSJc@www\\.themovie-portal\\.com)|(Movie_Search_clone_tUhUWKFWEy@staging\\.themovie-portal\\.com)|(Movie_Search_clone_yNPQCvYjiE@www\\.search-movie\\.today)|(Movie_Search_fce3642a62f1d43d671b9cc1edae2248@www\\.moviesearchtoday\\.com)|(Movie_Search_GnuaPoCHyn@www\\.moviesearchtoday\\.com)|(Movie_Search_HQkuRtYSBi@www\\.movie-search\\.today)|(Movie_Search_JsPzrSgfUw@www\\.moviesearchtoday\\.com)|(Movie_Search_ldxwfXRmwB@www\\.movie-search\\.live)|(Movie_Search_LyOzXmENOz@www\\.movie-search\\.today)|(Movie_Search_OoYYDEappx@www\\.moviesearch\\.today)|(Movie_Search_qQXnYBWtZL@www\\.movie-searchtoday\\.com)|(Movie_Search_qSoQoWSxLl@www\\.movie-hunt\\.co)|(Movie_Search_ryfmFVsOyx@www\\.movie-search\\.today)|(Movie_Search_usVRdBSJFC@www\\.moviesearchtoday\\.com)|(Movie_Search_VbiTYRjDIi@www\\.themoviesearch\\.co)|(Movie_Search_wEfUXCokzy@www\\.moviesearch\\.today)|(Movie_Search_wGdgcYcPQb@www\\.moviesearchtoday\\.com)|(Movie-Hub\\.info_OmWUKRcKuS@www\\.movie-hub\\.info)|(Movie-Quest_KJpvmWXXVL@www\\.movie-quest\\.co)|(Movie-Quest\\.info_eUjlCfSYnv@www\\.movie-quest\\.info)|(Movie-Quest\\.info_kdhRhuajuC@www\\.movie-quest\\.info)|(movie-quest\\.today_ftrItBjuLQ@www\\.movie-quest\\.today)|(MovieQuest_jyRMkNmSGC@www\\.moviequest\\.co)|(moviequest\\.today_JlDnGylmbG@www\\.moviequest\\.today)|(moviequest@www\\.moviequest\\.co)|(MusicQuest_IuWBQBhiuw@www\\.music-quest\\.co)|(mvquest@www\\.moviequest\\.co)|(My_Astro_Tab_8e89559e65a469daf6766bb75d4376ab@www\\.myastrotab\\.com)|(My_Astro_Tab_KaAEnbwPUx@www\\.myastrotab\\.com)|(My_Coupon_Store_ylKTlAUXbo@www\\.mycouponstore\\.co)|(My_Daily_Astrology_MqfKduyqcg@www\\.my-dailyastrology\\.net)|(My_Daily_Utilities_4ebdffa571404d80516d8d0f530af9a6@www\\.mydailyutilities\\.co)|(My_Daily_Utilities_clone_4d4f3e4318db94478d9302c598ef468c@www\\.mydailyutilities\\.co)|(My_Daily_Utilities_clone_TQYRFwiprp@www\\.mydailyutilities\\.co)|(My_Daily_Utilities_clone_wsrcjEDqNR@www\\.mydailyutilities\\.co)|(My_Daily_Utilities_iwpgTQIUFx@www\\.mydailyutilities\\.co)|(My_Directions_Finder_c406a6ac6a2b0638fcb489f1b776b903@www\\.mydirectionsfinder\\.net)|(My_Directions_Finder_clone_alDWaOiCNo@www\\.mydirectionsfinder\\.com)|(My_Directions_Finder_clone_iIYkMlrcwN@www\\.mydirectionsfinder\\.net)|(My_Directions_Finder_clone_mBlfabAHtF@www\\.mydirectionsfinder\\.com)|(My_Directions_Finder_clone_oIFvReYNwJ@www\\.mydirectionsfinder\\.net)|(My_Directions_Finder_clone_TUeunTaGWJ@www\\.mydirectionsfinder\\.net)|(My_Directions_Finder_ejopyTsDPc@www\\.mydirectionsfinder\\.com)|(My_Directions_Finder_RIUfITHqsm@www\\.mydirectionsfinder\\.com)|(My_Doc_Converter_a70620b85cb93c122c397d5a0d6d6c17@www\\.mydocconverter\\.net)|(My_Doc_Converter_hTuhuUWAbu@www\\.mydocconverter\\.net)|(My_File_Converter_InJpDFniec@www\\.myfileconverter\\.net)|(My_File_Converter_MOLroWzmvk@www\\.myfileconverter\\.net)|(My_File_Converter_uJJIGUseRO@www\\.myfileconverter\\.org)|(My_Mail_Center_clone_AOBAQIlpph@www\\.mymailcenter\\.co)|(My_Mail_Center_clone_JJSlJDujLf@www\\.mymailcenter\\.co)|(My_Mail_Center_StbPlXiGzU@www\\.mymailcenter\\.co)|(My_Map_Buddy_AHxkFzHUSq@www\\.mymap-buddy\\.com)|(My_Map_Buddy_aJhRltItzB@www\\.mymap-buddy\\.co)|(My_Map_Buddy_dzzNGYdgEy@www\\.mymapbuddy\\.link)|(My_Map_Buddy_lCpBZhZcug@www\\.mymap-buddy\\.co))$/","prefs":[],"schema":1576758270991,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c264de14-d096-45d7-afd6-4e03f3f0874e","last_modified":1576771657080},{"guid":"/^((My_Map_Buddy_LlytpwAxzJ@www\\.my-mapbuddy\\.link)|(My_Map_Buddy_omjWWfWnZV@www\\.checkmaps\\.live)|(My_Map_Buddy_QniENdnZwH@www\\.mymapbuddy\\.co)|(My_Map_Buddy_qwjuFaLDiS@www\\.my-mapbuddy\\.link)|(My_Map_Finder_216cea355b90081b2fa2b35228afa8cd@www\\.mymapfinder\\.net)|(My_Map_Finder_FQhLxNAhOb@www\\.mymapfinder\\.net)|(My_Map_Finder_HIAdZUsdqP@www\\.easymapsfinder\\.com)|(My_Map_Key_bfebaaffd5e89eb58d8eede5550b7657@www\\.mymapkey\\.com)|(My_Map_Key_PNKwkyDcSv@www\\.mymapkey\\.com)|(My_Map_Quest_amtyvbVOvw@www\\.mymapquest\\.co)|(My_Map_Tab_e4256b0cd83dd5dc7ffd2d6fa89bb3ca@www\\.mymaptab\\.co)|(My_Map_Tab_fQPfsnZVRi@www\\.mymaptab\\.co)|(My_Maps_Daily_2216a0fb9fa410e585f75583c84bb1fc@www\\.mymapsdaily\\.com)|(My_Maps_Daily_HTtwoSgSmO@www\\.mymapsdaily\\.com)|(My_Maps_Finder_mlqpWnYOjs@www\\.mymapsfinderonline\\.com)|(My_Maps_Now_wouVnzxahG@www\\.mymapsnow\\.co)|(My_Metric_Converter_AZzUIIKwJY@www\\.mymetricconverter\\.com)|(My_Net_Speed_clone_LEPCOrGXJt@www\\.my-netspeed\\.co)|(My_Net_Speed_dIUrWuilrC@www\\.my-netspeed\\.co)|(My_Net_Speed_hQVahLtcSK@www\\.mynet-speed\\.com)|(My_Net_Speed_keJWBLUIYD@www\\.mynet-speed\\.com)|(My_Net_Speed_XhDnHJmvAF_1@www\\.mynetspeed\\.co)|(My_Net_Speed_XhDnHJmvAF@www\\.mynetspeed\\.co)|(My_Net_Speed_YGdxRAMaly@www\\.mynetspeed\\.link)|(My_Quick_Directions_384f670ee31df7278a1df86a202697c2@www\\.myquickdirections\\.com)|(My_Quick_Directions_IoipCjCqHK@www\\.myquickdirections\\.com)|(My_Quick_Search_HHmoLNFNZK@www\\.myquicksearch\\.co)|(My_Radio_Plus_clone_xijbeLEKut@www\\.myradioplus\\.co)|(My_Radio_Plus_clone_yLODfWIUzo@www\\.myradioplus\\.co)|(My_Radio_Plus_huJGcbKJdz@www\\.myradioplus\\.co)|(My_Recipe_Digest_806bc9c3d627874ac6f6c953e1174d41@www\\.myrecipedigest\\.com)|(My_Recipe_Digest_TQhDINXjet@www\\.myrecipedigest\\.com)|(My_Recipe_Guide_4bc8a248146602106b25349ec50b7395@www\\.myrecipeguideonline\\.com)|(My_Recipe_Guide_ZlrLqLHAKb@myrecipeguideonline\\.com)|(My_Route_Planner_6bb055b2be5912b90cec3a2788636830@www\\.myrouteplanner\\.co)|(My_Route_Planner_ccdd62d844c1769d5bf4db308b3bc9c9@www\\.myrouteplanner\\.co)|(My_Route_Planner_clone_AFCMlCneMs@www\\.myrouteplanner\\.co)|(My_Search_Plus_91de35f6bc26e7f423a701dc4a7d9e6b@www\\.mysearchplus\\.co)|(My_Search_Plus_clone_7d6359f4c55d1f5c5a9af0304e7dcf34@www\\.mysearchplus\\.co)|(My_Search_Plus_clone_ejVWzjJsWF@www\\.mysearchplus\\.co)|(My_Search_Plus_clone_fBHEaWXiDZ@_123456www\\.mysearchplus\\.co)|(My_Search_Plus_clone_fBHEaWXiDZ@www\\.mysearchplus\\.co)|(My_Search_Plus_clone_zHyeSWPlyQ@www\\.mysearchplus\\.co)|(My_Search_Plus_zasNrdaCMb@www\\.mysearchplus\\.co)|(My_Search_Wizard_7f2979e35d2bd7dd61433bbca4e930bf@www\\.mysearchwizard\\.co)|(My_Search_Wizard_887bc211e6c12bcd4c59204553e75ed5@www\\.mysearchwizard\\.co)|(My_Search_Wizard_clone_CuEYdreCCG@www\\.mysearchwizard\\.co)|(My_Search_Wizard_clone_MfzUjTpTSj@www\\.mysearchwizard\\.co)|(My_Search_Wizard_clone_PhkuhYznxq@www\\.mysearchwizard\\.co)|(My_Smart_Search\\.co_uUlxGOYDUP@www\\.mysmartsearch\\.co)|(My_Smart-Search\\.co_moHloXmlvd@www\\.mysmart-search\\.co)|(My_Smart-Search\\.co_nVQpezjwFN@www\\.mysmart-search\\.co)|(My_Weather_Services_MTCOGCZgEo@myweatherservicesn\\.org)|(My_Weather_Tab_cdb3a5fdbcc268762efb7f1b9088a935@www\\.myweathertab\\.co)|(My_Word_Scribe_6ac6fa9173610517a627c5298a38891a@www\\.mywordscribe\\.com)|(My_Word_Scribe_clone_RZEMcCVoIU@www\\.mywordscribe\\.com)|(My_Word_Scribe_clone_TAZVHOvofp@www\\.mywordscribe\\.com)|(My_Word_Scribe_GlqExrIfvA@www\\.mywordscribe\\.com)|(My_Word_Scribe_wRguUlbptJ@www\\.mywordscribe\\.com)|(MyAstroFinder_clone_meuCieSJGq@www\\.myastrofinder\\.co)|(MyAstroFinder_QqSSwnxQpy@www\\.myastrofinder\\.co)|(MyCareer-Search\\.co_IcpqItVxAi@www\\.mycareer-search\\.co)|(MyCoupon-Finder\\.co_DatSgecXGq@www\\.mycoupon-finder\\.co)|(MyCouponFinder\\.co_ZMMzlIEann@www\\.mycouponfinder\\.co)|(mydailyastrologyco@www\\.mydailyastrology\\.co)|(mydailyastrologyonline@www\\.mydailyastrology\\.online)|(mydailynewsonline@www\\.mydailynews\\.online)|(MyMapBuddy\\.net_oVKQZzxNzk@www\\.mymapbuddy\\.net)|(MyMusicSearch\\.co_zsqyyUdIfE@www\\.mymusicsearch\\.co)|(mynetspeedco@www\\.mynetspeed\\.co)|(MySearchTab\\.co_QXqKBErWIz@www\\.mysearchtab\\.co)|(Net_Speed_bfa1870197a5380d1f00708341444fe4@www\\.testnetspeed\\.co)|(Net_Speed_f61989f67aeb3c5ed6180f49b2160ea1@www\\.net-speed\\.co)|(Net_Speed_imtTaleZMk@www\\.net-speed\\.co))$/","prefs":[],"schema":1576758309063,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a3e1bff4-2e6a-4a7f-a1e3-f7eff451655b","last_modified":1576771657076},{"guid":"/^((Net_Speed_Ninja_rJSmpzPQRq@www\\.netspeedninja\\.co)|(Net_Speed_nYAhXCpaOF@www\\.testnetspeed\\.co)|(Net_Speed_Plus_MnPDDtnfZh@www\\.checkmyspeednownt\\.com)|(Net_Speed_Test_b419d25436f7b7cb3458407498bae21f@www\\.netspeedtesthub\\.com)|(Net_Speed_Test_Hub_OOlSMbcwOe@netspeedtesthub\\.com)|(Net_Speedtest_8e202a4f66675f188c265a8ef11e47fa@www\\.netspeedtest\\.co)|(Net_Speedtest_clone_ikAadlLvLs@www\\.netspeedtest\\.co)|(Net_Speedtest_ysCFtRLxZn@www\\.netspeedtest\\.co)|(NetSpeedCalculator\\.net_mzMnaouenc@www\\.netspeedcalculator\\.net)|(netspeedproco@www\\.netspeedpro\\.co)|(New_Jobs_Quest_8f6247b00ffc5b1bb2f3f30fc73a9de5@www\\.newjobsquest\\.co)|(News__Precinct_75018cea70cf57e0ab66d312ef3a769d@www\\.newsprecinct\\.com)|(News__Precinct_sggnBoSvRu@www\\.newsprecinct\\.com)|(News_Daily_UBtJmysrDA@www\\.newstrackrnt\\.co)|(News_Headlines_bKwUmAeFcG@www\\.newsheadlinespro\\.com)|(News_Headlines_f70874554c3c22b5fec6f98e845d9b4d@www\\.newsheadlinespro\\.com)|(News_Headlines_SfZxlPzEgN@www\\.newsheadlinespro\\.com)|(News_Precinct_05544a082b3c01a286c66f7cf4251700@www\\.newsprecinct\\.com)|(News_Precinct_clone_5cd166a363627a7f453b1b69769f436d@www\\.newsprecinct\\.com)|(News_Precinct_clone_NeRHwQGodq@www\\.newsprecinct\\.com)|(News_Precinct_clone_PTdBCNrWPD@www\\.newsprecinct\\.com)|(News_Precinct_dLqSikAjQC@www\\.newsprecinct\\.com)|(News_Precinct_gzVnHZnzOy@www\\.newsprecinct\\.com)|(NewStackr_uNFYKFwAWP@www\\.NewsTackR\\.com)|(NewsTrackr_clone_qKtwLAHfjm@www\\.newstrackr\\.co)|(NewsTrackr_clone_vJczLpOPSO@www\\.newstrackr\\.co)|(NewsTrackr_e1032761f4eb1beb126fdface070fb37@www\\.newstrackr\\.co)|(NewsTrackr_iDEHLRYWqj@www\\.newstrackr\\.co)|(NewsTrackr_ZtEQVEonqX@www\\.newstrackr\\.co)|(newsupdatesinnet@www\\.newsupdates\\.in\\.net)|(no_EzdEKVkeZk@www\\.test10\\.com)|(Online_Coupon_Finder_njhVhBdgcg@onlinecoupon-finder\\.co)|(Online_Coupon_Finder_QuNkIQQUVz@www\\.onlinecouponfinder\\.net)|(Online_Coupon_Finder_SZuYIubYMN@www\\.onlinecouponfinder\\.net)|(Online_Doc_Converter_7d7d0b74adad02f39590d705822a70e2@www\\.onlinedocconverter\\.com)|(Online_Doc_Converter_qpIkrHZegO@www\\.onlinedocconverter\\.com)|(Online_Document_Converter_clone_xZguXlOjJE@www\\.convertmypdf\\.co)|(Online_Package_Tracker_TNAcobvKgm@onlinepackagetracker\\.co)|(Online_PDF_Converter_aJsvvVEBaO@www\\.myonlinepdfconverter\\.net)|(Online_PDF_Converter_kxVNqagGZG@myonlinepdfconverter\\.com)|(Online_Recipe_RURMecAQzt@www\\.onlinerecipe\\.co)|(Online_Recipe_VNtLUGYjpI@www\\.onlinerecipe\\.co)|(Online_Speed_Radar_clone_YlZLvnSGjM@www\\.onlinespeedradar\\.com)|(Online_Web_Search_clone_WjoqJJklvS@www\\.onlinewebsearch\\.co)|(Online_Web_Search_d1b9b3e703905b67931858f6f5aecdca@www\\.onlinewebsearch\\.co)|(OnlineRecipeSearch\\.info_pEdBAUaqCR@www\\.onlinerecipesearch\\.info)|(Package_Trace_JOGQGobPMj@www\\.trackpackagequicknt\\.com)|(Package_Tracker_02a37a57871ec5b57a0555403157dcf8@www\\.package-tracker\\.co)|(Package_Tracker_07a2a700968a7da88eb77b9c46279b1c@www\\.dailypackagetracker\\.com)|(Package_Tracker_3ce363c30f45ee0016862ac499be7ff5@www\\.packagetrackeronline\\.com)|(Package_Tracker_698579ac9c231e14ca69e1894f353396@www\\.dailypackagetracker\\.com\\.disabled)|(Package_Tracker_75a19df973eae7cf6e19c396c3973451@www\\.package-tracker\\.co)|(Package_Tracker_clone_FNZBehhrfr@www\\.package-tracker\\.co)|(Package_Tracker_EOXBmHOBkZ@www\\.package-tracker\\.co)|(Package_Tracker_Express_clone_cbOTQhTNgs@www\\.packagetrackerexpress\\.com)|(Package_Tracker_Express_ZxaTHkYQxF@www\\.packagetrackerexpress\\.com)|(Package_Tracker_fd87086da3f36037204f4b0bf23f1ea1@www\\.package-tracker\\.co)|(Package_Tracker_HaMksfdhUi@www\\.dailypackagetracker\\.com)|(Package_Tracker_Hub_clone_cfdJxpAmIT@www\\.packagetrackerhub\\.com)|(Package_Tracker_Hub_EreNcpVUoK@www\\.packagetrackerhub\\.com)|(Package_Tracker_kaiHEFsqvp@www\\.ThePackageTrack\\.com)|(Package_Tracker_KwwfXjTWsn@www\\.package-tracker\\.co)|(Package_Tracker_OHnRIWuvmH@www\\.packagetrackeronline\\.com)|(Package_Tracker_Online_b49f3fc69d90679955379dab26b2a6fa@www\\.packagetrackeronline\\.com)|(Package_Tracker_Online_cleZBgkKxj@www\\.packagetrackeronline\\.com)|(Package_Tracker_Online_EmvHhroAmG@www\\.packagetrackeronline\\.com)|(Package_Tracker_QYmRTqNSxY@www\\.getpackagetracker\\.com)|(Package_Tracker_Tab_50fa581c36cad6995f117782f5105636@www\\.packagetrackertab\\.com))$/","prefs":[],"schema":1576758357512,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4bc321ad-e23b-4ed3-86bf-a1a3a38fbf75","last_modified":1576771657072},{"guid":"/^((Package_Tracker_yJbpZEQECr@www\\.package-tracker\\.co)|(packagefollowercom@www\\.packagefollower\\.com)|(PDF_Converter_AQpxoneXlZ@www\\.pdf-convertn\\.co)|(PDF_Converter_Plus_ZgLTNbAZUb@www\\.pdfconverterplus\\.com)|(PDF_Pro_Converter_eTqIXytHWq@www\\.pdfproconverter\\.com)|(Pets_Wallpapers_SKWDasMHYY@petswallpapers\\.net)|(phototab@www\\.wallpaperonlinepro\\.com)|(Premier_Search_clone_CcAEnLGkmK@www\\.premiersearch\\.co)|(Premier_Search_clone_wfigyWtsdL@www\\.premiersearch\\.co)|(Privacy-Search\\.biz_cXHpGjbGct@www\\.privacy-search\\.biz)|(Privacy-Search\\.club_fNwUjmGvkM@www\\.privacy-search\\.club)|(Privacy-Search\\.company_gzqnuNM@www\\.privacy-search\\.company)|(Privacy-Search\\.in\\.net_UdIeydXEbw@www\\.privacy-search\\.in\\.net)|(Privacy-Search\\.info_BzTWanpKDM@www\\.privacy-search\\.info)|(Privacy-Search\\.link_DATRCktqwk@www\\.privacy-search\\.link)|(Privacy-Search\\.one_NPLmbtQaBI@www\\.privacy-search\\.one\\.disabled\\.com)|(Privacy-Search\\.online_PwQLiKaWGq@www\\.privacy-search\\.online)|(Privacy-Search\\.site_zYtZQgkEtf@www\\.privacy-search\\.site)|(Privacy-Search\\.space_AjqewVnBVW@www\\.privacy-search\\.space)|(Privacy-Search\\.store_vNAqbjRGGn@www\\.privacy-search\\.store)|(Privacy-Search\\.today_NRVdCCeOIa@www\\.privacy-search\\.today)|(Privacy-Search\\.website_JwizWmtjPu@www\\.privacy-search\\.website)|(Privacy-Search\\.xyz_clone_juEABfQNOl@www\\.privacy-search\\.xyz)|(Privacy-Search\\.xyz_elSDqUATPt@www\\.privacy-search\\.xyz\\.disabled\\.com)|(Privacy-Search\\.xyz_oIkblTLPSN@www\\.privacy-search\\.xyz)|(PrivacySearch\\.biz_bAwIbiJVAP@www\\.privacysearch\\.biz)|(PrivacySearch\\.club_MRWkilEqOZ@www\\.privacysearch\\.club)|(PrivacySearch\\.company_hOwSWgQKdn@www\\.privacysearch\\.company\\.disabled\\.com)|(PrivacySearch\\.company_NAKTVsEmEC@www\\.privacysearch\\.company)|(PrivacySearch\\.in\\.net_NxaHlhdTlz@www\\.privacysearch\\.in\\.net)|(PrivacySearch\\.link_EOhtykDnGr@www\\.privacysearch\\.link)|(PrivacySearch\\.me_QSSIQcOMtH@www\\.privacysearch\\.me)|(PrivacySearch\\.one_WUIHjcIjXh@www\\.privacysearch\\.one)|(PrivacySearch\\.one_zOkggTAokc@www\\.privacy-search\\.one)|(PrivacySearch\\.online_CYiUatShgl@www\\.privacysearch\\.online)|(PrivacySearch\\.space_YagHPcSikB@www\\.privacysearch\\.space)|(PrivacySearch\\.store_pJBFyyaDRx@www\\.privacysearch\\.store)|(PrivacySearch\\.website_cGZdtKrFao@www\\.privacysearch\\.website)|(PrivacySearch\\.xyz_ZEUMZLHcqv@www\\.privacysearch\\.xyz)|(privacysearchco_xXdgBRl@info\\.privacysearch\\.co)|(privacysearchco@info\\.privacysearch\\.co)|(PrivateSearchOnline\\.com_IhKdmYiVeK@info\\.privatesearchonline\\.com)|(Pro_Games_Online_HVwluXulrt@www\\.progamesonline\\.co)|(Puppies_World_trFanlsdqu@www\\.puppiesworld\\.info)|(Puppy_Wallpapers_ZOWpJDLXFj@www\\.puppywallpapers\\.net)|(Quick_Career_Search_WDeLsGajVb@www\\.quickcareersearch\\.co)|(Quick_Daily_Mail_SKeVfXlhFp@www\\.quickdailymail\\.com)|(Quick_Email_App_EFITirXRRs@www\\.quickemailapp\\.com)|(Quick_Email_Checker_7796dc8c3c9cde3502870b6054bb34db@www\\.quickmailchecker\\.com)|(Quick_Email_Checker_BQerPmohdb@www\\.quickmailchecker\\.com)|(Quick_Map_Tab_98eb6af566aadaea6dae58aa6d841a70@www\\.quickmaptab\\.com)|(Quick_Map_Tab_IJTJmbzNOx@www\\.quickmaptab\\.com)|(Quick_Maps_clone_hIZNOOMdWQ@www\\.getquickmaps\\.com)|(Quick_Maps_clone_xRcOZiPvYl@www\\.getquickmaps\\.com)|(Quick_Maps_Online_7bcf0c280d92934d11d0b449980a1937@www\\.quickmapsonline\\.com)|(Quick_Maps_Online_QKDpNHmDpD@www\\.quickmapsonline\\.com)|(Quick_Maps_pjWqGYHPRE@www\\.getquickmaps\\.com)|(Quick_Online_Directions_0364feaec027aaab80a920e79ac1800c@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_clone_8cfe33dcf14406257fca53f436aad1ff@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_clone_bFKYEkYGUO@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_clone_JcSWuSfSrw@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_clone_qswqvmCxux@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_d922039a0497633824e490148707ca71@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_eddee69bb3984d22264d57b63e6f0115@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_OFYSSUWMOH@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_Test_gbFqFQwwaZ@www\\.quickonlinedirections\\.com)|(Quick_Recipe_Search_QumKWdGMdB@www\\.quickrecipesearch\\.today)|(Quick_Search_Tab_Cbzrnmuqub@www\\.quicksearchtab\\.co))$/","prefs":[],"schema":1576758405945,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"402be073-072f-44d7-a557-7c98914dc0da","last_modified":1576771657067},{"guid":"/^((Quick_Speed_Checker_09b7f7d1acd76f23f1d887e60ddcc474@www\\.quickspeedchecker\\.com)|(Quick_Speed_Checker_clone_3db2cd8f8f3e192f57ca83da50451660@www\\.quickspeedchecker\\.com)|(Quick_Speed_Checker_clone_bhRDSCySFq@www\\.quickspeedchecker\\.com)|(Quick_Speed_Checker_sqZXXzzpsT@www\\.quickspeedchecker\\.com)|(Quick_Weather_Forecast_IHOnRApsey@www\\.quickweatherforecast\\.com)|(Quick_Weather_Updates_6277aeb2d83428ca469904f0886e0938@www\\.quickweatherupdates\\.com)|(Quick_Weather_Updates_yieimwNJEx@www\\.quickweatherupdates\\.com)|(QuickNews\\.co_vZLHaiMlVV@www\\.quicknews\\.co)|(QuickRecipeSearch\\.co_hqhPDvuKrF@www\\.quickrecipesearch\\.co)|(qwertyuiopasdf@www\\.xyz\\.com)|(Radio_Hub_Online_YfJreNCpww@www\\.radiohubonline\\.com)|(rakshitchoudhary8@gmail\\.com)|(rakshitchoudhary8@gmail\\.om)|(Recipe_Board_Plus_7484a472b0b409e4895321bdd72e1945@www\\.recipeboardplus\\.com)|(Recipe_Board_Plus_f92fd9f713f932491e785a977401bb7c@www\\.recipeboardplus\\.com)|(Recipe_Board_Plus_gpeHSqIYiT@www\\.recipeboardplus\\.com)|(Recipe_Board_Plus_hYpxDyhZpP@www\\.myrecipeguideonline\\.com)|(Recipe_Board_Plus_pfyXDonFTr@www\\.recipeboardplus\\.com)|(Recipe_Book_Search_d62d1a871fc0f1d38ecf6b7653ae688b@www\\.recipebooksearch\\.com)|(Recipe_Book_Search_MRJMOtSRZt@www\\.recipebooksearch\\.com)|(Recipe_Book_Tab_3deea22a93f8e99342510c9cb16ccdf4@www\\.recipebooktab\\.com)|(Recipe_Guide_Plus_41c1f7d66a164e59a4721902d4a0a6c5@www\\.recipeguideplus\\.com)|(Recipe_Guide_Plus_dHGfHpqpFD@www\\.recipeguideplus\\.com)|(Recipe_Online_gwFoqximpy@www\\.recipeonline\\.net\\.test)|(Recipe_Search_Guide_e1d73ceb736fe3f0cf7b0da6063a92b3@www\\.recipesearchguide\\.com)|(Recipe_Search_Guide_mbFGBVqpia@www\\.recipesearchguide\\.com)|(Recipe_Search_Plus_5bc244154d5ed1b0fa3e2ff8e788ddbd@www\\.recipesearchplus\\.com)|(Recipe_Search_Plus_FxKIeZgMHD@www\\.recipesearchplus\\.com)|(Recipes_by_Alot_klEAJdojHM@www\\.mydailyrecipes\\.co)|(sahil@searchprivacy\\.co)|(Satellite_Maps_Now_aPVhlrXyLu@www\\.satellitemapsnow\\.com)|(Say_Rosary_7fbf455ac8a8d9319ec8e9c888bbc8f0@www\\.sayrosary\\.com)|(Say_Rosary_IoTPeJHVYN@www\\.sayrosary\\.com)|(Search_Anonymous_3914bca7a10a50db91f284a844eeec2f@www\\.searchanonymous\\.co)|(Search_Anonymous_kHrtzTbIUW@www\\.searchanonymous\\.co)|(Search_Atlas_8c11f710a756258b85fce73f36080a00@www\\.searchatlas\\.co)|(Search_Atlas_a65471976592d8afb32ab1d355329f4f@www\\.searchatlas\\.co)|(Search_Atlas_fgPWjhrMII@www\\.searchatlas\\.co)|(Search_Atlas_JvMkNyzBew@www\\.searchatlas\\.co)|(Search_Beacon_App_eqehzqftmN@www\\.searchbeaconapp\\.com)|(Search_Center_clone_jwMueYZfAC@www\\.searchcenter\\.co)|(Search_Central_c4359af19cd8d0828733d75832e3bb87@www\\.searchcentral\\.co)|(Search_Direct_Pro_qkzlUJiGov@www\\.searchdirectpro\\.com)|(Search_Easy_008d08b3ff05afbcae6df5b92296a6d0@www\\.search-easy\\.co)|(Search_Easy_Go_577387e8b765f721486040e639398c71@www\\.searcheasygo\\.com)|(Search_Easy_Go_80d5131cc8b26c5c4af3f4aa83886f7f@www\\.searcheasygo\\.com)|(Search_Easy_Go_AvYrOIFWDF@www\\.searcheasygo\\.com)|(Search_Easy_Hub_2f45453af53121c146d7bf5c3dd914c3@www\\.searcheasyhub\\.com)|(Search_Easy_kDZUkxUbSP@www\\.search-easy\\.co)|(Search_Easy_Plus_3f7d63b42346d0eb02176aa32f33b9a4@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_8965c3185ad17bdd1c759078bcde92f0@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_8d7d969cf1d24004447fa0066e4dfd02@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_8f70d67adfbdd9aa623aa2057efffc8b@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_9e6663ee2c4803fe1e7bf20b90f26e96@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_aMOxRncWIJ@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_cdb1d9b83ae0801f912e8b73cac0836f@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_dedOWbqqXd@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_DHIlDaCkwl@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_dWFEmfADcn@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_eRdOVuRKeX@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_HlNUDYUqua@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_njXAdPCyfZ@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_rrXYlzwRaJ@www\\.searcheasyplus\\.com)|(Search_Easy_Pro_20670965804c5d16d21370f657dcdca0@www\\.searcheasypro\\.com)|(Search_Easy_Pro_73aa350eceb1758d88bd3edb17b26a95@www\\.searcheasypro\\.com)|(Search_Easy_Pro_VDbJUdDuEi@www\\.searcheasypro\\.com)|(Search_Easy_Web_ad43024621fcd724bf50596e41f6852f@www\\.searcheasyweb\\.com))$/","prefs":[],"schema":1576758467216,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b0054d00-739f-43e5-a6a4-22a56fd09844","last_modified":1576771657063},{"guid":"/^((Search_Easy_Web_tvqEdWRwUI@www\\.searcheasyweb\\.com)|(Search_Express_CgqiRHXtYw@www\\.yoursearchexpress\\.com)|(Search_For_Maps_gLRdugmyXV@www\\.search-maps\\.net)|(Search_Plus_090a3f242292c36b80d33fd7e48aeb84@www\\.search-plus\\.co)|(Search_Plus_App_2d6fef8895df8a9a67c9bd3b15438abf@www\\.searchplusapp\\.com)|(Search_Plus_App_zZmjIdjudH@www\\.searchplusapp\\.com)|(Search_Plus_lPNIzNDSuX@www\\.search-plus\\.co)|(Search_Plus_Now_04ba3f2b13d728af94433e016d46239d@www\\.searchplusnow\\.com)|(Search_Plus_Now_312928a70ba3909e221b0524753bf126@www\\.weatherforecasttracker\\.com)|(Search_Plus_Now_7a64f4abfa7dba3075cabf9896c8fa19@www\\.searchplusnow\\.com)|(Search_Plus_Now_81c0506ff8d40fb8a7daa44222962215@www\\.searchplusnow\\.com)|(Search_Plus_Now_clone_sgREjdpaZx@www\\.searchplusnow\\.com)|(Search_Plus_Now_clone_SMpbwlnYxa@www\\.searchplusnow\\.com)|(Search_Plus_Now_fuKTpdNeOn@www\\.mapmytravel\\.co)|(Search_Plus_Now_RUxZwdNBtU@www\\.searchplusnow\\.com)|(Search_Plus_Now_YQIFAskSvi@www\\.weatherforecasttracker\\.com)|(Search_Plus_Pro_248f4aa071807a8d8f35bf57aef7b217@www\\.mapmytravel\\.co)|(Search_Plus_Pro_c5202d6e9fff0fb53512d681772f0244@www\\.searchpluspro\\.com)|(Search_Plus_Pro_cBmYtdkkFb@www\\.searchpluspro\\.com)|(Search_Plus_Pro_clone_egAEtDTMkX@www\\.searchpluspro\\.com)|(Search_Plus_Pro_clone_KRXJEhDHND@www\\.searchpluspro\\.com)|(Search_Plus_Pro_clone_odzZVUScjD@www\\.searchpluspro\\.com)|(Search_Plus_Pro_clone_SpGuCbnjPE@www\\.searchpluspro\\.com)|(Search_Plus_Pro_d67fb2263b88d9d41bae10a6e2ae855b@www\\.searchpluspro\\.com)|(Search_Plus_Pro_f7d126d7141628c1b739c58997b082b2@www\\.searchpluspro\\.com)|(Search_Plus_Pro_f889c071fa2a90062f8eeb4e7fd56db6@disable\\.searchpluspro\\.com)|(Search_Plus_Pro_fab7d78fa6444068be71b39db91e15ff@www\\.searchpluspro\\.com)|(Search_Privacy_clone_ozOdXpYKTM@www\\.search-privacy\\.live)|(Search_Privacy_clone_UDbsERGbgS@www\\.privacysearch\\.news)|(Search_Privacy_dIeFDdYUHg@www\\.searchprivacy\\.xyz)|(Search_Privacy_dKaGZWBFIM@www\\.searchprivacy\\.today)|(Search_Privacy_jpagAkMKvy@www\\.search-privacy\\.today)|(Search_Privacy_llZnkTGcOa@www\\.searchprivacy\\.today)|(Search_Privacy_naGfXaprzJ@info\\.searchprivacy\\.co)|(Search_Privacy_PQZCFxQkZX@www\\.privacysearch\\.news)|(Search_Privacy_qUxDJagEVN@www\\.searchprivacy\\.live)|(Search_Privacy_uVBxmwGLSk@www\\.privacy-search\\.works)|(Search_Privacy_wZVkQUHrHw@www\\.privacysearch\\.live)|(Search_Privacy_ZpneZaXeZp@www\\.search-privacy\\.live)|(Search_Privacy_ZvcIJuofJd@www\\.privacy-search\\.org)|(Search_Recipe_Pro_c299176cc8e5b03509bc091d92718516@www\\.searchrecipepro\\.com)|(search_Recipe_Pro_hZSnuXpHlI@www\\.searchrecipepro\\.com)|(Search_Secure_5fe09050cfe3944c0782c53e6aead42f@www\\.searchsecure\\.co)|(Search_Secure_5fe09050cfe3944c0782c53e6aead42fhsadghs@www\\.searchsecure\\.co)|(Search_Secure_clone_haBhKCwJbD_34@www\\.searchsecurepro\\.co)|(Search_Secure_clone_haBhKCwJbD1@www\\.searchsecurepro\\.co)|(Search_Secure_PUhUZXSDqx@www\\.searchsecure\\.co)|(Search_Select_804ce00595966fa5ced4efb6e0919d6f@www\\.searchselect\\.co)|(Search_Select_FQCSJqYZdP@www\\.searchselect\\.co)|(Search_Voyager_91c3275d156ab7272e24590b4f7f49d6@www\\.searchvoyager\\.co)|(Search_Voyager_PgzBPOqQhh@www\\.searchvoyager\\.co)|(search-movie\\.net_cURRAPTBgN@www\\.search-movie\\.net)|(search-movie\\.online_PqiotXlNOM@www\\.search-movie\\.online)|(search-movie\\.today_jpmWHncsRI@www\\.search-movie\\.today)|(Search-Privacy\\.biz_ZPdXCSGFgO@www\\.search-privacy\\.biz)|(Search-Privacy\\.club_CtlbxhsuVt@info\\.search-privacy\\.club)|(Search-Privacy\\.desi_AdRXpDarGi@info\\.search-privacy\\.desi)|(Search-Privacy\\.in\\.net_WibIleNEHx@info\\.search-privacy\\.in\\.net)|(Search-Privacy\\.info_rsNLqucdiG@info\\.search-privacy\\.info)|(Search-Privacy\\.link_wDxGmBgqcl@www\\.search-privacy\\.link)|(Search-Privacy\\.me_AvAriQFEhU@www\\.search-privacy\\.me)|(Search-Privacy\\.net_nWVLWwvLtN@www\\.search-privacy\\.net)|(Search-Privacy\\.online_cYKHeBuuMA@www\\.search-privacy\\.online)|(Search-Privacy\\.org_HWNXCRCnGt@info\\.search-privacy\\.org)|(Search-Privacy\\.site_qacnidOLmc@www\\.search-privacy\\.site)|(Search-Privacy\\.space_FjfWuiGHqH@info\\.search-privacy\\.space)|(Search-Privacy\\.store_xyaGgMqtWA@www\\.search-privacy\\.store)|(Search-Privacy\\.website_smicMDEmxB@www\\.search-privacy\\.website)|(Search-Privacy\\.xyz_gBlCbCGBMh@info\\.search-privacy\\.xyz))$/","prefs":[],"schema":1576758508310,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4f75a73b-1541-4d50-b7c7-4d3524619899","last_modified":1576771657059},{"guid":"/^((Search-Tab\\.net_qpBMgxRRKX@www\\.search-tab\\.net)|(searchmovie\\.today_rRBhPdnLIB@www\\.searchmovie\\.today)|(SearchPrivacy\\.Biz_TQxQMmZjax@info\\.searchprivacy\\.biz)|(SearchPrivacy\\.club_sbgzeaMJld@info\\.searchprivacy\\.club)|(SearchPrivacy\\.company_lbwegvHahG@www\\.searchprivacy\\.company)|(SearchPrivacy\\.in\\.net_ozDwuJlbCG@info\\.searchprivacy\\.in\\.net)|(SearchPrivacy\\.Info_zDsfyaIpyx@info\\.searchprivacy\\.info)|(SearchPrivacy\\.link_MEIDSFxuIf@www\\.searchprivacy\\.link)|(SearchPrivacy\\.me_SHWxbNO@info\\.searchprivacy\\.me)|(SearchPrivacy\\.one_JRipaiPyZz@www\\.searchprivacy\\.one)|(SearchPrivacy\\.space_AJTsgDwydV@info\\.searchprivacy\\.space)|(SearchPrivacy\\.store_NqrJweiCoL@www\\.searchprivacy\\.store)|(SearchPrivacy\\.website_EYeCzNtENe@www\\.searchprivacy\\.website)|(searchprivacy@searchprivacy\\.co)|(searchprivacyco@info\\.search-privacy\\.co)|(searchprivacydemo@searchprivacy\\.co)|(SearchSafe_cmZnrUyIXL@www\\.searchsafe\\.site)|(SearchSafe\\.online_bTqWKNIadp@www\\.searchsafe\\.online)|(SearchSafe\\.website_NFNXBQxRPA@www\\.searchsafe\\.website)|(searchsafee_VRAYffGolz@staging\\.findmaps\\.co)|(SearchTab\\.co_bEVNcWEgQN@www\\.searchtab\\.co)|(SearchTab\\.online_gZFeDEkoQl@www\\.searchtab\\.online)|(Severe_Weather_Check_51c60f3de3995f14f71373a70593618c@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_bcb8c4ad7063c40e0e5b2d0f64ba11a5@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_clone_joZdMWExSs@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_clone_VlvXXiHGHD@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_clone_xBNchBtncq@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_muRAWnsLSV@www\\.severeweathercheck\\.com)|(Single_Login_pHoBMgvLtK@single\\.login\\.com)|(Smart_-_Search_cQYvhxQOuG@www\\.EasyOnlineRecipe\\.net)|(SMART_-_SEARCH_hYubbcgBlB@www\\.netspeedcalculator\\.net)|(Smart_File_Converter_clone_BVgFKwVsaS@www\\.smartfileconverter\\.com)|(Smart_File_Converter_IasnkilxwD@www\\.smartfileconverter\\.com)|(Smart_Package_Tracker_06309abe3838d3a65fcbc43e2958851e@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_1e9ff4a4ee10df2fb289180d5bb635bb@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_705864a844f3d8d84a5aecba1f675809@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_9ef0b4fcd24ee214476e73afb6adbb2e@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_bfc6ce01ede9446711a752c034df59c4@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_KVsdeebRuB@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_OvvQZsPtpR@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_SRguaqnzXn@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_XRHzsWuwOn@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_yPTsguhReR@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_ZxioLKlnOD@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_db3d13974ca0682b514ad40e0f1fc682@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_jqLcWhCacs@www\\.smartpackagetracker\\.com)|(Smart_Search_05fc1caf5755ccc74a092042913cbbda@www\\.finddirections\\.co)|(Smart_Search_10751eb8462a19515e0f9f1525333d1d@www\\.game-quest\\.co)|(Smart_Search_118237f18afcc2ce76539a9d1e015bc2@www\\.dailygame\\.online)|(Smart_Search_13d2b5842a0358c117dd87411a84db0d@www\\.convertfilesonline\\.co)|(Smart_Search_2160f8e9f48a63f3d9d7a019b9a5c53d@www\\.finddirections\\.co)|(Smart_Search_2834376aee173a89462511cf3ae21633@www\\.dailyrecipesearch\\.net)|(Smart_Search_287a4b04b4dca219a02375ca2f6a4985@www\\.finddailycoupons\\.com)|(Smart_Search_3f36608d872e4e46edd8b4e57902e6bd@www\\.dailyrecipesearch\\.net)|(Smart_Search_5cad449f0283b0b10b9cd78472de5c54@www\\.finddirections\\.co)|(Smart_Search_69eb8884d7d2e0aabdad154644e38401@www\\.convertmyfile\\.co)|(Smart_Search_6a0b26a582308b0dd9ae82634ccfe6f7@www\\.localweathertoday\\.net)|(Smart_Search_77710b6943d36049c1b72d9035a63379@www\\.localweathertoday\\.net)|(Smart_Search_7f90cdefd25d69c792d02cec7763b41d@www\\.finddirections\\.co)|(Smart_Search_814229d05c1e81d4ce1e73a3ca7c3eaa@www\\.smartsearchnow\\.co)|(Smart_Search_94fb06cfccd5d4112f555fb00a1b38ec@www\\.finddirections\\.co)|(Smart_Search_a1e27539ac89c70a170688ee375c5426@www\\.finddailycoupons\\.com)|(Smart_Search_a98fb26ee015d18ad91a68c7124e1f30@www\\.get-news\\.co)|(Smart_Search_abeJBrRXlb@www\\.smart-search\\.one))$/","prefs":[],"schema":1576758534450,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"24adcec0-6f62-41bd-9e13-97895838bf64","last_modified":1576771657055},{"guid":"/^((Smart_Search_aKLddQIYMY@www\\.gamesdaily\\.online)|(Smart_Search_aQBxkbfpqq@www\\.finddirections\\.co)|(Smart_Search_aStviFIoor@www\\.finddirections\\.co)|(Smart_Search_aTGazruEUE@www\\.search-smart\\.co)|(Smart_Search_ayroufrtQb@www\\.finddirections\\.co)|(Smart_Search_b08c081d9f06123fb6172679fdf4fcb6@www\\.finddirections\\.co)|(Smart_Search_b859bcf9fb977dc2076199076b2f9081@www\\.convertmyfile\\.co)|(Smart_Search_bbgycNKlXh@www\\.dailyjobssearch\\.net)|(Smart_Search_bdDgpqbSTU@www\\.smartsearchnow\\.co)|(Smart_Search_bnnlTJEfCZ@www\\.search-smart\\.live)|(Smart_Search_BWMiEUiCaH-my@www\\.findmaps\\.co)|(Smart_Search_BWMiEUiCaH@www\\.findmaps\\.co)|(Smart_Search_c14750a49aa2937ede499b641a6c4390@www\\.finddirections\\.co)|(Smart_Search_cb20a26ab1dc76cc9f793fb975be4b02@www\\.smartsearchnow\\.co)|(Smart_Search_cFSWRyjwef@www\\.smart-search\\.today)|(Smart_Search_chUMEQmsSU@www\\.finddirections\\.co)|(Smart_Search_CIWmtesCzJ@www\\.mycouponstore\\.co)|(Smart_Search_cKezTfCPJB@www\\.checkmaps\\.live)|(Smart_Search_cKnSYkYtgM@www\\.check-yourmail\\.co)|(Smart_Search_clone_bZjlXmDRQB@www\\.finddirections\\.co)|(Smart_Search_clone_duXXvsUEtZ@www\\.finddirections\\.co)|(Smart_Search_clone_EQDmJygWxO@www\\.searchsmart\\.online)|(Smart_Search_clone_ETXwzVYwpI@www\\.search-smart\\.work)|(Smart_Search_clone_HsJXCDiNNC@www\\.smartsearch\\.link)|(Smart_Search_clone_JxJqcLVLOv@www\\.finddirections\\.co)|(Smart_Search_clone_SoSaSQDKGZ@www\\.dailyrecipesearch\\.net)|(Smart_Search_CQbLIZDIOl@www\\.smartsearch\\.link)|(Smart_Search_CxIpAXIPVs@www\\.smart-search\\.co)|(Smart_Search_d0f38b4ff2f0e788c442249a857e4dde@www\\.finddirections\\.co)|(Smart_Search_d16ea913837e848252ad5d856d9c8b02@www\\.dailyjobssearch\\.net)|(Smart_Search_d8982f2dae25e7422cc1392ccf974d04@www\\.dailyrecipesearch\\.net)|(Smart_Search_da3cc67017bdcd720cbd7fc26f24d743@www\\.check-yourmail\\.co)|(Smart_Search_dcf5af05538a3c68edd4625c7f0d2dc4@www\\.finddailycoupons\\.com)|(Smart_Search_DLsAIStnQX@www\\.smartsearch\\.link)|(Smart_Search_dTBjWAGKlN@www\\.testnetspeed\\.co)|(Smart_Search_e34c59b523a7a1585da696e4576b101c@www\\.gamesdaily\\.online)|(Smart_Search_e6d57c56077122ca0bcef12a39e3f6a3@www\\.localweathertoday\\.net)|(Smart_Search_ea5e7bb722049dd11af40116816edee3@disable\\.convertmyfile\\.co)|(Smart_Search_EkAoOFUJwV@www\\.games-daily\\.co)|(Smart_Search_eMDQwPVVyj@www\\.search-smart\\.co)|(Smart_Search_f377b2bb34f42cbb572c36d9bfb3d9c3@www\\.finddirections\\.co)|(Smart_Search_fbd05acb7ab6331297e367f816ff0a20@www\\.testnetspeed\\.co)|(Smart_Search_FCphmgFrTz@www\\.finddailygames\\.co)|(Smart_Search_FMxybFLCfE@www\\.smart-search\\.today)|(Smart_Search_gGkCXJUDEH@www\\.game-quest\\.co)|(Smart_Search_HnEqPdzcek@www\\.search-smart\\.live)|(Smart_Search_IbBWPmuFLU@www\\.convertfilesonline\\.co)|(Smart_Search_JcpHMeulsq@www\\.dailyrecipesearch\\.net)|(Smart_Search_JJPKAMJWLv@www\\.finddailycoupons\\.com)|(Smart_Search_JTruqraRrz@www\\.localweathertoday\\.net)|(Smart_Search_JViAyYSxof@www\\.search-smart\\.today)|(Smart_Search_KjzSKpViVv@www\\.getmapfinder\\.com)|(Smart_Search_LBQKLuCjDu@www\\.search-smart\\.work)|(Smart_Search_LBUbgBMxrr@www\\.convertmyfile\\.co)|(Smart_Search_lKbvfFvWdq@www\\.finddirections\\.co)|(Smart_Search_LPxWJiUiWP@dailyrecipesearch\\.net)|(Smart_Search_lVYnIBRyYO@www\\.search-smart\\.today)|(Smart_Search_lzlfscclxO@www\\.smartsearch\\.news)|(Smart_Search_mmUSVHTgZN@www\\.searchsmart\\.website)|(Smart_Search_MYlsYAHChr@www\\.search-smart\\.one)|(Smart_Search_OYMxotguWV@www\\.thecoupon-store\\.co)|(Smart_Search_PncWXXrZyE@www\\.get-news\\.co)|(Smart_Search_PxUetfSxfK@www\\.finddirections\\.co)|(Smart_Search_qbdedBcsMV@www\\.mysmartsearch\\.online)|(Smart_Search_QFEtHYupEv@www\\.localweathertoday\\.net)|(Smart_Search_rmcVsyMvUV@www\\.finddailycoupons\\.com)|(Smart_Search_sfQjeIHqAg@www\\.onlinecouponfinder\\.net)|(Smart_Search_SLKIYTovfO@www\\.dailygame\\.online)|(Smart_Search_snYvsooWFZ@www\\.dailycoupons\\.store)|(Smart_Search_SRonsLzSpz@www\\.search-smart\\.link)|(Smart_Search_SUWIUWczzW@www\\.search-smart\\.club)|(Smart_Search_trFxvKvCFp@www\\.dailyrecipesearch\\.net)|(Smart_Search_tTrjAmWOoR@www\\.convertmyfile\\.co)|(Smart_Search_txfWPOCTvy@www\\.finddailycoupons\\.com)|(Smart_Search_UgGHEdLtFf@www\\.search-smart\\.one)|(Smart_Search_UXuBBPZiCD@www\\.search-smart\\.website)|(Smart_Search_VFsgkOxdvk@www\\.convertmyfile\\.co))$/","prefs":[],"schema":1576758569109,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"65197a67-44c8-440d-b22c-26d84b2d763e","last_modified":1576771657051},{"guid":"/^((Templates_Online_clone_UmejRGyzBe@www\\.gettemplatesonline\\.com)|(Templates_Online_clone_WiWqHXsGkm@www\\.gettemplatesonline\\.com)|(Templates_Online_xUPYerdIfL@www\\.gettemplatesonline\\.com)|(test_fhwkrCFoHO@test)|(test_searchprivacy@info\\.searchprivacy\\.info)|(TestFirefoxAddon_ahdBLDcQql@www\\.testfirefoxaddon\\.com)|(testsearchprivacy@info\\.searchprivacy\\.co)|(Text_From_Your_PC_9e43d427bd5cde52e50706cf2ce04da8@www\\.textfromyourpc\\.com)|(Text_From_Your_PC_cBapqdxFhR@www\\.textfromyourpc\\.com)|(The_Coupon_-_Store_ERhPcJTQll@thecoupon-store\\.co)|(The_Coupon_King_1209d556e43b7c529e282d8b8842da76@www\\.thecouponking\\.co)|(The_Coupon_King_lgTjuAddLR@www\\.thecouponking\\.co)|(The_Coupon_King_UwqzosFLgL@www\\.thecouponking\\.com)|(The_Coupon_Store_FuajgfDoOD@www\\.thecouponstore\\.co)|(The_Coupon_Store_lPVGxmIRUf@www\\.thecouponstore\\.co)|(The_Coupon_Store_Test_jkAVapBJTo@www\\.thecouponstore\\.co\\.test)|(The_Coupon_Trail_bdc89c2aeb9eb486945d9f9d80bdbb02@www\\.thecoupontrail\\.com)|(The_Coupon_Trail_MMnMCLSPWo@www\\.thecoupontrail\\.com)|(The_Coupon_Trial_IteRooFtcL@www\\.thecoupontrial\\.com)|(The_Coupons_Daily_efc9df81f19dc213cb2a20067afa4ccb@www\\.thecouponsdaily\\.com)|(The_Coupons_Daily_NAEBGGQbOZ@www\\.thecouponsdaily\\.com)|(The_Coupons_King_cb3ed44aa8013a310be07e3d3fcc4dc2@www\\.thecouponsking\\.co)|(The_Currency_Switch_987755b6cd2466fcb08f71503c38cbfa@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_c80da7ec7cd15c168fc419b3d69aa602@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_clone_e0f313620f09d4dfc50e3a362bac8a9a@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_clone_geyyIAUtgm@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_clone_JZMSasbVPc@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_QlvIbtxDLF@www\\.thecurrencyswitch\\.co)|(The_Movie_Quest_BPyzyFXOpw@www\\.themoviequest\\.today)|(The_Movie_Search_IgbQnCESAN@www\\.themoviesearch\\.co)|(The_Movie_Search_zFBfJgLeGc@www\\.themoviesearch\\.co)|(The_News_Prompter_e90ebcdb43eb03954526e4576d6c6b71@www\\.thenewsprompter\\.com)|(The_News_Prompter_mbjJOGhbsK@www\\.thenewsprompter\\.com)|(The_Package_Track_9e0db37d4fc02628a9996d9be9ee7ad6@www\\.thepackagetrack\\.com)|(The_Quiz_Tab_xWbNAmFREz@www\\.thequiztab\\.com)|(The_Search_Easy_44e7c2c276e66b66d8bfb874777d4a2e@www\\.thesearcheasy\\.com)|(The_Search_Easy_XObNZOoESy@www\\.thesearcheasy\\.com)|(The_Search_Plus_37976642e8a885a46631002f0051ff23@www\\.thesearch-plus\\.co)|(The_Search_Plus_UawsDpTchY@www\\.thesearch-plus\\.co)|(thecouponstore@www\\.thecoupon-store\\.co)|(TheMovie-Hub\\.net_YezkChdTjo@www\\.themovie-hub\\.net)|(TheMovie-Portal_tPUcBCgXvk_1@www\\.themovie-portal\\.com)|(TheMovie-Portal_tPUcBCgXvk@www\\.themovie-portal\\.com)|(TheMovie-Quest\\.com_wlPrmnAQDs@www\\.themovie-quest\\.com)|(TheMovieQuest\\.co_cORgvNNjpL@www\\.themoviequest\\.co)|(TheMovieQuest\\.co_fQQHMPPCrc@www\\.themoviequest\\.co)|(themoviesearch\\.today_NaQhVgVlwL@www\\.themoviesearch\\.today)|(This_is_my_extension_qZkKGOuZcR@www\\.exampleAMO\\.com)|(This_is_New_AMO_dyIGZrXnWN@www\\.kite\\.com)|(This_is_New_AMO_QVeIjjGbol@www\\.kite\\.com)|(Trace_Packages_f406b9f80935c80df1166017cdb4d6f1@www\\.tracepackages\\.com)|(Track_Daily_News_1eaf6dc15b67e558badb4d0cfe763913@www\\.trackdailynews\\.com)|(Track_Daily_News_6e84f45f079de0ffcc94b2d968db9bee@www\\.trackdailynews\\.com)|(Track_Daily_News_a339167d304bfa5f599a249dda7ce993@www\\.trackdailynews\\.com)|(Track_Daily_News_EIMlViVmYz@www\\.trackdailynews\\.com)|(Track_Daily_News_sCvLoGjBau@www\\.trackdailynews\\.com)|(Track_Flight_Pro_7b52baadaefaac0bc71eaa5d3ffdd62c@www\\.trackflightpro\\.com)|(Track_Flight_Pro_c7f7b664812211123e6c54706eb66c3e@www\\.trackflightpro\\.com)|(Track_Flight_Pro_clone_hNojYqaWwF@www\\.trackflightpro\\.com)|(Track_Flight_Pro_eZAWVNMAAT@www\\.trackflightpro\\.com)|(Track_Package_Pro_clone_xayswwXtnt@www\\.trackpackagepro\\.com)|(Track_Package_Pro_clone_xBtZVauyZo@www\\.trackpackagepro\\.com)|(Track_Package_Pro_KvcoWaXXaa@www\\.trackpackagepro\\.com)|(Track_Package_Quick_525020a307e84998fc7ad8a634296e1d@www\\.trackpackagequick\\.com)|(Track_Package_Quick_clone_SjXacYcSKg@www\\.trackpackagequick\\.com)|(Track_Package_Quick_clone_zTowhYQtBK@www\\.trackpackagequick\\.com)|(Track_Package_Quick_lFiXdhlnGK@www\\.trackpackagequick\\.com)|(trackthatpackagecom@www\\.trackthatpackage\\.com)|(trailertab@www\\.trailertab\\.co))$/","prefs":[],"schema":1576758629163,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5cd48455-378c-4e67-a37d-8c39d497b4af","last_modified":1576771657042},{"guid":"/^((Translate_cgjqtumrjO@app\\.translate\\.com)|(Travel_Deals_Center_clone_GJNQLATOqW@www\\.traveldealscenter\\.co)|(Travel_Deals_Center_rqctZxkUaz@www\\.traveldealscenter\\.co)|(Travel_Directions_clone_FfMthspRaM@www\\.traveldirections\\.co)|(Travel_Directions_clone_ourIqJKEoa@www\\.traveldirections\\.co)|(Travel_Directions_mvJHkLHMMo@www\\.traveldirections\\.co)|(Tv_Shows_Online_4331a381f3f1b8d9f9f0b56793be73be@www\\.tvshowsonline\\.co)|(Tv_Shows_Online_MpTzgCmWDM@www\\.tvshowsonline\\.co)|(TV_Streaming_Plus_ARhtOdhYyz@www\\.tvstreamingplus\\.co)|(tyghn_EbxtKCSoQf@ghn)|(Universal_Package_Tracker_vEmOcVlKPs@www\\.universalpackagetrackern\\.online)|(Weather_Alert_Pro_BodPvrEWvi@www\\.weatheralertpro\\.co)|(Weather_Alert_Pro_clone_sTGOfwOqRV@www\\.weatheralertpro\\.co)|(Weather_Alert_Pro_eAvhNglZrt@www\\.weatheralertpro\\.com)|(Weather_Center_App_06cc2a6dd45345b134670c50b38c8692@www\\.weathercenterapp\\.com)|(Weather_Center_App_edIZBMRKqw@www\\.weathercenterapp\\.com)|(Weather_Center_App_ef684143ed5bb6671446fa504a5feec8@www\\.weathercenterapp\\.com)|(Weather_Center_App_f860fbbefafc691d55516dbf9ff9de42@www\\.weathercenterapp\\.com)|(Weather_Center_App_FCsxbRlcmB@www\\.weathercenterapp\\.com)|(Weather_Center_App_rEbQRyobNS@www\\.weathercenterapp\\.com)|(Weather_Coach_aRmHcdLWxv@www\\.weather-coach\\.com)|(Weather_Coach_cnhVSyfNQb@www\\.weather-coach\\.com)|(Weather_Coach_SdaRyeWHza@www\\.weather-coach\\.com)|(Weather_Details_a74cceec1f4c6974ce48a55da22c4fc8@www\\.weather-details\\.co)|(Weather_Details_clone_WmbTEchnZv@www\\.weather-details\\.today)|(Weather_Details_DBDwBdsiUV@www\\.weather-details\\.online)|(Weather_Details_LZKpPYrFpw@www\\.weather-details\\.today)|(Weather_Details_UMhKKuOmLm@www\\.weather-details)|(Weather_Details_xrNgYMjMud@www\\.weather-details\\.today)|(Weather_Forecast_0c98741392250106567fdcdf92e662ed@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_22873441e62b17d83e57bee8dae28096@disable\\.checkweathernow\\.co)|(Weather_Forecast_26bbf7afaa8ca321d3eb1793eab261eb@www\\.checkweathernow\\.co)|(Weather_Forecast_34a39ecaa08283313fa326a45884233b@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_5432f72204437596f302a717de4410ab@www\\.localweathertoday\\.net)|(Weather_Forecast_5c6a315e6da8023a47a4e247bcd60544@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_5d13ac5f68d80a584ad913b02540fae5@www\\.checkweather\\.today)|(Weather_Forecast_647cf952e5329d490351c5b250e81e54@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_6f6484fab931bf3f3fcf75dfa65adc37@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_7462a90b29dc5f13bb4628cce7d2c6dc@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_a4fe2e9e47d66eebd6220e13d10434ef@www\\.checkweathernow\\.co)|(Weather_Forecast_BjIrtPRHri@www\\.weatherforecasttracker\\.com)|(Weather_Forecast_Buddy_hqZFZdAdSe@www\\.weatherforecastbuddy\\.com)|(Weather_Forecast_c27096e498d3541e341f2597fa7124b0@www\\.weatherforecasttracker\\.com)|(Weather_Forecast_c6509e49a9a27bdab9facfb442488a79@www\\.localweathertoday\\.net)|(Weather_Forecast_ca28589b2ca67136318e4bfdf954002d@www\\.checkweathertoday\\.net)|(Weather_Forecast_cbf70b1126d7690bf9180b2e6c43e8f6@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_ChxOzHZcLa@www\\.localweathertoday\\.net)|(Weather_Forecast_clone_60d8346940b46a116579ec1ea3906d5d@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_chFFSZCgvz@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_clone_94a823ffc8bedf3bd1e6ab4465826581@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_clone_clone_apzzlMbkyB@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_clone_clone_f2e4cad9766f8cde8ffbdd484efbdd2b@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_clone_yQjWeYXXXI@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_HErKKKDyFS@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_HOrAZgjBCz@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_jMGHMuyVVi@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_KYlMwumWQY@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_kyUmeEeefY@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_pDcEnQJDXJ@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_piPIkUDQPc@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_QoJcNyLaQt@www\\.weatherforecasttracker\\.com))$/","prefs":[],"schema":1576758680309,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a083664b-0301-45cd-a2ee-0c690be250b6","last_modified":1576771657038},{"guid":"/^((Weather_Forecast_clone_TSGzGLieya@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_UBimgpjhsm@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_XcnVeRvMca@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_YQnByPToHy@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_zkFObDWDhS@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_Daily_CTzpOZENfa@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_e3838c6031faf63c6209533e71b456c0@www\\.weatherforecastdaily\\.disabled\\.com)|(Weather_Forecast_EnkDNfGxAS@www\\.checkweathernow\\.co)|(Weather_Forecast_epwQJrNJwH@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_eWEHJWtQzM@www\\.checkweathertoday\\.net)|(Weather_Forecast_eWFHhLxmdi@www\\.checkweathernow\\.co)|(Weather_Forecast_f5d79bda8e7d666123f8cff0f49720ab@www\\.localweathertoday\\.net)|(Weather_Forecast_FbozBLKAnT@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_fc107df349d96479678eb88a9d2f58b3@www\\.weatherforecasttracker\\.com)|(Weather_Forecast_KlMFWMEnxo@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_KNdWdwrVBg@www\\.weather-forecast\\.link)|(Weather_Forecast_lESFprnxRC@www\\.checkweathernow\\.co)|(Weather_Forecast_nsdhLSCwEt@www\\.weather-forecast\\.news)|(Weather_Forecast_OMezCgBGlR@www\\.weather-forecast\\.link)|(Weather_Forecast_Plus_81c2ce246488019a54fed798354fbb85@www\\.weatherforecastplus\\.com)|(Weather_Forecast_Plus_WVxlZhsVCn@www\\.weatherforecastplus\\.com)|(Weather_Forecast_QqFyFxILHq@www\\.checkweather\\.today)|(Weather_Forecast_rUPfzmWQNa@www\\.localweathertoday\\.net)|(Weather_Forecast_Search_4f3974a0460bd8947f25b61879196ae6@www\\.weatherforecastsearch\\.com)|(Weather_Forecast_Search_SPAKKzWPua@www\\.weatherforecastsearch\\.com)|(Weather_Forecast_SjMIOdqezy@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_Tab_d586ce62eebca7b5ccd054f645ab3278@www\\.weatherforecasttab\\.com)|(Weather_Forecast_Tab_LHutnjYcaD@www\\.weatherforecasttab\\.com)|(Weather_Forecast_UZnBodXSQY@www\\.localweathertoday\\.net)|(Weather_Forecast_V2_c8e3c1f489201dcee4f10ed13b88423b@www\\.weatherforecasttracker1\\.com)|(Weather_Info_AdPTHnolyR@www\\.weatherinfo\\.live)|(Weather_Info_clone_IylhdngkdZ@www\\.weatherinfo\\.live)|(Weather_Info_clone_LAyJxkrWYr@www\\.weatherinfo\\.live)|(Weather_Info_mYTEbKRsJk@www\\.weatherinfo\\.live)|(Weather_Info_rBUleVUgYg@www\\.weatherinfo\\.today)|(Weather_Info_ZurIhFqkfO@www\\.weatherinfo\\.live)|(Weather_Online_Now_clone_gXBxUraWkz@www\\.weatheronlinenow\\.com)|(Weather_Online_Now_clone_VEajkSqfLm@www\\.weatheronlinenow\\.com)|(Weather_Online_Now_LxMeLWImMw@www\\.weatheronlinenow\\.com)|(Weather_Report_69d519795ecb2edb106cf07b8e5fcbae@www\\.weatherreportlive\\.co)|(Weather_Report_JHDIwuETLZ@www\\.weather-report\\.live)|(Weather_Report_PdxgfapiBL@www\\.weatherreportlive\\.co)|(Weather_Report_WKPqFTsXUk@www\\.weather-report\\.live)|(Weather_Reporter_98959e99f2103eef2d02f3d351ba89b9@www\\.weatherreporter\\.co)|(Weather_Reports_BjGuRgCpLB@www\\.weather-reportsnow\\.com)|(Weather_Reports_c982e1b51cd8bc347ab328410329fbb6@www\\.weatherreports\\.live)|(Weather_Reports_clone_fRjlGYJSnk@www\\.weatherreports\\.live)|(Weather_Reports_clone_NMTTAUMqtY@www\\.dailyweatherreports\\.co)|(Weather_Reports_EQVqqGZdlM@www\\.weather-report\\.link)|(Weather_Reports_HlXmMSuFKX@www\\.weatherreports\\.live)|(Weather_Reports_KDxyqUBBwO@www\\.dailyweatherreports\\.co)|(Weather_Reports_UyzmbxlFVx@www\\.weather-reports\\.today)|(Weather_Reports_xaeygHwNhf@www\\.weatherreports\\.live)|(Weather_Reports_zDpccdTchc@www\\.weatherreports\\.today)|(Weather_Reports_zKYmoRPwNT@www\\.weatherreports\\.live)|(Weather_Tab_Pro_clone_aTBTPSAEUX@www\\.weathertabpro\\.com)|(Weather_Updates_TGBOowTNwY@www\\.weather-updates\\.co)|(Weather-Bee_1b435f4656c8c4f6df6b455cc302cf9b@www\\.weather-bee\\.co)|(Weather-Bee_cbff90268cbc8e1fd65336342cfcf056@www\\.weather-bee\\.co)|(Weather-Bee_deb8c4f31d28d8ef924d8604c528f43b@www\\.weather-bee\\.com)|(Weather-Bee_gFubKNACfC@www\\.weather-bee\\.co)|(Weather-Bee_HyIkcLzmEL@www\\.weather-bee\\.co)|(Weather-Bee_oUeUqEGckY@www\\.weather-bee\\.com)|(WeatherDetails_qGhRPwNzlD@www\\.weatherdetails\\.net)|(Web_Gamer_World_clone_bBqNIFWIiJ@www\\.webgamerworld\\.com)|(Web_Gamer_World_clone_vSvnetvjxh@www\\.webgamerworld\\.com)|(Web_Gamer_World_EnPQSoVMPy@www\\.webgamerworld\\.com))$/","prefs":[],"schema":1576758713481,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"86bffc98-7002-4c94-84b1-2036f19f1345","last_modified":1576771657033},{"guid":"/^((WheresMyPackage\\.co_04c5041d404a424ae04b3bdae470bf36@www\\.wheresmypackage\\.co)|(WheresMyPackage\\.co_nkiJdrfSTz@www\\.wheresmypackage\\.co)|(wheresmypackageco@www\\.wheresmypackage\\.co)|(Wonder_Wallpaper_7445d465b196ea5672cf5ddad5121e20@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_86c968090b99d54af67a65a1c6010dc8@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_clone_b3a8885c9af58cc53b837522fbeab5fa@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_clone_BdEgqQaNqI@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_clone_rujWfVzPPf@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_XONDNNciYs@www\\.wonderwallpaper\\.co)|(www\\.search-privacy\\.in\\.net_frtQaDOkLW@www\\.search-privacy\\.in\\.net)|(www\\.search-privacy\\.info_hyVgVlpUDh@www\\.search-privacy\\.info)|(Your_Mail_Tab_06f9e0cacb38332e7d67d6f6eb36fbf4@www\\.yourmailtab\\.com)|(Your_Mail_Tab_27811aa670d957af7c67c9b40421db33@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_FFlaTZQUzT@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_kckMtSXzhP@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_rZgtWWxFTE@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_tplYnwtbOB@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_UStpWwUYys@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_wQEiyJhcTK@www\\.yourmailtab\\.com)|(Your_Mail_Tab_sHxtuglHxJ@www\\.yourmailtab\\.com)|(Your_Map_Tab_caf5c90424b052d0a732d773f984284d@www\\.yourmaptab\\.com)|(Your_Map_Tab_MGrwdnTuFV@www\\.yourmaptab\\.com)|(Your_Maps_Finder_1cb2c0753a9f2089208e662ff7887eff@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_283a77e3a6a0c1cb4d803b12b7b3f38d@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_299d66c546dc1bf61c2f1ac4a823d848@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_2b2f2c9fdc74da065784a5537d7cbe8a@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_493f8ad05595d053fc466c6d712a0f5b@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_5fb3ba7aabc0df0482f721f2b8226c49@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_8ec3602a25914b2b98753c78f3ff0792@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_a4e12e88158bb14fe3f3b23935d1005b@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_clone_KCngJjrrAW@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_CVslhcZliG@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_dfeYIGYOsX@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_gSkAwghnnM@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_HbjLLgCqVI@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_IAQSXqZaut@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_IjXrmViPjV@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_jfCclXiWUZ@www\\.yourmapsfinder\\.com)|(Your_Maps_Guide_gJsxGXyDUk@www\\.yourmapsguide\\.com)|(Your_Recipes_Guide_6e2b67bec168f977b275d2cb8e38cb99@www\\.yourrecipesguide\\.com)|(Your_Recipes_Guide_pjXpEcLtqt@www\\.yourrecipesguide\\.com)|(Yum_Recipe_finder_5de2cc2f278f3bfc1a3715a70c8661f0@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_93a02159e31918ef11d89db653420167@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_clone_AoObYTQNIW@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_clone_c3c1e13d25490ca78859e8857319b432@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_clone_nFKjdQhPjD@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_clone_oIeIcINzWP@www\\.yumrecipefinder\\.com)|(Yum_Recipe_Finder_CqcblSJbqU@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_eb8981fe181afd4e02a57fd9c4b9e8f2@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_mgdDNujmFJ@www\\.yumrecipefinder\\.com))$/","prefs":[],"schema":1576758771928,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bfa84d62-24de-474e-bc35-a69b1f46f331","last_modified":1576771657029},{"guid":"/^((@FirefoxUpdate)|(@googledashboard)|(@smash_mov)|(@smash_tv)|(@smashdashboard)|(@smashmovs)|(@smashtvs)|(\\{0be01832-7cce-4457-b8ad-73b743914085\\})|(\\{0e1c683e-9f34-45f1-b365-a283befb471a\\})|(\\{0c72a72d-6b2e-4a0e-8a31-16581176052d\\})|(\\{0ccfc208-8441-4c27-b1cb-799accb04908\\})|(\\{0ede8d39-26f2-49c4-8014-dfc484f54a65\\})|(\\{1fc1f8e6-3575-4a6f-a4d1-c4ca1c36bd2a\\})|(\\{3a1d6607-e6a8-4012-9506-f14cd157c171\\})|(\\{03b3ac4d-59a3-4cc6-aa4d-9b39dd8b3196\\})|(\\{3bb6e889-ac7a-46ca-8eed-45ba4fbe75b5\\})|(\\{3c841114-da8c-44ea-8303-78264edfe60b\\})|(\\{3f3bcb3e-dd73-4410-b102-60a87fcb8323\\})|(\\{3f951165-fd85-42ae-96ef-6ff589a1fe72\\})|(\\{04c86cb3-5f52-4083-9e9a-e322dd02181a\\})|(\\{4d8b44ef-9b8b-4d82-b668-a49648d2749d\\})|(\\{4d25d2b4-6ae7-4a66-abc0-c3fca4cdddf6\\})|(\\{5c9a2eca-2126-4a84-82c0-efbf3d989371\\})|(\\{6ecb9f49-90f0-43a1-8f8a-e809ea4f732b\\})|(\\{6fb8289d-c6c8-4fe5-9a92-7dc6cbf35349\\})|(\\{7fea697d-327c-4d20-80d5-813a6fb26d86\\})|(\\{08a3e913-0bbc-42ba-96d7-3fa16aceccbf\\})|(\\{8b04086b-94a5-4161-910b-59e3e31e4364\\})|(\\{08c28c16-9fb6-4b32-9868-db37c1668f94\\})|(\\{8cd69708-2f5e-4282-a94f-3feebc4bce35\\})|(\\{8dc21e24-3883-4d01-b486-ef1d1106fa3d\\})|(\\{8f8cc21a-2097-488f-a213-f5786a2ccbbf\\})|(\\{9c8b93f7-3bf8-4762-b221-40c912268f96\\})|(\\{9ce66491-ef06-4da6-b602-98c2451f6395\\})|(\\{1e1acc1c-8daa-4c2e-ad05-5ef01ae65f1e\\})|(\\{10b0f607-1efa-4762-82a0-e0d9bbae4e48\\})|(\\{24f338d7-b539-49f1-b276-c9edc367a32d\\})|(\\{40c9030f-7a2f-4a58-9d0a-edccd8063218\\})|(\\{41f97b71-c7c6-40b8-83b1-a4dbff76f73d\\})|(\\{42f3034a-0c4a-4f68-a8fd-8a2440e3f011\\})|(\\{52d456e5-245a-4319-b8d2-c14fbc9755f0\\})|(\\{57ea692b-f9fe-42df-bf5e-af6953fba05a\\})|(\\{060c61d8-b48f-465d-aa4b-23325ea757c3\\})|(\\{65c1967c-6a5c-44dd-9637-0d4d8b4c339b\\})|(\\{65d40b64-b52a-46d8-b146-580ff91889cb\\})|(\\{75b7af0d-b4ed-4320-95c8-7ffd8dd2cb7c\\})|(\\{77fe9731-b683-4599-9b06-a5dcea63d432\\})|(\\{84b20d0c-9c87-4340-b4f8-1912df2ae70d\\})|(\\{92b9e511-ac81-4d47-9b8f-f92dc872447e\\})|(\\{95afafef-b580-4f66-a0fe-7f3e74be7507\\})|(\\{116a0754-20eb-4fe5-bd35-575867a0b89e\\})|(\\{118bf5f6-98b1-4543-b133-42fdaf3cbade\\})|(\\{248eacc4-195f-43b2-956c-b9ad1ae67529\\})|(\\{328f931d-83c1-4876-953c-ddc9f63fe3b4\\})|(\\{447fa5d3-1c27-4502-9e13-84452d833b89\\})|(\\{476a1fa9-bce8-4cb4-beff-cb31980cc521\\})|(\\{507a5b13-a8a3-4653-a4a7-9a03099acf48\\})|(\\{531bf931-a8c6-407b-a48f-8a53f43cd461\\})|(\\{544c7f83-ef54-4d17-aa91-274fa27514ef\\})|(\\{546ea388-2839-4215-af49-d7289514a7b1\\})|(\\{635cb424-0cd5-4446-afaf-6265c4b711b5\\})|(\\{654b21c7-6a70-446c-b9ac-8cac9592f4a9\\})|(\\{0668b0a7-7578-4fb3-a4bd-39344222daa3\\})|(\\{944ed336-d750-48f1-b0b5-3c516bfb551c\\})|(\\{1882a9ce-c0e3-4476-8185-f387fe269852\\})|(\\{5571a054-225d-4b65-97f7-3511936b3429\\})|(\\{5921be85-cddd-4aff-9b83-0b317db03fa3\\})|(\\{7082ba5c-f55e-4cd8-88d6-8bc479d3749e\\})|(\\{7322a4cb-641c-4ca2-9d83-8701a639e17a\\})|(\\{90741f13-ab72-443f-a558-167721f64883\\})|(\\{198627a5-4a7b-4857-b074-3040bc8effb8\\})|(\\{5e5b9f44-2416-4669-8362-42a0b3f97868\\})|(\\{824985b9-df2a-401c-9168-749960596007\\})|(\\{4853541f-c9d7-42c5-880f-fd460dbb5d5f\\})|(\\{6e6ff0fd-4ae4-49ae-ac0c-e2527e12359b\\})|(\\{90e8aa72-a7eb-4337-81d4-538b0b09c653\\})|(\\{02e3137a-96a4-433d-bfb2-0aa1cd4aed08\\})|(\\{9e734c09-fcb1-4e3f-acab-04d03625301c\\})|(\\{a6ad792c-69a8-4608-90f0-ff7c958ce508\\})|(\\{a512297e-4d3a-468c-bd1a-f77bd093f925\\})|(\\{a71b10ae-b044-4bf0-877e-c8aa9ad47b42\\})|(\\{a33358ad-a3fa-4ca1-9a49-612d99539263\\})|(\\{a7775382-4399-49bf-9287-11dbdff8f85f\\})|(\\{afa64d19-ddba-4bd5-9d2a-c0ba4b912173\\})|(\\{b4ab1a1d-e137-4c59-94d5-4f509358a81d\\})|(\\{b4ec2f8e-57fd-4607-bf4f-bc159ca87b26\\})|(\\{b06bfc96-c042-4b34-944c-8eb67f35630a\\})|(\\{b9dcdfb0-3420-4616-a4cb-d41b5192ba0c\\})|(\\{b8467ec4-ff65-45f4-b7c5-f58763bf9c94\\})|(\\{b48e4a17-0655-4e8e-a5e2-3040a3d87e55\\})|(\\{b6166509-5fe0-4efd-906e-1e412ff07a04\\})|(\\{bd1f666e-d473-4d13-bc4d-10dde895717e\\})|(\\{be572ad4-5dd7-4b6b-8204-5d655efaf3b3\\})|(\\{bf2a3e58-2536-44d4-b87f-62633256cf65\\})|(\\{bfc5ac5f-80bd-43e5-9acb-f6d447e0d2ce\\})|(\\{bfe3f6c1-c5fe-44af-93b3-576812cb6f1b\\})|(\\{c0b8009b-57dc-45bc-9239-74721640881d\\})|(\\{c1cf1f13-b257-4271-b922-4c57c6b6e047\\})|(\\{c3d61029-c52f-45df-8ec5-a654b228cd48\\})|(\\{c39e7c0b-79d5-4137-bef0-57cdf85c920f\\})|(\\{ce043eac-df8a-48d0-a739-ef7ed9bdf2b5\\})|(\\{cf62e95a-8ded-4c74-b3ac-f5c037880027\\})|(\\{cff02c70-7f07-4592-986f-7748a2abd9e1\\}))$/","prefs":[],"schema":1576756770976,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1476369","why":"These add-ons contain unwanted features and try to prevent the user from uninstalling themselves.","name":"Smash/Upater (malware) and similar"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c7d7515d-563f-459f-821c-27d4cf825dbf","last_modified":1576771657025},{"guid":"/^((search-unlisted2@mozilla\\.com)|(search-unlisted3@mozilla\\.com)|(search-unlisted4@mozilla\\.com)|(search-unlisted5@mozilla\\.com)|(search-unlisted11@mozilla\\.com)|(search-unlisted12@mozilla\\.com)|(search-unlisted55@mozilla\\.com)|(search-unlisted111@mozilla\\.com)|(search-unlisted400@mozilla\\.com)|(search-unlisted40110@mozilla\\.com)|(search-unlisted17441000051@mozilla\\.com)|(search-unlisted174410000522777441@mozilla\\.com)|(search-unlisted@mozilla\\.com)|({0a054930-63d7-46f4-937a-de80eab21da4})|({0b24cf69-02b8-407d-83db-e7af04fc1f3e})|({0c4df994-4f4a-4646-ae5d-8936be8a4188})|({0d50d8aa-d1ed-4930-b0a0-f3340d2f510e})|({0eb4672d-58a6-4230-b74c-50ca3716c4b0})|({0f9e469e-4245-43f8-a7a8-7e730f80d284})|({0fc9fcc7-2f47-4fd1-a811-6bd4d611294b})|({4479446e-40f3-48af-ab85-7e3bb4468227})|({1a927d5b-42e7-4407-828a-fdc441d0daae})|({1a760841-50c3-4143-9f7e-3c8f04e8f9d1})|({1bd8ba17-b3ed-412e-88db-35bc4d8771d7})|({1c7d6d9e-325a-4260-8213-82d51277fc31})|({01c9a4a4-06dd-426b-9500-2ea6fe841b88})|({1cab8ccf-deff-4743-925d-a47cbd0a6b56})|({1cb0652a-4645-412d-b7e8-0b9e9a83242f})|({1d6634ca-dd37-4a31-aad1-321f05aa2bb3})|({1d9997b2-f61e-429a-8591-999a6d62becc})|({1ed2af70-9e89-42db-a9e8-17ae594003ac})|({01f409a5-d617-47be-a574-d54325fe05d1})|({2a8bec00-0ab0-4b4d-bd3d-4f59eada8fd8})|({2aeb1f92-6ddc-49f5-b7b3-3872d7e019a9})|({2bb68b03-b528-4133-9fc4-4980fbb4e449})|({2cac0be1-10a2-4a0d-b8c5-787837ea5955})|({2d3c5a5a-8e6f-4762-8aff-b24953fe1cc9})|({2ee125f1-5a32-4f8e-b135-6e2a5a51f598})|({2f53e091-4b16-4b60-9cae-69d0c55b2e78})|({3a65e87c-7ffc-408d-927e-ebf1784efd6d})|({3a26e767-b781-4e21-aaf8-ac813d9edc9f})|({3c3ef2a3-0440-4e77-9e3c-1ca8d48f895c})|({3dca6517-0d75-42d2-b966-20467f82dca1})|({3f4191fa-8f16-47d2-9414-36bfc9e0c2bf})|({3f49e12b-bb58-4797-982c-4364030d96d9})|({4aa2f47a-0bae-4a47-8a1b-1b93313a2938})|({04abafc7-7a65-401d-97f3-af2853854373})|({4ad16913-e5cb-4292-974c-d557ef5ec5bb})|({4b1050c6-9139-4126-9331-30a836e75db9})|({4b1777ec-6fe4-4572-9a29-5af206e003bf})|({4beacbbb-1691-40e7-8c1e-4853ce2e2dee})|({4c140bc5-c2ad-41c3-a407-749473530904})|({4cbef3f0-4205-4165-8871-2844f9737602})|({4dac7c77-e117-4cae-a9f0-6bd89e9e26ab})|({04ed02dc-0cb0-40c2-8bc8-6f20843024b8})|({4f6b6aaf-c5a1-4fac-8228-ead4d359dc6d})|({4f8a15fb-45c2-4d3b-afb1-c0c8813a4a5a})|({5af74f5a-652b-4b83-a2a9-f3d21c3c0010})|({5b0f6d3c-10fd-414c-a135-dffd26d7de0f})|({5b421f02-e55e-4b63-b90e-aa0cfea01f53})|({5b620343-cd69-49b8-a7ba-f9d499ee5d3d})|({5c5cf69b-ed92-4429-8d26-ff3bb6c37269})|({5cf77367-b141-4ba4-ac2a-5b2ca3728e81})|({5da81d3d-5db1-432a-affc-4a2fe9a70749})|({5eac1066-90c3-4ba0-b361-e6315dcd6828})|({5ec4c837-59b9-496d-96e2-ff3fa74ca01f})|({5efd8c7a-ff37-41ac-a55c-af4170453fdf})|({5f4e63e4-351f-4a21-a8e5-e50dc72b5566})|({6a934ff5-e41d-43a2-baf5-2d215a869674})|({06a71249-ef35-4f61-b2c8-85c3c6ee5617})|({6ad26473-5822-4142-8881-0c56a8ebc8c0})|({6cee30bc-a27c-43ea-ac72-302862db62b2})|({6ed852d5-a72e-4f26-863f-f660e79a2ebb})|({6eee2d17-f932-4a43-a254-9e2223be8f32})|({6f13489d-b274-45b6-80fa-e9daa140e1a4})|({6fa41039-572b-44a4-acd4-01fdaebf608d})|({7ae85eef-49cf-440d-8d13-2bebf32f14cf})|({7b3c1e86-2599-4e1a-ad98-767ae38286c8})|({7b23c0de-aa3d-447f-9435-1e8eba216f09})|({7b71d75e-51f5-4a71-9207-7acb58827420})|({7c6bf09e-5526-4bce-9548-7458ec56cded})|({7ca54c8d-d515-4f2a-a21f-3d32951491a6})|({7d932012-b4dd-42cc-8a78-b15ca82d0e61})|({7d5e24a1-7bef-4d09-a952-b9519ec00d20})|({7eabad73-919d-4890-b737-8d409c719547})|({7eaf96aa-d4e7-41b0-9f12-775c2ac7f7c0})|({7f8bc48d-1c7c-41a0-8534-54adc079338f})|({7f84c4d8-bdf5-4110-a10d-fa2a6e80ef6a})|({8a6bda75-4668-4489-8869-a6f9ccbfeb84})|({8a0699a0-09c3-4cf1-b38d-fec25441650c})|({8ab8c1a2-70d4-41a8-bf78-0d0df77ac47f})|({8b4cb418-027e-4213-927a-868b33a88b4f})|({8fcfe2b3-598e-4861-a5d4-0d77993f984b})|({9a941038-82fa-4ae4-ba98-f2eb2d195345})|({9b8a3057-8bf4-4a9e-b94b-867e4e71a50c})|({9b8df895-fcdd-452a-8c46-da5be345b5bc})|({09c8fa16-4eec-4f78-b19d-9b24b1b57e1e})|({09cbfddf-5e55-4676-920d-5a16cb9e4cb5})|({9cf8d28f-f546-4871-ac4d-5faff8b5bde3})|({9d592fd5-e655-461a-9b28-9eba85d4c97f})|({9fc6e583-78a5-4a2b-8569-4297bb8b3300})|({014d98ce-dab9-4c1d-8643-166e75d7cb4d})|({18c64b09-4ccb-4c21-ba6f-ebd4a1efa034})|({21d83d85-a636-4b18-955d-376a6b19bd19})|({22ecf14b-ead6-4684-a498-7b2b839a4c97}))$/","prefs":[],"schema":1576757328395,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479009","why":"Malicious add-ons disguising as updates or useful add-ons, but violating data collection policies, user-control, no surprises and security.","name":"Firefox Update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cae5d906-0b1d-4d1c-b83f-f9727b8c4a29","last_modified":1576771657022},{"guid":"/^(({0f9e469e-4245-43f8-a7a8-7e730f80d284})|({117ca2f3-df4c-4e17-a5c5-b49077e9c731})|({11db147a-a1cb-43dd-9c05-0d11683483e1})|({1ed2af70-9e89-42db-a9e8-17ae594003ac})|({24ed6bdc-3085-413b-a62e-dc5dd30272f4})|({2aa19a7a-2a43-4e0d-a3dc-abb33fa7e2b6})|({3d6fbbb3-6c80-47bb-af20-56fcaebcb9ca})|({42f4c194-8929-42b9-a9a3-afa56dd0913b})|({46740fa0-896d-4f2e-a240-9478865c47c2})|({4718da68-a373-4a03-a77b-0f49b8bb40ee})|({4d41e0b8-bf7e-45ab-bd90-c426b420e3ee})|({50957a38-c15d-42da-94f5-325bc74a554c})|({5650fc63-a7c5-4627-8d0a-99b20dcbd94b})|({5c5c38ec-08bf-493a-9352-6ccf25d60c08})|({67ecb446-9ccd-4193-a27f-7bd1521bd03c})|({71f01ffe-226d-4634-9b21-968f5ce9f8f5})|({72f31855-2412-4998-a6ff-978f89bba0c3})|({7b3c1e86-2599-4e1a-ad98-767ae38286c8})|({7c37463c-001e-4f58-9e88-aaab2a624551})|({7de64f18-8e6b-4c41-9b05-d8872b418026})|({82dcf841-c7e1-4764-bb47-caa28909e447})|({872f20ea-196e-4d11-8835-1cc4c877b1b8})|({8efee317-546f-418d-82d3-60cc5187acf5})|({93deeba1-0126-43f7-a94d-4eecfce53b33})|({9cc12446-16da-4200-b284-d5fc18670825})|({9cd27996-6068-4597-8e97-bb63f783a224})|({9fdcedc7-ffde-44c3-94f6-4196b1e0d9fc})|({a191563e-ac30-4c5a-af3d-85bb9e9f9286})|({a4cb0430-c92e-44c6-9427-6a6629c4c5f6})|({a87f1b9b-8817-4bff-80fd-db96020c56c8})|({ae29a313-c6a9-48be-918d-1e4c67ba642f})|({b2cea58a-845d-4394-9b02-8a31cfbb4873})|({b420e2be-df31-4bea-83f4-103fe0aa558c})|({b77afcab-0971-4c50-9486-f6f54845a273})|({b868c6f4-5841-4c14-86ee-d60bbfd1cec1})|({b99ae7b1-aabb-4674-ba8f-14ed32d04e76})|({b9bb8009-3716-4d0c-bcb4-35f9874e931e})|({c53c4cbc-04a7-4771-9e97-c08c85871e1e})|({ce0d1384-b99b-478e-850a-fa6dfbe5a2d4})|({cf8e8789-e75d-4823-939f-c49a9ae7fba2})|({d0f67c53-42b5-4650-b343-d9664c04c838})|({dfa77d38-f67b-4c41-80d5-96470d804d09})|({e20c916e-12ea-445b-b6f6-a42ec801b9f8})|({e2a4966f-919d-4afc-a94f-5bd6e0606711})|({e7d03b09-24b3-4d99-8e1b-c510f5d13612})|({fa8141ba-fa56-414e-91c0-898135c74c9d})|({fc99b961-5878-46b4-b091-6d2f507bf44d})|(firedocs@mozilla\\.com)|(firetasks@mozilla\\.com)|(getta@mozilla\\.com)|(javideo@mozilla\\.com)|(javideo2@mozilla\\.com)|(javideos@mozilla\\.com)|(javideosz@mozilla\\.com)|(search_free@mozilla\\.com)|(search-unlisted@mozilla\\.com)|(search-unlisted101125511@mozilla\\.com)|(search-unlisted10155511@mozilla\\.com)|(search-unlisted1025525511@mozilla\\.com)|(search-unlisted1099120071@mozilla\\.com)|(search-unlisted1099125511@mozilla\\.com)|(search-unlisted109925511@mozilla\\.com)|(search-unlisted11@mozilla\\.com)|(search-unlisted111@mozilla\\.com)|(search-unlisted12@mozilla\\.com)|(search-unlisted14400770034@mozilla\\.com)|(search-unlisted144007741154@mozilla\\.com)|(search-unlisted144436110034@mozilla\\.com)|(search-unlisted14454@mozilla\\.com)|(search-unlisted1570124111@mozilla\\.com)|(search-unlisted1570254441111@mozilla\\.com)|(search-unlisted15721239034@mozilla\\.com)|(search-unlisted157441@mozilla\\.com)|(search-unlisted15757771@mozilla\\.com)|(search-unlisted1577122001@mozilla\\.com)|(search-unlisted15777441001@mozilla\\.com)|(search-unlisted15788120036001@mozilla\\.com)|(search-unlisted157881200361111@mozilla\\.com)|(search-unlisted1578899961111@mozilla\\.com)|(search-unlisted157999658@mozilla\\.com)|(search-unlisted158436561@mozilla\\.com)|(search-unlisted158440374111@mozilla\\.com)|(search-unlisted15874111@mozilla\\.com)|(search-unlisted1741395551@mozilla\\.com)|(search-unlisted17441000051@mozilla\\.com)|(search-unlisted174410000522777441@mozilla\\.com)|(search-unlisted1768fdgfdg@mozilla\\.com)|(search-unlisted180000411@mozilla\\.com)|(search-unlisted18000411@mozilla\\.com)|(search-unlisted1800411@mozilla\\.com)|(search-unlisted18011888@mozilla\\.com)|(search-unlisted1801668@mozilla\\.com)|(search-unlisted18033411@mozilla\\.com)|(search-unlisted180888@mozilla\\.com)|(search-unlisted181438@mozilla\\.com)|(search-unlisted18411@mozilla\\.com)|(search-unlisted18922544@mozilla\\.com)|(search-unlisted1955511@mozilla\\.com)|(search-unlisted2@mozilla\\.com)|(search-unlisted3@mozilla\\.com)|(search-unlisted4@mozilla\\.com)|(search-unlisted400@mozilla\\.com)|(search-unlisted40110@mozilla\\.com)|(search-unlisted5@mozilla\\.com)|(search-unlisted55@mozilla\\.com)|(search@mozilla\\.com)|(searchazsd@mozilla\\.com)|(smart246@mozilla\\.com)|(smarter1@mozilla\\.com)|(smarters1@mozilla\\.com)|(stream@mozilla\\.com)|(tahdith@mozilla\\.com))$/","prefs":[],"schema":1576611696962,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1480591","why":"These add-ons violate the no-surprises and user-control policy.","name":"Search engine hijacking malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cee5c2ab-1059-4b15-a78c-1203116552c4","last_modified":1576771657018},{"guid":"/^((application2@fr-metoun\\.com)|(application@br-annitop\\.com)|(application@br-atoleg\\.com)|(application@br-cholty\\.com)|(application@br-debozoiz\\.com)|(application@br-echite\\.com)|(application@br-estracep\\.com)|(application@br-exatrom\\.com)|(application@br-iginot\\.com)|(application@br-imastifi\\.com)|(application@br-isobiv\\.com)|(application@br-ludimaro\\.com)|(application@br-pintoula\\.com)|(application@br-proufta\\.com)|(application@br-qhirta\\.com)|(application@br-qibizar\\.com)|(application@br-qopletr\\.com)|(application@br-roblaprouf\\.com)|(application@br-rosalop\\.com)|(application@br-samalag\\.com)|(application@br-sopreni\\.com)|(application@br-stoumo\\.com)|(application@br-villonat\\.com)|(application@br-zoobre\\.com)|(application@de-barbuna\\.com)|(application@de-bicelou\\.com)|(application@de-blabuma\\.com)|(application@de-dalofir\\.com)|(application@de-elplic\\.com)|(application@de-erotah\\.com)|(application@de-ertuck\\.com)|(application@de-eurosty\\.com)|(application@de-ezigat\\.com)|(application@de-lorelam\\.com)|(application@de-losimt\\.com)|(application@de-luchil\\.com)|(application@de-miligap\\.com)|(application@de-open-dog\\.com)|(application@de-rydima\\.com)|(application@de-slapapi\\.com)|(application@de-soqano\\.com)|(application@de-treboola\\.com)|(application@de-vasurk\\.com)|(application@de-ygivas\\.com)|(application@es-biloufer\\.com)|(application@es-boulass\\.com)|(application@es-cemaseur\\.com)|(application@es-elixet\\.com)|(application@es-gestona\\.com)|(application@es-glicalol\\.com)|(application@es-griloup\\.com)|(application@es-iblep\\.com)|(application@es-iglere\\.com)|(application@es-jounyl\\.com)|(application@es-klepst\\.com)|(application@es-nofinaj\\.com)|(application@es-ofarnut\\.com)|(application@es-phistouquet\\.com)|(application@es-pronzal\\.com)|(application@es-roterf\\.com)|(application@es-taapas\\.com)|(application@es-tatoflex\\.com)|(application@fr-acomyl\\.com)|(application@fr-avortep\\.com)|(application@fr-blicac\\.com)|(application@fr-bloubil\\.com)|(application@fr-carazouco\\.com)|(application@fr-cichalou\\.com)|(application@fr-consimis\\.com)|(application@fr-cropam\\.com)|(application@fr-deplitg\\.com)|(application@fr-doadoto\\.com)|(application@fr-domeoco\\.com)|(application@fr-domlaji\\.com)|(application@fr-eferif\\.com)|(application@fr-eivlot\\.com)|(application@fr-eristrass\\.com)|(application@fr-ertike\\.com)|(application@fr-esiliq\\.com)|(application@fr-fedurol\\.com)|(application@fr-grilsta\\.com)|(application@fr-hyjouco\\.com)|(application@fr-intramys\\.com)|(application@fr-istrubil\\.com)|(application@fr-javelas\\.com)|(application@fr-jusftip\\.com)|(application@fr-lolaji\\.com)|(application@fr-macoulpa\\.com)|(application@fr-mareps\\.com)|(application@fr-metoun\\.com)|(application@fr-metyga\\.com)|(application@fr-mimaloy\\.com)|(application@fr-monstegou\\.com)|(application@fr-oplaff\\.com)|(application@fr-ortisul\\.com)|(application@fr-pastamicle\\.com)|(application@fr-petrlimado\\.com)|(application@fr-pinadolada\\.com)|(application@fr-raepdi\\.com)|(application@fr-soudamo\\.com)|(application@fr-stoumo\\.com)|(application@fr-stropemer\\.com)|(application@fr-tlapel\\.com)|(application@fr-tresdumil\\.com)|(application@fr-troglit\\.com)|(application@fr-troplip\\.com)|(application@fr-tropset\\.com)|(application@fr-vlouma)|(application@fr-yetras\\.com)|(application@fr-zorbil\\.com)|(application@fr-zoublet\\.com)|(application@it-bipoel\\.com)|(application@it-eneude\\.com)|(application@it-glucmu\\.com)|(application@it-greskof\\.com)|(application@it-gripoal\\.com)|(application@it-janomirg\\.com)|(application@it-lapretofe\\.com)|(application@it-oomatie\\.com)|(application@it-platoks\\.com)|(application@it-plopatic\\.com)|(application@it-riploi\\.com)|(application@it-sabuf\\.com)|(application@it-selbamo\\.com)|(application@it-sjilota\\.com)|(application@it-stoploco\\.com)|(application@it-teryom\\.com)|(application@it-tyhfepa\\.com)|(application@it-ujdilon\\.com)|(application@it-zunelrish\\.com)|(application@uk-ablapol\\.com)|(application@uk-blamap\\.com)|(application@uk-cepamoa\\.com)|(application@uk-cloakyz\\.com)|(application@uk-crisofil\\.com)|(application@uk-donasip\\.com)|(application@uk-fanibi\\.com)|(application@uk-intramys\\.com)|(application@uk-klastaf\\.com)|(application@uk-liloust\\.com)|(application@uk-logmati\\.com))$/","prefs":[],"schema":1576756704239,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1487627","why":"Add-ons whose main purpose is to track user browsing behavior.","name":"Abusive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"914ec360-d35e-4420-a88f-1bad3513f054","last_modified":1576771657015},{"guid":"/^((\\{0bf1c111-c256-4a17-891d-1bc69338162e\\})|(\\{0ffbc4b1-f269-4cff-9552-5f77337ebc1a\\})|(\\{1bbdc69d-55d3-4872-bd03-14eb05e7a7ad\\})|(\\{1ce00b82-ac47-43e6-a69c-f7dc9344168a\\})|(\\{2b01628b-0110-4965-972c-7a0b624fb99f\\})|(\\{3a84e0b0-3151-449e-b6e8-1062036afac6\\})|(\\{3bbcc16b-23f7-40a6-b88c-9ced9d009c93\\})|(\\{3ea48f4a-b585-44a7-aff5-faeb5e5b47d5\\})|(\\{7b161d2c-ee98-4321-a78a-433950672c8a\\})|(\\{8a8d97d8-b879-4024-8321-765e0f395b84\\})|(\\{9c0d6766-debe-4461-b14f-68ddfc13a78a\\})|(\\{014f9781-c104-41a4-a983-fc6aa4690664\\})|(\\{27ffdb27-0a34-4dea-a483-3b357bc6a5fe\\})|(\\{81ba256a-4f32-40df-86b5-e6b9861481e1\\})|(\\{338c7503-fb54-4b69-a84b-916f7452c7fa\\})|(\\{400e053f-55df-4e86-a91a-eae8d7b7bcd1\\})|(\\{617e0484-8346-44f2-851e-60ab89a919f9\\})|(\\{656a0095-d852-4dcc-a107-764df7ad0ec4\\})|(\\{754a330b-efbe-4016-8526-bf0f2e11e45e\\})|(\\{802ba900-013c-42f6-a11a-093c4bf35baa\\})|(\\{2771ce08-4898-4f58-89a5-e2b9d00bfab2\\})|(\\{3906b944-92f3-4d43-89dc-31ad6484a77c\\})|(\\{6516cdbc-9332-437f-89ac-b57470655542\\})|(\\{6847c507-1793-4be2-be86-4c2cc0b445bf\\})|(\\{9687db9b-410c-47f2-8c36-fde63c7c29e4\\})|(\\{0035237e-97ab-40eb-ba9d-c453fb6aa079\\})|(\\{20143127-e0bd-4396-aee9-52229cf9b5eb\\})|(\\{33254399-d5b2-4d84-b90b-9c4d4dc71112\\})|(\\{34621968-1952-4428-909d-df5b220efe74\\})|(\\{83769978-21cf-417c-b4a9-582b4161e395\\})|(\\{aa369db0-4232-47b8-bbbb-49ad31d49dce\\})|(\\{aff733de-d7d8-49c2-824a-7f2b2e282927\\})|(\\{c0b587fe-766b-446f-9aae-bc6edc9f6f4c\\})|(\\{c47a75b9-c6d2-4009-a245-c6dcedeea932\\})|(\\{c51bd197-28bd-442f-8537-dea5ae129047\\})|(\\{cac044a2-b93c-4f24-bf2f-b902741d29a8\\})|(\\{de17ce6f-389f-4368-9675-b9ed93133f17\\})|(\\{e2b105bc-1821-4838-bdf9-0fa4f6781b18\\})|(\\{e6c8bc7f-0133-418a-86ed-ba2c0a6925df\\})|(\\{f4acda5f-a75b-4b3b-8a73-8ca3df8d5f57\\})|(\\{f4fd18ee-8f6a-4708-8338-7e7981b73453\\})|(\\{f2320322-1fff-4998-bc28-4ad61621012a\\})|(\\{ff939f5e-a97c-4c14-b853-9c82519dbf73\\})|(@complete-youtube-downloader)|(@swsearchassist)|(@swsearchassist2)|(@youtube-download-helper-addon-1)|(@youtube-download-helper-addon-3)|(@ytd-support)|(@ytmp4-support)|(@ytu-support)|(18-plus-bypass@agebypass\\.org)|(18plus@sweetytweety\\.jp)|(addon@firefox-addon-s\\.com)|(ageverify@doubletrouble\\.net)|(auto-fill-dhruv\\.techapps@gmail\\.com)|(awesomeaddons@gmail\\.com)|(blndkmebkmenignoajhoemebccmmfjib@chrome-store-foxified--730948579)|(boomerang-for-gmailtm@chrome-store-foxified--1895216441)|(boomerang-for-gmailtm@chrome-store-foxified-1472004183)|(browsing_certificate@easycerts\\.in)|(certs-js@verify\\.org)|(clear-flash-cookies@tubedownload\\.org)|(dghpnfeglanbbjaggjegpbijhcbnfdno@chrome-store-foxified--1026618965)|(dghpnfeglanbbjaggjegpbijhcbnfdno@chrome-store-foxified--1382673267)|(dghpnfeglanbbjaggjegpbijhcbnfdno@chrome-store-foxified-3810896411)|(dhiaggccakkgdfcadnklkbljcgicpckn@chrome-store-foxified-1917762393)|(dhiaggccakkgdfcadnklkbljcgicpckn@chrome-store-foxified-2539369515)|(dhiaggccakkgdfcadnklkbljcgicpckn@chrome-store-foxified-3411285726)|(dhiaggccakkgdfcadnklkbljcgicpckn@chrome-store-foxified-3957753373)|(dhruv@gmail\\.com)|(easy\\.download@youtube\\.com)|(easy18plusverify@agehelper\\.com)|(EasyQR@johndoe)|(easytranslate@johndoehits)|(ecaieeiecbdhkcgknidmfelflleobbnp@chrome-store-foxified-2878848146)|(eurekasakamika@chrome-store-foxified-unsigned)|(faeeclonpikbempnbjbbajfjjajjgfio@chrome-store-foxified--1071037210)|(faeeclonpikbempnbjbbajfjjajjgfio@chrome-store-foxified-335403930)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified--546579415)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified--929033716)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified--1776201342)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-411918147)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-711293137)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-1406852911)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-1805495496)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-2344964585)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-2515600300)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-2947667317)|(generated-c5el8k8zv2b1gcncleefj9@chrome-store-foxified--1160265316)|(html5-video-everywhere@lejenome\\.me)|(iapifmceeokikomajpccajhjpacjmibe@chrome-store-foxified-6029610)|(info@ytdownloader\\.info))$/","prefs":[],"schema":1576756923769,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1525880","why":"Add-ons that include abusive or malicious remote code.","name":"Various abusive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"be96c9a1-0b01-468e-ac9b-761ba3587162","last_modified":1576771657011},{"guid":"/^((\\{7e4a75c1-dddc-4496-9963-1c6ac99cf226\\})|(\\{35af257d-14dd-4cd0-8ebd-2d30c2b30561\\})|(\\{d6362448-1e8f-47bf-9d2f-491648d18e3d\\})|(\\{80a42dcf-193e-43a2-b662-d6b14882403f\\})|(\\{044e39fc-333b-423c-8291-26078a780b02\\})|(\\{68b3c6ce-162f-4ece-9ffa-8279855a4228\\})|(\\{057b93a7-84e6-43ff-9686-d452435ed3c5\\})|(\\{1223cfa2-7aad-4a16-b98a-6bf63b346835\\})|(\\{9815ca8b-a77c-4e4d-beac-aad1c7021dcb\\})|(\\{e3f2795a-cefc-4f7f-9435-5f091b988d2f\\})|(\\{98fd0bd5-f486-4d81-9eb1-e89e9d56bfa2\\})|(\\{f96fafd2-5860-4bfa-9537-3f2ca9dd496e\\})|(\\{da93cdd9-6aca-410e-b2f2-e927da726559\\})|(\\{d97e0506-d330-4547-8a5c-093b8aa08d7a\\})|(\\{425ad6b3-72b8-43c0-be7c-2f6585fa0ec1\\})|(\\{0375f007-f5ba-46ec-86d2-c5da84576562\\})|(\\{e8915f55-6566-4872-97eb-d77fbdbf2fb3\\})|(\\{ebd3a0c4-bf9e-4dfa-b487-f77722055edb\\})|(\\{7cc62e47-ed20-45bc-8c92-bb57128e78d6\\})|(\\{b5a15631-6429-49bd-a670-e83ac41f93a9\\})|(\\{f263d545-3234-460f-b546-a8406a0a729d\\})|(\\{6468c148-9888-4243-8de5-cb6291cac82a\\})|(\\{da2281db-0036-46f6-8878-ff26e1cf6a2b\\})|(\\{63f579ba-eaf5-4e1a-a7c2-c5e889beaf9f\\})|(\\{84569fbb-d367-40ce-b24b-fd3b611283b8\\})|(\\{da2bc16f-b499-401b-8771-9d9f32d88f86\\})|(\\{1a275ad6-5dd3-47e9-a563-41a0bebdfd90\\})|(\\{e07ebf1e-5917-46a2-95d9-61d9b51f3797\\})|(\\{0d6791d2-ce0b-4f78-90e4-8e773703bd35\\})|(\\{502c7ef7-745c-4ea0-8066-a17cf1b74957\\})|(\\{c93f0aeb-ae9b-49d9-835b-c58a6b03aa46\\})|(\\{1f0bf2a4-aff5-42d3-8633-71e65f289250\\})|(\\{28766320-358e-42e3-a2c7-67ec77552424\\})|(\\{74d4fcda-c103-4fb7-810a-4596530c00a4\\})|(\\{7b3fd37a-a127-41a0-9e4d-59ccfa165e41\\})|(\\{787fa0b0-d5f1-4454-8b0c-72d191d6775f\\})|(\\{e2bae2ed-0368-48e7-8671-3bdcc5d7713f\\})|(\\{fee16fb4-830f-438a-a3d5-f7e911d23e02\\})|(\\{72113405-b4a5-46c3-a7c6-5353568b87bd\\})|(\\{5ede50a4-4151-4635-804f-a6f56115a0c6\\})|(\\{c11487a0-d104-4bc3-814b-474f8c29049c\\})|(\\{35690b6e-1979-4ea3-89aa-44a94dda2afa\\})|(\\{e9d698ef-bad4-4960-9df3-8c41605a6d7b\\})|(\\{1472b3c1-cae8-42c4-bbdf-e71134dccf08\\})|(\\{7a40b654-1232-4e76-81e7-d95260db25cd\\})|(\\{f54699c8-c82f-4d6e-a161-919bbe8410de\\})|(\\{dca6a5cd-0d24-442a-afd4-80572bb20c34\\})|(\\{b8d5d169-f076-4098-b671-a3cb8b410f56\\})|(\\{903e6561-0646-4c38-8039-d372d8e7c90a\\})|(\\{b39977b9-bcb2-448b-9d7b-9aec7f62bc26\\})|(\\{059b5c30-b96a-48df-8083-5fff97a8f9bf\\})|(\\{1d0351bb-1d96-4779-b639-44eeceb2ebfb\\})|(\\{80c0bdb4-ba98-472d-ae56-afd8b3021115\\})|(\\{4dfc5596-9655-4b0c-819d-e2ff48fb8556\\})|(\\{d7d3ed3c-6f73-42cb-b724-c33fccc1b465\\})|(\\{b378a858-89bb-492e-8b4d-eb83e910a14b\\})|(\\{ec1fa94c-8700-49d0-ba5d-df99a912519e\\})|(\\{4db5d249-881f-4442-8c01-28536c45ebfd\\})|(\\{7a411d82-fc50-4f20-bd2c-b2b065f18097\\})|(\\{675e002b-e144-4694-a725-9e8cc6a3fa67\\})|(\\{1902a069-c039-421e-b502-1e367c237196\\})|(\\{866bb3a8-82bb-4c9a-bca5-26fd5f37c4ec\\})|(\\{6a4e7017-43cd-4646-bb48-003620bb60fe\\})|(\\{bc5c676e-a75f-475b-a27c-79687b1de3ec\\})|(\\{6b544e1a-932d-4da9-aafe-c4b4bbfe1958\\})|(\\{99631434-ff1e-49d3-88d3-9ac40d0dd1bd\\})|(\\{623b31e0-f289-47cf-995e-5a195e261758\\})|(\\{1b4d88a5-4b5d-44c8-849c-82f129a7dacd\\})|(\\{48ba880a-b7c2-4e4e-af55-9134ac926c61\\})|(\\{4b498e2a-8b17-47c0-a449-89a76b6e737f\\})|(\\{d9cbd45f-cdbc-4be1-bb16-8e60764630ff\\})|(\\{bfaaa94a-1a93-4a1c-9b54-9dbe98f3ef07\\})|(\\{87b93e6e-70a6-4538-9848-e9d0f060e372\\})|(\\{fea4fd50-ed6a-4b8e-b00d-3b2276df6e34\\})|(\\{c15450f8-8da2-4add-a8f6-603d90e8d344\\})|(\\{ec972135-8e5c-49d4-bff8-b6006b21f2d2\\})|(\\{b039f24d-8b51-40d3-abf7-55e1dc502112\\})|(\\{b308870f-ae9a-4972-af28-0218717a47f4\\})|(\\{9349a202-8b8e-4777-ba93-c723810da51e\\})|(\\{798750dc-0057-47e0-a1af-73dec73544fa\\})|(\\{186e4b6a-e3f0-4970-8f7b-05ab6bc50320\\})|(\\{dec8de3e-d3a4-4946-bcbd-c3523fee11c5\\})|(\\{06539c62-00d3-4513-9aa4-048dd273107a\\})|(\\{b200a289-900a-4953-b2c6-b7a323d6fb66\\})|(\\{4080defb-6c6b-4012-bcac-71379e9c430f\\})|(\\{b110855c-90dd-427a-894c-54b93c6572b7\\})|(\\{dd599e99-3a48-4e36-9d83-56f8c0019d4d\\})|(\\{4f43f2c7-c1e6-4091-88fe-c829b3bfe553\\})|(\\{b7a022bc-6b89-4ac1-a1fa-bf02251336b0\\})|(\\{1aa370ca-9865-4c52-89a8-79e95abc82f7\\})|(\\{fb727d0f-7c3d-4bf6-8be4-284e7e8b8f83\\})|(\\{1579b5dd-ef3d-4754-bc59-8a7707fe1219\\})|(\\{66f0cb42-bb3e-4a16-90c1-bed1e3be4aad\\})|(\\{f13a1f79-f63a-4332-a9c9-11fc50328fc2\\})|(\\{29962f4d-bf74-4775-9d02-31fe546d6fa6\\})|(\\{aa539764-9ec3-41a6-af0e-6c2dc46ecbf5\\})|(\\{9412adf1-2714-4cb2-ad5b-13d41096234a\\})|(\\{86f2f4cc-97c5-4cc5-8151-c327ab379fba\\}))$/","prefs":[],"schema":1576757017958,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549214","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"654077f4-a8b3-4822-8962-0bb1cac1d70d","last_modified":1576771657006},{"guid":"/^((\\{0209c9a2-f58e-4ca5-ba95-80de8a0bec36\\})|(\\{0429d1cf-e6c7-46b9-9959-4d24263f5b9f\\})|(\\{04aed622-650c-44b2-968e-a8740024bdfe\\})|(\\{054ccccf-bb7d-4d0d-ae7e-94931a469627\\})|(\\{06440d64-2a92-45a7-8e8e-c14a35f9224d\\})|(\\{06e83ce4-370c-41c0-bfb7-62bb0e77cabb\\})|(\\{06fe00d4-24df-497f-90e0-88db402cc9d6\\})|(\\{077e07c1-b948-4e88-9965-226cde465f9f\\})|(\\{07b424b4-8a9d-4fe6-afd5-1f2135f5f4ea\\})|(\\{080f27b3-ad41-4bf4-84bb-b6df1d395b0e\\})|(\\{0a3ba90b-224e-48ae-9440-b92d4ac03ee6\\})|(\\{0bd278d9-fbc6-40dd-914d-5e696c4255cb\\})|(\\{0c3c7c7c-3d15-4cf7-936d-dcf6070e82ce\\})|(\\{0ee32a7c-74b2-4a55-b388-8034b39c6b1d\\})|(\\{0f806e24-dbcc-4f14-b8f5-cfd7f88d6302\\})|(\\{0f9b7554-16d4-4496-8f01-e396256033b7\\})|(\\{1331d9a3-b9ec-43fc-a369-f73a926849b9\\})|(\\{14aca62f-1cc5-4424-a30a-ffb3d424b5bc\\})|(\\{14ec0bb2-f06f-46ad-b951-b810f7651284\\})|(\\{16744b56-7518-4526-bf9a-2531d694fb1a\\})|(\\{179d7013-b6d8-4a89-a861-30e0e8a7faee\\})|(\\{17cff984-12b5-438d-a915-41d7d006de4f\\})|(\\{17ee37ab-fe67-45bd-9666-bcf57a371e46\\})|(\\{19f6f2dd-32df-47a2-9b89-76543a987d46\\})|(\\{1a6ddac5-6ca0-4d59-a8e5-02345c67f703\\})|(\\{1b50ef3b-a364-4089-8ef6-1031cc7a0d1d\\})|(\\{1b830180-08d2-4381-a516-b84aba36e52f\\})|(\\{1cdff066-cb3a-4abf-95d0-39691e53dc75\\})|(\\{1e778837-1740-4a35-9eb1-e16b2c189037\\})|(\\{260d8452-72d2-4860-b14e-dd3fcb779656\\})|(\\{262c435a-42e0-4ca1-a713-f52672691f4e\\})|(\\{26d2406b-5118-44fe-a479-15a8c4f6f2bd\\})|(\\{28a26807-fdc2-4e79-b2a1-efcb1c21d199\\})|(\\{28c24c28-a094-4915-a2ff-5ff91caf076b\\})|(\\{2afddffd-6246-45f6-af19-a7803095bdf0\\})|(\\{2d37fd0a-5ae0-4d83-bc0e-fc7d870587c6\\})|(\\{2df75889-c43e-4f4d-b43b-e51d9b50167c\\})|(\\{2e4e320a-d5f6-4685-89f0-4d7084209c06\\})|(\\{2f93ea6a-1c1b-4456-b821-e8ba50aedece\\})|(\\{3034cb02-b9bb-4e8a-8749-cdd7fd1a6902\\})|(\\{3862859a-78c6-474e-b30e-303e86a7c6a4\\})|(\\{386afcb7-64f4-41db-b3e8-a76602ebb2fa\\})|(\\{38b61e2b-1af3-4f35-bdf0-cc4e3afc4880\\})|(\\{395065fd-1b7f-400f-aecb-9cfbcd9d607e\\})|(\\{3b0055c9-ea2c-43be-a927-ecd342946367\\})|(\\{3b37c6dd-d5f0-494d-9dd2-175db561b99c\\})|(\\{3e5a09c0-5f26-4d40-a5d0-a853f1fa759d\\})|(\\{3f2d032a-29ac-4cbe-9463-563f3ba6eb7f\\})|(\\{3f6ea025-e6c2-4372-adca-cb60b811e4da\\})|(\\{4253e6be-5b91-4b66-b44e-11f6260cee0e\\})|(\\{42c5b340-7cda-4d89-81a4-4a20754b5250\\})|(\\{42d8241e-e5f6-47d7-95f6-b6649143b12a\\})|(\\{46061237-f12b-4738-b1e4-7b7070fc03ca\\})|(\\{46bcaa76-c21e-44a2-aed8-6ba630fcc961\\})|(\\{47f394e0-02be-4a08-b865-287b993ac40e\\})|(\\{497c92fb-4d7d-4b9e-9884-a178e5991ee1\\})|(\\{498d00a0-3d8a-45ff-8e8f-3c27fcd12df6\\})|(\\{49ec4e6d-8152-461e-a2f5-095ede6c3cab\\})|(\\{4a87eeaa-4aa5-4695-b393-1ca4f00b2f3e\\})|(\\{4b0d3b3a-d61c-4968-a338-8de76d044f80\\})|(\\{4b9b2a47-e06f-4948-a20f-78ec1ef4e84c\\})|(\\{4dc32f1c-374e-4886-9a62-80ecfc23ed17\\})|(\\{4e901df2-8301-4588-9bc9-1e9f6c4f996f\\})|(\\{4fb6f5ed-eb5a-4115-a635-57fecad85d50\\})|(\\{50c0ae9a-ebaf-44f7-9ea7-52c7d1066721\\})|(\\{5160a705-c8e9-40b9-900e-6d26559038de\\})|(\\{5232e216-65a2-44d0-ba11-05fc8c332af7\\})|(\\{53e6e44a-a0af-49e2-af72-db4518f153bb\\})|(\\{58c7b5da-a1cc-437a-9401-2a56eb77df7d\\})|(\\{59aa5a90-0034-4350-adfe-76aff37e73ee\\})|(\\{59c5d279-711e-4217-8e5e-1aa1497ffcaa\\})|(\\{5a3f607d-7e1a-4faf-88e2-5806d74d18d4\\})|(\\{5a6364f7-3237-462d-bd3f-7c501830ceb0\\})|(\\{5dc73bfe-4193-4390-ae50-ad928655e21f\\})|(\\{5e085187-2509-4f8f-80ed-78c06351a77a\\})|(\\{5edfb7c3-04a5-447d-9069-2093289a7b98\\})|(\\{6219dabe-8f5f-4130-a650-8cfa971d7182\\})|(\\{62c9c13b-d001-4c42-819c-31b9763973c0\\})|(\\{656da759-0ae4-4f3e-a798-8293a5df9476\\})|(\\{66d70c4a-ad30-4f3c-afb4-b498a60c49b3\\})|(\\{68cb3185-4f55-42cb-97ea-188924b1d6c3\\})|(\\{6b99e0e4-e2e8-4fff-9da5-81c0b9e92b62\\})|(\\{6de81b5e-7556-4fc4-9cac-df56e898f3bf\\})|(\\{7162613f-ea9c-48b3-a0e3-6700ea61a4c8\\})|(\\{71ef8107-d5fd-4d2c-94b7-2dcd07448622\\})|(\\{7284399c-6be5-42ff-8ddc-5cc52d46ab40\\})|(\\{7422ce07-cac7-4fe6-af6b-16f5e7e27d05\\})|(\\{76a7b38d-7044-4e36-8315-38db10506ec8\\})|(\\{7772f851-8dd4-4d96-b426-6cd9f739a599\\})|(\\{797129e6-8cc9-401e-b9fe-0fee15533e9a\\})|(\\{7a3429ae-f293-4a70-a13d-f57f153557e3\\})|(\\{7bed7063-0842-43d9-b672-5e5e55915d5d\\})|(\\{7c0220cc-89e5-4726-ada1-fa2ffa412f28\\})|(\\{7c3c79d6-7e31-4947-b9b4-dd21f461ccd4\\})|(\\{7c70cbc0-e80c-4f3b-97b2-2530c4ac1349\\})|(\\{7fc4f148-2648-40f5-bd99-d057ac1292a6\\})|(\\{808a2093-68ff-4f73-b239-0d0f105c4d98\\})|(\\{8411b8e3-e302-48a2-91ee-550102b938f6\\}))$/","prefs":[],"schema":1576757094905,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552164","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2a4b5087-eca0-43e8-96f4-6632aabd83d3","last_modified":1576771657003},{"guid":"/^((akjbfncbadcmnkopckegnmjgihagponf@chromeStoreFoxified)|(akjbfncbadcmnkopckegnmjgihagponf@chromeStoreFoxified-2563213750)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3767541208)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-2330732719)|(cidchfadpgepemappcgeafeicnjomaad@chrome-store-foxified-509978031)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-558690357)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3523362862)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-850818380)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3686225023)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3659951669)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-1114585181)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-2593088680)|(edmdnjinnadgoalbaojbhkbognfappih@chrome-store-foxified-206569335)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3272316989)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-96331909)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-2158751912)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-1554953450)|(kadbillinepbjlgenaliokdhejdmmlgp@chrome-store-foxified-323465212)|(kadbillinepbjlgenaliokdhejdmmlgp@chrome-store-foxified-3112875041)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-1868258955)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-611481225)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-162688242)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-1394660953)|(\\{de07e1ed-1597-45f9-957d-4edc44399451\\})|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-294092903)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified--2032791676)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified--786206880)|(\\{76f8d31f-d1b6-4171-885e-6fcde28ca547\\})|(\\{b7492f2d-72b6-4816-83d5-9c82b3cc5581\\})|(\\{3f0fa616-3f92-42e2-ac1e-69ae7b1c7872\\})|(\\{2e324574-0761-4017-bc96-66270563e277\\})|(\\{950d03c6-722e-498d-90fc-ec9d9c1ab893\\})|(\\{6cb64844-2dca-4f29-82d1-cb59459ad824\\})|(\\{5347a8c7-a156-4455-8301-7d19d269bd2c\\})|(\\{17c69a23-df19-4655-aaa9-e8a35f186ddf\\})|(\\{381eb5ad-0f02-4146-85f4-2cc7c7a7dee4\\})|(\\{e797aab6-f3df-4d0d-89c2-320371720194\\})|(\\{91a95e76-4b27-427f-9554-7c1aa58c8489\\})|(\\{5bd5f5a3-3f30-4c90-bf5c-7ff32eae9fac\\})|(\\{e9cbcded-05e0-4cf0-9163-8507de356646\\})|(\\{4262365c-085f-4f2b-9bd7-048d7d1c90de\\})|(\\{d6d89cdf-36e4-44b5-8ea2-2283e25e99b9\\})|(\\{3ab34cbc-4a18-4fac-b629-3b10091d505e\\})|(\\{28beb080-37b1-42ec-a6e9-89cff276cc3e\\})|(\\{d83baff8-42f1-485c-bc61-0df0a2fa2834\\})|(\\{f1260949-ea01-4f69-b302-87ac898bc677\\})|(\\{f2bb825a-19b7-46ba-b759-557885e28ff9\\})|(\\{d1023b1e-87f6-49d4-b93d-80d94cafb101\\})|(\\{605bf342-f990-43b3-9053-b6ad563cc944\\})|(\\{20da0f4c-c6ee-4c4a-be76-8cb0fdd759b7\\})|(\\{29563a03-2ea3-4187-b3dc-af3027287df8\\})|(\\{9fc76cae-b6b4-45af-aa0e-81d1bf419812\\})|(\\{b83f6a6c-6bb3-492f-aad2-56a6b79a02d4\\})|(\\{4e340962-9d78-486c-8ec8-fdc8ba0448c3\\})|(\\{4f420c0e-824f-408b-8327-418934c566e9\\})|(\\{51057732-1a37-491c-afeb-dccbb18e2341\\})|(\\{ac9415c8-b978-4636-a0f6-99b75f1bfacc\\})|(\\{ba9d81ff-13da-4183-8b32-19cc18a198c3\\})|(\\{614f9cd7-d46e-47a5-bcd6-fc9cefc846ac\\})|(\\{83ab005b-85f8-4185-b500-26c78f29e470\\})|(\\{814b9b95-0470-42f5-9be1-b322ae1a300c\\})|(\\{c565d582-ef45-4ee5-a13d-e0bc544bb483\\})|(\\{bbc0a83c-ff01-4f55-beed-c8dd6256d99b\\})|(\\{00d71c76-8b41-4e12-877b-62ad742c5b5b\\})|(\\{22c15bb7-3cac-4480-ad95-8ef2b4762689\\})|(\\{4ce4a857-3ba4-46d3-83e1-424e608f8a1d\\})|(\\{638ad118-0407-437c-a657-f8bde7b0c511\\})|(\\{c35dba3d-eed7-4ee2-b7ed-b2f636810ea1\\})|(\\{7635e554-de52-4a55-81f4-5d4e7ac9e416\\})|(\\{b768c014-21ff-49c9-9a27-186e33574612\\})|(\\{e31ae098-b80a-4286-8688-8514ace2d0fd\\})|(\\{104607b9-ad49-4760-882a-5cc13164531a\\})|(\\{bf78148e-f4d1-48b7-92b2-93ca2003d619\\})|(\\{877777da-7695-4d7e-a469-2a4b4cfbe0c4\\})|(\\{b09f3de0-26c4-4790-ba8e-50a1d1725053\\})|(\\{a24b471c-9100-455c-825a-689533d24979\\})|(\\{12a8c732-c19a-468e-8be4-a16f9a27c845\\})|(\\{bad6c6a4-6108-4e44-b7e3-c05bed9d4e50\\})|(\\{1b598a16-ca58-41bf-8cc2-3741356363b9\\})|(\\{a5520fcc-b75a-4527-931b-e403aa8772ef\\})|(\\{cec7aeec-9352-4ed1-8362-8e384704ab29\\})|(\\{1bf3e066-3707-41eb-b62d-55da5bbe930d\\})|(\\{1fd8204a-f25b-47d0-bfac-35c41451e2e7\\})|(\\{ab1f1e53-9102-4f4f-a793-0a81f5669e13\\}))$/","prefs":[],"schema":1576756466412,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554606","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Various remote script injection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8258f92c-5b89-42a7-a984-dd4e94fa301a","last_modified":1576771656999},{"guid":"/^((\\{ca33d7f8-5b8c-4215-bf6e-a29b721024b8\\})|(\\{ef107eb3-c699-42ce-9310-1f36890fcac5\\})|(\\{48a3b395-8cb9-4093-b557-d967c653b13f\\})|(\\{27e7c4c8-916b-4dae-ab1d-46573fe889e6\\})|(\\{4795f211-f8b2-45b1-852c-982e1912414e\\})|(\\{000d5ed8-cf10-4929-89b5-f5369f50bbcd\\})|(\\{4b249174-1bc4-49c2-a0ca-eaa51facd4b0\\})|(\\{34d96b10-c44d-4398-9410-8d7d550d023a\\})|(\\{c067681d-dc69-4b05-8052-34fa69549aa8\\})|(\\{5b2dcc2b-08a9-4d36-a249-680a9e994938\\})|(\\{68cb60e7-4bfc-43cf-9875-f9548ad5d913\\})|(\\{ddca4204-8f9c-4e35-a8fe-47e94ffced48\\})|(\\{c5138dc7-3cf8-4117-9988-041c2a85868c\\})|(\\{140c670f-ee4d-4a16-bf83-c4012279b923\\})|(\\{d88779b5-daad-4ae8-abdc-3ff58c80da8a\\})|(\\{ab80f9f6-2a50-4074-b560-f839f1674bb3\\})|(\\{a8187405-efb6-4c1c-a9dc-e90fc064f55d\\})|(\\{f0d5c8c8-0697-4ee9-830d-3271ad125c17\\})|(\\{34e3121a-a2f2-4ada-b271-c661b8e0a215\\})|(\\{c4d8c3ad-ba8e-43e7-ae76-90521132805e\\})|(\\{ec5441c0-ddd4-4e70-8d02-92b99eb5f306\\})|(\\{ba00c2cd-f59d-44c5-984c-fbd066cdabfe\\})|(\\{b41fb99b-8e21-4eb8-b825-c6855daeb9c3\\})|(\\{c8329103-f242-4dee-9fca-b98e2e15c096\\})|(\\{59d0d43f-875f-4ebd-beeb-4dfa213a7d20\\})|(\\{9ce5d8a7-e97b-4341-bf16-c12ad44368c7\\})|(\\{e10ea3cf-17ea-4270-8602-83162b1c8309\\})|(\\{303e86df-ad8c-4a55-b921-5e2a32441834\\})|(\\{8ecebe6c-0ac5-4f3a-a32f-50b1686ee538\\})|(\\{b5150eb9-3cf8-4162-b114-56b289c45f75\\})|(\\{c04252ab-747b-4718-9d1c-bb90c72c4874\\})|(\\{976ecad8-b154-4201-a55e-4478a1651a42\\})|(\\{a0f98d44-f4b9-4726-9f01-7587ee46634c\\})|(\\{6b9c9f21-1108-4ae9-a1d8-d56566e20f13\\})|(\\{fdacc9f4-06f1-4619-bfbc-61f790e279df\\})|(\\{74d5b273-dcf7-4606-9b9d-0c5c38cbab80\\})|(\\{6fee68c0-1b38-483f-963b-43919f4ea797\\})|(\\{017a0e34-4942-47d7-a0ff-2093f14e17ae\\})|(\\{71251d4a-7ff4-4450-9459-163b911d9518\\})|(\\{6da358f8-9746-4c39-957d-b6821561b566\\})|(\\{4613ad29-db02-4d30-b857-b84a8ab412a2\\})|(\\{7993943a-0d47-4d30-8989-ce039ec1636f\\})|(\\{ac2fbafe-f182-49f0-920c-2e0d026b6c1f\\})|(\\{5f79fd50-fb20-42f1-adf5-3021aaf3f0e9\\})|(\\{a4295850-5057-46ab-bb31-2d283dff2474\\})|(\\{74517834-8cb5-4895-9f8b-3de15b771d92\\})|(\\{3dbebe53-9687-4e36-8c1e-79fcb098cecf\\})|(\\{275fc9ab-64fd-4430-8a35-43f73a87e8b9\\})|(\\{a26cdedc-b1eb-4fd2-b331-e71033c489a0\\})|(\\{d8fa69e8-1008-4f32-9db2-13ea7589bcec\\})|(\\{59704739-f6df-4272-968d-32f7c599da09\\})|(\\{208f846e-851a-4c07-a448-a66c40a2294c\\})|(\\{46c7b5ea-c1d0-4c2b-9122-3baa2e3bda3e\\})|(\\{39220be1-e69c-4b22-a5ff-545fcacf215f\\})|(\\{c0975246-6858-46e2-8f09-7d80d810c040\\})|(\\{8f284821-a420-4d79-bb7f-c1aae7a2fa90\\})|(\\{86d3e654-73c5-4b7f-a942-bd2347d4517a\\})|(\\{3d1af64b-542e-47ee-98a3-1f89bfca0f2a\\})|(\\{f0c2850d-101b-4de1-be16-3f09963048ab\\})|(\\{7388541e-8d9e-48a9-ac43-87dfdced6e87\\})|(\\{5d37398b-bea7-4ca7-bc4f-95de295be960\\})|(\\{3d8b3d51-3621-4aa5-b229-731cee83ee64\\})|(\\{ba67c9cf-ef60-4085-b6cf-729e5245089a\\})|(\\{1efe8d5d-ca8d-4a53-b2d4-a41380067041\\})|(\\{7698ee9d-345b-4395-b9e7-0479ed91f98d\\})|(\\{5f233e13-1892-41b6-81c6-a26c702d4a09\\})|(\\{d569420c-50a6-4082-b6d9-41c7bcb33464\\})|(\\{e406fddd-5ba4-4fdc-aa46-d556f97c8ef9\\})|(\\{29066f7e-a4ed-40b1-a02d-38ddf25d9533\\})|(\\{57e3e757-ca29-440c-9ef8-864da0e7ee72\\})|(\\{1237079a-7a08-4660-8fdb-6c3fdcecc787\\})|(\\{60429834-7a98-45e7-b525-6f31d55bbb3c\\})|(\\{bb850649-4ada-4735-a861-072ce9b647dd\\})|(\\{dfb103ab-cfee-49cd-b33a-e134367408c5\\})|(\\{24a0a50a-15d2-4806-9226-78491b3e986c\\})|(\\{2eb4b76a-f057-4d14-8d63-a5afa3571158\\})|(\\{cb5ad67a-5304-4351-bb15-530b159fa1f7\\})|(\\{0bd8bfda-24f5-4652-a434-664621e04a36\\})|(\\{f249d964-ac83-4059-893a-c3c5b38cc746\\})|(\\{94ba7f66-aef6-4590-8044-03aa705a4a2b\\})|(\\{dd178abb-e6fb-4e0a-b242-a64a53b24fb5\\})|(\\{7ff1da48-ae61-45f1-bcbf-2c22b4571d58\\})|(\\{d01909f7-598b-41b0-8907-2a9815c5c457\\})|(\\{93a37679-eb92-4eec-93b2-7bf77b0f94ca\\})|(\\{3ff7ce60-fbe5-4a50-9733-a347a02f09e5\\})|(\\{f076d6ff-1daf-42f3-b485-5b54b13aaf3e\\})|(\\{571d827c-5c84-42cc-8386-9e12abb8209a\\})|(\\{f6515794-8d44-402c-9a3d-3d712cb437bb\\})|(\\{796a59ab-77a7-4add-9481-5c7deee7c037\\})|(\\{a9b99a24-6cc1-491a-a81b-946cb42bc9f2\\})|(\\{9767896a-9561-426e-90d1-03b884d34eda\\})|(\\{95a6ebd9-52bc-4859-b92f-70a7c103e2b8\\})|(\\{4d24059d-463b-40b0-a86a-0a1de38fccb9\\})|(\\{d7c03c15-7287-4fb0-add0-c49744b48410\\})|(\\{6074519d-2d7c-45b6-b239-ea5452e93140\\})|(\\{425dafa9-0997-48df-b971-623847853747\\})|(\\{847688e9-b1d7-4607-b4fd-44c2365c01ba\\})|(\\{1383930d-64e9-4c3d-a629-361c70e3cd26\\}))$/","prefs":[],"schema":1576756857135,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558136","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various fake Flash/Avast/etc clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"72593718-af38-4f63-bcb9-7c6afd13de8f","last_modified":1576771656996},{"guid":"/^((\\{9aa1f441-7c04-4b00-83b2-6a4362090b41\\})|(\\{3001d016-bc15-49af-a81b-2c8764139321\\})|(\\{0af1d242-b004-49ae-91fc-00fa0f642bf9\\})|(\\{95a5a094-ba8e-4fe1-80bb-6f6c0a01bc2c\\})|(\\{36b33158-36fc-4728-bf08-8e532100af58\\})|(\\{5bda1d03-6533-4d8c-adb4-7179402ddeec\\})|(\\{dc7d18c8-c832-42cd-b9b0-f6a46a737ad1\\})|(\\{56d85baf-c366-491b-b93c-733a4a36009d\\})|(\\{1b08c0c7-d2fd-4905-82ab-d4d759af4051\\})|(\\{1b8a9b33-b3d9-42ea-adce-cec910c44f29\\})|(\\{0be707e8-d7d6-45d5-8212-3fd3784d7de7\\})|(\\{fb2e3c38-be42-480f-b60c-d614d372e218\\})|(\\{c088d705-9f59-40ac-98eb-192f67c44f03\\})|(\\{9570bbbd-d761-4380-850c-d9cc15200916\\})|(\\{2652d5a4-26b1-4e6f-9134-304d7b57af7a\\})|(\\{1e0a2a5f-170c-43c1-b458-c8fc8bdd7dec\\})|(\\{47595710-e0b3-4a88-9bf7-54e1f3bb6772\\})|(\\{c25a320e-dc50-486a-9589-13ef22f75a21\\})|(\\{645237c8-7da2-4298-a789-e11fbaaa580e\\})|(\\{f2356af6-9b9d-4c69-876a-710d446a9124\\})|(\\{98a67ccd-599a-4675-9578-35af1824fdd2\\})|(\\{f3924f49-64a3-4fde-8598-76eec8e67f34\\})|(\\{2a46402d-b6c4-4a0b-87f0-dc90bb24fa93\\})|(\\{40d92297-295d-4a44-8a0f-dd69510c9c30\\})|(\\{a5462b0d-6528-47d5-ada5-4a23d1e0355e\\})|(\\{280f7325-eaf0-451a-ad2d-3b2c4e80e070\\})|(\\{ee5a7045-e216-4836-949a-07f5aa1dabc3\\})|(\\{34ee38f4-e2ba-4e9d-8b1f-dd06e8bd205f\\})|(\\{7c71c234-ba74-467c-b750-727ee7e38382\\})|(\\{a83b3b31-4bfc-4343-beab-761f21b97f57\\})|(\\{b85d35a4-3a03-430d-a1a0-437448a86c22\\})|(\\{8b6c1e29-5009-477e-a798-244b0efb1515\\})|(\\{64891348-7fc0-4299-bd6a-6bfaa6cf21a6\\})|(\\{baa828ff-1723-483b-8034-145ad2795efd\\})|(\\{81fd4851-7ea3-4ea5-8775-49372fe1c8c8\\})|(\\{ce7d8e95-c7d3-49dc-8abf-e860ee707b09\\})|(\\{d84109e8-9945-48bc-90e8-0dd0b1b63b73\\})|(\\{ec12fd66-7294-4167-8fbc-4774150c0fa4\\})|(\\{0c506de9-8467-4a92-8cd3-11c87e121db2\\})|(\\{b1671fe5-c90a-4f68-b8bf-e54a147b5d05\\})|(\\{8b25277a-4df8-4d2d-b3b4-f8219e2ce7d6\\})|(\\{5705cd04-46c2-459f-8a9a-97ce57eee1ae\\})|(\\{8340b371-ed61-4b07-b293-853aa5dbb866\\})|(\\{87bbb065-e195-48ac-989e-ba48ee63b404\\})|(\\{c455fc20-6e9d-418c-9b45-75fd85852b32\\})|(\\{a80c87a7-3366-4192-b9cc-d1e862e1c13d\\})|(\\{5f4ba05c-c1a5-4bc7-b8d3-c14e807b2c64\\})|(\\{0114315a-beda-4d55-89a3-e00f6346e7be\\})|(\\{0fb7b987-721e-4828-9a0e-a72860ded1b2\\})|(\\{c44cd2a5-bf28-4520-ab2d-187752e51a26\\})|(\\{3a34c1a6-3cbf-49a0-bfe9-beff60da5ec6\\})|(\\{677e89a4-ae10-42f3-8e9d-d51be40daf8f\\})|(\\{85d70eae-fde6-4ac0-ab82-0148f2eb1543\\})|(\\{fddac013-6d12-41a4-9924-f5ea7618f22d\\})|(\\{84b5ca75-a431-45c7-995d-6d7268decd0d\\})|(\\{7374dd37-a901-4b65-993c-3323f87e0f3c\\})|(\\{157a5c60-7899-4328-a90c-83d34d0844d4\\})|(\\{5b288e8d-f33c-4602-a945-07f96e43a041\\})|(\\{80f059bd-602a-42d5-9b17-9f2c6a074102\\})|(\\{8e5a8075-8e21-4ab2-b189-5d435208122c\\})|(\\{d5b94c09-0ff8-4b86-b52a-590d5e5ad9af\\})|(\\{a569eb31-9456-49a9-9aa9-e69a8db159d3\\})|(\\{0431a147-f9f5-4ee3-8dca-57303110c226\\})|(\\{88c77421-5ebd-46fb-92a8-e0459b6edd20\\})|(\\{a4a0697d-9a01-4b21-bb88-5ac949cdb7b3\\})|(\\{03e0da0a-da1d-46f2-85c7-08258189fc04\\})|(\\{351f5a4d-a0fd-4ce7-a85a-6cb74fb6c57d\\})|(\\{0e0b22ea-831e-4104-9c2e-612d7ebf82e2\\})|(\\{7b5c604f-ea41-4bfa-88d1-843f27645199\\})|(\\{863f023c-a2e5-4043-8e49-8e3029004b19\\})|(\\{20e4b367-f8ad-4c9a-b590-976be87206aa\\})|(\\{436ca3ce-f10a-4cdc-86c2-a46f086b5fdb\\})|(\\{a53983bc-545e-429a-8aaa-6332e1a6287f\\})|(\\{5fb1995e-ac7e-4c01-a592-8b262856e039\\})|(\\{56086da0-b20d-4118-9670-56e85624c875\\})|(\\{67ef5673-5769-4d5b-902f-ba22cb16a51b\\})|(\\{1d50e81b-0594-4c24-80c2-abc479be4d18\\})|(\\{b190f2cf-f3f0-40e7-a05b-8eed296a0c8d\\})|(\\{490d8bfc-fd42-4ded-9fee-1f009e777468\\})|(\\{1d647c69-8e4b-4fe8-b0f3-d914a1410ee8\\})|(\\{4958ae27-1251-49b4-a9d4-2af7c36c833b\\})|(\\{6e80fdc3-79c7-423a-8e95-0e123c0f2187\\})|(\\{d8d3230d-5642-4c3f-a64e-5ff690f7a466\\})|(\\{ddbe5d7a-e037-4749-89bc-3460d358aca1\\})|(\\{48cd023c-52ef-4fe7-a2ff-101c22c49a5e\\})|(\\{fef34931-b7ca-49a5-8827-bec353efaa08\\})|(\\{331a936b-a87e-4271-b9a6-30935dad77ed\\})|(\\{21084437-803c-49c3-8f84-9a615bfa5dfe\\})|(\\{93511e9d-badf-4b5c-9fbc-17ef6a9786ae\\})|(\\{470e388e-a039-43f8-a7a7-d8f54d273feb\\})|(\\{e4cd5604-caec-4139-9781-94add5f41ba3\\})|(\\{f00bc2b9-2b69-4f68-8bef-91d498686731\\})|(\\{7b3206c4-dc98-4ad9-88ba-5a7b3048fd92\\})|(\\{8e19f5f7-2445-48b1-8910-55d42d9dfe34\\})|(\\{770e30c6-f1b9-4df4-8551-c7f09ddbd8ed\\})|(\\{bb9a8679-1f82-4ab7-8ea2-bac864a38542\\})|(\\{13f5e078-b80a-45fb-a907-c4515a7bb0fa\\})|(\\{d8df47e3-5e86-4669-9a15-a37f8a8593db\\}))$/","prefs":[],"schema":1576756624851,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1565184","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Private Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9f945be6-12e7-4948-af77-668bc3996ff3","last_modified":1576771656992},{"guid":"/^((_0dMembers_@www\\.myaudiotab\\.com)|(_12Members_@free\\.myscrapnook\\.com)|(_14Members_@download\\.totalrecipesearch\\.com)|(_1cMembers_@www\\.bringmesports\\.com)|(_29Members_@www\\.headlinealley\\.com)|(_2bMembers_@www\\.bettercareersearch\\.com)|(_2jMembers_@free\\.recipehub\\.com)|(_2jMembers_@www\\.recipekart\\.com)|(_2vMembers_@www\\.dailybibleguide\\.com)|(_39Members_2@www\\.mapsgalaxy\\.com)|(_49Members_@www\\.utilitychest\\.com)|(_4jMembers_@www\\.radiorage\\.com)|(_4lMembers_@www\\.bibletriviatime\\.com)|(_4zMembers_@www\\.videodownloadconverter\\.com)|(_57Members_@free\\.marineaquariumfree\\.com)|(_5aMembers_@download\\.mywebface\\.com)|(_5eMembers_@www\\.translationbuddy\\.com)|(_5mMembers_@download\\.myfuncards\\.com)|(_5pMembers_@www\\.metrowhiz\\.com)|(_64Members_@www\\.televisionfanatic\\.com)|(_69Members_@www\\.packagetracer\\.com)|(_6xMembers_@www\\.readingfanatic\\.com)|(_73Members_@www\\.easyhomedecorating\\.com)|(_7eMembers_@www\\.homeworksimplified\\.com)|(_7jMembers_@download\\.gardeningenthusiast\\.com)|(_7nMembers_@download\\.crazyforcrafts\\.com)|(_8eMembers_@download\\.howtosimplified\\.com)|(_8hMembers_@download\\.allin1convert\\.com)|(_8iMembers_@download\\.audiotoaudio\\.com)|(_8jMembers_@download\\.myimageconverter\\.com)|(_8lMembers_@free\\.filesharefanatic\\.com)|(_94Members_@www\\.motitags\\.com)|(_9eMembers_@free\\.findmefreebies\\.com)|(_9pMembers_@free\\.onlinemapfinder\\.com)|(_9tMembers_@download\\.internetspeedtracker\\.com)|(_9tMembers_@free\\.internetspeedtracker\\.com)|(_apMembers_@free\\.puzzlegamesdaily\\.com)|(_b7Members_@free\\.mytransitguide\\.com)|(_beMembers_@free\\.dailylocalguide\\.com)|(_brMembers_@free\\.yourtemplatefinder\\.com)|(_ceMembers_@free\\.easypdfcombine\\.com)|(_chMembers_@free\\.discoverancestry\\.com)|(_d0Members_@free\\.gostudyhq\\.com)|(_d1Members_@free\\.mysocialshortcut\\.com)|(_d9Members_@www\\.everydaylookup\\.com)|(_dbMembers_@free\\.getformsonline\\.com)|(_dgMembers_@free\\.trackapackage\\.net)|(_dhMembers_@www\\.packagetracking\\.net)|(_diMembers_@www\\.easymaillogin\\.com)|(_djMembers_@www\\.emailfanatic\\.com)|(_dnMembers_@www\\.webmailworld\\.com)|(_doMembers_@free\\.convertanyfile\\.com)|(_dpMembers_@free\\.findyourmaps\\.com)|(_dqMembers_@www\\.downspeedtest\\.com)|(_drMembers_@free\\.downloadinboxnow\\.com)|(_dsMembers_@free\\.internetspeedutility\\.net)|(_duMembers_@free\\.funpopulargames\\.com)|(_dvMembers_@www\\.testinetspeed\\.com)|(_dxMembers_@www\\.download-freemaps\\.com)|(_dzMembers_@www\\.pconverter\\.com)|(_e1Members_@free\\.actionclassicgames\\.com)|(_e5Members_@www\\.productivityboss\\.com)|(_e6Members_@www\\.freelocalweather\\.com)|(_e7Members_@free\\.gamingassassin\\.com)|(_eaMembers_@www\\.mynewsguide\\.com)|(_ebMembers_@download\\.metrohotspot\\.com)|(_ecMembers_@www\\.instantradioplay\\.com)|(_edMembers_@free\\.myradioaccess\\.com)|(_eeMembers_@download\\.freeradiocast\\.com)|(_efMembers_@free\\.funcustomcreations\\.com)|(_ehMembers_@free\\.dailyrecipeguide\\.com)|(_eiMembers_@www\\.100sofrecipes\\.com)|(_ejMembers_@free\\.downloadrecipesearch\\.com)|(_ekMembers_@free\\.biggamecountdown\\.com)|(_eoMembers_@www\\.transitsimplified\\.com)|(_erMembers_@free\\.getvideoconvert\\.com)|(_esMembers_@free\\.downloadmanagernow\\.com)|(_euMembers_@free\\.filesendsuite\\.com)|(_ewMembers_@free\\.mergedocsonline\\.com)|(_exMembers_@free\\.easydocmerge\\.com)|(_f7Members_@download\\.smsfrombrowser\\.com)|(_fdMembers_@wallpapers\\.myway\\.com)|(_fkMembers_@free\\.getflightinfo\\.com)|(_foMembers_@free\\.flightsearchapp\\.com)|(_fpMembers_@free\\.passwordlogic\\.com)|(_frMembers_@free\\.testforspeed\\.com)|(_fsMembers_@free\\.pdfconverterhq\\.com)|(_ftMembers_@free\\.mytelevisionhq\\.com)|(_fvMembers_@free\\.directionsace\\.com)|(_fwMembers_@free\\.howtosuite\\.com)|(_fxMembers_@free\\.mytransitplanner\\.com)|(_g3Members_@free\\.easyphotoedit\\.com)|(_gcMembers_@www\\.weatherblink\\.com)|(_gpMembers_@free\\.mymapswizard\\.com)|(_gtMembers_@free\\.gamingwonderland\\.com)|(_h2Members_@free\\.calendarspark\\.com)|(_hbMembers_@free\\.quickphotoedit\\.com)|(_hfMembers_@free\\.everydaymanuals\\.com)|(_hgMembers_@free\\.atozmanuals\\.com)|(_hmMembers_@free\\.easyweatheralert\\.com)|(_hnMembers_@free\\.quickweatheralert\\.com)|(_hoMembers_@free\\.directionsbuilder\\.com)|(_hpMembers_@free\\.easyfileconvert\\.com)|(_hqMembers_@free\\.scenichomepage\\.com)|(_hvMembers_@free\\.myfileconvert\\.com))$/","prefs":[],"schema":1576757193463,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598806","why":"These add-ons collect ancillary user data among other policy violations.","name":"New tab data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1b799430-d1a3-49a8-91a2-f45069528ebe","last_modified":1576771656988},{"guid":"/^((\\{02cfe44d-20d1-4275-b325-42888248443d\\})|(\\{03476021-f140-425d-8e62-a6455206a874\\})|(\\{0a50fe22-313f-4a59-9032-2fd63bdd2815\\})|(\\{21c91802-e348-4dd0-820a-07aca1de12a5\\})|(\\{24f43a02-83c5-44cd-a611-0bae2093393f\\})|(\\{257284b0-be1d-44e4-8321-b2a7a56c2eb5\\})|(\\{2610c188-123a-4e4f-a6c7-2ed7e8b70bf6\\})|(\\{26a28ba8-d8e3-4284-ab58-8542144ff657\\})|(\\{27e8838f-91ab-486b-8851-9de8bd633aac\\})|(\\{27f348a5-adb0-4037-bc03-f6832cfd6fc3\\})|(\\{28f5d824-8067-4859-8fe3-22a5f96552bc\\})|(\\{32f66767-230f-4dd8-8538-d6dca8b327f6\\})|(\\{35a35db0-010b-4105-9dc3-d5fe761023ab\\})|(\\{3d61019d-c636-4c0d-91d2-6e2d734014e0\\})|(\\{44c9b9cf-b960-45fc-bf0a-9be9c455c975\\})|(\\{48e711a3-644f-4520-8205-11b377df480e\\})|(\\{50ba963f-1b4a-4ed0-b22f-8e1c18d17364\\})|(\\{53150391-1080-4a50-96ed-de24a6ea24c6\\})|(\\{5570199f-fc69-45eb-a0b0-7cc60089022c\\})|(\\{595c83ad-5a64-4740-a118-39a49aede0e3\\})|(\\{5ae5110f-449e-4c5e-b247-9d1e9971d3bc\\})|(\\{61b734ef-f886-4466-8525-8276e9b19b55\\})|(\\{64e9998b-c477-4c29-bf1d-945146cf9376\\})|(\\{682ff4d6-9b2b-4e1b-99b0-e2dcc2476bd1\\})|(\\{6836a626-1ec1-4c3c-9b25-5e4cd5048ad5\\})|(\\{69f1dda4-a6fa-49f6-a16c-7b3bc3e0e520\\})|(\\{6b7eb4f0-ef7d-4da4-8c3d-21b7c2dfb19f\\})|(\\{725f919c-8adf-4192-9c0e-89ab1027161e\\})|(\\{7320730b-e202-4405-8d76-97a862239701\\})|(\\{79821b50-57ca-4267-9dbf-84aeb061e126\\})|(\\{7ee25d12-df90-4a6a-a068-7a6919651bc7\\})|(\\{816b4ade-7b69-4a73-994a-b37f9939d5d8\\})|(\\{82956d74-9e19-4770-97cc-73caa2c9f711\\})|(\\{839b2467-6857-49f9-a730-baf7b2a98039\\})|(\\{85af3203-f8a3-4ba5-8d0f-c3ee1d38c0d8\\})|(\\{8866f414-2f72-44a6-b7dc-6959891e9ee3\\})|(\\{914f8b0b-f4e0-46d5-bae6-4fadd78ebe8c\\})|(\\{93969099-a7b4-43aa-bcc0-241676204257\\})|(\\{972315f7-e09e-4f7d-b4d7-1ed093e06dc0\\})|(\\{98c7dc13-2e24-4ea0-8f02-34a2e19f19f1\\})|(\\{99ca0fea-aa27-42b9-9dfb-5c2b02601d30\\})|(\\{9cd8f1f0-b739-427a-9378-16dee329a2b6\\})|(\\{9f0a0293-94ca-4e27-b697-2032f455a12f\\})|(\\{a41f8d9a-ea42-4d59-8966-5f9e805246a5\\})|(\\{b21eea41-def0-4ab6-afe4-ec98397bf59c\\})|(\\{b7561855-e073-4a3a-b827-33bd97042442\\})|(\\{b8b11c35-1c11-4634-9b20-6aff2344a65d\\})|(\\{b90bc248-5b37-4de0-be18-0f208c5cf958\\})|(\\{be17a3b2-18a6-4925-aa7c-bb377bec7793\\})|(\\{be82443f-f8e0-46eb-8cda-80ff1d911a16\\})|(\\{ccce69c0-3cc6-4e63-acb6-77a7c63772ed\\})|(\\{daf9a25c-83b8-4e4b-aca2-ff7ca55289d3\\})|(\\{db7d9d1b-1758-44a0-a8fb-0eb2f3ac4d36\\})|(\\{de34ccf4-0634-4ba2-9bdc-42b293c8cdc8\\})|(\\{df2bbd0f-0a8a-45de-a75b-4349835a8576\\})|(\\{e203bc10-6462-49e6-8f2f-223a29ce82d7\\})|(\\{e66e26fe-5092-4fbd-9851-78a1f5c34575\\})|(\\{ebaf7169-6df9-463f-bf15-10f48143bf73\\})|(\\{ebe3c932-d6fe-4ad7-9eb9-7857aa6fd1ca\\})|(\\{f83c3eae-8dd8-4f38-b7c0-272e34599771\\})|(\\{fb00fead-b480-4906-8b4c-4039c272b83d\\})|(\\{fc14529e-1b64-4717-8a1f-6634cc343c7c\\})|(@blackfridaystores)|(@blackfridaystoresco)|(@blah)|(@celebjunky)|(@checkmaps)|(@childt)|(@convertmypdf)|(@convertmypdfco)|(@dailyjobssearch)|(@dogs)|(@email\\.superextension\\.info)|(@flirtywallpapers)|(@justlovepetscom)|(@liveemail)|(@localweathertoday)|(@localweathertodayco)|(@loginpro)|(@mapsfinder)|(@mynetspeed)|(@mynetspeed\\.co)|(@mynetspeedco)|(@qwertyuiop)|(@qwertyuiopasdf)|(@searchprivacy)|(@searchprivacy-fx)|(@searchprivacy-fx-1\\.1\\.15)|(@searchprivacy-fx-1\\.1\\.16)|(@searchprivacy-fx-1\\.1\\.17)|(@searchprivacy-fx-1\\.1\\.18)|(@searchprivacy-fx-1\\.1\\.19)|(@searchprivacy-fx-1\\.1\\.20)|(@sportsbulletin)|(@sportsupdates)|(@thecouponstore)|(@trailertab)|(@wheresmypackage)|(@wheresmypackageco)|(@www\\.blackfridaystores\\.co)|(@www\\.convertmypdf\\.online)|(@www\\.convertthepdf\\.com)|(@www\\.dailyjobssearch\\.net)|(@www\\.easyonlinerecipe\\.info)|(@www\\.EasyOnlineRecipe\\.net)|(@www\\.easyrecipesearch\\.net)|(@www\\.findmaps\\.co)|(@www\\.job-portal\\.co)|(@www\\.justlovepets\\.online)|(@www\\.movie-quest\\.co)|(@www\\.mymapbuddy\\.net)|(@www\\.mynetspeed\\.co)|(@www\\.searchsafe\\.online)|(@www\\.searchsafe\\.site)|(@www\\.searchsafe\\.space)|(@www\\.searchsafe\\.website)|(@www\\.thecouponstore\\.co)|(@www\\.thecouponstore\\.co\\.test2)|(abc_KtOQLgxUgW@abc)|(Access_Mails_Now_YEsNTbvoal@www\\.accessmailsnow\\.com)|(Access_My_Inbox_zPsghWWAPc@www\\.accessmyinbox\\.com)|(Accurate_Weather_Today_clone_vGXzNgIjwr@www\\.accurateweathertoday\\.com)|(Accurate_Weather_Today_clone_zpRLPSpMcU@www\\.accurateweathertoday\\.com)|(alot_Search_unSoxsuUZQ@www\\.searchalot\\.co))$/","prefs":[],"schema":1576757781685,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a0be3662-6b8f-4d91-bbe1-fde9500adb48","last_modified":1576771656985},{"guid":"/^((\\{a4b95555-755a-4a3f-bc64-f6999377963d\\})|(djamol@webdownloader)|(\\{b23e59ff-5491-40f4-adb2-577d31d8778a\\})|(\\{90e41842-755d-40e0-9136-8129df55a644\\})|(\\{8e0ccf87-6ea4-4985-b07f-4d503f105d91\\})|(\\{69d0ae35-7d39-4c41-b455-4d751117317e\\})|(\\{df0dfe82-78a9-456e-9dc1-c832a94d43a7\\})|(\\{7bbd26d9-d245-48d3-b3a6-5e19948dfa14\\})|(\\{3d9109d8-463e-4dde-9416-d25c6ea995df\\})|(\\{2726adf8-c1f9-4ed9-baf1-9a3c1742b659\\})|(\\{bfc40cf5-a085-4f0b-a3ef-5e124f2e445e\\})|(\\{37927c18-d5a5-4187-9e6e-6a787364bd9f\\}))$/","prefs":[],"schema":1576093292597,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1603731","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b8daa919-7a9f-4a83-8aef-4a5d3fbfb502","last_modified":1576242123974},{"guid":"{d69204d4-610c-4144-9d26-8cf8b2ad6e15}","prefs":[],"schema":1576032043088,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1603086","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"IDM Integration Module"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c3774104-d770-48a5-acd7-c7136d62bb40","last_modified":1576068160484},{"guid":"{d69204d4-610c-4144-9d26-8cf8b2ad6e14}","prefs":[],"schema":1576012075125,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1603001","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"IDM Integration Module"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8c92ab3a-9c31-4f75-b980-19e39b702fd8","last_modified":1576032042722},{"guid":"/^((\\{108dfe62-0473-47cd-b33e-8270d062db77\\})|(\\{e4a4e54a-5d49-4ac3-93d7-ec0d30ad06ef\\})|(\\{ccad95df-add6-4d8a-aa5c-cdc484075bad\\}))$/","prefs":[],"schema":1575996881649,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602162","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fd42cd0b-a72a-4a0f-9a6a-965ee2f29cb6","last_modified":1576012074754},{"guid":"{7bb202fa-9247-49c6-898c-ce0d36bc44e3}","prefs":[],"schema":1575976576210,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602821","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"MyPopupBlocker"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"810f4d41-368a-4cfc-8513-81063587b97c","last_modified":1575996881281},{"guid":"@cloaking-skull","prefs":[],"schema":1575920492132,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602736","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Cloaking Skull"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4438f49a-2f78-48d9-bc7e-a897f3f62945","last_modified":1575976575848},{"guid":"/^((photoplus@4329fgjfdgkf343\\.com)|(\\{1b1c9b32-9dd3-461c-85c6-bbac4ef2af10\\})|(\\{7DC6D86C-EA66-48C3-9BA7-AE26A8ECB175\\})|(david\\.janitzek@gmail\\.com)|(\\{ac393d9e-1610-4eaa-8951-77655f98b4f7\\}))$/","prefs":[],"schema":1575890870070,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602406","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aa154bb5-7fc9-4226-928e-199aa7eded69","last_modified":1575892910839},{"guid":"/^((\\{e1d407bc-1986-4577-bc31-a63d07cbae10\\})|(\\{3a2831f6-37df-4a42-baf6-0b81d5b6a68f\\})|(s3google@translator))$/","prefs":[],"schema":1575889775993,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602293","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"S3 Translator"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eac7bf16-aae5-4958-8b85-5dcc9a3a1ce8","last_modified":1575890869693},{"guid":"/^((\\{87dd9a06-b692-4fa0-91c4-0aead43c25cc\\})|(\\{9082269e-1de7-4d34-9736-1174917f9459\\}))$/","prefs":[],"schema":1575747691126,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602285","why":"These add-ons violate Mozilla's add-on policy by executing remote code and/or collecting ancillary data.","name":"HomeTab/FLSearch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1af528d2-d0e1-4981-acfa-3b10501aed34","last_modified":1575889775630},{"guid":"/^((xh5yh45p59fdrtimlot6@xh5yh45p59fdrtimlot6\\.com)|(758ct3wkmbrvd8equs21@758ct3wkmbrvd8equs21\\.com))$/","prefs":[],"schema":1575661660854,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602098","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"235d9439-305c-48db-a6da-5a8639ab9c80","last_modified":1575663903042},{"guid":"{ecc522ab-9926-4dc5-90ab-8f979db871ed}","prefs":[],"schema":1575651664337,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602087","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"YTMP4DL"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"01645c30-87fc-4332-9c94-255ef9e50120","last_modified":1575661660491},{"guid":"/^((\\{81f244fc-e5ab-4233-bad0-f61f334dcd43\\})|(\\{98222415-4241-4b89-b81d-651c1a872881\\}))$/","prefs":[],"schema":1575628797035,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1601546","why":"This add-on violates Mozilla's add-on policies by facilitating access to malicious web content and software.","name":"Video download add-ons (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"404e3032-80a6-43f5-a02e-c7d4e8f684d5","last_modified":1575632376941},{"guid":"{c5b1783f-29c8-4bb0-ab8b-a6a9a0c5e4e0}","prefs":[],"schema":1575627603102,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1601747","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"IDM Download faster music (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ef1c681a-ecca-4ea0-b798-6a093765b984","last_modified":1575628796682},{"guid":"/^((smartnav@navigation-internet\\.com)|(game@ultimate-cosmo\\.com)|(update@ultimate-cosmo\\.com)|(extension@gum-gum-streaming\\.com)|(extension@one-piece-fighting\\.com)|(extension@manga-vf\\.fr)|(adblock@gum-gum-streaming\\.com)|(adblock@manga-vf\\.fr))$/","prefs":[],"schema":1575313586028,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600592","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0b0c648b-1f8d-49f4-bd6e-96e69bbebb45","last_modified":1575376981463},{"guid":"/^((\\{33a89146-6b66-4834-bea3-18733d7646f8\\})|(\\{55f304c0-a431-4b35-8cd0-472569a9dd86\\})|(\\{581fae86-7847-448d-9950-5a96127b293a\\})|(\\{9f2a514d-e9dd-4bd6-b743-b15492c10167\\})|(\\{28bf22b4-d52d-4d8a-b710-3868b3bc46ce\\})|(\\{3e9246fc-8125-499b-984e-a8b68507bd36\\})|(\\{731784b0-81c4-4fe9-8741-f5960e12088c\\})|(\\{21585a0f-bcb6-480c-9f70-5cd33cf64833\\})|(\\{2741fd42-3faa-4cef-9b08-361f0c4990ea\\})|(\\{4c479c80-2f53-4d38-a366-0f0c3a346d40\\})|(\\{c4471705-e0eb-47ed-8af9-046c1e808fdd\\})|(\\{2b2bc8ab-5a38-4a26-8ce1-2af9fa2ad7bf\\})|(\\{6840b587-8324-44a0-b176-56d15580dde4\\})|(\\{44d8d882-f6a0-4349-93bc-d3a2353a3fd3\\})|(\\{ddf7716b-badc-417c-b3ce-6322fd67cc65\\})|(\\{82abdf82-f361-47ab-bab7-7f862e132e06\\})|(\\{d24e0155-d36c-402e-943f-d5816451e86f\\})|(\\{926f1f58-3c6e-4f07-8847-2998dc0f1dbd\\})|(\\{e8d228cc-ecb9-4ef6-98e3-8052858fd3ea\\})|(\\{86a868c9-707f-46e8-88ca-5edde6a549e2\\})|(\\{7d5a68c2-261f-449f-af8d-b99a7ae7a01f\\})|(\\{e579c6fb-bf80-4ae5-b3d2-613e084af7fa\\})|(\\{ef7a3832-deb4-4798-b61b-a7cc8b8aa1e2\\})|(\\{48532584-e4dc-4902-b27d-ce35cb29c4c7\\})|(\\{b792fe29-4eb1-412b-bd0b-458252dfab39\\})|(\\{c6f8a307-8024-4e6f-a5f1-595ba43d765e\\})|(\\{7c7a26bd-b1cb-4088-a16e-48f26d22d569\\})|(\\{ff3b2825-86da-4525-abe6-c673b70f58cc\\})|(\\{d4def0be-0d09-453a-9cca-ddc1e1cc9a1d\\})|(\\{0024b95a-9610-4e9d-b836-da40c99c959e\\})|(\\{b09a0797-b6d2-485e-8afc-8361055761ea\\})|(\\{f5c86ae7-cf67-43f8-895c-b2b19209ee81\\})|(\\{bc5d5c2b-e895-49d5-966b-cd1aaee9d324\\})|(\\{a6a8b5c9-45da-457e-990c-b89515139e80\\})|(\\{6d00e6c8-2f26-4dad-81e6-888c080ddfc7\\})|(\\{8f4412a8-c670-4298-a0bc-da30dc3a5ae2\\})|(\\{912d27f7-d9ac-489b-8d7c-2873526e11fc\\})|(\\{3d47bef5-277d-4f06-8ad8-802266e57d17\\})|(\\{0e0bbc6c-914e-47e2-96b9-33f94af6f0a7\\})|(\\{e0f289e7-1284-496b-aa09-f052089d61a3\\})|(\\{64832a69-731b-4481-ad59-3c8aa4006643\\})|(\\{c174dc42-ad4e-4378-8f07-8a47025f8407\\})|(\\{28753278-896f-4f48-8ef3-ea3379896a40\\})|(\\{cdb22d53-d13d-4500-af92-7e653e988722\\})|(\\{65d037b6-c44d-49c5-aa10-a947940c61cb\\})|(\\{d4906685-5b71-49a8-92b5-76f19f2b0a66\\})|(\\{2bebc776-9ee0-47c8-9c99-0351b140ffd2\\})|(\\{58d56295-8d0f-4fe1-8538-2d916911e304\\})|(\\{19283d7a-9fb5-417e-9401-b952ce14a268\\})|(\\{7338a117-ff10-4862-8992-b42829b2e47b\\})|(\\{8defb767-abf1-4d39-88df-9cfc6a39a8e3\\})|(\\{15a77f39-2b56-46b5-b5d6-6064a6f1fbdd\\})|(\\{87fd9298-3176-400b-be06-45538ecd0702\\})|(\\{cda1cc52-9961-477d-8faa-95c7f9025498\\})|(\\{c8056cfe-0bd7-43db-88ae-468f78cc8637\\})|(\\{54bf103a-3f38-43aa-b1ed-2ccbcadb4e0b\\})|(\\{bb67004c-57d6-4632-bc89-8991560a011f\\})|(\\{2902f9ee-b79a-415f-99bf-b661c2bf42e0\\})|(\\{81e0bd24-a93d-4db0-8db9-d5560805c153\\})|(\\{3004ff5d-c68c-4e2b-80b4-2dc21bde9195\\})|(\\{25bcebd4-1d72-4502-8927-a1a6ac35d595\\})|(\\{0b440d2f-8a97-4d2e-bacb-703260897903\\})|(\\{7d0cc577-51fb-4994-8926-7df70f5f16fc\\})|(\\{a6c138fd-c83d-416b-90a8-74bfafefb67a\\}))$/","prefs":[],"schema":1575229292065,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600576","why":"This add-on violates Mozilla's add-on policy by collecting data without user disclosure or consent.","name":"Add-ons collecting data without user disclosure or consent"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"80a34f3f-1f4e-47cb-99a4-1b343b322455","last_modified":1575285295616},{"guid":"/^((_qdMembers_@extmys\\.mysearch\\.com)|(_qjMembers_@www\\.taxcenternow\\.com)|(_ohMembers_@www\\.whizds1\\.com)|(_opMembers_@tvhero\\.thewhizmarketing\\.com)|(_oqMembers_@sportsaddict\\.thewhizproducts\\.com)|(_ooMembers_@yourdailytrailer\\.yournewtab\\.com)|(_olMembers_@screendream\\.yournewtab\\.com)|(_orMembers_@sporthero\\.thewhizmarketing\\.com)|(_osMembers_@gogamego\\.thewhizproducts\\.com)|(_r3Members_@www\\.mysearch\\.com)|(_ojMembers_@www\\.whizds2\\.com)|(_flMemberstest_@free\\.myformsfinder\\.com)|(_dqMemberstest_@www\\.downspeedtest\\.com)|(_flMembersAlt_@free\\.myformsfinder\\.com)|(_dqMembersAlt_@www\\.downspeedtest\\.com)|(_rcMembers_@www\\.extsb\\.searchbetter\\.com)|(_piMembers_@install\\.mysporttab\\.com)|(_phMembers_@install\\.streamfrenzy\\.com)|(_pfMembers_@install\\.myvideotab\\.com)|(_qxMembers_@install\\.utili-site\\.com)|(_qyMembers_@install\\.cryptoconvertertab\\.com)|(_r4Members_@install\\.salah-time\\.com)|(_r9Members_@install\\.speed-exam\\.com)|(_rbMembers_@Install\\.movie-canal\\.com)|(_poMembers_@www\\.linkuryds1\\.com)|(_l9Members_@www\\.plaskodss3\\.com)|(_ppMembers_@www\\.firstofferzds1\\.com)|(_qkMembers_@www\\.exploreads\\.com)|(_kfMembers_@www\\.bluecpads\\.com)|(_k2Members_@www\\.arcadejetds\\.com)|(_qiMembers_@tvguru-lp\\.olympuswaymarketing\\.com)|(_p8Members_@www\\.easywatch\\.online)|(_kcMembers_@www\\.utilitytab\\.com)|(_kdMembers_@www\\.utilitytab\\.com)|(_qrMembers_@www\\.install\\.utilitytab\\.com)|(_qsMembers_@www\\.utilitytab\\.com)|(_izMembers_@www\\.geteasyarcade\\.com)|(_qgMembers_@www\\.getinstantpdf\\.com)|(_p7Members_@www\\.tigersdeal\\.com)|(_jgMembers_@www\\.greathippo\\.com)|(_jdMembers_@www\\.greathippo\\.com)|(_juMembers_@arcadejet\\.com)|(\\{90ac1d06-caf8-46b9-9325-59c82190b687\\}))$/","prefs":[],"schema":1575056491406,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600273","why":"These add-ons collect ancillary user data among other policy violations.","name":"New Tab Data Collection Extensions"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"196e36b5-3225-4f8d-a1a0-6696ea8885f9","last_modified":1575066166785},{"guid":"{99454877-875a-473e-a0c7-03ab910a8461}","prefs":[],"schema":1575040644063,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600327","why":"The add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Smart Screen Capture"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3f98e9e7-40d0-4af5-969c-9ea1aadbf280","last_modified":1575041576477},{"guid":"/^((Stark-vpn\\.5\\.16@firefox\\.com)|(Video_Downloader_Plus@gmail\\.com))$/","prefs":[],"schema":1575038746215,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600322","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"89027d84-8871-4d44-8a14-18f029df268b","last_modified":1575040643688},{"guid":"/^((\\{b3d1c58f-b27e-4da8-bd4c-c3188346139f\\})|(\\{17101510-b5fb-4361-9e02-70a0e714b591\\})|(\\{d46a3635-4ca8-4e70-8bee-e49714896521\\}))$/","prefs":[],"schema":1574981048393,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600315","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Search hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"36b86fac-a1f2-4df5-937a-d5667e0e824d","last_modified":1575038745843},{"guid":"/^((_orMembers_@www\\.apn\\.ask\\.com)|(_jsMembers_@www\\.apn\\.ask\\.com)|(_osMembers_@www\\.apn\\.ask\\.com)|(_otMembers_@www\\.apn\\.ask\\.com)|(_owMembers_@www\\.apn\\.ask\\.com)|(_ogMembers_@seen-on-screen\\.thewhizmarketing\\.com)|(_qeMembers_@app\\.mysearch\\.com)|(_otMembers_@muzikfury\\.thewhizmarketing\\.com)|(_oiMembers_@screenaddict\\.thewhizproducts\\.com)|(_omMembers_@screenwatch\\.yournewtab\\.com)|(_okMembers_@www\\.whizds3\\.com)|(_j0Members_@www\\.gettvstreamnow\\.com)|(_64Members_b@www\\.televisionfanatic\\.com)|(_ruMembers_@getscreenmania\\.com)|(_rxMembers_@www\\.gamelocket\\.com)|(_s1Members_@www\\.deadlockds\\.com)|(_s3Members_@www\\.mysearchappwhiz\\.com)|(_rvMembers_@www\\.groovymediads\\.com)|(_s8Members_@secure\\.norton\\.myway\\.com)|(_r3Members_@free\\.mysearch\\.com)|(_sgMembers_@www\\.easyhowtoguide\\.com)|(_shMembers_@www\\.fastformsfinder\\.com)|(_siMembers_@www\\.mydirectionsfinder\\.com)|(_seMembers_@www\\.brightcast\\.com)|(_spMembers_@www\\.onlinemapsnow\\.com)|(_slMembers_@www\\.creativeinternetds\\.com)|(_hpMembers0619_@free\\.easyfileconvert\\.com)|(_ceMembers0619_@free\\.easypdfcombine\\.com)|(_euMembers0619_@free\\.filesendsuite\\.com)|(_dpMembers0619_@free\\.findyourmaps\\.com)|(_dxMembers0619_@www\\.download-freemaps\\.com)|(_65Members0619_@download\\.fromdoctopdf\\.com)|(_dbMembers0619_@free\\.getformsonline\\.com)|(_39Members0619_@www\\.mapsgalaxy\\.com)|(_ewMembers0619_@free\\.mergedocsonline\\.com)|(_flMembers0619_@free\\.myformsfinder\\.com)|(_d1Members0619_@free\\.mysocialshortcut\\.com)|(_b7Members0619_@free\\.mytransitguide\\.com)|(_ozMembers0619_@free\\.newnotecenter\\.com)|(_jbMembers0619_@www\\.onlinemapsearch\\.com)|(_jjMembers0619_@www\\.onlineroutefinder\\.com)|(_69Members0619_@www\\.packagetracer\\.com)|(_fsMembers0619_@free\\.pdfconverterhq\\.com)|(_jnMembers0619_@www\\.pdfconverttools\\.com)|(_gcMembers0619_@www\\.weatherblink\\.com)|(_brMembers0619_@free\\.yourtemplatefinder\\.com)|(_s5Members_@www\\.bluecpads1\\.com)|(_j5Members0619_@ext\\.ask\\.com)|(_5zMembersff0619_@www\\.couponxplorer\\.com)|(_1gMembersff0619_@www\\.inboxace\\.com)|(_flMembersff1219_@free\\.myformsfinder\\.com)|(_j5Membersff1219_@ext\\.ask\\.com)|(_8eMembersff1219_@download\\.howtosimplified\\.com)|(_8jMembersff1219_@download\\.myimageconverter\\.com)|(_94Membersff1219_@www\\.motitags\\.com)|(_ceMembersff1219_@free\\.easypdfcombine\\.com)|(_d1Membersff1219_@free\\.mysocialshortcut\\.com)|(_dqMembersff1219_@www\\.downspeedtest\\.com)|(_dzMembersff1219_@www\\.pconverter\\.com)|(_dpMembersff1219_@free\\.findyourmaps\\.com)|(_e1Membersff1219_@free\\.actionclassicgames\\.com)|(_e5Membersff1219_@www\\.productivityboss\\.com)|(_ewMembersff1219_@free\\.mergedocsonline\\.com)|(_euMembersff1219_@free\\.filesendsuite\\.com)|(_dsMembersff1219_@free\\.internetspeedutility\\.net)|(_fsMembersff1219_@free\\.pdfconverterhq\\.com)|(_iwMembersff1219_@free\\.allinonedocs\\.com)|(_hoMembersff1219_@free\\.directionsbuilder\\.com)|(_hpMembersff1219_@free\\.easyfileconvert\\.com)|(_hxMembersff1219_@free\\.mergedocsnow\\.com)|(_hyMembersff1219_@free\\.formfetcherpro\\.com)|(_i2Membersff1219_@free\\.streamlineddiy\\.com)|(_i4Membersff1219_@free\\.fileconvertonline\\.com)|(_j6Membersff1219_@www\\.freemanualsindex\\.com)|(_jbMembersff1219_@www\\.onlinemapsearch\\.com)|(_jaMembersff1219_@www\\.testonlinespeed\\.com)|(_joMembersff1219_@www\\.onlineformfinder\\.com)|(_jnMembersff1219_@www\\.pdfconverttools\\.com)|(_k8Membersff1219_@www\\.mymapsexpress\\.com)|(_koMembersff1219_@www\\.quickpdfmerger\\.com)|(_kxMembersff1219_@www\\.smarteasymaps\\.com)|(_l6Membersff1219_@www\\.propdfconverter\\.com)|(_l4Membersff1219_@www\\.quicktemplatefinder\\.com)|(_l1Membersff1219_@www\\.videoconverterhd\\.com)|(_ozMembersff1219_@free\\.newnotecenter\\.com)|(_lbMembersff1219_@free\\.worldofnotes\\.com)|(_q8Membersff1219_@www\\.getformsfree\\.com)|(_psMembersff1219_@www\\.freetemplatefinder\\.com)|(_pvMembersff1219_@www\\.mapmywayfree\\.com)|(_gcMembersff1219_@www\\.weatherblink\\.com)|(_65Membersff1219_@download\\.fromdoctopdf\\.com)|(_sxMembers_@www\\.mapsmasteronline\\.com)|(_j6Members_@ext\\.ask\\.com)|(_66Members_@download\\.fromdoctopdf\\.com)|(_htMembers_@free\\.gamingwonderland\\.com)|(_5zMembers_@www\\.videodownloadconverter\\.com))$/","prefs":[],"schema":1574953312771,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598777","why":"These add-ons collect ancillary user data among other policy violations.","name":"New Tab Data Collection Extensions"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f541ab9d-f671-421f-9aed-b27c63d11377","last_modified":1574981047945},{"guid":"/^((\\{7410146d-cf60-4175-a74a-0a7f7785bbff\\})|(\\{e9083fad-c9c7-4ff3-8bb5-b300d3f33546\\})|(\\{6bed141b-56b5-4209-84e1-93c67bf87711\\}))$/","prefs":[],"schema":1574883692223,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1599563","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"51353b78-a8ca-4411-98b8-e9585c03f8c7","last_modified":1574953312403},{"guid":"/^((\\{d251b448-d876-4f25-87b3-9dd858a077df\\})|(\\{3f711bc3-65bc-41bd-842f-d21b6cb90313\\}))$/","prefs":[],"schema":1574869966668,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1599833","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ff958539-ae4f-4008-8413-a3fd86950380","last_modified":1574876724352},{"guid":"/^((\\{cce3a95c-5f17-4ca1-aa0b-b5a8dc3a1b45\\})|(\\{f7c272df-f8e3-419f-b48d-759b9326d51a\\})|(\\{75a25121-873d-4da0-9aec-c4fa83cf13d3\\})|(\\{042080fd-5127-409c-88e7-47136fda641f\\})|(\\{12b167db-911b-4091-b8e5-e9292643610f\\})|(\\{d386a8b2-fba8-47ab-924d-f43d86d9edd0\\})|(\\{995f0889-b95c-4ae7-9510-e6fddf76b62c\\})|(\\{9be5400b-715c-4f49-9085-e1bdfda4a873\\})|(\\{6680a4ae-e659-47f5-9e4e-0ee72494e3af\\})|(\\{2215fd58-f9b5-4d6d-be8a-805716380cac\\})|(\\{041e6a70-edc0-4e6b-a799-0b15d1c95ddb\\})|(\\{4ba68aef-ec5e-412b-9516-d2a7401c0a22\\})|(\\{5c97c09b-6a3f-43cb-950e-c02074193751\\})|(\\{de5d0076-fa35-468e-8b72-6b5524be0684\\})|(\\{702841c9-cd9b-411f-9c8f-7616e75ce749\\})|(\\{bdfaccd7-c343-435a-b22a-fbb8052bd40b\\})|(\\{3a37182d-5653-4c5e-9729-eee005d24dfd\\})|(\\{18a44708-ff7b-45f6-96de-f2ce4373d185\\})|(\\{6c632bb3-04d3-4744-b04d-cd5dbfef41d2\\})|(\\{7ae0db73-6402-44f7-b4f3-81b7ce81bf6a\\})|(\\{716440c3-3ced-41a7-a5b3-ee1da1bfa9f2\\})|(\\{abf84dc9-1ff8-47df-a68b-70e2e8627610\\})|(\\{a369dded-b0bc-446a-b900-c56eaa74042d\\})|(\\{828e6aed-955b-4a9f-9ec2-126f7dc51f37\\})|(\\{58f9ab34-78e6-4432-912a-c13fafc24a03\\})|(\\{68b7cc55-0874-4f91-a519-7b8283b7e974\\})|(\\{71545b8d-0ebb-4767-8864-5fc8dbdbbdee\\})|(\\{217e14c5-4d4b-4691-8428-48ad484f8c04\\})|(\\{6d20b3d7-ccd6-4fa5-ae08-0343193b5518\\})|(\\{ffdb8967-9d19-4377-a728-735f21941d15\\})|(\\{5edc78a5-f41b-4e4b-90e3-ef4fa429feef\\})|(\\{12fb0651-0d2f-4c97-aa37-9121bade678c\\})|(\\{b7c5d63f-b160-48fb-a1fc-485d5e014c63\\})|(\\{4e72d89b-8481-40ae-93d9-93d3316a5d40\\})|(\\{edd994cd-7724-43d3-807b-19bc2749187a\\})|(\\{238a0064-70ee-4d1e-8dca-4bb5a893b44f\\})|(\\{3671ddcb-11ea-4f05-b97d-989d94c42279\\}))$/","prefs":[],"schema":1574789062671,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1599537","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"310e84ca-b967-4d81-b990-4d0697d62a6e","last_modified":1574869966292},{"guid":"/^((oawef0q29r43oq2\\.com@oawef0q29r43oq2\\.com)|(950opeokfp242@950opeokfp242\\.com)|(jggzkdudsuumeasqvler@jggzkdudsuumeasqvler\\.com)|(bdcixfqemzjezxbnzicj@bdcixfqemzjezxbnzicj\\.com)|(ne3787m9ykowhnicg8yx@ne3787m9ykowhnicg8yx\\.com)|(799v8e4cklkpetj0l56x@799v8e4cklkpetj0l56x\\.com)|(o7b1gs6trq2nkaocoejp@o7b1gs6trq2nkaocoejp\\.com)|(sta528sfzizg0ay009cs@sta528sfzizg0ay009cs\\.com)|(8x837zsyl6iw9hpjxu2w@8x837zsyl6iw9hpjxu2w\\.com)|(3bwrbcltn5fjo73lci00@3bwrbcltn5fjo73lci00\\.com)|(kmqm7cm5tk1l5s55yq7j@kmqm7cm5tk1l5s55yq7j\\.com)|(9n4v5kw9bf8e1f4dl0rq@9n4v5kw9bf8e1f4dl0rq\\.com)|(o4d5u4gzx14iqfuyobjr@o4d5u4gzx14iqfuyobjr\\.com)|(2ln3gtttxoz3tjerbbta@2ln3gtttxoz3tjerbbta\\.com))$/","prefs":[],"schema":1574538091411,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1599186","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0ee9e971-ba48-4d51-a907-a3b5533e8e28","last_modified":1574707139043},{"guid":"{3d09bd90-da37-41b5-a719-8da173e9870f}","prefs":[],"schema":1574441398813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598708","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Google Translate (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e6a12342-3936-41cf-910d-cc133db44d2a","last_modified":1574445055964},{"guid":"Stark-vpn.5.14@firefox.com","prefs":[],"schema":1574438767458,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598688","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Stark VPN"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5d2478e3-cbaa-4192-89f0-5abf3ea10656","last_modified":1574441398416},{"guid":"/^((\\{ac9ec764-a247-4d71-8807-20aa20f93e17\\})|(\\{4253de43-775d-48bc-8e08-fb3f58a2ddaf\\}))$/","prefs":[],"schema":1574434609524,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598672","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Search-hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fa044b4d-b39e-4ee0-a737-07aca2d672ef","last_modified":1574438767139},{"guid":"/^((\\{cc08012a-f9cd-4bfc-b526-ad8773934a0c\\})|(\\{16fd1825-3f7d-4c38-aa98-78cc4f0a6758\\})|(\\{87261aed-8d85-4037-81fb-4988ae80ee23\\})|(\\{90f51854-74d4-4df9-bf4c-b86f30346bd8\\}))$/","prefs":[],"schema":1574365292775,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598646","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"YD"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"46ed3cc3-8534-484a-bc58-349824debec6","last_modified":1574434609189},{"guid":"@youtube-adblocker-addon","prefs":[],"schema":1574334260915,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598287","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"YouTube Adblocker"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"126a0720-a22f-41f1-876f-0a3e18b79d2b","last_modified":1574342360895},{"guid":"/^((youtubetomp3@addons\\.youtube\\.com)|(addons-mozilla@youtube-to-mp4))$/","prefs":[],"schema":1574260409481,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598242","why":"The add-on violates Mozilla's add-on policy by opening websites with malicious intent.","name":"YOUTUBE to MP3"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9729654a-6cd1-4e20-8cf5-47a3ff544ef5","last_modified":1574334260570},{"guid":"/^((\\{333d6dd8-43ed-4f01-944d-b7c737a5db72\\})|(\\{f5712532-777e-4080-b6b9-d548040f7675\\})|(\\{abf3f8d7-bc95-4dd5-ab96-c390ad5f8756\\})|(\\{f769002a-608d-4a8c-adc4-05f4857ff3ae\\})|(\\{1980667f-9bde-4e7e-8d0c-132db12c1b30\\}))$/","prefs":[],"schema":1574192492672,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1597784","why":"Use of affiliate redirects in violation of policy","name":"Affiliate Redidrecting Add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"28831b71-8a9a-466e-9f34-1f40f2f0e27a","last_modified":1574260409142},{"guid":"/^((_1gMembers_@www\\.inboxace\\.com)|(_39Members_@www\\.mapsgalaxy\\.com)|(_5zMembers_@www\\.couponxplorer\\.com)|(_65Members_@download\\.fromdoctopdf\\.com)|(_flMembers_@free\\.myformsfinder\\.com))$/","prefs":[],"schema":1573749618972,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1594461","why":"This add-on does not provide users with an opportunity to refuse the storage of or access to cookies.","name":"New Tab add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d39750c3-a305-4487-bc0f-21500c3597dd","last_modified":1573804224556},{"guid":"/^((\\{c8476e06-0a50-41ec-a840-a2db436cf38c\\})|(youtube\\.downloader@firefox\\.dev)|(youtubedownloader@firefox\\.com)|(youtubehddownloader@firefox\\.com)|(youtube\\.d@firefox\\.dev)|(advblock@blocker)|(YouTube@HD\\.Downloader)|(adt-3\\.0\\.7@blocker)|(\\{7131880e-d327-4802-b5ed-fee33c281abd\\})|(\\{5cb84843-504e-406e-8fb7-051c7fc3c9d3\\})|(\\{d8686bde-e666-4084-ae01-c75aa7a30f93\\})|(\\{96d35545-d94a-4ee1-bc43-d3055650587c\\})|(ali-image-search@4\\.0)|(\\{e7634c48-0d36-448e-891e-b2036beebcd0\\})|(\\{442de29c-b710-45d4-b121-7b4be387c327\\})|(lite-vpn-4\\.1\\.14@gmail\\.com))$/","prefs":[],"schema":1573674093610,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1596468","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons injecting remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"19c04aaf-c02d-4583-9978-c519245cd4fb","last_modified":1573749588529},{"guid":"extension@safeguard.ws","prefs":[],"schema":1573501291938,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1595616","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Safe-Guard"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"53d8f35e-99ec-44fd-8082-3b713a5afcb3","last_modified":1573507879434},{"guid":"crisorgblack@rampampam","prefs":[],"schema":1573155692372,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1595200","why":"This add-on contains unexpected features in violation of our policies.","name":"Flash Update"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2bb20972-0d56-44c8-a5d6-0e73a1827e92","last_modified":1573247974595},{"guid":"/^((\\{be2f72d6-0c71-4fd0-8914-e27057e51099\\})|(adblock-2019@youtube-addons))$/","prefs":[],"schema":1573060222748,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1594498","why":"These add-ons are suspected deceptive and have been disabled for your protection.","name":"Deceptive ad-blocking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"477174ca-470a-40ff-bf8d-2de81c2dc458","last_modified":1573063322832},{"guid":"/^((\\{8f11d935-4bcf-42c8-88c1-7e32e4541c98\\})|(\\{b0a6cb7d-3e77-4a96-aea5-7d0090e55832\\})|(\\{c5a5fd9f-8e84-460d-93dd-499e23b530e9\\})|(\\{ac7c91e8-6797-42ec-a202-5b34dacaa83a\\})|(\\{3784e311-4758-4180-b3e2-2ae42bfb081d\\})|(\\{10f3b1e0-4b97-4cc2-9af6-06a9162ec022\\})|(\\{e1109008-6d70-453d-a84e-3cc0c44af07e\\})|(\\{bb7190ac-8aeb-4a8d-83cf-89c179a4d65e\\})|(\\{a752512a-8287-40c0-97f2-071146da2caf\\})|(\\{185dbeea-416b-4fd6-8512-9ddb941e50b5\\})|(\\{d199eeb9-0964-4dff-94d2-69116fd03418\\})|(\\{d37310a3-08dd-4cb8-a276-3f2bee174555\\})|(\\{b239ce6b-2513-4758-a74e-eae3c8f0a04a\\})|(\\{f0f240d7-ae38-4bf4-a8e2-23d775eb07f4\\})|(\\{1804789c-d056-4887-839c-7a0dcab3be83\\})|(\\{d6115dfe-e3d2-44af-8361-1308c234b14c\\})|(\\{48a804b3-cf0f-4aa1-b798-82e944d7afb0\\})|(\\{3026b451-392b-47d5-b60f-995fb075cfd1\\})|(\\{e050f24c-8e06-4d6f-a962-c6073788ac29\\})|(\\{f45a7c28-423a-46ff-abb6-fc855912d074\\})|(\\{699d463b-dd6c-4cde-bad8-81beb345cb85\\})|(\\{f3a3544e-905d-4cc2-99e2-dd4c928bfc24\\})|(\\{2fa8e43c-084a-4fd7-9873-2d462f535929\\})|(\\{a7a69509-aa1d-42b3-8c8d-b3a2885f9aa7\\})|(\\{f4ca82a2-58cc-4d4f-ab95-1ca0424dcd52\\})|(\\{6f9cc262-0164-47e5-b138-024a525d2498\\})|(\\{b3061ee4-1281-482a-8022-f351c023db8d\\})|(\\{48d4fb44-5ebe-49a0-a731-541f11491d92\\})|(\\{fe8a3e05-e9ff-48d2-9291-b97bd3cba97b\\})|(\\{b7eb6ae4-2476-4ba0-a005-b868eb4bf9b2\\})|(\\{2992ca99-6c98-4864-afbf-d51c9c35ed5a\\})|(\\{2017e4f8-a7fb-421f-a1c5-d7b62189f1db\\})|(\\{d44be860-e0d3-4df2-97e1-eef2075474bc\\})|(\\{d6d4e269-00c4-4eeb-b458-d76222ff52e9\\})|(\\{a0242f56-118b-415c-83d6-8eac264dad4c\\})|(\\{25e8b980-6548-45c4-bb58-a641c13b9807\\})|(\\{40fae6f3-c629-4b2d-b690-bf022ebb2cd8\\})|(\\{359c22b8-d670-4b0e-ba77-e29615b633fb\\})|(\\{8fce6deb-83f3-4695-9c5d-76bf366757bf\\})|(\\{1edcaf80-0c4a-4380-9752-4f2953b8a053\\})|(\\{664101ff-e2e4-43b3-b470-ddb71642df7a\\})|(\\{fee7c990-6f9c-4b44-91fb-74998b2498c5\\}))$/","prefs":[],"schema":1573055872812,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1594479","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5e200b1f-e1d0-4819-89e3-3bd34f90c5c1","last_modified":1573059528009},{"guid":"/^((\\{697995ae-b9ee-4556-824b-8e82621f45dd\\})|(\\{6971a39a-916e-4b3f-a14f-bac10571b9f0\\})|(\\{d1047c9a-157b-4f87-a223-a6e6a150e1f8\\})|(\\{f23c6402-4b76-4aa4-b49a-6d083f92ae88\\})|(\\{1a7401bd-96e7-4857-bc5b-7ee66cdecc3c\\})|(\\{ccec0135-ee34-4713-a10c-607a45956d9b\\})|(\\{70428092-3df7-4151-b973-974ca511ae33\\})|(\\{cf2cc560-d765-4b59-b7b7-09a0ae4292f2\\})|(\\{880b8863-e204-47fe-8c8d-db29a10b8c8a\\})|(\\{c95951f5-2b2b-481a-9975-e38abf1f881b\\})|(\\{865df6b7-3ac1-4bd8-be0b-4cc8bb6aab7e\\})|(\\{b6124efd-aa84-42bf-80c7-01c078dc9ef2\\})|(\\{f888f1c9-a936-4ed1-a7f1-5a835ea9e6a0\\})|(\\{c434dae6-9ece-4488-8e9d-0d06d523d95a\\})|(\\{5531f988-1512-4b18-937c-7bc7e209c70f\\})|(\\{fd4fc8ae-fe95-490f-8013-6964455afb34\\})|(\\{84189ee5-4494-4068-b467-49a1b946cba1\\})|(\\{21f0db68-3156-41b4-8180-a48824b35962\\})|(\\{6a3e8874-61b4-40bf-923c-199493cfd284\\})|(\\{683172b8-3a91-4cbc-92f3-2a385f321c98\\})|(\\{269136f3-cd51-4e2d-b1eb-74878262fcef\\})|(\\{1ca4e866-0d45-4898-8138-398f49925cab\\})|(\\{9d53c5bc-9cf2-4c50-9ce5-8aaa113de07f\\})|(\\{19b80768-1437-4d18-972b-41df04a3b0a9\\})|(\\{7090cae8-4f58-4f07-9e53-b37cb4f3f8ad\\})|(\\{31911e49-6d40-4435-b152-c333096ae185\\})|(\\{4910e0bd-d803-4785-9ec4-6e8c9414a53e\\})|(\\{f3a131a1-73fe-4e8c-b499-629aa7a3e405\\})|(\\{94e53c23-cb3e-43c9-b29f-43ea953c61f6\\})|(\\{0a024f33-43b3-4d15-89dc-694964063869\\})|(\\{fa561d95-e80a-4ab9-b71c-556c7fce3b83\\})|(\\{f78a3354-dafd-48e6-8392-0ed1aa8e8a91\\})|(\\{a6b84ecd-25df-41c5-8979-a1a9d962d78b\\})|(\\{5d7282aa-0600-4a16-ad0e-917d20232d2a\\})|(\\{90e0c87b-f534-486f-b5fe-beddad5cfcfb\\})|(\\{c64d3989-b6f6-4eec-b86f-b549a5b2056a\\})|(\\{ccdd4a2e-11a4-4922-8bd2-d8ff05d3194f\\})|(\\{b9f73347-01c2-4727-85cd-7521a2a2841c\\})|(\\{1be85529-e82e-4dfe-aa33-3c62fc37ae8e\\})|(\\{b91fff1b-d45e-47b2-95da-5d774319b88d\\})|(\\{8c81cdd1-4fc2-4510-83c2-641ea7ee7c24\\})|(\\{e5db6079-1786-4072-80f5-d5c894074cc2\\})|(\\{5981e135-789c-4709-8b22-85e0665c8396\\})|(\\{a235175f-3391-43c6-bf58-34c1f6b8f4a6\\})|(\\{617ebed4-628f-4ca3-92de-bec510cab1dd\\})|(\\{3aaa37bc-0fa9-4e34-abbb-d5a34ff729a3\\})|(\\{2d3521bc-914f-4990-ba0a-5d488f176f4e\\})|(\\{17c7768d-c672-4e99-aef2-2fdd35a96804\\})|(\\{7e517ca8-6f65-4de2-869f-dddce73a274c\\})|(\\{9c99bd01-7567-47e6-80f2-bf229b97415f\\})|(\\{5357eef8-cc2f-496a-82d2-5f3b6ca5f7b1\\})|(\\{b83a8605-057b-46ef-86ed-d53db9a9f16f\\})|(\\{55383502-1800-4cf8-8522-df16d6cb9809\\})|(\\{14d742cf-cd34-46a5-984e-1e28fc16e55c\\})|(\\{f5d6d1af-6a02-4eb4-a7fb-ec3486239875\\})|(\\{fac56640-6cad-49a2-b224-9424e18b4009\\})|(\\{79c16aa2-f8a9-40d3-9e81-74884b987e48\\})|(\\{b02eae40-18d6-4e28-8af7-6b161a458769\\})|(\\{9398d059-fc67-43e2-8548-bc60cfa82998\\})|(\\{cd0a4138-8670-4a6b-b15c-0cad1ef290e6\\})|(\\{503dc84b-9967-4b1f-8199-cee55bcd919e\\})|(\\{d0245186-049d-4594-88f9-3fe54e735551\\})|(\\{7208c980-005e-426c-991f-1cd22227b7fb\\})|(\\{19dcb8c5-3577-4279-b70f-eb48a594f821\\})|(\\{fda599e0-d842-47d9-8c8e-21c26ef0afa6\\})|(\\{470eab98-7ad9-49a5-883f-42cb51996fc7\\})|(\\{8c353e56-0d27-4b83-b081-6e012bda5601\\})|(\\{a1931145-d58d-41a2-b190-04549ef9c225\\})|(\\{916d2e1d-aabf-45aa-84ec-a9bb9ee40391\\})|(\\{f2aa9466-c326-440c-b9a8-f2fef8571341\\})|(\\{52a02f53-b805-41d1-af02-0283da3ef383\\})|(\\{aad686bf-b881-4177-8a8f-12c9455e319f\\})|(\\{cec578f9-9103-44f8-9b41-bbe26ba8a993\\})|(\\{6891bcc0-4ad2-4531-9699-ce82528ddcc0\\})|(\\{a5d93cd7-b187-46f8-961b-9f4fc0b4f37f\\})|(\\{b220428d-2f07-4ecd-9114-3a3261d5f7fc\\})|(\\{b0f4740a-6e0f-489e-ab86-3fb3abb7dd15\\})|(\\{611781ad-a17d-4487-8caf-bf72818bacfc\\})|(\\{0b4efcee-b7eb-4151-bdd2-b2f66fedd4fa\\})|(\\{25da4f88-e61c-4823-9c32-864c3a348aab\\})|(\\{e44b4144-0a1a-4c29-95c0-50083ed5c606\\})|(\\{4dbf4218-1a54-4fa1-8448-0521da5b5391\\})|(\\{7140247a-7ee6-4474-9fe9-0cdf6ec7e2e7\\})|(\\{50eac97c-bb52-4107-a3be-6d40eba5b229\\})|(\\{4bd98a1f-d8f6-411a-a1e8-0cf1b482c682\\})|(\\{a7d60016-47ac-4480-b2bc-83dd4e20b096\\})|(\\{a2657d9a-94d1-41e8-a1e5-72e60c032afe\\}))$/","prefs":[],"schema":1572982905588,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1594460","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f1eaa18e-75c8-4134-87cf-5a02e3349e44","last_modified":1573055860762},{"guid":"/^((web@3753c687-a0c6-4cd1-b8ff-bab3c76b1236)|(ext@286f29a6-184e-4195-b1e5-1212ebf372a0)|(web@fd9b3d8a-1178-45ab-92a8-a172d0b70000)|(web@e7a72615-19b1-42a5-8e34-ddfa89ce0000)|(web@af1e58bc-4ead-11e8-81fc-065ad97f0000)|(web@7398cc9a-684e-40a4-afe1-b620e1a80000)|(web@2DC2452E-6999-11E8-A1CA-6C6318C60000)|(web@B7CCDA78-8455-11E8-91A4-ED179E46D000)|(web@8842eb7c-5f5c-4d33-aabe-81c27ae87000)|(web@ca5a2803-6421-4582-97e1-9e30fe440000)|(web@00022358-d56d-4f5e-a89c-d4534d7c5565)|(\\{ff26fde6-4d73-49a3-bd6c-1ca7876484fc\\})|(290e9605-6fb1-4c8b-a3d4-0084bfad201e@UniversalConverter)|(web@EmailNewTab)|(web@WhatsMySpeed)|(test@FormsHub)|(web@Forms2)|(newweb@MapsNewTab)|(\\{4b1d718d-58ae-404b-a5d2-b7b977cfcb56\\}))$/","prefs":[],"schema":1572291693826,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1592597","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3bdd5b53-ddb1-4fb0-b250-d75a604a5546","last_modified":1572443230107},{"guid":"/^((\\{a059a924-e43a-495d-9620-ad8c111d62d9\\})|(\\{79f4bfc6-b1da-4dc4-85cc-ecbcc5dd152e\\}))$/","prefs":[],"schema":1571600493541,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1589974","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Page Translator"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9e8f80d6-a818-4004-9a20-deec55f3fb96","last_modified":1571605630002},{"guid":"/^((firefox@browser-security\\.de)|(firefox@smarttube\\.io)|({0fde9597-0508-47ff-ad8a-793fa059c4e7})|(info@browser-privacy\\.com)|({d3b98a68-fd64-4763-8b66-e15e47ef000a})|({36ea170d-2586-45fb-9f48-5f6b6fd59da7})|(youtubemp3converter@yttools\\.io)|(simplysearch@dirtylittlehelpers\\.com)|(extreme@smarttube\\.io)|(selfdestructingcookies@dirtylittlehelpers\\.com)|({27a1b6d8-c6c9-4ddd-bf20-3afa0ccf5040})|({2e9cae8b-ee3f-4762-a39e-b53d31dffd37})|(adblock@smarttube\\.io)|({a659bdfa-dbbe-4e58-baf8-70a6975e47d0})|({f9455ec1-203a-4fe8-95b6-f6c54a9e56af})|({8c85526d-1be9-4b96-9462-aa48a811f4cf})|(mail@quick-buttons\\.de)|(youtubeadblocker@yttools\\.io)|(extension@browser-safety\\.org)|(contact@web-security\\.com)|(videodownloader@dirtylittlehelpers\\.com)|(googlenotrack@dirtylittlehelpers\\.com)|(develop@quick-amz\\.com))$/","prefs":[],"schema":1571235422841,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483995","why":"Sending user data to remote servers unnecessarily, and potential for remote code execution. Suspicious account activity for multiple accounts on AMO.","name":"Web Security and others"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.0.9","minVersion":"0"}],"id":"96b2e7d5-d4e4-425e-b275-086dc7ccd6ad","last_modified":1571235848152},{"guid":"{381f21b1-95bf-4042-bc5c-3a40b2a03f10}","prefs":[],"schema":1571235400908,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1583468","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Francezon"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.0","minVersion":"0"}],"id":"dd1261a3-6944-4f51-8118-b0a8f2055d69","last_modified":1571235422828},{"guid":"addon@shoppingguru.info","prefs":[],"schema":1571235356487,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1583862","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"ShoppingGuru"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2104.1111.1110.4221","minVersion":"0"}],"id":"70655a4b-064d-44ab-8d0e-3bec419343ee","last_modified":1571235400895},{"guid":"sparalarm@chip.de","prefs":[],"schema":1571082106908,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1586677","why":"The add-on is force-installed for users through sideloading, bypassing user consent.","name":"Sparalarm"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"14.39.1","minVersion":"0"}],"id":"19f599bd-2226-49e2-90fd-685fd106fc3d","last_modified":1571235356473},{"guid":"/^((\\{65a93e3b-e350-440d-bf8f-68e18e38d27d\\})|(\\{9db1fb44-b661-4719-9d90-67af3e6a314c\\}))$/","prefs":[],"schema":1571059482617,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1586834","why":"This add-on contains an unexpected feature that is collecting ancillary data.","name":"Google Custom Logo and Search Counter"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"be5d02cb-0a36-4c20-b184-509b86d243c5","last_modified":1571060494402},{"guid":"{c4d46c5f-9832-4057-8a1d-635949ed6a55}","prefs":[],"schema":1570909292250,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587121","why":"This add-on makes use of search settings with unexpected behavior.","name":"LM Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"57c094fd-9a37-4ede-9bb0-a1c2d66415f0","last_modified":1571059471124},{"guid":"/^((\\{2B0EC7FF-F330-4e0c-8B33-EFFEC8D39E70\\})|(\\{f70c89b0-bbf3-41a9-bc1f-0912dcf53f33\\})|(@Classifieds)|(@Converter)|(@Coupons)|(@Directions)|(@DownloadManager)|(@Email)|(@Fitness)|(@Flights)|(@FormsApp)|(@Games)|(@Maps)|(@News)|(@Package)|(@Photo)|(@Radio)|(@Recipes)|(@search-encrypt)|(@search-incognito)|(@searchencrypt-b)|(@searchencryptblocker)|(@Speedtest)|(@Sports)|(@Transit)|(@TV)|(@Weather)|(aweapps@Email)|(classified@jetpack)|(email@searchleasier\\.com)|(foo-bar@example\\.com)|(games@jetpack)|(JS@Converter)|(login@easier)|(maps-webext@jetpack)|(Maps@SSA)|(web-ext@games\\.com)|(web@ShoppingNewTab)|(web@SocialNewTab)|(web@WebDesignNewTab)|(webapp@LoginAssistantTab)|(webex@Converter)|(webex@Email)|(webtab@Shopping)|(webtab@Social)|(webtab@WebDesign))$/","prefs":[],"schema":1570701667316,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587782","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Addons collection ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"986aac02-beba-40b2-b463-d8447a778a2e","last_modified":1570713923845},{"guid":"{2a78ab07-91b2-4086-889d-619e43d5e5f8}","prefs":[],"schema":1570563693690,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587734","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"SVSrch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bb76b262-7087-4cf2-a82f-12cfbf91239a","last_modified":1570701652245},{"guid":"{2e106fa4-ee23-4b4a-9ed0-f93edee539b5}","prefs":[],"schema":1570534326932,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587074","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"SVsrch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ab0b6868-6077-4d47-bd58-1df3f572c04d","last_modified":1570540061375},{"guid":"/^((oigfsj9434lavvv@oigfsj9434lavvv\\.com)|(mity82900jf2@mity82900jf2\\.com))$/","prefs":[],"schema":1570527949565,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1586780","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Page organizer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3ece7523-cdec-46cf-ac20-9e939a4d4802","last_modified":1570534316570},{"guid":"/^((web@MapsNewTab)|(ext@WhatsMySpeed)|(ext@MyEmailCenter)|(ext@TemplateHelper)|(ext@FreeLiveRadio)|(ext@FreeFormsNow)|(web@ConverterNewTab)|(web@EmailAccountNewTab)|(spweb@EmailNewTab)|(web@PackagesNewTab)|(web@ManualsNewTab)|(web@ClassifiedsNewTab)|(web@FormsNewTab)|(web@AncestryNewTab)|(web@RecipesNewTab)|(web@TVNewTab)|(web@WeatherNewTab)|(web@translationsNewTab)|(web@SportsNewTab)|(web@CouponsNewTab)|(web@FlightsNewTab)|(test@InstaFormsFinder)|(web@NewsNewTab)|(web@SpeedTestNewTab)|(web@TransitNewTab)|(web@BibleNewTab)|(web@RadioNewTab)|(web@TemplateNewTab)|(web@PhotoEditorNewTab)|(web@AudioConverterNewTab)|(web@GamesNewTab)|(web@VideoConverterNewTab)|(test@TheWeatherChecker)|(web@InterestsNewTab)|(test@SearchHub)|(web@CalendarNewTab)|(web@TaxesNewTab)|(web@BankNewTab)|(web@CrimeReportNewTab)|(web@CryptoNewTab)|(web@eBooksNewTab)|(web@FinanceNewTab)|(web@FitnessNewTab)|(web@JobsNewTab)|(web@MoviesNewTab)|(web@NotepadNewTab)|(web@OfficeNewTab)|(web@PCTextingNewTab)|(web@PhotoNewTab)|(web@ScrapbookNewTab)|(web@UtilityNewTab)|(test@FlightTrackerUpdate)|(test@FreeForms)|(test@UniversalConverter)|(test@MyEmailCenter)|(test@TemplateHelper)|(test@FreeLiveRadio)|(test@FreeFormsNow)|(ext@FormsHub)|(webext@WhatsMySpeed)|(webext@WatchTelevision)|(webext@EmailExpressTab)|(webext@MyConverterTab)|(webext@TemplateCreatorTab)|(webext@LocalForecastTab)|(webext@EZDirectionsandMapsTab)|(webext@MapsNDirectionsTab)|(webext@MyEmailCenter)|(webext@TemplateHelper)|(webext@FreeLiveRadio)|(webext@FreeFormsNow)|(webext@InstaFormsFinder)|(webext@TheWeatherChecker)|(webext@FlightTrackerUpdate)|(webext@FreeForms)|(webext@UniversalConverter)|(webext@FormsHub)|(webext@SearchHub)|(ds@DirectSearchPro)|(webext@AppDiscoveryTools)|(webext@LiveRadioProTab)|(webext@TheWeatherPilotTab)|(webext@ExpressPackageFinderTab)|(webext@LoginAssistantTab)|(webext@SelectSearch)|(addon@SelectSearch)|(webext@ExpressSpeedChecker)|(webext@BreakingNewsPlus)|(webext@WorldEventsToday)|(addon@WorldEventsToday)|(webext@OnlineTVAccess)|(webext@FindingFormsPro)|(webext@EasyClassifieds)|(webext@SpeedCheckerPlus)|(webext@GetFreeCoupons)|(addon@MyEmailChecker)|(app@FlightTrackerUpdate)|(app@WatchTelevision)|(app@WhatsMySpeed)|(app@MyEmailCenter)|(app@TemplateCreatorTab)|(app@FreeLiveRadio)|(app@FreeFormsNow)|(app@InstaFormsFinder)|(app@SearchHub)|(app@TheWeatherChecker)|(app@FormsHub)|(webtab@Maps)|(app@FreeForms)|(app@UniversalConverter)|(app@EmailExpressTab)|(app@MyConverterTab)|(app@TemplateHelper)|(app@LocalForecastTab)|(app@EZDirectionsandMapsTab)|(app@MapsNDirectionsTab)|(app@AppDiscoveryTools)|(app@LiveRadioProTab)|(app@TheWeatherPilotTab)|(app@ExpressPackageFinderTab)|(app@WorldEventsToday)|(app@OnlineTVAccess)|(app@SpeedCheckerPlus)|(app@EasyClassifieds)|(app@GetFreeCoupons)|(app@FindingFormsPro)|(app@TemplatesHereTab)|(webtab@Packages)|(webtab@Forms)|(webtab@Email)|(webtab@Radio)|(app@MyEmailChecker)|(webtab@TV)|(webtab@Classifieds)|(webtab@Ancestry)|(webtab@Weather)|(webtab@Manuals)|(webtab@SpeedTest)|(app@MyDailyCalendar)|(webtab@Transit)|(webtab@Converter)|(webtab@Coupons)|(webtab@Recipes)|(webtab@News)|(webtab@Sports)|(webtab@translations)|(webtab@Template)|(webtab@AudioConverter)|(webtab@Flights)|(webtab@Photo)|(webtab@Bible)|(webtab@PhotoEditor)|(app@MyVideoConverter)|(webtab@Games)|(app@MyLoginHelper)|(app@QuickEmailAccess)|(app@MyRecipeFinder)|(app@MyFlightFinder)|(webtab@Fitness)|(webtab@VideoConverter)|(webtab@Taxes)|(webtab@Bank)|(webtab@Calendar)|(webtab@CrimeReport)|(webtab@Crypto)|(webtab@eBooks)|(webtab@Finance)|(webtab@Interests)|(webtab@Jobs)|(webtab@Notepad)|(webtab@Movies)|(webtab@Office)|(webtab@PCTexting)|(webtab@Scrapbook)|(webtab@Utility))$/","prefs":[],"schema":1570483391885,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587028","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bd51d01b-20bf-4682-a588-c03e988eb746","last_modified":1570527938865},{"guid":"{67d4f93e-6857-45ab-9e7a-158cc61f15d2}","prefs":[],"schema":1570052453260,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585735","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"zidaza"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6ce8f6d0-5cef-457c-b7e4-d5c08d61531a","last_modified":1570053270833},{"guid":"/^((\\{049aedf7-b1dc-49b7-9ef4-51cd026f8592\\})|(\\{27c743d8-4731-44ff-9194-9f663df6a3c3\\})|(\\{8bf2bae7-273a-4496-9073-c1ad6688cda8\\})|(\\{b9cfeaaa-2465-4b21-903a-7955fcd4e59a\\})|(\\{07848e3a-f42b-48bf-ac70-f918a7b79258\\})|(\\{02b2eed4-2ca5-4d6f-b19a-a8b1738501f0\\})|(\\{d2af93ad-a542-4b30-b929-7437c2b02afe\\})|(\\{b8e33742-5b78-4c08-89e1-94ebe22fbafe\\})|(\\{502b29ef-b05f-4043-949b-069160f39e32\\})|(\\{2c60eb88-2f38-4b1a-9329-eaa18ad41720\\})|(\\{ccb18b6f-0680-4347-afd5-5ed864114f05\\})|(\\{c9622009-2b37-44f1-a5cf-f0aa869a6bff\\})|(\\{cc241172-6e33-4395-bc68-dd76fa6b6091\\})|(\\{904a47b7-c2c3-465d-a7f9-326c51e8fee0\\})|(\\{365ae96e-15f8-445f-816e-74cd5897613c\\})|(\\{527ccde6-f15c-4437-a061-052593c2ac5b\\})|(\\{063b5c1a-b708-4f05-873b-b3e161d1d49a\\})|(\\{d5422b3f-fcb3-4eca-b2a9-b4b8010fd4c1\\})|(\\{60bab1b2-e7fc-4683-85ef-2ec6cdb5e148\\})|(\\{aad32311-3e2f-419d-8e6b-82c4e28c44d3\\}))$/","prefs":[],"schema":1570045305267,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585810","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Add-ons using obfuscating code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a942e2e5-6a55-439f-b078-6288da1cfe68","last_modified":1570052444069},{"guid":"/^((\\{6be4ca4f-8b7e-4d91-994b-24a7c5384086\\})|(\\{1709abf0-19ba-48a8-a9dc-03e931b17f48\\})|(\\{5d5af81d-6501-4d77-a64c-ad2cdc34ceae\\})|(\\{b7de0a65-0b4b-4b74-a4e6-70fc2c36a80a\\})|(\\{64704bd2-ced7-4dd8-a5d2-d20df624288f\\}))$/","prefs":[],"schema":1570036215253,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585723","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Add-ons using obfuscated code."},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4e487385-fe8d-451a-909e-a6f6609b0d7b","last_modified":1570036367326},{"guid":"{5dbbb375-3520-4ace-bb84-df9d92ae1a25}","prefs":[],"schema":1570017905113,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585708","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Wappalyzer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9a12e67a-ef6d-4f06-9de6-7dc8bcb19517","last_modified":1570036206290},{"guid":"{d41cf5b5-67b7-4510-8633-d8e2c0ec5d46}","prefs":[],"schema":1570001773270,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585625","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Xisey"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"87d99543-1e31-46b3-9fd1-91d9c79ff592","last_modified":1570017897427},{"guid":"mozilla_cc3@internetdownloadmanager.com","prefs":[],"schema":1569844559791,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585071","why":"Some versions of this add-on violate Mozilla's add-on policies by using unreviewable source code. Please update to a newer version.","name":"IDM Integration Module"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"6.35.5","minVersion":"0"}],"id":"21f14cff-afef-4e0e-97e8-4dbc0207a7a6","last_modified":1569865071841},{"guid":"{546bc2af-d6e7-499f-90b6-58305b836702}","prefs":[],"schema":1569699691574,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1583809","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"MapsFrontier"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f3133639-f5e5-4b47-a80f-2993fa97ca4a","last_modified":1569844523596},{"guid":"{f39b7905-00d5-4391-9a4b-751ca08dd6b2}","prefs":[],"schema":1569440826824,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1583814","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Tic-Tac-Toe Evolution_G"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4c3153a8-7551-48f3-a4fa-8ad6cb28faa8","last_modified":1569441800696},{"guid":"/^((ehfiibbkgllccnbifchmillffgdlmidi@chrome-store-foxified-3843796584)|(ehfiibbkgllccnbifchmillffgdlmidi@chrome-store-foxified-3264908934))$/","prefs":[],"schema":1569242005272,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1582781","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Proxy add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"72464ab8-9b51-420f-8e54-bc0f8bb01cf1","last_modified":1569244094631},{"guid":"/^((@searchincognito)|(@si-defaultsearch)|(@si-defaultsearch-listed)|(@searchassistincognito)|(@DiscreteSearch)|(@Discrete-Search)|(@searchsafe)|(@SearchSafeOrg)|(ffredirector@discretesearch\\.com)|(ffredirector@encryptedsearch\\.org)|(ffredirector@searchdefence\\.com)|(ffredirector@searchencrypt\\.com)|(ffredirector@searchencrypted\\.com)|(ffredirector@searchincognito\\.com)|(ffredirector@searchsafe\\.co)|(ff_redirector@discretesearch\\.com)|(ff_redirector@encryptedsearch\\.org)|(ff_redirector@searchdefence\\.com)|(ff_redirector@searchencrypt\\.com)|(ff_redirector@searchencrypted\\.com)|(ff_redirector@searchincognito\\.com)|(ff_redirector@searchsafe\\.co)|(@encryptedsearch)|(@searchdefence)|(@searchencrypted)|(@42e62954-834c-11e7-bb31-be2e44b06b34)|(@DiscreteSearchx)|(@4aec09f1-f1c9-456d-8c40-e0e86f302a0d)|(@566ff1c3-9432-4ed4-bd3d-b43cba47e051)|(@1df4e663-b9f3-4708-9f5d-44265b33397e)|(ff_redirector@searchsafe)|(\\{9b62bdf8-a3c7-43d3-ba7f-0970cabffdaa\\})|(\\{95b48d11-b256-48ad-8ba1-bfe52f0a8bb8\\})|(\\{9e35a2be-64bd-49e3-aa47-fbeedf1834eb\\})|(\\{3ba10b5f-d9fa-4b40-8683-034d3dfc71d4\\})|(\\{20c31601-ebee-4677-a2f0-40e178bf7c77\\})|(\\{98e02622-f905-434e-9003-6c061b5c11c0\\})|(@tabwow)|(gaidpiakchgkapdgbnoglpnbccdepnpk@chrome-store-foxified-258456913)|(@tabwow2)|(\\{be8901e4-2a07-4554-aa05-a64351496e29\\})|(moviestmpd@mozilla\\.com)|(gaidpiakchgkapdgbnoglpnbccdepnpk@chrome-store-foxified-876542484)|(\\{4a8ef415-e453-458f-bfbd-ae92569214db\\})|(fireaction@mozilla\\.com)|(\\{bd9c448c-58b3-434f-9bb6-4ed2c155ba8e\\})|(\\{ebdfa19b-0906-4f78-9e95-7ef74d34c335\\})|(websecure-unlisted@mozilla\\.com)|(\\{2d06d70b-8f32-4007-8f8b-1e0445bcebe7\\})|(\\{ddbe7345-acf4-4ebb-9baf-cd6d2df73b28\\})|(\\{b09d5b98-2d65-46fb-990c-69710577efa0\\})|(\\{3894384e-c719-4a0c-8d24-3816160fc56b\\})|(search-encrypt-tab@mozilla\\.xpi)|(\\{1dafa1da-3894-48b9-ac8f-00bdc4f1868a\\})|(\\{99cfe634-328a-41a5-9a23-64094e4f4919\\})|(inco-plugin@mozilla\\.xpi)|(incognito-window@mozilla\\.xpi)|(mac-search@mozilla\\.xpi)|(fvdplayer@fvd\\.com)|(playernewpp@ext\\.com)|(\\{492936c6-9121-4e54-8d4f-97f544e5bf98\\})|(\\{108a22ea-f316-4c2f-8427-fe65e02f9e2c\\})|(cold@being\\.net)|(\\{38b99237-6c28-406f-898c-cc89df86051d\\})|(search_redirect@mozilla\\.xpi)|(\\{d2ef4a8d-6ec0-4733-9f3f-2394178ecbf3\\})|(tab_plugin@mozilla\\.xpi)|(\\{ae228e30-f40a-41a3-9e7e-53a094dcb8c6\\})|(\\{00ee7237-53cb-4036-8d4f-e78d78ca89e7\\})|(\\{d2f4002c-031b-4ad3-9fb1-afb003e8f932\\})|(\\{c0f366b3-7b3d-4486-a6f3-4ca1d7045091\\})|(\\{ccc6cfc4-3832-4d05-bf28-43a9722de93f\\})|(\\{dd02f638-ce6d-464e-8add-6ea0f314b1d1\\})|(\\{749ed3ff-4d23-4b32-812e-a35e3cf8c000\\})|(tab_cleanup@mozilla\\.xpi)|(incognito_tab@mozilla\\.xpi)|(\\{47c51f55-4f0b-499f-9fdd-c7c66bf4796a\\})|(\\{cd70c7c8-557d-46fa-9688-399c7c8d3d66\\})|(\\{681ad8e0-d1df-4cd2-a4cf-b97c1d6502a3\\})|(\\{0d58e690-bd48-4e3a-baf3-67aa40bc286a\\})|(\\{77bfbf26-4618-4120-9cb6-1fc7c92b8ddc\\})|(\\{037c6f6a-71f8-405b-9cff-fadf2ded6c47\\})|(\\{91cc3274-90d5-4e16-80e3-cd02fc513689\\})|(\\{2225b2af-0c3c-4345-adac-4f5bd40c2182\\})|(\\{81ca6b1e-a95b-4b44-9638-3ff3ea1a571d\\})|(\\{1e32acf8-fc1e-40ae-8783-c501ce50d597\\})|(\\{19670785-b1db-4d69-9538-2880ad8fdf20\\})|(\\{0113b4ad-15ca-4215-adeb-f0404f619ca6\\})|(\\{c7245149-4224-4c5c-91a4-84ea189f2227\\})|(\\{04dd2232-f1b1-4275-ae74-8bd27f3d850c\\})|(prosearch@mozilla\\.xpi)|(\\{d549a064-98e7-49ed-ba9e-a724e79a004f\\})|(\\{fddd3bc6-9d4e-4ee7-b490-0d6141ff7d7f\\})|(\\{122795b5-ae28-4371-9b61-878f5db888ac\\})|(\\{e3d491de-802a-4f82-91eb-9403c9f43637\\}))$/","prefs":[],"schema":1569181301396,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1561752","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Various search redirectors"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bea9680c-28c0-48a1-b8d4-e418adeba748","last_modified":1569241020387},{"guid":"{87bd05d5-d79e-4421-9c78-5c98ea78c351}","prefs":[],"schema":1568901038866,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1582168","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"TypeScript-Console"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b9d746da-8881-4854-8026-ecb708a588f6","last_modified":1568905123995},{"guid":"/^((hd@youtube\\.com)|(@youtube-to-mp4)|(youtube-downloader@youtube\\.com))$/","prefs":[],"schema":1568885060842,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1579965","why":"These add-ons violate Mozilla's add-on policies by including unexpected features without user consent.","name":"More Youtube Downloaders"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ea29de20-dfe2-40c0-a5ec-45b1c780815d","last_modified":1568901023136},{"guid":"/^((\\{d81c0c7d-7420-4737-a3b9-dd9edeb4412f\\})|(\\{2bc89af7-d0ff-4b22-b7f6-ec87d15d999e\\})|(\\{3ee12352-a9db-4370-aa27-7e1d9acb628a\\}))$/","prefs":[],"schema":1568816167726,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1581368","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"FSCH"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1e56fd0a-77b6-477d-bada-78a5c18a37dd","last_modified":1568816392824},{"guid":"/^((@yvd-addon)|(ydh@downloader\\.youtube\\.com)|(tomp3@youtube\\.com))$/","prefs":[],"schema":1568814899255,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1579965","why":"These add-ons violate Mozilla's add-on policies by including unexpected features without user consent","name":"Youtube Downloaders"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"73cae2b8-f60e-47b3-afca-a1ff555f4ec5","last_modified":1568816154119},{"guid":"{91c43d32-3a20-40cb-933b-47fd7c4b5a4e}","prefs":[],"schema":1568662894970,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1581111","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Cookies Next"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e22dbf2b-70c8-41ed-b17a-32f53a22055b","last_modified":1568814886596},{"guid":"{23db2a76-49ca-4af2-af50-fccedd607e12}","prefs":[],"schema":1568317295345,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1580616","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"YUI"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"13056233-543d-4c51-b89a-2a6b96ee324e","last_modified":1568374273725},{"guid":"{1056b983-063b-4bd0-b7f7-1295f7e04ade}","prefs":[],"schema":1568226375813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1580749","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fast Browser"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"886e480a-8838-43c7-b9ca-b02592e23065","last_modified":1568285711403},{"guid":"/^((\\{8d0073fa-3193-4a7f-8c95-6a4e3d9272ba\\})|(445ac9f4aa1b833ce2dc75d6d6d6c76d0cef7cc7@temporary-addon)|(\\{cd0672d3-72dc-43d2-ae77-6cda31fb7c88\\})|(\\{403321a6-be8d-4ae3-a66d-e5c846f993b8\\}))$/","prefs":[],"schema":1568154081436,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1580503","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Proxy Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a54f1c3-93e1-4a38-885c-afb98e7bc4f2","last_modified":1568224845558},{"guid":"{0fbe26d1-6891-475e-af3e-34f38a30348d}","prefs":[],"schema":1567971701994,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1580118","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Lookbox"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"67a61ba7-ad12-4eae-bdcc-e5b9b856dff4","last_modified":1568105279739},{"guid":"{a59679da-f097-4db4-b2bc-6ad7b645e127}","prefs":[],"schema":1567019346545,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"GetMedia - Movies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.18","minVersion":"0"}],"id":"db043b8d-c91a-4d1d-b420-58087beef552","last_modified":1567022112963},{"guid":"{850be3a2-ca5f-47ad-838c-fe39b006e0da}","prefs":[],"schema":1567018965949,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Safe Browsing"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.19","minVersion":"0"}],"id":"aeb6bc24-36cf-4199-94d9-68f4822fa2cf","last_modified":1567019082710},{"guid":"{ecb03616-f3c2-4580-99dd-6a233047abdd}","prefs":[],"schema":1567018902311,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Sport TV"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.19","minVersion":"0"}],"id":"7e71a557-5664-4319-a792-c94b2bf744d8","last_modified":1567018965935},{"guid":"{8387ccbe-b9ac-438d-b049-c86b30a6dacb}","prefs":[],"schema":1567017236054,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":" This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"GoMusic"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.17","minVersion":"0"}],"id":"9d598ecb-2473-4416-98b9-26658ea7746e","last_modified":1567018491638},{"guid":"{7ff51e81-f4b1-4682-9f45-43a771d80748}","prefs":[],"schema":1567017189557,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"GoMovies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.16","minVersion":"0"}],"id":"627a5309-d310-4130-9827-d3e6d3116ba2","last_modified":1567017236040},{"guid":"{2ef58672-740c-46bd-a50d-b9880986b574}","prefs":[],"schema":1567017167776,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Universe Start"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.5","minVersion":"0"}],"id":"c0767051-017a-45d7-b96f-632d7cae7c47","last_modified":1567017189541},{"guid":"{df9f6ab1-c82c-41d4-85ce-86dcfe839ce9}","prefs":[],"schema":1567017037001,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Media Start"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.0","minVersion":"0"}],"id":"6e9ea480-7f5f-49c7-b130-fb8af66bec0b","last_modified":1567017167761},{"guid":"{b89efd87-232e-4829-87d2-22148919d72f}","prefs":[],"schema":1566762089721,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1576681","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Ad-Blocker"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"04365e2c-fbc2-4393-b2b3-a23ea5de6b79","last_modified":1566934428180},{"guid":"/^((\\{fb2cbb8e-a6f9-464b-97c7-aca958a404d6\\})|(\\{8cc60aa4-fceb-4a74-bef4-bbbdc23b85fb\\}))$/","prefs":[],"schema":1566419767711,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1573237","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Adobe Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"055d2447-c7b7-49a2-bb27-b1c09a592f32","last_modified":1566422986828},{"guid":"/^((AKMWWOEASKZXXCCRFA@AXXX)|(RF_WOEKTAMS@BASDFZMD)|(TI_BOAMZKXFFEE@ZCAOKEE)|(BMMAOSIKZX_TI_EE@BOASLL)|(ZN_ASVVZXLEOOO@ABOVVAE)|(MZXVCKMSSD_ZN_EF@GBOAAOS)|(UA_CZVVMSOEEE@DOPEEZXA)|(ZXCLASKDASD_UA_VV@AVLLZAA)|(VS_SOEOKAKXC@BOOCLLAA)|(AIWEKDZSV_VS_ASCZ@SAAAOOBB)|(IF_AZXOOVVVAA@EALXCOAA)|(VVALLEIASD_IF_AZ@OOBAAXXA)|(ZN_BF_AOXZAOKSD@VZXMASLX)|(VMZKMALSKD_BF_ZN@VIAAEOOSL)|(aunastralaa_1@auzn\\.ne)|(VXKCVLSO_ON_SOC@KIZIAO)|(ON_OPPOWOAKKS@BLZOAAAASL)|(nostallkka@iofjjakk\\.me)|(VZKKAKOOEE_LN_FK@BOOAASSDD)|(LN_VSOAJKXXXZZ@UDPPPADK)|(BNKZKASKDIE_EB_AKK@BLALEEKK)|(EB_AISJIKZLAA@DFKKAKE)|(NLDFKOBASOKCK@KFOLAAAEE)|(BBDMLDSFKER_AF_GG@AYYRR)|(OMVXNSDF_R_F_W@BMAMSEEE)|(EIGKFDAODS_RF_PDNAP_WEN@HUUUHJAA)|(GOEORG_RF_ANA_N@BDOFKOKK)|(BFDISDF_RG_AZXC@BDOFKAQ)|(OKOKDFBDFBDFG_RG_KS_BDK@AAAJAHU)|(ODKFOBKDPFB_PJ_FGK_AKK@AJIIJAA)|(UBXODJ_PA_PJ@XMVCOAKS))$/","prefs":[],"schema":1565206889166,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1572346","why":"This add-on violates Mozilla's add-on policies by executing unwanted actions on websites without the user's consent or control.","name":"Page update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"85411892-1225-46fb-8f1b-5aa424bc2c01","last_modified":1565344753436},{"guid":"Shield_My_Searches_ehHQAdRPxE@shieldmysearches.com","prefs":[],"schema":1565034099452,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1572066","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Shield My Searches"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"74e070ac-891b-4f79-ac76-09a170d21a91","last_modified":1565181472444},{"guid":"{4f71ae77-8abe-43df-bb9f-cf440d6f7756}","prefs":[],"schema":1564993164184,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1571059","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Adblock for Youtube2019"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0f73f6c1-38cf-4255-bb8f-8a61f19afd99","last_modified":1565003019901},{"guid":"{f2539eac-e545-475a-85b4-822347022dd8}","prefs":[],"schema":1564861308712,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1571130","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Woor"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ae64120f-d93a-4224-ac75-4038b0d2a33b","last_modified":1564993145778},{"guid":"/^((\\{8842eb7c-5f5c-4d33-aabe-81c27ae87dcc\\})|(web@1A72D794-697C-11E8-9D8C-1C0018C6383E)|(web@2a366bba-0a94-11e8-ba89-0ed5f89f718b)|(web@2bf1a18d-3240-42ad-9f7d-46017edc432c)|(web@2DC2452E-6999-11E8-A1CA-6C6318C6383E)|(web@2DC2452E-6999-11E8-A1CA-6C6318C63000)|(web@3)|(web@3ab4d660-8caf-412a-84eb-9cf2924f54c7)|(web@4)|(web@5)|(web@48F0D4BC-6FB8-11E8-B36A-905EE70C2B9F)|(web@82FCE0DC-836E-11E8-9E9B-164B9D46D017)|(web@90c91611-b4c8-470a-b251-77bb1f859dba)|(web@899ce5cc-06fc-436e-a59e-93a70eb4c810)|(web@3681a37c-6383-4e94-8076-28496af53983)|(web@7398cc9a-684e-40a4-afe1-b620e1a863b2)|(web@7398cc9a-684e-40a4-afe1-b620e1a86000)|(web@8842eb7c-5f5c-4d33-aabe-81c27ae87dcc)|(web@10722358-d56d-4f5e-a89c-d4534d7c5000)|(web@10722358-d56d-4f5e-a89c-d4534d7c5565)|(web@67887931-77b9-4b1b-baee-9f23a4a384de)|(web@a3ea9864-1034-47b9-a25a-e9cc207a9319)|(web@af1e58bc-4ead-11e8-81fc-065ad97f23a5)|(web@af1e58bc-4ead-11e8-81fc-065ad97f2000)|(web@B7CCDA78-8455-11E8-91A4-ED179E46D017)|(web@ca5a2803-6421-4582-97e1-9e30fe44e100)|(web@ca5a2803-6421-4582-97e1-9e30fe44ee00)|(web@ca5a2803-6421-4582-97e1-9e30fe44eee0)|(web@cacf1377-a1b0-43e6-84bc-c0518922b22c)|(web@e7a72615-19b1-42a5-8e34-ddfa89ce006e)|(web@e7a72615-19b1-42a5-8e34-ddfa89ce0060)|(web@e7a72615-19b1-42a5-8e34-ddfa89ced000)|(web@e7a72615-19b1-42a5-8e34-ddfa89cee000)|(web@e4058a8a-59ca-4ba7-b503-dfcf75639305)|(web@f3ac4769-1d70-444e-aa46-06d0427473b9)|(web@FACD83DA-68CC-11E8-8484-3DA118C6383E)|(web@fd9b3d8a-1178-45ab-92a8-a172d0b7c000)|(web@fd9b3d8a-1178-45ab-92a8-a172d0b7c32e)|(web@fd9b3d8a-1178-45ab-92a8-a172d0b7c39e)|(web@ourdom)|(web@oursrchdom)|(web@test)|(web@testss))$/","prefs":[],"schema":1564669690124,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570659","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5aa0a7da-cf9e-4bac-bbed-1b7625109cc7","last_modified":1564671502746},{"guid":"{97ab6723-bc9a-4c5b-a08b-5b162d29ad4f}","prefs":[],"schema":1564669434797,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570385","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Toors"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"30d0ec83-70ac-4a03-9239-7af6c4061cde","last_modified":1564669681391},{"guid":"@weatherhubpro","prefs":[],"schema":1564668992535,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570380","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"FreeWeather Pro"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"47315374-a775-4701-adc3-d0cfb61a44b8","last_modified":1564669425544},{"guid":"YouTube@develop.com","prefs":[],"schema":1564662247837,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570377","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Youtube Downloader (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"176a0ef0-bd71-4b96-a3e3-14c17eaad3dd","last_modified":1564668305895},{"guid":"/^((nickrr878@gmail\\.com)|(\\{a06de0b3-b00f-472c-a34e-3a74b64d1747\\})|(spar\\.team@spar\\.team\\.com)|(\\{59904ffa-b247-41ea-9ac1-2ce0a2da8c98\\})|(\\{69c49344-90ec-458d-9811-a55878e26bd1\\}))$/","prefs":[],"schema":1564660970729,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570622","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Shopping add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"26b10e69-d842-40ef-90ce-f96552e269a3","last_modified":1564661731567},{"guid":"/^((web@AppConverter)|(web@SearchManager)|(web@Email2)|(web@DefaultSearch)|(web@AudioConverter)|(web@translations)|(web@Manuals)|(web@HowTo)|(web@Property)|(my@WeatherTab)|(login@EmailAccount)|(web@WebDesign)|(web@Utility)|(web@Ancestry)|(web@Bank)|(web@CrimeReport)|(web@Taxes)|(web@Notepad)|(web@Crypto)|(web@peoplesearch)|(web@Weather)|(web@VideoConverter)|(web@TV)|(web@Transit)|(web@Template)|(web@Sports)|(web@SpeedTest)|(web@Social)|(web@Shopping)|(web@Scrapbook)|(web@Recipes)|(web@Radio)|(web@PhotoEditor)|(web@Photo)|(web@PCTexting)|(web@Packages)|(web@Office)|(web@News)|(web@Movies)|(web@Maps)|(web@Jobs)|(web@Interests)|(web@Games)|(web@Forms)|(web@Flights)|(web@Fitness)|(web@EmailAccount)|(web@Finance)|(web@Email)|(web@eBooks)|(web@DM)|(web@Coupons)|(web@Classifieds)|(web@Calendar)|(web@BrandedTab)|(web@Bible)|(web@Converter))$/","prefs":[],"schema":1564599359459,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570620","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b5e2f528-3a9c-43af-9f6d-98040157a59a","last_modified":1564660457769},{"guid":"{795697ee-695f-45d4-a997-6fe845b473d5}","prefs":[],"schema":1564342890085,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1569556","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"IDM integration (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"21bbd8dd-b79e-41b8-bd18-db1592e743c9","last_modified":1564399822770},{"guid":"/^((\\{86f185bb-b672-4a24-b3d9-a8751231b687\\})|(\\{8d98cfc9-3757-4fd9-b017-30ad60fb94ed\\})|(\\{288a7d51-4627-44c9-8cf0-cf18742a6f67\\})|(\\{49e5562b-38e2-4292-8080-ca3ffe8cea42\\}))$/","prefs":[],"schema":1563809747757,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1567876","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eeaa940b-b984-43da-88ce-d26891347e3d","last_modified":1563810026497},{"guid":"/^((\\{e656b354-3c95-4a63-a271-fe301b294da0\\})|(\\{f5ab4224-43ca-4654-b189-23aa9c960803\\})|(\\{fb68ec9f-d02a-48c9-a356-3020bd1d3e21\\})|(\\{2eabd9de-b8bc-43f2-9e77-624a0e04e38d\\})|(\\{426fe5e4-5da1-41b3-81d4-28bd59724f84\\})|(\\{4b1d9906-5cc4-44a6-ad64-a6c7b0e2ebba\\})|(\\{bbe2e2b3-4a77-4108-9183-e0b02676c09d\\})|(\\{01aef979-833c-4f7d-85a0-6be87462c05e\\})|(\\{9b51394e-a1a9-4864-9876-cc1d6f1a47d5\\})|(\\{7c4f0798-6edc-417b-8702-d97ca1c894c6\\})|(\\{ad93f537-5824-4057-a44f-cef1f97c2d68\\})|(\\{ff62fb9d-c5b7-414d-8c2b-bc5d796475e8\\})|(\\{46998928-4162-46e0-b4c7-260a8520aad9\\})|(\\{731367f8-f5e8-4ade-b8cf-5aaf8c2a455b\\})|(\\{eb6b098d-7811-4a20-a94f-ca91721d4aab\\})|(\\{6ddb9deb-d435-4ec2-be8b-ca65900e43e9\\})|(\\{288e4bb9-454e-4374-8734-1069241d618e\\}))$/","prefs":[],"schema":1563306101159,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1566026","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1f35915e-2de0-4973-adf4-4e77073e0b42","last_modified":1563367115113},{"guid":"/^((\\{7e9c2e2c-8d2d-4406-bb3d-993176f59b34\\})|(\\{f743e1bf-9a1c-43ab-b8ab-57972761b919\\})|(\\{b8274b35-eeaf-4d98-8a6a-cc4fd56603ed\\})|(\\{fd90393d-6ac6-4245-a048-9d423baacbd1\\})|(\\{3f7b376e-23ad-4296-8fd1-77fb254610bc\\})|(\\{fd918017-a23c-40f0-88e1-798ed6fc51f7\\})|(\\{bac48192-5c1f-4dae-aa1c-2fa9ca65dbe0\\}))$/","prefs":[],"schema":1563284869997,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1566557","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Add-ons overriding search settings"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"59cf2549-3930-4a60-a212-af84facbee32","last_modified":1563302090004},{"guid":"/^((general@mapseasy\\.net)|(\\{fd4b0f58-5268-4d52-b09b-547e867fef27\\})|(\\{efe13936-3bfa-44ce-9224-e8cb27f0f216\\})|(\\{c6b767a7-b0c1-4b68-8ac6-d08fee14c5a0\\})|(\\{a9df2ef3-9746-4d5e-b7aa-0baa531538d2\\})|(\\{2d947dd9-fa0f-4f20-8812-31ce9e29081b\\})|(\\{3e800ada-345b-4ac4-82a5-0dbfd00d7877\\})|(\\{a5fcf820-575a-42c2-aeb1-de1a794db1b9\\})|(\\{da844d4c-44e1-4799-ac53-9bb1ad2c8227\\})|(private-tab@mozilla\\.xpi)|(\\{56dbb679-8db4-47ce-851b-a7eab0e215cc\\})|(\\{c1415289-4471-4b6a-b7b7-4feaf9506b38\\})|(\\{29439407-f908-4779-9078-eb190f21dc4f\\})|(\\{5401ea8b-def8-4df3-bf9a-f520b147df69\\})|(newtab-plugin@mozilla\\.xpi))$/","prefs":[],"schema":1563133289502,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1565994","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Search hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c349ecdc-5fa8-4b87-bfa2-c732dfde094d","last_modified":1563186751969},{"guid":"/^((langpacasdjasdk-de@firefox\\.mozilla\\.org)|(langpack-de-7@niklasb)|(langpack-de-8@niklasb)|(langpack-de-9@niklasb)|(langpack-de-10@niklasb)|(langpack-de-nightly-1@firefox\\.mozilla\\.org))$/","prefs":[],"schema":1562673203781,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1564401","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"German language pack (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d38035ff-7945-49cc-88fb-6de9f8a13658","last_modified":1562673628501},{"guid":"sourcegraph-for-firefox@sourcegraph.com","prefs":[],"schema":1562614890305,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1541010","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Sourcegraph for Firefox"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0"}],"id":"9fde5729-9be6-4955-9627-67742c5ed62a","last_modified":1562667113062},{"guid":"/^((\\{6d0887bd-1f51-4852-9307-cf2a223c3a9a\\})|(\\{4cb2b177-e2a2-4ae1-b759-03606a85df61\\})|(\\{df28b68e-ad39-4300-add2-b2dc8bf54f71\\})|(\\{eff0a5d5-3f53-4b75-b451-5acffd5bb61d\\})|(\\{7561d328-6b59-449a-bf7a-46fea5027be4\\})|(\\{854246c0-f678-44ff-85f3-f340f33c5da9\\})|(\\{9e976e36-9eb7-44bd-97a3-4901ab3e1021\\})|(\\{2e9a0a60-8423-4ffc-89ef-74a02ca8c5e8\\})|(\\{a5e298c3-2d74-4268-8d13-e0efcb77d896\\})|(\\{39838189-7836-432f-9a34-a009886a61f8\\})|(\\{a3f781a4-adc7-4a12-9812-20da06e7b6d9\\})|(\\{365b3845-1e12-4096-80f1-8be24456d741\\})|(\\{701511ef-2e5a-458f-b735-c789b7ae6feb\\})|(\\{888807df-4517-4b97-ac73-e4294865e375\\})|(\\{ea7c7094-9d83-416d-bd13-e85fcef481a5\\})|(\\{1f67e4bd-6eb6-4fd7-a694-b8b360494cc3\\})|(\\{4f9520a5-caa6-4832-9582-2b26b8739305\\})|(\\{06f5112b-da03-481b-bef1-bf752ddbe7a2\\}))$/","prefs":[],"schema":1562269304530,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1563454","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Fake Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f8e35175-572a-4b00-b5d3-9c8df255f1ec","last_modified":1562320360370},{"guid":"/^((\\{fc2dbae0-1ab3-40fe-9a38-cbee911b903e\\})|(\\{82e3e07c-0cf3-4b9f-a625-65d378698af3\\})|(\\{2904a7ee-0b54-4adb-a500-b932b77b6936\\})|(\\{f6932562-1f6d-4779-b5a4-f4c4654980dd\\})|(\\{97f0cc0f-69cf-4e5a-af68-f404aa3f1ce5\\})|(\\{c346f3ce-08bc-44b7-9410-bd8ad65f32d5\\})|(\\{f68f3bd2-ece8-4a85-b071-cea253cd78ac\\})|(\\{d9b6a925-e00c-4e36-a282-e6b76833e5b5\\})|(\\{e8a67ebd-655e-48f9-99e7-619c850f6bcc\\})|(\\{15942451-8c62-457f-8ff1-8525ce647c0d\\})|(\\{8fcdb966-eec2-4cd0-865e-1d105e9b59e2\\})|(\\{6ae58312-7d81-4d39-84f1-454ae6ace826\\})|(\\{023cd859-1b7c-4384-80e5-eca82c68a21c\\})|(\\{694e912f-011f-4be4-add9-25c85af8014d\\})|(\\{b889539e-4b8c-4e52-a605-a0b33532fd05\\})|(\\{596c6d7c-49ab-440e-a50d-220e5db393f7\\})|(\\{f0fd5c9c-1fcd-4085-ac41-47c379517420\\})|(\\{545dbede-b51c-477b-b23b-936dd5e7a428\\})|(\\{c3f9f4e6-b5ed-49fb-82c6-313b9617cddb\\})|(\\{309908bd-c2fe-4066-82c5-0631571e77fc\\})|(\\{75f93037-6366-4f88-b92b-c3174d68a836\\})|(\\{36e57809-88bb-47ef-9b6c-90170bb753d5\\})|(\\{da83ef9e-f36a-4416-a4ab-29a09c981690\\})|(\\{09e50933-f19f-435a-8e6a-7663715ea3fc\\})|(\\{7f35f6f3-714d-4c0d-befa-5a6843c62b6f\\})|(\\{b3b3f9c6-6b64-47d0-bf5a-f9796d1d7cfc\\})|(\\{116c6521-bda8-469c-9ca6-0702860aca67\\})|(\\{98566ed5-4c57-4da4-946f-03beeaa6145b\\})|(\\{8fc257d4-612c-4196-9688-dd7de0979c44\\})|(\\{9b7f873c-cf3f-4d8d-9cd2-3c68ce0f831f\\}))$/","prefs":[],"schema":1562096490180,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1563454","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Fake Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7f55f27d-37e5-4c3e-bd9d-02924496ba3d","last_modified":1562227635293},{"guid":"/^((\\{a3250b1a-de19-432b-829f-3d4c18ff4549\\})|(\\{b315912c-03f9-4ca8-a9fd-9410786d242a\\})|(\\{d1e4d5e2-9c6d-4e1d-9638-d329d64e5484\\})|(\\{898e64b3-38b0-4748-93a2-7e68874a73c9\\})|(\\{062f9d2e-1e5d-47e1-a9e6-0a4eb1e8182c\\})|(\\{434cedce-3d36-4ec1-b99d-e2b5ec929e8f\\})|(\\{b429f2f0-62de-4c72-9722-9ccbcc43500c\\})|(\\{7405ed28-67e9-4836-9c38-26bb7175da3b\\})|(\\{ebb5fe5c-5561-47e8-8240-bae4ba4b0389\\})|(\\{a9a5ac46-ade8-4927-85db-5c36bb26fd2c\\})|(\\{34d93cc4-a468-4ddd-98a4-31d1237b9986\\})|(\\{394a7da5-0f59-425c-ae83-49ad47c30a51\\})|(\\{15532ccb-c575-4b8b-9a62-ca2e4b9cbd7d\\})|(\\{d0579f20-4e35-4d7e-be6a-3da1b7660ce7\\})|(\\{f39c789b-9a2f-477e-885e-675f499e8307\\})|(\\{7adb91a0-6c6b-4fc6-911c-63a0c10bb363\\})|(\\{8b51d36c-f5d2-4c9d-b431-2c5011168470\\}))$/","prefs":[],"schema":1562061057131,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562598","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various Fake Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"432368eb-333d-4280-846d-e9508ac0a8c4","last_modified":1562061250280},{"guid":"/^((chromelogger@usernamewilson\\.com)|(firefoxsecurity@usernamewilson\\.com))$/","prefs":[],"schema":1562001599116,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562597","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fire Security"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c4cd1e9e-b81f-40ef-8c0d-86b42d884a7e","last_modified":1562061057121},{"guid":"/^((\\{02421745-5b6e-45e3-925c-670b72162fa5\\})|(\\{165626db-f5c5-4e96-b7c5-dafaed6357f4\\})|(\\{87115bc9-2e52-455a-b82d-2753d3303d0c\\})|(\\{be0863e2-c325-48cf-9623-88bcc6d01970\\})|(\\{09298d3c-f8f1-401d-bd70-43cb66af1594\\}))$/","prefs":[],"schema":1561988438120,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562634","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3031bfa1-90c6-4b7a-ba03-7fcd7e010914","last_modified":1561988914045},{"guid":"/^((\\{fd605874-13ff-4b86-8018-9167923792c9\\})|(\\{687ac7de-0c7c-4e5d-9fac-10757591026d\\})|(\\{c9c11fd7-6774-4657-afe4-0cbf1081b505\\})|(\\{5970609b-547d-4094-b806-a9b0a2996c62\\})|(\\{f77d7ff3-05df-4455-aa23-8031dd341ec0\\})|(\\{d5238802-9ff3-49fd-a427-8eb7a73a08e1\\})|(\\{93a425f5-cc32-42bb-ab4d-63b53512cb52\\})|(\\{23de42fd-b546-4792-ae2f-e2f808e13b52\\})|(\\{209b8c63-d260-4fc7-be92-20e3b04eb944\\})|(\\{e6610c1e-4bd2-4ced-9d40-0a4fc125fd42\\})|(\\{6631ea49-4664-4acc-97dc-0d7e4a67a417\\})|(\\{b811cceb-fcd6-4eb6-b07b-c8c01794eaad\\})|(\\{8ad9f113-7b59-4c45-9c90-59609e7ee91a\\})|(\\{130f1820-9c73-439d-a9c8-114702e1d415\\})|(\\{6dd75c5f-407d-4f3b-9c29-90c422c82d85\\})|(\\{99968b5b-6b54-42e8-932f-0414bfd17405\\})|(\\{1a69e311-e730-48af-b050-f60247a32fe9\\})|(\\{67f715b0-1262-4660-9fa2-c6f7bc29ecc9\\})|(\\{3a8513a4-cac1-4619-ae36-9686bcbb42a2\\})|(\\{27af1be9-f9d9-40d7-878c-78d8bcd94dd5\\})|(\\{7b59b760-964a-43af-83b6-b4ef08fd2e07\\})|(\\{861bd389-6024-4aae-a31b-f334163c1406\\})|(\\{cdcdbb24-88fb-42f8-872c-3df116f82cad\\})|(\\{8c60aa85-e195-4203-8529-073a6db56c54\\})|(\\{c5781fde-fe4f-4792-9e01-4e1239c00b08\\})|(\\{1361b734-0efa-4d8d-8108-ead9400b50d8\\})|(\\{ce79c320-0b55-430a-a431-2cd69cc2919e\\})|(\\{cb976837-ff98-4f37-b81b-98571f3a7828\\})|(\\{21dd7ebb-6736-470a-afe0-5dcea38b3db7\\})|(\\{84b09a06-0f25-40ff-8198-98e2e54a739b\\})|(\\{b869d674-37ba-4df4-a34d-dc9be47a963d\\})|(\\{e18783e4-8e04-457e-9b35-611d20fc12e8\\})|(\\{04042b52-3398-4e42-a638-ef9200c589f4\\})|(\\{96292080-d058-458d-a6c6-bff1d52425a2\\})|(\\{aa584391-2c81-4dfb-b06e-5118b026104e\\})|(\\{6285eae8-ff36-4887-b46c-3772ec04390f\\})|(\\{ea28f6ac-affc-45cb-a536-1eb1bceae142\\})|(\\{340afda6-c1e6-4ac4-8e5f-a5b439a9dfa1\\})|(\\{62202f8d-8e11-4ce0-af66-2235ad17051c\\})|(\\{d4e05835-d503-4d21-9701-a24dd61b0513\\})|(\\{3e8d4f85-d823-4dac-84fd-4b87b33e7852\\})|(\\{c04dbf0d-9b39-4730-93fa-6680aa0909f1\\})|(\\{019be100-cda8-43ae-8136-a014db9e7a9f\\})|(\\{73c512b3-a9c9-4690-bba5-fbfb94aeabd7\\})|(\\{0c78c766-7ebb-4b2b-85dc-d4fcd4da6e9e\\})|(\\{a318cd63-2e84-4d05-96b8-13b721fdec8c\\})|(\\{97d03ad5-3911-4c72-8ff9-5f4b9beade68\\})|(\\{77c5010c-c799-469c-85b8-5e7e0140fb10\\})|(\\{16458eb7-545e-4626-8620-e31d71cfbcc3\\})|(\\{a5a61ddf-c248-4109-a1ba-b8bf84e728c3\\})|(\\{6b18c850-65e3-4cc8-b3f6-e78969c9a428\\})|(\\{4ae632f1-6735-4077-8b62-f73d68eab36c\\})|(\\{db7b2525-ccd1-4ee6-8daa-890d7879ed07\\})|(\\{9e382691-320d-4500-b378-90c9ad922422\\})|(\\{1bf86700-b428-4e67-9701-536f66ec0a2c\\})|(\\{d6841f20-fd15-4373-944d-a0dd6a286d69\\})|(\\{18169628-a7de-4c93-9d30-efb66f45b5a4\\})|(\\{d9979d00-eb14-4cb3-bb21-452d2c02e3dd\\})|(\\{cb868690-a1dc-4fe0-bd2e-2ab291cd54a4\\})|(\\{230faf82-9048-43e9-ab19-94bfe1113ad9\\})|(\\{e0723460-a1a2-4877-bb20-a3f14e01e594\\})|(\\{2431dfee-a855-46b4-a740-6d0e4dbaa662\\})|(\\{1d44053a-5ff6-494c-8fef-0084039eb8ac\\})|(\\{bc77d204-ecd7-42ee-8006-cd54be0a400e\\})|(\\{9e22fccc-6b4a-4674-87f2-e6ecd4b409d6\\})|(\\{62474e9a-8a3a-41cc-9530-97baf6f8b7af\\})|(\\{6932ebe8-ed27-4291-86fd-d5147e0f5702\\})|(\\{aa5b9279-e324-4951-8a12-b0712f37e233\\})|(\\{420e769f-b577-420d-bf07-182299d75882\\})|(\\{11a0fbd7-b2c9-427a-8d33-e7fd8e845630\\})|(\\{a4dfd321-45e6-42dc-9ac8-9d606ad4a672\\})|(\\{54685c20-9401-48d7-a950-81e7b10bd9ed\\})|(\\{2605a51d-53d1-4345-9fbc-380fab2a0c4e\\})|(\\{c3699f84-dacd-4734-a60c-7ecb1b28289a\\})|(\\{074b0ddb-5187-484b-9783-22d187e6dd08\\}))$/","prefs":[],"schema":1561923700391,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562630","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"56849c09-6253-44ed-bc59-1cd7a61ce961","last_modified":1561988438110},{"guid":"tab-api@mozilla.xpi","prefs":[],"schema":1561710153929,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562154","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Tab API"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9f484302-44da-4b6a-afd8-94113b83c0f6","last_modified":1561710520557},{"guid":"/^((\\{b7a0ecf9-212b-49ca-bec1-ead0c6dc2128\\})|(\\{6e977a6d-b31d-4735-a586-41dc25df2100\\})|(\\{67155a2a-6538-42b1-bdc9-f48b442f57e7\\})|(\\{b4d4abc0-5e6e-4a34-a7e3-bfe7319160b8\\})|(\\{2102c5a9-f3c4-4f71-bb6e-c45c9d07b6c8\\})|(\\{071c1c7a-cde3-4a22-aefe-7c8f98df6277\\})|(\\{aa2f3e70-7dcf-4b4e-92c5-54c8280b98de\\})|(\\{3b376420-b276-4a0c-9e28-340dcc0547ce\\})|(\\{ed192371-abcc-4520-ab76-d22afbe51dff\\})|(\\{ad5a457f-59c8-4d90-8e3e-59f13a3bc2b2\\})|(\\{06aa60ab-91ad-4b8a-bfda-98e33b65fbb5\\})|(\\{c2875a12-da6a-4f90-a919-1d2bef57fbff\\})|(\\{b01d1c5b-58b5-4411-86d0-555131c7bd07\\})|(\\{0a79c7eb-5fe9-4e37-841e-18686bc86a20\\})|(\\{341ca205-d6e0-4d03-93be-04939c429412\\})|(\\{855e09d9-ac3a-4885-828d-557734060c1f\\})|(\\{8ac01eb1-9819-4c41-b2b7-042d8cdb3f2e\\}))$/","prefs":[],"schema":1561657651090,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562153","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3460b6b7-8251-4588-8f12-81ac8d288c88","last_modified":1561710153920},{"guid":"/^((\\{65b88db7-9c07-4d03-80eb-2e5cf6cd7aa8\\})|(\\{aa2ef90f-db17-4ece-abab-4f87830457db\\})|(\\{e50969c9-088c-4978-9ffb-5d78015dabcc\\})|(\\{15fd1a8e-db53-41fa-9c46-93ec5b7473c1\\})|(\\{ed84b63e-faa2-4c48-b080-e9612cbc2e49\\})|(\\{c784f63e-5609-47a8-92ee-33a2bcb3239b\\})|(\\{1641b1ec-9a3d-4e3c-b52e-bc80671349f9\\}))$/","prefs":[],"schema":1561587664411,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1561854","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3e88dad8-f640-46dd-8b00-4b955eea7b24","last_modified":1561626172388},{"guid":"/^((\\{f0df6aa3-9792-4476-daa6-4709f93bbce3\\})|(\\{fe934134-3d0f-462b-d56e-e7187dfa8c98\\})|(\\{429999c4-1b8b-46fb-863f-ce19a08afc9c\\})|(\\{b8003074-2123-45be-91cf-654ef9671e1a\\})|(\\{9712066a-d491-4293-cd31-8ef8ee907d40\\})|(\\{dcfbb98b-783b-4df0-8427-e269114736cb\\})|(\\{66c44e3b-2df2-4741-ff07-0067cca4fe95\\})|(\\{af0a4d96-3403-496f-9d9a-5c766bf44bac\\})|(\\{82c60958-45da-4e6a-de21-879775c5473a\\})|(\\{c9118234-5787-488d-b30c-7d0a904fbabb\\})|(\\{f07d3da6-81ea-464f-9bef-6ff5470b307b\\})|(\\{c2454a12-7f57-440e-f695-0a9618f48b80\\})|(\\{f6e1d884-8100-49e7-88b9-bff8d9295cd2\\}))$/","prefs":[],"schema":1561552773231,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1561603","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Various script injection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0c227983-1180-4b4a-b25b-8160738e7238","last_modified":1561554563187},{"guid":"/^((\\{4200b565-5c4a-410f-b4fb-478daae2537f\\})|(\\{a0bba103-21d5-49c8-96f3-4eabbe78ced3\\})|(\\{ec46fe21-5690-4757-8ebc-1c77f826fe6b\\})|(\\{ce45d605-3bb6-4fad-8c1b-238ecee0d3df\\})|(\\{c70bd1fe-1d7d-4ae5-a731-3d513e6c46ba\\})|(\\{aeec96ca-81b9-405c-bd70-01ea6a50be9d\\})|(\\{0a1603a8-839f-4890-b1e3-1b8e00a7a0c9\\})|(\\{45febc8f-eaeb-4cec-90ea-07a7edc22793\\})|(\\{a7c7febd-6726-4d0e-9947-2edfd8bea35a\\})|(\\{eda3389e-ae07-4a2c-9b50-ce4e9008f297\\})|(\\{0e5d1d65-4fbb-4dd9-9042-3b568d9e2489\\})|(\\{1461f0e5-3c4a-453e-aed2-ca45ff5db747\\})|(\\{e842e73d-9d8a-45a8-bf0d-ef974ab24767\\})|(\\{e1d4fa8a-3da0-4fee-8b4f-0c7233fcb49a\\}))$/","prefs":[],"schema":1561541784349,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1561595","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2e886e0c-00ab-44c2-bcbe-7c8793d46d89","last_modified":1561551163572},{"guid":"/^((\\{0eddfecf-eb8a-4a08-8189-004932a77d5b\\})|(\\{b8181b05-a263-410c-8c07-5d7e8c80f9a2\\})|(\\{561d3a53-8e1f-417c-9b46-af1ea9942c4d\\})|(\\{cae0f640-a4b8-4ea0-8667-39ec00651b54\\})|(\\{142aae9b-ff6a-4ae3-b4c4-75e99534e661\\})|(\\{0592cc75-3027-420c-9a9c-22b23a21af5b\\})|(\\{23f8f54b-1f6a-4760-bd9a-414aba8d93c4\\})|(\\{09d0cd99-4cde-42d2-9a4e-8002f7595834\\}))$/","prefs":[],"schema":1561380181925,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560886","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"ADB amazon"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dba9e10e-ff77-45dd-a2fc-e7daf5f09fd5","last_modified":1561381085652},{"guid":"/^((\\{99a325df-ca23-41da-84ce-477796f46737\\})|(\\{86a9b963-ebd2-4ef5-abaf-5ffd7cf86387\\})|(\\{9c05da6f-e5e2-4455-bae3-2754e1b36db4\\})|(\\{002d0276-03dc-439b-bea4-576976bbd7c4\\})|(\\{4476484a-2a0a-4a7a-8612-18ac22e02ac9\\})|(\\{edb28501-65bc-49f1-b168-1ea5e84d4a19\\})|(\\{13b0c2d6-0a44-47e0-aced-0664877b8a4e\\})|(\\{fdd30cab-1f29-439b-829d-80c5546087e0\\})|(\\{2abed6fc-d8ac-479f-8fdb-f5d20b0a5c27\\})|(\\{7afb7eb5-7837-474f-a925-62728be18488\\})|(\\{ff86f12d-e38b-4c70-ab00-9cd20174ddcd\\})|(\\{31b72d81-14d8-40e5-a2c2-7259a7d40d96\\})|(\\{84e3002a-a0ea-42f8-b30c-1739cb21b105\\})|(\\{47d8027c-a331-4f8b-8c69-4c95680caba5\\})|(\\{d03ae30a-58b5-4dc1-afd9-bc4ea8efc761\\})|(\\{eb745394-234d-48b4-bf1e-cdec66de26d3\\})|(\\{b5614c0a-878a-412f-ad7b-bc5a7916b3bf\\})|(\\{1d5916f7-3a78-40ce-92a0-35989646fe8d\\})|(\\{34cfd020-1dce-4f12-9499-f7e3b02582d0\\})|(\\{7fbdd1c1-82a4-4cfc-a3c2-ad192f5c8cf8\\})|(\\{04fbbb51-3b76-484a-99ca-ccd3e484da26\\}))$/","prefs":[],"schema":1561379624735,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560888","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5525a8a4-2b7f-4cb8-8932-5daf35a2acc9","last_modified":1561380181911},{"guid":"/^((superzoom-unlisted@funnerapps\\.com)|(superzoom-unlisted-test@funnerapps\\.com)|(superzoom-hosted@funnerapps\\.com))$/","prefs":[],"schema":1561260352539,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560927","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"SuperZoom"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a7a12a25-37c2-4ec7-8fa2-e016442b4457","last_modified":1561379624719},{"guid":"/^((\\{dfc97392-12f9-474c-9a61-fba12334d09f\\})|(\\{ca0e7543-892d-4625-8565-3671141a4ac4\\})|(\\{d50b1b61-8ba1-471b-833e-c5526ea4f307\\})|(\\{ae53880e-f5b2-4020-bdb5-0872cc1196af\\})|(\\{cb8982c0-1f56-439e-94a0-83a0308ea952\\})|(\\{91ca701d-73e3-4d76-80bc-4cbefc16beae\\})|(\\{f238a031-3366-4792-89b0-736f5e1af888\\})|(\\{35f7fa51-338b-4a7c-9f74-055708e2c941\\}))$/","prefs":[],"schema":1561232502012,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560614","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More fake Flash players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9a6e32f3-3d97-4393-8733-1a24b8796aa3","last_modified":1561246819959},{"guid":"/^((\\{eb585608-4896-4892-8a9b-1786929a6517\\})|(\\{b53cec3a-0479-4887-93b2-4732059e6f95\\})|(\\{52e84405-484c-4bfb-a279-da57dc8f89d4\\})|(\\{65136894-4082-4eac-a968-ad5dfd1771f8\\})|(\\{98d5570d-3606-40f8-8af2-2d2144698a92\\})|(\\{5ced4e6d-5c50-4e26-9d8b-b82a8d9b4e87\\})|(\\{fc97e534-4690-462b-8227-af38c67b57e2\\})|(\\{8aa21cc1-d9ac-4c43-b205-bfbd87aa8163\\})|(\\{f3dd0563-975b-475b-b295-2922f6e69717\\})|(\\{b1ee58e1-90de-425b-ab76-dd8e034305c8\\})|(\\{ae026b4b-7159-4415-98d4-1fb712092028\\})|(\\{452ec3ac-8fba-4de8-a5dd-db1cf9b89c35\\})|(\\{4c0a3c25-f706-4160-8128-197137e814b8\\})|(\\{30c347c6-642c-46cf-899d-442632d90e25\\})|(\\{7dd79020-d8d4-4241-b1fe-efca66530d5d\\}))$/","prefs":[],"schema":1561059702370,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560614","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More fake Flash players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"61f4423b-7171-4a82-8aae-71621233ee2a","last_modified":1561148779474},{"guid":"/^((\\{2adb8263-d69a-4436-a46e-b8595c35d3e4\\})|(\\{d2d96579-be7c-4bc0-9d94-7eb8920ed437\\})|(\\{3ef03e82-ae5c-4bb4-85f2-d0925d3b1d8f\\})|(\\{5f89e2ff-b113-45a7-bd44-a8cbb6b3e18e\\})|(\\{d0a65809-897d-40af-974c-df6baa16e0d6\\})|(\\{17d71711-a428-4231-93f7-25f65dc7a05f\\})|(\\{88bf0d44-b815-4654-b177-25ed224587de\\})|(\\{0bc2f2bb-b040-4512-b0bf-a2a875bfbcc7\\})|(\\{c05607b1-ce5d-4a14-ac71-91d93e5adc7c\\})|(\\{14d1d1c6-3982-4379-bf48-67aff16b0b40\\})|(\\{db395935-5b36-43e0-9c21-2fc546e3504b\\})|(\\{031a0658-d9a4-4dab-8b9a-3608a92d3d9f\\})|(\\{28a6ee49-33dd-4cc1-8650-7abc95ff30c1\\})|(\\{578c5cb1-ed39-4270-9010-3d7c623e4ed3\\}))$/","prefs":[],"schema":1560890279256,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560126","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More fake flash players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"39d92b03-d7b7-41d3-8d14-73088972f735","last_modified":1560959139660},{"guid":"/^((\\{52e29477-bb59-452a-a929-7d238ab68dc8\\})|(\\{e7c3e8d7-0cd7-4cea-8fe6-afd0dda61f56\\})|(\\{f57df33b-b222-4524-86c3-531a6d20b4c2\\})|(\\{5bfc5ee1-d8de-4efd-80f5-966b94eec12b\\})|(\\{ed229f56-afbb-48e5-8422-2ad940afa02f\\})|(\\{c87d1f11-ce0e-46eb-8710-1288416b709b\\})|(\\{177b00c2-4fb2-4268-b0c7-cb5a1ad08d83\\})|(\\{33850c97-5260-409e-9796-bd9e03aeb411\\}))$/","prefs":[],"schema":1560874921856,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1559787","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b44844c7-0ba9-477c-b0f3-bd12725c620e","last_modified":1560875340234},{"guid":"/^((\\{004b2982-0956-4c66-a7f3-7dba26eeda94\\})|(\\{31606ee8-6af1-4d3e-98d0-451b8483a498\\})|(\\{914f7369-d844-4e72-a8de-043378710864\\})|(\\{87506f0b-af77-4113-8358-fbb0a9f6daa7\\})|(\\{74832b41-91e6-4bf0-a6a9-5e74bf3e5683\\})|(\\{94e526a9-70ec-4566-995c-53e597166c8c\\})|(\\{1679b342-31d5-44b2-ae2b-91c487b2654f\\})|(\\{ead96242-a6c8-4478-88c5-5e2c54d9ace1\\})|(\\{ab0e69c5-d215-4825-8e40-de0bcae97da9\\})|(\\{2607b07a-90e6-4c0e-9bd8-94eb16982303\\})|(\\{c8336a7e-f5ef-41d8-9754-31676cb4f6c4\\})|(\\{49185403-71d8-40ed-9e30-71171231a2c0\\})|(\\{724540be-a261-4d92-bee5-ede7c6375ed6\\})|(\\{6b687abb-9aa2-4e76-bdc9-cb542809cf7a\\})|(\\{faec57e2-f33f-4974-b29c-3afc2d710ae5\\})|(\\{2dc254ac-f312-4db3-84b2-29690e20ce4d\\})|(\\{c60eb214-f702-48fd-b173-756b528cee4b\\})|(\\{6cf50082-5b79-400b-846a-8902d6609a37\\})|(\\{a45c880d-5037-4428-9e1c-ec1cd45fe830\\})|(\\{d410777f-d023-44d5-bdb8-a54b0c927daa\\})|(\\{36fbd9e9-1d2d-411f-981d-b57fbc1067db\\})|(\\{170130b4-3178-4dc2-a1f6-98a788299b16\\})|(\\{aa54e92d-20ad-4f3f-a0c7-95a97bd5e99d\\})|(\\{6e73d781-bce5-40e0-a847-63a936f58ca6\\})|(\\{861af4ed-838b-4e5f-94c7-0e95bc6b709b\\})|(\\{3e000c1f-3ad5-455c-9a20-f18035273746\\})|(\\{aeacd5ad-8949-46a0-96b0-96c9f93f0b8b\\})|(\\{c7f65d43-1a36-4683-864f-c7224037289e\\}))$/","prefs":[],"schema":1560874615935,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1559776","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Norton add-ons and clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7434a6e0-c434-4017-b475-625bd0f85890","last_modified":1560874921842},{"guid":"/^((\\{c3ff7a71-7392-4aa1-a193-95fd393a7389\\})|(\\{9255568f-d790-4b45-9fe7-d4d1bcc193cd\\})|(\\{76d7025a-8c31-4b0b-a9de-c6679919ef81\\})|(\\{6b93c35f-74c4-4d79-8557-b3fcb090049a\\})|(\\{f9dbfda2-5680-43f1-9575-5cb044264f7c\\})|(\\{096e84e1-36c8-48fe-b642-03c91c1ef14f\\})|(\\{a11e0be8-9b45-4d69-9aad-339d3220147c\\})|(\\{fb754f2e-c021-4190-96fd-7142cbcb985e\\})|(\\{69187792-e951-4ea9-ad26-378f25efee81\\})|(\\{6468fac9-e37b-43e9-9895-36143902e431\\})|(\\{ff1db01d-4e0d-4917-b487-7f3c28d7f5da\\})|(\\{1adb7040-3a78-4270-b4d3-b926819d4c72\\})|(\\{9b3d09a1-2134-48e3-bf0c-a6dc659aad93\\})|(\\{bfa38150-f24e-4443-9d07-875b21ff479e\\})|(\\{05c8e9b0-0b8a-4da2-9e44-a215e691302c\\})|(\\{e4868162-b7f2-40dc-9101-4eab9858876b\\})|(\\{541118b3-1905-4d4a-9059-3ac745b0b043\\})|(\\{d38507bd-22ee-4839-be07-cae4806ac227\\})|(\\{dbef35f1-fc95-42e3-a4a6-b94a970b8a7a\\})|(\\{f34d7289-64c7-4720-90e9-6a6cad0ddc9c\\})|(\\{96b900d3-784a-4e93-8b9f-5f7885424117\\})|(\\{a6ccaf93-4d0a-4bcd-b574-b6d1417bdb0d\\})|(\\{186d942f-cc7f-4054-9673-067f9aaae190\\})|(\\{f7c0f615-d406-4cf8-b5de-bde347f7d9f9\\})|(\\{ddf49e42-2db2-448f-9717-96a93bdb078d\\})|(\\{add62eb4-d1c1-4217-920c-dfb462e955aa\\})|(\\{71ef4372-6321-4e99-937a-0a4a03476348\\})|(\\{053307b4-d841-4d42-8fda-881aa7f7777d\\})|(\\{458e497b-8e5c-4901-82be-1e33832bdac2\\})|(\\{3bf07b01-bc56-4b28-acb4-7d56bb6f5fc8\\})|(\\{7e50978d-cf4e-429b-8482-946c86991bfd\\})|(\\{7691a931-7d5e-4daf-ad20-14539572c215\\})|(\\{c1d8d622-aa7b-4e36-9d5e-e1de1b1044da\\})|(\\{f1b85cd5-bc61-4994-96fb-74df9c62d385\\})|(\\{e26cab94-6216-47e7-b725-948613f2a08c\\})|(\\{2278a05e-3b98-4fe4-83f3-f90d42ce0870\\})|(\\{85240094-c94c-40b7-84ac-6dcf1d50cee5\\})|(\\{7e5f5b7a-ef9d-41a8-8137-da6399afdd5d\\})|(\\{85d01efb-0331-4f7c-9ef2-f5f35c0df0a9\\})|(\\{f455923d-856d-4f2e-8e1b-8cffb0b7a4a4\\})|(\\{cd4fab1b-03b4-42eb-9800-1664c4de06c2\\})|(\\{44ad1c10-baa5-4efe-96bf-743d6a86079e\\})|(\\{73cf3b22-f479-495e-8bab-54ca07e3341f\\})|(\\{c4e856fe-5594-4484-9463-a139eb6071e5\\})|(\\{6f110a84-aa60-4849-8408-9ee70c868e8e\\})|(\\{67d91fb9-3da3-481c-a426-a350788764f2\\})|(\\{eb7699e3-9886-40d5-863e-0bf6862f2f98\\})|(\\{e18709ec-f4d2-40de-8e88-ef7a6f1d4fef\\})|(\\{f83cd650-3411-454d-aadd-79bbd82f3793\\})|(\\{edb44a75-f988-4ce7-ad83-1b7cfe3da54b\\})|(\\{b328a40e-52a7-48df-8960-8f79927bfd35\\})|(\\{f8681a1c-062e-4934-a1ff-6479f179aa97\\})|(\\{f052ef52-7b0e-4a99-9490-892b515d7ace\\}))$/","prefs":[],"schema":1560714091988,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1559772","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Adobe Flash and clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"34b4e88a-ca61-48fc-a6c7-7e08aedf7887","last_modified":1560874615921},{"guid":"/^((\\{c5ab9361-f8d8-454a-b268-a4b355b37a83\\})|(\\{f7bbdf7b-7f4e-4319-b9c6-ba62f38e1d5c\\})|(\\{97154c2a-2a3d-4ddb-814d-5451e3c35103\\})|(\\{1665bb10-e8d5-44ea-8cd3-531b6ebfaef9\\})|(\\{f3b474a6-b76c-4a9e-ae57-df0a3992d8f1\\}))$/","prefs":[],"schema":1560430131572,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1559330","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"436f1b52-16b8-4c70-b67d-ad6c39f6bd39","last_modified":1560502059138},{"guid":"/^((de\\.firefoxextension12345@asdf\\.pl)|(deex1@de\\.com)|(esex1@ese\\.com)|(estrellach@protonmail\\.com)|(fifi312@protonmail\\.com)|(finex1@fin\\.com)|(firefoxextension123@asdf\\.pl)|(firefoxextension1234@asdf\\.pl)|(firefoxextension12345@asdf\\.pl)|(firefoxextension123456@asdf\\.pl)|(frexff1@frexff1\\.com)|(frexff2@frexff2\\.com)|(frexff3@frexff3\\.com)|(ind@niepodam\\.pl)|(jacob4311@protonmail\\.com)|(javonnu144@protonmail\\.com)|(keellon33-ff@protonmail\\.com)|(keellon33@protonmail\\.com)|(masetoo4113@protonmail\\.com)|(mikecosenti11@protonmail\\.com)|(paigecho@protonmail\\.com)|(salooo12@protonmail\\.com)|(swex1@swe\\.com)|(swex2@swe\\.com)|(swex3@swe\\.com)|(willburpoor@protonmail\\.com)|(williamhibburn@protonmail\\.com))$/","prefs":[],"schema":1560426922081,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483769","why":"Malware targeting Facebook","name":"Facebook malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"202fbae4-e904-430a-a244-63b0fb04385f","last_modified":1560429929334},{"guid":"/^((\\{50c31b2c-af26-4238-bbbc-f11218d19682\\})|(\\{7c244b9b-4058-4362-9c3f-6f553c75d051\\})|(\\{bc90f38a-c295-45c4-a09f-7038ed6139a7\\})|(\\{d55311d8-83ce-4320-b30f-a7acac9224ac\\})|(\\{39d2838c-8b0d-453d-b685-71b2af4f3ff5\\})|(\\{95fdb905-de6c-4499-b7f2-372910a44405\\}))$/","prefs":[],"schema":1560371525142,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558791","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5bcce386-ce8e-4e59-838d-a02d35de154b","last_modified":1560417609081},{"guid":"/^((\\{615a653c-240f-4dac-a42b-66751cfe7405\\})|(\\{3119fa71-b8b7-430e-ba44-4c25d5d2a4e8\\})|(\\{98075bd1-491f-4506-9e0a-262b08042e5b\\})|(\\{6102d260-a977-46a0-8635-7cdf3f3b72b3\\})|(\\{593356cd-e02b-4529-9d14-c5e4740fe749\\})|(\\{15b2bf6b-274d-477e-8456-3efc218f9fe4\\})|(\\{78311b1c-ffbe-413a-86c2-86b136aacd17\\})|(\\{98f992f6-d311-4248-939c-05f5db60ee78\\})|(\\{b1f0bcd0-0bf2-43c5-b61c-ee1fdf7f88fe\\})|(\\{7113cc05-ebbf-4c1a-9c6e-a9f959817851\\})|(\\{5325d52b-99b5-4a98-8625-24bbc8098b7f\\})|(\\{b6e3b23b-adfc-4f23-986b-4e62faedf402\\})|(\\{fd000b48-0259-4356-9c5e-2ff22d8784b7\\})|(\\{7fae693e-a917-40eb-9881-769c85f64ab3\\})|(\\{c0b9ae3d-d604-4327-95a7-67733d00bc89\\})|(\\{bc6b6fa2-ef8d-41f8-99de-ad838ad09594\\})|(\\{9dfbbcab-e7d0-4483-85ca-ca71ba03b769\\})|(\\{1d4ef484-d567-436c-ba0b-9cc0fb224708\\})|(\\{9874efa4-3a66-459a-aa77-ecf9ac8d1fe4\\})|(\\{47faaf0b-ec1e-46d3-ad59-bb44345b86d2\\})|(\\{b4b433dd-adcd-4491-8f80-ecdfb4788dc4\\}))$/","prefs":[],"schema":1560340682934,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558791","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c016d195-ae3c-45d9-ab13-1010f0711b88","last_modified":1560340840541},{"guid":"/^((\\{43c62192-abed-474e-a619-9d486383f5d2\\})|(\\{9506f10a-e5c1-4a0a-83e7-8e83b3fb77d2\\})|(\\{a4fd5625-6912-4cc3-861e-f5338e4c36f8\\})|(\\{2ff20211-5540-4c13-8c06-6769902b0e15\\})|(\\{e15e3074-88a0-4a6d-bd1f-a7149eff3a6a\\})|(\\{e5800ff7-8cf3-410c-91a6-4b61838e4486\\})|(\\{22754446-97f4-473f-8da2-3ffbd44abdc3\\})|(\\{eea1ab8b-a4bd-4905-aa02-80874a452fff\\})|(\\{b0bfaa8c-702e-47ea-84ff-6b20ef979385\\})|(\\{f13622f7-470e-4ad3-85a5-25a0fd43f9fa\\})|(\\{f75cba29-48aa-4c02-8d7e-704532de1aa6\\})|(\\{43325b83-0f60-4d46-9b43-f9be2e91682c\\}))$/","prefs":[],"schema":1560251614258,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558543","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various fake clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2399177f-4b21-4c46-ae74-ab7db1edb879","last_modified":1560339940028},{"guid":"{e1bb4a20-9e0d-443a-b171-4d3b71f27211}","prefs":[],"schema":1560247588269,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1557680","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Biis"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f42edc78-6eda-4dfc-9f7b-fbaaa869852e","last_modified":1560248603844},{"guid":"/^((\\{f7b6b9aa-4564-443b-9da0-a194492cecb9\\})|(\\{f20526fe-45cb-441b-96e1-6d8aad20b97f\\})|(\\{2a7ada19-27c1-4f16-b67d-64344e85565f\\})|(\\{7faf6c45-9883-49c8-9d90-c70fd4fb72bd\\}))$/","prefs":[],"schema":1559835473927,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1557381","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3f781593-e000-464e-b46e-204201f42003","last_modified":1559836209248},{"guid":"/^((\\{4580e89a-d987-4a54-acd5-103eb91374df\\})|(\\{04767859-e649-473a-9ff8-1491f9217a2f\\})|(add-on@fdvoyzaxvni)|(add-on@mxdshahek)|(add-on@plgargwikihoves)|(add-on@plgbrhovtwitpor)|(add-on@plgeshovwikies)|(add-on@plgfrhovinstafr)|(add-on@plgfrscroltwofr)|(add-on@plgnlscroltwonl)|(add-on@plgsngicosnsac)|(app@clzohispatolas)|(app@plgarghovtwitt)|(app@plgargtydownesp)|(app@plgautriczoomde)|(app@plgcohovtwites)|(app@plgdehotwittde)|(app@plgdeudownlde)|(app@plgeshovtwittes)|(app@plgindhovtwiten)|(app@plgitscroltwoit)|(app@plgnlhovtwittnl)|(app@plgphscroltwoen)|(app@plgsajjhamzooph)|(app@plgsingchewmve)|(appapp@plgindzoplshind)|(application@arzoplgirasta)|(application@blibluk)|(application@breplgdownporbr)|(application@es9hsgaedr)|(application@es10gfjqzma)|(application@gerluk)|(application@grasow)|(application@plgbehovtwittnl)|(application@plgbelgdownflam)|(application@plgbescroltwonl)|(application@plgbrhovwikibr)|(application@plgdescroltwode)|(application@plgfihovinstafi)|(application@plgindiendownen)|(application@plgindzoplshind)|(application@plgphhovtwiten)|(application@twexispolavieda)|(ext@es8dffdsghe)|(ext@plgagscroltwoes)|(ext@plgbehovtwittfr)|(ext@plgbelgizompnl)|(ext@plgbgzowomawfr)|(ext@plgesscroltwoes)|(ext@plgithovinstait)|(ext@plgsescroltwose)|(ext@plgukscroltwoen)|(ext@sgdlpictomagi)|(ext@uksfdahdhsc)|(extension@es5dssdsj)|(extension@itsfahqiaxb)|(extension@plgauthovtwitde)|(extension@plgbrscroltwopt)|(extension@plgdehoverwikde)|(extension@plgfrdownlnewfr)|(extension@plgfrhoverwikfr)|(extension@plgfrsearchfr)|(plg@defdgajbisl)|(plg@es6fdhfec)|(plg@es7fdsfddqa)|(plg@esfdhalmbwn)|(plg@frhadiadsk)|(plg@indplgomenawc)|(plg@plgbescroltwofr)|(plg@plgbrhovinstapt)|(plg@plgbrsearchpt)|(plg@plgesdownopenew)|(plg@plgitadownaudit)|(plg@plgithovertwitt)|(plg@plgnlhovwikinl)|(plg@plgnlscroltwonl)|(plg@plgnorvegzoom)|(plg@plgsuhovtwittde)|(plg@plgukhovwikien)|(plg@singplganowong)|(plugin@frmdehpzamdoas)|(plugin@pldinddowninen)|(plugin@plgdahovinstada)|(plugin@plgdesearchde)|(plugin@plghowtwifr)|(plugin@plgitsearchit)|(plugin@plgitwikihoveit)|(plugin@plgnohovtwitno)|(plugin@plgpaysbasdownl)|(plugin@plgukendowauden)|(plugin@plgukhovtwitten)|(plugin@ptgouloumette)|(plugin@sgpongextejmk))$/","prefs":[],"schema":1559815025832,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1557258","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"67ab85b2-4241-4f2a-8589-801b4221b79d","last_modified":1559835396847},{"guid":"{ca6a76c4-1831-4e90-9ed8-2a3768114563}","prefs":[],"schema":1559739635606,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556974","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Xtif"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5c7614a2-793c-454d-967e-35b06de2cbd1","last_modified":1559814857242},{"guid":"/^((\\{8dcc43e0-bd17-44db-a0a1-4cf179f4a97f\\})|(\\{a4ef8092-6d9b-4ca2-bc6a-021fc9e8e156\\})|(\\{9fb5bfd6-27d6-4321-8af9-47b6ceacac3f\\})|(\\{3c9052cd-10e7-4ccf-9dda-8524cccf66a7\\})|(\\{da554ce8-5c96-4511-93f2-4e00a85aeb20\\}))$/","prefs":[],"schema":1559677299211,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1557027","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a7bc4a56-2f54-4791-b644-0ed2403bb9db","last_modified":1559739185033},{"guid":"/^((__MSG_name__@crx-to-xpi)|(\\{3fedc417-0513-4d15-a7e5-978d044cc9b9\\})|(\\{5c0f4cf6-b6f5-4485-a941-6c25f65c54eb\\})|(\\{5e1948ce-2889-4504-9e53-170753e731f6\\})|(\\{5fbf70b1-6dd8-4cd3-83fd-fbc53c59b7f7\\})|(\\{6ed4cb78-09ec-4a85-ad8c-d29382beb6d2\\})|(\\{6f7b3f15-30ab-40ce-9424-9a03a4969bea\\})|(\\{7d516686-2f77-4f2f-8a24-2441f9661187\\})|(\\{8c50589a-419d-40b5-8edb-4027a509725a\\})|(\\{8cf8a461-47f0-4eef-966c-faf0ae9593f8\\})|(\\{9ae1dd88-5e97-4ff4-b6a6-907689b6289b\\})|(\\{17a98bce-6b45-4c91-82ac-2916264e79ad\\})|(\\{50bf8563-c1e1-4c6d-80f8-281cd0d9f453\\})|(\\{51c03d30-c160-409f-be23-a576bf6ee2a6\\})|(\\{76a4a4cd-0bbb-4c6b-b285-d3aa4b55a99e\\})|(\\{94c8b1f5-7675-48fb-8c2b-3a8c7faa059e\\})|(\\{110b4b76-4314-4c63-9ae7-01e0e30f995f\\})|(\\{204d5f5f-d2bf-4892-a35d-e02d7436a410\\})|(\\{358af48c-726e-4853-a941-a19f9f4bcf8a\\})|(\\{02110a55-b817-49e7-bddd-5ce06d7f66e3\\})|(\\{9521b96b-f232-4689-81eb-907ba68872fb\\})|(\\{83034ff5-c83d-4560-8e6e-646862d2f405\\})|(\\{167357db-2afa-43a2-90df-ca2c6527ed78\\})|(\\{08429889-d4dd-4dc0-a607-5e26d976f376\\})|(\\{20289793-a4b4-48de-b640-672e6be44f5e\\})|(\\{a1be3447-d87d-409b-8721-d895935f65b8\\})|(\\{bf599b22-fc5d-43ac-ae24-343016cf6a94\\})|(\\{c8faeded-34a7-4eb6-8e21-407c82040ca1\\})|(\\{d8b5848f-b314-483b-8fd3-9f919f0f3b8b\\})|(\\{d768a761-3df5-4676-8cbe-5e3f4f426f6d\\})|(\\{e5d45ac7-1a6d-4ec8-89ae-d75ff07b89b3\\})|(\\{e5705290-3609-4b11-a062-6c55fd074d80\\})|(\\{ec92f712-38a6-4d81-80fb-529990a5b83d\\})|(\\{f14fbd1c-1df9-4ab3-a983-a8889f88fec2\\})|(\\{fcdb43b5-add6-49f2-a102-761147cb88fe\\})|(\\{fddfb568-5055-4dc7-ac3c-5eabc69c3c75\\})|(anhjddeakbabimdgmonfbnpbainknbfa@chrome-store-foxified--782543786)|(anhjddeakbabimdgmonfbnpbainknbfa@chrome-store-foxified-875652714)|(darktheme@addon\\.com))$/","prefs":[],"schema":1559660128156,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556759","why":"This add-on violates Mozilla's add-on policies by changing request setting without user control or consent.","name":"Malicious request manipulation add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6016087e-a255-4d70-8ffa-d7095af42e00","last_modified":1559660502221},{"guid":"{31dea008-38a8-44c5-8404-d1b110f47ab5}","prefs":[],"schema":1559648801945,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555768","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"FastProxy - \u0423\u043a\u0440\u0430\u0438\u043d\u0430"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.2","minVersion":"0"}],"id":"dc8887b5-eae3-4cc9-937f-229b8830ba83","last_modified":1559649064547},{"guid":"{4bf7c817-a8ab-4d98-b84d-65f79f05415d}","prefs":[],"schema":1559647486096,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555768","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"FastProxy - \u0420\u043e\u0441\u0441\u0438\u044f"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.14","minVersion":"0"}],"id":"96dbcd8a-d40a-4949-957b-b6eda96d0b95","last_modified":1559648801932},{"guid":"/^((\\{366bbde3-553b-4587-99d1-ce34f6b52e1b\\})|(\\{af48b3a0-a899-4722-a6b0-72ea823c9c57\\})|(\\{bc4dba63-23da-47ce-9ed5-574859c80ae2\\})|(\\{e390c529-7e38-4191-9cee-7b6902c9d833\\}))$/","prefs":[],"schema":1559647399044,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556700","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0561368d-755a-498b-a3ba-55274d9bc925","last_modified":1559647486083},{"guid":"{5a3477ec-7abe-4efc-b44a-7ede3cc02217}","prefs":[],"schema":1559563381261,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556698","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"youtube video download pro"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"94404f29-bf39-473a-a299-57d922f51c6c","last_modified":1559647399030},{"guid":"/^((jid1-93CWPmRaVPjRQA@jetpack)|(\\{3c78ca35-67af-4917-a24b-7699456ca61e\\})|(\\{8a8f48ed-3daf-41b9-88f4-73730459aaf6\\})|(\\{f906b9c7-576c-45ad-8f48-358271e15e5b\\})|(\\{de4f3cf2-cd35-4a2f-a405-33a4a29918a2\\})|(\\{7a365978-94e2-49d4-b5f7-6178dc80ed69\\})|(\\{dbc00301-7930-4421-91d8-23bf463228c2\\})|(\\{4f42055b-fd40-4b98-b71f-a58725d729d1\\})|(\\{8b6ae26a-4479-4727-bd89-46aef6f6e5d6\\})|(\\{b6a95353-bf1f-4c03-b4e5-43eca107ecbf\\})|(\\{933d68b5-80f4-44ba-bceb-2a6338c0ac7e\\})|(\\{cc9eb257-0f4e-423a-b124-318c59271a3b\\})|(\\{d0dc10cb-6b80-4e88-aec9-605d4e75ae59\\})|(\\{8dc1a829-e888-4ce5-a19e-614277de4d7a\\})|(\\{81ad5a42-34cb-4c35-b354-2306dbe418fb\\})|(\\{2fe8edfa-61ab-4257-848b-59def269a511\\})|(\\{55de894d-cfd0-4654-af30-719020792149\\})|(\\{4b9ffc29-0e02-4583-89d9-495084f96b43\\})|(\\{aa94dd9b-7d23-4776-ac2e-9939a3cf7bb0\\})|(\\{b43a0fd7-b010-42ae-a613-db7e792c995f\\})|(\\{af57625d-4b59-4028-874d-767a37bc9ebd\\})|(\\{84387d47-147e-4d50-8a3a-6e2bb4b522e5\\}))$/","prefs":[],"schema":1559562690935,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555945","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Adobe Flash Players and related add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a9526a76-d420-4adf-9a57-7096172d6077","last_modified":1559563142131},{"guid":"/^((\\{e914f532-5b99-4c2c-a6d9-56c6f9e07f09\\})|(\\{d7904110-ef0b-4daf-8fe1-1627c9cd14b9\\})|(\\{091d1ebc-55f9-4af0-871a-b3b383b70241\\})|(\\{eaf253cb-0418-4994-98cd-4fcfb5b827c1\\}))$/","prefs":[],"schema":1559562473865,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555848","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"WFot and others"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"740446f0-e16d-484d-a946-873f92d78c79","last_modified":1559562690921},{"guid":"/^((\\{3d35fa06-3f8e-457c-9ffa-a115f33e8e7b\\})|(\\{fd834065-2938-4522-ae8c-55592bf7e870\\})|(\\{d52afc01-3504-45eb-aa06-3fa55d2dc7cd\\})|(\\{2a34eba4-2a55-4863-91a6-c389d8e108c9\\})|(\\{45082e42-ceef-4df8-9f27-b5adf766ed8d\\})|(\\{8f77cfd1-6eee-4489-93d0-ae8627d8211d\\}))$/","prefs":[],"schema":1559562343779,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555481","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"BatchSerialized and others"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"10b029a4-72af-4e6a-b53a-492b94d1813f","last_modified":1559562473850},{"guid":"/^((\\{0c955fab-3d51-4989-aca5-d806cf0f2ea4\\})|(\\{1b382a66-46e8-4d33-a8a4-a857dc03cf12\\})|(\\{3f41aff5-f248-4b99-9c76-b7d192d9e979\\})|(\\{5c3d28a2-b778-4b48-9d71-da6fc2c37ccd\\})|(\\{8ef9fda9-1384-4efa-bbac-02f76f9a75dc\\})|(\\{8fd2e113-76cc-45cd-b4b0-cbef46166d76\\})|(\\{9c914f01-3e9f-45af-8d53-618ce7659d96\\})|(\\{70d353ca-2edb-4196-9294-d80cbca9ae3a\\})|(\\{79fba572-6a81-42be-abf8-92037bd908db\\})|(\\{106c67c5-a780-4076-af33-94945b16d4f1\\})|(\\{177bb2d7-15a6-475a-a34a-94f964b22731\\})|(\\{248d26ad-c8d7-4a1c-8d7e-22a36226f52b\\})|(\\{679b892e-c913-4993-bc18-1b737ac5de8d\\})|(\\{877e11b1-0725-41f9-b0e0-1b89cd88097a\\})|(\\{902b9979-3273-44cd-a717-8c55aec563fe\\})|(\\{3515e081-cd1d-482c-898a-62ade3007f8d\\})|(\\{4080f1c9-b07f-408e-9678-bdda4822f536\\})|(\\{7631efe5-237b-44e3-9193-205346744e31\\})|(\\{8157ad65-a32e-41f3-b99f-5c6f60a82d3e\\})|(\\{9434fbdd-d45c-43ee-98ac-a1c794f89c43\\})|(\\{19976dc8-c059-4058-a7b4-ba734cde798f\\})|(\\{32678e4c-b8df-4a19-91d8-3294b84ce78a\\})|(\\{773450d4-d2d7-48c2-9378-5affb64c4575\\})|(\\{894136b3-8133-432a-b46d-6f528608aa49\\})|(\\{7804268c-4d4f-44c1-a53c-2680e61b6687\\})|(\\{a12fdc00-7623-459d-8188-8e954b6f6eb7\\})|(\\{a46f0ac4-bd96-475d-bba6-2ab01575e06f\\})|(\\{c7dfadc5-8d54-4f00-bc2f-c1ba1483eb41\\})|(\\{cc89ddb5-7f2d-4b9c-bcf6-fc8057869838\\})|(\\{d7c4c15f-e91d-496d-8f78-79809c114a57\\})|(\\{d2925b02-9e1e-4b81-9a72-714a772be945\\})|(\\{dc59a997-f35a-4fa6-9ac0-40c1dce4829b\\})|(\\{def69fda-720f-4e2b-8783-93491939d9a1\\})|(\\{dfbe87b9-0fb6-41fb-a143-f8e0a47452f7\\})|(\\{f778e9f0-ea54-4264-83fb-6783906bce17\\}))$/","prefs":[],"schema":1559504489486,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556339","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keylogger Add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e57383a8-d67b-40b9-8df0-ac8a8a6321fb","last_modified":1559555647852},{"guid":"@yt-adblock","prefs":[],"schema":1559145199457,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555403","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"YouTube Adblock"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c34988ff-b712-4123-ad14-11d24d2d3a18","last_modified":1559147777278},{"guid":"/^((\\{6f35f413-21ef-4d85-96f7-64b7cccb947b\\})|(\\{7ec94ecf-7215-4cd1-a193-402c3b6e8474\\})|(\\{767e59b0-41da-4cf5-bfe1-56c8402c1ca2\\})|(\\{0770eaac-f694-49a9-bac0-39933e62862a\\})|(\\{5319ec46-b72f-4b1c-90a7-67b1b392af05\\})|(\\{7765a798-ae6b-4ea9-920d-fe7f6d07043a\\})|(\\{93927b7e-0c83-4ce8-b66e-36bb88e2551f\\})|(\\{bd6bd2fb-8614-4302-a67d-bf4f7da55e20\\}))$/","prefs":[],"schema":1559136970465,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555357","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons exfiltrating user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a8ca8b1b-1897-45b6-b12a-b64c45d8959e","last_modified":1559139447403},{"guid":"{f6bca217-8cdc-4c85-b8ae-30da228dbd71}","prefs":[],"schema":1559127564301,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555026","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Gmail checker plus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5a110749-4dbf-46c9-a6a8-56c19d6eb346","last_modified":1559136956255},{"guid":"/^((\\{cc9f487a-618e-4c48-b0a9-65f25d53c887\\})|(\\{8fcc31d3-f865-40fc-9f31-a38ab9973e9a\\}))$/","prefs":[],"schema":1559124226003,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555282","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Remote script add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c3025513-0716-4a0b-8a1b-9d5636c90f79","last_modified":1559124311799},{"guid":"/^((\\{207df7ea-6d21-4fdb-b4fb-566ae3666245\\})|(\\{e622e0a7-d0c6-4747-bf5f-fe0321da85e6\\})|(\\{8ea990c1-ea81-4aa8-8f0b-ab6ddb888bbc\\})|(\\{1f0f312f-85ae-4603-9761-4dea6a699227\\})|(\\{f9b0e524-7ccc-4392-9130-09a7c84f9730\\})|(\\{f9567a86-accf-4710-bf33-d5ff890416af\\}))$/","prefs":[],"schema":1559123848301,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555280","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keylogger add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"32891270-8ebe-41b1-b89c-9caf80944c89","last_modified":1559124225988},{"guid":"/^((\\{8fad4bef-56e9-4879-8780-ca7c18aa1171\\})|(\\{a6ce9b9f-cea4-44b6-ada5-a96c6bbf6d83\\})|(\\{a14b3807-8409-4b4d-bb16-5d1996492672\\}))$/","prefs":[],"schema":1559122494410,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555273","why":"This add-on violates Mozilla's add-on policies by collecting ancillary user data.","name":"Keylogger malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"57a3e7c7-3cf9-46a5-88ac-3f87029e4b5a","last_modified":1559122823674},{"guid":"/^((\\{5d840f65-c476-479b-a2e3-5a19b7a0a853\\})|(\\{021b8ac0-4a36-4294-8261-662d947a83d4\\})|(\\{038b50d5-8590-4479-93d2-4c07b619f402\\})|(\\{882bf6a6-47d7-47c3-8bbf-4f8fb259358d\\})|(\\{0918fee5-aee0-4e84-9613-a8b1e59dfcff\\})|(\\{90854ba5-e748-4f74-b8c2-9a6aa409894c\\})|(\\{a22263da-63d6-44fc-bdb8-381ba7e3c36a\\})|(\\{ec50f1de-0bae-4bfa-b665-59254094089e\\})|(\\{f48a449e-54f7-44fd-90f2-34a9526d5766\\}))$/","prefs":[],"schema":1559046153546,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554962","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keylogger add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6c8516bd-c427-4a7a-9f52-10c942e083a2","last_modified":1559046242210},{"guid":"/^((\\{a43383bc-1d39-4d94-b353-ceaf942c7d52\\})|(\\{0a727455-07c0-4c8b-a0e2-7853347e13e4\\})|(\\{3810f596-bf50-74e2-a47c-9894ebdc5179\\})|(\\{03ce6944-6491-4f7c-ae42-3f2a9c3f9c99\\})|(\\{3523e8cd-09e2-4442-ae13-e1d1575d4b27\\})|(\\{a08f79e0-c70f-4021-80e9-44614d5f8b5a\\})|(\\{e43b625a-f337-4cd6-b3d1-6763b5213223\\})|(\\{744c464d-4cc3-4303-b3d1-5b756144cd5e\\})|(\\{c948603c-496d-426f-a7ff-9af3d7ac1380\\})|(\\{ceaea029-439b-4d0d-99ca-a261de44d0dd\\}))$/","prefs":[],"schema":1559039806318,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554942","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keylogger add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"940f09a9-e0ba-4b98-8dd1-edb78573b62f","last_modified":1559039956017},{"guid":"/^((\\{d227e621-ef26-4b4d-b724-0138e5bb03dc\\})|(\\{ec418296-8754-46fa-a265-9856f1706f8d\\})|(\\{e64aeb61-251e-46ed-863c-b9a7c4849cfd\\}))$/","prefs":[],"schema":1559039652168,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554941","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Service Processor and others"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2ea28df4-7fdc-4571-95ba-10b61e270c72","last_modified":1559039806304},{"guid":"/^((\\{e7f0881e-39e9-4569-85b5-71b925294de3\\})|(\\{4d19382a-c81d-488a-98ac-f73484a6dd2b\\})|(\\{6d68222e-1982-4b74-9fd1-52b6a4b4c2a5\\}))$/","prefs":[],"schema":1558986099090,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554675","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Microsoft .NET Framework Helper"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2b5e298d-9dfd-4c66-ae18-1671001f4cf2","last_modified":1559039652155},{"guid":"/^((\\{59feb34b-bb64-4063-933b-d5af131da847\\})|(\\{9d84eba6-c1cb-4ec2-8b4b-b6be1ecd902a\\})|(\\{7c98044a-2ab6-481b-bc75-e2e5df6c4de8\\})|(\\{62457714-ded1-44fd-b107-b14da63a2850\\}))$/","prefs":[],"schema":1558975224053,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554740","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Youtube Downloader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a5c8e26-d7c8-4c45-91cc-d86bd1aaa0f3","last_modified":1558976967835},{"guid":"/^((\\{6f2cec94-2f78-4812-9898-1bf98d7ccbfe\\})|(\\{e8cff71e-5c43-4fd3-b63b-7b9f6c29d54c\\}))$/","prefs":[],"schema":1558959050284,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554676","why":"This add-on violates Mozilla's add-on policies by using a deceiving name and exfiltrating user data.","name":"Data exfiltration malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"98aa70f7-d993-490b-ab07-108cc5a8f38c","last_modified":1558967785430},{"guid":"/^((\\{b3c1723b-6e69-4a3d-b3f6-90793bbd6500\\})|(\\{ba38e6b7-7480-4e58-9f5b-162e83c6ece8\\})|(\\{ff08056a-a34e-44b1-bcae-805d3770738f\\})|(\\{29806031-d49c-4ef3-a37a-32ee29e5fc0b\\})|(\\{541e33f8-ec74-4311-b7a3-8baa185aeb7e\\})|(\\{d8196867-5419-450c-aee4-1e349b4b0b5f\\})|(\\{ebd7a4e7-056e-4009-bb5e-753c1d1eed93\\})|(\\{01935a63-d565-478a-9f91-9ff9aa49ce61\\})|(\\{d0e7ce73-9829-4a10-b5f2-83f8bf2c730b\\})|(\\{b70f302a-84ad-4f10-8af3-f6ea4aa327fb\\})|(\\{e5f1a2e5-798b-4915-b109-5ebbe2b57821\\})|(\\{7921669d-959a-4992-857d-f47761b5b4ac\\})|(\\{80808d17-bf74-4b91-8fa5-694c3107950d\\})|(\\{84984575-1b73-4b96-ba1c-d9959393e742\\})|(\\{20587256-b018-41c2-91fc-5a278a2837f2\\})|(\\{577f8c9b-c791-4999-9c39-1e4584f4e9d6\\})|(\\{3691584f-c3a3-4fde-8817-b2501802ef54\\})|(\\{e1680c37-e6ff-4280-8f97-943d77e63022\\})|(\\{013ae092-188d-4e95-9138-2b4d98dda7cd\\})|(\\{05e3806c-00e6-40c7-8503-9c30f3db8e63\\})|(\\{9552ab33-c43e-4338-a020-80dc3636f577\\})|(\\{8fd3c74f-57d7-4e1b-9e52-6c4517ef89f0\\})|(\\{9b0ad6aa-7c54-4655-aca5-78e973b0ebd4\\})|(\\{e648ecf7-4858-40f8-9d85-5cc5f68eae6c\\})|(\\{9430fbaf-aa5d-4492-92c2-0f1354c5c860\\})|(\\{d58bd1fd-6451-42d5-b066-4baf7d4271f9\\})|(\\{948790d7-57d3-4db1-8fc7-7ccee4abf047\\})|(\\{1b8d5392-1641-43c1-a6d6-d1429e9d4109\\})|(\\{3ae072ea-3ffc-4395-8f3c-ebe92f355c3d\\})|(\\{32f9b8a8-505a-4621-979b-b6919633f787\\})|(\\{e939e079-1e15-4491-95b3-6fb8a836e80b\\}))$/","prefs":[],"schema":1558954910531,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554635","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e454fe70-d5d7-40c0-a571-e9253d1361d5","last_modified":1558955090783},{"guid":"{19ed30e8-28ad-405a-a7e4-18a8c78b1078}","prefs":[],"schema":1558951086426,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554624","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"OpTurs"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3a3b8837-605f-48dd-8b40-a66777f45108","last_modified":1558951513292},{"guid":"{9834ff7f-e3ea-485a-b861-801a2e33f822}","prefs":[],"schema":1558813299527,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554465","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"LinkT"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b9496c5f-b37d-4b8e-abaf-509b980ab553","last_modified":1558868765210},{"guid":"/^((\\{0e9ab3be-c296-4825-aecd-3923ded051f6\\})|(\\{9f737295-e8d2-4e70-b226-8809f6b135c9\\})|(\\{68e1d557-8fc1-40e0-b197-43f8f3d36239\\})|(\\{90221614-a0b9-4301-b141-3f8a23fb4835\\})|(\\{d3255cb0-bf30-43b0-afd3-db97bfeeede4\\})|(\\{b4498268-c0d0-435c-944e-8dd6e8518654\\})|(\\{93d90a45-a10e-47df-a106-2ffeefe3052a\\})|(\\{d7b04034-ea8b-4219-ad1c-ffa061a2e0cb\\})|(\\{391772ba-a23c-4892-b30d-45d2a935be3c\\})|(\\{0b2aaa98-1f4b-483a-815f-3f864711a737\\})|(\\{2564ed8f-305b-4ade-a787-6fae696c14ab\\})|(\\{fc2fe0a7-9886-4a7e-9850-cccc2879b0e7\\}))$/","prefs":[],"schema":1558712940017,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554227","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"768bde60-2086-487f-b374-ca3fa6e712fd","last_modified":1558713145915},{"guid":"{4ee078c0-ded1-4f82-9bb1-de645e778924}","prefs":[],"schema":1558712019540,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554097","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Switch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a0508904-1f0b-4352-a5e6-a33f8fa26ce8","last_modified":1558712846698},{"guid":"/^((spp@avast\\.com)|(\\{056790bb-9676-40fb-845a-feae6dedfbee\\})|(\\{15d51e39-3ccf-4ce2-a434-dbbf1785e867\\})|(\\{2bbdf86f-3c6b-48d6-9934-9051ce5f5976\\})|(\\{2f6d1519-33b5-4970-a7ec-561f5e067ba0\\})|(\\{2fd10339-a9db-4846-bdd7-ee41cea97312\\})|(\\{31390faf-ef95-4f4b-a1a4-3c3a09dd7b5a\\})|(\\{411bfbf9-646d-401c-b87d-e77d812a68ce\\})|(\\{44e4b2cf-77ba-4f76-aca7-f3fcbc2dda2f\\})|(\\{5422d0cd-3b45-4fcd-9886-463be7e1a05f\\})|(\\{5ae5a1f8-a994-4e61-8c99-54a9fe58a9c4\\})|(\\{5d4c1f36-196d-4e9a-909b-8ad138546f79\\})|(\\{7150cd87-1b5f-41ea-b659-5cae4b753e2d\\})|(\\{78a02646-2bf6-417e-9498-32f29a4ef89a\\})|(\\{7bdac7a1-be1d-4ecd-8cf1-a1db64adfaaf\\})|(\\{80686e70-c06a-4ab3-b7bf-fd4c05985c1b\\})|(\\{83830f14-c5d0-4546-af99-cbaba3ab832d\\})|(\\{869a5e06-732e-4635-8da3-90a2802f9c80\\})|(\\{87ea875a-396a-4c7b-b202-cecd5a4fe0d4\\})|(\\{94847025-c5a9-4dd7-83df-54c17b79eeb8\\})|(\\{992e4d3d-f56b-4f71-b826-0dd976681228\\})|(\\{a259d36e-9c24-4216-8b28-d3e83c07a832\\})|(\\{a669b31a-3a2b-4c75-838c-a8542f77c79f\\})|(\\{af35bf73-7d25-4286-9be6-fa822818ac82\\})|(\\{b01f0319-b398-4a6e-b9c9-e59e2d99eee7\\})|(\\{c516baf9-a911-453e-be0e-26389cfb33ac\\})|(\\{c88fc74d-31b5-40d4-bb8a-008f2d7a1ea0\\})|(\\{ca6b87f3-2d8b-49ea-9627-95e900c5f108\\})|(\\{cdc01730-6108-4581-b5da-36f7fa8e3d2e\\})|(\\{cfbbd54d-26dd-4f20-b0c9-26b2d920bc04\\})|(\\{d384c2ef-9e42-4dfa-bba5-73b9b6ad2e61\\})|(\\{d7ef08b6-ef77-43b6-ad60-74ea67495674\\})|(\\{dec788dd-9a21-416d-91c7-bf79250cab04\\})|(\\{fb182266-3336-4dcb-8898-859affe73e7f\\})|(\\{fe17e98b-1ed8-45fe-a6e5-8280902d2500\\})|(\\{febfdee8-5724-4aea-8b70-6be9e22248fc\\})|(\\{ff471567-6ff5-48d9-8db6-d2c9134f0aed\\}))$/","prefs":[],"schema":1558674107244,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554004","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Keyloggers and Fake Anti-Virus or VPN add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3b36e078-7c88-411c-9366-033ac185c66d","last_modified":1558711200727},{"guid":"{e256d52b-d9ae-4709-aa9f-ba4d1eb1b284}","prefs":[],"schema":1558637428118,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553531","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Reading Cursors"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4b943d8a-828f-45d2-b8e7-f16e6c3f860c","last_modified":1558637573461},{"guid":"{7d3c46ed-b9f7-497e-bccc-e6d878032d14}","prefs":[],"schema":1558636256156,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553746","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Zoom"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1282ea00-9aa1-47c6-9a93-4fc17aa4fcc4","last_modified":1558637428108},{"guid":"{cc02a70f-0610-456c-bc5e-5eefb6716904}","prefs":[],"schema":1558636068339,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553761","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"headingsMap"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"37c5c7d6-e0ce-4c6b-8c89-49d94b6fe159","last_modified":1558636256148},{"guid":"/^((\\{5768d1b3-4e2d-4088-bd65-c7a62353ea3a\\})|(\\{65b99c4e-a9bb-4bb9-913d-503fa9bcdc46\\})|(\\{31ebd11b-bb60-403b-94a9-e09a3bf7d64f\\})|(\\{571339cd-9f45-47be-9476-767a62cb6c97\\})|(\\{ed4f9665-1851-4398-ab15-46c5e3ab8fac\\})|(\\{972319b8-8dd8-4ed0-8de2-9bc6582f0560\\})|(\\{4a0d8618-3e21-4bb8-8ae3-d04316b55a1e\\})|(devlopper61@avast\\.com)|(\\{8df3e056-6d4f-42fa-b0ad-40ee9a79d9c4\\})|(\\{e7e68020-07de-4f9f-9aec-6df29e9f64b8\\}))$/","prefs":[],"schema":1558635731472,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553857","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Easy Screenshot, Youtube Download*"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7f8e7584-6c6c-4579-882a-6f6ed21766dd","last_modified":1558636068330},{"guid":"{b19d065e-4460-4714-9208-3f2b38907522}","prefs":[],"schema":1558537447980,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553521","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"QxSearch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"60311c2e-044e-4e24-9abe-6ee75d7f5467","last_modified":1558537465968},{"guid":"addonfx@horoscope-france.com","prefs":[],"schema":1558537035045,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553518","why":"This add-on violates Mozilla's add-on policies by overriding search setting without user's consent or control and executing remote code.","name":"Horoscope France"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ec32be61-2646-4686-9829-7cff21f5d1f8","last_modified":1558537447957},{"guid":"{65dc18e1-109f-4039-929b-f8a7a29be090}","prefs":[],"schema":1558536906311,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553517","why":"This add-on violates Mozilla's add-on policies by overriding search setting without user's consent or control.","name":"Magnif)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bf7a8bf0-e60e-4516-9e93-777c19509ef6","last_modified":1558537035028},{"guid":"{3fc1db2b-e7db-4512-b24e-1faf4d3a1b4d}","prefs":[],"schema":1558536030188,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553479","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"quikaxes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"43966df2-e95c-415b-bffc-13814e1d2b11","last_modified":1558536765550},{"guid":"{a37a7625-b64e-45f3-8b79-f71634f14438}","prefs":[],"schema":1558467699805,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553326","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Lift"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7e86024e-5621-4ded-bc16-184f94fa2e29","last_modified":1558528706505},{"guid":"/^((\\{3e20d1e2-a7ee-4ce2-ab9c-51c8300a8ff6\\})|(\\{30906bbc-0942-445b-89c8-f74dac0edb8f\\}))$/","prefs":[],"schema":1558382009200,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553071","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"Amiri"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9c5f5681-8547-4e65-9c05-5796e483b8e1","last_modified":1558434518612},{"guid":"/^((\\{ec19994c-c5a5-46d9-bd4d-0fc417c6f4b8\\})|(\\{a0be7e8d-b0a3-460b-8a52-429c79e49ee2\\})|(\\{1814dd58-4147-4cca-a0a3-c5aa35966d9c\\}))$/","prefs":[],"schema":1558381075651,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551937","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Inspiring Quotes + Daily Quote Tab + Pug Extension"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"efecef61-549b-4c13-8a52-394c636dd24b","last_modified":1558381320379},{"guid":"{dc6176c4-a192-4a92-849f-ad13abe889ad}","prefs":[],"schema":1558379927394,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551934","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Easy Speedtest"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a5fa8f77-7761-4996-a11d-d8cf723103da","last_modified":1558381015030},{"guid":"{ac4be7d1-4db6-4b4c-bf48-e345350bcb59}","prefs":[],"schema":1558379796996,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552830","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code and exfiltrating user data.","name":"Browser type hider"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"41137e55-8a11-4259-a009-42c29daadf17","last_modified":1558379927382},{"guid":"{da993d54-9605-42f7-a32f-9f565245070c}","prefs":[],"schema":1558362750147,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552834","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Adblocker"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2212748f-ad60-497f-af7b-50d20b326e40","last_modified":1558379796981},{"guid":"/^((\\{2b3eed60-8f6e-4afc-99f1-38d12f4253da\\})|(\\{3a6f9dac-3a93-4f6f-8b74-9ebc0f501306\\})|(\\{46bba8e9-7a75-4dd6-932e-bdd74141cb87\\})|(\\{4b480ab6-b63a-43f8-b4f4-d312972ab086\\})|(\\{6106687e-ca0c-4d7e-93bc-115929e4d299\\})|(\\{717ce133-3c0a-448e-b6ed-fc7d22b76534\\})|(\\{7224f1ae-c342-4bb5-8441-d324a8951624\\})|(\\{768e9638-2eba-42e4-a13a-4f3f1df391a2\\})|(\\{7b655f43-c871-46d2-8f6d-31989e8ee939\\})|(\\{7e46c692-9488-4671-8c39-7830f92628b0\\})|(\\{83bc6b56-545f-4ba1-a80b-f82d55cc0f68\\})|(\\{970a774e-b7a7-498f-b3f2-d88b14b4dab1\\})|(\\{9d2e8731-3287-46eb-9c19-ece63fe693c7\\})|(\\{a37ccd20-e04f-4949-b055-98ca58639606\\})|(\\{af85f82c-3e8f-4ee5-ab53-b8d3aaac34ec\\})|(\\{b35c6d47-8b07-4d49-89a9-dfe8c10f58f6\\})|(\\{c2485579-368c-4593-a1cd-985b2fa0b990\\})|(\\{c85c16ba-78b4-41b3-9201-f80fa662c52f\\})|(\\{c97e5535-6f2e-4d34-a5a3-0e6e07f7fd13\\})|(\\{ce7db166-9564-482f-91d9-3a450ec3216d\\})|(\\{d64a2c73-ff21-4e3e-998f-ec2dc42ad725\\})|(\\{db6d93c3-67a0-410c-b7bd-f72f267f0cec\\})|(\\{e513775f-359f-47aa-a3d9-eddc946aabe0\\})|(\\{f70258e4-643b-4ec2-9c84-de89009eec61\\})|(\\{f8794e87-82b2-4df4-bce6-db207f62c165\\}))$/","prefs":[],"schema":1558349836861,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552847","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0225ae55-626d-42b2-8f48-46ec95ec89f8","last_modified":1558361121954},{"guid":"jid1-HfFCNbAsKx6Aow@jetpack","prefs":[],"schema":1558343683249,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549020","why":"Versions up to 2.9.1.0 of this add-on violate Mozilla\u2019s add-on policies by executing remote code through the native messaging host.","name":"SConnect"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.9.1.0","minVersion":"0"}],"id":"413065ac-176f-440d-b4a7-0f928f3e330d","last_modified":1558349549359},{"guid":"/^((\\{78d3cced-d2a7-46e9-9fea-5be7ed61eea8\\})|(\\{3233777f-a1a7-4ea4-8c2c-fba1a0a68383\\})|(\\{0eb43948-2a3d-4490-b32d-7ca37dd83f07\\})|(\\{64fd625d-2977-46a6-96ca-77f81ebfd54d\\})|(\\{6e138cae-1be3-449e-a964-b3c3060d89b9\\})|(\\{f875c255-8b92-4229-95e1-6d9adaf20dd7\\})|(\\{3c62ef7f-ae8f-4baa-9d2d-27a377480b79\\})|(\\{35a91fe5-c255-498b-9f9f-bec506fdb257\\})|(\\{7d3c52e6-2b7f-4ce8-b28b-032306fe32df\\})|(\\{0ecf6f68-d506-4239-bc69-f77de8f03758\\})|(\\{7290f2b1-3d70-4990-a828-40c775c05f82\\})|(\\{50150580-86bc-460f-ae3a-12e51b9d842e\\})|(\\{a1b46cda-8a83-48e0-b355-7eca4250694f\\})|(\\{614d8f88-b5b4-4897-adc0-0207613f4d4f\\})|(\\{ddc259e9-3738-4b18-a00c-9259dad206ae\\})|(\\{5b2bf836-5322-4161-82dd-fcc8ac6e4247\\})|(\\{97a90c0a-5e3d-47bf-aacc-230e4cb1f2d1\\}))$/","prefs":[],"schema":1558341490879,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552764","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Search overriding malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4bda902e-fb36-417b-940f-992ab7a18fde","last_modified":1558343652556},{"guid":"{3241efcf-4bfe-4405-ba7e-029d3efb03bf}","prefs":[],"schema":1558341442463,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552681","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Neat"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"657d264f-23d2-40f9-bac3-1d7c8b5d8453","last_modified":1558341473815},{"guid":"{c4da221b-461a-4ed9-b2d2-6ef1842a94bd}","prefs":[],"schema":1558341410023,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552639","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Dimensions"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f48c8fe3-70c4-4d9e-84f4-79aeee9970f0","last_modified":1558341442447},{"guid":"{72a6bcef-d0ce-49f5-9773-1b78265174a2}","prefs":[],"schema":1558341352074,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552306","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"YtDow"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d4ab989c-1517-493b-9486-f0c4a59a1c95","last_modified":1558341410006},{"guid":"{ad6f5b9a-c894-4d15-8c65-4b0f5a29503c}","prefs":[],"schema":1558341285260,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551964","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Magnif)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f7135e2e-249f-45d4-bfe3-88b834ddb636","last_modified":1558341352061},{"guid":"{ad6f5b9a-c894-4d15-8c65-4b0f5a29503c}","prefs":[],"schema":1558313782700,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551903","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Top Scroller"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fdc0d028-2915-4130-a19c-c5819b3acc81","last_modified":1558341285245},{"guid":"websurf@mizilla.org","prefs":[],"schema":1557871049351,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550673","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Websurf"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a2b8447b-ea50-45bb-936a-64d790ebe448","last_modified":1557871228984},{"guid":"{d8f707bf-0a35-462f-8e4d-f90205770547}","prefs":[],"schema":1557870872432,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550689","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"STPs"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"be42b13c-301b-4304-a1ed-89b4c13d9eb2","last_modified":1557871049337},{"guid":"{0b66e692-1991-4b46-89df-c8101925bad1}","prefs":[],"schema":1557870310029,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551079","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Base6"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a308009d-3320-49af-b0b8-1174f5a25fe6","last_modified":1557870872418},{"guid":"/^((\\{198586f6-9fdc-4ce6-8f21-7bdd85eab432\\})|(\\{1cd349e4-1d52-46ec-b648-6da8ba2ef659\\})|(\\{28c26373-1066-4cb5-8e92-1926cb31f83c\\})|(\\{2b99ea1d-9e25-4005-adeb-2fc9fc6700fc\\})|(\\{2be44a2e-f432-4527-a249-f7a6aecc8464\\})|(\\{2eda700f-8674-43fd-842f-73289b6e317f\\})|(\\{3745fc58-1413-4029-aea4-e1aa8a2c0cad\\})|(\\{3c19f6fc-1b86-411c-8d9a-7fdde31600b2\\})|(\\{450f8d34-b065-46a6-bd9f-ee7f614d750b\\})|(\\{498e999a-2d6b-47e7-8da2-97e0f694f6ff\\})|(\\{56862943-b999-45ef-be94-b97211126ba4\\})|(\\{5dc4633d-2c01-4d8d-8980-a90055d0679c\\})|(\\{77101ac4-6fe7-43ed-8362-75ad2a4b3299\\})|(\\{83ae749b-9ab3-41f9-ba8a-f73470399abe\\})|(\\{8ef68e62-a602-477c-95c2-9b861f91e813\\})|(\\{b81c02f0-e563-4794-8fd3-18a65b0f35fe\\})|(\\{c03bf205-6673-4495-abd7-f12556d3d8ce\\})|(\\{d1e8be12-c4e4-481b-9be1-400f54257dfa\\})|(\\{d3f73060-8ca3-4c24-b389-6a896f43f538\\})|(\\{e5e98141-81c0-433d-ade2-4174ea951243\\})|(\\{ec6ff98f-7315-4cfb-88b9-e6a64bb97ef6\\})|(\\{ee765c0e-cf70-426e-ac5d-704c874202af\\})|(\\{f8a4dc88-e967-4c75-acb3-6176ab166bf4\\}))$/","prefs":[],"schema":1557849229557,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551093","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8436c1bb-43f2-42d6-acec-05145fdbeccf","last_modified":1557870310012},{"guid":"{61121092-5257-4607-b16a-12364832f0e4}","prefs":[],"schema":1557835907235,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551260","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"Page Image Previewer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dbd3690c-2ce4-474b-b13d-97f9ab2c54c5","last_modified":1557835935826},{"guid":"/^((\\{2e510835-3d3c-4995-ba75-2eee6ff203c7\\})|(\\{bc72fefd-ab07-40ce-8555-45f9b23ef8c0\\}))$/","prefs":[],"schema":1557835858186,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551259","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9ced28d2-c4bf-4933-b369-1ded1ca7f6dc","last_modified":1557835907221},{"guid":"{4037503e-7401-4ccf-8fc1-af9f8c9fc168}","prefs":[],"schema":1557835817321,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551243","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"APKCombo"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"abc5acc2-c9ea-4d44-b8ab-3fefb5723194","last_modified":1557835858172},{"guid":"{52484281-3051-4c52-9309-83896b989ddf}","prefs":[],"schema":1557835777799,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551162","why":"This add-on violates Mozilla's add-on policy by overriding search settings without user consent or control.","name":"Fppl"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"73b95004-eb42-428b-852b-3671edbc3913","last_modified":1557835817308},{"guid":"{3555a8e7-6fc1-4ad8-9e35-b09877d94a8c}","prefs":[],"schema":1557776499103,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551080","why":"This add-on violates Mozilla's add-on policy by overriding search settings without user consent or control and executing remote code.","name":"Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a941e00d-4ec8-41db-ac90-75041af68a3b","last_modified":1557835777786},{"guid":"/^((\\{da61a3e5-5a98-4c47-ae6c-f4db738f1133\\})|(\\{b0e13c2b-c1cd-426b-bed9-905bf9557fbf\\})|(\\{328c22c5-5f1c-4eb7-95a3-148fd4ad429d\\})|(\\{f6cca5fb-5aa1-471f-88f3-e2ffa87281ef\\})|(\\{d342bf37-554e-41c9-b67b-72769e59b82b\\})|(\\{03ec69b5-3e8e-4bb8-8eda-28f12c54bff8\\})|(\\{a8c876cb-af13-4ad9-9a86-fc3c0722b48c\\})|(\\{56136c32-0159-4368-9d28-c1b8b1515c89\\})|(\\{79bf4660-9729-444b-ae03-6c8005869611\\})|(\\{aa7fdaa5-d888-47e2-b27b-4fa4b3225339\\})|(\\{31e0d180-52b1-4c1d-8f84-7e625715edc4\\})|(\\{f7d20549-e5ee-4045-9e8f-9705bb10c104\\})|(\\{303abacb-760b-43c3-9640-5b456d92db78\\})|(\\{debabd67-2e0a-485e-8213-ac081065a027\\})|(\\{971e739b-c528-41b6-a60c-48fc3cdb52d9\\})|(\\{ffb3a485-2723-4a88-b3ad-8b29773759c4\\})|(\\{b076177a-a5c4-4652-9f6d-953f89f9a81a\\})|(\\{66210cb7-6352-45d5-9d22-ad7a0fb5e247\\})|(\\{8053ad7b-5129-4c74-ade9-8166c38e8636\\})|(\\{1a435c36-133e-4163-ac71-8701a147880c\\})|(\\{8c40c6df-7c9d-4876-bcbe-0621734aba45\\})|(\\{40e1e7d9-ae29-4aec-9465-5e0d49859583\\})|(\\{74eab03b-35cd-4950-b436-7afce3876e58\\})|(\\{95839c11-63a7-4b2b-b3d3-eee9d2c5c42d\\})|(\\{bfaa03c3-744e-48eb-8fb6-4ad61791d4d8\\})|(\\{f123e726-9396-4899-822a-172b8bcb2c5f\\})|(\\{157e255b-2053-4140-b95c-ff003b62bf17\\})|(\\{3e49a17b-b58e-417b-9ebb-a7e8c2317893\\})|(\\{4df1d536-e30f-4344-bee6-6ef2def890c2\\})|(\\{f33ce070-63f4-4d2b-823e-d52fc7a30ba7\\})|(\\{2003e2a5-e848-4fc5-8e7d-3af1efe4f992\\})|(\\{ff2157da-6981-40b6-aa60-d8125e73868e\\})|(\\{d89fa1e5-c9d4-4104-ad8e-00b39e5c6d15\\})|(\\{66e45d14-550f-4489-98c6-8a0caed33375\\})|(\\{86e6d45f-1dfe-4e53-bf52-22bf65b9ae6d\\})|(\\{e71407fe-e1ed-4755-af8f-dd64a952ce1a\\})|(\\{b67b3615-d8fe-4961-a41e-391864afde2d\\})|(\\{5785789b-ccba-44a1-9018-1135b56bd37f\\})|(\\{6dfb93d1-2add-471c-bbbc-b6164b4c1d94\\}))$/","prefs":[],"schema":1557495790401,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550581","why":"I\u2019ve reviewed the add-on and confirmed that it is collecting ancillary user data, violating our policies.","name":"Adobe Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fee4b92e-146b-437d-9cc0-95cfc800f0e0","last_modified":1557497630665},{"guid":"jid1-NIfFY2CA8fy1tg@jetpack","prefs":[],"schema":1557437285372,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547789","why":"The $rewrite filter functionality allows for remote script injection under certain conditions. Please upgrade to the latest version of Adblock for Firefox to resolve this issue.","name":"Adblock for Firefox ($rewrite filter)"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.28.0","minVersion":"3.19.0"}],"id":"8ff19ad3-e4e0-40e3-8f02-fd80d18f63b5","last_modified":1557437486195},{"guid":"{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}","prefs":[],"schema":1557437276676,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547789","why":"The $rewrite filter functionality allows for remote script injection under certain conditions. Please upgrade to the latest version of Adblock Plus to resolve this issue.","name":"Adblock Plus ($rewrite filter)"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.5.1","minVersion":"3.2"}],"id":"f0fc8d21-d0ec-4285-82d7-d482dae772bc","last_modified":1557437285359},{"guid":"{2b10c1c8-a11f-4bad-fe9c-1c11e82cac42}","prefs":[],"schema":1557437241208,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547789","why":"The $rewrite filter functionality allows for remote script injection under certain conditions. Please upgrade to the latest version of \u00b5Block to resolve this issue.","name":"\u00b5Block ($rewrite filter)"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"0.9.5.14","minVersion":"0.9.5.11"}],"id":"12a0c69f-e755-428b-97dc-229bccb8a5b0","last_modified":1557437276663},{"guid":"/^((\\{4e84c504-10e8-4e75-8885-dcc0c90999b9\\})|(\\{8ce99d6d-8d0d-4420-bd17-c303bd8a763e\\})|(\\{16de314a-56cd-4175-9baf-bbe0b09dfed3\\}))$/","prefs":[],"schema":1557434135180,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549744","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Secure Privacy + Trustnave + Fastwebnav"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"04a300c2-04fc-401e-a428-c7c887bf2bff","last_modified":1557434278943},{"guid":"{5308dcd8-f3c7-4b85-ad66-54a120243594}","prefs":[],"schema":1557433916783,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550428","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"F_Feed"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"312e30b0-0b4c-4a43-8f6c-8b8447a20f6a","last_modified":1557434135166},{"guid":"/^((\\{c8d0fea0-d7b7-4f6f-b9bc-9df6722d9d18\\})|(\\{bed8e1f2-b00b-44e3-8cf0-5335080d0003\\}))$/","prefs":[],"schema":1557433212304,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550435","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Webplus+Fastnav"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b9686c72-1902-4868-88d1-6587fd24a57c","last_modified":1557433916770},{"guid":"/^((\\{d389cdfe-843e-44cb-b127-441492e46e63\\})|(\\{1340c760-3f4c-4428-b2c0-88821a84de2b\\})|(\\{38524a16-a73d-4a8f-8111-f9347bb5266c\\}))$/","prefs":[],"schema":1557258104673,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549740","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2feeb46a-6784-4c6e-8c07-e120bec00b14","last_modified":1557394160484},{"guid":"/^((adsmin@vietbacsecurity\\.com)|(\\{efdefbd4-5c30-42c3-ad2b-4c49082ec4cd\\})|(\\{63d83b36-a85c-4b51-8f68-8eb6c0ea6922\\})|(\\{4613a1ed-6cb1-410b-a8b1-3f81f73b6e00\\})|(\\{90b1aef7-7a52-4649-b5ca-91b5e81b5eab\\})|(\\{d6e2e76d-edff-416b-8c04-53052ff9fec7\\})|(\\{43af2e0f-b5ce-409b-9ee6-5360785c9b08\\})|(\\{e45fa96d-8b74-4666-86de-3bbfb774a74f\\})|(\\{4f8332b6-6167-4b7f-a1f9-61d8eb89b102\\})|(cpcnbnofbhmpimepokdpmoomejafefhb@chrome-store-foxified-14654081)|(developios89@gmail\\.com)|(\\{d82da356-1fa8-4550-958a-bd2472972314\\})|(\\{1dfbd1c3-a8ca-4eb3-8747-d30bfd20ecd5\\})|(\\{6f9fa22a-128f-4d1b-8ef5-d20a44d24245\\})|(\\{5f6af572-35c1-44d7-9d0f-dffbb62fcafe\\})|(developper@avast\\.com)|(\\{886a6486-37b3-4bcd-891b-fd0e335e7b1a\\})|(\\{886a6486-37b3-4bcd-891b-fd0e355e7b1a\\})|(\\{d1cd26ff-fde7-46a4-85cc-48e3bb7e9e8d\\})|(\\{ae11d5cc-8efb-43a0-89bf-e5a779b4fa40\\})|(\\{aca140ce-8249-4e6e-8e2c-cd5b1c987441\\})|(\\{f68b2ca7-0d2c-44cc-afc8-a606a896c467\\})|(\\{321db3c3-8cfd-49f1-99de-fcdc3485b379\\}))$/","prefs":[],"schema":1557222463147,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549558","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b62c9ee1-d66f-4964-906e-2a9b07e3fdc1","last_modified":1557222511299},{"guid":"artur.dubovoy@gmail.com","prefs":[],"schema":1557162612874,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549444","why":"This add-on violates Mozilla's policies by executing remote code.","name":"Flash Video Downloader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"16.3.9","minVersion":"16.3.5"}],"id":"d7ca07b4-9c97-4f49-a304-117c874ff073","last_modified":1557162636319},{"guid":"{93d460ee-879f-4d8f-8599-a1c69ed59ec2}","prefs":[],"schema":1556912498785,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549069","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Browser Security &Adblock"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"95cfb43b-72c3-4fb3-a0f2-fc975aff398d","last_modified":1556977392946},{"guid":"{fc4c96b2-4eaa-4221-86a6-392dc1eb919a}","prefs":[],"schema":1556797012258,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1548536","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"AspectResolver"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3f6acc8a-f46c-42cb-8220-48c2e5885bd3","last_modified":1556808070195},{"guid":"/^((premium-enhancer@ext\\.com)|(notif-rm-unlisted@ext\\.com)|(search-updater@ext\\.com)|(updt-lite-unlisted@ext\\.com)|(coldsearch@ext\\.com)|(reader@ext\\.com)|(local@ext\\.com)|(fptool@ext\\.com)|(gflash@ext\\.com)|(advplayer@ext\\.com)|(yfp@ext\\.com)|(ytbenhancer@ext\\.com)|(yoump@ext\\.com)|(floating@ext\\.com)|(ytbhelper@ext\\.com))$/","prefs":[],"schema":1556792823258,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547311","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Various fake player/search add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9efe3274-2bd2-44a3-aa7f-92934581470b","last_modified":1556794746654},{"guid":"{a38141d9-ef67-4d4b-a9da-e3e4d0b7ba6a}","prefs":[],"schema":1556787949626,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1548473","why":"This add-on violates Mozilla's add-on policies by changing search behavior without users consent or control.","name":"ReStyle"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b0ff609b-c98e-4d29-8323-61c3e064ec9c","last_modified":1556791242742},{"guid":"{0beedf0b-dc79-48bd-adff-2ed36acdb806}","prefs":[],"schema":1556787897696,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547930","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"71475499-ca6f-4b71-8bef-2b95cf59ee30","last_modified":1556787931409},{"guid":"{c11adb01-56bc-44d6-ac05-6f364e2afe01}","prefs":[],"schema":1556787838618,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547934","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e6371474-8681-4498-8e89-421f25fd2e12","last_modified":1556787897686},{"guid":"{a1f6fa05-26cd-4399-a97a-7996067d04b0}","prefs":[],"schema":1556739699995,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1548134","why":"This add-on violates Mozilla's add-on policies by changing search behavior without users consent or control.","name":"TC"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3659d4a2-3121-45cd-b8b6-5b2c96ebc17f","last_modified":1556787838607},{"guid":"{c65b18e1-cd3d-4773-a901-15a0753e7d81}","prefs":[],"schema":1556224830338,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1546994","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"PrincipalInterceptor"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"af62a050-b136-4d56-ab3a-af85a2510bc4","last_modified":1556224874229},{"guid":"{4bf110f8-5f50-4a35-b7fa-64228bfa2d0b}","prefs":[],"schema":1556224790813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547048","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Predicate Property"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5968da82-1d7e-407e-bf93-5d2247ce55c1","last_modified":1556224830329},{"guid":"{0bd4e0af-664d-4273-a670-7cb3d0b5a4a5}","prefs":[],"schema":1556224295744,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547046","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"ConsumerWatcher"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a6cc6fb-dce1-49cd-b624-7b44afacf157","last_modified":1556224790803},{"guid":"{bbddf452-1a72-4a5d-a833-0416ac7fd76f}","prefs":[],"schema":1556197615318,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1546989","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"AV Scanner (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"20c25379-aed8-4ab4-9e7f-f2d3f5d948a7","last_modified":1556206274610},{"guid":"/^((\\{1601769e-0b0d-4c43-97a7-723ce374996b\\})|(\\{d714118b-5cdd-4829-9299-1066fecc0867\\})|(\\{e8671db6-24be-4744-808c-a63fb744ccca\\}))$/","prefs":[],"schema":1556133515829,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1545834","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"XPC and Tabs"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1b536121-fd82-4639-bc70-30d7060e42d3","last_modified":1556133806451},{"guid":"{3f5f741d-a980-4b58-8552-b1ae328841f4}","prefs":[],"schema":1556099103820,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1546480","why":"This add-on violates Mozilla's add-on policy by intentionally weakening website security and adding fraudulent content to web pages.","name":"Google Translate (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ae288e5e-78d5-4b49-8b4d-fa9f25c3baa2","last_modified":1556112119390},{"guid":"{3fab603e-3ee1-1222-a859-5f85a3441216}","prefs":[],"schema":1555527937277,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1545213","why":"This add-on violates Mozilla's add-on policy by overriding search behavior without user consent or control.","name":"Add security (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"74ad8c8b-a65a-470c-aa2f-ca14e1e8774d","last_modified":1555528639011},{"guid":"/^((\\{880cacfe-5793-4346-89ce-fbbd368d394c\\})|(\\{f0780038-50b9-11e9-9c72-4ba2d8f2ec9f\\})|(\\{22ffe411-2b0e-11e9-87f9-c329f1f9c8d2\\})|(\\{cf4bae43-026f-4e7e-a85a-952a7ca697a1\\})|(\\{17052516-09be-11e9-a008-03419f6c8bc6\\})|(\\{333fb3de-18a8-18e8-b6d3-e73213911efb\\})|(\\{aa4abac2-1ffa-12aa-bbdd-9305cb2c1254\\})|(\\{72222e70-2fd6-11e9-956b-27f7787b8d2d\\})|(\\{637212d8-3484-11e9-9812-005056b22b42\\})|(\\{4a222e60-31de-1eca-8476-37565daf6afb\\})|(\\{7fc6d222-48d5-11e9-b586-17e94c73a1b1\\})|(\\{e111c358-121b-13fa-bf23-bb57da32d184\\})|(\\{9674445c-8dff-4580-96b2-99442a7ae9af\\}))$/","prefs":[],"schema":1555525532852,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1544315","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"Various"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cbd7444f-e62a-4639-b172-845548b6d4a7","last_modified":1555527929174},{"guid":"{674fff65-6cd0-488a-9453-fb91fc3d7397}","prefs":[],"schema":1555406446874,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543924","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Assistant"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8aff4cb0-4d5f-4e74-8db7-b04f616c3b60","last_modified":1555503879816},{"guid":"{40cd7fd2-a3e4-43f9-9d86-0e0a70376203}","prefs":[],"schema":1555184501005,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1544268","why":"This add-on maliciously injects remote code for execution.","name":"Scan Tech"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"881d3476-f18a-4560-b065-cded406783d2","last_modified":1555228377222},{"guid":"{8ee8602c-aba6-4e2a-9faa-1724c3f4f9ba}","prefs":[],"schema":1555102738661,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1544205","why":"The add-on is maliciously loading remote code for execution.","name":"Service Proccesor"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"94621e2f-28a0-4b18-97c6-5f6203f5912e","last_modified":1555161086175},{"guid":"{d8b03707-e39f-4b17-8e56-56354fb14af5}","prefs":[],"schema":1555100104657,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1544103","why":"This add-on maliciously injects scripts, violating our policies.","name":"Interruptible Observer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3a921aa8-d44a-4272-be63-0fd102577f59","last_modified":1555100575898},{"guid":"{132cb2fd-a6ae-45d2-84cf-b48d591f037d}","prefs":[],"schema":1555099951278,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543922","why":"This add-on injects remote scripts and overrides search behavior without user consent or control. It also masks as an add-on with a different purpose.","name":"Player"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"371796e4-387a-4dd0-9ddc-47ba1dd85be7","last_modified":1555100104648},{"guid":"H.264.Addon.Test@firefox.com","prefs":[],"schema":1555099832659,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543919","why":"This add-on exfiltrates user data without consent or control and may be misleading the user into believing this is an add-on by Firefox.","name":"H.264 Video Codec Fake"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"53ef1aad-7bdb-4f4e-8d46-55d6ec2d78ab","last_modified":1555099951269},{"guid":"{608f71eb-5bd6-45d8-bc93-b9e812cf17b7}","prefs":[],"schema":1555099501294,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543801","why":"This add-on maliciously injects remote scripts, violating our policies.","name":"Consumer Tech"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ea00841e-8dc2-4e11-9119-7a599e47d800","last_modified":1555099832650},{"guid":"/^((\\{8220ccaf-15a4-4f47-a670-a4119a4296a4\\})|(\\{9da72c11-44d7-423c-b19c-c75cd6188c3e\\})|(\\{99d0e4d0-c5ef-4567-b74c-80c5ed21ad99\\}))$/","prefs":[],"schema":1555011689511,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543848","why":"This add-on violates Mozilla's add-on policy by overriding search behavior without user's consent or control.","name":"Search overriding add-on"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"03554696-58fe-4b90-89d1-72b72f88f82e","last_modified":1555069748234},{"guid":"/^((\\{b37f383f-e60f-4eb1-ac0f-9147e0e8f2f7\\})|(\\{8ad567d2-3fe2-446b-bce9-a3acbe878dba\\}))$/","prefs":[],"schema":1554997740201,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543673","why":"These add-ons are overriding search behavior without user's consent or control.","name":"Hash"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"036e2e7d-5403-49be-92cf-b5187ceef7ec","last_modified":1554997910212},{"guid":"{be6ab6a9-7004-4c5c-8df9-8d36122d8b14}","prefs":[],"schema":1554997613727,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543705","why":"This add-on injects remote scripts with malicious intent.","name":"asin"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6fd3ab94-8e38-47f3-b129-3ca8396d0a22","last_modified":1554997740187},{"guid":"/^((\\{61f433aa-45fd-42a9-9c90-c1d7820661d5\\})|(\\{86cd46b6-433a-439c-bff2-722846709f44\\})|(\\{98e126a4-4e70-4300-b893-3b2cca19bc9b\\})|(\\{8f42dc3a-1c46-4fc2-8c7f-dd76a63b1cf7\\})|(\\{a24d3582-2fc2-475c-8440-335736e17c6e\\})|(\\{cf0b5280-cd08-465d-ad7d-70308538f30a\\})|(\\{936f3c79-5dc9-4694-bca8-47932de3357a\\})|(\\{e48d5888-8736-4858-83ba-e816378ffef8\\})|(\\{5305f89c-ceec-4217-8bae-c9c376c7462b\\})|(\\{a2ac47e5-d225-4718-9b57-18a932f87610\\})|(\\{79f60f07-6aee-42cd-9105-c0a52f401316\\}))$/","prefs":[],"schema":1554981266268,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543664","why":"These add-ons exfiltrate user data while masking as a legit add-on.","name":"Adobe Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fc38e782-d55b-4fb7-8f9c-374aa18af09c","last_modified":1554997613713},{"guid":"/^((\\{0913599d-3094-44a7-8cc2-b8467d5afc7c\\})|(\\{7bee7f1b-d8ad-424d-807d-e69e6634988e\\}))$/","prefs":[],"schema":1554898779160,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543462","why":"This add-on violates Mozilla's policies by exfiltrating user data without their consent or control.","name":"Malware exfiltrating user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0d86ba71-7baa-4cb3-b3b8-da4ccdfa36b9","last_modified":1554976164809},{"guid":"/^((\\{9946bf2f-0aef-4040-bc57-cdae2bde196a\\})|(\\{d511784e-d088-4fce-b77c-14c186f08641\\})|(\\{fe59312a-97bd-4ca7-bce3-b0db95b1e251\\}))$/","prefs":[],"schema":1554897771015,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543118","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without user consent or control.","name":"Invert (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ed01b7e5-73d1-42a6-9fc8-af2d83879854","last_modified":1554898652923},{"guid":"{c75432cb-980d-4e64-98c8-d7947b382a2c}","prefs":[],"schema":1554897109129,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543255","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Concrete Tech"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7fd0eb9c-9f6c-40ea-ba39-645cafb1d5a0","last_modified":1554897390260},{"guid":"/^((\\{6a99a9ec-f149-4ad3-b644-15e44290d00c\\})|(\\{cd9d1582-13dc-4ce1-9c83-4aaa31c6bc36\\})|(\\{3414a827-ee54-4331-85eb-736a824bb7e0\\}))$/","prefs":[],"schema":1554896836686,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543181","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users' consent or control.","name":"Drag (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a4f0ac78-ba85-4b5a-9d1f-f3f2c6ae4f7c","last_modified":1554897104624},{"guid":"/^((\\{4b6e66db-ee0b-4fc3-abe6-b97cb4798faf\\})|(\\{8aff5f41-86f8-40f1-896d-954eae7fb670\\}))$/","prefs":[],"schema":1554817097951,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543049","why":"Search hijacking","name":"Fit"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8a7efe6b-8670-4714-b4b2-08ce5f202ee7","last_modified":1554818136441},{"guid":"{81425b21-cc8c-42d0-98e8-69844bcb7404}","prefs":[],"schema":1554811583185,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543048","why":"Remote Script Injection","name":"Tech Chip"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dafcc63d-37e0-42e2-b439-59727cf9de48","last_modified":1554811754967},{"guid":"{d85aa6ef-639b-43a1-8560-ddeb59935d10}","prefs":[],"schema":1554803024628,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543047","why":"Remote Script Injection","name":"BatchSerialize"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"204b7b05-d8e1-4de3-86f9-fcf95edb40c0","last_modified":1554811583171},{"guid":"/^((\\{bf163ed1-e9f9-4c98-ae4b-8391133472d1\\})|(\\{ec283482-2d66-49b2-9dc5-0d03bcbffe65\\})|(\\{0a19856e-4168-4765-a8ab-a3a34fa88ec1\\})|(\\{e2019dd1-4591-42e2-864a-535a99972b1a\\})|(\\{88a65f0c-f952-41f0-8868-f22fa12597b3\\}))$/","prefs":[],"schema":1554754247858,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540998","why":"Exfiltrating user data to a remote site while masking as a different add-on","name":"More Flash Player Clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ddd97fae-7040-4758-811f-1dd53116e6ab","last_modified":1554755273775},{"guid":"/^((\\{743fc0de-1085-4078-8611-848024989608\\})|(\\{02acc043-f402-4e48-aa15-56ee1364e17c\\})|(\\{1b7892ab-6dbe-49d1-9c71-bbb70458c830\\})|(\\{25b3b5bc-b77a-49d1-ab56-c0e760fe02ff\\})|(\\{2c78aa89-8cdd-4a96-821a-e35628aea2fb\\})|(\\{2f154b99-05c2-4629-b687-f2aa031d9f65\\})|(\\{36df6f78-16c4-42c2-a6b8-9210a2953739\\})|(\\{40ada62f-72a8-46b7-8e50-4153f660ce34\\})|(\\{49f58462-fc24-472c-b85a-4a3dbbf48741\\})|(\\{4a8cb3fd-0400-47b3-a799-9f2964229bfa\\})|(\\{5429f6da-d7fe-4f1b-a85e-6dc721ec0037\\})|(\\{74480b2f-1198-45b3-86b3-ca0778482216\\})|(\\{777f1169-a824-459d-8a2d-ca2ffaf59424\\})|(\\{81e610be-656a-4a71-866d-dd94b5096c60\\})|(\\{81ee3e70-b6e4-44d0-b5c2-94ded26bb5ac\\})|(\\{881c71c1-6800-4e8b-89de-0d14ef67d588\\})|(\\{9b5d7f59-be9c-4f1e-bf0c-31f085c17726\\})|(\\{9eff0ead-25a4-429c-b4b2-280ba3c6f2d9\\})|(\\{ad1b7e87-e260-4aee-a602-ef234743443e\\})|(\\{b54a530a-cacc-4c76-a7c3-feafd4ce0b13\\})|(\\{bd0d7634-770e-4d9f-8309-d264a5fbbfa9\\})|(\\{bdf16cc8-3da6-4317-a1eb-2ab8adce6b66\\})|(\\{bf484a7f-49fd-4681-afa5-8a063d010a14\\})|(\\{c7cf6d86-207b-4231-a96a-bbfdc9fe59aa\\})|(\\{d33f83c2-dbc6-41d2-a8b9-28fdaa96985e\\})|(\\{d71757ee-edc7-44d5-b536-cb0370d7d9f6\\})|(\\{daf86db4-7dd4-47d4-a1d1-7c31f6b9bbe3\\})|(\\{e27060a0-5fb5-4844-b446-d2655d7681fa\\})|(\\{fae0d133-05dd-44e6-88e1-e218ca2b2caf\\})|(\\{fbf69005-55d8-4360-a562-255a8c285fea\\})|(\\{fd6d1b53-89f5-4d91-9234-fb3e1b067c1b\\}))$/","prefs":[],"schema":1554753973658,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540998","why":"Exfiltrating user data to a remote site while masking as a different add-on","name":"Adobe Flash fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e12a97c7-2c83-4e1c-a2c3-66a653bc6048","last_modified":1554754247845},{"guid":"{ea173fdc-f27a-482a-8a0a-61fd1aa2ee2e}","prefs":[],"schema":1554744706554,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1541005","why":"Masks as a legit add-on and includes a remote script that is against our policies","name":"InterpreterInvocation"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8742ec6a-2e51-4e94-bc6a-653dac08521b","last_modified":1554753973644},{"guid":"{16768af9-4120-4566-95cf-c4234effa084}","prefs":[],"schema":1554733900697,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540999","why":"This add-on changes the search settings in a way that is not allowed per our policies","name":"Unknown search hijacking add-on"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3fb0ed8e-6e5d-489e-8c9d-b6f48705a742","last_modified":1554736392840},{"guid":"{35b9640e-ebbb-44b7-85af-d9ec3af3c6a6}","prefs":[],"schema":1554730607333,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540690","why":"Malicious remote script injection","name":"Patagonia Bit"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0eb3a151-ca6b-4dbb-81b3-c10635660c84","last_modified":1554733900683},{"guid":"{d574e1f8-537d-4b6c-97bb-9f7a138f4d67}","prefs":[],"schema":1554728269766,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540686","why":"Injects remote scripts and masks as a different add-on","name":"DistributedConsumer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a158055b-3387-4961-a4a3-a820d9299e15","last_modified":1554730607318},{"guid":"one-search@mozzilla.xpi","prefs":[],"schema":1554666099983,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1542208","why":"The add-on violates Mozilla's add-on policies by overriding search behavior without user consent or control.","name":"One Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1344c583-9593-412f-a565-c6cc96a07c28","last_modified":1554718843138},{"guid":"/^((\\{00b4b65b-79d9-4e92-bc1e-2b926918b91c\\})|(\\{0cb66591-e935-47e4-95c2-3063786f6555\\})|(\\{6cf25884-f86d-4a4e-a924-d95282ce5b71\\})|(\\{22cce9c6-a1de-457f-8938-c981b976b6f4\\})|(\\{89d99d4c-e7c4-4601-91a8-216e597a826b\\})|(\\{998d3ac7-b475-410e-ad3d-2eeb526c1853\\})|(\\{9423e8df-6200-45c0-877a-479c46e91b30\\})|(\\{64937e0b-6e00-4d5f-bf19-190d6614aae2\\})|(\\{91507dc4-c005-4534-80af-d8fbdeac29ed\\})|(\\{a2247e60-7b89-4857-a2fa-0eaee1cad460\\})|(\\{c9c28751-5865-449f-8e45-b3363edf9fb7\\})|(\\{cdfd004f-cddc-4ad7-8e2d-a58457e42b1f\\})|(\\{d3e7f35d-7d9f-4d38-9a2b-1581f6b3e870\\})|(\\{df574ffe-cce0-42db-857b-627cb164a4d4\\})|(\\{e06afe6e-ed52-40f8-82bf-d070a37387fb\\})|(\\{e7e7fb96-cfab-4a5b-85fe-20f621e1bc2e\\})|(\\{e12e5afd-bd1e-43c6-9288-321dc485cb1c\\})|(\\{e92d8545-0396-4808-96de-830c61c0d1b3\\})|(\\{e883b012-1987-4f37-8053-02e59e20c242\\})|(\\{ed3386c6-76c6-4786-a37b-9816d5f2a260\\}))$/","prefs":[],"schema":1554462951082,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1541662","why":"These add-ons violate Mozilla's add-on policies by overriding search preferences without user control or consent.","name":"Search overriding malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a1c376fe-20c5-4da3-9126-3fe95b874dce","last_modified":1554463075420},{"guid":"/^((\\{6ab41e83-2a91-4c2a-babb-86107a1d1f75\\})|(\\{d84a9d0d-7a31-459e-b45a-2ad111884d1f\\}))$/","prefs":[],"schema":1554293659259,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1541405","why":"This add-on violates Mozilla's add-on policies by overriding search settings without user control or notice.","name":"PopWin (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"04b2954e-4f83-4557-968e-2139a277bf1c","last_modified":1554301860877},{"guid":"/^((@searchlock-staging-automation)|(@searchlock-automation)|(@searchlock-fx)|(@searchlock-staging)|(jid1-vRJA7N8VwBoiXw@jetpack))$/","prefs":[],"schema":1554293340413,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540868","why":"This add-on violates Mozilla's add-on policies by executing remote code and overriding search preferences.","name":"SearchLock"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aacb25e1-71c5-4bee-ad16-e39e732210ba","last_modified":1554293606641},{"guid":"{03dfffe0-509f-11e9-aa00-e7e13d49f3de}","prefs":[],"schema":1554290590697,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540113","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Addon (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9c75fe89-7011-47ad-b213-57f5a81a4c89","last_modified":1554290693618},{"guid":"{e555c358-121b-13fa-bf23-bb57da32d184}","prefs":[],"schema":1554290541557,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540111","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Security (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1809ea7a-8155-4ae7-8c83-ee7c749d30f5","last_modified":1554290590689},{"guid":"{a9c33302-4c97-11e9-9a9d-af400df725e1}","prefs":[],"schema":1554147700324,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1539514","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Security (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b4e4e75-cc96-4ca9-aa9f-6a2d2f6cd96a","last_modified":1554290541548},{"guid":"{a3f765c3-8dde-4467-ad6e-fd70c3333e50}","prefs":[],"schema":1554119395186,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538143","why":"Remote script injection","name":"Angelic Bit"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"93dc42cc-4ff3-460d-a8f2-12f1d947b530","last_modified":1554119427564},{"guid":"{91f77263-866e-4acb-a569-f66ac47889f8}","prefs":[],"schema":1553974898434,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1539226","why":"Remote script injection","name":"Bit Apex"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c528f48a-9b2c-48ca-8b4a-eac442cc0bd0","last_modified":1554119395177},{"guid":"{2256fabf-19f1-4e12-9951-5d126dd9e928}","prefs":[],"schema":1553899022464,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540086","why":"Search hijacking","name":"Twit"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7c705f73-9d1d-4ee9-ad11-347d18729adb","last_modified":1553900528324},{"guid":"/^((\\{00f77164-eca9-4353-916d-8ea493a54c8d\\})|(\\{0716b2a5-8181-45b8-b675-915e38903761\\})|(\\{26124967-7e32-4577-b998-7296c68d3eb9\\})|(\\{273052bc-fc67-4fc1-a6fd-e62acc3ddad1\\})|(\\{4b5f53ac-36ac-4018-80cb-f1106f60ef96\\})|(\\{61065f61-51aa-462c-aca0-f1addbfa202b\\})|(\\{63383006-d617-4a00-9ca7-30a6864782ee\\})|(\\{7629c987-59ea-4e2f-bcde-b55646ecd268\\})|(\\{78e8c8fa-32ce-432b-9a40-b615bff7cd96\\})|(\\{8e9c05df-e0f5-479f-abb9-858650cb471e\\})|(\\{947f1ac0-09f2-4016-a345-dad0d2ee8f57\\})|(\\{9b9f8124-47bc-4699-8557-45573995b0af\\})|(\\{ab159932-d1dd-4d16-9332-8302a01e0ced\\})|(\\{b7340504-f6ba-43cb-8bd6-5ead88d29898\\})|(\\{bcb9265f-20fd-4311-a33f-212c2d08043a\\})|(\\{f8701822-2814-4d5d-af01-cf7fde4fd510\\}))$/","prefs":[],"schema":1553898687988,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1539910","why":"Data exfiltration, is not actually a flash player","name":"Adobe Flash Player fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"64fc6369-b504-4920-abab-f2cf3cc5424a","last_modified":1553899022456},{"guid":"/^((\\{7dd03112-82a0-4c82-9957-117dedaac14a\\})|(\\{59fd3cac-1a4d-4f0f-a129-c241b203eb51\\}))$/","prefs":[],"schema":1553897736388,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540287","why":"Search hijacking","name":"Song"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b32b14f5-0024-48fb-a4b6-1496add1dac0","last_modified":1553898687980},{"guid":"/^((\\{70c2cef0-6cc6-41b8-ad6b-bbd11182a101\\})|(\\{a0366612-376e-47e3-b5fa-b805c7176088\\}))$/","prefs":[],"schema":1553810805293,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540055","why":"Search hijacking, masking as legit add-on","name":"Pix"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d78262b0-ecfc-475e-9759-f7319451cb43","last_modified":1553847044919},{"guid":"/^((\\{10f1b84d-79ca-41d0-97f6-abb53cec0765\\})|(\\{7891c029-0071-4534-b7f0-7288f14ee0ad\\}))$/","prefs":[],"schema":1553810612956,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538476","why":"Remote script injection, search hijacking","name":"FX"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"50197dbd-71bc-492f-a0f1-6658ec454df4","last_modified":1553810696456},{"guid":"/^((\\{058769c7-784e-47a9-a2c4-dfd81bbf6c8c\\})|(\\{2a58598a-f951-4fb0-af2b-12fb7482bf33\\}))$/","prefs":[],"schema":1553810234714,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1539910","why":"Keylogger","name":"Fake adobe flash player"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e1355888-e1cd-4d21-9652-c3000662ed88","last_modified":1553810612947},{"guid":"/^((\\{54c7e57f-8ef0-48d5-92a0-6e95d193a12c\\})|(\\{32d262da-e3cd-4300-aa0b-c284eb4e17bf\\}))$/","prefs":[],"schema":1553802101395,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538536","why":"Search hijacking, masking as legit add-on","name":"TxP"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fa6c7cdb-e477-4478-8dd4-3e1106be6aa3","last_modified":1553810234705},{"guid":"/^((\\{36261798-4c2a-4206-89cc-6c28932b2e98\\})|(\\{b2b9bb64-78d5-43ca-b0cf-a9ee8460521b\\}))$/","prefs":[],"schema":1553616425198,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538234","why":"Clone of Feedbro with added remote scripts and search hijacking","name":"Feedbro Fake"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e00b2639-8a4f-427a-80d8-7c4937c58f31","last_modified":1553620435398},{"guid":"new-tab-search@mozzilla.xpi","prefs":[],"schema":1553616311575,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538500","why":"Search hijacking","name":"New Tab Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a4dca16a-9fa1-4b55-899c-0f8d5eda1a57","last_modified":1553616386570},{"guid":"{a9c33302-4c97-11e9-9a9d-af400df725e3}","prefs":[],"schema":1553616259023,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538141","why":"remote code execution","name":"Fake Security add-on"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0c09f067-6e5f-4ee0-9040-08b4297ebe02","last_modified":1553616311567},{"guid":"{7ab5c514-4ebe-22e9-a925-9b7c7317c373}","prefs":[],"schema":1553548654429,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538266","why":"remote code injection","name":"Eval"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a1f04f09-f4d5-4875-b4b1-a2c772178e8e","last_modified":1553616158755},{"guid":"{bc919484-f20e-48e2-a7c8-6642e111abce}","prefs":[],"schema":1553519202849,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538962","why":"Inserting monetization iframes and masking as a legit add-on. Contains patterns for known malicious add-ons.","name":"Pinterest Save Button clone"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7abbecfb-5512-47d1-ba9b-96d6a61b85ee","last_modified":1553548325261},{"guid":"/^((\\{157cd8f9-48f0-43a1-9bcf-c4316753e087\\})|(\\{157cd8f9-48f0-43a1-9bcf-c4316753e086\\})|(\\{157cd8f9-48f0-43a1-9bcf-c4316753e088\\}))$/","prefs":[],"schema":1553186907495,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1537895","why":"This add-on violates Mozilla's add-on policies by overriding search settings.","name":"SD App (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e263fbec-7155-442f-aa82-cdf218f9e3d7","last_modified":1553193746700},{"guid":"/^((\\{1c94bc8a-3ac1-12e1-aae7-0b314772229c\\})|(\\{8a22255c-4737-11e9-a86b-0bb66337cb31\\})|(\\{3fab603e-3ee1-1222-a859-5f85a3441216\\}))$/","prefs":[],"schema":1553166786114,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535655","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"'Security' add-ons (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6cf1b676-f0b8-4fea-8a5f-64957650dc2e","last_modified":1553172061896},{"guid":"{28ac81f1-b04d-448f-94be-1b8cc8fbd58d}","prefs":[],"schema":1553079961735,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1536513","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"UtilsBridge (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f60b3eec-b8b8-4bd7-8d2b-3f7912c3451f","last_modified":1553080348264},{"guid":"/^((\\{9332d73d-7991-46bf-8b67-6db1a21f0167\\})|(\\{b33715d3-eff8-4186-a252-0af5094b8644\\})|(\\{eb7aff78-6145-4a31-a7f5-f3c353ddb312\\})|(\\{6c5cd693-2919-4458-b776-2ac5b6ab1cb0\\})|(\\{daacefee-aaba-4f10-8d4d-059904d8a153\\})|(\\{94d8d504-838c-4392-9971-cd2f6e21ca21\\})|(\\{6574bb31-c971-454f-b08c-a75bfee00855\\})|(\\{1688ecb0-e382-481f-8c70-541d70bdd2e9\\})|(\\{f7b9f777-7b01-4f73-8eb8-f2ad85d4da1c\\})|(\\{598d7ac6-1789-4573-ae6a-5798ed7f6d83\\})|(\\{c0eb4d03-d18e-40bf-b21b-8237ee1bed76\\})|(\\{d0513185-1f20-4045-a232-f3a4252af379\\})|(\\{9ae8269f-eea1-4097-87fd-b7d2f102184d\\})|(\\{5683f95b-2517-4ca7-9d19-83d7f309b62a\\})|(\\{013d3691-0dd6-471b-bf0d-2750d7406a22\\})|(\\{ae73a262-1a27-4d1d-9be7-4b41a84dfd23\\})|(\\{1d92fc5d-5353-401f-8c5f-373b3b6dae67\\})|(\\{e8a81b54-3728-4a9c-8c63-18ef803ef9be\\})|(\\{d604961b-3a3d-4f60-87ae-35977c10b787\\})|(\\{cbe9b620-fac0-407a-b3be-b0a61b319ef8\\})|(\\{1cdb403e-11c7-421b-9c87-0c0d90263626\\})|(\\{f5fa0bfe-a981-48ff-b809-8faa3126f0bc\\})|(\\{7dc6d0d2-b2f0-4334-979d-6ebeff77785a\\})|(\\{13623b47-de82-4226-85f8-d3ae343e619b\\})|(\\{db7b6ea7-2605-44c7-807b-2419d7eec531\\})|(\\{b9298a4a-acca-446d-aa72-d37f5e1576cd\\})|(\\{2e689bc0-735f-445c-bcc7-2cc495f5eb40\\})|(\\{04acd977-4c2b-4162-af33-8c585bea90c5\\})|(\\{2436dde0-3230-4933-9020-c15b3b9e693b\\})|(\\{dcb556aa-ef6e-4778-9f60-c5ae18a72cfb\\})|(\\{5a24385f-ada4-455d-95ad-62cb6256360d\\})|(\\{97f88a13-5b79-4345-a85e-2560d54f577c\\})|(\\{12f4cde8-7d1c-4a9e-9ef7-431f5ecd53a4\\})|(\\{18a93813-7deb-40cf-b3a6-402369e6d817\\})|(\\{9cee5c92-eb1e-4892-86ff-d2d1c627f5b9\\})|(\\{cb1c544e-d444-4c85-8224-64aa26e82230\\})|(\\{1c3b247f-2ef4-4483-93a6-0a3da7bc3548\\})|(\\{1f6913f2-dead-4f96-bf96-0e64affd46ae\\})|(\\{109adc7d-f308-43a5-aa0e-07ccdc5dad2c\\})|(\\{7170e23c-c706-48a7-919f-c1c22548dbfb\\})|(\\{6aa47f05-1f3f-4798-908a-0ed01b2361e0\\})|(\\{33ef0e7b-15ea-4b08-a779-173731ac20b3\\})|(\\{a0361564-9461-4da0-8ec0-7dc6f418f707\\})|(\\{c12631ed-993a-4c2e-9bf0-37867ae40491\\})|(\\{00b79649-3f0e-4b12-a8f0-376a7b2db716\\})|(\\{89096e44-c8b4-4ce5-aad2-f5bac765f608\\})|(\\{6f4eff89-0e32-42bd-a5c1-354adc8417fd\\})|(\\{482c54ae-e080-4596-bf7c-ae972fdff9a3\\})|(\\{04868575-532f-4b43-9325-7e707c109c25\\})|(\\{042c3065-1291-4409-bae5-8d11f3c268e2\\})|(\\{126e7fc4-bf2d-4467-88b1-f3b17bc10da4\\})|(\\{cea21739-b9ce-46c7-ad3e-3607b1ff6538\\})|(\\{06eea1e7-a8be-4794-8cd5-ed12e5f86161\\})|(\\{50993bc5-011c-4322-b522-41e6f3997163\\})|(\\{219a2146-5d9b-472a-8630-4c96a0994bec\\})|(\\{1db94c2f-d957-4b12-a1dc-903bb28f5ff5\\})|(\\{2f7d887c-7d56-41fa-bf9b-eadf6e500427\\})|(\\{2b16f4ab-a2a9-43fd-8fd6-ad6f354b0d28\\})|(\\{034d2b14-29e6-42ad-b2db-2c31286f3fb7\\})|(\\{77058195-5ae1-440c-8f86-c60a96d12ca9\\})|(\\{8082ff2f-2151-4281-8134-1423e5961ca1\\})|(\\{9fa797e8-d7d4-4851-b7e9-76b61ecf046f\\})|(\\{87178fbe-17a5-4d8d-b5ed-48d17179b101\\})|(\\{f010d9e9-0878-4c83-af45-df966cbe8d26\\})|(\\{2aa8c5cd-18fa-4991-b354-d6f459efeca9\\})|(\\{4021839d-3f4a-4866-94fb-9fa809c5245b\\}))$/","prefs":[],"schema":1553024292304,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535088","why":"This add-on violates Mozilla's add-on policies by exfiltration user data and tracking online activities.","name":"Search overriding malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"478d4acd-3c01-4dd5-b784-4e06b69d1c05","last_modified":1553079818962},{"guid":"{781b89d4-fa53-45a1-bea4-151dd4c8b288}","prefs":[],"schema":1553013598703,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535280","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Drop Tech (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"81759002-967e-4856-9f55-61d7c30cdb3b","last_modified":1553013656506},{"guid":"{3b52063a-0683-4de2-b6e1-6192c78b6ba3}","prefs":[],"schema":1553013551744,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1536042","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Project Tech (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a7f932a-3911-4884-8cb9-d282d282c0cc","last_modified":1553013598695},{"guid":"{47610aad-982f-4822-93ca-8c27dc96a13b}","prefs":[],"schema":1552938092086,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534773","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Tech Hand (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"12874e4d-28b5-4e98-8c33-b6cf5eb032bf","last_modified":1553013551736},{"guid":"amqp-dwn-all-vd@artur.brown","prefs":[],"schema":1552916969263,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1536052","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Video Downloader Plus (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a3f5ce2f-d8ef-4dae-9fce-1d7fb69d2b37","last_modified":1552917123606},{"guid":"/^((\\{1d758385-fddd-478e-85a0-13eef59f60e5\\})|(\\{1ec3e92a-fd3c-4e16-82e2-56d44bd7bdf4\\})|(\\{3dadda0d-d67c-4452-9475-246c33198192\\})|(\\{4a48f6a8-c9d6-4ae2-8513-a7e9fe785a56\\})|(\\{4d2da172-b160-42b5-9fea-0ede63e0ab52\\})|(\\{5bcd4feb-ce52-4e6f-9da6-eef2a75a4f70\\})|(\\{5eb45d74-0f46-4269-bc0e-8a2a49d64267\\})|(\\{7e8c27c0-b94c-4026-8068-2d152143f073\\})|(\\{9ede19b2-bb97-4d1c-abab-b1d72e7d4c74\\})|(\\{19abb7a0-fb4d-41ff-97d4-65f1680c1348\\})|(\\{25efbdeb-04fa-4998-a9f8-99c1293c7b7f\\})|(\\{0049a401-f02d-4d16-8b5e-5933e5855a4c\\})|(\\{65b91ca5-cd06-42a6-9637-8ecde3a69fd6\\})|(\\{146ec14e-f623-4cb2-88ed-7d3bb8101090\\})|(\\{790d2797-82f3-4bc3-8759-c00d426bbf2f\\})|(\\{865f42b5-e073-4a36-84b1-47d09096b48b\\})|(\\{90055a5b-45a8-45c1-b0a0-979ab2a9064f\\})|(\\{a4f5c163-7b64-46c4-bfd3-348ecc99873a\\})|(\\{a8c40ee7-a376-417b-8022-40909a10181b\\})|(\\{a1031346-14d3-464f-9e50-c30dfd88ad92\\})|(\\{abd16535-2fa8-4bfd-b84e-ed09c9c60e53\\})|(\\{b5ee8c58-b5e5-4ba0-a899-9a54a2f0e386\\})|(\\{b246bb42-577e-4587-adf2-7274b378b0b4\\})|(\\{bb43765b-fe06-4d50-9802-0c6742b220aa\\})|(\\{bf3f628d-9e52-4727-b940-054c65a5a304\\})|(\\{c6bc710d-8cc8-4224-9287-44ecfa452a81\\})|(\\{c232edce-83c9-4184-9782-22df800f65e2\\})|(\\{c5397be4-b756-45b8-a247-339846fada52\\})|(\\{c6675bc5-f7ea-4a11-8252-1152d3783ae3\\})|(\\{cc6a088b-5a84-4e48-8de8-d2f6be3abae7\\})|(\\{e6c12219-f67e-4ea0-a9c3-2c541febeff1\\})|(\\{eb3a7ef7-a4d0-49a4-8b21-2a91c1758100\\})|(\\{ec34588b-86b4-4de3-a3bf-f4d1d8386475\\})|(\\{f4fd8825-648f-4b63-a499-3fd702d42149\\})|(\\{fc4f31f6-c5ed-4afd-8c19-df96e107ce7d\\})|(\\{fe337ef5-bb69-44bf-82a8-ee5c13406165\\})|(\\{ff285a1c-5672-44c3-890e-6c4f25976b83\\}))$/","prefs":[],"schema":1552908996320,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535421","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"25f18cc5-6ecc-419f-b093-b79e9f261062","last_modified":1552916969252},{"guid":"{a4491aab-e273-4bc3-b45e-a7b9b9414a5f}","prefs":[],"schema":1552695264438,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534792","why":"Search takeover not according to policies, masking as a different add-on","name":"FFCop"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d2da9c45-59f8-4257-9d7e-07c4fa5de958","last_modified":1552695747900},{"guid":"/^((\\{0f6b717d-1625-4434-b770-5ae33eb64b16\\})|(\\{6d092be7-0bad-46af-9489-04e4b3988644\\})|(\\{7f6049d6-e8b0-4c42-8028-204d1458ddb6\\})|(\\{12b75028-c038-40bd-be5b-2809b7d18d78\\})|(\\{46f35a01-faaf-4fab-95e6-7dfc8b6d8b73\\})|(\\{55d2c6f7-62fa-4091-988b-7f4c4b3c1bff\\})|(\\{75aeaeec-d415-404d-84ba-bd70bcc5e70c\\})|(\\{76b8cf24-227d-4e2b-af4c-39ec5b47babf\\})|(\\{77b725cc-5d0e-4b82-88f0-ec6961acd697\\})|(\\{90fc8426-06ba-43ab-8110-7478ff86f531\\})|(\\{90fc8426-06ba-43ab-8110-7478ff86f539\\})|(\\{157cd8f9-48f0-43a1-9bcf-c4316753e084\\})|(\\{157cd8f9-48f0-43a1-9bcf-c4316753e085\\})|(\\{201ec7f7-57b1-48dd-945c-b1ea7489195d\\})|(\\{280fc0f5-6dfb-4a3c-92ae-acb2d5352175\\})|(\\{388f6d65-4a1b-43ac-b791-387882c30599\\})|(\\{0575cabd-38f3-4964-bdc3-0141a2f062e9\\})|(\\{927e4189-4f56-437e-a0d4-5e232612b5c7\\})|(\\{7277d7cf-c598-420b-ab6e-ab066e1e2fdd\\})|(\\{67775ec2-c879-438b-9409-89fba7ffc684\\})|(\\{397386d2-bb76-4b69-8121-86fad15c5216\\})|(\\{bd7f03dc-b362-4744-b118-43ab916205f9\\})|(\\{c133fb29-c967-4aec-953a-4974e8cbdb26\\})|(\\{cc94c8a7-efa3-435c-91fe-ca305f70e39d\\})|(\\{cfd2ff68-6579-4448-8a26-561bdb63877c\\})|(\\{d00f0050-a66c-49fc-9236-1498d4d29f67\\})|(\\{daa287a2-5916-413e-9b61-52c00b5aa061\\})|(\\{dcfac76f-2fd2-4477-9a60-22d167cabcb4\\})|(\\{dd1bbcf4-bff3-4f15-8a2c-3d52ce987f70\\})|(\\{ddb546b5-6490-4af5-8813-8e701bc06e26\\})|(\\{ead6848b-4bd6-4f9a-93bd-b8460c6f6973\\})|(\\{eb8f7a97-ffb0-40f1-9321-5ab1de884f1c\\})|(\\{ec3e8a3d-df39-4f84-ab31-dae369a225e4\\})|(\\{ef986f55-2dc9-4e39-8c87-618cf4fe5e69\\})|(\\{f8b4b601-7917-40c1-94ec-8efbbf125a46\\})|(\\{f8bc456c-0fb4-4d5d-a85f-dfeb25459e76\\})|(\\{f0458469-cc09-407e-a891-be8606553341\\})|(\\{fa73622c-8b41-45b8-9d93-6d66e7633765\\})|(@loveroms)|(loveroms-ash1280@jetpack)|(searchdimension@gmail\\.com))$/","prefs":[],"schema":1552655172725,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535402","why":" This add-on violates Mozilla add-on policies by including abusive search behavior.","name":"Add-ons including abusive search behavior"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f9cd41dd-9e52-4506-bb58-a31e189f4ab9","last_modified":1552655392045},{"guid":"{b6f5f2d0-1aa3-4e43-b536-6db1b1bf7d1c}","prefs":[],"schema":1552592498693,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535601","why":"This add-on violates Mozilla's add-on policies by exfiltrating user data.","name":"FFcanu (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b807d5f-a192-450a-a0b3-98113c4beff1","last_modified":1552655172717},{"guid":"{e19fed8c-637a-42e3-b62a-3a6c4040ded8}","prefs":[],"schema":1552570939014,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535345","why":"This add-on violates Mozilla's add-policies by executing remote code.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5027a1c1-e050-434f-ba77-56417bc2d7cf","last_modified":1552589019976},{"guid":"{fb62e856-f09b-4cbc-ba07-642ab55f6cb4}","prefs":[],"schema":1552567880022,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534781","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"EncDNA module (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ce66baec-1237-481c-87db-ccc1bcf0359d","last_modified":1552567941331},{"guid":"{54fc344c-e8ba-462a-a6d9-9ce1b794ce46}","prefs":[],"schema":1552567837850,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534817","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4bec4aaf-dd5b-4754-bd01-461fdc7ea5ca","last_modified":1552567880014},{"guid":"{7b6def45-d585-431a-a479-5bb2badf2506}","prefs":[],"schema":1552567781490,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535055","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"PredicitionR (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e9227d28-b627-48b8-8392-e9fb5a00d9b6","last_modified":1552567837842},{"guid":"{6fb28b6b-abf2-4937-af28-340851faa971}","prefs":[],"schema":1552567721181,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534769","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"metamedian (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ed853ce8-83e0-42b7-8d93-7f48041d4987","last_modified":1552567781482},{"guid":"{ae5b30dd-b29d-4ae6-844b-5d7bfc3d7915}","prefs":[],"schema":1552567676370,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534807","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Crypto Valuator (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3cfd9af5-a7d0-49d3-971b-7af5e2eab78f","last_modified":1552567721173},{"guid":"web-private@ext.com","prefs":[],"schema":1552567616148,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534828","why":"This add-on violates Mozilla's add-on policies by overriding search preferences.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3d52fe32-71e5-47bd-8eda-d98fa0c489e9","last_modified":1552567676362},{"guid":"/^((ads@firefox\\.pl)|(adsfinland@firefox\\.pl)|(adsfrance@firefox\\.pl)|(dodateknowy@o2\\.pl)|(dodateksuper1@firefox\\.pl)|(dodateksuper2@firefox\\.pl)|(dodateksuper3@firefox\\.pl)|(dodateksuper5@firefox\\.pl)|(dodateksuper6@firefox\\.pl)|(dodateksuper@firefox\\.pl)|(test_b@iext\\.pro)|(\\{697be03c-cdd2-430e-b6cf-0f9b5f0556ee\\})|(\\{c9ced03f-a5cf-4dbf-b5ba-67673e442590\\})|(\\{cbe59f66-a23a-45c1-81ac-d0cbedf9ea4e\\})|(\\{dbf0a186-d41c-40ae-8841-e9d8a6b49d8d\\}))$/","prefs":[],"schema":1552493457658,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534940","why":"This add-on violates Mozilla's add-on policies by using a deceiving name and exfiltrating user data.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"67025e3b-860c-4680-949f-ec472cd72fae","last_modified":1552567437766},{"guid":"/^((\\{86c18738-11ed-4c16-af92-786aa036c83c\\})|(\\{d0fee16a-f4eb-4dc1-9961-82b913e5943d\\})|(\\{1c4937a1-c678-4607-8665-a16384ee302e\\})|(\\{22caeb02-38a3-415d-b168-64fadccbb4a4\\})|(\\{1c9372e7-5f0e-4541-99cf-dfbf2ab00b01\\})|(\\{9fe66994-8ed1-4317-a20a-1d0544ca062f\\})|(\\{6df222d8-97c7-42bf-9683-1cf8119c1e9e\\})|(\\{4c2dda03-bad0-4160-a8a1-6d089200420e\\})|(\\{7aae7d4f-55b9-42eb-b683-932591265e17\\})|(\\{e6f8ab99-3c96-410c-95d1-267ad48ed3e2\\})|(\\{6d8c5068-d0cb-47a5-af5e-3f23064f4608\\})|(\\{90481f38-d06a-465e-a54c-206bbb1ee9ae\\})|(\\{4b75aeb8-f14a-4ef3-b1ad-09733b40dac3\\})|(\\{3a8ca495-f5ab-4320-b070-4f44266fe3d1\\})|(\\{84f8914f-0dec-48ed-a0fd-4a7712c06793\\})|(\\{aa613fce-603c-41df-bf49-9b09614cebe6\\})|(\\{30314350-199a-4951-9c05-c3537a946492\\})|(\\{a2edce1d-10ab-483d-8c01-5e5fe0c82902\\})|(\\{ec91a3d4-8311-4700-aa15-b3941f21a052\\})|(\\{e9049687-164a-4cf3-be1f-1291cfb0f44a\\})|(\\{2be73925-ebaf-43ca-8b26-bd820887f591\\})|(\\{840eadea-1c68-411f-b4e9-08d9f236385d\\})|(\\{0a89d040-5fb1-46d7-bf81-43b55e83695d\\})|(\\{6a1e76ed-4ac2-4a0c-8beb-43ae63558b36\\})|(\\{1b90c930-e7d7-486a-9085-8b57129489c7\\})|(\\{eab649ca-af76-4de9-95b0-8036e35a66cc\\})|(\\{0628e652-98f4-4e58-9ecb-ad996b061aef\\})|(elfr@geckoaddon\\.org)|(else@geckoaddon\\.org)|(fr_b@iext\\.pro)|(it_b@iext\\.pro)|(sv_b@iext\\.pro)|(no_b1@iext\\.pro)|(fi_b@iext\\.pro)|(au_b@iext\\.pro)|(elfr12@geckoaddon\\.org)|(test@informations\\.to)|(se_pop@informations\\.to)|(it@spongebog\\.funny-ok\\.com)|(it@tsunami\\.funny-ok\\.com)|(fi@spongebog\\.funny-ok\\.com)|(fi@tsunami\\.funny-ok\\.com)|(no@spongebog\\.funny-ok\\.com)|(no@tsunami\\.funny-ok\\.com)|(fr@tsunami\\.funny-ok\\.com)|(fr@spongebog\\.funny-ok\\.com)|(se@tsunami\\.funny-ok\\.com)|(se@spongebog\\.funny-ok\\.com)|(au@spongebog\\.funny-ok\\.com)|(au@tsunami\\.funny-ok\\.com)|(nz@spongebog\\.funny-ok\\.com)|(nz@tsunami\\.funny-ok\\.com)|(gr@spongebog\\.funny-ok\\.com)|(gr@tsunami\\.funny-ok\\.com)|(nz_fnew@tsunami\\.funny-ok\\.com))$/","prefs":[],"schema":1552320039514,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534103","why":"Stealing cookies, browsing history and other information","name":"Rogue Updater add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b57d9505-21bf-4a24-accb-05ceac50dadc","last_modified":1552323475989},{"guid":"{c04d9d7d-1c8c-4eab-a51a-828c47e1b8b7}","prefs":[],"schema":1552246898392,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1533780","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"asin (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2c739daa-ffee-48d9-a825-e53c8fd2bb3c","last_modified":1552300402314},{"guid":"/^((\\{ee2d725e-9726-43ac-8040-60ce9ff2831b\\})|(\\{55417a80-e6f7-4d77-8d73-f59045e5e890\\}))$/","prefs":[],"schema":1551728497880,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1532269","why":"This add-on violates Mozilla's add-on policies by using a deceptive name.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aca80fb4-760e-4cd4-9fec-649fb38b2947","last_modified":1551794995188},{"guid":"/^((\\{5084f455-bc8f-483c-b145-91245bcbfd64\\})|(\\{bd69d5d0-4b2f-48cb-bab5-dcf1e0f9c63b\\}))$/","prefs":[],"schema":1551398716775,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1531416","why":"Maliciously collecting form data and cookie modification","name":"Adblock/Adobe Flash fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7718be46-8e84-4bc7-a5a9-4c5de18378ee","last_modified":1551399019543},{"guid":"/^((\\{6745ccb4-833d-497e-b582-d98a5e790e8c\\})|(\\{cd205ddb-b106-4d2a-a965-5d1c610b5072\\})|(\\{218ec82e-2839-42da-acaa-e527454f4237\\})|(\\{7af25a3d-1caf-49f8-8be9-8ae6065db7c5\\}))$/","prefs":[],"schema":1551397746059,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530911","why":"Search hijacking, remote scripts","name":"Emoj1 clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"77a32be3-94ce-49c2-b129-fa2562a7f47b","last_modified":1551398716765},{"guid":"Youtube-video@Myaddons.com","prefs":[],"schema":1551397521494,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529887","why":"Remote script injection and data exfiltration","name":"YouTube Video and MP3 Downloader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a30f9f2a-aa68-48b7-88cc-8a582405b385","last_modified":1551397746049},{"guid":"Youtube-downloader@Myaddons.com","prefs":[],"schema":1551396963937,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529873","why":"Remote script injection, data exfiltration","name":"YouTube MP3 Converter"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1d596a69-157f-4743-9465-f86d6452206b","last_modified":1551397521482},{"guid":"{ba74c7ee-32b1-11e9-ade5-1f2222a4f325}","prefs":[],"schema":1551382900634,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529573","why":"Remote script injection and user data exfiltration","name":"GET Security"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"01825fea-8c5c-4d76-bd06-e1019c188056","last_modified":1551396963926},{"guid":"/^((\\{e0686c32-99b4-44d8-972f-88bf08b68f88\\})|(\\{b2225e4c-9d1d-472b-8aeb-5ff203bcff9a\\}))$/","prefs":[],"schema":1551210091992,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530932","why":"This add-on is distributed violates Mozilla's add-on policies by being distributed through a fake Firefox update page.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"37252271-9e38-46a9-b23a-2b6d7048c0db","last_modified":1551250023025},{"guid":"{9d7cfde2-39ae-11e9-bde0-02427e2eba50}","prefs":[],"schema":1551104404768,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530640","why":"This add-on violates Mozilla's add-on policies by including abusive remote functionality, negatively affecting security and performance.","name":"Unnamed malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7bb234b0-cfda-4a23-bf02-9c82fb3500a3","last_modified":1551204284998},{"guid":"{4603d01d-ae80-4653-9288-d5ef98b99a17}","prefs":[],"schema":1551099702949,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529924","why":"This add-on violates Mozilla add-on policies by including abusive remote code.","name":"IMmailgun (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"32227de6-a7bf-454c-bf44-4478ddd96abe","last_modified":1551099805258},{"guid":"{157cd8f9-48f0-43a1-9bcf-c4316753e083}","prefs":[],"schema":1551037300209,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529926","why":"This add-on violates Mozilla add-on policies by including abusive search behavior.","name":"SD App (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b3fe8de-6d05-4d95-a6d2-cd5695f1b0c0","last_modified":1551099426266},{"guid":"{5288d05d-253f-4675-be3b-152bf02aa3ec}","prefs":[],"schema":1550683849233,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529328","why":"Remote script injection along with deceptive code to hide the fact","name":"Unicode & Emoji Support"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9600b4cd-da02-4947-a4f5-c56c657ba197","last_modified":1550684288501},{"guid":"restore.old@youtube.com","prefs":[],"schema":1550580649249,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529126","why":"This add-ons does remote script injection in a way that attempts to hide the injection. The code being executed runs on all pages which is contrary to what the add-on is described to do.","name":"Restore Old Youtube"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"27917953-17fb-4ffc-bcf1-5fc2727174b4","last_modified":1550617105595},{"guid":"/^((pohhpifegcbplaijeeonlbkjgocfgjbf@chrome-store-foxified-18573537)|(pohhpifegcbplaijeeonlbkjgocfgjbf@chrome-store-foxified-570932499)|(aackamlchlgmalkmcphbhhcjebbpnfdf@chrome-store-foxified-233164420)|(pohhpifegcbplaijeeonlbkjgocfgjbf@chrome-store-foxified-1808417494)|(nnfhjlgginbfdejaajhbboeemajpjgfp@chrome-store-foxified-699139867)|(dilkapnoekabmkkhhdlpnpfgjcmddlia@chrome-store-foxified-1808417494)|(dilkapnoekabmkkhhdlpnpfgjcmddlia@chrome-store-foxified-1190639722)|(nnfhjlgginbfdejaajhbboeemajpjgfp@chrome-store-foxified-2745518014)|(fibaefnljghpmdibfkhnlaniblfkkndi@chrome-store-foxified-1955364993)|(dilkapnoekabmkkhhdlpnpfgjcmddlia@chrome-store-foxified-1516694386)|(generated-rk4dtanssk56goquir78sz@chrome-store-foxified--1594555229)|(nnfhjlgginbfdejaajhbboeemajpjgfp@chrome-store-foxified-1388315457)|(oaoebpgbkehlcdggaeeohgfpopdhjell@chrome-store-foxified-1823310541)|(fibaefnljghpmdibfkhnlaniblfkkndi@chrome-store-foxified--1031675095)|(ancjheohbkbnkgcmfaldcaepoeeplkgh@chrome-store-foxified-1823310541)|(generated-lwcbpuj27wcknyyl6pkap7@chrome-store-foxified-1823310541)|(generated-bmtr2hbgikv399aj6aeycd@chrome-store-foxified-1823310541)|(generated-8w9odie82h2ugbsrofooj3@chrome-store-foxified-1823310541)|(\\{4170faaa-ee87-4a0e-b57a-1aec49282887\\})|(\\{b66dd4bc-7f5e-41d9-bc43-84c5736d0c87\\})|(\\{507ad1fb-08ae-43ac-a596-fd5b6e7dea9a\\})|(\\{8bf85207-66df-4eb7-b913-ac162498c687\\})|(\\{b063895a-8077-452d-b049-ebc20a39f882\\})|(\\{5776bd90-3d09-43b5-a769-8da373e9820f\\})|(\\{f6bdce44-3d5a-4f88-9a64-e39fcb4f0717\\})|(\\{1c22e687-6a02-440c-a6d5-c1ccaf520e10\\})|(\\{f7be824f-7287-466a-8590-2f48007a223b\\})|(\\{89ffc0b4-97f7-447c-bd6f-9c519b0188bd\\})|(\\{3a67084b-c231-4b4b-a924-ffa741f90921\\})|(\\{fac8b1d0-f321-491d-9234-c40d89b3660d\\})|(\\{a8053a83-8d1a-4f0e-9f88-d31cfe00cf83\\})|(\\{d10fa57e-37d3-43d3-39f8-e6d5b2a7759d\\})|(savetube_downloader@savetube\\.co)|(\\{95a8a08c-53a8-7e1d-5a80-f1a5cd4751bf\\})|(\\{5037bd74-c23b-4bbf-8865-6b5a09e07342\\})|(\\{830c558c-70f0-4b07-95f1-8e06ad34ee2c\\})|(\\{e4d93c37-1299-452f-9b60-adee15ad3802\\})|(googlemaps@search))$/","prefs":[],"schema":1550502645324,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1528761","why":"Malicious add-ons injecting remote scripts and exfiltrating data for monetization purposes. Some of the add-ons are masking themselves as legit add-ons and using various obfuscation tactics to hide their injections.","name":"Rogue Youtube downloaders and related add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f2483d7d-1895-4ae6-9901-7321e59062a6","last_modified":1550502978653},{"guid":"/^((((generated-e0yf8zkhypow3jjifkqzwo)|(iiinclagpealgnaglbmkdbfbgchjjbpg)|(jaehkpjddfdgiiefcnhahapilbejohhj))@chrome-store-foxified--?\\d+)|(jid1-9ETkKdBARv7Iww@jetpack)|(\\{813fe658-5a29-4dcc-ba6c-3941676e4f19\\}))$/","prefs":[],"schema":1550254444783,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1528308","why":"This add-on violates Mozilla's add-on policies by tracking user behavior and including remote code.","name":"BuyHatke Best Price Comparison, Graph, Coupons (and similar)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d6b2dbad-31e9-4984-b649-19036cd38e1d","last_modified":1550265430182},{"guid":"/^((odnenajaeicndaeiapagpglohiklndhe@chrome-store-foxified-2174031944)|(akdibckdjeocfbcjaikipkhhbggcbgkg@chrome-store-foxified-699805590)|(\\{bd9f5830-bf8c-4e38-933d-09f85b24d744\\})|(youtube-downloader@addoncrop\\.com)|(dailymotion-downloader@addoncrop\\.com)|(youtube-mp3-iframe-downloader@addoncrop\\.com)|(youtube-downloader-lite@addoncrop\\.com)|(dailymotion-downloader-lite@addoncrop\\.com)|(generated-p5qj07ef5ceqfktp5v8whw@chrome-store-foxified--505607522)|(generated-tuag2j5gwq73xzp8fbw3j8@chrome-store-foxified--505607522)|(generated-uj53d5j612ap5pz11hwgv2@chrome-store-foxified--505607522)|(\\{f51f0244-bfb0-40ce-bf9d-af49f5949e61\\})|(\\{81751484-2dc9-47bf-aec3-b8e556237178\\})|(\\{d89d1e20-57af-4164-82cc-650af45cf0a5\\})|(\\{a5e28713-14c3-4967-befe-2ec253e317cd\\})|(\\{335ac35b-6c16-4304-93f0-64a418e5bf81\\})|(\\{d3fdb429-ef84-40a4-b160-010745ee0098\\})|(\\{d66db057-7d38-4df4-a0ba-63c272be25ee\\})|(\\{ff7f7151-09e3-4e35-9052-b21e23e7e2c1\\})|(\\{1479da02-e759-4a6f-8f62-c08096583806\\})|(\\{42d59cda-c117-459e-b244-1b850c27ccc9\\})|(\\{bec48f33-7869-4158-8cbc-5cf1606f9afa\\})|(\\{08ca656c-4973-46a8-85a9-3d771399c86e\\})|(\\{dc5336c8-5624-4f74-a794-bb15f3760f34\\})|(\\{6a3d97de-1b42-4624-880a-1a68bc917142\\})|(\\{ad965166-3a34-449d-8230-a636fb5cae57\\})|(video-view@vv\\.us)|(video-view@excoe\\.com)|(xeco@rama\\.com)|(ghj@brem\\.com)|(fgtr@rembgr\\.com)|(xero@saltam\\.com)|(sora@remjem\\.com)|(repo@saram\\.com)|(tora@empoytr\\.net)|(saving@ropbart\\.com)|(japa@vbgt\\.com)|(rtya@nop\\.net)|(asan@khazan\\.com)|(xerb@tangot\\.com)|(audiotools@ramdeen\\.com)|(webat@extrolm\\.com)|(media@medplus\\.com)|(audio@audequl\\.com)|(control@medcontrols\\.com)|(sabqo@rimjim\\.com)|(repto@secroa\\.com)|(meters@videobf\\.com)|(betro@diskra\\.com)|(codeca@vxmrop\\.com)|(revoca@feronx\\.com)|(brota@vidbrghta\\.com))$/","prefs":[],"schema":1550173301925,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1527603","why":"This add-on violates Mozilla's add-on policy by including malicious remote code.","name":"Various add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d94f7e0f-7088-43c9-a8da-eae102781079","last_modified":1550253583075},{"guid":"superzoom@funnerapps.com","prefs":[],"schema":1549578756953,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1525405","why":"This add-on includes abusive functionality including violating the user's security and privacy.","name":"SuperZoom (Abusive)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f7c4b329-7a54-48d3-9494-81783fe99d90","last_modified":1549627400713},{"guid":"/^((addon@firefox-updater\\.com)|(downloader@youtube-download\\.org)|(downloader2@youtube-download\\.org)|(downloader1@youtube-download\\.org))$/","prefs":[],"schema":1549369087422,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1525153","why":"These add-ons include abusive behavior.","name":"\"FF Manual Update (Required)\" and \"Easy Youtube Video Downloader Express\" (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6b72e942-af54-469c-b9f2-9e436ad2c0d1","last_modified":1549373215201},{"guid":"/^((\\{0b347362-773f-4527-a006-f96e9db437e5\\})|(\\{9edb10ad-67af-4ad0-af45-efe452479321\\})|(\\{202e2671-6153-450d-bc66-5e67cee3603f\\}))$/","prefs":[],"schema":1548963700621,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1524357","why":"This add-on includes hidden abusive functionality.","name":"Video download add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"680a99e9-c972-4a14-9b15-e56eeeed75eb","last_modified":1549037404012},{"guid":"/^((\\{a9bc520e-68ab-49c2-a8df-75a0349d54fd\\})|(\\{bfc5d009-c6bd-4526-92ce-a9d27102f7f2\\}))$/","prefs":[],"schema":1548699141208,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1522959","why":"Add-ons that contain abusive functionality.","name":"Unnamed (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"97c4ee31-4009-40de-ae02-f1b349c87d01","last_modified":1548699177099},{"guid":"{4e47160d-ec83-417c-ab01-cda978378d9e}","prefs":[],"schema":1548699076839,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1522970","why":"The add-on contains abusive functionality.","name":"mlflow (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"62c54642-73ab-4641-b5c2-47e4ae29bbc5","last_modified":1548699141199},{"guid":"/^((\\{feff5ea4-ed4a-46a3-9331-12fec01d52a9\\})|(\\{8ffc339c-0ca1-46e3-acb3-3bfd889f9a21\\})|(\\{1fe481b5-baad-44e9-b410-082cf0f2acbb\\})|(\\{92c85192-b325-4599-82e2-a110f193eae6\\})|(\\{5bc21266-26f1-469a-bc1a-a49d7b70ecb9\\})|(\\{dc2dd143-f2e7-4f46-a8ff-4dc1a985e889\\})|(\\{c1233bb6-31a9-4c7d-8469-f8f44adee9ba\\})|(\\{d0d48905-1065-43dc-ab96-434d100602ed\\})|(\\{11deae99-2675-4d5e-86cd-7bd55b88daf2\\})|(\\{a7014e8e-eacf-4ba0-9047-c897c4ed3387\\})|(\\{b9c545a5-0ffa-490a-8071-2fee09478cfe\\})|(\\{39e8eebb-4d9e-4a03-93a8-4468fdd7a186\\})|(\\{8ccc00b1-2010-4155-a07c-f4d7c4d6dec2\\})|(\\{a1056511-4919-43b7-a9e5-ac2b770de810\\})|(\\{90a6da19-9165-44c1-819c-e3b53409f9c9\\})|(\\{e3862078-8f9f-4f8e-99dc-55ba558f0619\\})|(\\{d89fcf34-2615-4efc-a267-1e83ab6a19d0\\})|(\\{588151ce-eab4-4acf-83a7-bb5ccaf4d867\\})|(\\{6ab6312d-5fd4-42a9-ab10-08b954e53f9d\\})|(\\{24a6cbde-be68-4b7d-9f1b-d4d5dfd178a3\\})|(\\{55ae1a08-105f-4f7f-9d4e-e448b517db2b\\})|(\\{74fe9d83-df17-4812-bd3f-27b84b0086b7\\})|(\\{21140e51-713a-4bf8-865b-e2ee07282409\\})|(\\{24f39610-2958-4dc8-a73b-75cc9665bffa\\})|(\\{c50a45a5-efa4-44af-8946-6f20e4748d47\\})|(\\{41d0b7e0-0d93-4f67-bed9-da6d7688ad16\\})|(\\{c2bee222-2163-4c0f-89f5-4ac502f06810\\})|(\\{4be4602e-2b20-473f-8f2b-85e8c53d17dc\\})|(\\{dec2e9b5-e787-4fb5-a7bc-5894f80f7367\\})|(\\{179526e1-1824-49f7-afb3-49fdaadaa503\\})|(\\{4f07d826-ca9e-4370-a508-b984f54758de\\})|(\\{d0558df2-714f-4793-9d85-d2d648de4f2e\\})|(\\{daf1a69b-f47b-4936-bd25-5ac21f4e27ec\\}))$/","prefs":[],"schema":1548099697813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1521975","why":"Remote script injection and deceptive tactics to hide the fact","name":"ext-affiliate add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"87c17ce6-aaef-4d47-a662-588efff34041","last_modified":1548198338831},{"guid":"hlper@xero.com","prefs":[],"schema":1548076840649,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1521533","why":"This add-on executes abusive remote code.","name":"Av Player Helper (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1e2ae4c0-66cd-40bc-9cf6-5ca0ce9548f7","last_modified":1548084072622},{"guid":"/^((xtera@soravem\\.net)|(nozl@ssave\\.net))$/","prefs":[],"schema":1547926889113,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1521429","why":"This add-on injects abusive remote code.","name":"Video Assist (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c69997df-0b61-4de5-a351-b640123a9c3b","last_modified":1548073537411},{"guid":"/^((\\{94f608b3-76b6-4b7b-8cef-7360df22a930\\})|(\\{9648b74f-35ea-4218-acf0-ec2191f509f6\\}))$/","prefs":[],"schema":1547754101798,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1520813","why":"Add-ons that leak private user data.","name":"Instagram Register and Google Register (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a15e8d7e-0726-4190-8187-c75e2b46d429","last_modified":1547810271416},{"guid":"reopen@closedtab.com","prefs":[],"schema":1547067530457,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1518847","why":"This add-on contains unwanted abusive behavior unrelated to the add-ons functionality.","name":"Reopen Closed Tabs (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"451d950f-ca89-491b-87e7-45123e4f5ab4","last_modified":1547206877909},{"guid":"{43ecded1-f7cb-4bb6-a03d-4bec23b9f22d}","prefs":[],"schema":1547025691087,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1518580","why":"This add-on violates Mozilla's policy and user's security/privacy by loading abusive code from remote.","name":"lamme (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"06c6868e-055f-4e7d-aa8f-5ba577f43e85","last_modified":1547027153061},{"guid":"youtube_downloader@addon.partners","prefs":[],"schema":1546890104853,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1518032","why":"This add-on contains unwanted abusive functionality.","name":"YouTube Download Tool HD (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5a42c5bb-9cb4-4d96-b978-8d9f816322e6","last_modified":1547025691078},{"guid":"/^((\\{00cf6ee0-14f3-4e35-a4fd-d2160fe2f05e\\})|(\\{0da583da-e623-41f2-b2d2-0ac61b493171\\})|(\\{105c14a6-8b6f-49ef-b0d6-41bad99ad5e8\\})|(\\{10a15a74-271f-4098-a662-bd827db4f8bc\\})|(\\{13e02b9b-2797-4100-8144-65b73c4145c4\\})|(\\{1eb56568-8a30-42b1-a646-ad9f485f60fe\\})|(\\{1eb8a08c-82a8-4d1d-8b80-f7b5cd4751bf\\})|(\\{2f8220a8-b2a7-4277-ba6b-bdcb6958f669\\})|(\\{33f39a5d-137c-4757-9f9d-e86395c8bf20\\})|(\\{347ca189-9e63-43d2-8a2f-5d5141598bdc\\})|(\\{396056fc-1697-4954-b535-06de8d62fe1b\\})|(\\{3d530918-dbe8-442c-8faf-1f4ca7ca8ab9\\})|(\\{3e283c2e-cde3-4baa-8076-226ca8fb90ef\\})|(\\{591468f8-ebbd-497a-92f1-fa0a1206adb4\\})|(\\{5f6c3eb8-aa32-489a-bb01-b12b23d2001a\\})|(\\{6cbb397a-d865-42b2-8454-25a75b710dff\\})|(\\{7ae2bde0-f7ea-4bf3-a055-06953f9fcf31\\})|(\\{7b402578-ddec-4eee-9c8b-98e4e8db0059\\})|(\\{7fb00cf7-40d3-4415-a0c8-a48d3fbe847f\\})|(\\{87a8a08c-82a8-4d1d-8b80-f7b5cd4751bf\\})|(\\{888220a8-b2a7-4277-ba6b-bdcb6958f669\\})|(\\{8b1dd8f3-224b-4975-bda2-cb2dd184d4d8\\})|(\\{8bcdc9cc-f6be-4203-ae43-a9d281f0bcdb\\})|(\\{8cda9ce6-7893-4f47-ac70-a65215cec288\\})|(\\{8dc9b946-0bb9-4264-9c76-fd9ff1e159a2\\})|(\\{942e0fec-19f2-4ebc-8a74-009da7fa625d\\})|(\\{b2a720a8-b2a7-4277-aa6b-bdeb6958f669\\})|(\\{bdcf953b-d2aa-4e7a-8176-aeb1e95a0caf\\})|(\\{cae82615-f7be-4aff-875d-33da1bc93923\\})|(\\{d2aa953b-bdcf-4f7a-8476-ddb1e9500caf\\})|(\\{da0fa57e-17d3-40d3-99f8-e9d5b2a7759d\\})|(\\{da1237ca-e35d-4653-b2b5-d98043f33781\\})|(\\{e164563a-1512-4b81-99ff-95f2644c4075\\})|(\\{e2a720a8-b3a7-1277-aa2b-bdeb2958f669\\})|(\\{e6a90490-6ef7-407d-863a-7dd120f6f7dc\\})|(\\{f15cfa53-fa9b-43cf-84e8-16ece6695922\\})|(\\{f722c845-2d8b-4a0a-b518-4f39af703e79\\})|(\\{ff1c4e62-7c11-4ea7-b734-3462417ceeb5\\})|(\\{ffa0a57e-17d2-41d3-96f8-e8d5b2a0759d\\}))$/","prefs":[],"schema":1546378806655,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1517154","why":"Executing remote code containing coin mining and other undisclosed monetization","name":"Various remote iframe add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"53c5fb08-1001-471e-87ce-31185a84bcbc","last_modified":1546439268437},{"guid":"{02267dc4-36f2-4c22-8103-9e26477b48ef}","prefs":[],"schema":1545922885656,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1516539","why":"Google Search hijacking and affiliate injection","name":"Markdown"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6dd73da4-cb2f-4eb8-8850-890e80c8d57b","last_modified":1545926512914},{"guid":"{d064563a-1542-4b8b-99ff-95f1644c4075}","prefs":[],"schema":1545921144932,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1516488","why":"Obfuscated remote script injection stealing data","name":"PDF Print and Save"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"875bc1c6-257e-438a-8624-3bfe963747b0","last_modified":1545922824252},{"guid":"/^((\\{83768008-e10c-48c0-b303-5a0f1de763a1\\})|(\\{430b0612-bfad-463b-8783-cf2e32801513\\})|(\\{519adb83-4abb-4a66-8e94-243754b8adce\\})|(\\{228a707d-55c1-465b-a759-a2129eb6602e\\}))$/","prefs":[],"schema":1545853297809,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1516131","why":"Remote script injection and data exfiltration","name":"Various malicious remote script injection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c0cb1a85-c6c6-453e-b126-0e6e26ceaf88","last_modified":1545870108716},{"guid":"/^((\\{4c4ceb83-f3f1-ad73-bfe0-259a371ed872\\})|(\\{a941b5ab-8894-41e1-a2ca-c5a6e2769c5f\\})|(\\{56488007-bd74-4702-9b6d-aee8f6cc05ea\\})|(\\{9eebac07-ac86-4be7-928f-e1015f858eee\\})|(\\{5a993517-5be7-480e-a86c-b8e8109fa774\\})|(\\{309ad78e-efff-43cf-910c-76361c536b20\\})|(\\{cefcf45b-dfec-4072-9ffc-317094c69c28\\})|(\\{5b04980b-25e9-4bc6-b6ea-02c58d86cc5e\\})|(\\{0021a844-360f-480e-ac53-47391b7b17b4\\})|(\\{2bed9f51-62a8-4471-b23c-827e6727c794\\})|(\\{7d2130d3-d724-4f58-b6b7-8537a9e09d4c\\})|(\\{ccd3847a-e5ec-4d28-bf98-340230dcbd4d\\})|(\\{83716b9b-6e6e-4471-af76-2d846f5804f3\\})|(\\{5154c03a-4bfc-4b13-86a9-0581a7d8c26d\\})|(\\{24f51c5c-e3f5-4667-bd6c-0be4f6ef5cc2\\})|(\\{73554774-4390-4b00-a5b9-84e8e06d6f3c\\})|(\\{c70cfd12-6dc3-4021-97f2-68057b3b759b\\})|(\\{ef5fe17b-eb6a-4e5e-9c18-9d423525bbbd\\})|(\\{461eb9b4-953c-4412-998e-9452a7cb42e0\\})|(\\{966b00fe-40b0-4d4b-8fde-6deca31c577b\\})|(\\{dab908ac-e1b0-4d7e-bc2e-86a15f37621f\\})|(\\{01a067d3-7bfa-44ac-8da7-2474a0114a7e\\})|(\\{6126261f-d025-4254-a1db-068a48113b11\\})|(\\{6c80453f-05ec-4243-bb71-e1aac5e59cae\\})|(\\{f94ec34b-5590-4518-8546-c1c3a94a5731\\})|(\\{5d4c049e-7433-485a-ac62-dd6e41af1a73\\})|(\\{507f643d-6db8-47fe-af9c-7a7b85a86d83\\})|(\\{5c56eeb4-f97c-4b0d-a72f-8e639fbaf295\\})|(\\{2ef98f55-1e26-40d3-a113-a004618a772e\\})|(\\{77d58874-d516-4b00-b68a-2d987ef83ec5\\})|(\\{7a0755d3-3ba2-4b19-98ce-efcdc36423fc\\})|(\\{47ee3ba1-8974-4f71-b8a4-8033d8c2155f\\})|(\\{a477f774-bc36-4cc8-85bd-99f6b04ea255\\})|(\\{1a2e41e3-4343-4a00-90cd-ce77ac77a8af\\})|(\\{7b180e9a-afd6-4693-94a1-c7b5ed9b46fa\\})|(\\{51f76862-f222-414d-8724-6063f61bbabf\\})|(\\{d47a0c63-ac4c-48ce-8fc7-c5abc81d7f75\\})|(\\{b8adf653-f262-413c-b955-100213b105ad\\})|(\\{ccedf35b-dfd6-417a-80de-fb432948861d\\})|(\\{70e29b0e-7cd8-40df-b560-cf6eb066350d\\})|(\\{9926f8ad-b4c3-4122-a033-1b8a5db416db\\})|(\\{62eefb1c-a2d8-40ba-ab94-9fc2f2d31b2f\\})|(\\{17f14919-00bd-44a4-8c14-78ab9728038f\\})|(\\{20e36a3e-672c-4448-9efb-5750cbffe90c\\})|(\\{6070c95f-6460-4ffd-9846-2bbd7238697f\\})|(\\{1edb8a4e-f105-4623-9e19-e40fb082b132\\})|(\\{223a1503-772d-45eb-8cb8-e2e49563703d\\})|(\\{59e0f01c-1f70-445c-a572-7be5d85549bd\\})|(\\{8ec160b7-1089-4944-a999-a1d6afa71c5d\\})|(\\{d2d111d6-0ea1-4880-ae7b-2e82dff3a719\\})|(\\{cfacacd6-191c-46c4-b78c-8a48289b2829\\})|(\\{1155e72f-2b21-433f-ba9a-5af6ed40c8ee\\})|(\\{583910bd-759f-40f6-b96a-1d678d65650f\\}))$/","prefs":[],"schema":1545162093238,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1514865","why":"Remote script injection and data exfiltration","name":"Various add-ons using .cool domains"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"53168513-103a-4ea0-a48f-bc291354cc9f","last_modified":1545232187960},{"guid":"{56a1e8d2-3ced-4919-aca5-ddd58e0f31ef}","prefs":[],"schema":1544470901949,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491312","why":"The add-on introduces unwanted functionality for users.","name":"Web Guard (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1dc366d6-c774-4eca-af19-4f9495c2c55e","last_modified":1544544484935},{"guid":"/^((\\{a99e680b-4349-42a5-b292-79b349bf4f3d\\})|(\\{f09a2393-1e6d-4ae4-a020-4772e94040ae\\})|(\\{c9ed9184-179f-485f-adb8-8bd8e9b7cee6\\})|(\\{085e53da-25a2-4162-906e-6c158ec977ac\\})|(\\{bd6960ba-7c06-493b-8cc4-0964a9968df5\\})|(\\{6eeec42e-a844-4bfd-a380-cfbfc988bd78\\})|(\\{3bbfb999-1c82-422e-b7a8-9e04649c7c51\\})|(\\{bfd229b6-089d-49e8-a09c-9ad652f056f6\\})|(\\{ab23eb77-1c96-4e20-b381-14dec82ee9b8\\})|(\\{ebcce9f0-6210-4cf3-a521-5c273924f5ba\\})|(\\{574aba9d-0573-4614-aec8-276fbc85741e\\})|(\\{12e75094-10b0-497b-92af-5405c053c73b\\})|(\\{99508271-f8c0-4ca9-a5f8-ee61e4bd6e86\\})|(\\{831beefc-cd8c-4bd5-a581-bba13d374973\\})|(\\{c8fe42db-b7e2-49e6-98c4-14ac369473a4\\})|(\\{f8927cca-e6cb-4faf-941d-928f84eb937f\\})|(\\{17e9f867-9402-4b19-8686-f0c2b02d378f\\})|(\\{f12ac367-199b-4cad-8e5a-0a7a1135cad0\\})|(\\{487003ce-5253-4eab-bf76-684f26365168\\})|(\\{487003ce-5213-2ecb-bf16-684f25365161\\}))$/","prefs":[],"schema":1543088493623,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1509864","why":"Add-ons that track users and load remote code, while pretending to provide cursor customization features.","name":"Various cursor and update add-ons (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a8d942b3-779d-4391-a39c-58c746c13b70","last_modified":1543241996691},{"guid":"{97f19f1f-dbb0-4e50-8b46-8091318617bc}","prefs":[],"schema":1542229276053,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1507191","why":"Fraudulent Adobe Reader add-on","name":"Adobe Reader (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"03120522-ee87-4cf8-891a-acfb248536ff","last_modified":1542272674851},{"guid":"/^((video-downloader@vd\\.io)|(image-search-reverse@an\\.br)|(YouTube\\.Downloader@2\\.8)|(eMoji@ems-al\\.io))$/","prefs":[],"schema":1542023230755,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1506560","why":"Add-ons that contain malicious copies of third-party libraries.","name":"Malware containing unwanted behavior"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cd079abe-8e8d-476f-a550-63f75ac09fe8","last_modified":1542025588071},{"guid":"/^({b384b75c-c978-4c4d-b3cf-62a82d8f8f12})|({b471eba0-dc87-495e-bb4f-dc02c8b1dc39})|({36f623de-750c-4498-a5d3-ac720e6bfea3})$/","prefs":[],"schema":1541360505662,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1504619","why":"Add-ons that contain unwanted behavior.","name":"Google Translate (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aa5eefa7-716a-45a6-870b-4697b023d894","last_modified":1541435973146},{"guid":"{80869932-37ba-4dd4-8dfe-2ef30a2067cc}","prefs":[],"schema":1538941301306,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1497161","why":"Malicious page redirection","name":"Iridium (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dd5b0fa4-48fd-4bf6-943d-34de125bf502","last_modified":1538996335645},{"guid":"admin@vietbacsecurity.com","prefs":[],"schema":1537309741764,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491716","why":"Logging and sending keystrokes to a remote server.","name":"Vietnamese Input Method (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"89d714f6-9f35-4107-b8af-a16777f66337","last_modified":1537309752952},{"guid":"Safe@vietbacsecurity.com","prefs":[],"schema":1537309684266,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491717","why":"Logging and sending keystrokes to a remote server.","name":"SafeKids (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c651780e-c185-4d6c-b509-d34673c158a3","last_modified":1537309741758},{"guid":"/^((\\{c9226c62-9948-4038-b247-2b95a921135b\\})|(\\{5de34d4f-b891-4575-b54b-54c53b4e6418\\})|(\\{9f7ac3be-8f1c-47c6-8ebe-655b29eb7f21\\})|(\\{bb33ccaf-e279-4253-8946-cfae19a35aa4\\}))$/","prefs":[],"schema":1537305338753,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491298","why":"These add-ons inject remote malicious scripts on Google websites.","name":"Dll and similar (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"54b3e69a-40ae-4be5-b7cf-cf51c526dcfb","last_modified":1537306138745},{"guid":"updater-pro-unlisted@mozilla.com","prefs":[],"schema":1537305285414,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491306","why":"Redirects search queries.","name":"Updater Pro (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3108c151-9f25-4eca-8d80-a2fbb2d9bd07","last_modified":1537305338747},{"guid":"/^((\\{686fc9c5-c339-43db-b93a-5181a217f9a6\\})|(\\{eb4b28c8-7f2d-4327-a00c-40de4299ba44\\})|(\\{58d735b4-9d6c-4e37-b146-7b9f7e79e318\\})|(\\{ff608c10-2abc-415c-9fe8-0fdd8e988de8\\})|(\\{5a8145e2-6cbb-4509-a268-f3121429656c\\})|(\\{6d451f29-1d6b-4c34-a510-c1234488b0a3\\})|(\\{de71f09a-3342-48c5-95c1-4b0f17567554\\})|(\\{df106b04-984e-4e27-97b6-3f3150e98a9e\\})|(\\{70DE470A-4DC0-11E6-A074-0C08D310C1A8\\})|(\\{4dcde019-2a1b-499b-a5cd-322828e1279b\\})|(\\{1ec3563f-1567-49a6-bb5c-75d52334b01c\\})|(\\{c140c82e-98e6-49fd-ae17-0627e6f7c5e1\\})|(\\{2581c1f6-5ad9-48d4-8008-4c37dcea1984\\})|(\\{a2bcc6f7-14f7-4083-b4b0-c335edc68612\\})|(\\{4c726bb6-a2af-44ed-b498-794cfd8d8838\\})|(\\{fa6c39a6-cd11-477b-966d-f388f0ba4203\\})|(\\{26c7bd04-18d3-47f5-aeec-bb54e562acf2\\})|(\\{7a961c90-2071-4f94-9d9a-d4e3bbf247c0\\})|(\\{a0481ea2-03f0-4e56-a0e1-030908ecb43e\\})|(\\{c98fb54e-d25f-43f4-bd72-dfaa736391e2\\})|(\\{da57263d-adfc-4768-91f7-b3b076c20d63\\})|(\\{3abb352c-8735-4fb6-9fd6-8117aea3d705\\})|(contactus@unzipper\\.com)|(\\{a1499769-6978-4647-ac0f-78da4652716d\\})|(\\{581D0A4C-1013-11E7-938B-FCD2A0406E17\\})|(\\{68feffe4-bfd8-4fc3-8320-8178a3b7aa67\\})|(\\{823489ae-1bf8-4403-acdd-ea1bdc6431da\\})|(\\{4c0d11c3-ee81-4f73-a63c-da23d8388abd\\})|(\\{dc7d2ecc-9cc3-40d7-93ed-ef6f3219bd6f\\})|(\\{21f29077-6271-46fc-8a79-abaeedb2002b\\})|(\\{55d15d4d-da76-44ab-95a3-639315be5ef8\\})|(\\{edfbec6b-8432-4856-930d-feb334fb69c1\\})|(\\{f81a3bf7-d626-48cf-bd24-64e111ddc580\\})|(\\{4407ab94-60ae-4526-b1ab-2521ffd285c7\\})|(\\{4aa2ba11-f87b-4950-8250-cd977252e556\\})|(\\{646b0c4d-4c6f-429d-9b09-37101b36ed1c\\})|(\\{1b2d76f1-4906-42d2-9643-0ce928505dab\\})|(\\{1869f89d-5f15-4c0d-b993-2fa8f09694fb\\})|(\\{7e4edd36-e3a6-4ddb-9e98-22b4e9eb4721\\})|(\\{e9c9ad8c-84ba-43f2-9ae2-c1448694a2a0\\})|(\\{6b2bb4f0-78ea-47c2-a03a-f4bf8f916eda\\})|(\\{539e1692-5841-4ac6-b0cd-40db15c34738\\}))$/","prefs":[],"schema":1536183366865,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1488578","why":"These add-ons take away user control by redirecting search.","name":"Tightrope search add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"81eb67a5-3fdb-448c-aadd-5f4d3b7cf281","last_modified":1536186868443},{"guid":"/^((\\{f01a138a-c051-4bc7-a90a-21151ce05755\\})|(\\{50f78250-63ce-4191-b7c3-e0efc6309b64\\})|(\\{3d2b2ff4-126b-4874-a57e-ed7dac670230\\})|(\\{e7c1abd4-ec8e-4519-8f3a-7bd763b8a353\\})|(\\{4d40bf75-fbe2-45f6-a119-b191c2dd33b0\\})|(\\{08df7ff2-dee0-453c-b85e-f3369add18ef\\}))$/","prefs":[],"schema":1535990752587,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1488248","why":"Add-ons that inject malicious remote code.","name":"Various Malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"67f72634-e170-4860-a5a3-133f160ebc32","last_modified":1535992146430},{"guid":"/^((\\{1cfaec8b-a1cb-4fc5-b139-897a22a71390\\})|(\\{2ed89659-09c1-4280-9dd7-1daf69272a86\\})|(\\{5c82f5cc-31f8-4316-bb7d-45a5c05227e6\\})|(\\{6a98a401-378c-4eac-b93c-da1036a00c6c\\})|(\\{6d83ebde-6396-483c-b078-57c9d445abfa\\})|(\\{07efb887-b09f-4028-8f7f-c0036d0485ea\\})|(\\{36f4882f-ff0b-4865-8674-ef02a937f7da\\})|(\\{61dea9e9-922d-4218-acdd-cfef0fdf85e7\\})|(\\{261be583-9695-48e0-bd93-a4feafaa18e6\\})|(\\{401ae092-6c5c-4771-9a87-a6827be80224\\})|(\\{534b7a84-9fc6-4d7c-9d67-e3365d2ae088\\})|(\\{552a949f-6d0e-402d-903d-1550075541ba\\})|(\\{579b8de8-c461-4301-ab09-695579f9b7c7\\})|(\\{754d3be3-7337-488e-a5bb-86487e495495\\})|(\\{2775f69b-75e4-46cb-a5aa-f819624bd9a6\\})|(\\{41290ec4-b3f0-45ad-b8f3-7bcbca01ed0d\\})|(\\{0159131f-d76f-4365-81cd-d6831549b90a\\})|(\\{01527332-1170-4f20-a65b-376e25438f3d\\})|(\\{760e6ff0-798d-4291-9d5f-12f48ef7658b\\})|(\\{7e31c21c-156a-4783-b1ce-df0274a89c75\\})|(\\{8e247308-a68a-4280-b0e2-a14c2f15180a\\})|(\\{b6d36fe8-eca1-4d85-859e-a4cc74debfed\\})|(\\{bab0e844-2979-407f-9264-c87ebe279e72\\})|(\\{d00f78fe-ee73-4589-b120-5723b9a64aa0\\})|(\\{d59a7294-6c08-4ad5-ba6d-a3bc41851de5\\})|(\\{d145aa5b-6e66-40cb-8a08-d55a53fc7058\\})|(\\{d79962e3-4511-4c44-8a40-aed6d32a53b1\\})|(\\{e3e2a47e-7295-426f-8517-e72c31da3f23\\})|(\\{e6348f01-841d-419f-8298-93d6adb0b022\\})|(\\{eb6f8a22-d96e-4727-9167-be68c7d0a7e9\\})|(\\{fdd72dfe-e10b-468b-8508-4de34f4e95e3\\}))$/","prefs":[],"schema":1535830899087,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1487472","why":"Several add-ons that change forcefully override search settings.","name":"Various malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"43f11241-88e3-4139-9f02-ac39489a241f","last_modified":1535990735167},{"guid":"/^((\\{35253b0b-8109-437f-b8fa-d7e690d3bde1\\})|(\\{0c8d774c-0447-11e7-a3b1-1b43e3911f03\\})|(\\{c11f85de-0bf8-11e7-9dcd-83433cae2e8e\\})|(\\{f9f072c8-5357-11e7-bb4c-c37ea2335fb4\\})|(\\{b6d09408-a35e-11e7-bc48-f3e9438e081e\\}))$/","prefs":[],"schema":1535658090284,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1486754","why":"Add-ons that execute remote malicious code.","name":"Several malicious add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"56bd2f99-57eb-4904-840a-23ca155d93ad","last_modified":1535701073599},{"guid":"/^((fireAnalytics\\.download@mozilla\\.com)|(fireabsorb@mozilla\\.com)|(fireaccent@mozilla\\.com)|(fireaccept@mozilla\\.com)|(fireads@mozilla\\.com)|(firealerts@mozilla\\.com)|(fireapi@mozilla\\.com)|(fireapp@mozilla\\.com)|(fireattribution@mozilla\\.com)|(fireauthenticator@mozilla\\.com)|(firecalendar@mozilla\\.com)|(firemail@mozilla\\.com)|(firemarketplace@mozilla\\.com)|(firequestions@mozilla\\.com)|(firescript@mozilla\\.com)|(firesheets@mozilla\\.com)|(firespam@mozilla\\.com)|(firesuite@mozilla\\.com)|(\\{3b6dfc8f-e8ed-4b4c-b616-bdc8c526ac1d\\})|(\\{834f87db-0ff7-4518-89a0-0167a963a869\\})|(\\{4921fe4d-fbe6-4806-8eed-346d7aff7c75\\})|(\\{07809949-bd7d-40a6-a17b-19807448f77d\\})|(\\{68968617-cc8b-4c25-9c38-34646cdbe43e\\})|(\\{b8b2c0e1-f85d-4acd-aeb1-b6308a473874\\})|(\\{bc0b3499-f772-468e-9de6-b4aaf65d2bbb\\}))$/","prefs":[],"schema":1535555549913,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1486636","why":"Add-ons that hijack search settings.","name":"Various malicious add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fcd12629-43df-4751-9654-7cc008f8f7c0","last_modified":1535555562143},{"guid":"/^((\\{25211004-63e4-4a94-9c71-bdfeabb72bfe\\})|(\\{cbf23b92-ea55-4ca9-a5ae-f4197e286bc8\\})|(\\{7ac0550e-19cb-4d22-be12-b0b352144b33\\})|(Mada111@mozilla\\.com)|(\\{c71709a9-af59-4958-a587-646c8c314c16\\})|(\\{6ac3f3b4-18db-4f69-a210-7babefd94b1e\\})|(addon@fastsearch\\.me)|(\\{53d152fa-0ae0-47f1-97bf-c97ca3051562\\})|(\\{f9071611-24ee-472b-b106-f5e2f40bbe54\\})|(\\{972920f1-3bfd-4e99-b605-8688a94c3c85\\})|(\\{985afe98-fa74-4932-8026-4bdc880552ac\\})|(\\{d96a82f5-5d3e-46ed-945f-7c62c20b7644\\})|(\\{3a036dc5-c13b-499a-a62d-e18aab59d485\\})|(\\{49574957-56c6-4477-87f1-1ac7fa1b2299\\})|(\\{097006e8-9a95-4f7c-9c2f-59f20c61771c\\})|(\\{8619885d-0380-467a-b3fe-92a115299c32\\})|(\\{aa0587d6-4760-4abe-b3a1-2a5958f46775\\})|(\\{bdada7ae-cf89-46cf-b1fe-f3681f596278\\})|(\\{649bead3-df51-4023-8090-02ceb2f7095a\\})|(\\{097c3142-0b68-416a-9919-9dd576aedc17\\})|(\\{bc3cced8-51f0-4519-89ee-56706b67ea4b\\})|(\\{796da6e3-01c0-4c63-96dd-1737710b2ff6\\}))$/","prefs":[],"schema":1535485297866,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1487083","why":"Add-ons that hijack search settings and contain other unwanted features.","name":"Vairous malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"016676cc-c381-4c01-adcf-2d46f48142d0","last_modified":1535550828514},{"guid":"/^((Timemetric@tmetric)|(image-fastpicker@eight04.blogspot\\.com)|(textMarkertool@underFlyingBirches\\.org)|(youpanel@jetpack)|({0ff32ce0-dee9-4e7e-9260-65e58373e21d})|({4ca00873-7e8d-4ada-b460-96cad0eb8fa9})|({6b427f73-2ee1-4256-b69d-7dc253ebe030})|({6f13489d-b274-45b6-80fa-e9daa140e1a4})|({40a9d23b-09ef-4c82-ae1d-7fc5c067e987})|({205c2185-ebe4-4106-92ab-0ffa7c4efcbb})|({256ec7b0-57b4-416d-91c1-2bfdf01b2438})|({568db771-c718-4587-bcd0-e3728ee53550})|({5782a0f1-de26-42e5-a5b3-dae9ec05221b})|({9077390b-89a9-41ad-998f-ab973e37f26f})|({8e7269ac-a171-4d9f-9c0a-c504848fd52f})|({3e6586e2-7410-4f10-bba0-914abfc3a0b4})|({b3f06312-93c7-4a4f-a78b-f5defc185d8f})|({c1aee371-4401-4bab-937a-ceb15c2323c1})|({c579191c-6bb8-4795-adca-d1bf180b512d})|({d0aa0ad2-15ed-4415-8ef5-723f303c2a67})|({d8157e0c-bf39-42eb-a0c3-051ff9724a8c})|({e2a4966f-919d-4afc-a94f-5bd6e0606711})|({ee97f92d-1bfe-4e9d-816c-0dfcd63a6206}))$/","prefs":[],"schema":1535356061028,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1485145","why":"Add-ons that run remote malicious code from websites that trick the user into installing the add-on.","name":"Malware running remote malicious code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a0d44ee3-9492-47d7-ac1c-35f520e819ae","last_modified":1535393877555},{"guid":"/^((fastplayer@fastsearch\\.me)|(ff-search-flash-unlisted@mozilla\\.com)|(inspiratiooo-unlisted@mozilla\\.com)|(lite-search-ff-unlisted@mozilla\\.com)|(mysearchprotect-unlisted@mozilla\\.com)|(pdfconverter-unlisted@mozilla\\.com)|(plugin-search-ff-unlisted@mozilla\\.com)|(pro-search-ff-unlisted@mozilla\\.com)|(pro-search-unlisted@mozilla\\.com)|(searchincognito-unlisted@mozilla\\.com)|(socopoco-search@mozilla\\.com)|(socopoco-unlisted@mozilla\\.com)|(\\{08ea1e08-e237-42e7-ad60-811398c21d58\\})|(\\{0a56e2a0-a374-48b6-9afc-976680fab110\\})|(\\{193b040d-2a00-4406-b9ae-e0d345b53201\\})|(\\{1ffa2e79-7cd4-4fbf-8034-20bcb3463d20\\})|(\\{528cbbe2-3cde-4331-9344-e348cb310783\\})|(\\{6f7c2a42-515a-4797-b615-eaa9d78e8c80\\})|(\\{be2a3fba-7ea2-48b9-bbae-dffa7ae45ef8\\})|(\\{c0231a6b-c8c8-4453-abc9-c4a999a863bd\\}))$/","prefs":[],"schema":1535139689975,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483854","why":"Add-ons overwriting search changes without consent and remote script injection","name":"\"Flash Updater\" and search redirectors"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"46779b5a-2369-4007-bff0-857a657626ba","last_modified":1535153064735},{"guid":"/^(({aeac6f90-5e17-46fe-8e81-9007264b907d})|({6ee25421-1bd5-4f0c-9924-79eb29a8889d})|({b317fa11-c23d-45b9-9fd8-9df41a094525})|({16ac3e8f-507a-4e04-966b-0247a196c0b4}))$/","prefs":[],"schema":1534946831027,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1485609","why":"Add-ons that take away user control by changing search settings.","name":"Search hijacking malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ab029019-0e93-450a-8c11-ac31556c2a77","last_modified":1535020847820},{"guid":"@testpilot-addon","prefs":[],"schema":1534876689555,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1485083","why":"Older versions of the TestPilot add-on cause stability issues in Firefox.","name":"Testpilot (old, broken versions)"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"2.0.8-dev-259fe19","minVersion":"0"}],"id":"ee2d12a4-ea1d-4f3d-9df1-4303e8993f18","last_modified":1534946810180},{"guid":"/^((@svuznnqyxinw)|(myprivacytools@besttools\\.com)|(powertools@penprivacy\\.com)|(privacypro@mybestprivacy\\.com)|(realsecure@top10\\.com)|(rlbvpdfrlbgx@scoutee\\.net)|(vfjkurlfijwz@scoutee\\.net))$/","prefs":[],"schema":1534382102271,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1482322","why":"Add-ons that change the default search engine, taking away user control.","name":"Search hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"df852b6a-28be-4b10-9285-869f4761f111","last_modified":1534382538298},{"guid":"/^(({1a3fb414-0945-405c-a62a-9fe5e1a50c69})|({1a45f6aa-d80a-4317-84d2-0ce43671b08a})|({2d52a462-8bec-4708-9cd1-894b682bdc78})|({3f841cfc-de5a-421f-8bd7-2bf1d943b02a})|({5c7601bf-522b-47e5-b0f0-ea0e706af443})|({7ebe580f-71c9-4ef8-8073-f38deaeb9dfb})|({8b2188fd-1daf-4851-b387-28d964014353})|({8cee42ac-f1fe-40ae-aed6-24e3b76b2f77})|({8d13c4a9-5e8c-47a6-b583-681c83164ac9})|({9b1d775a-1877-45c9-ad48-d6fcfa4fff39})|({9efdbe5f-6e51-4a35-a41b-71dc939e6221})|({23f63efb-156e-440b-a96c-118bebc21057})|({026dfc8c-ecc8-41ba-b45f-70ffbd5cc672})|({34aa433c-27e9-4c87-a662-9f82f99eb9af})|({36f34d69-f22f-47c3-b4cd-4f37b7676107})|({39bd8607-0af4-4d6b-bd69-9a63c1825d3c})|({48c6ad6d-297c-4074-8fef-ca5f07683859})|({54aa688d-9504-481d-ba75-cfee421b98e0})|({59f59748-e6a8-4b41-87b5-9baadd75ddef})|({61d99407-1231-4edc-acc8-ab96cbbcf151})|({68ca8e3a-397a-4135-a3af-b6e4068a1eae})|({71beafd6-779b-4b7d-a78b-18a107277b59})|({83ed90f8-b07e-4c45-ba6b-ba2fe12cebb6})|({231dfb44-98e0-4bc4-b6ee-1dac4a836b08})|({273f0bce-33f4-45f6-ae03-df67df3864c2})|({392f4252-c731-4715-9f8d-d5815f766abb})|({484ec5d0-4cfd-4d96-88d0-a349bfc33780})|({569dbf47-cc10-41c4-8fd5-5f6cf4a833c7})|({578cad7a-57d5-404d-8dda-4d30de33b0c2})|({986b2c3f-e335-4b39-b3ad-46caf809d3aa})|({1091c11f-5983-410e-a715-0968754cff54})|({2330eb8a-e3fe-4b2e-9f17-9ddbfb96e6f5})|({5920b042-0af1-4658-97c1-602315d3b93d})|({6331a47f-8aae-490c-a9ad-eae786b4349f})|({6698b988-c3ef-4e1f-8740-08d52719eab5})|({30516f71-88d4-489b-a27f-d00a63ad459f})|({12089699-5570-4bf6-890f-07e7f674aa6e})|({84887738-92bf-4903-a5e8-695fd078c657})|({8562e48e-3723-412a-9ebd-b33d3d3b29dd})|({6e449795-c545-41be-92c0-5d467c147389})|({1e369c7c-6b61-436e-8978-4640687670d6})|({a03d427a-bd2e-42b6-828f-a57f38fac7b5})|({a77fc9b9-6ebb-418d-b0b6-86311c191158})|({a368025b-9828-43a1-8a5c-f6fab61c9be9})|({b1908b02-410d-4778-8856-7e259fbf471d})|({b9425ace-c2e9-4ec4-b564-4062546f4eca})|({b9845b5d-70c9-419c-a9a5-98ea8ee5cc01})|({ba99fee7-9806-4e32-8257-a33ffc3b8539})|({bdf8767d-ae4c-4d45-8f95-0ba29b910600})|({c6c4a718-cf91-4648-aa9b-170d66163cf2})|({ca0f2988-e1a8-4e83-afde-0dca56a17d5f})|({cac5db09-979b-40e3-8c8e-d96397b0eecb})|({d3b5280b-f8d8-4669-bdf6-91f23ae58042})|({d73d2f6a-ea24-4b1b-8c76-563fce9f786d})|({d77fed37-85c0-4b94-89bb-0d2849472b8d})|({d371abec-84bb-481b-acbf-235639451127})|({de47a3b4-dad1-4f4a-bdd6-8666586e29e8})|({ded6afad-2aaa-446b-b6bd-b12a8a61c945})|({e0c3a1ca-8e21-4d1b-b53b-ea115cf59172})|({e6bbf496-6489-4b48-8e5a-799aad4aa742})|({e63b262a-f9b8-4496-9c4b-9d3cbd6aea90})|({e73c1b5d-20f7-4d86-ad16-9de3c27718e2})|({eb01dc49-688f-4a21-aa8d-49bd88a8f319})|({edc9816b-60b4-493c-a090-01125e0b8018})|({effa2f97-0f07-44c8-99cb-32ac760a0621})|({f6e6fd9b-b89f-4e8d-9257-01405bc139a6})|({ff87977a-fefb-4a9d-b703-4b73dce8853d})|({ffea9e62-e516-4238-88a7-d6f9346f4955}))$/","prefs":[],"schema":1534335096640,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483191","why":"Add-ons that change the default search engine, taking away user control.","name":"Search hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d9892a76-b22e-40bd-8073-89b0f8110ec7","last_modified":1534336165428},{"guid":"/^((Timemetric@tmetric)|(textMarkertool@underFlyingBirches\\.org)|(youpanel@jetpack)|({6f13489d-b274-45b6-80fa-e9daa140e1a4})|({568db771-c718-4587-bcd0-e3728ee53550})|({829827cd-03be-4fed-af96-dd5997806fb4})|({9077390b-89a9-41ad-998f-ab973e37f26f})|({8e7269ac-a171-4d9f-9c0a-c504848fd52f})|({aaaffe20-3306-4c64-9fe5-66986ebb248e})|({bf153de7-cdf2-4554-af46-29dabfb2aa2d})|({c579191c-6bb8-4795-adca-d1bf180b512d})|({e2a4966f-919d-4afc-a94f-5bd6e0606711})|({ee97f92d-1bfe-4e9d-816c-0dfcd63a6206}))$/","prefs":[],"schema":1534275699570,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483206","why":"Add-ons that execute malicious remote code","name":"Various malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2734325e-143b-4962-98bf-4b18c77407e2","last_modified":1534334500118},{"guid":"{5834f62d-6164-4cdd-a0a3-c00c66ec9d13}","prefs":[],"schema":1532704368947,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479002","why":"This add-on violates our security and user-choice/no surprises policies.","name":"Youtube Dark Mode (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d0a401cb-0c70-4784-8288-b06a88b2ae8a","last_modified":1532705151926},{"guid":"/^((@asdfjhsdfuhw)|(@asdfsdfwe)|(@asdieieuss)|(@dghfghfgh)|(@difherk)|(@dsfgtftgjhrdf4)|(@fidfueir)|(@fsgergsdqtyy)|(@hjconsnfes)|(@isdifvdkf)|(@iweruewir)|(@oiboijdjfj)|(@safesearchavs)|(@safesearchavsext)|(@safesearchincognito)|(@safesearchscoutee)|(@sdfykhhhfg)|(@sdiosuff)|(@sdklsajd)|(@sduixcjksd)|(@sicognitores)|(@simtabtest)|(@sodiasudi)|(@test13)|(@test131)|(@test131ver)|(@test132)|(@test13s)|(@testmptys)|(\\{ac4e5b0c-13c4-4bfd-a0c3-1e73c81e8bac\\})|(\\{e78785c3-ec49-44d2-8aac-9ec7293f4a8f\\})|(general@filecheckerapp\\.com)|(general@safesearch\\.net))$/","prefs":[],"schema":1532703832328,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1475330","why":"These Add-ons violate our data collection, no surprises and user-choice policies.","name":"Safesearch (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d664412d-ed08-4892-b247-b007a70856ff","last_modified":1532704364007},{"guid":"{dd3d7613-0246-469d-bc65-2a3cc1668adc}","prefs":[],"schema":1532684052432,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1478731","why":"This add-on violates data practices outlined in the review policy.","name":"BlockSite"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"4.0.3","minVersion":"0"}],"id":"e04f98b5-4480-43a3-881d-e509e4e28cdc","last_modified":1532684085999},{"guid":"{bee8b1f2-823a-424c-959c-f8f76c8b2306}","prefs":[],"schema":1532547689407,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1478731","why":"This add-on violates data practices outlined in the review policy.","name":"Popup blocker for FireFox"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"4.0.7.3","minVersion":"0"}],"id":"f0713a5e-7208-484e-b3a0-4e6dc6a195be","last_modified":1532684052426},{"guid":"/^((\\{39bd8607-0af4-4d6b-bd69-9a63c1825d3c\\})|(\\{273f0bce-33f4-45f6-ae03-df67df3864c2\\})|(\\{a77fc9b9-6ebb-418d-b0b6-86311c191158\\})|(\\{c6c4a718-cf91-4648-aa9b-170d66163cf2\\})|(\\{d371abec-84bb-481b-acbf-235639451127\\})|(\\{e63b262a-f9b8-4496-9c4b-9d3cbd6aea90\\}))$/","prefs":[],"schema":1532386339902,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1477950","why":"Add-ons that contain malicious functionality like search engine redirect.","name":"Smash (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c37c7c24-e738-4d06-888c-108b4d63b428","last_modified":1532424286908},{"guid":"/^((\\{ac296b47-7c03-486f-a1d6-c48b24419749\\})|(\\{1cab8ccf-deff-4743-925d-a47cbd0a6b56\\})|(\\{5da81d3d-5db1-432a-affc-4a2fe9a70749\\})|(\\{071b9878-a7d3-4ae3-8ef0-2eaee1923403\\})|(\\{261476ea-bd0e-477c-abd7-33cdf626f81f\\})|(\\{224e66d0-6b11-4c4b-9bcf-41180889898a\\})|(\\{1e90cf52-c67c-4bd9-80c3-a2bf521fc981\\})|(\\{09c4799c-00f1-439e-9e60-3827c589b372\\})|(\\{d3d2095a-9faa-466f-82ae-3114179b34d6\\})|(\\{70389ea5-7e4d-4515-835c-fbd047f229dd\\})|(\\{2e8083a5-cd88-4aaa-bb8b-e54e9753f280\\})|(\\{fbf2480b-5c19-478e-bfd0-192ad9f84dc9\\})|(\\{6c7dc694-89f8-477e-88d5-c55af4d6a846\\})|(\\{915c12c6-901a-490d-9bfc-20f00d1ad31d\\})|(\\{d3a4aa3e-f74c-4382-876d-825f592f2976\\})|(\\{0ad91ec1-f7c4-4a39-9244-3310e9fdd169\\})|(\\{9c17aa27-63c5-470a-a678-dc899ab67ed3\\})|(\\{c65efef2-9988-48db-9e0a-9ff8164182b6\\})|(\\{d54c5d25-2d51-446d-8d14-18d859e3e89a\\})|(\\{e458f1f1-a331-4486-b157-81cba19f0993\\})|(\\{d2de7e1f-6e51-41d6-ba8a-937f8a5c92ff\\})|(\\{2b08a649-9bea-4dd4-91c8-f53a84d38e19\\})|(\\{312dd57e-a590-4e19-9b26-90e308cfb103\\})|(\\{82ce595a-f9b6-4db8-9c97-b1f1c933418b\\})|(\\{0a2e64f0-ea5a-4fff-902d-530732308d8e\\})|(\\{5fbdc975-17ab-4b4e-90d7-9a64fd832a08\\})|(\\{28820707-54d8-41f0-93e9-a36ffb2a1da6\\})|(\\{64a2aed1-5dcf-4f2b-aad6-9717d23779ec\\})|(\\{ee54794f-cd16-4f7d-a7dd-515a36086f60\\})|(\\{4d381160-b2d5-4718-9a05-fc54d4b307e7\\})|(\\{60393e0e-f039-4b80-bad4-10189053c2ab\\})|(\\{0997b7b2-52d7-4d14-9aa6-d820b2e26310\\})|(\\{8214cbd6-d008-4d16-9381-3ef1e1415665\\})|(\\{6dec3d8d-0527-49a3-8f12-b05f2a8b95b2\\})|(\\{0c0d8d8f-3ae0-4c98-81ac-06453a316d16\\})|(\\{84d5ef02-a283-484a-80da-7087836c74aa\\})|(\\{24413756-2c44-47c5-8bbf-160cb37776d8\\})|(\\{cf6ac458-06e8-45d0-9cbf-ec7fc0eb1710\\})|(\\{263a5792-933a-4de1-820a-d04198e17120\\})|(\\{b5fd7f37-190d-4c0a-b8dd-8b4850c986ac\\})|(\\{cb5ef07b-c2e7-47a6-be81-2ceff8df4dd5\\})|(\\{311b20bc-b498-493c-a5e1-22ec32b0e83c\\})|(\\{b308aead-8bc1-4f37-9324-834b49903df7\\})|(\\{3a26e767-b781-4e21-aaf8-ac813d9edc9f\\}))$/","prefs":[],"schema":1532361925873,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1476553","why":"Third-party websites try to trick users into installing add-ons that inject remote scripts.","name":"Various malicious add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"52842139-3d11-41ac-9d7f-8e51122a3141","last_modified":1532372344457},{"guid":"{46551EC9-40F0-4e47-8E18-8E5CF550CFB8}","prefs":[],"schema":1530711142817,"blockID":"i1900","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1472948","why":"This add-on violates data practices outlined in the review policy.","name":"Stylish"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.1.1","minVersion":"3.0.0"}],"id":"c635229f-7aa0-44c5-914f-80c590949071","last_modified":1530716488758},{"guid":"/^(contactus@unzipper.com|{72dcff4e-48ce-41d8-a807-823adadbe0c9}|{dc7d2ecc-9cc3-40d7-93ed-ef6f3219bd6f}|{994db3d3-ccfe-449a-81e4-f95e2da76843}|{25aef460-43d5-4bd0-aa3d-0a46a41400e6}|{178e750c-ae27-4868-a229-04951dac57f7})$/","prefs":[],"schema":1528400492025,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1460331","why":"Add-ons change search settings against our policies, affecting core Firefox features. Add-on is also reportedly installed without user consent.","name":"SearchWeb"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5afea853-d029-43f3-a387-64ce9980742a","last_modified":1528408770328},{"guid":"{38363d75-6591-4e8b-bf01-0270623d1b6c}","prefs":[],"schema":1526326889114,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1461625","why":"This add-on contains abusive functionality.","name":"Photobucket Hotlink Fix"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0f0764d5-a290-428b-a5b2-3767e1d72c71","last_modified":1526381862851},{"guid":"@vkmad","prefs":[],"schema":1526154098016,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1461410","why":"This add-on includes malicious functionality.","name":"VK Universal Downloader (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cbfa5303-c1bf-49c8-87d8-259738a20064","last_modified":1526322954850},{"guid":"/((@extcorp\\.[a-z]+)|(@brcorporation\\.com)|(@brmodcorp\\.com)|(@teset\\.com)|(@modext\\.tech)|(@ext?mod\\.net)|(@browcorporation\\.org)|(@omegacorporation\\.org)|(@browmodule\\.com)|(@corpext\\.net)|({6b50ddac-f5e0-4d9e-945b-e4165bfea5d6})|({fab6484f-b8a7-4ba9-a041-0f948518b80c})|({b797035a-7f29-4ff5-bd19-77f1b5e464b1})|({0f612416-5c5a-4ec8-b482-eb546af9cac4}))$/","prefs":[],"schema":1525290095999,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1458330","why":"These are malicious add-ons that inject remote scripts and use deceptive names.","name":"\"Table\" add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3ab9f100-e253-4080-b3e5-652f842ddb7a","last_modified":1525377099954},{"guid":"/^({b99ae7b1-aabb-4674-ba8f-14ed32d04e76})|({dfa77d38-f67b-4c41-80d5-96470d804d09})$/","prefs":[],"schema":1524146566650,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1455291","why":"These add-ons claim to be the flash plugin.","name":"Flash Plugin (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"96b137e6-8cb5-44d6-9a34-4a4a76fb5e38","last_modified":1524147337556},{"guid":"/^({6ecb9f49-90f0-43a1-8f8a-e809ea4f732b})|(@googledashboard)|(@smashdashboard)|(@smash_tv)|(@smash_mov)|(@smashmovs)|(@smashtvs)|(@FirefoxUpdate)|({92b9e511-ac81-4d47-9b8f-f92dc872447e})|({3c841114-da8c-44ea-8303-78264edfe60b})|({116a0754-20eb-4fe5-bd35-575867a0b89e})|({6e6ff0fd-4ae4-49ae-ac0c-e2527e12359b})|({f992ac88-79d3-4960-870e-92c342ed3491})|({6ecb9f49-90f0-43a1-8f8a-e809ea4f732b})|({a512297e-4d3a-468c-bd1a-f77bd093f925})|({08c28c16-9fb6-4b32-9868-db37c1668f94})|({b4ab1a1d-e137-4c59-94d5-4f509358a81d})|({feedf4f8-08c1-451f-a717-f08233a64ec9})$/","prefs":[],"schema":1524139371832,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1454691","why":"This malware prevents itself from getting uninstalled ","name":"Malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"feb2d0d7-1b76-4dba-bf84-42873a92af5f","last_modified":1524141477640},{"guid":"{872f20ea-196e-4d11-8835-1cc4c877b1b8}","prefs":[],"schema":1523734896380,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1454413","why":"Extension claims to be Flash Player","name":"Flash Player (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1e5f5cb2-346c-422a-9aaa-29d8760949d2","last_modified":1523897202689},{"guid":"adbeaver@adbeaver.org","prefs":[],"schema":1521630548030,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1445031","why":"This add-on generates numerous errors when loading Facebook, caused by ad injection included in it. Users who want to continue using this add-on can enable it in the Add-ons Manager.","name":"AdBeaver"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0"}],"id":"baf7f735-d6b6-410a-8cc8-25c60f7c57e2","last_modified":1522103097333},{"guid":"{44685ba6-68b3-4895-879e-4efa29dfb578}","prefs":[],"schema":1521565140013,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1447042","why":"This add-on impersonates a Flash tool and runs remote code on users' systems.","name":"FF Flash Manager"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"547037f2-97ae-435a-863c-efd7532668cd","last_modified":1521630548023},{"guid":"/^(addon@fasterweb\\.com|\\{5f398d3f-25db-47f5-b422-aa2364ff6c0b\\}|addon@fasterp\\.com|addon@calculator)$/","prefs":[],"schema":1520338910918,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1443478","why":"These are malicious add-ons that use deceptive names and run remote scripts.","name":"FasterWeb add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f58729ec-f93c-41d9-870d-dd9c9fd811b6","last_modified":1520358450708},{"guid":"{42baa93e-0cff-4289-b79e-6ae88df668c4}","prefs":[],"schema":1520336325565,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1443196","why":"The add-on claims to be \"Adobe Shockwave Flash Player\"","name":"Adobe Shockwave Flash Player (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0cd723fe-d33d-43a0-b84f-7a3cad253212","last_modified":1520338780397},{"guid":"{f3c31b34-862c-4bc8-a98f-910cc6314a86}","prefs":[],"schema":1519242096699,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1440736","why":"This is a malicious add-on that is masked as an official Adobe Updater and runs malicious code.","name":"Adobe Updater (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"adfd98ef-cebc-406b-b1e0-61bd4c71e4b1","last_modified":1519409417397},{"guid":"/^(\\{fd0c36fa-6a29-4246-810b-0bb4800019cb\\}|\\{b9c1e5bf-6585-4766-93fc-26313ac59999\\}|\\{3de25fff-25e8-40e9-9ad9-fdb3b38bb2f4\\})$/","prefs":[],"schema":1519069296530,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1439432","why":"These are malicious add-ons that are masked as an official Adobe Updater and run malicious code.","name":"Adobe Updater"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4e28ba5c-af62-4e53-a7a1-d33334571cf8","last_modified":1519078890592},{"guid":"/^(\\{01c9a4a4-06dd-426b-9500-2ea6fe841b88\\}|{5e024309-042c-4b9d-a634-5d92cf9c7514\\}|{f4262989-6de0-4604-918f-663b85fad605\\}|{e341ed12-a703-47fe-b8dd-5948c38070e4\\}|{cd89045b-2e06-46bb-9e34-48e8799e5ef2\\}|{ac296b47-7c03-486f-a1d6-c48b24419749\\}|{5da81d3d-5db1-432a-affc-4a2fe9a70749\\}|{df09f268-3c92-49db-8c31-6a25a6643896\\}|{81ac42f3-3d17-4cff-85af-8b7f89c8826b\\}|{09c8fa16-4eec-4f78-b19d-9b24b1b57e1e\\}|{71639610-9cc3-47e0-86ed-d5b99eaa41d5\\}|{83d38ac3-121b-4f28-bf9c-1220bd3c643b\\}|{7f8bc48d-1c7c-41a0-8534-54adc079338f\\})$/","prefs":[],"schema":1518550894975,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1438028","why":"These are malicious add-ons that inject remote scripts into popular websites.","name":"Page Marker add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cc5848e8-23d5-4655-b45c-dc239839b74e","last_modified":1518640450735},{"guid":"/^(https|youtube)@vietbacsecurity\\.com$/","prefs":[],"schema":1517909997354,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1435974","why":"These add-ons contain malicious functionality, violating the users privacy and security.","name":"HTTPS and Youtube downloader (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"646e2384-f894-41bf-b7fc-8879e0095109","last_modified":1517910100624},{"guid":"{ed352072-ddf0-4cb4-9cb6-d8aa3741c2de}","prefs":[],"schema":1517514097126,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1434893","why":"This is a malicious add-on that injects remote scripts into popular pages while pretending to do something else.","name":"Image previewer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2104a522-bb2f-4b04-ad0d-b0c571644552","last_modified":1517577111194},{"guid":"/^({be5d0c88-571b-4d01-a27a-cc2d2b75868c})|({3908d078-e1db-40bf-9567-5845aa77b833})|({5b620343-cd69-49b8-a7ba-f9d499ee5d3d})|({6eee2d17-f932-4a43-a254-9e2223be8f32})|({e05ba06a-6d6a-4c51-b8fc-60b461ffecaf})|({a5808da1-5b4f-42f2-b030-161fd11a36f7})|({d355bee9-07f0-47d3-8de6-59b8eecba57b})|({a1f8e136-bce5-4fd3-9ed1-f260703a5582})$/","prefs":[],"schema":1517260691761,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.\n","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"70f37cc7-9f8a-4d0f-a881-f0c56934fa75","last_modified":1517260722621},{"guid":"/^({d78d27f4-9716-4f13-a8b6-842c455d6a46})|({bd5ba448-b096-4bd0-9582-eb7a5c9c0948})|({0b24cf69-02b8-407d-83db-e7af04fc1f3e})|({e08d85c5-4c0f-4ce3-9194-760187ce93ba})|({1c7d6d9e-325a-4260-8213-82d51277fc31})|({8a0699a0-09c3-4cf1-b38d-fec25441650c})|({1e68848a-2bb7-425c-81a2-524ab93763eb})$/","prefs":[],"schema":1517168490224,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"805ee80e-0929-4c92-93ed-062b98053f28","last_modified":1517260691755},{"guid":"/^({abec23c3-478f-4a5b-8a38-68ccd500ec42}|{a83c1cbb-7a41-41e7-a2ae-58efcb4dc2e4}|{62237447-e365-487e-8fc3-64ddf37bdaed}|{b12cfdc7-3c69-43cb-a3fb-38981b68a087}|{1a927d5b-42e7-4407-828a-fdc441d0daae}|{dd1cb0ec-be2a-432b-9c90-d64c824ac371}|{82c8ced2-e08c-4d6c-a12b-3e8227d7fc2a}|{87c552f9-7dbb-421b-8deb-571d4a2d7a21})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c92f2a05-73eb-454e-9583-f6d2382d8bca","last_modified":1516829074251},{"guid":"/^({618baeb9-e694-4c7b-9328-69f35b6a8839}|{b91fcda4-88b0-4a10-9015-9365e5340563}|{04150f98-2d7c-4ae2-8979-f5baa198a577}|{4b1050c6-9139-4126-9331-30a836e75db9}|{1e6f5a54-2c4f-4597-aa9e-3e278c617d38}|{e73854da-9503-423b-ab27-fafea2fbf443}|{a2427e23-d349-4b25-b5b8-46960b218079}|{f92c1155-97b3-40f4-9d5b-7efa897524bb}|{c8e14311-4b2d-4eb0-9a6b-062c6912f50e}|{45621564-b408-4c29-8515-4cf1f26e4bc3}|{27380afd-f42a-4c25-b57d-b9012e0d5d48})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2d4fe65b-6c02-4461-baa8-dda52e688cf6","last_modified":1516829040469},{"guid":"/^({4dac7c77-e117-4cae-a9f0-6bd89e9e26ab}|{cc689da4-203f-4a0c-a7a6-a00a5abe74c5}|{0eb4672d-58a6-4230-b74c-50ca3716c4b0}|{06a71249-ef35-4f61-b2c8-85c3c6ee5617}|{5280684d-f769-43c9-8eaa-fb04f7de9199}|{c2341a34-a3a0-4234-90cf-74df1db0aa49}|{85e31e7e-3e3a-42d3-9b7b-0a2ff1818b33}|{b5a35d05-fa28-41b5-ae22-db1665f93f6b}|{1bd8ba17-b3ed-412e-88db-35bc4d8771d7}|{a18087bb-4980-4349-898c-ca1b7a0e59cd}|{488e190b-d1f6-4de8-bffb-0c90cc805b62})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9a3fd797-0ab8-4286-9a1b-2b6c97f9075b","last_modified":1516829006347},{"guid":"/^({f6df4ef7-14bd-43b5-90c9-7bd02943789c}|{ccb7b5d6-a567-40a2-9686-a097a8b583dd}|{9b8df895-fcdd-452a-8c46-da5be345b5bc}|{5cf77367-b141-4ba4-ac2a-5b2ca3728e81}|{ada56fe6-f6df-4517-9ed0-b301686a34cc}|{95c7ae97-c87e-4827-a2b7-7b9934d7d642}|{e7b978ae-ffc2-4998-a99d-0f4e2f24da82}|{115a8321-4414-4f4c-aee6-9f812121b446}|{bf153de7-cdf2-4554-af46-29dabfb2aa2d}|{179710ba-0561-4551-8e8d-1809422cb09f}|{9d592fd5-e655-461a-9b28-9eba85d4c97f})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aae78cd5-6b26-472e-ab2d-db4105911250","last_modified":1516828973824},{"guid":"/^({30972e0a-f613-4c46-8c87-2e59878e7180}|{0599211f-6314-4bf9-854b-84cb18da97f8}|{4414af84-1e1f-449b-ac85-b79f812eb69b}|{2a8bec00-0ab0-4b4d-bd3d-4f59eada8fd8}|{bea8866f-01f8-49e9-92cd-61e96c05d288}|{046258c9-75c5-429d-8d5b-386cfbadc39d}|{c5d359ff-ae01-4f67-a4f7-bf234b5afd6e}|{fdc0601f-1fbb-40a5-84e1-8bbe96b22502}|{85349ea6-2b5d-496a-9379-d4be82c2c13d}|{640c40e5-a881-4d16-a4d0-6aa788399dd2}|{d42328e1-9749-46ba-b35c-cce85ddd4ace})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"750aa293-3742-46b5-8761-51536afecaef","last_modified":1516828938683},{"guid":"/^({d03b6b0f-4d44-4666-a6d6-f16ad9483593}|{767d394a-aa77-40c9-9365-c1916b4a2f84}|{a0ce2605-b5fc-4265-aa65-863354e85058}|{b7f366fa-6c66-46bf-8df2-797c5e52859f}|{4ad16913-e5cb-4292-974c-d557ef5ec5bb}|{3c3ef2a3-0440-4e77-9e3c-1ca8d48f895c}|{543f7503-3620-4f41-8f9e-c258fdff07e9}|{98363f8b-d070-47b6-acc6-65b80acac4f3}|{5af74f5a-652b-4b83-a2a9-f3d21c3c0010}|{484e0ba4-a20b-4404-bb1b-b93473782ae0}|{b99847d6-c932-4b52-9650-af83c9dae649})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a29aed6f-6546-4fa2-8131-df5c9a5427af","last_modified":1516828911059},{"guid":"/^({2bb68b03-b528-4133-9fc4-4980fbb4e449}|{231e58ac-0f3c-460b-bb08-0e589360bec7}|{a506c5af-0f95-4107-86f8-3de05e2794c9}|{8886a262-1c25-490b-b797-2e750dd9f36b}|{65072bef-041f-492e-8a51-acca2aaeac70}|{6fa41039-572b-44a4-acd4-01fdaebf608d}|{87ba49bd-daba-4071-aedf-4f32a7e63dbe}|{95d58338-ba6a-40c8-93fd-05a34731dc0e}|{4cbef3f0-4205-4165-8871-2844f9737602}|{1855d130-4893-4c79-b4aa-cbdf6fee86d3}|{87dcb9bf-3a3e-4b93-9c85-ba750a55831a})$/","prefs":[],"schema":1516822896448,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5c092b0d-7205-43a1-aa75-b7a42372fb52","last_modified":1516828883523},{"guid":"/^({fce89242-66d3-4946-9ed0-e66078f172fc})|({0c4df994-4f4a-4646-ae5d-8936be8a4188})|({6cee30bc-a27c-43ea-ac72-302862db62b2})|({e08ebf0b-431d-4ed1-88bb-02e5db8b9443})$/","prefs":[],"schema":1516650096284,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1432560","why":"These are malicious add-ons that make it hard for the user to be removed.","name":"FF AntiVir Monitoring"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9dfeee42-e6a8-49e0-8979-0648f7368239","last_modified":1516744119329},{"guid":"/^(\\{1490068c-d8b7-4bd2-9621-a648942b312c\\})|(\\{d47ebc8a-c1ea-4a42-9ca3-f723fff034bd\\})|(\\{83d6f65c-7fc0-47d0-9864-a488bfcaa376\\})|(\\{e804fa4c-08e0-4dae-a237-8680074eba07\\})|(\\{ea618d26-780e-4f0f-91fd-2a6911064204\\})|(\\{ce93dcc7-f911-4098-8238-7f023dcdfd0d\\})|(\\{7eaf96aa-d4e7-41b0-9f12-775c2ac7f7c0\\})|(\\{b019c485-2a48-4f5b-be13-a7af94bc1a3e\\})|(\\{9b8a3057-8bf4-4a9e-b94b-867e4e71a50c\\})|(\\{eb3ebb14-6ced-4f60-9800-85c3de3680a4\\})|(\\{01f409a5-d617-47be-a574-d54325fe05d1\\})$/","prefs":[],"schema":1516394914836,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are a set of malicious add-ons that block the add-ons manager tab from opening so they can't be uninstalled.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5bf72f70-a611-4845-af3f-d4dabe8862b6","last_modified":1516394982586},{"guid":"/^(\\{ac06c6b2-3fd6-45ee-9237-6235aa347215\\})|(\\{d461cc1b-8a36-4ff0-b330-1824c148f326\\})|(\\{d1ab5ebd-9505-481d-a6cd-6b9db8d65977\\})|(\\{07953f60-447e-4f53-a5ef-ed060487f616\\})|(\\{2d3c5a5a-8e6f-4762-8aff-b24953fe1cc9\\})|(\\{f82b3ad5-e590-4286-891f-05adf5028d2f\\})|(\\{f96245ad-3bb0-46c5-8ca9-2917d69aa6ca\\})|(\\{2f53e091-4b16-4b60-9cae-69d0c55b2e78\\})|(\\{18868c3a-a209-41a6-855d-f99f782d1606\\})|(\\{47352fbf-80d9-4b70-9398-fb7bffa3da53\\})$/","prefs":[],"schema":1516311993443,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are a set of malicious add-ons that block the add-ons manager tab from opening so they can't be uninstalled.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4ca8206f-bc2a-4428-9439-7f3142dc08db","last_modified":1516394914828},{"guid":"{5b0f6d3c-10fd-414c-a135-dffd26d7de0f}","prefs":[],"schema":1516131689499,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1430577","why":"This is a malicious add-on that executes remote scripts, redirects popular search URLs and tracks users.","name":"P Birthday"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8088b39a-3e6d-4a17-a22f-3f95c0464bd6","last_modified":1516303320468},{"guid":"{1490068c-d8b7-4bd2-9621-a648942b312c}","prefs":[],"schema":1515267698296,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1428754","why":"This add-on is using a deceptive name and performing unwanted actions on users' systems.","name":"FF Safe Helper"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"674b6e19-f087-4706-a91d-1e723ed6f79e","last_modified":1515433728497},{"guid":"{dfa727cb-0246-4c5a-843a-e4a8592cc7b9}","prefs":[],"schema":1514922095288,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1426582","why":"Version 2.0.0 shipped with a hidden coin miner, which degrades performance in users who have it enabled. Version 1.2.3 currently available on AMO is not affected.","name":"Open With Adobe PDF Reader 2.0.0"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"2.0.0","minVersion":"2.0.0"}],"id":"455772a3-8360-4f5a-9a5f-a45b904d0b51","last_modified":1515007270887},{"guid":"{d03b6b0f-4d44-4666-a6d6-f16ad9483593}","prefs":[],"schema":1513366896461,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1425581","why":"This is a malicious add-on posing as a legitimate update.","name":"FF Guard Tool (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"10d9ce89-b8d4-4b53-b3d7-ecd192681f4e","last_modified":1513376470395},{"guid":"{7e907a15-0a4c-4ff4-b64f-5eeb8f841349}","prefs":[],"schema":1510083698490,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate update.","name":"Manual Update"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f7569261-f575-4719-8202-552b20d013b0","last_modified":1510168860382},{"guid":"{3602008d-8195-4860-965a-d01ac4f9ca96}","prefs":[],"schema":1509120801051,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate antivirus.\n","name":"Manual Antivirus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"28c805a9-e692-4ef8-b3ae-14e085c19ecd","last_modified":1509120934909},{"guid":"{87010166-e3d0-4db5-a394-0517917201df}","prefs":[],"schema":1509120801051,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate antivirus.\n","name":"Manual Antivirus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"84dd8a02-c879-4477-8ea7-bf2f225b0940","last_modified":1509120881470},{"guid":"{8ab60777-e899-475d-9a4f-5f2ee02c7ea4}","prefs":[],"schema":1509120801051,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate antivirus.\n","name":"Manual Antivirus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ccebab59-7190-4258-8faa-a0b752dd5301","last_modified":1509120831329},{"guid":"{368eb817-31b4-4be9-a761-b67598faf9fa}","prefs":[],"schema":1509046897080,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate antivirus.","name":"Manual Antivirus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9abc7502-bd6f-40d7-b035-abe721345360","last_modified":1509120801043},{"guid":"@68eba425-7a05-4d62-82b1-1d6d5a51716b","prefs":[],"schema":1505072496256,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1398905","why":"Misleads users into thinking this is a security and privacy tool (also distributed on a site that makes it look like an official Mozilla product).","name":"SearchAssist Incognito"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0"}],"id":"595e0e53-b76b-4188-a160-66f29c636094","last_modified":1505211411253},{"guid":"@H99KV4DO-UCCF-9PFO-9ZLK-8RRP4FVOKD9O","prefs":[],"schema":1502483549048,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1340877","why":"This is a malicious add-on that is being installed silently.","name":"FF Adr (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5df16afc-c804-43c9-9de5-f1835403e5fb","last_modified":1502483601731},{"guid":"@DA3566E2-F709-11E5-8E87-A604BC8E7F8B","prefs":[],"schema":1502480491460,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1340877","why":"This is a malicious add-on that is being installed silently into users' systems.","name":"SimilarWeb (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0a47a2f7-f07c-489b-bd39-88122a2dfe6a","last_modified":1502483549043},{"guid":"/^({95E84BD3-3604-4AAC-B2CA-D9AC3E55B64B}|{E3605470-291B-44EB-8648-745EE356599A}|{95E5E0AD-65F9-4FFC-A2A2-0008DCF6ED25}|{FF20459C-DA6E-41A7-80BC-8F4FEFD9C575}|{6E727987-C8EA-44DA-8749-310C0FBE3C3E}|{12E8A6C2-B125-479F-AB3C-13B8757C7F04}|{EB6628CF-0675-4DAE-95CE-EFFA23169743})$/","prefs":[],"schema":1494022576295,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1362585","why":"All of these add-ons have been identified as malware, and are being installed in Firefox globally, most likely via a malicious application installer.","name":"Malicious globally-installed add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3fd71895-7fc6-4f3f-aa22-1cbb0c5fd922","last_modified":1494024191520},{"guid":"@safesearchscoutee","prefs":[],"schema":1494013289942,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1362553","why":"This add-on intercepts queries sent to search engines and replaces them with its own, without user consent.","name":"SafeSearch Incognito (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"edad04eb-ea16-42f3-a4a7-20dded33cc37","last_modified":1494022568654},{"guid":"msktbird@mcafee.com","prefs":[],"schema":1493150718059,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1354912","why":"These versions of this add-on are known to cause frequent crashes in Thunderbird.","name":"McAfee Anti-Spam Thunderbird Extension 2.0 and lower"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.0","minVersion":"0","targetApplication":[{"guid":"{3550f703-e582-4d05-9a08-453d09bdfdc6}","maxVersion":"*","minVersion":"0"}]}],"id":"9e86d1ff-727a-45e3-9fb6-17f32666daf2","last_modified":1493332747360},{"guid":"/^(\\{11112503-5e91-4299-bf4b-f8c07811aa50\\})|(\\{501815af-725e-45be-b0f2-8f36f5617afc\\})$/","prefs":[],"schema":1491421290217,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1354045","why":"This add-on steals user credentials for popular websites from Facebook.","name":"Flash Player Updater (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c142360c-4f93-467e-9717-b638aa085d95","last_modified":1491472107658},{"guid":"fr@fbt.ovh","prefs":[],"schema":1490898754477,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1351689","why":"Scam add-on that silently steals user credentials of popular websites","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0f8344d0-8211-49a1-81be-c0084b3da9b1","last_modified":1490898787752},{"guid":"{95E84BD3-3604-4AAC-B2CA-D9AC3E55B64B}","prefs":[],"schema":1487179851382,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1338690","who":"All users who have this add-on installed.","why":"This is a malicious add-on that is silently installed in users' systems.","name":"youtube adblock (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"04b25e3d-a725-493e-be07-cbd74fb37ea7","last_modified":1487288975999},{"guid":"ext@alibonus.com","prefs":[],"schema":1485297431051,"blockID":"i1524","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1333471","who":"All Firefox users who have these versions installed.","why":"Versions 1.20.9 and lower of this add-on contain critical security issues.","name":"Alibonus 1.20.9 and lower","created":"2017-01-24T22:45:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.20.9","minVersion":"0","targetApplication":[]}],"id":"a015d5a4-9184-95db-0c74-9262af2332fa","last_modified":1485301116629},{"guid":"/^(ciscowebexstart1@cisco\\.com|ciscowebexstart_test@cisco\\.com|ciscowebexstart@cisco\\.com|ciscowebexgpc@cisco\\.com)$/","prefs":[],"schema":1485212610474,"blockID":"i1522","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1333225","who":"All Firefox users who have any Cisco WebEx add-ons installed.","why":"A critical security vulnerability has been discovered in Cisco WebEx add-ons that enable malicious websites to execute code on the user's system.","name":"Cisco WebEx add-ons","created":"2017-01-23T22:55:58Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0.1","minVersion":"1.0.0","targetApplication":[]}],"id":"30368779-1d3b-490a-0a34-253085af7754","last_modified":1485215014902},{"guid":"googlotim@gmail.com","prefs":[],"schema":1483389810787,"blockID":"i1492","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1328594","who":"All users who have Savogram version 1.3.2 installed. Version 1.3.1 doesn't have this problem and can be installed from the <a href=\"https://addons.mozilla.org/addon/savogram/\">add-on page</a>. Note that this is an older version, so affected users won't be automatically updated to it. New versions should correct this problem if they become available.","why":"Version 1.3.2 of this add-on loads remote code and performs DOM injection in an unsafe manner.","name":"Savogram 1.3.2","created":"2017-01-05T19:58:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.3.2","minVersion":"1.3.2","targetApplication":[]}],"id":"0756ed76-7bc7-ec1e-aba5-3a9fac2107ba","last_modified":1483646608603},{"guid":"support@update-firefox.com","prefs":[],"schema":1483387107003,"blockID":"i21","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=629717","who":"All users of the add-on in all Mozilla applications.","why":"This add-on is adware/spyware masquerading as a Firefox update mechanism.","name":"Browser Update (spyware)","created":"2011-01-31T16:23:48Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dfb06be8-3594-28e4-d163-17e27119f15d","last_modified":1483389809169},{"guid":"{2224e955-00e9-4613-a844-ce69fccaae91}","prefs":[],"schema":1483387107003,"blockID":"i7","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=512406","who":"All users of Internet Saving Optimizer for all Mozilla applications.","why":"This add-on causes a high volume of Firefox crashes and is considered malware.","name":"Internet Saving Optimizer (extension)","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b9efb796-97c2-6434-d28f-acc83436f8e5","last_modified":1483389809147},{"guid":"supportaccessplugin@gmail.com","prefs":[],"schema":1483387107003,"blockID":"i43","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=693673","who":"All users with Firefox Access Plugin installed","why":"This add-on is spyware that reports all visited websites to a third party with no user value.","name":"Firefox Access Plugin (spyware)","created":"2011-10-11T11:24:05Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1ed230a4-e174-262a-55ab-0c33f93a2529","last_modified":1483389809124},{"guid":"{8CE11043-9A15-4207-A565-0C94C42D590D}","prefs":[],"schema":1483387107003,"blockID":"i10","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=541302","who":"All users of this add-on in all Mozilla applications.","why":"This add-on secretly hijacks all search results in most major search engines and masks as a security add-on.","name":"Internal security options editor (malware)","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e2e0ac09-6d68-75f5-2424-140f51904876","last_modified":1483389809102},{"guid":"admin@youtubespeedup.com","prefs":[],"schema":1483387107003,"blockID":"i48","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=714221","who":"All users with any version of Youtube Speed UP! installed on any Mozilla product.","why":"This add-on hijacks your Facebook account.","name":"Youtube Speed UP! (malware)","created":"2011-12-29T19:48:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a93922c4-8a8a-5230-8f76-76fecb0653b6","last_modified":1483389809057},{"guid":"pink@rosaplugin.info","prefs":[],"schema":1482945809444,"blockID":"i84","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=743484","who":"All Firefox users who have this add-on installed","why":"Add-on acts like malware and performs user actions on Facebook without their consent.","name":"Facebook Rosa (malware)","created":"2012-04-09T10:13:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"66ad8de9-311d-076c-7356-87fde6d30d8f","last_modified":1482945810971},{"guid":"videoplugin@player.com","prefs":[],"schema":1482945809444,"blockID":"i90","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=752483","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware disguised as a Flash Player update. It can hijack Google searches and Facebook accounts.","name":"FlashPlayer 11 (malware)","created":"2012-05-07T08:58:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d25943f1-39ef-b9ec-ab77-baeef3498365","last_modified":1482945810949},{"guid":"youtb3@youtb3.com","prefs":[],"schema":1482945809444,"blockID":"i60","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=723753","who":"All Firefox users who have this extension installed.","why":"Malicious extension installed under false pretenses.","name":"Video extension (malware)","created":"2012-02-02T16:38:41Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cae3093f-a7b3-5352-a264-01dbfbf347ce","last_modified":1482945810927},{"guid":"{8f42fb8b-b6f6-45de-81c0-d6d39f54f971}","prefs":[],"schema":1482945809444,"blockID":"i82","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=743012","who":"All Firefox users who have installed this add-on.","why":"This add-on maliciously manipulates Facebook and is installed under false pretenses.","name":"Face Plus (malware)","created":"2012-04-09T10:04:28Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"09319ab3-55e7-fec1-44e0-84067d014b9b","last_modified":1482945810904},{"guid":"{95ff02bc-ffc6-45f0-a5c8-619b8226a9de}","prefs":[],"schema":1482945809444,"blockID":"i105","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=763065","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that inserts scripts into Facebook and hijacks the user's session.\r\n","name":"Eklenti D\u00fcnyas\u0131 (malware)","created":"2012-06-08T14:34:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"afbbc08d-2414-f51e-fdb8-74c0a2d90323","last_modified":1482945810858},{"guid":"{fa277cfc-1d75-4949-a1f9-4ac8e41b2dfd}","prefs":[],"schema":1482945809444,"blockID":"i77","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=738419","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware that is installed under false pretenses as an Adobe plugin.","name":"Adobe Flash (malware)","created":"2012-03-22T14:39:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"81753a93-382d-5f9d-a4ca-8a21b679ebb1","last_modified":1482945810835},{"guid":"youtube@youtube3.com","prefs":[],"schema":1482945809444,"blockID":"i57","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=722823","who":"All Firefox users that have installed this add-on.","why":"Malware installed on false pretenses.","name":"Divx 2012 Plugin (malware)","created":"2012-01-31T13:54:20Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4a93a0eb-a513-7272-6199-bc4d6228ff50","last_modified":1482945810811},{"guid":"{392e123b-b691-4a5e-b52f-c4c1027e749c}","prefs":[],"schema":1482945809444,"blockID":"i109","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=769781","who":"All Firefox users who have this add-on installed.","why":"This add-on pretends to be developed by Facebook and injects scripts that manipulate users' Facebook accounts.","name":"Zaman Tuneline Hay\u0131r! (malware)","created":"2012-06-29T13:20:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b9a805aa-cae7-58d6-5a53-2af4442e4cf6","last_modified":1482945810788},{"guid":"msntoolbar@msn.com","prefs":[],"schema":1482945809444,"blockID":"i18","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=599971","who":"Users of Bing Bar 6.0 and older for all versions of Firefox.","why":"This add-on has security issues and was blocked at Microsoft's request. For more information, please see <a href=\"http://support.microsoft.com/kb/2430460\">this article</a>.","name":"Bing Bar","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"6.*","minVersion":" 0","targetApplication":[]}],"id":"9b2f2039-b997-8993-d6dc-d881bc1ca7a1","last_modified":1482945810764},{"guid":"yasd@youasdr3.com","prefs":[],"schema":1482945809444,"blockID":"i104","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=763065","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that inserts scripts into Facebook and hijacks the user's session.\r\n","name":"Play Now (malware)","created":"2012-06-08T14:33:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8a352dff-d09d-1e78-7feb-45dec7ace5a5","last_modified":1482945810740},{"guid":"fdm_ffext@freedownloadmanager.org","prefs":[],"schema":1482945809444,"blockID":"i2","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=408445","who":"Users of Firefox 3 and later with versions 1.0 through 1.3.1 of Free Download Manager","why":"This add-on causes a high volume of crashes.","name":"Free Download Manager","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.3.1","minVersion":"1.0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.0a1"}]}],"id":"fc46f8e7-0489-b90f-a373-d93109479ca5","last_modified":1482945810393},{"guid":"flash@adobe.com","prefs":[],"schema":1482945809444,"blockID":"i56","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=722526","who":"All Firefox users who have this add-on installed.","why":"This add-on poses as an Adobe Flash update and injects malicious scripts into web pages. It hides itself in the Add-ons Manager.","name":"Adobe Flash Update (malware)","created":"2012-01-30T15:41:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"696db959-fb0b-8aa4-928e-65f157cdd77a","last_modified":1482945810371},{"guid":"youtubeer@youtuber.com","prefs":[],"schema":1482945809444,"blockID":"i66","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=726787","who":"All Firefox users who have installed this add-on.","why":"Add-on behaves maliciously, and is installed under false pretenses.","name":"Plug VDS (malware)","created":"2012-02-13T15:44:20Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0878ce4e-b476-ffa3-0e06-21a65b7917a1","last_modified":1482945810348},{"guid":"flash@adobee.com","prefs":[],"schema":1482945809444,"blockID":"i83","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=743497","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware installed under false pretenses.","name":"FlashPlayer 11 (malware)","created":"2012-04-09T10:08:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"09bb4661-331c-f7ba-865b-9e085dc437af","last_modified":1482945810259},{"guid":"youtube@2youtube.com","prefs":[],"schema":1482945809444,"blockID":"i71","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=730399","who":"All Firefox users who have installed this add-on.","why":"Extension is malware, installed under false pretenses.","name":"YouTube extension (malware)","created":"2012-02-27T10:23:23Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5d389c1f-b3a0-b06f-6ffb-d1e8aa055e3c","last_modified":1482945810236},{"guid":"webmaster@buzzzzvideos.info","prefs":[],"schema":1482945809444,"blockID":"i58","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=722844","who":"All Firefox users who have installed this add-on.","why":"Malware add-on that is installed under false pretenses.","name":"Buzz Video (malware)","created":"2012-01-31T14:51:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f7aab105-e2c2-42f5-d9be-280eb9c0c8f7","last_modified":1482945810213},{"guid":"play5@vide04flash.com","prefs":[],"schema":1482945809444,"blockID":"i92","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=755443","who":"All Firefox users who have this add-on installed.","why":"This add-on impersonates a Flash Player update (poorly), and inserts malicious scripts into Facebook.","name":"Lastest Flash PLayer (malware)","created":"2012-05-15T13:27:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7190860e-fc1f-cd9f-5d25-778e1e9043b2","last_modified":1482945810191},{"guid":"support3_en@adobe122.com","prefs":[],"schema":1482945809444,"blockID":"i97","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=759164","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware disguised as the Flash Player plugin.","name":"FlashPlayer 11 (malware)","created":"2012-05-28T13:42:54Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"decf93a1-2bb0-148c-a1a6-10b3757b554b","last_modified":1482945810168},{"guid":"a1g0a9g219d@a1.com","prefs":[],"schema":1482945809444,"blockID":"i73","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=736275","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware disguised as Flash Player. It steals user cookies and sends them to a remote location.","name":"Flash Player (malware)","created":"2012-03-15T15:03:04Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6dd66b43-897d-874a-2227-54e240b8520f","last_modified":1482945810146},{"guid":"ghostviewer@youtube2.com","prefs":[],"schema":1482945809444,"blockID":"i59","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=723683","who":"All Firefox users who have installed this add-on.","why":"Malicious add-on that automatically posts to Facebook.","name":"Ghost Viewer (malware)","created":"2012-02-02T16:32:15Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"06dfe833-8c3d-90ee-3aa8-37c3c28f7c56","last_modified":1482945810123},{"guid":"kdrgun@gmail.com","prefs":[],"schema":1482945809444,"blockID":"i103","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=763065","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that inserts scripts into Facebook and hijacks the user's session.","name":"Timeline Kapat (malware)","created":"2012-06-08T14:32:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a9a46ab2-2f56-1046-201c-5faa3435e248","last_modified":1482945810078},{"guid":"youtube2@youtube2.com","prefs":[],"schema":1482945809444,"blockID":"i67","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=728476","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware, installed under false pretenses.","name":"Youtube Online (malware)","created":"2012-02-18T09:10:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"14650ece-295b-a667-f9bc-a3d973e2228c","last_modified":1482945810055},{"guid":"admin@youtubeplayer.com","prefs":[],"schema":1482945809444,"blockID":"i51","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=717165","who":"All Firefox users with this extension installed.","why":"This add-on is malware, doing nothing more than inserting advertisements into websites through iframes.","name":"Youtube player (malware)","created":"2012-01-18T14:34:55Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"16b2ce94-88db-0d79-33fc-a93070ceb509","last_modified":1482945809957},{"guid":"youtubeee@youtuber3.com","prefs":[],"schema":1482945809444,"blockID":"i96","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=758503","who":"All Firefox users who have installed this add-on.","why":"This is a malicious add-on that is disguised as a DivX plugin.","name":"Divx 2012 Plugins (malware)","created":"2012-05-25T09:26:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f01be9cb-5cf2-774a-a4d7-e210a24db5b9","last_modified":1482945809912},{"guid":"{3252b9ae-c69a-4eaf-9502-dc9c1f6c009e}","prefs":[],"schema":1482945809444,"blockID":"i17","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=599971","who":"Users of version 2.2 of this add-on in all versions of Firefox.","why":"This add-on has security issues and was blocked at Microsoft's request. For more information, please see <a href=\"http://support.microsoft.com/kb/2430460\">this article</a>.","name":"Default Manager (Microsoft)","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"2.2","minVersion":"2.2","targetApplication":[]}],"id":"38be28ac-2e30-37fa-4332-852a55fafb43","last_modified":1482945809886},{"guid":"{68b8676b-99a5-46d1-b390-22411d8bcd61}","prefs":[],"schema":1482945809444,"blockID":"i93","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=755635","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that post content on Facebook accounts and steals user data.","name":"Zaman T\u00fcnelini Kald\u0131r! (malware)","created":"2012-05-16T10:44:42Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"733aff15-9b1f-ec04-288f-b78a55165a1c","last_modified":1482945809863},{"guid":"applebeegifts@mozilla.doslash.org","prefs":[],"schema":1482945809444,"blockID":"i54","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=721562","who":"All Firefox users that install this add-on.","why":"Add-on is malware installed under false pretenses.","name":"Applebees Gift Card (malware)","created":"2012-01-26T16:17:49Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1372c8ab-5452-745a-461a-aa78e3e12c4b","last_modified":1482945809840},{"guid":"activity@facebook.com","prefs":[],"schema":1482945112982,"blockID":"i65","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=726803","who":"All Firefox users who have installed this add-on.","why":"Add-on behaves maliciously and poses as an official Facebook add-on.","name":"Facebook extension (malware)","created":"2012-02-13T15:41:02Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"79ad1c9b-0828-7823-4574-dd1cdd46c3d6","last_modified":1482945809437},{"guid":"jid0-EcdqvFOgWLKHNJPuqAnawlykCGZ@jetpack","prefs":[],"schema":1482945112982,"blockID":"i62","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=724650","who":"All Firefox users who have installed this add-on.","why":"Add-on is installed under false pretenses and delivers malware.","name":"YouTube extension (malware)","created":"2012-02-06T14:46:33Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5ae1e642-b53c-54c0-19e7-5562cfdac3a3","last_modified":1482945809415},{"guid":"{B7082FAA-CB62-4872-9106-E42DD88EDE45}","prefs":[],"schema":1482945112982,"blockID":"i25","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=637542","who":"Users of McAfee SiteAdvisor below version 3.3.1 for Firefox 4.\r\n\r\nUsers of McAfee SiteAdvisor 3.3.1 and below for Firefox 5 and higher.","why":"This add-on causes a high volume of crashes and is incompatible with certain versions of Firefox.","name":"McAfee SiteAdvisor","created":"2011-03-14T15:53:07Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.3.0.*","minVersion":"0.1","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.7a1"}]}],"id":"c950501b-1f08-2ab2-d817-7c664c0d16fe","last_modified":1482945809393},{"guid":"{B7082FAA-CB62-4872-9106-E42DD88EDE45}","prefs":[],"schema":1482945112982,"blockID":"i38","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=660111","who":"Users of McAfee SiteAdvisor below version 3.3.1 for Firefox 4.\r\n\r\nUsers of McAfee SiteAdvisor 3.3.1 and below for Firefox 5 and higher.","why":"This add-on causes a high volume of crashes and is incompatible with certain versions of Firefox.","name":"McAfee SiteAdvisor","created":"2011-05-27T13:55:02Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"3.3.1","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"5.0a1"}]}],"id":"f11de388-4511-8d06-1414-95d3b2b122c5","last_modified":1482945809371},{"guid":"youtube@youtube7.com","prefs":[],"schema":1482945112982,"blockID":"i55","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=721646","who":"All Firefox users with this add-on installed.","why":"This is malware posing as video software.","name":"Plugin Video (malware)","created":"2012-01-27T09:39:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"08ceedf5-c7c1-f54f-db0c-02f01f0e319a","last_modified":1482945809304},{"guid":"crossriderapp3924@crossrider.com","prefs":[],"schema":1482945112982,"blockID":"i76","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=738282","who":"All Firefox users who have installed this add-on.","why":"This add-on compromises Facebook privacy and security and spams friends lists without user intervention.","name":"Fblixx (malware)","created":"2012-03-22T10:38:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"39d0a019-62fb-837b-1f1f-6831e56442b5","last_modified":1482945809279},{"guid":"{45147e67-4020-47e2-8f7a-55464fb535aa}","prefs":[],"schema":1482945112982,"blockID":"i86","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=748993","who":"All Firefox users who have this add-on installed.","why":"This add-on injects scripts into Facebook and performs malicious activity.","name":"Mukemmel Face+","created":"2012-04-25T16:33:21Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"960443f9-cf48-0b71-1ff2-b8c34a3411ea","last_modified":1482945809255},{"guid":"{4B3803EA-5230-4DC3-A7FC-33638F3D3542}","prefs":[],"schema":1482945112982,"blockID":"i4","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=441649","who":"Users of Firefox 3 and later with version 1.2 of Crawler Toolbar","why":"This add-on causes a high volume of crashes.","name":"Crawler Toolbar","created":"2008-07-08T10:23:31Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.2","minVersion":"1.2","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.0a1"}]}],"id":"a9818d53-3a6a-8673-04dd-2a16f5644215","last_modified":1482945809232},{"guid":"flashupdate@adobe.com","prefs":[],"schema":1482945112982,"blockID":"i68","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=722526","who":"All Firefox users who have this add-on installed.","why":"Add-on is malware, installed under false pretenses.","name":"Flash Update (malware)","created":"2012-02-21T13:55:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1ba5b46e-790d-5af2-9580-a5f1e6e65522","last_modified":1482945809208},{"guid":"plugin@youtubeplayer.com","prefs":[],"schema":1482945112982,"blockID":"i127","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=783356","who":"All users who have this add-on installed.","why":"This add-on tries to pass as a YouTube player and runs malicious scripts on webpages.","name":"Youtube Facebook Player (malware)","created":"2012-08-16T13:03:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"17a8bece-e2df-a55d-8a72-95faff028b83","last_modified":1482945809185},{"guid":"GifBlock@facebook.com","prefs":[],"schema":1482945112982,"blockID":"i79","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=739482","who":"All Firefox users who have installed this extension.","why":"This extension is malicious and is installed under false pretenses.","name":"Facebook Essentials (malware)","created":"2012-03-27T10:53:33Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"728451e8-1273-d887-37e9-5712b1cc3bff","last_modified":1482945809162},{"guid":"ff-ext@youtube","prefs":[],"schema":1482945112982,"blockID":"i52","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=719296","who":"All Firefox users that have this add-on installed.","why":"This add-on poses as a YouTube player while posting spam into Facebook account.","name":"Youtube player (malware)","created":"2012-01-19T08:26:35Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cd2dd72a-dd52-6752-a0cd-a4b312fd0b65","last_modified":1482945809138},{"guid":"ShopperReports@ShopperReports.com","prefs":[],"schema":1482945112982,"blockID":"i22","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=630191","who":"Users of Shopper Reports version 3.1.22.0 in Firefox 4 and later.","why":"This add-on causes a high volume of Firefox crashes.","name":"Shopper Reports","created":"2011-02-09T17:03:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.1.22.0","minVersion":"3.1.22.0","targetApplication":[]}],"id":"f26b049c-d856-750f-f050-996e6bec7cbb","last_modified":1482945809115},{"guid":"{27182e60-b5f3-411c-b545-b44205977502}","prefs":[],"schema":1482945112982,"blockID":"i16","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=599971","who":"Users of version 1.0 of this add-on in all versions of Firefox.","why":"This add-on has security issues and was blocked at Microsoft's request. For more information, please see <a href=\"http://support.microsoft.com/kb/2430460\">this article</a>.","name":"Search Helper Extension (Microsoft)","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0","minVersion":"1.0","targetApplication":[]}],"id":"2655f230-11f3-fe4c-7c3d-757d37d5f9a5","last_modified":1482945809092},{"guid":"{841468a1-d7f4-4bd3-84e6-bb0f13a06c64}","prefs":[],"schema":1482945112982,"blockID":"i46","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=712369","who":"Users of all versions of Nectar Search Toolbar in Firefox 9.","why":"This add-on causes crashes and other stability issues in Firefox.","name":"Nectar Search Toolbar","created":"2011-12-20T11:38:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0.1","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"9.0","minVersion":"9.0a1"}]}],"id":"b660dabd-0dc0-a55c-4b86-416080b345d9","last_modified":1482945809069},{"guid":"support@daemon-tools.cc","prefs":[],"schema":1482945112982,"blockID":"i5","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=459850","who":"Users of Daemon Tools Toolbar version 1.0.0.5 and older for all Mozilla applications.","why":"This add-on causes a high volume of crashes.","name":"Daemon Tools Toolbar","created":"2009-02-13T18:39:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0.0.5","minVersion":"0","targetApplication":[]}],"id":"8cabafd3-576a-b487-31c8-ab59e0349a0e","last_modified":1482945809045},{"guid":"{a3a5c777-f583-4fef-9380-ab4add1bc2a8}","prefs":[],"schema":1482945112982,"blockID":"i53","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=719605","who":"All users of Firefox with this add-on installed.","why":"This add-on is being offered as an online movie viewer, when it reality it only inserts scripts and ads into known sites.","name":"Peliculas-FLV (malware)","created":"2012-01-19T15:58:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.0.3","minVersion":"2.0.3","targetApplication":[]}],"id":"07bc0962-60da-087b-c3ab-f2a6ab84d81c","last_modified":1482945809021},{"guid":"royal@facebook.com","prefs":[],"schema":1482945112982,"blockID":"i64","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=725777","who":"All Firefox users who have installed this add-on.","why":"Malicious add-on posing as a Facebook tool.","name":"Facebook ! (malware)","created":"2012-02-09T13:24:23Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dd1d2623-0d15-c93e-8fbd-ba07b0299a44","last_modified":1482945808997},{"guid":"{28bfb930-7620-11e1-b0c4-0800200c9a66}","prefs":[],"schema":1482945112982,"blockID":"i108","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=766852","who":"All Firefox user who have this add-on installed.","why":"This is malware disguised as an Adobe product. It spams Facebook pages.","name":"Aplicativo (malware)","created":"2012-06-21T09:24:11Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"908dc4fb-ebc9-cea1-438f-55e4507ba834","last_modified":1482945808973},{"guid":"socialnetworktools@mozilla.doslash.org","prefs":[],"schema":1482945112982,"blockID":"i78","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=739441","who":"All Firefox users who have installed this add-on.","why":"This add-on hijacks the Facebook UI and adds scripts to track users.","name":"Social Network Tools (malware)","created":"2012-03-26T16:46:55Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1064cd25-3b87-64bb-b0a6-2518ad281574","last_modified":1482945808950},{"guid":"youtubeeing@youtuberie.com","prefs":[],"schema":1482945112982,"blockID":"i98","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=759663","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware disguised as a Youtube add-on.","name":"Youtube Video Player (malware)","created":"2012-05-30T09:30:14Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3484f860-56e1-28e8-5a70-cdcd5ab9d6ee","last_modified":1482945808927},{"guid":"pfzPXmnzQRXX6@2iABkVe.com","prefs":[],"schema":1482945112982,"blockID":"i99","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=759950","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware disguised as a Flash Player update.","name":"Flash Player (malware)","created":"2012-05-30T17:10:18Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"29cc4abc-4f52-01f1-eb0b-cad84ba4db13","last_modified":1482945808881},{"guid":"/^(pdftoword@addingapps.com|jid0-EYTXLS0GyfQME5irGbnD4HksnbQ@jetpack|jid1-ZjJ7t75BAcbGCX@jetpack)$/","prefs":[],"schema":1482341309012,"blockID":"i1425","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1325060","who":"All users who have any of the affected versions installed.","why":"A security vulnerability was discovered in old versions of the Add-ons SDK, which is exposed by certain old versions of add-ons. In the case of some add-ons that haven't been updated for a long time, all versions are being blocked.","name":"Various vulnerable add-on versions","created":"2016-12-21T17:23:14Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"150e639f-c832-63d0-a775-59313b2e1bf9","last_modified":1482343886365},{"guid":"{cc8f597b-0765-404e-a575-82aefbd81daf}","prefs":[],"schema":1480349193877,"blockID":"i380","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=866332","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts and performs unwanted actions on behalf of the user.","name":"Update My Browser (malware)","created":"2013-06-19T13:03:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4950d7aa-c602-15f5-a7a2-d844182d5cbd","last_modified":1480349217152},{"guid":"extension@FastFreeConverter.com","prefs":[],"schema":1480349193877,"blockID":"i470","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:26Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"649dd933-debf-69b7-020f-496c2c9f99c8","last_modified":1480349217071},{"guid":"59D317DB041748fdB89B47E6F96058F3@jetpack","prefs":[],"schema":1480349193877,"blockID":"i694","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1053540","who":"All Firefox users who have this add-ons installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This is a suspicious add-on that appears to be installed without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"JsInjectExtension","created":"2014-08-21T13:46:30Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"75692bd4-18e5-a9be-7ec3-9327e159ef68","last_modified":1480349217005},{"guid":"/^({bfec236d-e122-4102-864f-f5f19d897f5e}|{3f842035-47f4-4f10-846b-6199b07f09b8}|{92ed4bbd-83f2-4c70-bb4e-f8d3716143fe})$/","prefs":[],"schema":1480349193877,"blockID":"i527","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949566","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and uses multiple IDs.","name":"KeyBar add-on","created":"2013-12-20T14:13:38Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6d68dd97-7965-0a84-8ca7-435aac3c8040","last_modified":1480349216927},{"guid":"support@vide1flash2.com","prefs":[],"schema":1480349193877,"blockID":"i246","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=830159","who":"All Firefox users who have this add-on installed.","why":"This is an add-on that poses as the Adobe Flash Player and runs malicious code in the user's system.","name":"Lastest Adobe Flash Player (malware)","created":"2013-01-14T09:17:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2004fba1-74bf-a072-2a59-6e0ba827b541","last_modified":1480349216871},{"guid":"extension21804@extension21804.com","prefs":[],"schema":1480349193877,"blockID":"i312","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835665","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"Coupon Companion","created":"2013-03-06T14:14:05Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b2cf1256-dadd-6501-1f4e-25902d408692","last_modified":1480349216827},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i602","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:18:05Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.8.*","minVersion":"3.15.8","targetApplication":[]}],"id":"b2b4236d-5d4d-82b2-99cd-00ff688badf1","last_modified":1480349216765},{"guid":"{FE1DEEEA-DB6D-44b8-83F0-34FC0F9D1052}","prefs":[],"schema":1480349193877,"blockID":"i364","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=867670","who":"All Firefox users who have this add-on installed. Users who want to enable the add-on again can do so in the Add-ons Manager.","why":"This add-on is side-installed with other software, and blocks setting reversions attempted by users who want to recover their settings after they are hijacked by other add-ons.","name":"IB Updater","created":"2013-06-10T16:14:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a59b967c-66ca-7ad9-2dc6-d0ad37ded5fd","last_modified":1480349216652},{"guid":"vpyekkifgv@vpyekkifgv.org","prefs":[],"schema":1480349193877,"blockID":"i352","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=872211","who":"All Firefox users who have this add-on installed.","why":"Uses a deceptive name and injects ads into pages without user consent.","name":"SQLlite Addon (malware)","created":"2013-05-14T13:42:04Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8fd981ab-7ee0-e367-d804-0efe29d63178","last_modified":1480349216614},{"guid":"thefoxonlybetter@quicksaver","prefs":[],"schema":1480349193877,"blockID":"i702","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1053469","who":"All Firefox users who have any of these versions of the add-on installed.","why":"Certain versions of The Fox, Only Better weren't developed by the original developer, and are likely malicious in nature. This violates the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> for reusing an already existent ID.","name":"The Fox, Only Better (malicious versions)","created":"2014-08-27T10:05:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"1.10","targetApplication":[]}],"id":"60e54f6a-1b10-f889-837f-60a76a98fccc","last_modified":1480349216512},{"guid":"{f0e59437-6148-4a98-b0a6-60d557ef57f4}","prefs":[],"schema":1480349193877,"blockID":"i304","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=845975","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">installation guidelines</a> and is dropped silently into user's profiles.","name":"WhiteSmoke B","created":"2013-02-27T13:10:18Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0469e643-1a90-f9be-4aad-b347469adcbe","last_modified":1480349216402},{"guid":"xz123@ya456.com","prefs":[],"schema":1480349193877,"blockID":"i486","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=939254","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware and is installed silently in violation of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BetterSurf (malware)","created":"2013-11-15T13:34:53Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b9825a25-a96c-407e-e656-46a7948e5745","last_modified":1480349215808},{"guid":"{C7AE725D-FA5C-4027-BB4C-787EF9F8248A}","prefs":[],"schema":1480349193877,"blockID":"i424","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=860641","who":"Users of Firefox 23 or later who have RelevantKnowledge 1.0.0.2 or lower.","why":"Old versions of this add-on are causing startup crashes in Firefox 23, currently on the Beta channel. RelevantKnowledge users on Firefox 23 and above should update to version 1.0.0.3 of the add-on.","name":"RelevantKnowledge 1.0.0.2 and lower","created":"2013-07-01T10:45:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0.0.2","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"23.0a1"}]}],"id":"c888d167-7970-4b3f-240f-2d8e6f14ded4","last_modified":1480349215779},{"guid":"superlrcs@svenyor.net","prefs":[],"schema":1480349193877,"blockID":"i545","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949596","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enable it in the Add-ons Manager.","why":"This add-on is in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, using multiple add-on IDs and potentially doing other unwanted activities.","name":"SuperLyrics","created":"2014-01-30T11:52:42Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"002cd4fa-4c2b-e28b-9220-4a520f4d9ec6","last_modified":1480349215672},{"guid":"mbrsepone@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i479","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=937331","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Mozilla Lightweight Pack (malware)","created":"2013-11-11T15:42:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0549645e-5f50-5089-1f24-6e7d3bfab8e0","last_modified":1480349215645},{"guid":"mbroctone@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i476","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=936590","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks the users' Facebook account.","name":"Mozilla Storage Service (malware)","created":"2013-11-08T15:32:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"92198396-8756-8d09-7f18-a68d29894f71","last_modified":1480349215504},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i616","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:24:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.28.*","minVersion":"3.15.28","targetApplication":[]}],"id":"f11b485f-320e-233c-958b-a63377024fad","last_modified":1480349215479},{"guid":"/^({e9df9360-97f8-4690-afe6-996c80790da4}|{687578b9-7132-4a7a-80e4-30ee31099e03}|{46a3135d-3683-48cf-b94c-82655cbc0e8a}|{49c795c2-604a-4d18-aeb1-b3eba27e5ea2}|{7473b6bd-4691-4744-a82b-7854eb3d70b6}|{96f454ea-9d38-474f-b504-56193e00c1a5})$/","prefs":[],"schema":1480349193877,"blockID":"i494","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=776404","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on changes search settings without user interaction, and fails to reset them after it is removed. It also uses multiple add-on IDs for no apparent reason. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"uTorrent and related","created":"2013-12-02T14:52:32Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"485210d0-8e69-3436-536f-5d1deeea4167","last_modified":1480349215454},{"guid":"{EB7508CA-C7B2-46E0-8C04-3E94A035BD49}","prefs":[],"schema":1480349193877,"blockID":"i162","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=799266","who":"All Firefox users who have installed any of these add-ons.","why":"This block covers a number of malicious add-ons that deceive users, using names like \"Mozilla Safe Browsing\" and \"Translate This!\", and claiming they are developed by \"Mozilla Corp.\". They hijack searches and redirects users to pages they didn't intend to go to.\r\n\r\nNote: this block won't be active until bug 799266 is fixed.","name":"Mozilla Safe Browsing and others (Medfos malware)","created":"2012-10-11T12:25:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"07566aa3-4ff9-ac4f-9de9-71c77454b4da","last_modified":1480349215428},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i614","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:23:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.26.*","minVersion":"3.15.26","targetApplication":[]}],"id":"ede541f3-1748-7b33-9bd6-80e2f948e14f","last_modified":1480349215399},{"guid":"/^({976cd962-e0ca-4337-aea7-d93fae63a79c}|{525ba996-1ce4-4677-91c5-9fc4ead2d245}|{91659dab-9117-42d1-a09f-13ec28037717}|{c1211069-1163-4ba8-b8b3-32fc724766be})$/","prefs":[],"schema":1480349193877,"blockID":"i522","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947485","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed and using multiple add-on IDs.","name":"appbario7","created":"2013-12-20T13:15:33Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"580aed26-dc3b-eef8-fa66-a0a402447b7b","last_modified":1480349215360},{"guid":"jid0-O6MIff3eO5dIGf5Tcv8RsJDKxrs@jetpack","prefs":[],"schema":1480349193877,"blockID":"i552","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=974041","who":"All Firefox users who have this extension installed.","why":"This extension is malware that attempts to make it impossible for a second extension and itself to be disabled, and also forces the new tab page to have a specific URL.","name":"Extension_Protected (malware)","created":"2014-02-19T15:26:37Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e53063b4-5702-5b66-c860-d368cba4ccb6","last_modified":1480349215327},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i604","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:18:58Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.11.*","minVersion":"3.15.10","targetApplication":[]}],"id":"b910f779-f36e-70e1-b17a-8afb75988c03","last_modified":1480349215302},{"guid":"brasilescapefive@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i483","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=938473","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Facebook Video Pack (malware)","created":"2013-11-14T09:37:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"85ee7840-f262-ad30-eb91-74b3248fd13d","last_modified":1480349215276},{"guid":"brasilescapeeight@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i482","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=938476","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Mozilla Security Pack (malware)","created":"2013-11-14T09:36:55Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"457a5722-be90-5a9f-5fa0-4c753e9f324c","last_modified":1480349215249},{"guid":"happylyrics@hpyproductions.net","prefs":[],"schema":1480349193877,"blockID":"i370","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=881815","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into Firefox without the users' consent, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Happy Lyrics","created":"2013-06-11T15:42:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"730e616d-94a7-df0c-d31a-98b7875d60c2","last_modified":1480349215225},{"guid":"search-snacks@search-snacks.com","prefs":[],"schema":1480349193877,"blockID":"i872","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1082733","who":"All users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Search Snacks","created":"2015-03-04T14:37:33Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7567b06f-98fb-9400-8007-5d0357c345d9","last_modified":1480349215198},{"os":"WINNT","guid":"{ABDE892B-13A8-4d1b-88E6-365A6E755758}","prefs":[],"schema":1480349193877,"blockID":"i107","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=764210","who":"All Firefox users on Windows who have the RealPlayer Browser Record extension installed.","why":"The RealPlayer Browser Record extension is causing significant problems on Flash video sites like YouTube. This block automatically disables the add-on, but users can re-enable it from the Add-ons Manager if necessary.\r\n\r\nThis block shouldn't disable any other RealPlayer plugins, so watching RealPlayer content on the web should be unaffected.\r\n\r\nIf you still have problems playing videos on YouTube or elsewhere, please visit our <a href=\"http://support.mozilla.com/\">support site</a> for help.","name":"RealPlayer Browser Record Plugin","created":"2012-06-14T13:54:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"15.0.5","minVersion":"0","targetApplication":[]}],"id":"e3b89e55-b35f-8694-6f0e-f856e57a191d","last_modified":1480349215173},{"guid":"amo-validator-bypass@example.com","prefs":[],"schema":1480349193877,"blockID":"i1058","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1227605","who":"All users who install this add-on.","why":"This add-on is a proof of concept of a malicious add-on that bypasses the code validator.","name":" AMO Validator Bypass","created":"2015-11-24T09:03:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"86e38e3e-a729-b5a2-20a8-4738b376eea6","last_modified":1480349214743},{"guid":"6lIy@T.edu","prefs":[],"schema":1480349193877,"blockID":"i852","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128269","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"unIsaless","created":"2015-02-09T15:30:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"39798bc2-9c75-f172-148b-13f3ca1dde9b","last_modified":1480349214613},{"guid":"{a7f2cb14-0472-42a1-915a-8adca2280a2c}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i686","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1033809","who":"All users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-on Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"HomeTab","created":"2014-08-06T16:35:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"33a8f403-b2c8-cadf-e1ba-40b39edeaf18","last_modified":1480349214537},{"guid":"{CA8C84C6-3918-41b1-BE77-049B2BDD887C}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i862","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1131230","who":"All users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Ebay Shopping Assistant by Spigot","created":"2015-02-26T12:51:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9a9d6da2-90a1-5b71-8b24-96492d57dfd1","last_modified":1480349214479},{"guid":"update@firefox.com","prefs":[],"schema":1480349193877,"blockID":"i374","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=781088","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks Facebook accounts.","name":"Premium Update (malware)","created":"2013-06-18T13:58:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bb388413-60ea-c9d6-9a3b-c90df950c319","last_modified":1480349214427},{"guid":"sqlmoz@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i350","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=871610","who":"All Firefox users who have this extension installed.","why":"This extension is malware posing as Mozilla software. It hijacks Facebook accounts and spams other Facebook users.","name":"Mozilla Service Pack (malware)","created":"2013-05-13T09:43:07Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"715082e8-7a30-b27b-51aa-186c38e078f6","last_modified":1480349214360},{"guid":"mozillahmpg@mozilla.org","prefs":[],"schema":1480349193877,"blockID":"i140","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=791867","who":"All Firefox users who have installed this add-on.","why":"This is a malicious add-on that tries to monetize on its users by embedding unauthorized affiliate codes on shopping websites, and sometimes redirecting users to alternate sites that could be malicious in nature.","name":"Google YouTube HD Player (malware)","created":"2012-09-17T16:04:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"98150e2e-cb45-1fee-8458-28d3602ec2ec","last_modified":1480349214216},{"guid":"astrovia@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i489","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=942699","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Facebook Security Service (malware)","created":"2013-11-25T12:40:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6f365ff4-e48f-8a06-d19d-55e19fba81f4","last_modified":1480349214157},{"guid":"{bbea93c6-64a3-4a5a-854a-9cc61c8d309e}","prefs":[],"schema":1480349193877,"blockID":"i1126","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1251940","who":"All users who have this add-on installed.","why":"This is a malicious add-on that disables various security checks in Firefox.","name":"Tab Extension (malware)","created":"2016-02-29T21:58:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5acb9dcc-59d4-46d1-2a11-1194c4948239","last_modified":1480349214066},{"guid":"ffxtlbr@iminent.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i628","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=866943","who":"All Firefox users who have any of these add-ons installed. Users who wish to continue using them can enable them in the Add-ons Manager.","why":"These add-ons have been silently installed repeatedly, and change settings without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Iminent Minibar","created":"2014-06-26T15:47:15Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4387ad94-8500-d74d-68e3-20564a9aac9e","last_modified":1480349214036},{"guid":"{28387537-e3f9-4ed7-860c-11e69af4a8a0}","prefs":[],"schema":1480349193877,"blockID":"i40","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=665775","who":"Users of MediaBar versions 4.3.1.00 and below in all versions of Firefox.","why":"This add-on causes a high volume of crashes and is incompatible with certain versions of Firefox.","name":"MediaBar (2)","created":"2011-07-19T10:19:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"4.3.1.00","minVersion":"0.1","targetApplication":[]}],"id":"ff95664b-93e4-aa73-ac20-5ffb7c87d8b7","last_modified":1480349214002},{"guid":"{41e5ef7a-171d-4ab5-8351-951c65a29908}","prefs":[],"schema":1480349193877,"blockID":"i784","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"HelpSiteExpert","created":"2014-11-14T14:37:56Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0c05a0bb-30b4-979e-33a7-9f3955eba17d","last_modified":1480349213962},{"guid":"/^({2d7886a0-85bb-4bf2-b684-ba92b4b21d23}|{2fab2e94-d6f9-42de-8839-3510cef6424b}|{c02397f7-75b0-446e-a8fa-6ef70cfbf12b}|{8b337819-d1e8-48d3-8178-168ae8c99c36}|firefox@neurowise.info|firefox@allgenius.info)$/","prefs":[],"schema":1480349193877,"blockID":"i762","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1082599","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"These add-ons are silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SaveSense, neurowise, allgenius","created":"2014-10-17T16:58:10Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c5439f55-ace5-ad73-1270-017c0ba7b2ce","last_modified":1480349213913},{"guid":"{462be121-2b54-4218-bf00-b9bf8135b23f}","prefs":[],"schema":1480349193877,"blockID":"i226","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=812303","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently side-installed by other software, and doesn't do much more than changing the users' settings, without reverting them on removal.","name":"WhiteSmoke","created":"2012-11-29T16:27:36Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"994c6084-e864-0e4e-ac91-455083ee46c7","last_modified":1480349213879},{"guid":"firefox@browsefox.com","prefs":[],"schema":1480349193877,"blockID":"i546","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=936244","who":"All Firefox users who have this add-on installed. If you want to continue using it, it can be enabled in the Add-ons Manager.","why":"This add-on is silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BrowseFox","created":"2014-01-30T12:26:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"407d8c84-8939-cd28-b284-9b680e529bf6","last_modified":1480349213853},{"guid":"{6926c7f7-6006-42d1-b046-eba1b3010315}","prefs":[],"schema":1480349193877,"blockID":"i382","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844956","who":"All Firefox users who have this add-on installed. Those who wish to continue using it can enable it again in the Add-ons Manager.","why":"This add-on is silently installed, bypassing the Firefox opt-in screen and violating our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"appbario7","created":"2013-06-25T12:05:34Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2367bd94-2bdd-c615-de89-023ba071a443","last_modified":1480349213825},{"guid":"05dd836e-2cbd-4204-9ff3-2f8a8665967d@a8876730-fb0c-4057-a2fc-f9c09d438e81.com","prefs":[],"schema":1480349193877,"blockID":"i468","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935135","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be part of a <a href=\"https://www.drwebhk.com/en/virus_techinfo/Trojan.DownLoader9.50268.html\">Trojan software</a> package.","name":"Trojan.DownLoader9.50268 (malware)","created":"2013-11-07T14:43:39Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2fd53d9b-7096-f1fb-fbcb-2b40a6193894","last_modified":1480349213774},{"guid":"jid1-0xtMKhXFEs4jIg@jetpack","prefs":[],"schema":1480349193877,"blockID":"i586","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1011286","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware installed without user consent.","name":"ep (malware)","created":"2014-06-03T15:50:19Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"50ca2179-83ab-1817-163d-39ed2a9fbd28","last_modified":1480349213717},{"guid":"/^({16e193c8-1706-40bf-b6f3-91403a9a22be}|{284fed43-2e13-4afe-8aeb-50827d510e20}|{5e3cc5d8-ed11-4bed-bc47-35b4c4bc1033}|{7429e64a-1fd4-4112-a186-2b5630816b91}|{8c9980d7-0f09-4459-9197-99b3e559660c}|{8f1d9545-0bb9-4583-bb3c-5e1ac1e2920c})$/","prefs":[],"schema":1480349193877,"blockID":"i517","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947509","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing the add-on, and using multiple add-on IDs.","name":"Re-markit","created":"2013-12-20T12:54:33Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e88a28ab-5569-f06d-b0e2-15c51bb2a4b7","last_modified":1480349213344},{"guid":"safebrowse@safebrowse.co","prefs":[],"schema":1480349193877,"blockID":"i782","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1097696","who":"All Firefox users who have this add-on installed.","why":"This add-on loads scripts with malicious code that appears intended to steal usernames, passwords, and other private information.","name":"SafeBrowse","created":"2014-11-12T14:20:44Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"edd81c91-383b-f041-d8f6-d0b9a90230bd","last_modified":1480349213319},{"guid":"{af95cc15-3b9b-45ae-8d9b-98d08eda3111}","prefs":[],"schema":1480349193877,"blockID":"i492","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=945126","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Facebook (malware)","created":"2013-12-02T12:45:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7064e9e2-fba4-7b57-86d7-6f4afbf6f560","last_modified":1480349213294},{"guid":"{84a93d51-b7a9-431e-8ff8-d60e5d7f5df1}","prefs":[],"schema":1480349193877,"blockID":"i744","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080817","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on appears to be silently installed into users' systems, and changes settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Spigot Shopping Assistant","created":"2014-10-17T15:47:06Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dbc7ef8b-2c48-5dae-73a0-f87288c669f0","last_modified":1480349213264},{"guid":"{C3949AC2-4B17-43ee-B4F1-D26B9D42404D}","prefs":[],"schema":1480349193877,"blockID":"i918","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1170633","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-02T09:58:16Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"7f2a68f3-aa8a-ae41-1e48-d1f8f63d53c7","last_modified":1480349213231},{"guid":"831778-poidjao88DASfsAnindsd@jetpack","prefs":[],"schema":1480349193877,"blockID":"i972","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1190962","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Video patch (malware)","created":"2015-08-04T15:18:03Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"39471221-6926-e11b-175a-b28424d49bf6","last_modified":1480349213194},{"guid":"lbmsrvfvxcblvpane@lpaezhjez.org","prefs":[],"schema":1480349193877,"blockID":"i342","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=863385","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>. It also appears to install itself both locally and globally, producing a confusing uninstall experience.","name":"RapidFinda","created":"2013-05-06T16:18:14Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"98fb4536-07a4-d03a-f7c5-945acecc8203","last_modified":1480349213128},{"guid":"{babb9931-ad56-444c-b935-38bffe18ad26}","prefs":[],"schema":1480349193877,"blockID":"i499","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=946086","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Facebook Credits (malware)","created":"2013-12-04T15:22:02Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"be1d19fa-1662-322a-13e6-5fa5474f33a7","last_modified":1480349213100},{"guid":"{18d5a8fe-5428-485b-968f-b97b05a92b54}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i802","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080839","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astromenda Search Addon","created":"2014-12-15T10:52:49Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bc846147-cdc1-141f-5846-b705c48bd6ed","last_modified":1480349213074},{"guid":"{b6ef1336-69bb-45b6-8cba-e578fc0e4433}","prefs":[],"schema":1480349193877,"blockID":"i780","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Power-SW","created":"2014-11-12T14:00:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3b080157-2900-d071-60fe-52b0aa376cf0","last_modified":1480349213024},{"guid":"info@wxdownloadmanager.com","prefs":[],"schema":1480349193877,"blockID":"i196","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806451","who":"All Firefox users who have these add-ons installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Codec (malware)","created":"2012-11-05T09:24:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b62597d0-d2cb-d597-7358-5143a1d13658","last_modified":1480349212999},{"os":"WINNT","guid":"{C3949AC2-4B17-43ee-B4F1-D26B9D42404D}","prefs":[],"schema":1480349193877,"blockID":"i111","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=771802","who":"All Firefox users on Windows who have the RealPlayer Browser Record extension installed.","why":"The RealPlayer Browser Record extension is causing significant problems on Flash video sites like YouTube. This block automatically disables the add-on, but users can re-enable it from the Add-ons Manager if necessary.\r\n\r\nThis block shouldn't disable any other RealPlayer plugins, so watching RealPlayer content on the web should be unaffected.\r\n\r\nIf you still have problems playing videos on YouTube or elsewhere, please visit our <a href=\"http://support.mozilla.com/\">support site</a> for help.","name":"RealPlayer Browser Record Plugin","created":"2012-07-10T15:28:16Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"15.0.5","minVersion":"0","targetApplication":[]}],"id":"d3f96257-7635-555f-ef48-34d426322992","last_modified":1480349212971},{"guid":"l@AdLJ7uz.net","prefs":["browser.startup.homepage"],"schema":1480349193877,"blockID":"i728","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes user settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>","name":"GGoSavee","created":"2014-10-16T16:34:54Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e6bfa340-7d8a-1627-5cdf-40c0c4982e9d","last_modified":1480349212911},{"guid":"{6b2a75c8-6e2e-4267-b955-43e25b54e575}","prefs":[],"schema":1480349193877,"blockID":"i698","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1052611","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BrowserShield","created":"2014-08-21T15:46:31Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"492e4e43-f89f-da58-9c09-d99528ee9ca9","last_modified":1480349212871},{"guid":"/^({65f9f6b7-2dae-46fc-bfaf-f88e4af1beca}|{9ed31f84-c8b3-4926-b950-dff74047ff79}|{0134af61-7a0c-4649-aeca-90d776060cb3}|{02edb56b-9b33-435b-b7df-b2843273a694}|{da51d4f6-3e7e-4ef8-b400-9198e0874606}|{b24577db-155e-4077-bb37-3fdd3c302bb5})$/","prefs":[],"schema":1480349193877,"blockID":"i525","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949566","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and using multiple IDs.","name":"KeyBar add-on","created":"2013-12-20T14:11:14Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"78562d79-9a64-c259-fb63-ce24e29bb141","last_modified":1480349212839},{"guid":"adsremoval@adsremoval.net","prefs":[],"schema":1480349193877,"blockID":"i560","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=962793","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes various user settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Ad Removal","created":"2014-02-27T09:57:31Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4d150ad4-dc22-9790-07a9-36e0a23f857f","last_modified":1480349212798},{"guid":"firefoxaddon@youtubeenhancer.com","prefs":[],"schema":1480349193877,"blockID":"i445","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=911966","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that imitates a popular video downloader extension, and attempts to hijack Facebook accounts. The add-on available in the add-ons site is safe to use.","name":"YouTube Enhancer Plus (malware)","created":"2013-09-04T16:53:37Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"208.7.0","minVersion":"208.7.0","targetApplication":[]}],"id":"41d75d3f-a57e-d5ad-b95b-22f5fa010b4e","last_modified":1480349212747},{"guid":"{336D0C35-8A85-403a-B9D2-65C292C39087}","prefs":[],"schema":1480349193877,"blockID":"i224","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=812292","who":"All Firefox users who have this add-on installed.","why":"This add-on is side-installed with other software, and blocks setting reversions attempted by users who want to recover their settings after they are hijacked by other add-ons.","name":"IB Updater","created":"2012-11-29T16:22:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c87666e6-ec9a-2f1e-ad03-a722d2fa2a25","last_modified":1480349212655},{"guid":"G4Ce4@w.net","prefs":["browser.startup.homepage"],"schema":1480349193877,"blockID":"i718","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems and changes settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"YoutUbeAdBlaocke","created":"2014-10-02T12:21:22Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3e1e9322-93e9-4ce1-41f5-46ad4ef1471b","last_modified":1480349212277},{"guid":"extension@Fast_Free_Converter.com","prefs":[],"schema":1480349193877,"blockID":"i533","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949597","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing it.","name":"FastFreeConverter","created":"2013-12-20T15:04:18Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"726f5645-c0bf-66dc-a97a-d072b46e63e7","last_modified":1480349212247},{"guid":"@stopad","prefs":[],"schema":1480349193877,"blockID":"i1266","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1298780","who":"Users who have version 0.0.4 and earlier of the add-on installed.","why":"Stop Ads sends each visited url to a third party server which is not necessary for the add-on to work or disclosed in a privacy policy or user opt-in. Versions 0.0.4 and earlier are affected.","name":"Stop Ads Addon","created":"2016-08-30T12:24:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"0.0.4","minVersion":"0","targetApplication":[]}],"id":"3d1893dd-2092-d1f7-03f3-9629b7d7139e","last_modified":1480349212214},{"guid":"703db0db-5fe9-44b6-9f53-c6a91a0ad5bd@7314bc82-969e-4d2a-921b-e5edd0b02cf1.com","prefs":[],"schema":1480349193877,"blockID":"i519","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947509","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing the add-on, and using multiple add-on IDs.","name":"Re-markit","created":"2013-12-20T12:57:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a27d0f9f-7708-3d5f-82e1-e3f29e6098a0","last_modified":1480349212183},{"guid":"{13c9f1f9-2322-4d5c-81df-6d4bf8476ba4}","prefs":[],"schema":1480349193877,"blockID":"i348","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=867359","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>. It also fails to revert settings changes on removal.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"mywebsearch","created":"2013-05-08T15:55:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"372cf3df-0810-85d8-b5d7-faffff309a11","last_modified":1480349212102},{"guid":"{a6e67e6f-8615-4fe0-a599-34a73fc3fba5}","prefs":[],"schema":1480349193877,"blockID":"i346","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=867333","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>. Also, it doesn't reset its settings changes on uninstall.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Startnow","created":"2013-05-06T17:06:06Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1caf911c-ff2f-b0f6-0d32-29ef74be81bb","last_modified":1480349212077},{"guid":"9518042e-7ad6-4dac-b377-056e28d00c8f@f1cc0a13-4df1-4d66-938f-088db8838882.com","prefs":[],"schema":1480349193877,"blockID":"i308","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=846455","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed, bypassing our third-party opt-in screen, in violation of our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Solid Savings","created":"2013-02-28T13:48:32Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"df25ee07-74d4-ccd9-dbbe-7eb053015144","last_modified":1480349212020},{"guid":"jufa098j-LKooapd9jasJ9jliJsd@jetpack","prefs":[],"schema":1480349193877,"blockID":"i1000","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1201163","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Secure Video (malware)","created":"2015-09-07T14:00:20Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c3a98025-0f4e-3bb4-b475-97329e7b1426","last_modified":1480349211979},{"guid":"{46eddf51-a4f6-4476-8d6c-31c5187b2a2f}","prefs":[],"schema":1480349193877,"blockID":"i750","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963788","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Slick Savings","created":"2014-10-17T16:17:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9b4ef650-e1ad-d55f-c420-4f26dbb4139c","last_modified":1480349211953},{"guid":"{DAC3F861-B30D-40dd-9166-F4E75327FAC7}","prefs":[],"schema":1480349193877,"blockID":"i924","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1173154","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-09T15:28:17Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"be57998b-9e4d-1040-e6bb-ed9de056338d","last_modified":1480349211896},{"guid":"JMLv@njMaHh.org","prefs":[],"schema":1480349193877,"blockID":"i790","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1103516","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"YouttubeAdBlocke","created":"2014-11-24T14:14:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"070d5747-137d-8500-8713-cfc6437558a3","last_modified":1480349211841},{"guid":"istart_ffnt@gmail.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i888","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1152553","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-on Manager.","why":"This add-on appears to be malware, being silently installed and hijacking user settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Istart","created":"2015-04-10T16:27:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"32fad759-38d9-dad9-2295-e44cc6887040","last_modified":1480349211785},{"guid":"gystqfr@ylgga.com","prefs":[],"schema":1480349193877,"blockID":"i449","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=912742","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. It is installed bypassing the Firefox opt-in screen, and manipulates settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Define Ext","created":"2013-09-13T16:19:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8fe8f509-c530-777b-dccf-d10d58ae78cf","last_modified":1480349211748},{"guid":"e9d197d59f2f45f382b1aa5c14d82@8706aaed9b904554b5cb7984e9.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i844","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128324","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and attempts to change user settings like the home page and default search, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Sense","created":"2015-02-06T15:01:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f8f8695c-a356-a1d6-9291-502b377c63c2","last_modified":1480349211713},{"guid":"{184AA5E6-741D-464a-820E-94B3ABC2F3B4}","prefs":[],"schema":1480349193877,"blockID":"i968","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1164243","who":"All users who have this add-on installed.","why":"This is a malicious add-on that poses as a Java extension.","name":"Java String Helper (malware)","created":"2015-08-04T09:41:27Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fac1d2cb-eed7-fcef-5d5a-43c556371bd7","last_modified":1480349211687},{"guid":"7d51fb17-b199-4d8f-894e-decaff4fc36a@a298838b-7f50-4c7c-9277-df6abbd42a0c.com","prefs":[],"schema":1480349193877,"blockID":"i455","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=919792","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks Facebook accounts and posts spam to the users' friends.","name":"Video Console (malware)","created":"2013-09-25T10:28:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dd4d2e17-4ce6-36b0-3035-93e9cc5846d4","last_modified":1480349211660},{"guid":"prositez@prz.com","prefs":[],"schema":1480349193877,"blockID":"i764","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"ProfSitez","created":"2014-10-29T16:43:15Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"684ad4fd-2cbd-ce2a-34cd-bc66b20ac8af","last_modified":1480349211628},{"guid":"{25D77636-38B1-1260-887C-2D4AFA92D6A4}","prefs":[],"schema":1480349193877,"blockID":"i536","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=959279","who":"All Firefox users who have this extension installed.","why":"This is a malicious extension that is installed alongside a trojan. It hijacks searches on selected sites.","name":"Microsoft DirectInput Object (malware)","created":"2014-01-13T10:36:05Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cd174588-940e-f5b3-12ea-896c957bd4b3","last_modified":1480349211555},{"guid":"{badea1ae-72ed-4f6a-8c37-4db9a4ac7bc9}","prefs":[],"schema":1480349193877,"blockID":"i543","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963809","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enable it in the Add-ons Manager.","why":"This add-on is apparently malware that is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Address Bar Search","created":"2014-01-28T14:28:18Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8c1dd68e-7df6-0c37-2f41-107745a7be54","last_modified":1480349211119},{"guid":"{d87d56b2-1379-49f4-b081-af2850c79d8e}","prefs":[],"schema":1480349193877,"blockID":"i726","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080835","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Xplorer Lite","created":"2014-10-13T16:01:03Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7b0895b4-dd4f-1c91-f4e3-31afdbdf3178","last_modified":1480349211007},{"guid":"OKitSpace@OKitSpace.es","prefs":[],"schema":1480349193877,"blockID":"i469","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:35:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6a11aa68-0dae-5524-cc96-a5053a31c466","last_modified":1480349210982},{"guid":"{c96d1ae6-c4cf-4984-b110-f5f561b33b5a}","prefs":[],"schema":1480349193877,"blockID":"i808","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Better Web","created":"2014-12-19T09:36:52Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0413d46b-8205-d9e0-65df-4caa3e6355c4","last_modified":1480349210956},{"guid":"thefoxonlybetter@quicksaver","prefs":[],"schema":1480349193877,"blockID":"i706","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1053469","who":"All Firefox users who have any of these versions of the add-on installed.","why":"Certain versions of The Fox, Only Better weren't developed by the original developer, and are likely malicious in nature. This violates the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> for reusing an already existent ID.","name":"The Fox, Only Better (malicious versions)","created":"2014-08-27T14:50:32Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.6.160","minVersion":"1.6.160","targetApplication":[]}],"id":"bb2b2114-f8e7-511d-04dc-abc8366712cc","last_modified":1480349210859},{"guid":"CortonExt@ext.com","prefs":[],"schema":1480349193877,"blockID":"i336","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=864551","who":"All Firefox users who have this add-on installed.","why":"This add-on is reported to be installed without user consent, with a non-descriptive name, and ties a number of browser features to Amazon URLs, probably monetizing on affiliate codes.","name":"CortonExt","created":"2013-04-22T16:10:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a5bdd05d-eb4c-ce34-9909-a677b4322384","last_modified":1480349210805},{"guid":"1chtw@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i430","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=901770","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that uses a deceptive name and hijacks social networks.","name":" Mozilla Service Pack (malware)","created":"2013-08-05T16:42:24Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bf1e31c7-ba50-1075-29ae-47368ac1d6de","last_modified":1480349210773},{"guid":"lrcsTube@hansanddeta.com","prefs":[],"schema":1480349193877,"blockID":"i344","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=866944","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"LyricsTube","created":"2013-05-06T16:44:04Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"424b9f39-d028-b1fb-d011-d8ffbbd20fe9","last_modified":1480349210718},{"guid":"{341f4dac-1966-47ff-aacf-0ce175f1498a}","prefs":[],"schema":1480349193877,"blockID":"i356","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=868129","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"MyFreeGames","created":"2013-05-23T14:45:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"560e08b1-3471-ad34-8ca9-463f5ca5328c","last_modified":1480349210665},{"guid":"/^({d6e79525-4524-4707-9b97-1d70df8e7e59}|{ddb4644d-1a37-4e6d-8b6e-8e35e2a8ea6c}|{e55007f4-80c5-418e-ac33-10c4d60db01e}|{e77d8ca6-3a60-4ae9-8461-53b22fa3125b}|{e89a62b7-248e-492f-9715-43bf8c507a2f}|{5ce3e0cb-aa83-45cb-a7da-a2684f05b8f3})$/","prefs":[],"schema":1480349193877,"blockID":"i518","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947509","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing the add-on, and using multiple add-on IDs.","name":"Re-markit","created":"2013-12-20T12:56:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"145b0f22-501e-39eb-371e-ec8342a5add9","last_modified":1480349210606},{"guid":"{72b98dbc-939a-4e0e-b5a9-9fdbf75963ef}","prefs":[],"schema":1480349193877,"blockID":"i772","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SitezExpert","created":"2014-10-31T16:15:26Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"386cb2c9-e674-ce2e-345f-d30a785f90c5","last_modified":1480349210536},{"guid":"hha8771ui3-Fo9j9h7aH98jsdfa8sda@jetpack","prefs":[],"schema":1480349193877,"blockID":"i970","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1190963","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Video fix (malware)","created":"2015-08-04T15:15:07Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3ca577d8-3685-4ba9-363b-5b2d8d8dd608","last_modified":1480349210477},{"guid":"{7e8a1050-cf67-4575-92df-dcc60e7d952d}","prefs":[],"schema":1480349193877,"blockID":"i478","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935796","who":"All Firefox users who have this add-on installed.","why":"This add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"SweetPacks","created":"2013-11-08T15:42:28Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1519eb45-fcaa-b531-490d-fe366490ed45","last_modified":1480349210416},{"guid":"/^({66b103a7-d772-4fcd-ace4-16f79a9056e0}|{6926c7f7-6006-42d1-b046-eba1b3010315}|{72cabc40-64b2-46ed-8648-26d831761150}|{73ee2cf2-7b76-4c49-b659-c3d8cf30825d}|{ca6446a5-73d5-4c35-8aa1-c71dc1024a18}|{5373a31d-9410-45e2-b299-4f61428f0be4})$/","prefs":[],"schema":1480349193877,"blockID":"i521","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947485","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed and using multiple add-on IDs.","name":"appbario7","created":"2013-12-20T13:14:29Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"983cb7fe-e0b4-6a2e-f174-d2670876b2cd","last_modified":1480349210351},{"guid":"{dd6b651f-dfb9-4142-b0bd-09912ad22674}","prefs":[],"schema":1480349193877,"blockID":"i400","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835678","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This group of add-ons is silently installed, bypassing our install opt-in screen. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Searchqu","created":"2013-06-25T15:16:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"975d2126-f727-f5b9-ca01-b83345b80c56","last_modified":1480349210301},{"guid":"25p@9eAkaLq.net","prefs":["browser.startup.homepage"],"schema":1480349193877,"blockID":"i730","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes user settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>\r\n","name":"YYOutoubeAdBlocke","created":"2014-10-16T16:35:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5a0c5818-693f-43ae-f85a-c6928d9c2cc4","last_modified":1480349210275},{"guid":"tmbepff@trendmicro.com","prefs":[],"schema":1480349193877,"blockID":"i1222","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1275245","who":"All users of this add-on. If you wish to continue using it, you can enable it in the Add-ons Manager.","why":"Add-on is causing a high-frequency crash in Firefox","name":"Trend Micro BEP 9.1.0.1035 and lower","created":"2016-05-24T12:10:34Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"9.1.0.1035","minVersion":"0","targetApplication":[]}],"id":"8045c799-486a-927c-b972-b9da1c2dab2f","last_modified":1480349209818},{"guid":"pricepeep@getpricepeep.com","prefs":[],"schema":1480349193877,"blockID":"i220","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=811433","who":"All Firefox users who have Pricepeed below 2.1.0.20 installed.","why":"Versions older than 2.1.0.20 of the PricePeep add-on were silently side-installed with other software, injecting advertisements in Firefox. Versions 2.1.0.20 and above don't have the install problems are not blocked.","name":"PricePeep","created":"2012-11-29T16:18:26Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"2.1.0.19.99","minVersion":"0","targetApplication":[]}],"id":"227b9a8d-c18d-239c-135e-d79e614fe392","last_modified":1480349209794},{"guid":"hoverst@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i498","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=946029","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Adobe Flash Player (malware)","created":"2013-12-04T15:17:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2b25ba3e-45db-0e6c-965a-3acda1a44117","last_modified":1480349209745},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i606","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:20:07Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.13.*","minVersion":"3.15.13","targetApplication":[]}],"id":"c3d88e22-386a-da3b-8aba-3cb526e08053","last_modified":1480349209713},{"guid":"advance@windowsclient.com","prefs":[],"schema":1480349193877,"blockID":"i508","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=950773","who":"All Firefox users who have this add-on installed.","why":"This is not the <a href=\"https://addons.mozilla.org/addon/microsoft-net-framework-assist/\">Microsoft .NET Framework Assistant</a> created and distributed by Microsoft. It is a malicious extension that is distributed under the same name to trick users into installing it, and turns users into a botnet that conducts SQL injection attacks on visited websites.","name":"Microsoft .NET Framework Assistant (malware)","created":"2013-12-16T10:15:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e5d30a74-732e-c3fa-f13b-097ee28d4b27","last_modified":1480349209674},{"guid":"{5eeb83d0-96ea-4249-942c-beead6847053}","prefs":[],"schema":1480349193877,"blockID":"i756","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080846","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SmarterPower","created":"2014-10-17T16:30:30Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e101dbc0-190c-f6d8-e168-0c1380581cc9","last_modified":1480349209625},{"guid":"/^({7e8a1050-cf67-4575-92df-dcc60e7d952d}|{b3420a9c-a397-4409-b90d-bcf22da1a08a}|{eca6641f-2176-42ba-bdbe-f3e327f8e0af}|{707dca12-3f99-4d94-afea-06dcc0ae0108}|{aea20431-87fc-40be-bc5b-18066fe2819c}|{30ee6676-1ba6-455a-a7e8-298fa863a546})$/","prefs":[],"schema":1480349193877,"blockID":"i523","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947481","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted.","name":"SweetPacks","created":"2013-12-20T13:42:15Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a3a6bc8e-46a1-b3d5-1b20-58b90ba099c3","last_modified":1480349209559},{"guid":"{e0352044-1439-48ba-99b6-b05ed1a4d2de}","prefs":[],"schema":1480349193877,"blockID":"i710","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Site Counselor","created":"2014-09-30T15:28:14Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b8fedf07-dcaf-f0e3-b42b-32db75c4c304","last_modified":1480349209491},{"guid":"addlyrics@addlyrics.net","prefs":[],"schema":1480349193877,"blockID":"i426","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=891605","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Add Lyrics","created":"2013-07-09T15:25:30Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"81678e9e-ebf0-47d6-e409-085c25e67c7e","last_modified":1480349209383},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i610","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:21:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.22.*","minVersion":"3.15.22","targetApplication":[]}],"id":"935dfec3-d017-5660-db5b-94ae7cea6e5f","last_modified":1480349209128},{"guid":"info@allpremiumplay.info","prefs":[],"schema":1480349193877,"blockID":"i163","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806451","who":"All Firefox users who have these add-ons installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Codec-C (malware)","created":"2012-10-29T16:40:07Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6afbf9b8-ae3a-6a48-0f6c-7a3e065ec043","last_modified":1480349209076},{"guid":"now.msn.com@services.mozilla.org","prefs":[],"schema":1480349193877,"blockID":"i490","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=926378","who":"All Firefox users who have this add-on installed.","why":"As part of their ongoing work to fine-tune their editorial mix, msnNOW has decided that msnNOW will stop publishing on Dec. 3, 2013. Rather than having a single home for trending content, they will continue integrating that material throughout all MSN channels. A big thank you to everyone who followed msnNOW stories using the Firefox sidebar","name":"MSNNow (discontinued social provider)","created":"2013-11-27T08:06:04Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"de7d699d-016d-d973-5e39-52568de6ffde","last_modified":1480349209021},{"guid":"fftoolbar2014@etech.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i858","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1131078","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and changes users' settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"FF Toolbar","created":"2015-02-11T15:32:36Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6877bf40-9e45-7017-4dac-14d09e7f0ef6","last_modified":1480349208988},{"guid":"mbrnovone@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i477","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=936249","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Mozilla Security Service (malware)","created":"2013-11-08T15:35:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"758c2503-766d-a2f5-4c58-7cea93acfe05","last_modified":1480349208962},{"guid":"{739df940-c5ee-4bab-9d7e-270894ae687a}","prefs":[],"schema":1480349193877,"blockID":"i530","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949558","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted.","name":"WhiteSmoke New","created":"2013-12-20T14:49:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f8097aa6-3009-6dfc-59df-353ba6b1142b","last_modified":1480349208933},{"guid":"firefoxaddon@youtubeenhancer.com","prefs":[],"schema":1480349193877,"blockID":"i636","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1033120","who":"All Firefox users who have this version of the add-on installed.","why":"Version 199.7.0 of the YoutubeEnhancer extension isn't developed by the original developer, and is likely malicious in nature. It violates the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> for reusing an already existent ID.","name":"YoutubeEnhancer - Firefox","created":"2014-07-08T15:58:12Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"199.7.0","minVersion":"199.7.0","targetApplication":[]}],"id":"204a074b-da87-2784-f15b-43a9ea9a6b36","last_modified":1480349208851},{"guid":"extacylife@a.com","prefs":[],"schema":1480349193877,"blockID":"i505","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947741","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks users' Facebook accounts.","name":"Facebook Haber (malware)","created":"2013-12-09T15:08:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5acadb8d-d3be-e0e0-4656-9107f9de0ea9","last_modified":1480349208823},{"guid":"{746505DC-0E21-4667-97F8-72EA6BCF5EEF}","prefs":[],"schema":1480349193877,"blockID":"i842","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128325","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Shopper-Pro","created":"2015-02-06T14:45:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5f19c5fb-1c78-cbd6-8a03-1678efb54cbc","last_modified":1480349208766},{"guid":"{51c77233-c0ad-4220-8388-47c11c18b355}","prefs":[],"schema":1480349193877,"blockID":"i580","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1004132","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, it can be enabled in the Add-ons Manager.","why":"This add-on is silently installed into Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Browser Utility","created":"2014-04-30T13:55:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"0.1.9999999","minVersion":"0","targetApplication":[]}],"id":"daa2c60a-5009-2c65-a432-161d50bef481","last_modified":1480349208691},{"guid":"{a2bfe612-4cf5-48ea-907c-f3fb25bc9d6b}","prefs":[],"schema":1480349193877,"blockID":"i712","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Xplorer","created":"2014-09-30T15:28:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"13450534-93d7-f2a2-7f0a-e4e3948c4dc1","last_modified":1480349208027},{"guid":"ScorpionSaver@jetpack","prefs":[],"schema":1480349193877,"blockID":"i539","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963826","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enable it in the Add-ons Manager.","why":"This add-on is being silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>","name":"ScorpionSaver","created":"2014-01-28T14:00:30Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3499c968-6e8b-37f1-5f6e-2384807c2a6d","last_modified":1480349207972},{"guid":"{D19CA586-DD6C-4a0a-96F8-14644F340D60}","prefs":[],"schema":1480349193877,"blockID":"i42","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=690184","who":"Users of McAfee ScriptScan versions 14.4.0 and below for all versions of Firefox and SeaMonkey.","why":"This add-on causes a high volume of crashes.","name":"McAfee ScriptScan","created":"2011-10-03T09:38:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"14.4.0","minVersion":"0.1","targetApplication":[]}],"id":"1d35ac9d-49df-23cf-51f5-f3c228ad0dc9","last_modified":1480349207877},{"guid":"gjhrjenrengoe@jfdnkwelfwkm.com","prefs":[],"schema":1480349193877,"blockID":"i1042","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1212174","who":"All users who have this add-on installed.","why":"This is a malicious add-on that takes over Facebook accounts.","name":"Avant Player (malware)","created":"2015-10-07T13:12:54Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d6453893-becc-7617-2050-0db284e0e0db","last_modified":1480349207840},{"guid":"{33e0daa6-3af3-d8b5-6752-10e949c61516}","prefs":[],"schema":1480349193877,"blockID":"i282","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835683","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on violates our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">add-on guidelines</a>, bypassing the third party opt-in screen.","name":"Complitly","created":"2013-02-15T12:19:26Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.1.999","minVersion":"0","targetApplication":[]}],"id":"1f94bc8d-9d5f-c8f5-45c0-ad1f6e147c71","last_modified":1480349207789},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i608","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:20:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.20.*","minVersion":"3.15.18","targetApplication":[]}],"id":"e7d50ff2-5948-d571-6711-37908ccb863f","last_modified":1480349207761},{"guid":"{63eb5ed4-e1b3-47ec-a253-f8462f205350}","prefs":[],"schema":1480349193877,"blockID":"i786","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"FF-Plugin","created":"2014-11-18T12:33:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ca4558a2-8ce4-3ca0-3d29-63019f680c8c","last_modified":1480349207705},{"guid":"jid1-4vUehhSALFNqCw@jetpack","prefs":[],"schema":1480349193877,"blockID":"i634","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1033002","who":"All Firefox users who have this version of the add-on installed.","why":"Version 99.7 of the YouTube Plus Plus extension isn't developed by the original developer, and is likely malicious in nature. It violates the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> for reusing an already existent ID.","name":"YouTube Plus Plus 99.7","created":"2014-07-04T14:13:57Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"99.7","minVersion":"99.7","targetApplication":[]}],"id":"a6d017cb-e33f-2239-4e42-ab4e7cfb19fe","last_modified":1480349207680},{"guid":"{aab02ab1-33cf-4dfa-8a9f-f4e60e976d27}","prefs":[],"schema":1480349193877,"blockID":"i820","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems without their consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Incredible Web","created":"2015-01-13T09:27:49Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"847ecc6e-1bc1-f7ff-e1d5-a76e6b8447d2","last_modified":1480349207654},{"guid":"torntv@torntv.com","prefs":[],"schema":1480349193877,"blockID":"i320","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=845610","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"TornTV","created":"2013-03-20T16:35:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cdd492b8-8101-74a9-5760-52ff709fd445","last_modified":1480349207608},{"guid":"crossriderapp12555@crossrider.com","prefs":[],"schema":1480349193877,"blockID":"i674","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=877836","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"The add-on is silently installed, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"JollyWallet","created":"2014-07-22T16:26:19Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d4467e20-0f71-f0e0-8cd6-40c82b6c7379","last_modified":1480349207561},{"guid":"344141-fasf9jas08hasoiesj9ia8ws@jetpack","prefs":[],"schema":1480349193877,"blockID":"i1038","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1211169","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Video Plugin (malware)","created":"2015-10-05T16:42:09Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f7986b7b-9b5a-d372-8147-8b4bd6f5a29b","last_modified":1480349207485},{"guid":"meOYKQEbBBjH5Ml91z0p9Aosgus8P55bjTa4KPfl@jetpack","prefs":[],"schema":1480349193877,"blockID":"i998","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1201164","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Smooth Player (malware)","created":"2015-09-07T13:54:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"30c3e511-9e8d-15ee-0867-d61047e56515","last_modified":1480349207370},{"guid":"{8dc5c42e-9204-2a64-8b97-fa94ff8a241f}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i770","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1088726","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astrmenda Search","created":"2014-10-30T14:52:52Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8a9c7702-0349-70d6-e64e-3a666ab084c6","last_modified":1480349207320},{"guid":"savingsslider@mybrowserbar.com","prefs":[],"schema":1480349193877,"blockID":"i752","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963788","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Slick Savings","created":"2014-10-17T16:18:12Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9b1faf30-5725-7847-d993-b5cdaabc9829","last_modified":1480349207290},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i612","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:23:00Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.24.*","minVersion":"3.15.24","targetApplication":[]}],"id":"e0ff9df4-60e4-dbd0-8018-57f395e6610a","last_modified":1480349206818},{"guid":"{1e4ea5fc-09e5-4f45-a43b-c048304899fc}","prefs":[],"schema":1480349193877,"blockID":"i812","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Great Finder","created":"2015-01-06T13:22:39Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1ea40b9f-2423-a2fd-a5e9-4ec1df2715f4","last_modified":1480349206784},{"guid":"crossriderapp8812@crossrider.com","prefs":[],"schema":1480349193877,"blockID":"i314","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835665","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"Coupon Companion","created":"2013-03-06T14:14:51Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"06c07e28-0a34-e5ee-e724-491a2f6ce586","last_modified":1480349206708},{"guid":"/^(ffxtlbr@mixidj\\.com|{c0c2693d-2ee8-47b4-9df7-b67a0ee31988}|{67097627-fd8e-4f6b-af4b-ecb65e50112e}|{f6f0f973-a4a3-48cf-9a7a-b7a69c30d71a}|{a3d0e35f-f1da-4ccb-ae77-e9d27777e68d}|{1122b43d-30ee-403f-9bfa-3cc99b0caddd})$/","prefs":[],"schema":1480349193877,"blockID":"i540","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963819","who":"All Firefox users who have this add-on installed.","why":"This add-on has been repeatedly blocked before and keeps showing up with new add-on IDs, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"MixiDJ (malware)","created":"2014-01-28T14:07:56Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4c03ddda-bb3f-f097-0a7b-b7b77b050584","last_modified":1480349206678},{"guid":"hansin@topvest.id","prefs":[],"schema":1480349193877,"blockID":"i836","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1130406","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Inside News (malware)","created":"2015-02-06T14:17:39Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0945a657-f28d-a02c-01b2-5115b3f90d7a","last_modified":1480349206628},{"guid":"lfind@nijadsoft.net","prefs":[],"schema":1480349193877,"blockID":"i358","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=874131","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Lyrics Finder","created":"2013-05-24T14:09:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2307f11c-6216-0dbf-a464-b2921055ce2b","last_modified":1480349206603},{"guid":"plugin@getwebcake.com","prefs":[],"schema":1480349193877,"blockID":"i484","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=938264","who":"All Firefox users who have this add-on installed.","why":"This add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> and is broadly considered to be malware. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"WebCake","created":"2013-11-14T09:55:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2865addd-da1c-20c4-742f-6a2270da2e78","last_modified":1480349206578},{"guid":"{c0c2693d-2ee8-47b4-9df7-b67a0ee31988}","prefs":[],"schema":1480349193877,"blockID":"i354","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=837838","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Mixi DJ","created":"2013-05-23T14:31:21Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"03a745c3-0ee7-e262-ba31-62d4f78ddb62","last_modified":1480349206525},{"guid":"/^({7316e43a-3ebd-4bb4-95c1-9caf6756c97f}|{0cc09160-108c-4759-bab1-5c12c216e005}|{ef03e721-f564-4333-a331-d4062cee6f2b}|{465fcfbb-47a4-4866-a5d5-d12f9a77da00}|{7557724b-30a9-42a4-98eb-77fcb0fd1be3}|{b7c7d4b0-7a84-4b73-a7ef-48ef59a52c3b})$/","prefs":[],"schema":1480349193877,"blockID":"i520","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947485","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed and using multiple add-on IDs.","name":"appbario7","created":"2013-12-20T13:11:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e3901c48-9c06-fecb-87d3-efffd9940c22","last_modified":1480349206491},{"guid":"{354dbb0a-71d5-4e9f-9c02-6c88b9d387ba}","prefs":[],"schema":1480349193877,"blockID":"i538","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=964081","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Show Mask ON (malware)","created":"2014-01-27T10:13:17Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"aad90253-8921-b5df-3658-45a70d75f3d7","last_modified":1480349206465},{"guid":"{8E9E3331-D360-4f87-8803-52DE43566502}","prefs":[],"schema":1480349193877,"blockID":"i461","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=906071","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This is a companion add-on for the SweetPacks Toolbar which is <a href=\"https://addons.mozilla.org/firefox/blocked/i392\">blocked</a> due to guideline violations.","name":"Updater By SweetPacks","created":"2013-10-17T16:10:51Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ae8cca6e-4258-545f-9a69-3d908264a701","last_modified":1480349206437},{"guid":"info@bflix.info","prefs":[],"schema":1480349193877,"blockID":"i172","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806802","who":"All Firefox users who have this add-on installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Bflix (malware)","created":"2012-10-30T13:39:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7a9062f4-218d-51d2-9b8c-b282e6eada4f","last_modified":1480349206384},{"guid":"{dff137ae-1ffd-11e3-8277-b8ac6f996f26}","prefs":[],"schema":1480349193877,"blockID":"i450","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=917861","who":"All Firefox users who have this add-on installed.","why":"This is add-on is malware that silently redirects popular search queries to a third party.","name":"Addons Engine (malware)","created":"2013-09-18T16:19:34Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8e583fe4-1c09-9bea-2473-faecf3260685","last_modified":1480349206312},{"guid":"12x3q@3244516.com","prefs":[],"schema":1480349193877,"blockID":"i493","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=939254","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware and is installed silently in violation of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BetterSurf (malware)","created":"2013-12-02T12:49:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"af2a9e74-3753-9ff1-d899-5d1e79ed3dce","last_modified":1480349206286},{"guid":"{20AD702C-661E-4534-8CE9-BA4EC9AD6ECC}","prefs":[],"schema":1480349193877,"blockID":"i626","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1027886","who":"All Firefox users who have this add-on installed.","why":"This add-on is probably silently installed, and is causing significant stability issues for users, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"V-Bates","created":"2014-06-19T15:16:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9b9ccabe-8f9a-e3d1-a689-1aefba1f33b6","last_modified":1480349206261},{"guid":"{c5e48979-bd7f-4cf7-9b73-2482a67a4f37}","prefs":[],"schema":1480349193877,"blockID":"i736","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080842","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"ClearThink","created":"2014-10-17T15:22:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6e8b3e4f-2f59-cde3-e6d2-5bc6e216c506","last_modified":1480349206231},{"guid":"{41339ee8-61ed-489d-b049-01e41fd5d7e0}","prefs":[],"schema":1480349193877,"blockID":"i810","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"FireWeb","created":"2014-12-23T10:32:26Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a35f2ca6-aec4-c01d-170e-650258ebcd2c","last_modified":1480349206165},{"guid":"{845cab51-d8d2-472f-8bd9-2b44642d97c2}","prefs":[],"schema":1480349193877,"blockID":"i460","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=927456","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and handles users' settings, violating some of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Vafmusic9","created":"2013-10-17T15:50:38Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8538ccb4-3b71-9858-3f6d-c0fff7af58b0","last_modified":1480349205746},{"guid":"SpecialSavings@SpecialSavings.com","prefs":[],"schema":1480349193877,"blockID":"i676","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=881511","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This is add-on is generally considered to be unwanted and is probably silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SpecialSavings","created":"2014-07-22T16:31:56Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5e921810-fc3a-0729-6749-47e38ad10a22","last_modified":1480349205688},{"guid":"afurladvisor@anchorfree.com","prefs":[],"schema":1480349193877,"blockID":"i434","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844945","who":"All Firefox users who have this add-on installed.","why":"This add-on bypasses the external install opt in screen in Firefox, violating the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Hotspot Shield Helper","created":"2013-08-09T11:26:11Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"083585eb-d7e7-e228-5fbf-bf35c52044e4","last_modified":1480349205645},{"guid":"info@thebflix.com","prefs":[],"schema":1480349193877,"blockID":"i174","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806802","who":"All Firefox users who have these add-ons installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Bflix (malware)","created":"2012-10-30T13:40:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"811a61d4-9435-133e-6262-fb72486c36b0","last_modified":1480349205526},{"guid":"{EEE6C361-6118-11DC-9C72-001320C79847}","prefs":[],"schema":1480349193877,"blockID":"i392","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=881447","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on changes search settings without user interaction, and fails to reset them after it is removed. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SweetPacks Toolbar","created":"2013-06-25T12:38:45Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c1dc6607-4c0a-4031-9f14-70ef1ae1edcb","last_modified":1480349205455},{"guid":"/^(4cb61367-efbf-4aa1-8e3a-7f776c9d5763@cdece6e9-b2ef-40a9-b178-291da9870c59\\.com|0efc9c38-1ec7-49ed-8915-53a48b6b7600@e7f17679-2a42-4659-83c5-7ba961fdf75a\\.com|6be3335b-ef79-4b0b-a0ba-b87afbc6f4ad@6bbb4d2e-e33e-4fa5-9b37-934f4fb50182\\.com)$/","prefs":[],"schema":1480349193877,"blockID":"i531","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949672","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and using multiple IDs.","name":"Feven","created":"2013-12-20T15:01:22Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"46aa79a9-d329-f713-d4f2-07d31fe7071e","last_modified":1480349205287},{"guid":"afext@anchorfree.com","prefs":[],"schema":1480349193877,"blockID":"i466","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=933988","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't respect user choice, violating the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Hotspot Shield Extension","created":"2013-11-07T13:32:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8176f879-bd73-5468-e908-2d7cfc115ac2","last_modified":1480349205108},{"guid":"{FCE04E1F-9378-4f39-96F6-5689A9159E45}","prefs":[],"schema":1480349193877,"blockID":"i920","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1173154","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-09T15:26:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"eb191ff0-20f4-6e04-4344-d880af4faf51","last_modified":1480349204978},{"guid":"{9CE11043-9A15-4207-A565-0C94C42D590D}","prefs":[],"schema":1480349193877,"blockID":"i503","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947384","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that uses a deceptive name to stay in users' systems.","name":"XUL Cache (malware)","created":"2013-12-06T11:58:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dcdae267-8d3a-5671-dff2-f960febbbb20","last_modified":1480349204951},{"guid":"{0153E448-190B-4987-BDE1-F256CADA672F}","prefs":[],"schema":1480349193877,"blockID":"i914","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1170633","who":"All Firefox users who have this add-on installed in Firefox 39 and above.","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.","name":"RealPlayer Browser Record Plugin","created":"2015-06-02T09:56:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"2bfe0d89-e458-9d0e-f944-ddeaf8c4db6c","last_modified":1480349204871},{"guid":"{77beece6-3997-403a-92fa-0055bfcf88e5}","prefs":[],"schema":1480349193877,"blockID":"i452","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=916966","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, manipulating settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Entrusted11","created":"2013-09-18T16:34:58Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d348f91f-caeb-a803-dfd9-fd5d285aa0fa","last_modified":1480349204844},{"guid":"dealcabby@jetpack","prefs":[],"schema":1480349193877,"blockID":"i222","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=811435","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently side-installed with other software, injecting advertisements in Firefox.","name":"DealCabby","created":"2012-11-29T16:20:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6585f0bd-4f66-71e8-c565-d9762c5c084a","last_modified":1480349204818},{"guid":"{3c9a72a0-b849-40f3-8c84-219109c27554}","prefs":[],"schema":1480349193877,"blockID":"i510","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=951301","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks users' Facebook accounts.","name":"Facebook Haber (malware)","created":"2013-12-17T14:27:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7cfa3d0b-0ab2-5e3a-8143-1031c180e32f","last_modified":1480349204778},{"guid":"{2aab351c-ad56-444c-b935-38bffe18ad26}","prefs":[],"schema":1480349193877,"blockID":"i500","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=946087","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Adobe Photo (malware)","created":"2013-12-04T15:29:44Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f7a76d34-ddcd-155e-9fae-5967bd796041","last_modified":1480349204716},{"guid":"{0A92F062-6AC6-8180-5881-B6E0C0DC2CC5}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i864","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1131220","who":"All users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems and makes unwanted settings changes, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BlockAndSurf","created":"2015-02-26T12:56:19Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"acb16d1c-6274-93a3-7c1c-7ed36ede64a9","last_modified":1480349204612},{"guid":"trackerbird@bustany.org","prefs":[],"schema":1480349193877,"blockID":"i986","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1189264","who":"All Thunderbird users who have this version of the add-on installed on Thunderbird 38.0a2 and above.","why":"This add-on is causing consistent crashes on Thunderbird 38.0a2 and above.","name":"trackerbird 1.2.6","created":"2015-08-17T15:56:04Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.2.6","minVersion":"1.2.6","targetApplication":[{"guid":"{3550f703-e582-4d05-9a08-453d09bdfdc6}","maxVersion":"*","minVersion":"38.0a2"}]}],"id":"bb1c699e-8790-4528-0b6d-4f83b7a3152d","last_modified":1480349204041},{"guid":"{0134af61-7a0c-4649-aeca-90d776060cb3}","prefs":[],"schema":1480349193877,"blockID":"i448","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=912746","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our Add-on Guidelines. It manipulates settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"KeyBar add-on","created":"2013-09-13T16:15:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cf428416-4974-8bb4-7928-c0cb2cfe7957","last_modified":1480349203968},{"guid":"/^(firefox@vebergreat\\.net|EFGLQA@78ETGYN-0W7FN789T87\\.COM)$/","prefs":[],"schema":1480349193877,"blockID":"i564","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=974104","who":"All Firefox users who have these add-ons installed. If you wish to continue using these add-ons, you can enable them in the Add-ons Manager.","why":"These add-ons are silently installed by the Free Driver Scout installer, in violation of our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"veberGreat and vis (Free Driver Scout bundle)","created":"2014-03-05T13:02:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"487538f1-698e-147e-6395-986759ceed7e","last_modified":1480349203902},{"guid":"69ffxtbr@PackageTracer_69.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i882","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1153001","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on appears to be malware, hijacking user's settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"PackageTracer","created":"2015-04-10T16:18:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0d37b4e0-3c60-fdad-dd8c-59baff6eae87","last_modified":1480349203836},{"guid":"{a9bb9fa0-4122-4c75-bd9a-bc27db3f9155}","prefs":[],"schema":1480349193877,"blockID":"i404","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835678","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This group of add-ons is silently installed, bypassing our install opt-in screen. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Searchqu","created":"2013-06-25T15:16:43Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fb7a1dc7-16a0-4f70-8289-4df494e0d0fa","last_modified":1480349203633},{"guid":"P2@D.edu","prefs":[],"schema":1480349193877,"blockID":"i850","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128269","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"unIsaless","created":"2015-02-09T15:29:21Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"49536a29-fc7e-9fd0-f415-e15ac090fa56","last_modified":1480349203605},{"guid":"linksicle@linksicle.com","prefs":[],"schema":1480349193877,"blockID":"i472","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9b5b15b3-6da7-cb7c-3c44-30b4fe079d52","last_modified":1480349203581},{"guid":"{377e5d4d-77e5-476a-8716-7e70a9272da0}","prefs":[],"schema":1480349193877,"blockID":"i398","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835678","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This group of add-ons is silently installed, bypassing our install opt-in screen. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Searchqu","created":"2013-06-25T15:15:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ea94df32-2a85-23da-43f7-3fc5714530ec","last_modified":1480349203519},{"guid":"{4933189D-C7F7-4C6E-834B-A29F087BFD23}","prefs":[],"schema":1480349193877,"blockID":"i437","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=900695","who":"All Firefox users.","why":"This add-on is widely reported to be malware.","name":"Win32.SMSWebalta (malware)","created":"2013-08-09T15:14:27Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cbef1357-d6bc-c8d3-7a82-44af6b1c390f","last_modified":1480349203486},{"guid":"{ADFA33FD-16F5-4355-8504-DF4D664CFE10}","prefs":[],"schema":1480349193877,"blockID":"i306","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844972","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed, bypassing our third-party opt-in screen, in violation of our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>. It's also possible that it changes user settings without their consent.","name":"Nation Toolbar","created":"2013-02-28T12:56:48Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"017fd151-37ca-4646-4763-1d303fb918fa","last_modified":1480349203460},{"guid":"detgdp@gmail.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i884","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1152614","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware, hijacking user settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Security Protection (malware)","created":"2015-04-10T16:21:34Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1b5cc88e-499d-2a47-d793-982d4c05e6ee","last_modified":1480349203433},{"guid":"/^(67314b39-24e6-4f05-99f3-3f88c7cddd17@6c5fa560-13a3-4d42-8e90-53d9930111f9\\.com|ffxtlbr@visualbee\\.com|{7aeae561-714b-45f6-ace3-4a8aed6e227b}|{7093ee04-f2e4-4637-a667-0f730797b3a0}|{53c4024f-5a2e-4f2a-b33e-e8784d730938})$/","prefs":[],"schema":1480349193877,"blockID":"i514","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947473","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by using multiple add-on IDs and making unwanted settings changes.","name":"VisualBee Toolbar","created":"2013-12-20T12:25:50Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5f91eee1-7303-3f97-dfe6-1e897a156c7f","last_modified":1480349203408},{"guid":"FXqG@xeeR.net","prefs":["browser.startup.homepage"],"schema":1480349193877,"blockID":"i720","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems and changes settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"GoSSave","created":"2014-10-02T12:23:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8ebbc061-a4ff-b75b-ec42-eb17c42a2956","last_modified":1480349203341},{"guid":"kallow@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i495","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=945426","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Facebook Security Service (malware)","created":"2013-12-02T15:09:42Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1a2c37a9-e7cc-2d03-2043-098d36b8aca2","last_modified":1480349203247},{"guid":"008abed2-b43a-46c9-9a5b-a771c87b82da@1ad61d53-2bdc-4484-a26b-b888ecae1906.com","prefs":[],"schema":1480349193877,"blockID":"i528","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949565","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed.","name":"weDownload Manager Pro","created":"2013-12-20T14:40:58Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"da46065f-1c68-78f7-80fc-8ae07b5df68d","last_modified":1480349203131},{"guid":"{25dd52dc-89a8-469d-9e8f-8d483095d1e8}","prefs":[],"schema":1480349193877,"blockID":"i714","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Web Counselor","created":"2014-10-01T15:36:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e46c31ad-0ab3-e48a-47aa-9fa91b675fda","last_modified":1480349203066},{"guid":"{B1FC07E1-E05B-4567-8891-E63FBE545BA8}","prefs":[],"schema":1480349193877,"blockID":"i926","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1173154","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-09T15:28:46Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"09868783-261a-ac24-059d-fc772218c1ba","last_modified":1480349202708},{"guid":"/^(torntv@torntv\\.com|trtv3@trtv\\.com|torntv2@torntv\\.com|e2fd07a6-e282-4f2e-8965-85565fcb6384@b69158e6-3c3b-476c-9d98-ae5838c5b707\\.com)$/","prefs":[],"schema":1480349193877,"blockID":"i529","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949559","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed.","name":"TornTV","created":"2013-12-20T14:46:03Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"040e5ec2-ea34-816a-f99f-93296ce845e8","last_modified":1480349202677},{"guid":"249911bc-d1bd-4d66-8c17-df533609e6d8@c76f3de9-939e-4922-b73c-5d7a3139375d.com","prefs":[],"schema":1480349193877,"blockID":"i532","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949672","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and using multiple IDs.","name":"Feven","created":"2013-12-20T15:02:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d32b850d-82d5-b63d-087c-fb2041b2c232","last_modified":1480349202631},{"guid":"{7D4F1959-3F72-49d5-8E59-F02F8AA6815D}","prefs":[],"schema":1480349193877,"blockID":"i394","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=881447","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This is a companion add-on for the SweetPacks Toolbar which <a href=\"https://addons.mozilla.org/en-US/firefox/blocked/i392\">is blocked</a> due to guideline violations.","name":"Updater By SweetPacks","created":"2013-06-25T12:40:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"851c2b8e-ea19-3a63-eac5-f931a8da5d6e","last_modified":1480349202341},{"guid":"g@uzcERQ6ko.net","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i776","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes user settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>","name":"GoSave","created":"2014-10-31T16:23:36Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ee1e1a44-b51b-9f12-819d-64c3e515a147","last_modified":1480349202307},{"guid":"ffxtlbr@incredibar.com","prefs":[],"schema":1480349193877,"blockID":"i318","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=812264","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"IncrediBar","created":"2013-03-20T14:40:32Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9e84b07c-84d5-c932-85f2-589713d7e380","last_modified":1480349202280},{"guid":"M1uwW0@47z8gRpK8sULXXLivB.com","prefs":[],"schema":1480349193877,"blockID":"i870","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1131159","who":"All users who have this add-on installed.","why":"This is a malicious add-on that goes by the the name \"Flash Player 11\".","name":"Flash Player 11 (malware)","created":"2015-03-04T14:34:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"71d961b2-37d1-d393-76f5-3afeef57e749","last_modified":1480349202252},{"guid":"4zffxtbr-bs@VideoDownloadConverter_4z.com","prefs":[],"schema":1480349193877,"blockID":"i507","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949266","who":"All Firefox users who have this add-on installed.","why":"Certain versions of this add-on contains an executable that is flagged by multiple tools as malware. Newer versions no longer use it.","name":"VideoDownloadConverter","created":"2013-12-12T15:37:23Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"5.75.3.25126","minVersion":"0","targetApplication":[]}],"id":"0a0f106a-ecc6-c537-1818-b36934943e91","last_modified":1480349202156},{"guid":"contato@facefollow.net","prefs":[],"schema":1480349193877,"blockID":"i509","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=950846","who":"All Firefox users who have this add-on installed.","why":"This add-on spams users' Facebook accounts.","name":"Face follow","created":"2013-12-16T16:15:15Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"56f15747-af8c-342c-6877-a41eeacded84","last_modified":1480349202067},{"guid":"/^({83a8ce1b-683c-4784-b86d-9eb601b59f38}|{ef1feedd-d8da-4930-96f1-0a1a598375c6}|{79ff1aae-701f-4ca5-aea3-74b3eac6f01b}|{8a184644-a171-4b05-bc9a-28d75ffc9505}|{bc09c55d-0375-4dcc-836e-0e3c8addfbda}|{cef81415-2059-4dd5-9829-1aef3cf27f4f})$/","prefs":[],"schema":1480349193877,"blockID":"i526","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949566","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and uses multiple IDs.","name":"KeyBar add-on","created":"2013-12-20T14:12:31Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9dfa4e92-bbf2-66d1-59a9-51402d1d226c","last_modified":1480349202010},{"guid":"{f2548724-373f-45fe-be6a-3a85e87b7711}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i768","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1088726","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astro New Tab","created":"2014-10-30T14:52:09Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8510e9e2-c7d8-90d0-a2ff-eb09293acc6e","last_modified":1480349201854},{"guid":"KSqOiTeSJEDZtTGuvc18PdPmYodROmYzfpoyiCr2@jetpack","prefs":[],"schema":1480349193877,"blockID":"i1032","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1211172","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Video Player (malware)","created":"2015-10-05T16:22:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3d9188ac-235f-773a-52a2-261b3ea9c03c","last_modified":1480349201504},{"guid":"{849ded12-59e9-4dae-8f86-918b70d213dc}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i708","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1047102","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes homepage and search settings without the user's consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astromenda New Tab","created":"2014-09-02T16:29:08Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a319bfee-464f-1c33-61ad-738c52842fbd","last_modified":1480349201453},{"guid":"grjkntbhr@hgergerherg.com","prefs":[],"schema":1480349193877,"blockID":"i1018","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1208196","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"GreenPlayer (malware)","created":"2015-09-24T16:04:53Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9c47d940-bdd9-729f-e32e-1774d87f24b5","last_modified":1480349201425},{"guid":"{EEF73632-A085-4fd3-A778-ECD82C8CB297}","prefs":[],"schema":1480349193877,"blockID":"i165","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806451","who":"All Firefox users who have these add-ons installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Codec-M (malware)","created":"2012-10-29T16:41:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e5ecd02a-20ee-749b-d5cf-3d74d1173a1f","last_modified":1480349201262},{"guid":"firefox-extension@mozilla.org","prefs":[],"schema":1480349193877,"blockID":"i688","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1049533","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hides itself under the name Java_plugin, among others.","name":"FinFisher (malware)","created":"2014-08-06T17:13:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"98aca74a-69c7-9960-cccc-096a4a4adc6c","last_modified":1480349201235},{"guid":"{e44a1809-4d10-4ab8-b343-3326b64c7cdd}","prefs":[],"schema":1480349193877,"blockID":"i451","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=916966","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, manipulating settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Entrusted","created":"2013-09-18T16:33:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ad5f53ed-7a43-cb1f-cbd7-41808fac1791","last_modified":1480349201128},{"guid":"{21EAF666-26B3-4A3C-ABD0-CA2F5A326744}","prefs":[],"schema":1480349193877,"blockID":"i620","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024752","who":"All Firefox users who have this add-on installed.","why":"This add-on is probably silently installed, and is causing significant stability issues for users, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"V-Bates","created":"2014-06-12T15:27:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2d8833db-01a7-a758-080f-19e47abc54cb","last_modified":1480349201096},{"guid":"{1FD91A9C-410C-4090-BBCC-55D3450EF433}","prefs":[],"schema":1480349193877,"blockID":"i338","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844979","who":"All Firefox users who have this add-on installed.","why":"This extension overrides search settings, and monitors any further changes done to them so that they can be reverted. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">add-on guidelines</a>.","name":"DataMngr (malware)","created":"2013-04-24T11:30:28Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2e35995f-bec6-aa2b-3372-346d3325f72e","last_modified":1480349201059},{"guid":"9598582LLKmjasieijkaslesae@jetpack","prefs":[],"schema":1480349193877,"blockID":"i996","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1201165","who":"All users who have this add-on installed.","why":"This is a malicious add-on that takes over Facebook accounts.","name":"Secure Player (malware)","created":"2015-09-07T13:50:27Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"52f9c6e7-f7d5-f52e-cc35-eb99ef8b4b6a","last_modified":1480349201029},{"guid":"{bf7380fa-e3b4-4db2-af3e-9d8783a45bfc}","prefs":[],"schema":1480349193877,"blockID":"i406","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=776404","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on changes search settings without user interaction, and fails to reset them after it is removed. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"uTorrentBar","created":"2013-06-27T10:46:53Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3bcefc4b-110c-f3b8-17ad-f9fc97c1120a","last_modified":1480349201000},{"guid":"{424b0d11-e7fe-4a04-b7df-8f2c77f58aaf}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i800","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080839","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astromenda NT","created":"2014-12-15T10:51:56Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"07bdf6aa-cfc8-ed21-6b36-6f90af02b169","last_modified":1480349200939},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i618","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:25:04Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.31.*","minVersion":"3.15.31","targetApplication":[]}],"id":"825feb43-d6c2-7911-4189-6f589f612c34","last_modified":1480349200911},{"guid":"{167d9323-f7cc-48f5-948a-6f012831a69f}","prefs":[],"schema":1480349193877,"blockID":"i262","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=812303","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently side-installed by other software, and doesn't do much more than changing the users' settings, without reverting them on removal.","name":"WhiteSmoke (malware)","created":"2013-01-29T13:33:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a8f249fe-3db8-64b8-da89-7b584337a7af","last_modified":1480349200885},{"guid":"/^({988919ff-0cd8-4d0c-bc7e-60d55a49eb64}|{494b9726-9084-415c-a499-68c07e187244}|{55b95864-3251-45e9-bb30-1a82589aaff1}|{eef3855c-fc2d-41e6-8d91-d368f51b3055}|{90a1b331-c2b4-4933-9f63-ba7b84d60d58}|{d2cf9842-af95-48cd-b873-bfbb48cd7f5e})$/","prefs":[],"schema":1480349193877,"blockID":"i541","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963819","who":"All Firefox users who have this add-on installed","why":"This add-on has been repeatedly blocked before and keeps showing up with new add-on IDs, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"MixiDJ (malware)","created":"2014-01-28T14:09:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"36196aed-9d0d-ebee-adf1-d1f7fadbc48f","last_modified":1480349200819},{"guid":"{29b136c9-938d-4d3d-8df8-d649d9b74d02}","prefs":[],"schema":1480349193877,"blockID":"i598","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1011322","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed, in violation with our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Mega Browse","created":"2014-06-12T13:21:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"63b1c965-27c3-cd06-1b76-8721add39edf","last_modified":1480349200775},{"guid":"{6e7f6f9f-8ce6-4611-add2-05f0f7049ee6}","prefs":[],"schema":1480349193877,"blockID":"i868","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1086574","who":"All users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Word Proser","created":"2015-02-26T14:58:59Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f54797da-cdcd-351a-c95e-874b64b0d226","last_modified":1480349200690},{"guid":"{02edb56b-9b33-435b-b7df-b2843273a694}","prefs":[],"schema":1480349193877,"blockID":"i438","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=896581","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. It is installed bypassing the Firefox opt-in screen, and manipulates settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"KeyBar Toolbar","created":"2013-08-09T15:27:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"896710d2-5a65-e9b0-845b-05aa72c2bd51","last_modified":1480349200338},{"guid":"{1cdbda58-45f8-4d91-b566-8edce18f8d0a}","prefs":[],"schema":1480349193877,"blockID":"i724","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080835","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Counselor Pro","created":"2014-10-13T16:00:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7b70bd36-d2f7-26fa-9038-8b8dd132cd81","last_modified":1480349200288},{"guid":"{b12785f5-d8d0-4530-a3ea-5c4263b85bef}","prefs":[],"schema":1480349193877,"blockID":"i988","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1161573","who":"All users who have this add-on installed. Those who wish continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on overrides user's preferences without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Hero Fighter Community Toolbar","created":"2015-08-17T16:04:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3e6d73f2-e8e3-af69-866e-30d3977b09e4","last_modified":1480349200171},{"guid":"{c2d64ff7-0ab8-4263-89c9-ea3b0f8f050c}","prefs":[],"schema":1480349193877,"blockID":"i39","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=665775","who":"Users of MediaBar versions 4.3.1.00 and below in all versions of Firefox.","why":"This add-on causes a high volume of crashes and is incompatible with certain versions of Firefox.","name":"MediaBar","created":"2011-07-19T10:18:12Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"4.3.1.00","minVersion":"0.1","targetApplication":[]}],"id":"e928a115-9d8e-86a4-e2c7-de39627bd9bf","last_modified":1480349200047},{"guid":"{9edd0ea8-2819-47c2-8320-b007d5996f8a}","prefs":["browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i684","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1033857","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is believed to be silently installed in Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"webget","created":"2014-08-06T13:33:33Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d38561f5-370f-14be-1443-a74dad29b1f3","last_modified":1480349199962},{"guid":"/^({ad9a41d2-9a49-4fa6-a79e-71a0785364c8})|(ffxtlbr@mysearchdial\\.com)$/","prefs":["browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i670","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1036740","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on has been repeatedly been silently installed into users' systems, and is known for changing the default search without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"MySearchDial","created":"2014-07-18T15:47:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a04075e6-5df2-2e1f-85a6-3a0171247349","last_modified":1480349199927},{"guid":"/^({1f43c8af-e9e4-4e5a-b77a-f51c7a916324}|{3a3bd700-322e-440a-8a6a-37243d5c7f92}|{6a5b9fc2-733a-4964-a96a-958dd3f3878e}|{7b5d6334-8bc7-4bca-a13e-ff218d5a3f17}|{b87bca5b-2b5d-4ae8-ad53-997aa2e238d4}|{bf8e032b-150f-4656-8f2d-6b5c4a646e0d})$/","prefs":[],"schema":1480349193877,"blockID":"i1136","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1251940","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hides itself from view and disables various security features in Firefox.","name":"Watcher (malware)","created":"2016-03-04T17:56:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a2d0378f-ebe4-678c-62d8-2e4c6a613c17","last_modified":1480349199818},{"guid":"liiros@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i814","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1119657","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems without their consent and performs unwanted operations.","name":"One Tab (malware)","created":"2015-01-09T12:49:05Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"387c054d-cc9f-7ebd-c814-b4c1fbcb2880","last_modified":1480349199791},{"guid":"{97E22097-9A2F-45b1-8DAF-36AD648C7EF4}","prefs":[],"schema":1480349193877,"blockID":"i916","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1170633","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-02T09:57:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"94fba774-c4e6-046a-bc7d-ede787a9d0fe","last_modified":1480349199738},{"guid":"{b64982b1-d112-42b5-b1e4-d3867c4533f8}","prefs":[],"schema":1480349193877,"blockID":"i167","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=805973","who":"All Firefox users who have this add-on installed.","why":"This add-on is a frequent cause for browser crashes and other problems.","name":"Browser Manager","created":"2012-10-29T17:17:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"00bbe501-2d27-7a1c-c344-6eea1c707473","last_modified":1480349199673},{"guid":"{58bd07eb-0ee0-4df0-8121-dc9b693373df}","prefs":[],"schema":1480349193877,"blockID":"i286","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=842206","who":"All Firefox users who have this extension installed.","why":"This extension is malicious and is installed under false pretenses, causing problems for many Firefox users. Note that this is not the same <a href=\"https://addons.mozilla.org/firefox/addon/browserprotect/\">BrowserProtect extension</a> that is listed on our add-ons site. That one is safe to use.","name":"Browser Protect / bProtector (malware)","created":"2013-02-18T10:54:28Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b40a60d3-b9eb-09eb-bb02-d50b27aaac9f","last_modified":1480349199619},{"guid":"trtv3@trtv.com","prefs":[],"schema":1480349193877,"blockID":"i465","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=845610","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"TornTV","created":"2013-11-01T15:21:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3d4d8a33-2eff-2556-c699-9be0841a8cd4","last_modified":1480349199560},{"guid":"{d2cf9842-af95-48cd-b873-bfbb48cd7f5e}","prefs":[],"schema":1480349193877,"blockID":"i439","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=902569","who":"All Firefox users who have this add-on installed.","why":"This is another instance of the <a href=\"https://addons.mozilla.org/en-US/firefox/blocked/i354\">previously blocked</a> Mixi DJ add-on, which doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. If you wish to continue using it, it can be enabled in the Add-ons Manager.","name":"Mixi DJ V45","created":"2013-08-09T16:08:18Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e81c31fc-265e-61b9-d4c1-0e2f31f1652e","last_modified":1480349199478},{"guid":"/^({b95faac1-a3d7-4d69-8943-ddd5a487d966}|{ecce0073-a837-45a2-95b9-600420505f7e}|{2713b394-286f-4d7c-89ea-4174eeab9f5a}|{da7a20cf-bef4-4342-ad78-0240fdf87055})$/","prefs":[],"schema":1480349193877,"blockID":"i624","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947482","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is known to change user settings without their consent, is distributed under multiple add-on IDs, and is also correlated with reports of tab functions being broken in Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n","name":"WiseConvert","created":"2014-06-18T13:50:38Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ed57d7a6-5996-c7da-8e07-1ad125183e84","last_modified":1480349199446},{"guid":"{f894a29a-f065-40c3-bb19-da6057778493}","prefs":[],"schema":1480349193877,"blockID":"i742","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080817","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on appears to be silently installed into users' systems, and changes settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Spigot Shopping Assistant","created":"2014-10-17T15:46:59Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"39d8334e-4b7c-4336-2d90-e6aa2d783967","last_modified":1480349199083},{"guid":"plugin@analytic-s.com","prefs":[],"schema":1480349193877,"blockID":"i467","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935797","who":"All Firefox users who have this add-on installed.","why":"This add-on bypasses the external install opt in screen in Firefox, violating the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Analytics","created":"2013-11-07T14:08:48Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ffbed3f3-e5c9-bc6c-7530-f68f47b7efd6","last_modified":1480349199026},{"guid":"{C4A4F5A0-4B89-4392-AFAC-D58010E349AF}","prefs":[],"schema":1480349193877,"blockID":"i678","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=895668","who":"All Firefox users who have this add-on installed. If you wish to continue using it, you can enable it in the Add-ons Manager.","why":"This add-on is generally silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"DataMngr","created":"2014-07-23T14:12:23Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"151021fc-ce4e-a734-e075-4ece19610f64","last_modified":1480349198947},{"guid":"HxLVJK1ioigz9WEWo8QgCs3evE7uW6LEExAniBGG@jetpack","prefs":[],"schema":1480349193877,"blockID":"i1036","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1211170","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Mega Player (malware)","created":"2015-10-05T16:37:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"32e34b41-a73c-72d4-c96c-136917ad1d4d","last_modified":1480349198894},{"guid":"{6af08a71-380e-42dd-9312-0111d2bc0630}","prefs":[],"schema":1480349193877,"blockID":"i822","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1126353","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware, hiding itself in the Add-ons Manager, and keeping track of certain user actions.","name":"{6af08a71-380e-42dd-9312-0111d2bc0630} (malware)","created":"2015-01-27T09:50:40Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"96d0c12b-a6cf-4539-c1cf-a1c75c14ff24","last_modified":1480349198826},{"guid":"colmer@yopmail.com","prefs":[],"schema":1480349193877,"blockID":"i550","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=968445","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Video Plugin Facebook (malware)","created":"2014-02-06T15:49:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c394d10b-384e-cbd0-f357-9c521715c373","last_modified":1480349198744},{"guid":"fplayer@adobe.flash","prefs":[],"schema":1480349193877,"blockID":"i444","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=909433","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware disguised as the Flash Player plugin.","name":"Flash Player (malware)","created":"2013-08-26T14:49:48Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c6557989-1b59-72a9-da25-b816c4a4c723","last_modified":1480349198667},{"guid":"{6E19037A-12E3-4295-8915-ED48BC341614}","prefs":[],"schema":1480349193877,"blockID":"i24","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=615518","who":"Users of RelevantKnowledge version 1.3.328.4 and older in Firefox 4 and later.","why":"This add-on causes a high volume of Firefox crashes.","name":"comScore RelevantKnowledge","created":"2011-03-02T17:42:56Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.3.328.4","minVersion":"0.1","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.7a1pre"}]}],"id":"7c189c5e-f95b-0aef-e9e3-8e879336503b","last_modified":1480349198606},{"guid":"crossriderapp4926@crossrider.com","prefs":[],"schema":1480349193877,"blockID":"i91","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=754648","who":"All Firefox users who have installed this add-on.","why":"Versions of this add-on prior to 0.81.44 automatically post message to users' walls and hide them from their view. Version 0.81.44 corrects this.","name":"Remove My Timeline (malware)","created":"2012-05-14T14:16:43Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"0.81.43","minVersion":"0","targetApplication":[]}],"id":"5ee3e72e-96fb-c150-fc50-dd581e960963","last_modified":1480349198547},{"guid":"/^(93abedcf-8e3a-4d02-b761-d1441e437c09@243f129d-aee2-42c2-bcd1-48858e1c22fd\\.com|9acfc440-ac2d-417a-a64c-f6f14653b712@09f9a966-9258-4b12-af32-da29bdcc28c5\\.com|58ad0086-1cfb-48bb-8ad2-33a8905572bc@5715d2be-69b9-4930-8f7e-64bdeb961cfd\\.com)$/","prefs":[],"schema":1480349193877,"blockID":"i544","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949596","who":"All Firefox users who have this add-on installed. If you wish to continue using it, it can be enabled in the Add-ons Manager.","why":"This add-on is in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, using multiple add-on IDs and potentially doing other unwanted activities.","name":"SuperLyrics","created":"2014-01-30T11:51:19Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d8d25967-9814-3b65-0787-a0525c16e11e","last_modified":1480349198510},{"guid":"wHO@W9.net","prefs":[],"schema":1480349193877,"blockID":"i980","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1192468","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"BestSavEFOrYoU (malware)","created":"2015-08-11T11:20:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4beb917f-68f2-1f91-beed-dff6d83006f8","last_modified":1480349198483},{"guid":"frhegnejkgner@grhjgewfewf.com","prefs":[],"schema":1480349193877,"blockID":"i1040","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1212451","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Async Codec (malware)","created":"2015-10-07T13:03:37Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fb6ab4ce-5517-bd68-2cf7-a93a109a528a","last_modified":1480349198458},{"guid":"firefox@luckyleap.net","prefs":[],"schema":1480349193877,"blockID":"i471","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:33Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3a9e04c7-5e64-6297-8442-2816915aad77","last_modified":1480349198433},{"guid":"lugcla21@gmail.com","prefs":[],"schema":1480349193877,"blockID":"i432","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=902072","who":"All Firefox users who have this add-on installed.","why":"This add-on includes malicious code that spams users' Facebook accounts with unwanted messages.","name":"FB Color Changer (malware)","created":"2013-08-06T13:16:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b6943f35-9429-1f8e-bf8e-fe37979fe183","last_modified":1480349198372},{"guid":"{99079a25-328f-4bd4-be04-00955acaa0a7}","prefs":[],"schema":1480349193877,"blockID":"i402","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835678","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This group of add-ons is silently installed, bypassing our install opt-in screen. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Searchqu","created":"2013-06-25T15:16:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"16008331-8b47-57c8-a6f7-989914d1cb8a","last_modified":1480349198341},{"guid":"{81b13b5d-fba1-49fd-9a6b-189483ac548a}","prefs":[],"schema":1480349193877,"blockID":"i473","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:43Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"76debc7b-b875-6da4-4342-1243cbe437f6","last_modified":1480349198317},{"guid":"{e935dd68-f90d-46a6-b89e-c4657534b353}","prefs":[],"schema":1480349193877,"blockID":"i732","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Sites Pro","created":"2014-10-16T16:38:24Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"97fdc235-ac1a-9f20-1b4a-17c2f0d89ad1","last_modified":1480349198260},{"guid":"{32da2f20-827d-40aa-a3b4-2fc4a294352e}","prefs":[],"schema":1480349193877,"blockID":"i748","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963787","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Start Page","created":"2014-10-17T16:02:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6c980c8e-4a3c-7912-4a3a-80add457575a","last_modified":1480349198223},{"guid":"chinaescapeone@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i431","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=901770","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that uses a deceptive name and hijacks social networks.","name":"F-Secure Security Pack (malware)","created":"2013-08-05T16:43:24Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fbd89a9d-9c98-8481-e4cf-93e327ca8be1","last_modified":1480349198192},{"guid":"{cc6cc772-f121-49e0-b1f0-c26583cb0c5e}","prefs":[],"schema":1480349193877,"blockID":"i716","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Counselor","created":"2014-10-02T12:12:34Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"debcd28c-884b-ca42-d983-6fabf91034dd","last_modified":1480349198148},{"guid":"{906000a4-88d9-4d52-b209-7a772970d91f}","prefs":[],"schema":1480349193877,"blockID":"i474","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:48Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"326d05b9-ace7-67c6-b094-aad926c185a5","last_modified":1480349197744},{"guid":"{AB2CE124-6272-4b12-94A9-7303C7397BD1}","prefs":[],"schema":1480349193877,"blockID":"i20","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=627278","who":"Users of Skype extension versions below 5.2.0.7165 for all versions of Firefox.","why":"This add-on causes a high volume of Firefox crashes and introduces severe performance issues. Please <a href=\"http://www.skype.com/intl/en/get-skype/on-your-computer/click-and-call/\">update to the latest version</a>. For more information, please <a href=\"http://blog.mozilla.com/addons/2011/01/20/blocking-the-skype-toolbar-in-firefox/\">read our announcement</a>.","name":"Skype extension","created":"2011-01-20T18:39:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"5.2.0.7164","minVersion":"0.1","targetApplication":[]}],"id":"60e16015-1803-197a-3241-484aa961d18f","last_modified":1480349197667},{"guid":"f6682b47-e12f-400b-9bc0-43b3ccae69d1@39d6f481-b198-4349-9ebe-9a93a86f9267.com","prefs":[],"schema":1480349193877,"blockID":"i682","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1043017","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is being silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"enformation","created":"2014-08-04T16:07:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a7ae65cd-0869-67e8-02f8-6d22c56a83d4","last_modified":1480349197636},{"guid":"rally_toolbar_ff@bulletmedia.com","prefs":[],"schema":1480349193877,"blockID":"i537","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=950267","who":"All Firefox users who have this extension installed. If you want to continue using it, you can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing it.","name":"Rally Toolbar","created":"2014-01-23T15:51:48Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4ac6eb63-b51a-3296-5b02-bae77f424032","last_modified":1480349197604},{"guid":"x77IjS@xU.net","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i774","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes user settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>\r\n","name":"YoutubeAdBlocke","created":"2014-10-31T16:22:53Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4771da14-bcf2-19b1-3d71-bc61a1c7d457","last_modified":1480349197578},{"guid":"{49c53dce-afa0-49a1-a08b-2eb8e8444128}","prefs":[],"schema":1480349193877,"blockID":"i441","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844985","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"ytbyclick","created":"2013-08-09T16:58:50Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5f08d720-58c2-6acb-78ad-7af45c82c90b","last_modified":1480349197550},{"guid":"{bb7b7a60-f574-47c2-8a0b-4c56f2da9802}","prefs":[],"schema":1480349193877,"blockID":"i754","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080850","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"AdvanceElite","created":"2014-10-17T16:27:32Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f222ceb2-9b69-89d1-8dce-042d8131a12e","last_modified":1480349197500},{"guid":"/^((34qEOefiyYtRJT@IM5Munavn\\.com)|(Mro5Fm1Qgrmq7B@ByrE69VQfZvZdeg\\.com)|(KtoY3KGxrCe5ie@yITPUzbBtsHWeCdPmGe\\.com)|(9NgIdLK5Dq4ZMwmRo6zk@FNt2GCCLGyUuOD\\.com)|(NNux7bWWW@RBWyXdnl6VGls3WAwi\\.com)|(E3wI2n@PEHTuuNVu\\.com)|(2d3VuWrG6JHBXbQdbr@3BmSnQL\\.com))$/","prefs":[],"schema":1480349193877,"blockID":"i324","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=841791","who":"All users who have this add-on installed.","why":"This extension is malware, installed pretending to be the Flash Player plugin.","name":"Flash Player (malware)","created":"2013-03-22T14:48:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5be3a399-af3e-644e-369d-628273b3fdc2","last_modified":1480349197432},{"guid":"{8f894ed3-0bf2-498e-a103-27ef6e88899f}","prefs":[],"schema":1480349193877,"blockID":"i792","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"ExtraW","created":"2014-11-26T13:49:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bebc9e15-59a1-581d-0163-329d7414edff","last_modified":1480349197368},{"guid":"profsites@pr.com","prefs":[],"schema":1480349193877,"blockID":"i734","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.\r\n","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"ProfSites","created":"2014-10-16T16:39:26Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0d6d84d7-0b3f-c5ab-57cc-6b66b0775a23","last_modified":1480349197341},{"guid":"{872b5b88-9db5-4310-bdd0-ac189557e5f5}","prefs":[],"schema":1480349193877,"blockID":"i497","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=945530","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making settings changes that can't be easily reverted.","name":"DVDVideoSoft Menu","created":"2013-12-03T16:08:09Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e8da89c4-c585-77e4-9872-591d20723a7e","last_modified":1480349197240},{"guid":"123456789@offeringmedia.com","prefs":[],"schema":1480349193877,"blockID":"i664","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1036757","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that attempts to hide itself by impersonating the Adobe Flash plugin.","name":"Taringa MP3 / Adobe Flash","created":"2014-07-10T15:41:24Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6d0a7dda-d92a-c8e2-21be-c92b0a88ac8d","last_modified":1480349197208},{"guid":"{df6bb2ec-333b-4267-8c4f-3f27dc8c6e07}","prefs":[],"schema":1480349193877,"blockID":"i487","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=940681","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Facebook 2013 (malware)","created":"2013-11-19T14:59:45Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5867c409-b342-121e-3c3b-426e2f0ba1d4","last_modified":1480349197109},{"guid":"/^({4e988b08-8c51-45c1-8d74-73e0c8724579}|{93ec97bf-fe43-4bca-a735-5c5d6a0a40c4}|{aed63b38-7428-4003-a052-ca6834d8bad3}|{0b5130a9-cc50-4ced-99d5-cda8cc12ae48}|{C4CFC0DE-134F-4466-B2A2-FF7C59A8BFAD})$/","prefs":[],"schema":1480349193877,"blockID":"i524","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947481","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted.","name":"SweetPacks","created":"2013-12-20T13:43:21Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1a3a26a2-cdaa-e5ba-f6ac-47b98ae2cc26","last_modified":1480349197082},{"guid":"{87b5a11e-3b54-42d2-9102-0a7cb1f79ebf}","prefs":[],"schema":1480349193877,"blockID":"i838","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128327","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Cyti Web (malware)","created":"2015-02-06T14:29:12Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1ba0e57c-4c0c-4eb6-26e7-c2016769c343","last_modified":1480349196965},{"guid":"/^({bf67a47c-ea97-4caf-a5e3-feeba5331231}|{24a0cfe1-f479-4b19-b627-a96bf1ea3a56})$/","prefs":[],"schema":1480349193877,"blockID":"i542","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963819","who":"All Firefox users who have this add-on installed.","why":"This add-on has been repeatedly blocked before and keeps showing up with new add-on IDs, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"MixiDJ (malware)","created":"2014-01-28T14:10:49Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fc442b64-1b5d-bebb-c486-f431b154f3db","last_modified":1480349196622},{"guid":"/^({ebd898f8-fcf6-4694-bc3b-eabc7271eeb1}|{46008e0d-47ac-4daa-a02a-5eb69044431a}|{213c8ed6-1d78-4d8f-8729-25006aa86a76}|{fa23121f-ee7c-4bd8-8c06-123d087282c5}|{19803860-b306-423c-bbb5-f60a7d82cde5})$/","prefs":[],"schema":1480349193877,"blockID":"i622","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947482","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is known to change user settings without their consent, is distributed under multiple add-on IDs, and is also correlated with reports of tab functions being broken in Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"WiseConvert","created":"2014-06-18T13:48:26Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ffd184fa-aa8f-8a75-ff00-ce285dec5b22","last_modified":1480349196597},{"guid":"/^({fa95f577-07cb-4470-ac90-e843f5f83c52}|ffxtlbr@speedial\\.com)$/","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i696","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1031115","who":"All Firefox users who have any of these add-ons installed. Users who wish to continue using these add-ons can enable them in the Add-ons Manager.","why":"These add-ons are silently installed and change homepage and search defaults without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. They are also distributed under more than one add-on ID.","name":"Speedial","created":"2014-08-21T13:55:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"130c7419-f727-a2fb-3891-627bc69a43bb","last_modified":1480349196565},{"guid":"pennerdu@faceobooks.ws","prefs":[],"schema":1480349193877,"blockID":"i442","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=904050","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Console Video (malware)","created":"2013-08-13T14:00:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fb83e48e-a780-9d06-132c-9ecc65b43674","last_modified":1480349196541},{"guid":"{E90FA778-C2B7-41D0-9FA9-3FEC1CA54D66}","prefs":[],"schema":1480349193877,"blockID":"i446","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=788838","who":"All Firefox users who have this add-on installed. The add-on can be enabled again in the Add-ons Manager.","why":"This add-on is installed silently, in violation of our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"YouTube to MP3 Converter","created":"2013-09-06T15:59:29Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"83eb6337-a3b6-84e4-e76c-ee9200b80796","last_modified":1480349196471},{"guid":"{ad7ce998-a77b-4062-9ffb-1d0b7cb23183}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i804","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080839","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astromenda Search Addon","created":"2014-12-15T10:53:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"633f9999-c81e-bd7a-e756-de7d34feb39d","last_modified":1480349196438},{"guid":"dodatek@flash2.pl","prefs":[],"schema":1480349193877,"blockID":"i1279","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1312748","who":"Any user with version 1.3 or newer of this add-on installed.","why":"This add-on claims to be a flash plugin and it does some work on youtube, but it also steals your facebook and adfly credentials and sends them to a remote server.","name":"Aktualizacja Flash WORK addon","created":"2016-10-27T15:52:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"1.3","targetApplication":[]}],"id":"2dab5211-f9ec-a1bf-c617-6f94f28b5ee1","last_modified":1480349196331},{"guid":"{2d069a16-fca1-4e81-81ea-5d5086dcbd0c}","prefs":[],"schema":1480349193877,"blockID":"i440","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=903647","who":"All Firefox users who have this add-on installed.","why":"This add-on is installed silently and doesn't follow many other of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. If you want to continue using this add-on, you can enable it in the Add-ons Manager.","name":"GlitterFun","created":"2013-08-09T16:26:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e3f77f3c-b1d6-3b29-730a-846007b9cb16","last_modified":1480349196294},{"guid":"xivars@aol.com","prefs":[],"schema":1480349193877,"blockID":"i501","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=946420","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Video Plugin Facebook (malware)","created":"2013-12-04T15:34:32Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3303d201-7006-3c0d-5fd5-45503e2e690c","last_modified":1480349196247},{"guid":"2bbadf1f-a5af-499f-9642-9942fcdb7c76@f05a14cc-8842-4eee-be17-744677a917ed.com","prefs":[],"schema":1480349193877,"blockID":"i700","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1052599","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is widely considered malware and is apparently installed silently into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"PIX Image Viewer","created":"2014-08-21T16:15:16Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1b72889b-90e6-ea58-4fe8-d48257df7d8b","last_modified":1480349196212},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i600","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:16:08Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.5.*","minVersion":"3.15.5","targetApplication":[]}],"id":"51c4ab3b-9ad3-c5c3-98c8-a220025fc5a3","last_modified":1480349196158},{"guid":"{729c9605-0626-4792-9584-4cbe65b243e6}","prefs":[],"schema":1480349193877,"blockID":"i788","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Browser Ext Assistance","created":"2014-11-20T10:07:19Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3c588238-2501-6a53-65ea-5c8ff0f3e51d","last_modified":1480349196123},{"guid":"webbooster@iminent.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i630","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=866943","who":"All Firefox users who have any of these add-ons installed. Users who wish to continue using them can enable them in the Add-ons Manager.","why":"These add-ons have been silently installed repeatedly, and change settings without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Iminent Minibar","created":"2014-06-26T15:49:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d894ea79-8215-7a0c-b0e9-be328c3afceb","last_modified":1480349196032},{"guid":"firefox@bandoo.com","prefs":[],"schema":1480349193877,"blockID":"i23","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=629634","who":"Users of Bandoo version 5.0 for Firefox 3.6 and later.","why":"This add-on causes a high volume of Firefox crashes.","name":"Bandoo","created":"2011-03-01T23:30:23Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"5.0","minVersion":"5.0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.7a1pre"}]}],"id":"bd487cf4-3f6a-f956-a6e9-842ac8deeac5","last_modified":1480349195915},{"guid":"5nc3QHFgcb@r06Ws9gvNNVRfH.com","prefs":[],"schema":1480349193877,"blockID":"i372","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=875752","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware pretending to be the Flash Player plugin.","name":"Flash Player 11 (malware)","created":"2013-06-18T13:23:40Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dc71fcf5-fae4-5a5f-6455-ca7bbe4202db","last_modified":1480349195887},{"guid":"/^(7tG@zEb\\.net|ru@gfK0J\\.edu)$/","prefs":[],"schema":1480349193877,"blockID":"i854","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=952255","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"youtubeadblocker (malware)","created":"2015-02-09T15:41:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cfe42207-67a9-9b88-f80c-994e6bdd0c55","last_modified":1480349195851},{"guid":"{a7aae4f0-bc2e-a0dd-fb8d-68ce32c9261f}","prefs":[],"schema":1480349193877,"blockID":"i378","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=865090","who":"All Firefox users who have installed this add-on.","why":"This extension is malware that hijacks Facebook accounts for malicious purposes.","name":"Myanmar Extension for Facebook (malware)","created":"2013-06-18T15:58:54Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"30ecd9b9-4023-d9ef-812d-f1a75bb189b0","last_modified":1480349195823},{"guid":"crossriderapp5060@crossrider.com","prefs":[],"schema":1480349193877,"blockID":"i228","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=810016","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently side-installed by other software, and it overrides user preferences and inserts advertisements in web content.","name":"Savings Sidekick","created":"2012-11-29T16:31:13Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a37f76ac-7b77-b5a3-bac8-addaacf34bae","last_modified":1480349195769},{"guid":"/^(saamazon@mybrowserbar\\.com)|(saebay@mybrowserbar\\.com)$/","prefs":[],"schema":1480349193877,"blockID":"i672","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1011337","who":"All Firefox users who have these add-ons installed. Users wishing to continue using these add-ons can enable them in the Add-ons Manager.","why":"These add-ons are being silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Spigot Shopping Assistant","created":"2014-07-22T15:13:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e072a461-ee5a-c83d-8d4e-5686eb585a15","last_modified":1480349195347},{"guid":"{b99c8534-7800-48fa-bd71-519a46cdc7e1}","prefs":[],"schema":1480349193877,"blockID":"i596","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1011325","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed, in violation with our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BrowseMark","created":"2014-06-12T13:19:59Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f411bb0f-7c82-9061-4a80-cabc8ff45beb","last_modified":1480349195319},{"guid":"/^({94d62e35-4b43-494c-bf52-ba5935df36ef}|firefox@advanceelite\\.com|{bb7b7a60-f574-47c2-8a0b-4c56f2da9802})$/","prefs":[],"schema":1480349193877,"blockID":"i856","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1130323","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"AdvanceElite (malware)","created":"2015-02-09T15:51:11Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e3d52650-d3e2-4cef-71f7-e6188f56fe4d","last_modified":1480349195286},{"guid":"{458fb825-2370-4973-bf66-9d7142141847}","prefs":["app.update.auto","app.update.enabled","app.update.interval","app.update.url"],"schema":1480349193877,"blockID":"i1024","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1209588","who":"All users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on hides itself in the Add-ons Manager, interrupts the Firefox update process, and reportedly causes other problems to users, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Web Shield","created":"2015-09-29T09:25:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"32c5baa7-d547-eaab-302d-b873c83bfe2d","last_modified":1480349195258},{"guid":"{f2456568-e603-43db-8838-ffa7c4a685c7}","prefs":[],"schema":1480349193877,"blockID":"i778","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Sup-SW","created":"2014-11-07T13:53:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"93568fa2-0cb7-4e1d-e893-d7261e81547c","last_modified":1480349195215},{"guid":"{77BEC163-D389-42c1-91A4-C758846296A5}","prefs":[],"schema":1480349193877,"blockID":"i566","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=964594","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-on Manager.","why":"This add-on is silently installed into Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"V-Bates","created":"2014-03-05T13:20:54Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"080edbac-25d6-e608-abdd-feb1ce7a9a77","last_modified":1480349195185},{"guid":"helper@vidscrab.com","prefs":[],"schema":1480349193877,"blockID":"i1077","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1231010","who":"All Firefox users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on injects remote scripts and injects unwanted content into web pages.","name":"YouTube Video Downloader (from AddonCrop)","created":"2016-01-14T14:32:53Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"36b2e1e0-5fda-bde3-db55-dfcbe24dfd04","last_modified":1480349195157},{"guid":"jid1-XLjasWL55iEE1Q@jetpack","prefs":[],"schema":1480349193877,"blockID":"i578","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1002037","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that presents itself as \"Flash Player\" but is really injecting unwanted content into Facebook pages.","name":"Flash Player (malware)","created":"2014-04-28T16:25:03Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1e75b2f0-02fc-77a4-ad2f-52a4caff1a71","last_modified":1480349195058},{"guid":"{a3a5c777-f583-4fef-9380-ab4add1bc2a8}","prefs":[],"schema":1480349193877,"blockID":"i142","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=792132","who":"Todos los usuarios de Firefox que instalaron la versi\u00f3n 4.2 del complemento Cuevana Stream.\r\n\r\nAll Firefox users who have installed version 4.2 of the Cuevana Stream add-on.","why":"<strong>Espa\u00f1ol</strong>\r\nUna versi\u00f3n maliciosa del complemento Cuevana Stream (4.2) fue colocada en el sitio Cuevana y distribuida a muchos usuarios del sitio. Esta versi\u00f3n recopila informaci\u00f3n de formularios web y los env\u00eda a una direcci\u00f3n remota con fines maliciosos. Se le recomienda a todos los usuarios que instalaron esta versi\u00f3n que cambien sus contrase\u00f1as inmediatamente, y que se actualicen a la nueva versi\u00f3n segura, que es la 4.3.\r\n\r\n<strong>English</strong>\r\nA malicious version of the Cuevana Stream add-on (4.2) was uploaded to the Cuevana website and distributed to many of its users. This version takes form data and sends it to a remote location with malicious intent. It is recommended that all users who installed this version to update their passwords immediately, and update to the new safe version, version 4.3.\r\n\r\n","name":"Cuevana Stream (malicious version)","created":"2012-09-18T13:37:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"4.2","minVersion":"4.2","targetApplication":[]}],"id":"91e551b9-7e94-60e2-f1bd-52f25844ab16","last_modified":1480349195007},{"guid":"{34712C68-7391-4c47-94F3-8F88D49AD632}","prefs":[],"schema":1480349193877,"blockID":"i922","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1173154","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-09T15:27:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"dd350efb-34ac-2bb5-5afd-eed722dbb916","last_modified":1480349194976},{"guid":"PDVDZDW52397720@XDDWJXW57740856.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i846","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128320","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and attempts to change user settings like the home page and default search, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Ge-Force","created":"2015-02-06T15:03:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c33e950c-c977-ed89-c86a-3be8c4be1967","last_modified":1480349194949},{"guid":"discoverypro@discoverypro.com","prefs":[],"schema":1480349193877,"blockID":"i582","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1004231","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enabled it in the Add-ons Manager.","why":"This add-on is silently installed by the CNET installer for MP3 Rocket and probably other software packages. This is in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Discovery Pro","created":"2014-04-30T16:10:03Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"34eab242-6fbc-a459-a89e-0dc1a0b8355d","last_modified":1480349194878},{"guid":"jid1-bKSXgRwy1UQeRA@jetpack","prefs":[],"schema":1480349193877,"blockID":"i680","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=979856","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into user's systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Trusted Shopper","created":"2014-08-01T16:34:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f701b790-b266-c69d-0fba-f2d189cb0f34","last_modified":1480349194851},{"guid":"bcVX5@nQm9l.org","prefs":[],"schema":1480349193877,"blockID":"i848","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128266","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"boomdeal","created":"2015-02-09T15:21:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f8d6d4e1-b9e6-07f5-2b49-192106a45d82","last_modified":1480349194799},{"guid":"aytac@abc.com","prefs":[],"schema":1480349193877,"blockID":"i504","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947341","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks users' Facebook accounts.","name":"Facebook Haber (malware)","created":"2013-12-06T12:07:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bfaf8298-dd69-165c-e1ed-ad55584abd18","last_modified":1480349194724},{"guid":"Adobe@flash.com","prefs":[],"schema":1480349193877,"blockID":"i136","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=790100","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware posing as a legitimate Adobe product.","name":"Adobe Flash (malware)","created":"2012-09-10T16:09:06Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"47ac744e-3176-5cb6-1d02-b460e0c7ada0","last_modified":1480349194647},{"guid":"{515b2424-5911-40bd-8a2c-bdb20286d8f5}","prefs":[],"schema":1480349193877,"blockID":"i491","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=940753","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted.","name":"Connect DLC","created":"2013-11-29T14:52:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6d658443-b34a-67ad-934e-cbf7cd407460","last_modified":1480349194580},{"guid":"/^({3f3cddf8-f74d-430c-bd19-d2c9147aed3d}|{515b2424-5911-40bd-8a2c-bdb20286d8f5}|{17464f93-137e-4646-a0c6-0dc13faf0113}|{d1b5aad5-d1ae-4b20-88b1-feeaeb4c1ebc}|{aad50c91-b136-49d9-8b30-0e8d3ead63d0})$/","prefs":[],"schema":1480349193877,"blockID":"i516","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947478","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and being distributed under multiple add-on IDs.","name":"Connect DLC","created":"2013-12-20T12:38:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"96f8e157-8b8b-8e2e-76cd-6850599b4370","last_modified":1480349194521},{"guid":"wxtui502n2xce9j@no14","prefs":[],"schema":1480349193877,"blockID":"i1012","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1206157","who":"All users who have this add-on installed.","why":"This is a malicious add-on that takes over Facebook accounts.","name":"Video fix (malware)","created":"2015-09-21T13:04:09Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"246798ac-25fa-f4a4-258c-a71f9f6ae091","last_modified":1480349194463},{"guid":"flashX@adobe.com","prefs":[],"schema":1480349193877,"blockID":"i168","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=807052","who":"All Firefox users who have this add-on installed.","why":"This is an exploit proof-of-concept created for a conference presentation, which will probably be copied and modified for malicious purposes. \r\n","name":"Zombie Browser Pack","created":"2012-10-30T12:07:41Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d7c69812-801c-8d8e-12cb-c5171bdc48a1","last_modified":1480349194428},{"guid":"{4889ddce-7a83-45e6-afc9-1e4f1149fff4}","prefs":[],"schema":1480343836083,"blockID":"i840","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128327","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Cyti Web (malware)","created":"2015-02-06T14:30:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"be600f35-0633-29f3-c571-819e19d85db9","last_modified":1480349193867},{"guid":"{55dce8ba-9dec-4013-937e-adbf9317d990","prefs":[],"schema":1480343836083,"blockID":"i690","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1048647","who":"All Firefox users. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is being silently installed in users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Deal Keeper","created":"2014-08-12T16:23:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"512b0d40-a10a-5ddc-963b-b9c487eb1422","last_modified":1480349193833},{"guid":"/^new@kuot\\.pro|{13ec6687-0b15-4f01-a5a0-7a891c18e4ee}|rebeccahoppkins(ty(tr)?)?@gmail\\.com|{501815af-725e-45be-b0f2-8f36f5617afc}|{9bdb5f1f-b1e1-4a75-be31-bdcaace20a99}|{e9d93e1d-792f-4f95-b738-7adb0e853b7b}|dojadewaskurwa@gmail\\.com$/","prefs":[],"schema":1480343836083,"blockID":"i1414","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1312748","who":"All users who have this add-on installed.","why":"This add-on claims to be a flash plugin and it does some work on youtube, but it also steals your facebook and adfly credentials and sends them to a remote server.","name":"Aktualizacja dodatku Flash (malware)","created":"2016-10-28T18:06:03Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5cebc983-bc88-d5f8-6807-bd1cbfcd82fd","last_modified":1480349193798},{"guid":"{58d2a791-6199-482f-a9aa-9b725ec61362}","prefs":[],"schema":1480343836083,"blockID":"i746","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963787","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Start Page","created":"2014-10-17T16:01:53Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8ebbc7d0-635c-b74a-de9f-16eb5837b36a","last_modified":1480349193730},{"guid":"{94cd2cc3-083f-49ba-a218-4cda4b4829fd}","prefs":[],"schema":1480343836083,"blockID":"i590","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1013678","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' profiles, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Value Apps","created":"2014-06-03T16:12:50Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"556b8d4d-d6c2-199d-9f33-8eccca07e8e7","last_modified":1480349193649},{"guid":"contentarget@maildrop.cc","prefs":[],"schema":1480343836083,"blockID":"i818","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1119971","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks Facebook accounts.","name":"Astro Play (malware)","created":"2015-01-12T09:29:19Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"440e9923-027a-6089-e036-2f78937dc193","last_modified":1480349193622},{"guid":"noOpus@outlook.com","prefs":[],"schema":1480343836083,"blockID":"i816","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1119659","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems without their consent and performs unwanted operations.","name":"Full Screen (malware)","created":"2015-01-09T12:52:32Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b64d7cef-8b6c-2575-16bc-732fca7db377","last_modified":1480349193537},{"guid":"{c95a4e8e-816d-4655-8c79-d736da1adb6d}","prefs":[],"schema":1480343836083,"blockID":"i433","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844945","who":"All Firefox users who have this add-on installed.","why":"This add-on bypasses the external install opt in screen in Firefox, violating the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Hotspot Shield","created":"2013-08-09T11:25:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b3168278-a8ae-4882-7f26-355bc362bed0","last_modified":1480349193510},{"guid":"{9802047e-5a84-4da3-b103-c55995d147d1}","prefs":[],"schema":1480343836083,"blockID":"i722","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Web Finder Pro","created":"2014-10-07T12:58:14Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"50097c29-26b1-bf45-ffe1-83da217eb127","last_modified":1480349193482},{"guid":"/^({bf9194c2-b86d-4ebc-9b53-1c08b6ff779e}|{61a83e16-7198-49c6-8874-3e4e8faeb4f3}|{f0af464e-5167-45cf-9cf0-66b396d1918c}|{5d9968c3-101c-4944-ba71-72d77393322d}|{01e86e69-a2f8-48a0-b068-83869bdba3d0})$/","prefs":[],"schema":1480343836083,"blockID":"i515","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947473","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by using multiple add-on IDs and making unwanted settings changes.","name":"VisualBee Toolbar","created":"2013-12-20T12:26:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"029fa6f9-2351-40b7-5443-9a66e057f199","last_modified":1480349193449},{"guid":"/^({d50bfa5f-291d-48a8-909c-5f1a77b31948}|{d54bc985-6e7b-46cd-ad72-a4a266ad879e}|{d89e5de3-5543-4363-b320-a98cf150f86a}|{f3465017-6f51-4980-84a5-7bee2f961eba}|{fae25f38-ff55-46ea-888f-03b49aaf8812})$/","prefs":[],"schema":1480343836083,"blockID":"i1137","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1251940","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hides itself from view and disables various security features in Firefox.","name":"Watcher (malware)","created":"2016-03-04T17:56:42Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"252e18d0-85bc-7bb3-6197-5f126424c9b3","last_modified":1480349193419},{"guid":"ffxtlbr@claro.com","prefs":[],"schema":1480343836083,"blockID":"i218","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=816762","who":"All Firefox users who have installed this add-on.","why":"The Claro Toolbar is side-installed with other software, unexpectedly changing users' settings and then making it impossible for these settings to be reverted by users.","name":"Claro Toolbar","created":"2012-11-29T16:07:00Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e017a3b2-9b37-b8a0-21b0-bc412ae8a7f4","last_modified":1480349193385},{"guid":"/^(j003-lqgrmgpcekslhg|SupraSavings|j003-dkqonnnthqjnkq|j003-kaggrpmirxjpzh)@jetpack$/","prefs":[],"schema":1480343836083,"blockID":"i692","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1048656","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is being silently installed in users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SupraSavings","created":"2014-08-12T16:27:06Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b0d30256-4581-1489-c241-d2e85b6c38f4","last_modified":1480349193295},{"guid":"helperbar@helperbar.com","prefs":[],"schema":1480343836083,"blockID":"i258","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=817786","who":"All Firefox users who have this add-on installed. This only applies to version 1.0 of Snap.do. Version 1.1 fixed all the issues for which this block was created.","why":"This extension violates a number of our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, particularly on installation and settings handling. It also causes some stability problems in Firefox due to the way the toolbar is handled.\r\n\r\nUsers who wish to keep the add-on enabled can enable it again in the Add-ons Manager.","name":"Snap.do","created":"2013-01-28T13:52:26Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0","minVersion":"0","targetApplication":[]}],"id":"f1ede5b8-7757-5ec5-d8ed-1a01889154aa","last_modified":1480349193254},{"guid":"/^((support2_en@adobe14\\.com)|(XN4Xgjw7n4@yUWgc\\.com)|(C7yFVpIP@WeolS3acxgS\\.com)|(Kbeu4h0z@yNb7QAz7jrYKiiTQ3\\.com)|(aWQzX@a6z4gWdPu8FF\\.com)|(CBSoqAJLYpCbjTP90@JoV0VMywCjsm75Y0toAd\\.com)|(zZ2jWZ1H22Jb5NdELHS@o0jQVWZkY1gx1\\.com))$/","prefs":[],"schema":1480343836083,"blockID":"i326","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=841791","who":"All users who have this add-on installed.","why":"This extension is malware, installed pretending to be the Flash Player plugin.","name":"Flash Player (malware)","created":"2013-03-22T14:49:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3142020b-8af9-1bac-60c5-ce5ad0ff3d42","last_modified":1480349193166},{"guid":"newmoz@facebook.com","prefs":[],"schema":1480343836083,"blockID":"i576","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=997986","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook user accounts and sends spam on the user's behalf.","name":"Facebook Service Pack (malware)","created":"2014-04-22T14:34:42Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d85798d3-9b87-5dd9-ace2-64914b93df77","last_modified":1480349193114},{"guid":"{0F827075-B026-42F3-885D-98981EE7B1AE}","prefs":[],"schema":1480343836083,"blockID":"i334","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=862272","who":"All Firefox users who have this extension installed.","why":"This extension is malicious and is installed under false pretenses, causing problems for many Firefox users. Note that this is not the same <a href=\"https://addons.mozilla.org/firefox/addon/browserprotect/\">BrowserProtect extension</a> that is listed on our add-ons site. That one is safe to use.","name":"Browser Protect / bProtector (malware)","created":"2013-04-16T13:25:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"aad4545f-8f9d-dd53-2aa8-e8945cad6185","last_modified":1480349192987}]} \ No newline at end of file +{"data":[{"guid":"/^((\\{329fc2d4-30d7-48b7-8247-4a4bb7682da8\\})|(\\{5738de0c-38f0-4e38-a01e-8553ec09235c\\})|(\\{bc775a74-c002-4e99-bf4d-ad9a806263dd\\})|(\\{1272ff2b-0339-4d10-9297-cb0e90a2be0e\\})|(\\{e5771c28-c725-43b0-b8d4-5d4acd072b7d\\}))$/","prefs":[],"schema":1586806901368,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1629790","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a02c6a6-ef2e-4b46-ab67-49157ed9e49c","last_modified":1586977183602},{"guid":"/^((\\{39262546-d73e-4259-ba57-b772473106a3\\})|(\\{f6e51fb0-9724-4c86-aa95-12d20c77a7fa\\})|(\\{805466a4-90a7-48a3-85bb-bad244244a85\\})|(\\{60cfdc21-74c4-42bb-9b9f-9688f1a22e17\\})|(\\{c96f35f7-9ca8-4119-8d08-aaf1f5231fa7\\})|(\\{057b25cd-d923-4faf-828b-47d36f069a40\\})|(\\{1c5a9f06-a63b-49c4-9d66-563c7a9ed059\\})|(\\{61e204ba-f49f-41e4-8d38-0cbf003e3ea8\\})|(\\{139b5a73-e8ae-496a-b0eb-2bc4de518fc6\\})|(\\{59b82710-8c63-4d82-bc16-64f6bda5cd20\\})|(\\{bfe32796-ee0b-4271-a5d2-81938374395f\\})|(\\{ef5353b7-cf92-40e9-8f5c-93210015b15f\\}))$/","prefs":[],"schema":1586956158067,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1630241","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Cryptowallet Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"17d89613-a8c6-4e49-a5c7-e9eac64133f1","last_modified":1586977183599},{"guid":"/^((spylog@cfsoft\\.com)|(\\{7cb9bddc-8c0e-4b4e-92df-3735e3db909a\\})|(\\{8c64047e-20da-45f2-998d-f852e0886c70\\})|(\\{684a1175-31b9-478a-845f-ab332d0c0ec3\\})|(vni@vietbacsecurity\\.com)|(\\{95e9e74d-4318-4f14-939d-24ec61ed6657\\})|(blockpopup@vietbacsecurity\\.com)|(blocallpopup@vietbacsecurity\\.com)|(Vanga@vietbacsecurity\\.com)|(sontung@vietbacsecurity\\.com)|(TiengViet@vietbacsecurity\\.com)|(Pomodorotimer@vietbacsecurity\\.com)|(Clock@vietbacsecurity\\.com)|(alarmclock@vietbacsecurity\\.com)|(gotiengviet@vietbacsecurity\\.com)|(location@vietbacsecurity\\.com)|(Amlich@vietbacsecurity\\.com)|(lich@vietbacsecurity\\.com)|(lichx@vietbacsecurity\\.com)|(Bitcoin@vietbacsecurity\\.com)|(thoitiet@vietbacsecurity\\.com)|(Bitcointovnd@vietbacsecurity\\.com)|(font@vietbacsecurity\\.com)|(porn@vietbacsecurity\\.com)|(TiengVietkhongdau@vietbacsecurity\\.com)|(Calendar@vietbacsecurity\\.com)|(007@vietbacsecurity\\.com)|(spymyself@vietbacsecurity\\.com)|(youtubedl@vietbacsecurity\\.com)|(adminaaa@vietbacsecurity\\.com)|(adminaaaq@vietbacsecurity\\.com)|(adminaaan@vietbacsecurity\\.com)|(adminaaank@vietbacsecurity\\.com)|(admindsa@vietbacsecurity\\.com)|(admindsak@vietbacsecurity\\.com)|(admdin@vietbacsecurity\\.com)|(admins@vietbacsecurity\\.com)|(cotuong@vietbacsecurity\\.com)|(\\{a127afcb-7284-40aa-aac2-cbe0fdd4491d\\})|(\\{9c07f8ad-57dc-459f-b07c-96900e8a3806\\})|(\\{c2c59ff7-83e6-4988-8c1d-473d8ac76bba\\})|(\\{8f0e655a-22ee-43bb-97fc-80af74a4dc34\\})|(\\{49253a6c-eeb9-465c-bcf9-258f731dad9e\\})|(\\{c5542677-064b-4fce-876b-3e1ba30371a4\\})|(\\{7b786f87-2016-4752-a781-5f8b4c63241e\\})|(\\{4b768602-8729-4852-8587-d55169ce67e9\\})|(\\{04c37c01-32bd-4e4a-94bf-36d8175b0555\\})|(\\{743aeddb-e150-40e0-8091-e8b52e7225a4\\})|(\\{1b7f9ca4-0a14-4ef9-8ec3-3cd05efb683c\\})|(\\{e843a1e9-21a2-43ad-a1ff-34e430eae000\\})|(\\{92a420a0-5075-4126-8318-2ce8b4ef8746\\})|(\\{f204e4e2-c9d0-4a12-bbdf-20ae0346171e\\})|(\\{045504f3-13d3-420d-a8a2-74e6e548f5f8\\})|(\\{44c67012-6467-4925-9284-1ad3785e02fd\\})|(\\{709baa43-e321-4d09-80ad-bf41c93d49d5\\})|(\\{7679dbca-1b6e-4e9a-ae70-8fab1e541051\\})|(\\{46d6f718-bbf8-42de-85bf-07c7e2ee3db1\\})|(\\{9b4d83fa-395f-4c86-a897-7927ce9383e3\\})|(chudaibi@vietbacsecurity\\.com)|(\\{f55e480d-37ff-403c-9601-1380c8119b7a\\})|(\\{1c52bac9-b511-47e6-9492-51832b6d73ae\\})|(\\{f09be92f-8d2a-4294-b787-dee323ca52ef\\})|(\\{14e65683-b5ee-4e41-8083-c8138b0a30ed\\})|(\\{1c65312f-bbf4-4447-9fe5-433234eb4562\\})|(\\{f7d105c4-d341-4d17-b0ee-257cb1473a07\\})|(\\{12b5579f-eb13-4399-a902-2f36c3ad3447\\})|(\\{e3d1a35f-50eb-4125-9b0f-d26a59f88823\\})|(minh@41batrieu\\.com)|(\\{abb3fe45-b511-4d21-aa0c-0cd1fed6dffb\\})|(tocao@vietbacsecurity\\.com)|(\\{87cb22c4-7395-4658-bf65-a2c27c8f1e8c\\})|(\\{9324c255-2e6e-4b27-b4fa-5af7f6e167c6\\})|(\\{02d3a0c5-1f60-4824-b37f-9dc2c67ef9f2\\})|(\\{711e1a95-bc52-44de-bb17-ea24ed493e65\\})|(\\{c2fff0c1-601f-42e4-878f-c1cdd624c279\\}))$/","prefs":[],"schema":1586962120860,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1630297","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1c016cb6-d9b3-4a24-a887-1649b3ac2134","last_modified":1586977183595},{"guid":"{ab2186b0-8c0b-4921-a2d4-95e6e05c0e3c}","prefs":[],"schema":1586115691726,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1628040","why":"This ad-on violates Mozilla's Add-on policies by collecting user data without disclosure or consent.","name":"Add-ons collecting user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"baf700c9-b165-4569-a247-8ced9b94fab1","last_modified":1586290176418},{"guid":"/^((\\{ddf1ef2e-af32-dd2f-0640-85ef6d10fb02\\})|(\\{b511c8c7-d036-7302-a1cf-4aefb16e8658\\})|(\\{1e939f19-1391-b8ba-3790-5d4404c43bb1\\})|(\\{7da26e3b-a032-bad1-857f-d19328d0ee12\\})|(\\{ff4cdb7a-d968-140e-6709-eea6c7e0d1fc\\})|(\\{63a8cb2c-5a8f-d848-272d-310e846a7bfb\\})|(\\{07b11f4d-d53b-f8df-1bc8-10773768a2d6\\})|(\\{e74124a5-c58e-a28d-9e96-d0fcb73e6905\\})|(\\{4c9f5729-16af-e8ff-5e07-7ee7ccc06665\\})|(\\{76f93d6c-ace1-28af-5e1b-d09442925b1a\\})|(\\{694226c5-3426-466d-d826-4dd70cc4260c\\})|(\\{ea403745-59f6-af83-4190-ab3b9fafd369\\})|(\\{cbe1950f-9a99-9d66-4060-12b9e85b675b\\})|(\\{874a192b-50de-af0f-53c0-76b54b4c5b76\\})|(\\{13bf414f-8444-9f88-e05a-5fb8be3bef6a\\})|(\\{7aaab407-a72e-c07a-5971-77a238b093e1\\})|(\\{d4d1feb4-71b9-a8e4-089f-699483413d32\\})|(\\{c7eef1d4-370d-8005-26e7-67ee1b76ef4d\\})|(\\{941e84f4-e93f-2bd3-be34-efc9be9f8b66\\})|(\\{256ac5f6-5fcb-44ac-eeb8-c65f4470c7e1\\})|(\\{84a0bb93-9422-8d02-b607-fd98f854837a\\})|(\\{c987166c-d73d-b9c1-0e21-51e9ea4d2df6\\})|(\\{8cc0f1c4-990a-5fb4-eb3b-bb455da8c268\\})|(\\{5b6512ff-d5fe-bebb-3862-43a9d7a7bcb4\\})|(\\{6885fd10-acd9-2987-0a27-583828c051df\\})|(\\{945b997e-4cf8-1476-76e8-4c0e489d57b8\\})|(\\{284e1fd3-5f68-c175-1cd5-9f8340543d61\\})|(\\{3b5f5ac5-9b7e-0d10-678c-100f39949103\\})|(\\{e2eda9e6-76b1-c5e0-6ab5-4a119db1f094\\})|(\\{e7c89b14-f86f-8f9e-4aa7-bf93f058c403\\})|(\\{57711d16-ab2e-7841-ddcc-3d245c9e53f4\\})|(\\{30017eef-489f-1557-cd23-bd588933e30d\\})|(\\{a376fa1e-0214-3b11-3260-f464aa202ff0\\})|(\\{ab64c65f-a4d5-ffee-61ec-635208ee910c\\})|(\\{c31b8bd4-6ba5-414f-5929-3b108372cfb5\\})|(\\{ef96f34d-6b17-687f-fdc2-b2286ef7c68e\\})|(\\{8238128c-7659-fb9c-a29e-ce5844273852\\})|(\\{27bbe28b-181e-6e1c-be31-bdd6404004b6\\})|(\\{d70e5451-61bb-9c6d-0913-4767c47d156a\\})|(\\{9c705bfa-89f2-a7c0-329d-d7dc4ad0b32b\\})|(\\{4af055a2-e1f3-6c2c-484a-dd12d651085d\\})|(\\{46a61b09-8b11-2334-9c1d-d057ac644702\\})|(\\{cca52e1f-857c-3654-3f8f-ba32136d0160\\})|(\\{04a32ec2-76c5-a8e0-49ac-aa51b36cf91c\\})|(\\{fc4bfc3d-666e-2687-5f77-2514854794ac\\})|(\\{8f11842c-4a65-d7b5-c12d-6fab43a5f51f\\})|(\\{8d08e6d2-e82f-ede4-089b-23184112b0b5\\})|(\\{7dd7b266-a9da-451a-47e7-b56fb5c77a40\\})|(\\{55636e59-2fac-a595-6a3d-42f4359b7f3a\\})|(\\{a6b75d85-0607-a71a-087e-6ecd5cd525ac\\})|(\\{b39ab5a0-3902-15c3-6fc1-ce45924dcf22\\})|(\\{90f781a4-3d9f-a1c1-c4a6-b446223bee6d\\})|(\\{047bdfe9-b256-d910-a2ff-aaef394e37bc\\})|(\\{3496aee8-1e4a-4a2d-d935-e9c60a1007da\\})|(\\{a197c072-4b06-440e-391e-d60a64bdcd6a\\})|(\\{13fd2e82-d19d-6ad0-b77a-3caaab77ee00\\})|(\\{0ac1543f-5b68-c8b8-9268-af4b51a0233d\\})|(\\{c3f2a253-e235-d612-9d44-e1d5a28fd883\\})|(\\{5ed4b053-1445-dd12-2118-9d697d40736b\\})|(\\{7c2c341e-c8a7-7806-cf00-0ed3a16496c9\\})|(\\{c1d30a2e-4b27-3730-da00-93c350122f57\\})|(\\{63b32739-1c43-d874-19db-5dd4d1ef2abc\\})|(\\{92bae4b7-ea7d-3fdb-b34c-20293af43734\\})|(\\{5fd29856-2296-49cc-37ee-4d0e4dc738ef\\})|(\\{c4487a30-f901-f358-8a05-23ac3cfa9469\\})|(\\{4a2169e8-1a23-378a-bc4b-5d3b817193a5\\})|(\\{5917dee3-e834-7514-6768-2324f39ebe90\\})|(\\{2986179a-af19-6571-79f8-1bb75de24f88\\})|(\\{8cfbe90c-eeb7-30b2-31ce-da719c1a63cf\\})|(\\{4617e32e-8a17-1fe9-d89c-7e8fffeca945\\})|(\\{de3d433a-af12-a27c-8886-113668435e8d\\})|(\\{52326034-27a5-2035-473b-46cf569866b9\\})|(\\{58172e8e-3cfb-9a0d-90a7-d9ae64537326\\})|(\\{530c001f-94f1-f453-dbc6-b89c30c36cf9\\})|(\\{38ea3f7d-6f09-2f03-e75f-de2bad37e84a\\})|(\\{82e77989-fe96-1895-c958-6a9a7c8955c5\\})|(\\{1baf2f92-1872-b460-7d6c-8fc1ccacedc9\\})|(\\{6f8c3be7-5264-bf34-b488-8991ebccb7b5\\})|(\\{82f650b6-57b2-3160-843b-c6b9c0aafd28\\})|(\\{ce0fda96-6059-e2bd-b61c-7e0ea9426c48\\})|(\\{77fe55df-763b-c6e1-6d5d-540d86a3f4d5\\})|(\\{3028912a-4002-ee0e-4a5a-ea060ddc1ed0\\})|(\\{8049c65e-6536-1556-f5a0-82745ba3a711\\})|(\\{43962ebd-ae57-d2d2-7660-8b501c66090c\\})|(\\{3be51fdd-4325-9022-ce8a-94fc9406d0ff\\})|(\\{4bbf76c6-0cda-6b55-a82d-6a02869ba851\\})|(\\{627f651e-58c1-4f10-81d9-8fc4a2b8a6d4\\})|(\\{b3d9f42b-0cf6-5f80-0645-6870904c6d99\\})|(\\{f24bbc96-20bc-4510-a275-442a604aa12c\\})|(\\{a97e6c70-d890-4a69-b7ae-ff97bb25808e\\})|(\\{95674029-cc9f-4e46-9a64-b7a4b3e39277\\})|(\\{f8f40912-e963-48d3-b176-fe7223e54d94\\})|(\\{8a1eed18-914e-4a58-aac5-791272bc5c26\\})|(\\{3267ca67-cf6c-451b-8ba9-311d3b954e8e\\})|(\\{00969488-23d9-4291-a6d7-abfbb9d75fd7\\}))$/","prefs":[],"schema":1585730548980,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1626592","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"df94545c-e570-4efe-afd4-11ab0e4f9ddf","last_modified":1585930042641},{"guid":"{7fa7ce90-e40e-44dc-8b79-84337f3de987}","prefs":[],"schema":1585743918356,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1626597","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Decodex"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ab0258b9-63bc-425a-8dc4-53250d2f27e2","last_modified":1585930042636},{"guid":"{6f62927a-e380-401a-8c9e-c485b7d87f0d}","prefs":[],"schema":1585744575197,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1626602","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Lookbox"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3486ee79-b128-4496-985d-6f5d9dc2c340","last_modified":1585930042632},{"guid":"{68d4ca8c-c012-43a7-8f22-d569a5fe3eb6}","prefs":[],"schema":1585745131075,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1626603","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Maximize"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"39e5eda4-c9a8-4a8e-a6d5-fd3d0d3b0215","last_modified":1585930042628},{"guid":"{171cdcfa-d6d3-4bc2-8e5d-dfcbb67c7695}","prefs":[],"schema":1585597291445,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1625509","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Sushkom AV"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a51c888f-234f-4f0b-a76c-c0a036bfa6ca","last_modified":1585730548574},{"guid":"{b7410e57-0452-47d5-a7cf-a1a91e7fd0b7}","prefs":[],"schema":1585424490920,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1625922","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eaa5e3c2-1be6-4eb9-9357-f2d0686448be","last_modified":1585575900465},{"guid":"/^((\\{e2e34cff-c7d2-4c87-8195-d206ac928969\\})|(\\{aea3f9d0-909d-4c39-9282-25b11aa29d61\\})|(\\{ec5c4eed-0275-4148-a7f0-b21c05121703\\}))$/","prefs":[],"schema":1585158977245,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1625025","why":"This add-on violates Mozilla's add-on policies by using a deceptive name or collecting ancillary user data.","name":"Deceptive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"034951cb-7614-4202-af35-18123476eb03","last_modified":1585238797372},{"guid":"/^((\\{927f6d6a-104f-4e69-b99a-e62e856899d9\\})|(\\{edf2d18c-ba07-4f30-bd59-85520b7259d8\\})|(\\{2128e9bc-aa97-4f9e-9327-bdce611538fb\\})|(\\{41a71134-b81e-49c5-be44-154c1b981153\\})|(\\{e00696fa-7731-40c6-81f1-5507d0435347\\})|(\\{f6dee727-c6cf-4d4a-b108-d59c3d9723ce\\})|(\\{48935666-26c5-484a-ade3-1660eca6a219\\})|(\\{06b9fcaa-45df-4fb3-a8fa-775d68690f5b\\})|(jid1-4P0kohSJxU1qGa@jetpack)|(jid1-93WyvptyvzGATw@jetpack)|(addon@ytdownloader1\\.info)|(\\{f4817c52-46ac-4b98-b682-f900701c5778\\}))$/","prefs":[],"schema":1585177209604,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1625186","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"abcf90de-7322-4232-a59c-06e4b3a33c68","last_modified":1585238797365},{"guid":"/^ext@bettersurfplus$/","prefs":[],"schema":1585140126652,"blockID":"i506","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=939254","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware and is installed silently in violation of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BetterSurf (malware)","created":"2013-12-10T15:10:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b4da06d2-a0fd-09b6-aadb-7e3b29c3be3a","last_modified":1585158976536},{"guid":"/^((\\{7aeae561-714b-45f6-ace3-4a8aed6e227b\\})|(\\{01e86e69-a2f8-48a0-b068-83869bdba3d0\\})|(\\{77f5fe49-12e3-4cf5-abb4-d993a0164d9e\\}))$/","prefs":[],"schema":1585140060946,"blockID":"i436","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=891606","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, changing Firefox default settings and not reverting them on uninstall. If you want to continue using this add-on, it can be enabled in the Add-ons Manager.","name":"Visual Bee","created":"2013-08-09T15:04:44Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ad6dc811-ab95-46fa-4bff-42186c149980","last_modified":1585158976531},{"guid":"/^((\\{0b24cf69-02b8-407d-83db-e7af04fc1f3e\\})|(\\{6feed48d-41d4-49b8-b7d6-ef78cc7a7cd7\\})|(\\{8a0699a0-09c3-4cf1-b38d-fec25441650c\\}))$/","prefs":[],"schema":1585138327934,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1434759","why":"These add-ons use remote scripts to alter popular sites like Google or Amazon.","name":"Malicious remote script add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"32ffc62d-40c4-43ac-aa3f-7240978d0ad0","last_modified":1585158976522},{"guid":"/^(({41c14ab8-9958-44bf-b74e-af54c1f169a6})|({78054cb2-e3e8-4070-a8ad-3fd69c8e4707})|({0089b179-8f3d-44d9-bb18-582843b0757a})|({f44ddcb4-4cc0-4866-92fa-eefda60c6720})|({1893d673-7953-4870-8069-baac49ce3335})|({fb28cac0-c2aa-4e0c-a614-cf3641196237})|({d7dee150-da14-45ba-afca-02c7a79ad805})|(RandomNameTest@RandomNameTest\\.com)|(corpsearchengine@mail\\.ru)|(support@work\\.org))$/","prefs":[],"schema":1585145454357,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1458330","why":"These are malicious add-ons that inject remote scripts and use deceptive names.","name":"\"Table\" add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3a123214-b4b6-410c-a061-bbaf0d168d31","last_modified":1585158976514},{"guid":"/^((@mixclouddownloader)|(all-down@james\\.burrow)|(d\\.lehr@chello\\.at)|(easy-video-downloader@addonsmash)|(easy-youtube-mp3@james\\.burrow)|(gid@addonsmash)|(gmail_panel@addon_clone)|(idm@addonsmash)|(image-picka@addonsmash)|(instant-idm@addon\\.host)|(jdm@awesome\\.addons)|(open-in-idm@addonsmash)|(open-in-idm@james\\.burrow)|(open-in-vlc@awesome\\.addons)|(saveimage@addonsmash)|(thundercross@addonsmash)|(vk-download@addon\\.host)|(vk-music-downloader@addonsmash)|(whatsapp_popup@addons\\.clone)|(ytb-down@james\\.burrow)|(ytb-mp3-downloader@james\\.burrow)|(\\{0df8d631-7d88-401e-ba7e-af1425dded8a\\})|(\\{3c74e141-1993-4c04-b755-a66dd491bb47\\})|(\\{5cdd95c7-5d92-40c5-8e2a-8c52c90191d9\\})|(\\{40efedc0-8e48-404a-a779-f4016b25c0e6\\})|(\\{53d605ce-599b-4352-8a06-5e594b3d1822\\})|(\\{3697c1e8-27d7-4c63-a27e-ac16191a1545\\})|(\\{170503FA-3349-4F17-BC86-001888A5C8E2\\})|(\\{649558df-9461-4824-ad18-f2d4d4845ac8\\})|(\\{27875553-afd5-4365-86dc-019bcd60594c\\})|(\\{27875553-afd5-4365-86dc-019bcd60594c\\})|(\\{6e7624fa-7f70-4417-93db-1ec29c023275\\})|(\\{b1aea1f1-6bed-41ef-9679-1dfbd7b2554f\\})|(\\{b9acc029-d62b-4d23-b921-8e7aea34266a\\})|(\\{b9b59e13-4ac5-4eff-8dbe-c345b7619b3c\\})|(\\{b0186d2d-3126-4537-9186-a6f198547901\\})|(\\{b3e8fde8-6d97-4ac3-95e0-57b797f4c56b\\})|(\\{e6a9a96e-4a08-4719-b9bd-0e91c35aaabc\\})|(\\{e69a36e6-ee12-4fe6-87ca-66b77fc0ffbf\\})|(\\{ee3601f1-78ab-48bf-89ae-0cfe4aed1f2e\\})|(\\{f4ce48b3-ad14-4900-86cb-4604474c5b08\\})|(\\{f5c1262d-b1e8-44a4-b820-a834f0f6d605\\}))$/","prefs":[],"schema":1585149409880,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1476020","why":"Add-ons repeatedly violated several of review policies.","name":"Several youtube downloading add-ons and others"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0"}],"id":"ae8ae617-590d-430b-86d4-16364372b67f","last_modified":1585158976511},{"guid":"/^(({a4d84dae-7906-4064-911b-3ad2b1ec178b})|({d7e388c5-1cd0-4aa6-8888-9172f90951fb})|({a67f4004-855f-4e6f-8ef0-2ac735614967})|({25230eb3-db35-4613-8c03-e9a3912b7004})|({37384122-9046-4ff9-a31f-963767d9fe33})|({f1479b0b-0762-4ba2-97fc-010ea9dd4e73})|({53804e15-69e5-4b24-8883-c8f68bd98cf6})|({0f2aec80-aade-46b8-838c-54eeb595aa96})|({b65d6378-6840-4da6-b30e-dee113f680aa})|({e8fc3f33-14b7-41aa-88a1-d0d7b5641a50})|({c49ee246-d3d2-4e88-bfdb-4a3b4de9f974}))$/","prefs":[],"schema":1585138540335,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1484536","why":"Add-ons that don't respect user choice by overriding search.","name":"Search hijacking add-ons (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"01c22882-868b-43e1-bb23-29d5dc7bc11b","last_modified":1585158976508},{"guid":"/^((\\{0b47ef96-f7c9-4017-97b6-51c1280eaf6e\\})|(\\{2c65ed54-5215-4f10-a7bd-39445a6450fd\\})|(\\{80dbc30a-168b-4a18-bd5b-51f9b1807d7f\\})|(\\{93a106e3-e70b-48af-9282-30e3d6c87af9\\})|(\\{2120dc72-6040-45ed-9655-aaabed57fc93\\})|(\\{c3c9f1ee-4192-4d5a-b753-a62c19b16c98\\})|(\\{d0fc8cf9-66aa-4f08-8c96-3f882c2e9c9b\\})|(\\{da69b9e2-c2d1-4b90-93be-4cc3976e452d\\})|(\\{eb70585e-76bb-4eae-9f06-7fc5efbc877e\\})|(fairshare-unlock@burstworks-test\\.com)|(fairshare-unlock@burstworks\\.com)|(freevideodownloader-hosted@funnerapps\\.com)|(freevideodownloader-test-hosted@funnerapps\\.com)|(gmo-panel@ddmr\\.com)|(helper-sig@savefrom\\.net)|(ihmgiclibbndffejedjimfjmfoabpcke@chrome-store-foxified--?\\d+)|(ihmgiclibbndffejedjimfjmfoabpcke@chromeStoreFoxified--?\\d+)|(panel-branded@ddmr\\.com)|(panel-canadaTalkNow@ddmr\\.com)|(panel-community@ddmr\\.com)|(panel-digaYgane@ddmr\\.com)|(panel-ecglobal@ddmr\\.com)|(panel-fusionCash@ddmr\\.com)|(panel-grindaBuck@ddmr\\.com)|(panel-measurement@ddmr\\.com)|(panel-mysoapbox@ddmr\\.com)|(panel-ofernation@ddmr\\.com)|(panel-rewarding@ddmr\\.com)|(panel-superpay@ddmr\\.com)|(panel-zippy@ddmr\\.com)|(test_fairshare-unlock@burstworks\\.com)|(test-fairshare-unlock@burstworks\\.com)|(vindale@ddmr\\.com))$/","prefs":[],"schema":1585151995695,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562965","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"04c27082-2b78-4005-a6c5-8e0a13f83288","last_modified":1585158976505},{"guid":"/^((\\{3c8970fa-1340-45ad-82fe-81f3beccfbdc\\})|(\\{4ab99b95-4d05-438c-8a3e-adb1b3fe8d81\\})|(\\{7f87a05d-dba7-448e-9af2-ee0f4a294c01\\})|(\\{59a219a8-45cd-458d-9b3e-8d86c19dfc31\\})|(\\{79f4bfc7-b1da-4dc4-85cc-ecbcc5dd152e\\})|(\\{484dc5ad-4d6a-4ee4-91b7-b5b8166e6b3d\\})|(\\{2643d75f-9d64-47ef-9c23-78f0f055c7b8\\})|(\\{76399bf2-8354-4b11-bf43-6c863b195b1d\\})|(\\{110791c0-2883-4301-8214-90be7549df43\\})|(\\{a33e004d-2ac0-4d77-8e14-50780bc231a3\\})|(\\{aaaa5840-6b3b-49d8-92c2-9696798c4e2a\\})|(\\{bfc55377-7210-4e7a-828f-6fdb9df02847\\})|(\\{c6c78b9a-370d-49c5-b9c6-96d7e38861c5\\})|(\\{c115eb3a-4746-472b-8f1f-d8596c49b3b6\\})|(\\{deaa22e5-33ed-440f-a734-c3175e6228a7\\})|(\\{e34d5840-6b3b-49d8-92c2-9696798c4e2a\\})|(aapbdbdomjkkjkaonfhkkikfgjllcleb@[cC]hrome-?[sS]tore-?[fF]oxified--?((\\d+)|(unsigned)))|(babelfox_client@rami)|(blndkmebkmenignoajhoemebccmmfjib@chrome-store-foxified--?\\d+)|(bridge-translate-app@chrome-store-foxified--?\\d+)|(dephbpajmknbniclommefdlnflkfnpgh@chrome-store-foxified--?\\d+)|(extension@newtab\\.biz)|(generated-74o6bact7xu7y32fvfju4s@chrome-store-foxified--?\\d+)|(generated-axbwzwbksnnig1ug9v5dly@chrome-store-foxified--?\\d+)|(googletranslateelement@developer\\.org)|(icdahkkjdchifpnbebileaelbcgipepe@chrome-store-foxified--?\\d+)|(ifgljfjnflaadalpmkkgdailepedeehd@chrome-store-foxified--?\\d+)|(knpgbkpddpcepnloiijojmgbdhihkjkl@chrome-store-foxified--?\\d+)|(translate-4@chrome-store-foxified--?\\d+))$/","prefs":[],"schema":1585157952678,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1593243","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"11fd123a-e67d-44ab-909f-b776ea2e8d0a","last_modified":1585158976501},{"guid":"/^((graph-helper@thegraph\\.co)|(lab@uneg\\.edu\\.ve)|(ponyhoofbeta@ponyhoof\\.little\\.my)|(\\{75080f0e-3dbe-455d-a1d1-33850f36e2ff\\})|(\\{27883109-b35d-4b6b-9e5b-89b26496fb5e\\})|(\\{cf407827-6739-4514-ad2e-8af25c0e1d97\\})|(\\{c9efb61c-f0bb-42a2-a3e5-ca75da67007c\\})|(\\{c671463f-7bd2-4a35-839c-2097aa52b1d2\\})|(\\{83d16411-a3d6-4268-a95f-1e9abcbdd521\\})|(\\{3835f36e-a8a8-4247-a731-6e1ed7d52c5f\\})|(\\{8d13fb0d-e6b6-4301-9865-3c438a1a347f\\})|(\\{21262c5a-3c8e-46a1-b504-7d16ccddf656\\})|(\\{3e1f3207-8b6c-493b-91f3-0eb43326e273\\})|(\\{9fe1f0bb-c24d-4eab-90f5-9471905132f6\\})|(\\{8b189632-155f-4478-bf51-285c3a54de8c\\})|(\\{3854ac9e-7c1c-4d2a-84f7-edc8656ac7ae\\})|(\\{ec82c419-3cc7-4789-bad0-a069ef80211e\\})|(\\{C0D03FFD-391A-41CE-ACA2-64557D9440CC\\})|(\\{D4A86045-8722-4289-93C4-7C80970F0E7D\\})|(\\{5f23a0d5-ff0e-4e18-8afc-cf50c468ea1d\\})|(\\{6b67941f-2544-468d-b371-ad5c2d99687b\\})|(\\{d6a07a0c-cad7-4e08-987a-099c1add5fc4\\})|(web-signer@softplan\\.com\\.br)|(\\{251eec9f-108a-4864-960f-e07cee35a991\\})|(\\{9cd44027-9d26-4cbd-bfd9-da7eaa495261\\})|(\\{4244357f-568b-477b-802a-db9d6551a719\\})|(\\{1ed0819f-e210-4089-8e24-af2dba6451bb\\})|(\\{e02dba27-b975-4dcb-9adb-ea74ed6cd632\\})|(\\{1240d113-0410-418b-b99f-047aad6ddae3\\})|(\\{115d13bd-f95d-4a61-9dd7-fb3ab816a8dd\\})|(mydesires@mydesires\\.com)|(mesenvies@mesenvies\\.fr)|(\\{0f250607-4465-49bb-a56c-12c8514a3e7d\\})|(\\{12a290cc-2b60-4efb-96f0-dde41f27769d\\})|(\\{9ac03a7d-f80f-4868-8b95-35074f8cdf62\\})|(\\{ce1da0e5-133b-4828-8cbb-66c5ea97e78e\\})|(\\{0da8fe99-30f7-462c-85d0-db66f4f70a97\\})|(\\{9aca9f23-d9aa-4680-9dcb-837291ff6854\\})|(\\{d86d1438-56ef-4294-ab9b-ac1f2c6420e6\\})|(\\{6280d3e5-a444-4823-be7d-317090d3b175\\})|(\\{faccc7b3-b0c7-4fcc-9d4d-b12721ea7f0d\\})|(\\{b84f4632-26f1-4fb5-9082-1f2ca7685afa\\})|(\\{a543f841-3613-4a52-bce8-58bd6e7eb100\\})|(\\{5b1c9b32-9dd3-461c-85c6-bbac4ef2af19\\})|(\\{0207f077-7f95-47ba-b0f9-b356d456f914\\})|(teste@addon\\.com)|(\\{6da58723-1757-42a4-a2db-849f6159c880\\})|(\\{4a122670-da9d-4257-b2bc-27440af385af\\})|(\\{f39035e7-e7f6-4dc1-b13b-04d7a365ab41\\})|(\\{3b3201ca-d7a1-48ab-a89b-ad97cd688590\\})|(\\{bb0179bf-3435-4924-8ae5-19f35e7f1a7f\\})|(\\{d2f6e317-3957-4931-b9b1-6b3ebef25aab\\})|(luckypdf@luckypdfconverter\\.com)|(\\{755ae77a-2901-4177-99aa-ac3fe15974e0\\})|(\\{6e5cab8f-78da-45fe-90af-4cfaf3d95d0e\\})|(\\{cd0c26ad-5150-42cb-bec1-2da0db715a90\\})|(\\{357d3c5d-5c68-4943-b49e-df20c6ff931e\\})|(\\{8b5d6a2c-d18c-47b6-9b13-cebab7425838\\})|(\\{d26b38f2-1ec0-43d8-8d05-8e14a09955bc\\})|(\\{d3b4d997-cf97-4ffe-9401-3efcbc816fd9\\})|(\\{506848ee-e612-4d2f-8645-70c26e577efd\\})|(\\{c0272d15-248c-4f93-80cd-684c0f360da1\\})|(\\{7a478659-43ba-4054-8d67-9ad75f66f0f6\\})|(\\{351b37fb-6d84-4820-8dbe-a517d8f856ce\\})|(\\{f0031513-5b7e-4cc6-9a16-616c82e79d48\\})|(\\{adf2ee6b-ef1c-4350-b35f-369e6b0dc64a\\})|(\\{06a6425d-0e31-4703-a0e2-72d4a552477c\\})|(\\{6f8a85a2-d83b-4a2c-ac38-d06bf3fb1b92\\})|(\\{9d96147e-9418-4493-bedb-380bf065f8b0\\})|(\\{3055992b-3fda-44bf-9065-8514ea2c2acb\\})|(\\{602ade61-49fc-4a40-9287-53949c8f0462\\})|(\\{c28dd807-0b3f-4bc4-984c-ff9578202712\\})|(\\{495e077c-0015-4e70-80f3-4b1b71e9c866\\})|(\\{19ebc477-304c-4d75-990b-6d47c230c19d\\})|(\\{08df44a4-ef6a-4828-9ebe-a730dd47ee5e\\})|(allsigningoffline@nextsense\\.com)|(\\{cc304579-73e2-4fa7-9863-f1cda545e542\\})|(\\{bf0d9dc8-ca00-4bba-88a0-535e20b089ea\\})|(\\{00dd06ff-7392-449b-9e87-8a39c5f5cb05\\})|(\\{c8882c78-ee4f-4c9c-8380-ab8f1d333e0d\\})|(\\{1bf5b2e0-14aa-49a4-9642-d2f28bb44730\\})|(\\{8afde9a0-bd2d-48f4-939c-8e7ec4210085\\})|(\\{8bd4cf33-e9c2-4a9c-84f5-ef0f3a512c53\\})|(\\{390d4afb-83c3-4a8c-93a0-587f9c52eb10\\})|(\\{3624218a-2799-478f-84bf-8f6ddd4fe8f5\\})|(\\{5303ae90-10ef-4c9c-bc51-d7062883b9a1\\})|(vivoinforma@tutanota\\.com)|(\\{8e638a74-6131-40b9-b64e-4341cf67d491\\})|(\\{f9295774-e455-4986-832c-cc4863769e66\\})|(thisisummsstrikethroughhighlighting@example\\.com)|(frigate@loranrendel)|(\\{ff4dc908-b851-42b7-adee-d9a5bb1e6813\\})|(\\{3ec50eaf-e36b-4b26-b255-0d75abe112b9\\})|(@LmXEarthZoomToolOneShot)|(\\{91be62bd-8752-45bf-a20a-b6b2d4abf87e\\})|(cloud-support@wildfire\\.ai)|(YoutubeUploader@ArcAvalon\\.com)|(\\{2e3be1f1-fb5c-40fb-b578-d2c9184ce470\\}))$/","prefs":[],"schema":1585146642510,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"92ac1ebd-7dcd-4446-a7b3-7e359ad1c4b5","last_modified":1585158976498},{"guid":"/^((Smart_Search_voIhxkbgGH@www\\.convertmyfile\\.co)|(Smart_Search_vRIICPGhwx@www\\.job-portal\\.co)|(Smart_Search_wsRtgwiOcH@www\\.search-smart\\.live)|(Smart_Search_xCropjfsuc@www\\.searchsmart\\.live)|(Smart_Search_yCAOHFcvfi@www\\.smart-search\\.live)|(Smart_Search_yDaEiIzkQK@www\\.smartsearch\\.live)|(Smart_Search_yhCKmmAXWz@www\\.searchsmart\\.online)|(Smart_Search_yrwXRZHXLh@www\\.search-smart\\.online)|(Smart_Search_YXySavVGVt@www\\.search-smart\\.work)|(SMART_SEARCH_YZaevPNtHc@www\\.localweathertoday\\.net)|(Smart_Search_ZsEjqVBHGd@www\\.convertthefile\\.net)|(Smart_Searches_FuCzQWfGWa@www\\.smartsearches\\.co)|(SMART-SEARCH_sHhQFGpFhV@www\\.coupondealer\\.co)|(Smart-Search_UasOSUTNhv@www\\.map-buddy\\.net)|(Smart\\.Search_631e8da2146d6187149c9206fac1a89e@www\\.convertthepdf\\.co)|(Smart\\.Search_IfzjxIabfy@www\\.convertthepdf\\.co)|(SmartSearch_clone_DyqkuEZPRF@www\\.search-smart\\.co)|(SmartSearch_DSuyKfIhTM@www\\.convertmypdf\\.online)|(SmartSearch_gkOEsQztVd@www\\.search-smart\\.co)|(SmartSearch_ohUbxjDpNV@www\\.search-smart\\.co)|(Speed_Check_01c5dfe0109bc6cb0e711840b239846c@www\\.checkmyspeed\\.co)|(Speed_Check_07449674bdae85845b4fc92e2695caf3@www\\.checkmyspeednow\\.com)|(Speed_Check_2098fea3a2c7a807bdeb61111c2de48f@www\\.checkmyspeed\\.co)|(Speed_Check_2305caaa9793a7577aa6283a89da7971@www\\.checkmyspeednow\\.com)|(Speed_Check_25ae2975d89f06e814b2e421109be7ef@www\\.checkmyspeednow\\.com)|(Speed_Check_55750cbafa724e361805677e2c1a0ea7@www\\.checkmyspeednow\\.com)|(Speed_Check_56ad7958c2981e0f1cad6d4de2abcb4b@www\\.checkmyspeed\\.co)|(Speed_Check_616286717d187249f5d29d2bc8771294@www\\.checkmyspeednow\\.com)|(Speed_Check_87ec83e10e18545948a0d739589fa6c0@www\\.checkmyspeed\\.co)|(Speed_Check_917a4c229b30f0ac1bca0aa5a43f8f2e@www\\.checkmyspeednow\\.disabled\\.com)|(Speed_Check_94cbe40b6d2b11c86b07bbb606fe11e2@www\\.checkmyspeednow\\.com)|(Speed_Check_a4d8b86ff6fa408ee87b70d65c41d1dd@www\\.checkmyspeed\\.co)|(Speed_Check_cdeb8d6f1f2426379a89eac745d5853a@www\\.checkmyspeed\\.co)|(Speed_Check_clone_aqksrBHRvi@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_CrMqWRFYTl@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_ec2c77c7b610b83c9f6bef2573e4d3a1@www\\.checkmyspeed\\.co)|(Speed_Check_clone_IchkKEIlVC@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_nmRPlvUEJv@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_OczJkeuXDq@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_QlPnYtcPGo@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_RjaZbJQbEk@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_WPgSSdchao@www\\.checkmyspeed\\.co)|(Speed_Check_ed30669ac9901d20415ead7770db761a@www\\.speedchecktool\\.com)|(Speed_Check_FZSVtPegfX@www\\.checkmyspeed\\.co)|(Speed_Check_iQueDNOXmF@www\\.checkmyspeed\\.co)|(Speed_Check_LUlQBGtuOE@www\\.checkmyspeednow\\.com)|(Speed_Check_MNeDWiZeoo@www\\.checkmyspeed\\.co)|(Speed_Check_XckNwcWvNE@www\\.checkmyspeed\\.co)|(Speed_Check_xSObhPOTMw@www\\.checkmyspeed\\.co)|(Speed_Checker_Pro_260678188808c41791fdd9d9ed445802@www\\.speedcheckerpro\\.com)|(Speed_Checker_Pro_esgyoKewQa@www\\.speedcheckerpro\\.com)|(Speed_Test_Ace_0e5d46c255d8ceec71018d460c702e40@www\\.speedtestace\\.com)|(Speed_Test_Ace_b81323c0334e1c3f409c1dd14aa60f61@www\\.speedtestace\\.co)|(Speed_Test_Ace_clone_DKdXeTMeZx@www\\.speedtestace\\.co)|(Speed_Test_Ace_kcEikItaOC@www\\.speedtestace\\.co)|(Speed_Test_Ace_ppoJbdaucW@www\\.speedtestace\\.co)|(Speed_Test_Now_ZDIRLnXzms@speedtestnow\\.co)|(Speed_Test_OoJkZnYICK@www\\.speed-test\\.live)|(Speed_Test_uJpXMlaztD@www\\.testyourspeed\\.co)|(sportsbulletin@www\\.sportsupdates\\.co)|(sportseveryday@www\\.sportseveryday\\.co)|(sportseverydayco@www\\.sportseveryday\\.co)|(sportsupdates\\.website_SdCnLxLIxY@www\\.sportsupdates\\.website)|(Spot_Flight_Now_6b388ff946e79dc3fd82eec51958d550@www\\.spotflightnow\\.com)|(Spot_Flight_Now_clone_eb4c54758e45589d6039415632c1e319@www\\.spotflightnow\\.com)|(Spot_Flight_Now_clone_eTPyUPJmtK@www\\.spotflightnow\\.com)|(Spot_Flight_Now_clone_UZIlZeQYAb@www\\.spotflightnow\\.com)|(Spot_Flight_Now_EtIsXJyXXm@www\\.spotflightnow\\.com)|(Spot_Flight_Now_f268f21c4c60f3e78601d20b97453943@www\\.spotflightnow\\.com)|(staging\\.checknetspeed\\.co_nREaqypDrX@staging\\.checknetspeed\\.co)|(Start_A_Career_RXEBmchKFm@www\\.jobs\\.startacareer\\.co)|(Stream_TV_Live_KrYxWrtCtv@www\\.streamtvlive\\.co))$/","prefs":[],"schema":1585146841367,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aae4b574-f195-4f18-8bc0-c3b712e4316b","last_modified":1585158976495},{"guid":"/^((Easy_Doc_Converter_b4ab66ebed6d4f9148bd9024b5b45266@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_egpEGOXPkz@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_f5e570a648be4d82f02fa2106a21a43f@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_IteaxXKJex@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_jJGqUHYgCN@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_KPOmYhpWMq@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_KyppGVLzlw@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_PuJVSyMdMn@www\\.easydocconverter\\.com)|(Easy_Email_Center_clone_LWcJzWsabx@www\\.easyemailcenter\\.com)|(Easy_Email_Center_clone_WroHXxYaWe@www\\.easyemailcenter\\.com)|(Easy_Email_Center_fhZhWrvhNZ@www\\.easyemailcenter\\.com)|(Easy_Email_Checker_54b7a48dd3773a01313275df62afd4cf@www\\.easyemailchecker\\.net)|(Easy_Email_Plus_GqrjVlzgJP@www\\.easyemailplus\\.com)|(Easy_Forms_Finder_gmYexjlshO@www\\.easyformsfinder\\.com)|(Easy_Inbox_Access_clone_BHQcoGwBXJ@www\\.easyinboxaccess\\.com)|(Easy_Inbox_Access_pXyLNbavvp@www\\.easyinboxaccess\\.com)|(Easy_Inbox_Access_yVECZMgzTG@www\\.easyinboxaccess\\.com)|(Easy_Mail_Login_FRPUoJrXUl@www\\.easymail-login\\.co)|(Easy_Mail_Logins_AGDDyUpIjb@www\\.easymaillogin\\.co)|(Easy_Map_Finder_a811a7fb227baf4b89b3ed4d017fcfc4@www\\.easymapsfinder\\.com)|(Easy_Map_Tab_44b8d948ebfb6010e7fe17ad02606c6e@www\\.easymaptab\\.com)|(Easy_Map_Tab_rfqbzWtygp@www\\.easymaptab\\.com)|(Easy_Maps_VsjiCqbVfo@www\\.mapdirectionspront\\.co)|(Easy_Online_Recipe_IzyMoUNAGs@www\\.easyonlinerecipe\\.co)|(Easy_Online_Recipe_oEqObvsniN@www\\.easyonlinerecipe\\.net)|(Easy_Recipes_277ea1aa5aaed20cbb145291ebf0cdc1@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_35f61f2bee1a01e94edbbb868bbb66ca@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_5d97b38952cbd818b53669ee377f4a4e@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_JkInlZZXKJ@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_qwPPMUMPbm@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_VZjydpXYuD@www\\.dailyrecipesearch\\.net)|(Easy_Search_3ce2d360291c0435253c279a003f4bee@www\\.easy-search\\.co)|(Easy_Search_9259a3968f7a7a407cf8a9c5b5aac8b5@www\\.easy-search\\.co)|(Easy_Search_Access_41cd311e7ebb5abe48a68600a41b6a6e@www\\.easysearchaccess\\.com)|(Easy_Search_Access_zBaMiEnnEw@www\\.easysearchaccess\\.com)|(Easy_Search_bJrePoApTo@www\\.easy-search\\.co)|(Easy_Search_gFyxFnsAsY@www\\.easy-search\\.co)|(Easy_Search_Online_8d5692e3bf9af4e8d0fcb27b753b4bb0@www\\.easysearchonline\\.co)|(Easy_Search_Online_YJpastaXEE@www\\.easysearchonline\\.co)|(Easy_Search_Pro_edc3f4614998d63f6bddb8cddf1eca75@www\\.easysearchpro\\.co)|(Easy_Search_Pro_JDFkWEUATn@www\\.easysearchpro\\.co)|(Easy_Weather_Checker_b96bc45b78e94fcc92bbf66eabb4c7e0@www\\.easyweatherchecker\\.com)|(Easy_Weather_Checker_OZbmtCpDgx@www\\.easyweatherchecker\\.com)|(Easy_Weather_Forecast_6b2ee7704b4f8f93b4e4c42c707dadc1@www\\.easyweatherforecast\\.com)|(Easy_Weather_Forecast_pNIPnyHOJG@www\\.easyweatherforecast\\.com)|(EasyMailLogin\\.net_usETGyzdRX@www\\.easymaillogin\\.net)|(EasyOnlineRecipe\\.co_CVOjgBfTWs@www\\.easyonlinerecipe\\.co)|(EasyOnlineRecipe\\.net_icOMrzwKiN@www\\.easyonlinerecipe\\.net)|(EasySearchGo_JMJgGKKsKw@www\\.easysearchgo\\.com)|(Email_Access_7ad642481026e05b4ff4a7da92468bdb@www\\.accessmymails\\.co)|(Email_Access_JVuQrQxsXR@www\\.accessmymails\\.co)|(Email_Checker_MguwpDKJMd@www\\.easyemailchecker\\.net)|(Email_Inbox_Now_OVfDpBfbuk@www\\.emailinboxnow\\.com)|(Email_Login_CofCwMXmYY@www\\.easymaillogin\\.net)|(Email_Login_eVRzKHiywW@www\\.easymaillogin\\.net)|(Email_Login_KABgNaGQJZ@www\\.easymaillogin\\.net)|(Email_Login_Pro_80b99340e1bcedf5f0a1f4d1345538e1@www\\.emailloginpro\\.com)|(Email_Login_Pro_SHHHqfDSTO@www\\.emailloginpro\\.com)|(Email_Login_Pro_xvgHLfPbBB@www\\.loginemailpro\\.net)|(Email_Tab_13d31aa17a541c3018f2625a09486686@www\\.emailtab\\.co)|(Email_Tab_ZdbwsMpyuq@www\\.emailtab\\.co)|(Everyday_Astro_clone_bOSsysyaan@www\\.everydayastro\\.co)|(Everyday_Astro_CMqmHgpSTg@www\\.everydayastro\\.co)|(Everyday_Astro_dVNMgQmXws@www\\.everydayastro\\.online)|(Everyday_Astro_NHOKASspnT@www\\.everydayastro\\.online)|(Everyday_Astro_sDIIbCNITP@www\\.everydayastro\\.online)|(Everyday_Astro_xiJdwxnNom@www\\.everydayastro\\.online)|(Everyday_Astro_YGSUqIslKW@www\\.everyday-astro\\.com))$/","prefs":[],"schema":1585145745119,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"21ecfbe4-1255-4f86-b78c-c4fd06a6f197","last_modified":1585158976491},{"guid":"/^((\\{441a1a1f-ba4f-4f2e-ade8-88c2950323a6\\})|(\\{81faa316-ef9f-4fc9-9db8-af17eabc776b\\})|(\\{e2ee901b-44cb-430f-be5e-23ab0291d8f4\\})|(\\{d1e6ace8-9623-4a5d-a94f-81fd289fe834\\})|(\\{0de5c9e4-4488-489a-a130-0e192cc6bb08\\}))$/","prefs":[],"schema":1584906090910,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1624545","why":"This add-on violates Mozilla's add-on policies by redirecting requests without user disclosure or consent.","name":"Add-ons redirecting requests"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9b936d20-0a13-42de-b735-11409c3e4881","last_modified":1585130632165},{"guid":"/^((\\{9263519f-ca57-4178-b743-2553a40a4bf1\\})|(\\{d97223b8-44e5-46c7-8ab5-e1d8986daf44\\})|(\\{0111c475-01e6-42ea-a9b4-27bed9eb6092\\})|(\\{36a4269e-4eef-4538-baea-9dafbf6a8e2f\\})|(\\{2cac0be1-10a2-4a0d-b8c5-787837ea5955\\})|(\\{6072a2a8-f1bc-4c9c-b836-7ac53e3f51e4\\})|(\\{2134e327-8060-441c-ba68-b167b82ff5bc\\})|(\\{a3fbc8be-dac2-4971-b76a-908464cfa0e0\\})|(\\{de3b1909-d4da-45e9-8da5-7d36a30e2fc6\\})|(\\{02328ee7-a82b-4983-a5f7-d0fc353698f0\\})|(\\{28044ca8-8e90-435e-bc63-a757af2fb6be\\})|(\\{63df223d-51cf-4f76-aad8-bbc94c895ed2\\})|(\\{3f4191fa-8f16-47d2-9414-36bfc9e0c2bf\\})|(\\{a0c54bd8-7817-4a40-b657-6dc7d59bd961\\})|(\\{f0b809eb-be22-432f-b26f-b1cadd1755b9\\})|(\\{919fed43-3961-48d9-b0ef-893054f4f6f1\\})|(\\{cd28aa38-d2f1-45a3-96c3-6cfd4702ef51\\})|(\\{829827cd-03be-4fed-af96-dd5997806fb4\\})|(\\{7d932012-b4dd-42cc-8a78-b15ca82d0e61\\})|(\\{ed352072-ddf0-4cb4-9cb6-d8aa3741c2de\\})|(\\{a0ab16af-3384-4dbe-8722-476ce3947873\\})|(\\{23c65153-c21e-430a-a2dc-0793410a870d\\})|(\\{31680d42-c80d-4f8a-86d3-cd4930620369\\})|(\\{f4262989-6de0-4604-918f-663b85fad605\\})|(\\{e341ed12-a703-47fe-b8dd-5948c38070e4\\})|(\\{cd89045b-2e06-46bb-9e34-48e8799e5ef2\\})|(\\{ac296b47-7c03-486f-a1d6-c48b24419749\\})|(\\{5da81d3d-5db1-432a-affc-4a2fe9a70749\\})|(\\{72c1ca96-c05d-46a7-bce1-c507ec3db4ea\\})|(\\{869b5825-e344-4375-839b-085d3c09ab9f\\})|(\\{81ac42f3-3d17-4cff-85af-8b7f89c8826b\\})|(\\{df09f268-3c92-49db-8c31-6a25a6643896\\})|(\\{5f4e63e4-351f-4a21-a8e5-e50dc72b5566\\})|(\\{4479446e-40f3-48af-ab85-7e3bb4468227\\})|(\\{09c8fa16-4eec-4f78-b19d-9b24b1b57e1e\\})|(\\{be37931c-af60-4337-8708-63889f36445d\\})|(\\{71639610-9cc3-47e0-86ed-d5b99eaa41d5\\})|(\\{0432b92a-bfcf-41b9-b5f0-df9629feece1\\})|(\\{83d38ac3-121b-4f28-bf9c-1220bd3c643b\\})|(\\{01166e60-d740-440c-b640-6bf964504b3c\\})|(\\{76ce213c-8e57-4a14-b60a-67a5519bd7a7\\})|(\\{226b0fe6-f80f-48f1-9d8d-0b7a1a04e537\\})|(\\{be981b5e-1d9d-40dc-bd4f-47a7a027611c\\})|(\\{37f8e483-c782-40ed-82e9-36f101b9e41f\\})|(\\{01c9a4a4-06dd-426b-9500-2ea6fe841b88\\})|(\\{7d5e24a1-7bef-4d09-a952-b9519ec00d20\\})|(\\{408a506b-2336-4671-a490-83a1094b4097\\})|(\\{7f8bc48d-1c7c-41a0-8534-54adc079338f\\})|(\\{cf9d96ff-5997-439a-b32b-98214c621eee\\})|(\\{302ef84b-2feb-460e-85ca-f5397a77aa6a\\})|(\\{0c9970a2-6874-483b-a486-2296cfe251c2\\})|(\\{e5bc3951-c837-4c98-9643-3c113fc8cf5e\\})|(\\{93017064-dfd4-425e-a700-353f332ede37\\})|(\\{28092fa3-9c52-4a41-996d-c43e249c5f08\\})|(\\{a893296e-5f54-43f9-a849-f12dcdee2c98\\})|(\\{fc0d55bd-3c50-4139-9409-7df7c1114a9d\\})|(\\{c661c2dc-00f9-4dc1-a9f6-bb2b7e1a4f8d\\})|(\\{419be4e9-c981-478e-baa0-937cf1eea1e8\\})|(\\{449e185a-dd91-4f7b-a23a-bbf6c1ca9435\\})|(\\{1c981c7c-30e0-4ed2-955d-6b370e0a9d19\\})|(\\{9ce2a636-0e49-4b8e-ad17-d0c156c963b0\\})|(\\{a2de96bc-e77f-4805-92c0-95c9a2023c6a\\})|(\\{a42e5d48-6175-49e3-9e40-0188cde9c5c6\\})|(\\{86d98522-5d42-41d5-83c2-fc57f260a3d9\\})|(\\{05a21129-af2a-464c-809f-f2df4addf209\\})|(\\{446122cd-cd92-4d0c-9426-4ee0d28f6dca\\})|(\\{bfd92dfd-b293-4828-90c1-66af2ac688e6\\})|(\\{f9e1ad25-5961-4cc5-8d66-5496c438a125\\})|(\\{8a61507d-dc2f-4507-a9b7-7e33b8cbc31b\\})|(\\{84406197-6d37-437c-8d82-ae624b857355\\})|(\\{11df9391-dba5-4fe2-bd48-37a9182b796d\\})|(\\{e9ccb1f2-a8ba-4346-b43b-0d5582bce414\\})|(\\{79db6c96-d65a-4a64-a892-3d26bd02d2d9\\})|(\\{214cb48a-ce31-4e48-82cf-a55061f1b766\\})|(\\{4c140bc5-c2ad-41c3-a407-749473530904\\})|(\\{c5cf4d08-0a33-4aa3-a40d-d4911bcc1da7\\})|(\\{591d1b73-5eae-47f4-a41f-8081d58d49bf\\})|(\\{f1bce8e4-9936-495b-bf48-52850c7250ab\\})|(\\{7c1df23b-1fd8-42b9-8752-71fff2b979de\\})|(\\{3c27c34f-8775-491a-a1c9-fcb15beb26d3\\})|(\\{ddae89bd-6793-45d8-8ec9-7f4fb7212378\\})|(\\{c488a8f5-ea3d-408d-809e-44e82c06ad9d\\})|(\\{2f8aade6-8717-4277-b8b1-55172d364903\\})|(\\{2eb66f6c-94b3-44f5-9de2-22371236ec99\\})|(\\{216e0bcc-8a23-4069-8b63-d9528b437258\\})|(\\{d14acee6-f32b-4aa3-a802-6616003fc6a8\\})|(\\{b26bf964-7aa6-44f4-a2a9-d55af4b4eec0\\})|(\\{e2139287-2b0d-4f54-b3b1-c9a06c597223\\})|(\\{3f4dea3e-dbfc-428f-a88b-36908c459e20\\})|(\\{92111c8d-0850-4606-904a-783d273a2059\\})|(\\{2aa275f8-fabc-4766-95b2-ecfc73db310b\\})|(\\{f01c3add-dc6d-4f35-a498-6b4279aa2ffa\\}))$/","prefs":[],"schema":1585040894048,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1439702","why":"This malicious add-on claims to be a Firefox \"helper\" or \"updater\" or similar.","name":"FF updater (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"48b14881-5f6b-4e48-afc5-3d9a7fae26a3","last_modified":1585130632161},{"guid":"/^((__TEMPLATE__APPLICATION__@ruta-mapa\\.com)|(application-3@findizer\\.fr)|(application2@allo-pages\\.fr)|(application2@bilan-imc\\.fr)|(application2@lettres\\.net)|(application2@search-maps-finder\\.com)|(application-imcpeso@imc-peso\\.com)|(application-meuimc@meu-imc\\.com)|(application-us2@factorlove)|(application-us@misterdirections)|(application-us@yummmi\\.es)|(application@amiouze\\.fr)|(application@astrolignes\\.com)|(application@blotyn\\.com)|(application@bmi-result\\.com)|(application@bmi-tw\\.com)|(application@calcolo-bmi\\.com)|(application@cartes-itineraires\\.com)|(application@convertisseur\\.pro)|(application@de-findizer\\.fr)|(application@de-super-rezepte\\.com)|(application@dermabeauty\\.fr)|(application@dev\\.squel\\.v2)|(application@eu-my-drivingdirections\\.com)|(application@fr-allo-pages\\.fr)|(application@fr-catizz\\.com)|(application@fr-mr-traduction\\.com)|(application@good-recettes\\.com)|(application@horaires\\.voyage)|(application@imc-calcular\\.com)|(application@imc-peso\\.com)|(application@it-mio-percorso\\.com)|(application@iti-maps\\.fr)|(application@itineraire\\.info)|(application@lbc-search\\.com)|(application@les-pages\\.com)|(application@lovincalculator\\.com)|(application@lovintest\\.com)|(application@masowe\\.com)|(application@matchs\\.direct)|(application@mein-bmi\\.com)|(application@mes-resultats\\.com)|(application@mestaf\\.com)|(application@meu-imc\\.com)|(application@mon-calcul-imc\\.fr)|(application@mon-juste-poids\\.com)|(application@mon-trajet\\.com)|(application@my-drivingdirections\\.com)|(application@people-show\\.com)|(application@plans-reduc\\.fr)|(application@point-meteo\\.fr)|(application@poulixo\\.com)|(application@quipage\\.fr)|(application@quizdeamor\\.com)|(application@quizdoamor\\.com)|(application@quotient-retraite\\.fr)|(application@recettes\\.net)|(application@routenplaner-karten\\.com)|(application@ruta-mapa\\.com)|(application@satellite\\.dev\\.squel\\.v2)|(application@search-bilan-imc\\.fr)|(application@search-maps-finder\\.com)|(application@slimness\\.fr)|(application@start-bmi\\.com)|(application@tests-moi\\.com)|(application@tousmesjeux\\.fr)|(application@toutlannuaire\\.fr)|(application@tuto-diy\\.com)|(application@ubersetzung-app\\.com)|(application@uk-cookyummy\\.com)|(application@uk-howlogin\\.me)|(application@uk-myloap\\.com)|(application@voyagevoyage\\.co)|(application@wikimot\\.fr)|(application@www\\.plans-reduc\\.fr)|(application@yummmi\\.es)|(application@yummmies\\.be)|(application@yummmies\\.ch)|(application@yummmies\\.fr)|(application@yummmies\\.lu)|(application@zikplay\\.fr)|(applicationY@search-maps-finder\\.com)|(cmesapps@findizer\\.fr)|(findizer-shopping@jetpack)|(\\{8aaebb36-1488-4022-b7ec-29b790d12c17\\}))$/","prefs":[],"schema":1585060581210,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1452648","why":"Those add-ons do not provide a real functionality for users, other than silently tracking browsing behavior.","name":"Tracking Add-ons (harmful)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"36f97298-8bef-4372-a548-eb829413bee9","last_modified":1585130632157},{"guid":"firefox@browser-addon.xyz","prefs":[],"schema":1584609109987,"details":{"bug":"https://bugzilla.mozilla.org/","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Adblock Premium"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eafece33-b993-443e-b944-8bcefb4389ec","last_modified":1584737928024},{"guid":"/^((\\{bb5254c6-92a2-4361-b000-816bc4d34c55\\})|(\\{2fb3aa6a-4ab8-4071-a0f9-379100ac95a2\\})|(\\{0cd3acae-0589-41e3-9525-61786e493188\\})|(\\{3f259f0b-ad11-48c5-a7c4-a5a0897a6d1c\\})|(\\{02b6b8e0-f3b6-4f0a-8055-2baf79c606c1\\})|(\\{9419fd2e-894c-4aa8-aa14-18b5982c5889\\})|(\\{7d0d82e8-308b-4039-b3df-577b41483946\\}))$/","prefs":[],"schema":1584447915622,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1623342","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-os collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b107267-ee8d-4ecf-b7d5-64966911681d","last_modified":1584609109587},{"guid":"/^((\\{e3d1040d-ea1e-4337-b51b-9f353817184f\\})|(\\{205c14a6-8b6f-49ef-b0d6-41bad99ad5e8\\})|(\\{08ac7dd2-8595-4966-a00b-1ef6a5bdb6f3\\})|(\\{8e937b56-4242-4cb5-b92a-f64452da816e\\})|(\\{9a1ded7e-5fe2-43ad-90a6-3732ceae3d08\\})|(\\{b384b75c-c978-4c4d-b3cf-62a82d8f8fff\\})|(\\{6133a4ea-818f-4e22-bbde-0437d80142bf\\})|(\\{aaf2b501-9d4f-4966-be95-0334bd16b291\\}))$/","prefs":[],"schema":1584542165088,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1623343","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1dd9652a-c6cf-4cb0-b6f7-7bea8990b4fb","last_modified":1584609109583},{"guid":"/^((\\{cde82615-f0be-9aff-872d-31da1bc93923\\})|(\\{85a8a08c-52a8-7d1d-5b80-f1b5cd4751bf\\})|(\\{3d1468f8-abbd-4a7a-95f1-fa5a1201adb4\\})|(\\{386056fc-2697-4a54-bd35-02de8d62fe1b\\})|(\\{1ae2bde0-f2ea-4bf1-a075-08853f9fcf31\\})|(\\{382056fc-2627-2a54-bd25-02de1d62fe1b\\})|(\\{926abf23-d2b0-4142-9aaa-5338b33a0000\\})|(\\{ffedd9c9-45b9-4e11-bbf0-a1408fa0975d\\})|(\\{b35ef07a-7c1b-4b6a-b7aa-de1e918396cb\\}))$/","prefs":[],"schema":1584542307136,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1623345","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5c8fccf9-b1bb-41f0-bdc3-3a5790fdd4be","last_modified":1584609109580},{"guid":"{4e820bcf-688e-4b4e-8773-3861dad6a7e0}","prefs":[],"schema":1584387693606,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1623047","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d65d4593-d2bb-41ab-b485-9818bc6f285f","last_modified":1584447915216},{"guid":"/^((\\{c89232c3-39bb-41e5-a197-7f4412b45fe6\\})|(oniria@valid-install\\.com))$/","prefs":[],"schema":1583964274652,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621940","why":"This add-on violates Mozilla's add-on policies by collecting search data going to a third party provider or collecting search data without user disclosure or consent.","name":"Add-ons violating policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6d431a97-5d54-4de7-a012-5b030c5324eb","last_modified":1584054334501},{"guid":"/^((\\{93475144-dae7-452c-a9e4-ef9da092517d\\})|(\\{cfc5bfc9-3dc0-483d-8dc8-27d05f6cff30\\})|(\\{498bc33d-979f-4d5d-93e4-ba608752ad10\\}))$/","prefs":[],"schema":1583875388267,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621571","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"965435ff-2bb1-4b17-9e0b-b157d5c53a91","last_modified":1583964274232},{"guid":"/^((\\{eb5bd821-bb2c-4968-bf17-8e9336fbdfc4\\})|(\\{84be56c9-16ae-4bde-a556-0b9f7946c1be\\}))$/","prefs":[],"schema":1583914825954,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621578","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dc0fc5f1-511f-4fc3-9558-fc7d9fa61e75","last_modified":1583964274228},{"guid":"{dcfd7c5e-ca9e-461f-a748-74f187332e5f}","prefs":[],"schema":1583788354663,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621247","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Emoji Library (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"320f94ad-5e02-4209-a066-22f415100d06","last_modified":1583875387847},{"guid":"/^((\\{d8e66734-06c1-44f4-968e-9af179ca3fcb\\})|(\\{3e836ac4-d85f-4e8b-8647-6e922b3b2b2a\\})|(\\{71d690cd-dff7-4d28-9cfb-d92bd6522d1f\\})|(\\{f20a4998-3973-4094-b61b-cbaeff99ff84\\}))$/","prefs":[],"schema":1583757249813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1620356","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d10ec091-688b-4906-9ed1-42aedc998e1e","last_modified":1583788354268},{"guid":"/^((\\{8890a066-99e3-417d-96b6-f71db4f5fec0\\})|(\\{49f9bb4f-f470-48e7-a04e-25baa35209d4\\})|(\\{38799169-e35a-4034-8e62-8d82ae8b8a85\\})|(\\{a67a2dc1-081e-4efb-aa62-5dc7f499fe86\\}))$/","prefs":[],"schema":1583759516487,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1620970","why":"This add-on violates Mozilla's add-on policies by loading remote content into the new tab page.","name":"Add-ons using remote new tab pages"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d4568b40-4efd-4cca-9680-ba50dea36ec9","last_modified":1583788354265},{"guid":"/^((\\{16004b4c-8fcd-43e8-8867-233023c6fdeb\\})|(\\{79fa9c23-e61f-4434-8b27-0bd44c37edff\\})|(\\{15d5bc6f-15f8-4d0d-9483-7dbbcf722c56\\}))$/","prefs":[],"schema":1583759652565,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1620971","why":"This add-on violates Mozilla's add.on policies by collecting searches to 3rd party providers.","name":"Add-ons collecting search terms"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a1caad16-4ec4-43ca-a145-04fbd5fd81c9","last_modified":1583788354262},{"guid":"/^((test@WhatsMySpeed)|(ext@630e3b49-decc-4d5e-8a9e-242df04e8ba1)|(ext@6bbf8f72-c54d-4731-b455-e164685c5914)|(sp@FindingFormsPro)|(sp@EmailAccessHere)|(sp@WatchTelevision)|(sp@WatchTVOnline)|(sp@QuickEmailAccess)|(sp@QuickNEasyRecipes)|(sp@MyFlightFinder)|(sp@BreakingNewsPlus)|(sp@WeatherDiscover)|(sp@MyRecipeFinder)|(sp@AppDiscoveryTools)|(sp@FileConversionNow)|(sp@TemplatesHere)|(sp@SpeedCheckerPlus)|(sp@MapsNDirectionHub)|(sp@FormsHere)|(sp@ConvertPDFHub)|(sp@ProPDFConverters)|(sp@DLOfficeTools)|(sp@MapNDirectionHub)|(sp@GamerHubPro)|(sp@MyLoginHub)|(sp@LocalForecast)|(sp@GoGamesHub)|(sp@LiveRadioPro)|(sp@MyOnlineCoupons)|(sp@TrackYourPackages)|(sp@MapsProHub)|(sp@ShipmentTrackers)|(sp@ConvertPDFTo)|(sp@EmailProHub)|(sp@FreeConverterHub)|(sp@AccessFreeTemplates)|(sp@ViewOnlineRecipes)|(sp@MySweeps)|(sp@SatelliteandEarthMaps)|(sp@SatelliteandEarthMap)|(sp@PackageTrackingOnline)|(sp@DirectionsandMapsNow)|(sp@ClassifiedsListApp)|(sp@MyHoroscope)|(sp@meinemailzentrum)|(web@meinemailzentrum)|(web@meinemailzentrum\\.com)|(sp@MyVideoConverter)|(sp@EasyClassifieds)|(sp@WatchSportsHere))$/","prefs":[],"schema":1583766889752,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618984","why":"The add-ons violate our no surprises policy","name":"Various add-ons violating no surprises"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"076d3556-68cb-4a5d-83cc-e4cca29d3f48","last_modified":1583788354259},{"guid":"/^((\\{deb55b0e-7064-4552-955c-15ba6a46ad79\\})|(\\{15d967ca-cb54-444c-a7ad-b0dad1dbb723\\})|(\\{7953fef3-37b3-4954-a0e0-806cbec35a63\\})|(\\{2deadd5b-1edc-4634-b342-4e20ad03fd2d\\})|(\\{f74e5fe2-4f8a-489a-8f75-f965a9d4a98d\\})|(\\{0df2d5d8-b197-4022-ad3f-c24a44e9d23f\\})|(\\{e972a079-8e0f-4426-91e9-2c1cf9c8b89e\\})|(\\{d9ce0e4f-e41e-4160-b58e-b99300fa5d83\\})|(\\{43473acc-f92a-445c-9ce3-efc297fb62d0\\})|(\\{5b86a98e-5ce8-4664-9051-3d8f7127d1c5\\})|(\\{5f1e99d2-147f-48bc-aa87-41ed02d65965\\})|(\\{ffd007b3-c085-4bcb-9629-19a528f346ba\\})|(\\{df4e0189-a17d-41aa-af86-b6de65952842\\})|(\\{06880fd6-ffaa-4c77-a5bb-97dcd0ce554b\\})|(\\{f4e654cc-7ee1-401d-ac52-ced86f38e575\\})|(\\{d207c7e2-8a92-4f8e-807d-027fa2eed42b\\})|(\\{8d9fbceb-756f-417a-a691-de9a2c1c5648\\})|(\\{3602c279-d63c-4f81-b832-ef82fda60514\\})|(\\{2f27430f-99b9-4594-83ae-60a4df917e38\\})|(\\{be81f239-4a22-4b02-8878-358a3dcd6539\\})|(\\{e7c3277a-c312-4072-837a-4417aae7269a\\})|(\\{d5783778-d85e-4768-9b91-16b9068df780\\})|(\\{8c6f409e-f740-4807-9a28-c898266c518c\\})|(\\{9b1a4630-5873-4b3c-bcf2-4b4d59cc9739\\})|(\\{8522aad0-47c1-47e6-afbc-1e53a113bb2d\\})|(\\{d0e1738e-e2ce-4e75-bcdf-fdef4c0b7403\\})|(\\{4ac16c6e-ff72-45b2-b641-bf92144e1118\\})|(\\{e9c99267-487c-4fcc-9585-4a8e08d4342d\\})|(\\{0fdf70d2-0dbd-4ead-b746-9cbf4cacac6c\\})|(\\{0393ecde-cfd9-4a72-aa9d-6b64949b890c\\})|(\\{e80bc052-25fe-40ea-813a-dc98dffc2a77\\})|(\\{bfbe94d8-3389-4e4b-8cad-67eedd3bfa08\\})|(9\\.1\\.2\\.1@qamypersonalzodiac\\.xyz)|(9\\.1\\.2\\.1@qafungamesnetwork\\.xyz)|(9\\.1\\.3\\.1@qafungamesnetwork\\.xyz)|(\\{1985b6a7-5f69-484d-b462-667392e9ceae\\})|(\\{0d802f03-a2bf-433b-8124-7a2126bc53d9\\})|(\\{4c7d34ec-3bae-40ab-8300-38136f1bbcaf\\})|(\\{f0a11d18-866f-475d-8804-93d16729e59b\\}))$/","prefs":[],"schema":1583769750285,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621039","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e3a700b8-0177-4b11-bf7a-ae7c97e5115b","last_modified":1583788354256},{"guid":"{2abaf8da-5ca6-4896-8bf4-33cced7d1eec}","prefs":[],"schema":1583770759014,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621043","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Pluto TV"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6b7c877c-cf5b-478c-bc1a-d1a4f17f5599","last_modified":1583788354253},{"guid":"/^((\\{cf7362f7-d34e-423d-ade0-ff408145d75d\\})|(\\{225a2fd0-2266-4bbf-b1db-b4cd7ee3b774\\})|(\\{89ac12b3-2da6-423f-afdd-a755925070d9\\})|(\\{3c56ddf2-a46b-4338-9dc4-bf79a6947838\\})|(\\{4aec95dd-4720-4b7b-9032-c53c71c69531\\})|(\\{19efb4dd-72e6-4e76-9814-9185f0cebe1a\\})|(\\{a73d9f4d-dff4-47ff-ad33-1747dc74faf8\\})|(\\{58c16ee9-4ac8-466c-b8ac-5d8b019945f3\\})|(\\{a88f8f80-e2f4-4357-9f85-d49fcc22662e\\})|(\\{a623f590-df10-4f74-a281-27457212e744\\})|(\\{14df2d69-1ca8-4e68-8289-23816420eebe\\})|(\\{7789cecb-ccd2-4a7f-a75b-8d0243ab68b8\\})|(\\{0e2b182e-05c6-4830-9d20-b402c5598e55\\})|(\\{fd03573a-9361-4f90-9c60-be6013ebfb8e\\})|(\\{5ae01022-7989-4620-b46e-7ba5859e20d3\\})|(\\{d3ced839-59e1-4389-8631-a9f153187990\\})|(\\{07d66467-bc14-433c-84d7-905e8d2f550f\\})|(\\{3019ef01-bffd-45cf-8cd1-46f6c56cdda4\\})|(\\{1f0c9873-0598-4132-b20a-f0ab42c5c8a3\\})|(\\{b955bec7-392d-4074-bac8-60c6d1f402f5\\})|(\\{9f45dcf0-549e-4f15-a0ad-99ac2821fd8d\\})|(\\{16d5d1cf-0aef-4adf-99ce-214eb32d38fa\\})|(\\{b38602ca-4ac6-40b1-b20c-55828f514b3d\\})|(\\{55318007-10db-4d47-b4df-3946ed3653af\\})|(\\{cd2d96b3-e8ec-4ef9-95ba-72ee0dae011a\\})|(\\{b8250196-9419-4b06-9634-48f6c3570b53\\})|(\\{2a738b9e-5147-4441-91cd-e40a1ef50a27\\})|(\\{777580ee-50ee-4c37-98a9-844111149404\\})|(\\{a44f69d9-9c70-4b33-9502-b19e79399e3c\\})|(\\{2e6daca8-d5b4-4611-bd81-b964ab97bee8\\})|(\\{6fda5ac5-a41f-4905-a5c0-860313ab535b\\})|(\\{d51b14e2-4c5f-4601-b2b6-af8b572171cc\\})|(\\{dc5b9553-f925-43c5-936a-fd9ff0e56e47\\})|(\\{b0d8908e-ac38-473b-b20f-3a8d775c23f9\\})|(\\{d96abf04-438b-45a6-b6ec-3036124b5458\\})|(\\{469003fe-c00d-45db-82b7-c04635c227e9\\})|(\\{7d04eb8b-023a-4966-b6b9-06c706081d74\\})|(\\{41987721-6948-46f5-9e68-bcaf776e35ea\\})|(\\{127f13e3-f58a-44f6-bff8-955dd3688448\\})|(\\{09c02fc4-4a23-43c4-b1ad-854a3e1e6a29\\})|(\\{d061e0a3-7554-4a78-b7cf-e3f57df09b00\\})|(\\{28e445aa-892e-42e3-a0f1-30ab0ebba44c\\})|(\\{bc158e4c-6514-4b0e-9da4-6018326fe634\\})|(\\{fde60598-cfe6-4e9c-9f7a-28ea348a7f09\\})|(\\{a7addae9-82ab-4d91-a2b9-be373207bd9b\\})|(\\{71cc8c13-7aab-49d4-a419-b6e2880daaf0\\})|(\\{9a43f082-11c5-4062-bbad-04b63e6ed433\\})|(\\{19cdad5d-2a97-46b4-ba28-3a191d18b174\\})|(\\{99ee7e8c-61c2-4ffc-8f7a-c70c0bd4f1f9\\})|(\\{47706cc2-917e-4a2d-aba1-ee5c05613e0d\\})|(\\{a1a40297-cfac-455a-ad94-ef20eda2672a\\})|(\\{d807c94c-fbd3-48b7-9c07-a54336ace9f3\\})|(\\{0645230a-9e65-4a9d-ae90-97416f33f29d\\})|(\\{064d021b-9424-4700-b550-80c7a983c240\\})|(\\{59722380-31f0-4588-ac19-670f021cd67b\\})|(\\{0f504621-b4e1-4d5b-89dc-b57399b10c29\\})|(\\{ba135229-de15-41d9-8a35-fd198698fda4\\})|(\\{2117ec43-2df6-4bf2-a468-f067ea721432\\})|(\\{fd3fa8d5-be30-4e57-ba9e-ad11d0f70c41\\})|(\\{cb8e0410-17e0-4866-8075-b3224d52ea6b\\})|(\\{dff54861-9936-440e-94a0-92d39794be5c\\})|(\\{72c03815-0ef1-427f-b577-9c73bd19a7ca\\})|(\\{f13a447c-857b-4d93-a5cd-cb2578ede3d9\\})|(\\{8717ef97-76f5-4729-8a94-1ce396c0d2e9\\})|(\\{5e192df0-d31d-42b7-b866-155068118d2a\\})|(\\{d9238c4c-4259-4c0a-92c5-d03006959c1b\\})|(\\{95716b5d-ce17-4a97-9691-40f62291649e\\})|(\\{a0f9afee-bc26-4fa9-a1df-c705ad21cc94\\})|(\\{8f02a7c1-c6a1-4d3c-923a-59bd7e373205\\})|(\\{2452d750-d1dd-4cef-be51-3cc75f7a62d7\\})|(\\{e077a5e8-62c9-41a6-8427-10445a3d7818\\})|(\\{1685d632-1737-4bae-83a4-b0df6541f187\\}))$/","prefs":[],"schema":1583005290759,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618688","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons violating multiple policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"41a53d4b-120a-4ab0-9dbc-8a8d3802b734","last_modified":1583233056644},{"guid":"/^((jid1-h7qSFwT2a1FJOp@jetpack)|(jid1-w4wG5nJhx4LJZr@jetpack)|(\\{74b0af75-8791-44e2-95a6-7f0ab94143ec\\}))$/","prefs":[],"schema":1582980182934,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1619067","why":"This add-on violates Mozilla's add-on policies by adding abusive content to websites.","name":"Add-ons including abusive functionality"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"0.1.7","minVersion":"0.1.6"}],"id":"c4c0b595-6481-42a6-9e94-998b808dd143","last_modified":1582981347968},{"guid":"monstercropper@gmail","prefs":[],"schema":1582726441204,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618273","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Extensions Manager (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4c706648-260d-42c3-8461-3ddcf9db11f9","last_modified":1582916527189},{"guid":"{df73c71d-e4b6-46e1-a853-9831ad860a7b}","prefs":[],"schema":1582752497018,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618518","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Dark Theme (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"59f951ab-6183-4ae8-9ed0-99b667fa2a86","last_modified":1582916527186},{"guid":"/^((\\{fa59fb58-b15e-4dec-a9e4-145fbdaa2f03\\})|(somethingadguard@ok)|(somethingsmartadblock@ok)|(somethingublockorigin@ok)|(somethingadblockpro@ok)|(somethingadblocker@ok)|(somethingadblockerforyoutube@ok)|(somethingadblockerlite@ok)|(somethingfacebookadblock@ok)|(somethinghostadblocker@ok)|(somethingnanoadblocker@ok)|(somethingublockmobile@ok)|(somethingurbanfreeadblocker@ok)|(somethingwebmailadblocker@ok)|(somethingyoutubeadblock@ok)|(somethingyoutubeadscleaner@ok)|(somethingyoutubevideoadblocker@ok)|(\\{d3360051-c575-4f6e-938e-ac3bd4598573\\})|(\\{e16f9fba-1ccc-4b59-b52b-69c452bddfd1\\})|(somethingadblockforfirefox@ok)|(\\{b707de34-1ebb-40e3-b44c-d46a2d10443f\\})|(somethingadblockforyoutubeyoutubeadblocker@ok)|(somethingadblockplus@ok)|(\\{4fead186-a35f-41b4-b794-6c90e6f8886b\\})|(somethingadblockerultimate@ok)|(somethingadblockerx@ok)|(somethingfacebookadblocker@ok)|(somethinggmailadblock@ok)|(somethingpandaadblock@ok)|(somethingyoutubeadblocker@ok)|(somethingmublock@ok)|(\\{b49fea32-c666-4259-98bc-50348f3909c5\\})|(somethingdudenmentortextprufung@ok)|(somethingemaillanguageproofreadingandgrammar@ok)|(somethinggrammalectefr@ok)|(somethinggrammarandspellcheckerlanguagetool@ok)|(somethinggrammarcom@ok)|(somethinggrammarlyforfirefox@ok)|(somethinggrammarlytomarkdown@ok)|(somethinggrammarnazimkd@ok)|(somethingjacindaspellchecker@ok)|(somethinglinguixcom@ok)|(somethingmaxigramar@ok)|(somethingngspellingandgrammarchecker@ok)|(somethingpruuf@ok)|(somethingspellcheckanywhere@ok)|(somethingthaispellchecker@ok)|(somethingwordeepproofreading@ok)|(somethingwordy@ok)|(\\{8097be72-4409-4b72-809c-062d67ec1a9e\\})|(something1passwordx@ok)|(somethingapricofreepasswordmanager@ok)|(somethingavirapasswordmanager@ok)|(somethingbitwarden@ok)|(somethingbondarpass@ok)|(somethingbrowserpass@ok)|(somethingclearlogin@ok)|(somethingcpmautofill@ok)|(somethingcyclonis@ok)|(somethingdatavault@ok)|(somethingelpass@ok)|(somethingethernom@ok)|(somethinggpass@ok)|(somethinghakopasswordmanager@ok)|(somethingheroauth@ok)|(somethingid50@ok)|(somethingikeyvaultdev@ok)|(somethingintuitivepassword@ok)|(somethingkeepasswordmanager@ok)|(somethingkeepasstuskpasswordaccess@ok)|(somethingkeepasshelperpasswordmanager@ok)|(somethingkeepasshttpconnector@ok)|(somethingkeepassxcbrowser@ok)|(somethingkeeperpassword@ok)|(somethingkeycatopensource@ok)|(somethingkeydepot@ok)|(somethingkeywi@ok)|(somethinglastpass@ok)|(somethinglesspass@ok)|(somethingmanageengine@ok)|(somethingmasterpassword@ok)|(somethingmaxaccessmanagement@ok)|(somethingmonapassword@ok)|(somethingmyki@ok)|(somethingnextcloudpasswordsclient@ok)|(somethingnordpasspasswordmanager@ok)|(somethingnortonpassword@ok)|(somethingonetouchprotect@ok)|(somethingpassb@ok)|(somethingpassbolt@ok)|(somethingpasscamp@ok)|(somethingpasscell@ok)|(somethingpasscodepro@ok)|(somethingpassff@ok)|(somethingpassfort@ok)|(somethingpassman@ok)|(somethingpasswordcrypt@ok)|(somethingpassworddepotaddon@ok)|(somethingpasswordconfidential@ok)|(somethingpasswordstate@ok)|(somethingpersipass@ok)|(somethingpersonaforfirefox@ok)|(somethingpfppainfreepasswords@ok)|(somethingphashword@ok)|(somethingpsonofree@ok)|(somethingpwdmgr@ok)|(somethingroboformpasswordmanager@ok)|(somethingsafeincloudpasswordmanager@ok)|(somethingsafelypasswordmanager@ok)|(somethingsavemypassword@ok)|(somethingsecurden@ok)|(somethingsteganospasswordmanager@ok)|(somethingstickypasswordmanager@ok)|(somethingsubsfreepasswordmanager@ok)|(somethingmteasierpass@ok)|(somethingtrustloginidaas@ok)|(somethingtweakpassfreepasswordmanager@ok)|(somethinguniqkeysecurepasswordmanager@ok)|(somethingvivokeyvault@ok)|(somethingwebsphinx@ok)|(somethingwebvault@ok)|(somethingxtambroker@ok)|(somethingxton@ok)|(somethingyotipasswordmanager@ok)|(somethingzohovault@ok))$/","prefs":[],"schema":1582832492598,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618810","why":"This add-on violates Mozilla's add-on policies by using a deceptive name and/or injecting remote code.","name":"Deceptive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c21543e2-3f39-4ac9-b39e-6a2a18249351","last_modified":1582916527183},{"guid":"/^((\\{0aa583da-e323-42f2-b4d2-0bc61b493171\\})|(\\{20a15a74-371f-5098-a362-bd127db4f8bc\\})|(\\{c11016db-e96e-4eb7-bc19-7121d96d0e2f\\})|(\\{0fadbf07-bb25-4737-9800-b879a6e1c417\\})|(\\{e7fefcf3-b39c-4f17-5215-ebfe120a7031\\})|(\\{f85238e5-862b-45aa-9d66-0ab56a032375\\})|(\\{ea3f3dc3-6fbc-450d-9120-07b3b03cd9ec\\})|(\\{aa909324-7520-4dcd-9eb0-9f0a9ec3c003\\})|(\\{807833d9-8ea7-42f8-a8a4-46ff7519dd8b\\})|(\\{92047279-0910-4abb-beb7-a7f2cd6cf04b\\})|(\\{94036cd5-1829-4480-ab0b-e2455deafb9c\\})|(\\{05d0e324-7d90-3e2d-2eb0-6f1a9ec3c003\\})|(\\{abd0e324-7120-3dcd-3eb0-9f1a9ec3c003\\})|(\\{578e48b0-7c9b-4890-91ff-f6ce3e958edb\\})|(\\{0aa583da-e323-42f2-b4d2-0bc61b493183\\})|(\\{72d08da8-8277-47f0-8bee-ba5ad40dda6c\\})|(\\{9fd0e085-1545-13de-a831-ab9a05dcf253\\})|(\\{ced9def2-2d86-4a1b-a9eb-29e2f3c9eb48\\})|(\\{364f2138-c271-47a3-9ddc-466c4a27feef\\}))$/","prefs":[],"schema":1582891948231,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618814","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ae0ffe5f-a7a2-48ec-9b01-2c0c9d3eb2e8","last_modified":1582916527180},{"guid":"/^((o-o-0-o-o@codobir)|(o-o-0-o-oSearchBar@codobir)|(o-o-0-o-oAdBlocker@codobir)|(\\{93e2581c-ec13-4be8-bb22-d2544356fca7\\})|(\\{7582f270-d0ea-4f78-a1fe-851def5d06d0\\})|(\\{089fbef0-49fc-4237-ba6c-2604af7a6e18\\})|(\\{7f897f01-98aa-4e5b-b40d-dbdd7c968b8b\\})|(\\{5f6ae810-5186-466b-b7d6-29ab4355e3dc\\})|(\\{02dc7465-0eaf-44ef-999f-9dad3f9502ed\\})|(\\{0135039f-a362-4296-9c30-e8626bb484d4\\})|(\\{8775e445-b777-451b-8d4a-dd10985bf95c\\})|(\\{a244077a-0017-472a-b1af-8f0b4a167a3a\\})|(\\{ebcf3de2-902e-4690-a35a-d6160175639d\\})|(\\{209a92d8-da4f-4342-81b7-ed2b92863cbe\\})|(\\{a2cd102f-34e4-4ef8-87e9-b1d642b6716d\\})|(\\{6382c930-913c-4bfb-a82d-f098cf3e84e8\\})|(\\{323aca10-65de-4392-8ea2-591642470c58\\})|(\\{70508e0e-9f91-4bad-853f-cd76764a5a5a\\})|(\\{b673c390-83d1-43d7-b0e3-a7a2c79b23a4\\})|(\\{b74e188a-c975-4725-a6a7-53fe0645d424\\})|(\\{46ed97fb-8411-4e04-9332-0c89ea8cfbfd\\})|(\\{2b484d2d-5b4b-411d-b8bb-bc3e7d9672bc\\})|(\\{6e707a00-b889-4b91-8cf9-19674f09d849\\})|(\\{f24e3561-ecb6-4539-b9cb-95af4624811d\\})|(\\{46f41d8d-4bb0-4549-86e7-34c09c65b5fd\\})|(\\{99a15fc0-dcf0-4669-a895-664f286c6a88\\})|(\\{0585f5cb-8f50-4e76-82e2-75a0cf852d35\\})|(\\{783f9072-d29c-4567-93f9-ca424cd71fcb\\})|(\\{05d62c84-a9f1-401c-85f8-a657e6a85940\\})|(\\{8c44b1c4-364a-431c-98ec-9c7a88b8fef1\\})|(\\{44da520a-6bd8-40bd-8992-87ab3f866cad\\})|(\\{4dc3d7a3-58bc-4ace-ac3e-2776377595e1\\})|(\\{5cd1ffd4-2899-4b2c-a226-453c85d957c1\\})|(\\{74c7755a-16dd-4cf8-b407-20c47cb4b78e\\})|(\\{865fc230-1a34-4c95-a718-a53276d77a02\\})|(\\{a233e339-2ae5-4d5a-ad1e-d82db722a85d\\})|(\\{23e06ed5-bb15-4cd9-828f-df483e65e1f5\\})|(\\{840e5e73-880e-45dd-a2d0-fbefd09f368f\\})|(\\{dcc9f6a8-5306-4662-a2d5-9da72e9e6641\\})|(\\{a7714acb-7a85-472c-97e7-3310eb47fbc2\\})|(\\{88aeeecb-1924-4c1f-aa22-9d43e8757004\\})|(\\{55295427-ab86-40e0-a56e-f913aba2ae8d\\})|(\\{b80386b3-c4ae-426a-b755-e38999447aff\\})|(\\{71a36a35-73cf-4d33-8f9e-3e1b1f838f2a\\})|(\\{504212ab-b2e3-4157-a36a-b02bca78e727\\})|(\\{c4a86ea8-34d1-4a72-aeff-8b227a52f562\\})|(\\{c1413369-3202-4ec7-873a-23dc5715e180\\})|(\\{97ea8e7f-a2f9-4009-95bc-d9f8be5405dc\\})|(\\{76c146d0-ad1a-4457-979a-a0b84a7ca86d\\})|(\\{ea6a2984-78b8-473f-9850-f3406a8c2b79\\})|(\\{b005573e-35ca-4c55-a87a-25cb53ff526e\\})|(\\{00a73039-4695-4559-820e-e17b5fb5ccac\\})|(\\{fc05507e-2482-4928-b943-a7a6ad59d166\\})|(\\{e8cb2def-d6ab-435c-b2f0-af701a40350a\\})|(\\{524b9704-5aca-4283-aadb-fba6eead9b92\\})|(\\{7d629677-6ad7-43f1-b182-8734474c3fc7\\})|(\\{0edbf5ac-c258-4c65-af7e-8dffbdf847f5\\})|(\\{c5c906de-c84e-4b48-a738-e8e32546f496\\})|(\\{3a9abaab-8451-4909-978a-bf1d4e716137\\})|(\\{1195cc1e-0cc5-4e48-8b08-7160bdab5511\\})|(\\{3e3217ad-344f-4a2b-97ba-d4380a6d4f91\\})|(\\{ee4a70aa-687c-4176-9392-7e47b5c09afe\\})|(\\{7d1d1676-b23a-4249-9c01-f7f1dbcb18bf\\})|(\\{51e9d221-2349-4764-a4a4-00552369c210\\})|(\\{30b40c71-198b-4b3e-8ff1-569860189be4\\})|(\\{beef68e8-c078-45c0-a593-64a9bfb4b2bc\\})|(\\{6ce76b14-1c76-4774-919d-7a3c820a4d56\\})|(\\{522b149a-3a6f-4bc3-ab7d-1bf41e4c29cb\\})|(\\{17a2d3ca-1505-46aa-836a-85ea62b5b617\\})|(\\{d7b81889-d34f-467a-a690-9507b5d72647\\})|(\\{66463498-8185-4874-9fdf-be281b08df26\\})|(\\{5a144fd3-9e6b-4b3a-ba29-bba7fa187e40\\})|(\\{bb405e27-949e-41e2-9930-26cb8360dc19\\})|(\\{f7a40a38-b3e4-4852-9981-8078ae99374a\\})|(\\{8675dfc9-9953-474f-8b2c-16b1307f66ee\\})|(\\{62d44bdc-60ea-4a78-a738-e59dd50589bc\\})|(\\{a7875dff-b031-4588-9d4a-1f989704ebe5\\})|(\\{3cfd3ce1-f358-48a5-a30b-5cc144d14f38\\})|(\\{9ce2677c-ede7-45be-b281-2e0c9d24fff3\\})|(\\{d13d4d9d-e9ec-4833-948f-a8e2c4bb1ec1\\})|(\\{87d402fc-7bbe-4b48-8c1a-38984a9dff7e\\})|(\\{69b186c0-e619-46b9-a978-b6ac97abd26b\\})|(\\{408bfadf-6f2b-428e-aca7-e4b95037bd72\\})|(\\{2a047ecb-a3cf-4ef5-8420-d45ea9cb246b\\})|(\\{c171fea9-aa8e-4348-8b9a-1b371f4821ea\\})|(\\{4f24b616-1f23-4c60-aadb-2386900b690d\\})|(\\{766d6d39-6592-4f47-bd1f-84639a2e5ad9\\})|(\\{b7caa882-3108-487e-9f69-3f43168789ac\\})|(\\{e96c08ad-1eff-4687-94ed-a14a76c7152c\\})|(\\{cfddeb9b-5339-4df3-af2e-88e26987cb8a\\})|(\\{d558cc36-a306-4288-9888-a68c419b2cf7\\})|(\\{0765615e-cc53-4ed8-9501-8e33b627db77\\})|(\\{0de24de8-5130-43bd-b041-2d284a26b9f0\\})|(\\{114a7625-4642-4013-bf25-9d8c8a1e428c\\})|(\\{d2554ad1-d14c-43b1-9f3f-84ae454748be\\})|(\\{374319ec-ad46-450b-928c-feff04666d58\\})|(\\{f8a572d2-a614-45aa-a8a3-3cb6bdec3388\\})|(\\{d55d0631-bd77-42b3-8ca3-ff5889d69e4d\\})|(\\{4bf71a8f-3f21-4de0-8cc6-12a53df60922\\})|(\\{5787258d-5a12-4153-bd9c-5825c53786a0\\}))$/","prefs":[],"schema":1582892445504,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618862","why":"This add-on violates Mozilla's add-on policies by using a deceptive name, violating Mozilla's No Surprises policy or including non-disclosed monetization","name":"Misleading or deceptive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7c948a9b-2340-4886-b8fc-29ca66c1790f","last_modified":1582916527177},{"guid":"/^((\\{e78b3b45-89ad-4210-9a6b-3150506851e1\\})|(\\{c5874e9e-f46f-4220-b356-476122247a0b\\})|(\\{941c102c-7b8d-40af-9f49-a0496d89b486\\})|(\\{97c53a72-d50f-4e1c-8d26-f0aa8578a4aa\\})|(\\{65d9977d-e895-490e-ac9e-83031d46551f\\})|(\\{6e27edd2-f950-4b69-9a4a-f4941f2b0621\\})|(\\{af4d7096-c51a-4cb6-a30d-d2790fd66325\\})|(\\{b666da6b-b171-465d-ac69-20ea2a8a9971\\})|(\\{8e83ab0b-d34a-49ce-9d64-6394637cd9e4\\})|(\\{763aa5bc-8faf-4103-bad2-d15aab97146d\\})|(\\{40613d6c-a8f9-4a8f-a048-72ca8f1206a5\\})|(\\{865cf362-afee-472d-b2ae-6186e59f8e3c\\})|(\\{6778c1de-8ab3-4ee8-9e3d-788b17060ffa\\})|(\\{a501a160-de33-4c20-96a8-b660fd18db01\\})|(\\{b27d330c-3ac1-4421-9c96-1a5781ee9bff\\})|(\\{3997ee99-bd51-4f18-95b1-3b8a887ea014\\})|(\\{ffb40ecd-2ef3-4dfa-8c69-9a847c853b0e\\})|(\\{061c317b-b050-46a9-a7a5-2f9dfc0ef3c7\\})|(\\{e30d3343-fc0f-4526-8b9a-eebd6b7b1af2\\}))$/","prefs":[],"schema":1582898093853,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618862","why":"This add-on violates Mozilla's add-on policies by using a deceptive name, violating Mozilla's No Surprises policy or including non-disclosed monetization","name":"Misleading or deceptive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7548e625-f059-4976-ab43-de78a1124dd2","last_modified":1582916527173},{"guid":"/^((jid1-C96jkOWH1jEZ5A@jetpack)|(@pdfit)|(@youtube_downloader)|(\\{503b5ae9-dcb1-41c4-9cf8-0c70a5c2bc70\\})|(\\{a9de7157-1c27-45bf-ab59-bedcbf57cff9\\})|(\\{908c4278-9f44-4b59-ad6f-91e2aabc8682\\}))$/","prefs":[],"schema":1582659695507,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618172","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"98dbf563-0a8e-4796-ac48-1be0e4520610","last_modified":1582726440807},{"guid":"{6059d268-eb5b-491c-9879-964e1c67c854}","prefs":[],"schema":1582723099417,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618174","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Second Tab Search (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e15a83e1-60c6-475d-977c-83e180646e6a","last_modified":1582726440804},{"guid":"@searchencrypt","prefs":[],"schema":1582723268591,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618185","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Search Encrypt"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3c782d96-5d25-45d3-8f07-016a791e316c","last_modified":1582726440801},{"guid":"/^((\\{374c327c-fbd0-4769-a378-1cb0fef54b1c\\})|(\\{11d9b7d9-acea-4a66-94ff-3fbbcca15abc\\})|(\\{e9e3ac53-8384-4f2a-a451-78af21417b13\\})|(\\{61539a14-2728-448f-a071-45043287cf10\\})|(\\{9ca7082d-0e18-465e-8588-8d3990c5b9ae\\})|(\\{0444bcb0-66d3-49b1-ac1f-b79f7f682f15\\}))$/","prefs":[],"schema":1582486893083,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617571","why":"This add-on violates Mozilla's add-on policies by intercepting page loads with affiliate urls.","name":"Affiliate add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f8ce5794-a1db-4a63-af32-1750de36a383","last_modified":1582562264396},{"guid":"/^((bazaarhero@jetpack)|(boingdeals@jetpack)|(boingdeals-1@jetpack)|(boingdeals-200@jetpack)|(\\{e9edde2d-5dda-46b5-b6ca-f732d96d941a\\})|(\\{29c11376-f72c-489b-a9eb-8fe309b1623e\\}))$/","prefs":[],"schema":1582548114995,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617577","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1406ee6a-4eab-441d-ad1f-ce09b650ce2d","last_modified":1582562264393},{"guid":"{6ac0938d-7ca6-43ac-9c26-653d37820440}","prefs":[],"schema":1582549126839,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617578","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"414cf401-fbc9-4218-85fe-5880068e8452","last_modified":1582562264389},{"guid":"/^((\\{d551e6af-55af-4295-92f0-ba0e3d15bb00\\})|(\\{36858137-f125-47fc-8e0c-499f161abaf0\\})|(\\{7edb2ea5-61a9-4447-87b2-d37ed4198d1c\\})|(\\{0ea11f50-96b6-4a8b-92f4-1eb6ca77acac\\})|(\\{1449de8a-cdb8-4f65-b909-c6391e49615f\\})|(\\{e7cdc797-edcb-46a0-a66e-f5dab3c808d6\\})|(\\{d57b5f9f-b35d-4879-84a3-3547d44249ec\\})|(\\{d4e41bc4-cb00-42d0-b756-ed8deb827cbc\\})|(\\{083acfab-6228-439a-b796-62647803b216\\})|(\\{ed2df6fc-df45-43ac-a923-bd3fbc3534c2\\})|(\\{ebc63925-e43d-4cc1-b234-4c8b6abc331c\\})|(\\{231652e4-ad9a-4dd7-89b1-d79876c0dca7\\})|(\\{2cb0bdaf-5789-415b-a92d-2adbc695cb63\\})|(\\{429a08cf-84c4-4eae-9ecf-fc6c3a07249c\\})|(\\{ec4fb55e-d94d-4196-9ee6-a6f19e3c9405\\})|(\\{bd55549f-9853-427c-a45d-6aba2b4776d2\\})|(\\{bbfa0b1d-c75b-4483-8331-b5b01c82fe5d\\}))$/","prefs":[],"schema":1582237690303,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617192","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Lusha"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b12eaf8d-77ff-4bd6-8b9f-797af110f86c","last_modified":1582301451440},{"guid":"beeline@beelinereader.com","prefs":[],"schema":1582298543556,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617198","why":"This add-on violates Mozilla's add-on policies by making use of obfuscated code.","name":"Beeline Reader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.10.1","minVersion":"0"}],"id":"42642ca5-9342-4e51-a2ec-b5eed799468f","last_modified":1582301451437},{"guid":"/^((\\{e046e345-918c-4fe8-89a2-0987c5d12636\\})|(adi@fmt-tools\\.com)|(\\{90e41842-755d-40e0-9136-8129df55a64b\\}))$/","prefs":[],"schema":1582296975853,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1605160","why":"These add-ons violate Mozilla's add-on policies by making use of obfuscated code.","name":"Add-ons with obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b96957ff-ca4e-4ec4-97f7-3dbb4ddbc479","last_modified":1582301451434},{"guid":"jid0-G6461UajDjhNAwSukoedlkhD0XA@jetpack","prefs":[],"schema":1582141291510,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616735","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control and by collecting ancillary user data against our policies.","name":"Ratings Preview for YouTube"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dca3181b-35a3-4dd0-9efb-8e7a19fab4d5","last_modified":1582237689888},{"guid":"{e0a905db-294f-4e91-be75-8b5c7c5df90a}","prefs":[],"schema":1582103702651,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1614333","why":"This add-on violates Mozilla's add-on policies by making use of obfuscated code.","name":"Gladiatus Time Saver"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.2.7","minVersion":"0"}],"id":"a98992d1-8a30-406f-944d-c0161d0aaa21","last_modified":1582237689885},{"guid":"bookmark-this@page.xpi","prefs":[],"schema":1581968493407,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616217","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"24b4f43e-106f-44a6-a992-7d07634bb5eb","last_modified":1582103702173},{"guid":"/^((addon@faster\\.com)|(\\{09bfa06b-5e73-4daa-96bd-88092fe71c52\\})|(\\{eb4d44d6-4ad4-4b77-9509-8e6eadaef074\\})|(Blockfbunseenads@addon\\.com)|(Blockfbunseenads0@addon\\.com)|(\\{a8180cdc-19f4-4299-9bb5-5b6b2f2c2de6\\})|(\\{2454bb7d-4cf7-40f3-a5da-40e6889d83fa\\})|(\\{cd6999f9-c84e-47b4-a355-d54bedfe9c17\\})|(\\{53d5a956-eecc-456b-a6ce-b137c511a04d\\})|(\\{9b2dba6e-c179-47ca-bbd8-6b7033c4f2fc\\})|(\\{d77d7463-a323-4b3a-9b96-69b31e4d488e\\}))$/","prefs":[],"schema":1582023416031,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616233","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e9119771-cb28-4853-8aae-72aedfe27b2f","last_modified":1582103702167},{"guid":"/^((\\{6fb37444-4339-4a36-9e4f-c4c47b550c4e\\})|(\\{430b4bcb-4487-471e-82b8-a3056ae137ba\\})|(\\{394990b1-4ede-4bdd-a3fe-58506591f00b\\})|(\\{3ca06113-1cea-4e7a-b775-19666a9c77a2\\})|(\\{deebf5b9-62b8-4b5c-8e1b-8f8d83939441\\})|(\\{15c41cbc-18a2-4756-80a9-418ba03f533d\\}))$/","prefs":[],"schema":1582027274373,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616234","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons injecting remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cc8e1b77-eab1-42d7-9625-bf4153547903","last_modified":1582103702162},{"guid":"/^((\\{9664bedb-6f24-4672-8b72-2565e0b3fc21\\})|(alex\\.todor@gmail\\.com)|(alex1233\\.todor@gmail\\.com)|(alex123333\\.todor@gmail\\.com)|(alex131\\.todor@gmail\\.com)|(alex13\\.todor@gmail\\.com)|(alex12223\\.todor@gmail\\.com)|(alex1214122223\\.todor@gmail\\.com)|(alex1222214123\\.todor@gmail\\.com)|(alex1222214fawfaw123\\.todor@gmail\\.com)|(a\\.todor@gmail\\.com)|(abvcaasgawgaw\\.todor@gmail\\.com)|(abvcaasgawgaw122141\\.todor@gmail\\.com)|(abvcaasgawgaw122fwafaw141\\.todor@gmail\\.com)|(abvcaasgawgaw122fwaaaafaw141\\.todor@gmail\\.com)|(abvcaasgawgaw12aa2fwaaaafaw141\\.todor@gmail\\.com)|(abvc\\.todor@gmail\\.com)|(ateststn@example\\.com)|(abvc1\\.todor@gmail\\.com)|(test@gmail\\.com)|(test1112@gmail\\.com)|(as@test\\.com)|(stagod@test\\.com)|(stagod_qa@test\\.com)|(stagod_as@test\\.com)|(fop@test\\.com)|(\\{e83eb1bf-7847-4253-8108-4c1ec0601757\\})|(\\{3cfa4fd4-a747-4666-b97e-2262f6255eeb\\}))$/","prefs":[],"schema":1582038056642,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616286","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Addons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"32ebf2f0-a321-48fd-a5a4-94a4980f4697","last_modified":1582103702156},{"guid":"/^((\\{04871291-3f6e-4969-a991-4183decfacef\\})|(\\{9493fc95-5a66-445e-9200-c9b617942c05\\})|(\\{a89d4fea-98ea-42bf-aeb7-e14059e809a2\\})|(\\{aabe1376-bc1f-440d-a275-284d026f3058\\})|(\\{b6aefc39-259d-4485-b8fa-c9b2ea77223e\\})|(\\{5ce16faf-66ca-401c-bf43-7c75cf75487e\\})|(\\{dfdf383a-eff4-4ae4-a8b8-97640748e795\\})|(\\{6a563873-967b-4644-afb1-bc3e9da68128\\}))$/","prefs":[],"schema":1581545094971,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1615250","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1c5195a4-afb7-47ef-83c6-7c3c6f5d0ed1","last_modified":1581702872026},{"guid":"/^((something@ok)|(\\{4eefc8e1-086b-43a3-bb21-17c05f43cd3a\\})|(adv@blocker)|(adv\\.3\\.2\\.8@blocker)|(\\{f56e22e4-f6f9-48ca-aca3-480d9b293a16\\})|(\\{b26aabf7-6b17-424f-a71d-e8ca37ccb672\\}))$/","prefs":[],"schema":1581687835975,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1615601","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons injecting remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d5259975-b1c3-4f50-861b-d7b4c082b58a","last_modified":1581702872020},{"guid":"/^((\\{6e27c586-e50c-49b1-9925-5427f3e9f028\\})|(\\{ae6dcbb6-d0a6-494b-bdfc-ea9d7b8f7667\\})|(\\{14aec2a8-0289-43f3-85fb-5d52491a0538\\})|(\\{b541ce5d-e99a-4629-9167-e71ac65bf32f\\}))$/","prefs":[],"schema":1581450092560,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1614884","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ba0f5f7c-8998-49f1-89a8-7f3a15c41cc8","last_modified":1581545094556},{"guid":"/^((\\{0bbf5ce8-0bfb-4589-a4e8-4f1e435389d2\\})|(\\{820847ac-fb62-47a4-a6be-00d863584c76\\})|(\\{703d2caf-edff-4198-baa3-615135f97890\\})|(\\{f459049d-939d-432e-83c7-07ced47e629a\\})|(\\{0d56e009-957a-4575-a984-ecd22ccf3120\\})|(\\{88386103-f99d-4aab-83c2-64106a77748e\\})|(\\{29e30d06-1030-4a82-8e29-25706012da97\\})|(\\{c0d5c1cb-e676-4ff7-8189-793efc86fa2f\\})|(\\{aade33ec-2184-4759-8de5-5d61f1e29e72\\})|(\\{72dc5fd5-179b-40b6-9218-e88434939ed8\\})|(\\{8c9ec486-bd7b-40dd-ab49-1ca3ff452484\\})|(\\{67c0ce2e-2359-44e7-b9d9-1061a3c4a041\\})|(\\{149c0e63-b3f6-4f8d-bb1d-94b7e36d8aea\\})|(\\{c3a1e646-c155-4a40-b5bf-ac9252e6b632\\})|(\\{6876f3d2-97d6-46d6-b9bf-aa46264f6c3c\\})|(\\{330a08b1-d93e-48a2-9081-e93e25190eec\\})|(\\{443305ec-55d7-411c-bb4a-96e83b4e631e\\})|(\\{945964bd-5c29-48e3-9dd6-26741626c1ba\\})|(\\{ec8513c5-2bcc-45b0-ae77-da6685cfafd9\\})|(\\{57703f70-e1b7-462d-bf7e-657bac5eb30c\\})|(\\{8c1d6a6c-3745-429e-8ec5-2a374320e703\\})|(\\{2ff583b8-72a9-40bd-877b-b355ad33ce44\\})|(\\{f2ed910e-ab21-4ad3-a70a-8adca5e683f6\\})|(\\{4ae1f921-575e-4599-8b77-e8e7ab337860\\})|(\\{cfe7c709-6df6-4d54-9f4c-6fc3967904ce\\})|(\\{4e0cceff-558b-4902-9870-55ecb16f78a6\\})|(\\{093726f6-5907-480b-81fc-fafe4f04b5e8\\})|(\\{4a2650e6-fb1b-4e83-b0ad-4e991c9ac01e\\})|(\\{2dcd1f94-6a18-47c3-826a-d8f1044b3ade\\})|(\\{90e61a54-35d6-44c8-bb33-88623e6a03ae\\})|(\\{61389b8e-55eb-43ad-a68d-bebefe7476ad\\})|(\\{f8890846-fcc1-479f-a90b-dce3e486b0ba\\}))$/","prefs":[],"schema":1581438380344,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1614707","why":"This add-on violates Mozilla's add-on policies by collecting search terms or intecepting searches that are going to a third-party search provider.","name":"Add-ons collecting search information"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d33858b8-d192-4be2-a844-b151f0f287ca","last_modified":1581441570691},{"guid":"/^((\\{312951c4-a455-4886-a2f1-e4fb05b9fee7\\})|(traderibis@gmail\\.com))$/","prefs":[],"schema":1581429986729,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613706","why":"The add-on injects remote HTML code not compliant with our policies.","name":"TraderBiS"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"52b9033d-de65-48ad-9062-7c340835feb0","last_modified":1581438379932},{"guid":"/^((\\{ebba9c65-d04c-4c02-afd1-476d7c06fc2f\\})|(\\{117f05e4-3403-4cbe-a041-30fa60054e9f\\})|(\\{03417bad-eb5b-4bd4-89f8-f10d78fce082\\})|(\\{42f0a4e1-710d-4154-b34a-731dbbe2097b\\})|(\\{6a0a9103-3482-4717-aca8-f22ee2228d25\\})|(\\{23d5c4a6-1231-4f87-ebf9-e5800eae221b\\})|(\\{99a32eb1-5da4-4a35-beb6-7c3b5222ce04\\}))$/","prefs":[],"schema":1581277291027,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1614308","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"39473bb3-638d-4b7e-a847-f197e6320564","last_modified":1581340917940},{"guid":"/^((\\{0E64F71A-6B21-4324-A5D9-69231DE8C20C\\})|(\\{747e7f5b-c9Fa-4e4f-b466-639b88c8998f\\})|(\\{8693cb76-1caf-4115-9bd7-6bab02330326\\})|(\\{cf8452e1-0ddb-44d2-95eb-4cb8e7a35707\\})|(\\{79bbada5-9050-4d8c-9367-0aad8185cd90\\})|(\\{C7928956-827D-4649-A234-BB758377C005\\})|(\\{512d597b-9bbb-47cf-b0e6-526456ee6d26\\})|(\\{fd591fc9-480d-4f04-8ae5-0be02121b425\\})|(\\{e3258209-0248-4092-bc59-3032565d2f0a\\})|(\\{725fc0a6-1f6b-4cf9-ae17-748d111dc16d\\})|(\\{3e30848f-3b39-425b-8538-d85da166cb19\\})|(\\{9e27a3ff-0131-4aed-bc7c-2364bd89d7c9\\})|(\\{74e039b8-a2db-4a41-9155-4ccfc2c86682\\})|(\\{cfd9177e-c8c6-4d94-b5e9-d87850e2c8aa\\})|(\\{e21459c1-5604-4324-a3a0-8d23800725ec\\})|(\\{a563f3c0-d631-442f-ae27-1467cd47f1f4\\})|(\\{cbb3237c-ed1f-4735-a364-1849c0907b3b\\})|(\\{5c88311a-c457-4d3a-961c-3dc0cf01e6f9\\})|(\\{0bdf29c1-0c18-40cf-b3a2-c938b5cfdabc\\})|(\\{56e0ce0d-ffff-46a4-b2cf-1260d6898b94\\})|(\\{673d181c-5a1f-42c9-a8a2-f2f5af4a2a2a\\})|(\\{63dc2763-30bb-45fc-90ce-0d2a5c07a46a\\})|(\\{2751af61-65b3-4e7b-b098-497d6d6d7629\\})|(\\{5ce7c96e-2e99-4a6d-8f5e-cbcd68fd64b6\\})|(\\{e7e1a9ef-2755-445f-a639-d9bbf5e1982f\\})|(\\{ef5483ba-d634-468b-93d0-1bed3f09306b\\})|(\\{10367a10-912e-47c8-ab86-9a752230e097\\})|(\\{bf13ca91-6471-45c9-999a-e6176ffa9681\\})|(\\{7b8ddd2d-c2cc-428c-8Ede-604995d8B4da\\})|(\\{d05d4f3c-74ba-40bf-afa0-ad944df067ae\\})|(\\{fed8f5bc-0324-4007-8e90-84709e0c57c8\\})|(\\{9ef981d5-0b21-41fd-9412-008633de79f2\\})|(\\{1569b001-9f51-46a2-a4ed-f2122c475799\\})|(\\{340eab9c-f3c6-4a6c-9439-79733e12df5d\\})|(\\{1ab78f66-5390-4db2-8d1e-c759599ef2a4\\})|(\\{ce00b27c-1a7d-40f9-be61-57ae046ebe1a\\})|(\\{9fc1abcd-3044-4bbb-b04f-c233f1d20bfc\\})|(\\{78255a39-463e-4fce-9a2a-acca442414f3\\})|(\\{159bf803-5c0e-4863-bfb1-7a036174bef5\\})|(\\{7828da87-6bf1-4799-91cd-6e9167511fa5\\})|(\\{9aa7920f-677b-4904-9ea3-cae4c4320d15\\})|(\\{3e78b05f-90aa-496c-ac3f-cbc92a738fa1\\})|(\\{cd9d2474-fff2-4f19-8452-0ec2f4422117\\})|(\\{c7722662-0964-4341-9232-0fdebb37811e\\})|(\\{fdb0fb76-f05d-4732-9348-6f8765673e14\\})|(\\{05abc1ee-f871-4ce6-a51d-6011cdf545ba\\})|(\\{300e263c-aed7-4df7-b197-82d5122ccf6a\\})|(\\{14775497-c7c4-4209-9d6b-a8a40c0aed1a\\})|(\\{10f8343f-0f77-4cb4-8266-e06dde15e8ca\\})|(\\{d2a58c6b-be02-4ea5-9e7e-6982454e9ef3\\})|(\\{0f27c13a-5921-4e7c-86c0-b43ad63a4bea\\})|(\\{f1922123-3aad-41cb-8ab5-281ec8cbe351\\})|(\\{be0f8a88-522f-43a3-8146-5b2ad0985987\\})|(\\{44056c1f-6259-4ec2-8e60-b1c65f9b1039\\})|(\\{1e4c4a84-ea2a-45c0-935e-59cc375575ee\\})|(\\{62a11f62-84b9-425f-b506-93c3711b73e7\\})|(\\{bcb5539d-0913-4d90-94a0-e3144ab239ac\\})|(\\{e4dd1b2b-dcd2-494e-b69f-8c76e89a6234\\})|(\\{48eeddb6-f7f9-415d-9835-b859e37ed024\\})|(\\{ddf2a2fa-a5ed-4765-a44c-4b56077cd588\\})|(\\{2a208cb8-5297-47b4-91a7-0e66475218d8\\})|(\\{7ec57eac-456d-442a-85f2-477cb20c3dde\\})|(\\{20aa1960-d5c2-48fb-ae09-fa6261381537\\})|(\\{b4ebedae-d18f-46d6-8b87-679d1fd27f3d\\})|(\\{67fa631f-29fe-4001-892c-1dfdd56e5ed3\\})|(\\{ae92cb39-b2a6-4865-a125-1b273ffb4a1c\\})|(\\{5b2245da-f41b-4fb3-88b3-5e9a097e06c7\\})|(\\{69272cbc-110d-4b5c-b903-16bd118ddf45\\})|(\\{d4d22de7-54af-40a1-99f7-c2b0f2d86a23\\})|(\\{e1445f3b-92ee-4085-a57f-380e96ed8316\\})|(\\{f9830d93-3782-44e9-b199-d2355f61b98f\\})|(\\{218769cc-3b47-4978-ac59-8a9447bcb193\\})|(\\{f472ddca-60dd-4d6b-90c7-244a84d0a487\\})|(\\{8af6985d-1eef-47be-8213-bd6e25dad273\\})|(\\{da95491a-1812-442a-bde4-7a29f69044d4\\})|(\\{f8d10888-29b8-48d3-8e5f-e02e41fb642e\\})|(\\{e9091337-2af8-440e-a318-ca9e0f053fc0\\})|(\\{3ba1e00c-8339-4ae3-a87e-f4af9f1ee33f\\})|(\\{b40e5bcd-5966-424f-8a15-6ecc3dba050a\\})|(\\{c376e851-c30c-48a1-9f59-d528d34560b8\\})|(\\{8ad33b1d-31a7-47e6-bb46-6c91bc1daea3\\})|(\\{dac8f2fe-662b-4017-bf62-5052d0b23af9\\})|(\\{c27b6b15-fd63-458e-91b8-5974a7b2242b\\})|(\\{b222e127-a52c-4884-8a0a-065342b0c74d\\})|(\\{f53f1857-3f7f-4cf2-9e4e-2533f2c253ee\\})|(\\{eb260b8d-f7d3-48d8-a29a-c2b07e1ed36e\\})|(\\{49f6227b-4803-46aa-b189-466869e8dc5d\\})|(\\{a8694ce8-04ee-49c6-81cf-cf005e7009b4\\})|(\\{c53aa3f1-3385-4e2d-9d38-daf09b0db7bd\\})|(\\{9b230441-bb88-4060-bcc9-637cc5a54639\\})|(\\{895ac4f5-bd07-41c9-bbe1-cdb4d2be9975\\})|(\\{6886d657-954f-427b-b52f-9ddb1b52da62\\})|(\\{d1bc06d5-8470-4120-a2af-8e05b252ccca\\})|(\\{2aad1b2d-c29f-4623-83ac-6291c169c4d5\\})|(\\{e54137a1-794f-482d-93b6-13e2dddf7bf7\\})|(\\{773b7d0b-dc32-4125-83b4-a74887588698\\})|(\\{dd8a0577-a2ef-4719-b138-8aae7cf05add\\})|(\\{9b0dc71f-13e1-42f7-9e64-518cf228c079\\}))$/","prefs":[],"schema":1581005656992,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613891","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8b5feaac-be07-4612-a090-4714b80191f0","last_modified":1581082030075},{"guid":"/^((\\{7b931d6c-4721-482d-8fcb-8c789bafc9a4\\})|(\\{03ea1c25-7fae-4ca7-9e9a-4b161936232a\\})|(\\{06580af3-ba0f-4e49-966d-932b19f6914d\\})|(\\{7f2afade-1aa3-4acd-8161-4a7d111535c4\\})|(\\{45fc7dea-37bf-46ca-9ccd-4b156778ed55\\})|(\\{b8f12b3f-ebe5-4599-9c51-1414ba5783be\\})|(\\{6440c999-2444-49d0-b8b4-188503a14a32\\})|(\\{0741d175-fd06-414e-91ad-095d6484b8e9\\})|(\\{db88d1a7-fc18-46b5-b015-bd9599966cad\\})|(\\{4f3df885-1268-43ce-9e2a-45668ce523c3\\})|(\\{938ec54b-e728-4e04-9a05-108b2246cf51\\})|(\\{bd474d1d-02ad-40a4-9237-4cd64d16de55\\})|(\\{622b8278-44d4-4f9a-ad96-1363247ae6c6\\})|(\\{9fd1d710-ebe9-4da5-a488-d51eb1e88ac7\\})|(\\{ee4314d4-00a2-48ce-bd11-4364496faa8c\\})|(\\{a06cfa87-55e7-4c65-a71c-a5e984c38e94\\})|(\\{1e36e1a3-6756-4ecc-9138-6939b23ed54c\\})|(\\{219cb4e4-5e4a-484a-844f-fee741dc65fc\\})|(\\{057669e1-0925-4d28-bd20-0fb643ad290e\\})|(\\{466bf5d6-c235-4731-9539-ebf90346f096\\})|(\\{a96faf19-5035-4149-9664-773abbc0881b\\})|(\\{656b685b-a458-4651-bb39-66242c67dd6d\\})|(\\{1acdd00a-744a-4875-be39-5a136aa20d7d\\})|(\\{58873ce7-60eb-46b9-a4af-ae62095b3fb1\\})|(\\{387033d3-4292-486e-80f4-44e531349a54\\})|(\\{5b8b07d1-4e0a-4c96-aad5-672a00c1358e\\})|(\\{15a8fac7-2bf1-4536-b4a3-7f51c9b7fa1a\\})|(\\{668952b1-4609-453e-9972-e9557192070a\\})|(\\{5f017950-0824-4806-9cda-e17d454f1b18\\})|(\\{008db332-feb7-447c-8359-829c2e5fc374\\})|(\\{3d412505-479b-47c0-b330-3599533e783a\\})|(\\{117a7b8a-6c7e-4fff-8d48-e12b02871b91\\})|(\\{8753c4a4-e083-49db-872c-eef47d1d58ab\\})|(\\{f439338b-3af7-4afe-bd48-77ee1039077e\\})|(\\{32588122-b871-43fa-b845-60b548a30235\\})|(\\{89a92c73-87b1-48b1-bc68-b814d1348d1d\\})|(\\{dbb477cc-8be4-44f4-9cc2-845632a7e433\\})|(\\{da48acfb-08ed-484d-90b3-0e63c759a4f4\\})|(\\{af40910c-c446-4a65-843e-5c39b6ef38f7\\})|(\\{0121e1fe-e88a-452f-ba88-7c330f87c137\\})|(\\{9cc2b320-5edf-4b20-be94-108583cc9b66\\})|(\\{babab679-6c9b-40c2-b62b-e21a3b4b5734\\})|(\\{5e4d38a3-eefd-4fb6-bbe6-5eb69295f37e\\})|(\\{ffb5e280-9fb1-42c8-bfbc-ac2db8232d9c\\})|(\\{50198f5f-f09b-4d09-96e7-ca94e327ce7b\\})|(\\{eee19d83-6edb-4b9d-b483-1070d60595a7\\})|(\\{7c5e2b18-56ad-4249-8390-03dd99aa5b09\\})|(\\{61af5d39-dd37-46fb-8ead-c7756764458c\\})|(\\{fb0dabc2-2a3d-45b2-8ed4-dc22b74f0ab4\\})|(\\{e3eb4df8-0cfb-4380-a7c0-856d4deda887\\})|(\\{180a38cb-115e-4794-a039-696446dc6b4a\\})|(\\{91dc3cb5-ab77-4e1c-af09-d827a0df9e08\\})|(\\{c4fec1da-703f-49fa-bd3a-5d7f939d2ae0\\})|(\\{a75f51d6-8d4b-4a28-b706-300403b82859\\})|(\\{d79394db-944c-4820-a90c-a2f48ab5fff1\\})|(\\{d6f11f95-a27b-47cd-bbcf-a9b5f2dd2a36\\})|(\\{3e64646d-9618-44ca-bf27-e424e76bd622\\})|(\\{43b57421-3ba8-4116-82c8-afd142c05674\\})|(\\{30935b8f-9a74-4e49-b6f5-8bb95d3ab3a7\\})|(\\{1ec5af15-c738-492d-bdcf-c14fd5be5e13\\})|(\\{feff2b30-7349-4e7b-9a9c-541f97dbc9e5\\})|(\\{48dbfb68-13d3-4372-820d-d52ea58ebdfd\\})|(\\{1a3a904a-3daa-4d1a-8260-c20b44fec6e3\\})|(\\{3794f3f1-6a11-48fb-a7c9-b33344ee82ca\\})|(\\{e3587df7-7358-4a36-aeff-944db7ab30ff\\})|(\\{43a526a3-28ea-409f-933c-2ef3d9a0629b\\})|(\\{2d3e88ab-b4af-47d4-b79b-a0becf1437b2\\})|(\\{0e02d0ec-97b5-4b46-b42e-d4179b067478\\})|(\\{dc7083b2-64f5-4ec0-a84b-3e5fdd552f11\\})|(\\{69d07419-67e5-4465-ad46-b969d5e5c3f8\\})|(\\{f31bdeec-878f-4465-b9f5-e844b45eb9a2\\})|(\\{9b63b79e-32c8-425b-ad18-753b58b73cbe\\})|(\\{8caf71a8-6c65-4cd4-95c6-9913dd169278\\})|(\\{e1f6fe90-e0fe-418d-9ff6-566cdd5b60e9\\})|(\\{e34bd75e-5e7e-48e6-a84e-1d18e5fcfb2d\\})|(\\{087940d8-dc20-4e9e-829b-7bd96c37b02d\\})|(\\{48defe55-de7a-4051-a5cf-ac6a649e66bc\\})|(\\{8bd54503-66cb-49dc-81ec-9fa0e9c42fe3\\})|(\\{ed9f9df1-9f6c-4e4a-a4ac-5d422a7c2a5c\\})|(\\{13261711-0eeb-457e-9035-7c415e286830\\})|(\\{E3F6115C-B027-11E8-AD5B-6E4CAE35F1A2\\})|(\\{93654046-f548-4d3e-9370-cc2244406725\\})|(\\{943ba377-5410-47cb-a025-30d55960622c\\})|(\\{426123a8-3e04-4887-a4a7-18931eaa428e\\})|(\\{4c50cefd-8f14-41ab-b719-8606b116d1c2\\})|(\\{ab2d09e4-07c0-461b-94f3-b2ea2a6773b9\\})|(\\{3f20ebf2-5869-431e-a73d-53d435176b04\\})|(\\{5b845034-25ed-4b92-bfac-ed7b305a3e13\\})|(\\{24c45b33-30e2-4d41-adb1-2a1bd9942ca6\\})|(\\{46f426fa-dc37-4b1f-ae63-11370ec65b39\\})|(\\{d678f055-e538-4c58-8a61-746166ac5063\\})|(\\{f852266a-7f88-47d8-b610-6ca130d9774c\\})|(\\{dce62517-e86a-40e0-9361-64c2e61f011a\\})|(\\{f7883a1d-0f04-4f8b-85ec-f339b791335a\\})|(\\{204f251f-feba-487a-9bbc-ca8b22b222af\\})|(\\{59c8031e-40de-485b-9988-69a4f4f51e52\\})|(\\{a5207f0f-109a-406f-8d86-3a2c806c9c7b\\})|(\\{3b66b98a-8782-4f16-a2f6-33175f9b0101\\}))$/","prefs":[],"schema":1581076280856,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613891","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0e546e4e-6d89-41a0-92fb-987b98efea6f","last_modified":1581082030072},{"guid":"/^((\\{0970b6b2-6702-443d-84fa-90f5b5cf7c10\\})|(\\{9ba7732f-7e77-4dae-9885-a9cb91930b0b\\})|(\\{dd43f6d2-30c7-43df-bce6-6edc46c84d9d\\})|(\\{72207416-61e9-4960-9cb2-87d2df8486fa\\})|(\\{d53274cb-43e2-4cbc-b1f4-5463cc026ab0\\})|(\\{e1faa92b-b124-463e-b247-2609d534733c\\})|(\\{654068ac-aa86-4f05-aab3-f9dbea380021\\})|(\\{58d9fc43-39c7-41be-96a6-a27b1e179191\\})|(\\{f5469e0b-d4cc-4c30-9922-f0c82f1e04e2\\})|(\\{2ebc9fc9-8642-4f97-935a-6885e66ed6db\\})|(\\{b7d87fb6-afc7-4544-b798-7fcc1c8114f0\\})|(\\{d36916ad-9b5b-4390-b302-321c43d85753\\})|(\\{1e67d5ab-aff2-4540-a2e7-cd19ee112ab7\\})|(\\{82f9d6fb-cbbb-4862-8c18-c0876aa00c3a\\})|(\\{2a78a205-7363-4d76-9eea-a862be445724\\})|(\\{bb65aeb0-db01-4f8b-893a-634d2977269f\\})|(\\{5cac0db7-8b8d-44e1-8932-687b152feb8b\\})|(\\{6cade252-0973-49b2-acda-36960804c0f3\\})|(\\{61e466b4-00e9-4ed2-94bc-dbfade21f066\\})|(\\{316b549c-841f-4f2e-9e91-5a8cf5c22808\\})|(\\{73571d19-5073-4b32-915a-a2350e814cf1\\})|(\\{2e5d7ab6-cdea-4a23-8bb5-3245ccec2c5f\\})|(\\{fbf35eb0-14de-483f-90aa-3f8c4ea773f0\\})|(\\{4a9619bf-edd4-4f6c-a787-c919cd4b1d17\\})|(\\{167fc8e3-1bcf-4f46-a8f1-1722db81c4a0\\})|(\\{b861c901-a92c-475a-9efd-805d01a1c6bf\\})|(\\{6800f73d-3133-4697-a368-16c1f6e63894\\}))$/","prefs":[],"schema":1581076281891,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613891","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1dbaa501-a6b0-439b-9871-79f081f4afdd","last_modified":1581082030069},{"guid":"/^((Search_Secure_clone_oRrmYYtiAX@www\\.searchsecurepro\\.co)|(Search_Secure_clone_rHXTjLgNGR@www\\.searchsecureprime\\.co)|(Search_Safe_pHUandPyRQ@www\\.searchsafe\\.site)|(SearchSafe_IEHxXeEbnC@www\\.searchsafe\\.site)|(Search_Secure_ByKsqSMauFtest@www\\.testsearchsecurepro\\.co)|(Search_Secure_GyQyTTzqnYtest@www\\.searchsecuretest\\.co)|(Search_Secure_NhrEwtJEhM@www\\.searchsecurenow\\.com)|(Search_Cipher_bBzgbIQyiC@www\\.searchcipher\\.co)|(Protect_My_Search_Online_clone_jtypmmXRwz@www\\.protectmysearchonline\\.com)|(MyAstroFinder_LTEnkWRkmt@www\\.myastrofinder\\.co)|(Live_Weather_Check_PZjCbwpxyH@www\\.liveweathercheck\\.com)|(Travel_Deals_Center_clone_GvEXeOfSMc@www\\.traveldealscenter\\.co)|(Dictionary_Pro_ARbsoVmMdl@www\\.dictionarypro\\.co))$/","prefs":[],"schema":1580931692537,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613657","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e480bd4d-7ff0-425c-9c1d-4153fa55ea81","last_modified":1581005656617},{"guid":"/^((\\{0fc22c4c-93ed-48ea-ad12-dc8039cf3795\\})|(\\{0A2C2098-F04D-11E5-A933-5334BC8E7F8B\\})|(\\{8504399b-e635-40fe-8943-977a58521db3\\})|(\\{347d4451-8da5-4d67-96b2-a2e8a6de8e09\\})|(\\{176c8b66-7fc3-4af5-a86b-d0207c456b14\\})|(\\{8692b95e-1a13-4118-b5b9-be8f3d2fc9b7\\})|(\\{b3e1e418-986b-4231-8579-0fc754574d9c\\})|(\\{88619e16-f0f3-4606-837f-a4496d11c0b4\\})|(\\{b4229471-001b-4960-bea9-795d91cb943e\\})|(\\{16390554-6fc5-4dfe-b7bb-809e378df660\\})|(\\{5fa01132-d07b-40e1-b958-e7825b878422\\})|(\\{07ebc943-2c8a-44a9-8d4d-5bbb78b2d2e5\\})|(\\{02405c0b-a202-483f-ba02-b09bab55cebd\\})|(\\{094f9b39-0561-4cb4-8b51-cb8ee5bd5b90\\})|(\\{a66e7db5-fc74-42c8-8e8c-d7a401a577d2\\})|(\\{58f9a1bb-0635-4b79-bb41-166c3e810329\\})|(\\{9da80afe-bcd4-4271-8f70-f986370d954c\\})|(\\{2671041f-f659-43b1-a400-0f7a3b852f74\\})|(\\{d9c98668-f0a1-43d7-800d-0c6d11321663\\})|(\\{1d6f99a8-d100-446e-8cc5-85231e7ab7fa\\})|(\\{ae170991-a8c8-4caf-b6cc-a3cc994abe83\\})|(\\{bfdd7357-3692-4d5b-86c5-4d86cd5e39e3\\})|(\\{aa5e865e-1e21-4ed9-b80a-f374be86b5cc\\})|(\\{26c58d0d-8514-42d5-87fd-701fd53ce3b8\\})|(\\{c934c41a-5de5-4086-b2da-1afc7d744162\\})|(\\{e87de7b9-5994-4b91-9c1a-a1d4d12a3969\\})|(\\{0eeab47a-73f3-48e7-977f-08815b4ee5ad\\})|(\\{1df850c2-38cb-46f1-87a5-308af6409c14\\})|(\\{1f481c59-fe50-4148-83d1-ff551f6dddf9\\})|(\\{70cfab72-ee99-428a-b5fb-26d924be3acb\\})|(\\{b156eeb6-cf37-48d8-b15b-bb863c431ba1\\})|(\\{a81f7ce6-0cc3-41fe-a33a-eb856636c887\\})|(\\{3949b4a3-bbb6-4119-9fa0-249fdff22c45\\})|(\\{abe2755c-a3b3-4714-a354-51eb5b8129fe\\})|(\\{547f048f-4fbd-40ef-9365-3d54559eae61\\})|(\\{e3e293e3-f18a-42f1-98bf-71d8166aef54\\})|(\\{ca742d81-6e6d-473e-ab68-f757d480e159\\})|(\\{6ac89db3-5ee1-43d8-a12b-a1b6e0ceafe0\\})|(\\{4eac966b-28db-477f-a471-a3bf74621110\\})|(\\{2c413992-ba94-4917-bd57-57eef39b4f8a\\})|(\\{6935560b-a856-42be-baa8-a06459785ed7\\})|(\\{503d9872-3db8-4f05-9c9c-b8bcd6d08ae3\\})|(\\{2055799b-b1ed-44ab-9200-4190467a3c59\\})|(\\{fe27a89e-a1b6-408e-b0b3-b2ccc0cbdf3c\\})|(\\{3fab2a05-1bfa-458d-93f8-16c523d72804\\})|(\\{32939492-d835-4540-9c03-1af0b715268d\\})|(\\{e9c96255-4eed-49fa-9740-54ef684b8197\\})|(\\{45fc39ef-f2c8-449a-b533-77e4d6202777\\})|(\\{d3ce94d3-a9ee-49e2-9290-031e56a4a5d0\\})|(\\{6b8a371e-ce42-4355-b4bc-ad4c83d5f932\\})|(\\{cfacd4cc-9f18-40f2-8711-795e738d51be\\})|(\\{d41f259b-c827-46d9-891a-33b6caf2370c\\})|(\\{3e90457a-815b-4b0a-812d-f02a43c23951\\})|(\\{063de0bf-2da4-48c6-bed2-ed11ecb3bfb8\\})|(\\{cd253156-e140-433a-a0fc-ccab28bf069b\\})|(\\{9a6f884b-3b8a-4925-8f7e-a975e2f6ec20\\})|(\\{5986d98c-b75c-46d8-9c5a-0fef03cddd5b\\})|(\\{8d586a4b-f00f-4a5b-940b-2fe00dc2905c\\})|(\\{ab0f5841-11f0-4c92-9bf8-b885f4431253\\})|(\\{eb1bafab-7f4d-43a6-8f78-fb0dbb099cff\\})|(\\{e6b152f0-5457-44ab-a6cc-d7869dc694a4\\})|(\\{942fe5ef-e9a6-4791-b840-a2e74baaeb4a\\})|(\\{d1c67270-c2af-47af-a4bc-2c020df200c5\\})|(\\{8a934de2-3238-4c24-aa29-52e1fafc64d4\\})|(\\{c65f3bbe-684e-43d6-b030-615118b38e54\\})|(\\{286f65d2-6b01-4f04-871e-2cef4095065f\\})|(\\{2FF4B97E-A47A-11E7-B621-7403A54193D8\\})|(\\{da482f08-4b6f-4c59-942a-75e1fedc8c6b\\})|(\\{3a961d08-8ca9-45af-9c30-2ba4d673e10f\\})|(\\{e87de7b9-59a4-4b91-9c1a-a1d4d12a3969\\})|(\\{942fe5ef-e9a6-4a91-b840-a2e74baaeb4a\\})|(\\{b15a65af-8dbe-46ac-9537-f91fb1640809\\})|(\\{da48af08-4b6f-4c59-942a-75e1fedc8c6b\\})|(\\{ce2c3653-8d63-4cd0-ad8a-31f03703820a\\})|(\\{5d987ae9-c201-4352-a219-a34ee28a6f9e\\})|(\\{b15ac5af-8dbe-46ac-9537-f91fb1612309\\})|(\\{3fa556a3-3bfd-4e4b-b403-072938701c66\\})|(\\{57baae18-26fa-4ec0-9fe8-a0e197c1a220\\})|(\\{4de7b432-e5e2-45d3-95cc-df3e913b68d4\\})|(\\{a15a65af-89be-4fac-9127-f91fb16c0809\\})|(\\{c2c8b504-f5bb-489e-858f-38ca5224d033\\})|(\\{7f458bd6-4841-4373-97a4-a3d140b02552\\})|(\\{e20bc238-0831-4d4b-9386-d2fa5abe804a\\})|(\\{e51fa7b7-4c3f-4f66-8bc7-e864a413b790\\})|(\\{f9c04a94-59d8-47f7-a97d-980ff99f81cf\\})|(\\{d6ea5103-78ff-4736-b2e0-c0ce94bee77e\\})|(\\{f8fd0172-1b1a-4084-b440-4119996ab2c9\\})|(\\{a52e4eea-9923-443b-98a6-942eb27ba324\\})|(\\{a1fcb660-c2cd-49b7-a327-88e887afb43d\\})|(\\{cea42340-da28-4c95-89c4-0a66d69050d4\\})|(\\{c2f47878-f9d3-4c89-be58-a69dd9d1484a\\})|(\\{7ddf85d3-7014-4fdb-836a-fbbe4385347f\\})|(\\{36f452d0-6154-4be8-a388-174fc98d9333\\})|(\\{c69d7a2e-ad00-4e9f-80d7-fa0604ac3954\\})|(\\{8d40db57-9287-473d-b398-259d702d92f1\\})|(\\{bf51b8cc-a07d-475a-9013-91e2c089ae60\\})|(\\{32030663-2a21-4d20-a2e6-ed3d4a51b704\\})|(\\{1204abf0-0409-4934-ab58-1f5424134bc1\\}))$/","prefs":[],"schema":1580758890801,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613073","why":"This add-on violates Mozilla's add-on policies by redirecting searches or collecting search terms without user disclosure or consent or other privacy violations","name":"Add-ons violating Mozilla's policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2c6f59bf-90a6-4fdb-a12d-f1b4a1446331","last_modified":1580842055124},{"guid":"/^((\\{a88e625f-b840-43b2-9feb-99c259b6751e\\})|(\\{0cc6c564-63c6-481d-9dbb-ddfd40ced202\\})|(\\{329e1c15-fcee-4063-83bc-59c894861cbc\\})|(\\{98e2e7ef-e544-4426-a182-621e8b85c15d\\})|(\\{d8869a56-bccc-4011-9b86-2962a57d7377\\})|(\\{255138e4-d9f7-4779-8713-e5970090ab67\\})|(\\{ee5907df-603f-4684-8f2a-425742ed37cb\\})|(\\{0e725b0e-9f26-4bb5-b9b1-738df2692e19\\})|(\\{2bf69cca-c4cc-4200-ab56-1d27fef48e03\\})|(\\{4edc1ea7-7037-4b54-8a64-a43339545710\\})|(\\{6edff7c6-97a8-4355-a074-e191b0a9a4ff\\})|(\\{79c5d05b-a6ba-470b-b06d-d33fe04418e5\\})|(\\{a1ebe305-b540-4dc5-91a2-8a2a0d646efa\\})|(\\{1211b4db-1ed4-4630-82e6-cdf69d58f035\\})|(\\{4d4e8ee2-78aa-42f5-a30a-c3727241cb96\\})|(\\{b6178891-7400-4b86-8a96-d57b1b7eee20\\})|(\\{3cfcb0bb-f7fc-440b-bae9-1050a966013b\\})|(\\{747931c3-bf5f-49d0-a4d2-615847200653\\})|(\\{989fcf36-da63-4d83-a036-b996788e7a4c\\})|(\\{a0dc99d3-7b9c-4fa2-8d42-39179b1e1e5a\\})|(\\{d4ce8b88-6b17-4ed8-b695-29da839dfb41\\})|(\\{cb2af2e8-ca55-4545-864f-96686760b59e\\})|(\\{3961b434-016c-4598-9ab2-38425197f32e\\})|(\\{b4e25be7-a4a7-408b-8759-8b185b4421f7\\})|(\\{0cb56fc3-e3f8-4ea3-aba7-4a2d351f82be\\})|(\\{b3e9621c-3194-4cf8-8b28-4ad32a988d5a\\})|(\\{241b64a7-7b2e-475b-b195-b1cfeb099745\\})|(\\{b727f9fe-9345-4ce4-8797-f65f85dfad7d\\})|(\\{a90d260f-7c39-4539-9948-8f3ee4406a9e\\})|(\\{35a57c90-ce66-42f6-ad0f-52b92690f4c2\\})|(\\{83048c90-baca-477c-8774-054f80eca4e6\\})|(\\{91c1e004-2e1a-4103-89c2-2f585c2d306d\\})|(\\{a5701591-3a6d-43b1-b74b-c47a1b7aa5b7\\})|(\\{641eef82-a96a-4702-b3fb-f50f8d7cdc85\\})|(\\{b436362d-94e9-4209-a3e5-26dc7d1ec86a\\})|(\\{70dc19f1-1312-402f-a370-cd8a1e231116\\})|(\\{c9a68220-ad02-4b09-9456-12ed03121344\\})|(\\{dc0d8992-0c9e-4473-b8c4-72240fc7be39\\})|(\\{1c3ca6ca-1427-4b6e-85be-315e18f81135\\})|(\\{96309a2c-339e-4c3e-84ff-ef7dac131a18\\})|(\\{95d07270-fb53-40c3-9b9f-46ed78658a1a\\})|(\\{15700ca0-8d4b-40d3-99aa-bff59aa48676\\})|(\\{5d308759-368c-4b5a-804c-acb6e18c6436\\})|(\\{b47ace66-3443-4d26-a858-7bbcfe1c18b6\\})|(\\{10dc172a-38b3-441b-a2d4-52b4ce8e4b7b\\})|(\\{73a47b20-be2c-43e4-a728-c46d33612ccb\\})|(\\{5f3f1314-618c-4c3d-ac4d-f83ae6d247ac\\})|(\\{bb81241e-b093-4c55-8c3e-7dca2250ada6\\})|(\\{4d8be4aa-4790-4807-add9-af62132e675d\\})|(\\{4295e30f-80bc-4d48-b794-c609de6f2dc0\\})|(\\{057c6b57-46f3-43b4-9576-438afdd3b3ca\\})|(\\{60a58bf1-08ae-46d7-9010-5cfe8eb5f282\\})|(\\{bffd69a1-5a8a-4b0d-ae14-f8744adb92b2\\})|(\\{b5c0b80e-dbc6-4701-98c2-3b0b8e182404\\})|(\\{48306d77-a699-4cbe-9ed3-b3162dfff00b\\})|(\\{f1f285dd-4a5c-48ad-81bd-78fe204ed582\\})|(\\{da0b9335-8edc-4429-8889-c5872ad02417\\})|(\\{6e834570-8580-44c2-91b2-d30f687aeb07\\})|(\\{9ea1bae9-5dca-4a1f-9fcf-a325a39b85c1\\})|(\\{69149c7f-92c7-4d41-b88f-e68c237d1d63\\})|(\\{985e1bca-d152-4fc3-89a0-cba2c0ac44bb\\})|(\\{746c7167-56bf-48b1-bd6c-08b05b48a863\\})|(\\{4bc87632-de6e-4c23-8192-f561f185a823\\})|(\\{1d21ed2a-94c9-4bae-983e-5c1e5094060a\\})|(\\{148df2dd-451b-42eb-952b-f608f26cfb6f\\})|(\\{2c6d6dea-438c-442a-ae11-a943804d90b4\\})|(\\{2c7e143c-9f4d-412b-b552-17033d4992c6\\})|(\\{e2309514-8386-413c-856e-21b54ebc3d9c\\})|(\\{4b417a17-ff90-4f16-bb8b-fb1e0d9ca824\\})|(\\{7c68360c-d03c-4c26-bbfa-2f9c9064701f\\})|(\\{eefb2906-cb27-4801-9ae8-67b49807b151\\})|(\\{b7c790c9-aaf6-46f2-9462-812d3e129ce7\\})|(\\{aac68138-e60d-48e2-92dc-d28577e553d9\\})|(\\{5959fff0-d04a-4147-8d4d-aaa7bb314a00\\})|(\\{40bf9b7a-9c36-40a8-8e68-91b79eb3bd44\\})|(\\{96429801-73cc-403b-be68-fb8a992f9307\\})|(\\{218e967f-59b5-41f6-a22f-7fe3c1580956\\})|(\\{ba51f209-a2f6-42a1-9608-536058540d0c\\})|(\\{d993e7df-00f9-445f-9082-294017eeec36\\})|(\\{f1990255-00e8-4d34-91d5-11d09066e4f3\\})|(\\{dbb78ed6-8449-475f-a152-0148596539eb\\})|(\\{ac798a99-00f0-421c-a3c9-a13bea8ef728\\})|(\\{e486268f-9299-422e-91df-9706ea220c46\\})|(\\{ecf1e24d-cfeb-4fa1-9953-202c3e62a820\\})|(\\{caf7fac5-0784-4701-a50d-2d0c27074b9a\\})|(\\{8f85f7d7-7182-4a53-a18a-bf83f0bfd1b4\\})|(\\{be556a9a-df8f-45b9-87aa-ae0eaf50a2b4\\})|(\\{9f80406a-ba8a-4548-bb0e-e987fb1d7921\\})|(\\{d0386a6e-e364-4e67-b340-782492bdb3ee\\})|(\\{cb0d2b3a-929c-42f1-8874-07a0650d0298\\})|(\\{cd9f2f81-3674-4d3e-a1b3-824fd3e5e906\\})|(\\{58366e2d-3a39-4fea-b631-521e3e73162b\\})|(\\{d854ae81-f759-48a9-8732-2371664fe2fe\\})|(\\{4747285e-3ec6-4d8f-9d1d-d0430297f182\\})|(\\{2f1919a8-4ca8-4a80-9175-c2da3a98490b\\})|(\\{32b30902-43a3-4f37-8e86-860ea525e923\\})|(\\{60376450-fe48-4d30-b551-b35535df6e96\\})|(\\{22456782-c5e4-437f-9369-5b23b875cd6a\\}))$/","prefs":[],"schema":1580814638830,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613073","why":"This add-on violates Mozilla's add-on policies by redirecting searches or collecting search terms without user disclosure or consent or other privacy violations","name":"Add-ons violating Mozilla's policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b3ee1de-0c37-4883-a22f-822c8d6f8991","last_modified":1580842055121},{"guid":"/^((\\{35417623-1a2c-4e75-846f-e2a7b95b3b24\\})|(\\{d6dfebf0-51d4-490b-b03d-a17bf7fe4a6d\\})|(\\{50c7fb39-c03e-4d82-a071-fac7eaf960b7\\})|(\\{28999f9d-6e83-4c52-bb2b-5d2c46b7ef58\\})|(\\{9409fdd1-d78d-4df8-bb5e-f178f42702f6\\})|(\\{4c356115-33da-49e5-877b-090c64d76a66\\})|(\\{cf674a88-861f-4357-aea7-37f09e534552\\})|(\\{43238f2d-ddba-4604-803f-889bfaa22ebf\\})|(\\{36405669-81af-44c0-83cc-32ae8f901db0\\})|(\\{2ca5cfff-58dc-47d4-b56c-c206d281a9cf\\})|(\\{b22df1a7-f312-41a8-8fd7-cdd160ba7be2\\})|(\\{cf019c95-1c49-438a-9398-3863642fb606\\})|(\\{c7a9d852-c30d-4e6d-b040-a445551bee61\\})|(\\{379932ed-2938-4ccb-b57e-2dc44c3b5121\\})|(\\{d2395ba4-96e4-4ffb-a4da-608f27328c9f\\})|(\\{7ffbda76-3f9f-403b-a5e1-559c4f18c1f3\\})|(\\{361db730-4c11-49e8-b189-fa461f738786\\})|(\\{677456f1-2716-4a23-9a74-f3867e860dbf\\})|(\\{46c19d03-16ce-45f2-82ce-d8ccaeb3ceea\\})|(\\{6339b6ff-da02-4821-b5a0-48490a54b14e\\})|(\\{7d4d815d-798c-4cc0-9561-2f84b4598f94\\})|(\\{40fc3311-9612-4cb7-b337-fd581dead5f2\\})|(\\{9e639048-d366-4db0-a15a-f1953130fc8e\\})|(\\{ce2d009a-47af-4e94-94aa-23bd8973addf\\})|(\\{41984c46-3ec2-4684-99db-a5c4356f7ba0\\})|(\\{a63f9261-e05c-45f8-8b43-f987eaf5b27e\\})|(\\{37e06cae-3367-43e2-bdb2-0c087f2603c6\\})|(\\{f9d80e53-acb1-4483-bf3c-f58920551ded\\})|(\\{1672a22a-f6cc-4318-9616-22e1e3b3049d\\})|(\\{1cc6cbe4-38ad-44c4-a462-a2a222bab5be\\})|(\\{0255dcf8-ac71-4403-ab5a-c8f7abf66a39\\})|(\\{564f7511-ba68-48a0-9a85-636a100ce3d1\\})|(\\{4ebf29d7-102f-497c-bc8d-696dd66ecde6\\})|(\\{4c4139ca-ffbc-4f10-a534-22dd4c787944\\})|(\\{a12c1827-a5fa-4c11-8403-e02e9520f0ec\\})|(\\{2178817b-1d32-4068-9675-8fffe11a88f8\\})|(\\{b779151f-7a4c-46b2-83e4-3dbad231a9b9\\})|(\\{fe8a8186-80ef-4112-a41f-7d00ffceb63e\\})|(\\{0ee72846-9a34-422e-b202-382aa19bc0bb\\})|(\\{c92d2fba-d002-426d-acc4-0891fa40040f\\})|(\\{e3bdfd08-fa29-4a56-9851-f6d0b965004f\\})|(\\{0017666d-27b7-4347-bbbf-6d389b4430dc\\})|(\\{c9db55d0-61e4-4515-a9a7-24e3783bf106\\})|(\\{fbf87239-ec23-4907-bb6c-93daa5015ea3\\})|(\\{44801e5e-a635-455e-b08f-f3da88b06bed\\})|(\\{59517a31-ea51-44cd-ac7c-02d952ecf04e\\})|(\\{ee075bcc-2101-4c9e-8f04-7e7281ca5c74\\})|(\\{fd073c3a-d7d8-43f6-9d1c-1865bc0ff940\\})|(\\{a15f4275-8f19-4508-b548-a88597092bbd\\})|(\\{568ad6c6-0b91-46bd-9093-bc394a84c257\\})|(\\{11f798d4-003b-41a8-aa65-1f566ff53f06\\})|(\\{a02f26f3-49f7-4e95-a69f-78b1ce2d3471\\})|(\\{ed48226c-94b9-4878-86ba-de38851290d7\\})|(\\{97e5276c-a627-4c62-8659-4772a81203c0\\})|(\\{4cb19fea-1568-4f0b-809a-0763fbb36888\\})|(\\{599cff19-2ba7-4bf3-93a9-87f7f277cadc\\})|(\\{f0564e7e-f154-4612-b50e-e0d11c47b359\\})|(\\{3cc8efd6-4808-428a-9e0c-ef6fa45d17b4\\})|(\\{3842feba-bb44-49f6-9511-de1a1b78d348\\})|(\\{ebc3de57-de6d-43ee-b76b-676893dd7035\\})|(\\{a5f552f7-7279-49e5-92cc-70f952534726\\})|(\\{3ece0c93-9723-4280-8356-d1eb2025e2d5\\})|(\\{8579047e-a427-4ac8-87b9-ee9651c1f856\\})|(\\{c9bfdfd9-4617-4749-afd1-265f0b7158cf\\})|(\\{0c570e22-54e7-4d93-86f2-36e19707018a\\})|(\\{cfc0fa6e-0d6a-4fcb-9dc2-58b220307293\\})|(\\{8640eaec-8d51-4d6c-b01b-a671f4aac012\\})|(\\{a0ca05be-c6f2-4c18-993f-de55abca7000\\})|(\\{de066e14-6527-4be4-9751-e53ea16fd60f\\})|(\\{5a8f8da1-3994-43da-98be-3a58ed4d2ec6\\})|(\\{bcd8524a-8f39-4eba-a795-aabdd95305b4\\})|(\\{7d76001d-fda5-4abf-93f6-a947dd3cca24\\})|(\\{d18219fc-b632-47dc-bea1-73451164d187\\})|(\\{e97fbca9-d513-4fa7-9524-576620470399\\})|(\\{069b10e7-f7ef-40df-87bb-95783401a54a\\})|(\\{12a978dd-a7b9-42c2-b431-65aaa56c2a77\\})|(\\{66ba2e20-9378-493b-837f-4b3a028ab5d9\\})|(\\{9ad5b1e9-a19c-4a65-be1b-8b888da7cf58\\})|(\\{87ce9b48-e659-4b14-ab54-c80ffbeaa77f\\})|(\\{4da94d09-4730-4277-a544-f3b7890b6666\\})|(\\{30e6c020-4ec6-4b18-8f29-3dc294fbbb44\\})|(\\{5bfbdd70-ce54-4686-9351-0d90a7dd011f\\})|(\\{17eb23ec-f059-4857-a405-9d06242e99b5\\})|(\\{b4170b6a-0af2-45b1-9214-3665e870ab3a\\})|(\\{bc20b5b7-46c3-4af6-942f-f0323445b576\\})|(\\{44edc268-9242-461f-9d8a-fb59337101b0\\})|(\\{301321f7-e0a2-4cc2-9cc6-7ee1390ea895\\})|(\\{b57a503c-6370-4ed1-90ed-1b6444ca1e52\\})|(\\{c4707969-efc7-46ce-845d-28a46c78fda6\\})|(\\{22714afe-0f06-496d-9897-31e52e83a12e\\})|(\\{a07fb8cb-91fa-4799-9ff5-115e8a88b57f\\})|(\\{f539ec45-16dd-47a3-a9d5-8643b021d4c9\\})|(\\{b9348282-9380-4e55-9939-e4c10254a496\\}))$/","prefs":[],"schema":1580814639945,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613073","why":"This add-on violates Mozilla's add-on policies by redirecting searches or collecting search terms without user disclosure or consent or other privacy violations","name":"Add-ons violating Mozilla's policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ae074a33-05f8-4721-a9ff-7111502291c2","last_modified":1580842055117},{"guid":"antimalware@titansurfer.com","prefs":[],"schema":1580240491748,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611797","why":"This add-on contains deceptive code that is not in line with our data collection policies.","name":"Titan Surfer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c703b7fd-4b40-44f8-9de6-786b66ef8e1b","last_modified":1580742890204},{"guid":"app@OnlineFilesConverter","prefs":[],"schema":1580380822975,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612169","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Online Files Converter"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bcb1821a-25e6-4b9b-a54c-bf4543f895c0","last_modified":1580742890201},{"guid":"{f83128d7-ef15-47a2-a99a-70d181413b81}","prefs":[],"schema":1580381170095,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612294","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake banking add-on"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1ca7b6ce-30d5-4290-b46f-9fad59b65f9c","last_modified":1580742890197},{"guid":"{d281b854-0c99-4e4b-b647-32038ae53c27}","prefs":[],"schema":1580727235989,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612868","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"SApp+ (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"93cceac3-803b-412a-b413-fdb1b0689626","last_modified":1580742890194},{"guid":"/^((\\{236a5a66-132c-4d7b-a62f-66f1a76bb7b7\\})|(\\{0fadbf07-bb25-4737-9800-b879a6f1c417\\})|(\\{c8ec696d-935c-45d0-a604-180244e839e3\\}))$/","prefs":[],"schema":1580740785659,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612869","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"183a1de1-2625-44d6-90df-cbdbee9d23bd","last_modified":1580742890191},{"guid":"/^((mozilla_cc4@internetdownloadmanager\\.com)|(\\{4509d977-32a4-480a-ab95-6ddb5bfc6616\\}))$/","prefs":[],"schema":1580741006002,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612871","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ad2f927a-eb67-4360-92e0-87f567608c1a","last_modified":1580742890188},{"guid":"/^((\\{f2431eaf-2b0d-4f0b-8148-3188db294d73\\})|(\\{c43e5363-2c61-4c3d-afa4-9cbe06e767d0\\})|(\\{bb8eab9f-4611-496b-bd31-a1b2ee66d8f9\\})|(\\{5f61d055-ae45-4ecd-9570-555609f66f5a\\})|(\\{532d8a77-86b6-4a7a-87a4-d973dc0cf9d0\\})|(\\{bfd10065-670d-4477-98dd-8bb4285040d5\\})|(\\{79f33a52-631a-406b-afcf-9be8b4bb480a\\})|(\\{fd994367-ecfe-44dc-a595-cb155110492d\\})|(\\{9a01416a-758c-4fd7-8e56-998acc588f9b\\})|(\\{517a72f3-e9cb-4e9f-8a2a-9639f4daed76\\})|(\\{4fda7f17-eaa0-44d1-91e5-7d8305a2de0e\\})|(\\{695bd646-ba09-4a3d-9616-191b355aec33\\})|(\\{6893ed50-b006-430c-bbfe-5f049e57470b\\})|(\\{7a2f84c6-d1ef-4902-bae7-b6c7807cb32f\\})|(\\{afde1624-c4a4-4494-9ed5-1ad15799dbd4\\})|(\\{e05b53dc-910d-47ce-9c9d-5195e8e8f3e5\\})|(\\{11b0ec0d-ae49-4ce8-a13c-198affdb4d9e\\}))$/","prefs":[],"schema":1580741081005,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612872","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dd36267c-dbd3-4df1-bc01-5f566ba56de0","last_modified":1580742890185},{"guid":"/^((\\{6b7df170-e6fa-4b9b-bd76-d6b866a5bc6c\\})|(\\{7e1c1f98-4c89-4668-b9ea-e258e7c9e22b\\})|(\\{1f2128cd-bcaa-4e60-b555-0713054df0f9\\})|(\\{9043971c-ce88-400b-b56f-7a9e3853eb32\\})|(\\{afcbdf71-be6d-46cf-b5ff-6a6b9ec7f920\\}))$/","prefs":[],"schema":1580067691094,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611725","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b4a4d34-1341-49ea-8b53-96a1ecfac49e","last_modified":1580207330647},{"guid":"/^((\\{0ded4ebe-965f-4de0-89d2-91ed13ae15ee\\})|(\\{5c143da2-6a9e-4afe-9ca2-b758aebe6e64\\})|(\\{c6566b12-297b-41fb-8189-f32a7d1c1b87\\}))$/","prefs":[],"schema":1580078568605,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611806","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"70af2927-6552-4eae-a91a-89e4cdd61b88","last_modified":1580207330645},{"guid":"/^((\\{9237d0ab-aaf0-41a2-b873-c0f131b09ce4\\})|(\\{18b14b7d-e228-416a-bab8-37acf6d6dfca\\})|(rwkaddon@racewarkingdoms\\.com)|(\\{2e2d6d72-2634-496c-a8db-db869b639a21\\}))$/","prefs":[],"schema":1580137101921,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611807","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons injecting remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"303a149e-8262-4d16-b24b-348b84d5051e","last_modified":1580207330642},{"guid":"{c6ce41ee-a4e3-4fd7-ab6a-988b6916d66a}","prefs":[],"schema":1580137557625,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611810","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Qwicky Advertisements (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"18581952-6448-4728-9fd4-2860b3e6534e","last_modified":1580207330639},{"guid":"djuvt@czgnp","prefs":[],"schema":1579817517633,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611297","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Update De (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ad789bcb-4c12-401d-b6fe-202a5b6697b6","last_modified":1579987441268},{"guid":"/^((zdphb@swlguy)|(czgnp@hhjl)|(mjrxg@zdphb)|(fuevm@czkvq)|(bgufa@djuvt)|(czkvq@bgufa)|(axvij@fuevm)|(swlguy@axvij))$/","prefs":[],"schema":1579863493098,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611403","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"83d7f7c0-8a56-4feb-9e66-b77af6343430","last_modified":1579987441264},{"guid":"/^((\\{50fc0c97-b405-4f63-9c10-465cab131ec7\\})|(\\{e08f09a1-e8e4-421c-a460-ada7b13077c1\\})|(\\{887c8e31-c11d-4b67-8bbc-e5b5e8fea9dc\\})|(\\{d67b6e83-976d-458f-aece-0af986c16db7\\})|(\\{d0c0679f-9fa1-448c-a78b-f8fa1591597b\\})|(\\{23747ea4-fb31-4349-9954-2728f1d4bda2\\})|(\\{5d492e1a-7e3a-48ca-9745-784a5b61980a\\})|(\\{bec8dea7-eed3-464a-b99e-92cab1e10373\\})|(\\{48d63231-1796-4b26-a3f7-1aa7f5bed1f4\\})|(\\{fdc94eff-5212-416e-b2e4-d67c088c4907\\})|(\\{ffd2c868-9f15-48f1-a77b-c5a1842a2e41\\})|(\\{9b0e5b96-2b47-4ee4-b511-7402c05ab43a\\})|(\\{f01f803c-fb6a-4c0f-9dfa-d8f6173b3b17\\})|(\\{b2ed387a-02c8-4bff-bf6f-00ce6b5f067f\\})|(\\{7222c5ee-8154-4e47-8521-1dafcd00d902\\})|(\\{c085ea8c-57cf-41c5-a41e-38dd6288e808\\})|(\\{2cc9608c-dc69-4bc0-8d3b-95852face3ac\\})|(\\{5977f159-e17c-48d4-8e2a-8b48962a57cd\\})|(\\{10e4d201-689d-4864-a04e-f21186f3d4e2\\})|(\\{79119982-95ef-4cfd-9fe2-b193018503ee\\})|(\\{520dd821-08e0-4821-abf8-347474c78f72\\})|(\\{6ff93655-17b6-4bab-bb0e-40abfcd5a853\\})|(\\{af670583-4dde-4e1f-b169-efc5aec481f0\\})|(\\{b053d2ab-0c28-41a6-99c4-4d276af55169\\})|(\\{4b70886d-6215-492d-8330-c220b714a216\\})|(\\{21855045-7800-4467-923b-096efe6ded40\\})|(\\{6c1f8c3a-47dc-480f-8007-3204db00a8c2\\})|(\\{2dc676a9-bc76-405c-9252-b76c60cc172d\\})|(\\{d464e0a4-8798-4356-8cb1-b1b819d80d2d\\})|(\\{b4cc995f-aca5-43dc-bde2-dc5b5de620ba\\})|(\\{448b1043-fc5e-471a-8a10-5ec74fb16054\\})|(\\{becb255d-985e-4f59-9e7b-a3f678bb53ba\\})|(\\{f200084c-a7cc-46a1-a84e-289a8c033124\\})|(\\{c6b5b880-ae5e-4cad-8eaf-fce059892c0b\\})|(\\{0ea7199a-707d-457c-95d3-cc84436c5634\\})|(\\{dc702775-072a-42c4-8a7f-0e02b202a48f\\})|(\\{4a1c6922-5b77-4f07-84f7-47e504ec5249\\})|(\\{145fa75f-ba31-4f91-8664-c2559887a664\\})|(\\{b9d3f331-5a3c-494e-a0dd-5b7dc1b949b3\\})|(\\{f7801e2a-e119-434d-83c5-e87eedffecf2\\})|(\\{1b88498d-c70e-41ab-98ef-4239582e77d6\\})|(\\{b0162d70-142b-43f2-8414-30414a2b1ea0\\})|(\\{1f7166b4-c765-4129-b727-ef077814e0af\\})|(\\{ee2cd2a1-b4f8-4ef1-9fe8-db89e8844e47\\})|(\\{569c8641-f0f7-4eda-afd2-4ca6f6fc8bc9\\})|(\\{85c5a731-0b8b-4d91-bbad-07790b7a0165\\})|(\\{02197da2-c4b2-4a55-b323-f56aba8d3ed2\\})|(\\{d5250fb9-6db6-4eb3-bfe7-b8d3bf326c6e\\})|(\\{947c328f-b462-4618-bc4a-a967d1d7bc77\\})|(\\{c04bf263-7edd-481f-a3b1-0ea9d2aff14b\\})|(\\{f69637b8-b48a-46b5-b1ad-132afc1dcaa0\\})|(\\{8f2b4de9-599f-452e-9fe5-a3ea7ee2d633\\})|(\\{ebc34c54-8004-4281-8321-84145bda54ec\\})|(\\{c3f94bd2-0391-44c0-89a1-212ca3844abe\\}))$/","prefs":[],"schema":1579863851954,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611277","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2af6cf76-8f55-405b-8f5b-d784616768ba","last_modified":1579987441261},{"guid":"/^((zddx9wbjta9g23vk5ejo@zddx9wbjta9g23vk5ejo\\.com)|(\\{0629026f-e941-4a98-8975-b8cdcc20fbdc\\}))$/","prefs":[],"schema":1579796394954,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611198","why":"This add-on violates Mozilla's add-on policies by using obfuscated code and/or showing malicious behavior on third-party websites.","name":"Browser Kompatibilit\u00e4t (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d94be063-b34b-4ec1-bb02-59bc343029a4","last_modified":1579817517239},{"guid":"{c77fdf50-1880-4914-b553-6e3500f43f2e}","prefs":[],"schema":1579617431416,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610552","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Pdfviewer - tools (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cb6be8a0-0600-439e-85f1-512cc1d0e48f","last_modified":1579796394592},{"guid":"{669207af-aef4-42e5-b1fa-675995be9cf9}","prefs":[],"schema":1579604778159,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610480","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"54396dc1-f469-4a88-b0f8-352985a85b13","last_modified":1579609877650},{"guid":"/^((crisstehn@ffmust)|(jjwalter@junior)|(qlobthedark@ggmay)|(ficlever@roentgen)|(nzclever@roentgen)|(ukkinda@rottaai)|(GOEORG_RF_ANA_N@BDOFsKOKK)|(ioadjf9340joif024rf@ioadjf9340joif024rf\\.com)|(f1a1cz46o6rzl335xcrg@f1a1cz46o6rzl335xcrg\\.com)|(03t4joaijlcvjja@03t4joaijlcvjja\\.com)|(bdojfkobidjfo9e@bdojfkobidjfo9e\\.com)|(0iwtjvpvfhqyv2go1237@0iwtjvpvfhqyv2go1237\\.com)|(g68xhmxwozq8xtp4emty@g68xhmxwozq8xtp4emty\\.com)|(idyzvr0haermejvwfaqm@idyzvr0haermejvwfaqm\\.com)|(czaoyj52ki5owo07318z@czaoyj52ki5owo07318z\\.com)|(4sgly4c7s5pca7o220g0@4sgly4c7s5pca7o220g0\\.com)|(8sd351lwavakull4dcqd@8sd351lwavakull4dcqd\\.com)|(ukkindaa@rottaai)|(besth@lgimm)|(canaddxd@ptrx)|(nlextt@awes)|(bestseg@bbcd)|(swlguy@swlg)|(germctr@prx)|(pro@socialsmonetization\\.com)|(nicejohnus@lg)|(beta@lvvtqmq4qrhgmjb2zd7o\\.com)|(beta@b96mupkh82zywdrmxecz\\.com)|(dvhi19naabzond6ikvl6@dvhi19naabzond6ikvl6\\.com)|(approver@vdmqsgm5nyfiirwh8ryy\\.com))$/","prefs":[],"schema":1579603732879,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610462","why":"This add-on is violating Mozilla's add-on policies by showing malicious behavior on third-party websites.","name":"Malicious add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"448ff9b0-94eb-4d24-af8e-b56141824c80","last_modified":1579604777796},{"guid":"/^((f53pabhktayw2qusajt8@f53pabhktayw2qusajt8\\.com)|(weatherpool@bwv9ggnrvitryck9k8tf\\.com))$/","prefs":[],"schema":1579549290940,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610359","why":"These add-ons collect ancillary user data or take action on behalf of the user without consent.","name":"WeatherPool and Your Social"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"30ab36b8-c080-4ded-8531-07259112779c","last_modified":1579603732509},{"guid":"/^((\\{293476ee-263e-4cad-8dc4-2fe03209adc7\\})|(\\{622303be-705e-4247-bc2e-9016d8867e3d\\})|(\\{6ac09a19-8de3-418f-a4e1-1ee3e8810990\\}))$/","prefs":[],"schema":1579601336651,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610456","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Fake premium products"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3db3364a-0e20-4635-bc63-f2bba4a10415","last_modified":1579603732505},{"guid":"/^((\\{525f4b51-8ea1-4db8-bc81-829cf10a14a0\\})|(\\{2411143d-8afe-41ea-874d-ea4a8dc8b1c7\\}))$/","prefs":[],"schema":1579250266121,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610061","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b6f17555-93b5-4721-a92d-53500d1fe0fe","last_modified":1579530103133},{"guid":"/^((\\{5335fd1c-3baf-4578-b339-516dbdcec832\\})|(\\{1bf381aa-a819-4067-a537-eadb0d6538ba\\})|(\\{0e3703a0-46ae-4d18-bd04-8f8f570fdb77\\})|(\\{b350dc7e-cfcc-4ffe-9225-9feefe922bdb\\})|(\\{eeb3bf29-f1db-4f75-a6cb-8675ace58390\\})|(\\{9a216bb4-d664-4535-baef-ee1f4db012d2\\}))$/","prefs":[],"schema":1579191500704,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609718","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Tamo Junto Caixa"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d845bc55-9b05-4dc7-ba4a-57462a51be39","last_modified":1579250265716},{"guid":"/^((_65Members_1202@download\\.fromdoctopdf\\.com)|(_65Members_1202test@download\\.fromdoctopdf\\.com))$/","prefs":[],"schema":1579193594086,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609721","why":"This ad-don violates Mozilla's add-on policies by loading remote content into the new tab page.","name":"FromDocToPDF"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ebca1ceb-555d-4ce0-8c06-5b1475f08d45","last_modified":1579250265714},{"guid":"/^((\\{61e9b862-ef9b-4cc1-9dc2-ec00e437118c\\})|(\\{29828604-0f21-4ce2-8df7-b840aa53d713\\})|(\\{9430316a-f94c-40b6-9cea-8ac0df5c6638\\})|(\\{87ad96b4-86e8-4d94-aee1-7b607d02effb\\})|(\\{26f61847-2e07-4b10-a030-267eea1bf3b7\\})|(\\{450eb888-9bba-4de7-8821-4bb806ff82bc\\}))$/","prefs":[],"schema":1579193819569,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609365","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7e5aad13-e8ee-43bc-91fc-4805c8195f3e","last_modified":1579250265710},{"guid":"{f6766565-1c5d-4eff-bda7-20f00aaedd11}","prefs":[],"schema":1579101106448,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609550","why":"This add-on violates our policies by attempting to install other malware","name":"Fake Youtube Downloader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"21b59bc5-57db-4f31-9e18-614c03858e5c","last_modified":1579191500334},{"guid":"/^((\\{15ebdf9b-c3d7-4aee-9568-b42a11a7b071\\})|(\\{a3d09db2-d3ac-4403-9bfa-878de450fbb4\\}))$/","prefs":[],"schema":1579039175200,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609265","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake anti-malware add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2e3a3e97-c35a-4ec8-abce-a95c17d96f27","last_modified":1579039687654},{"guid":"/^((\\{976ef2b7-3bae-470e-84d9-3212d9200733\\})|(\\{d8fa8e34-e84c-4554-bfd7-16fd023b1c71\\})|(\\{d1ad5122-5caa-4986-a639-ce19bd1bc582\\})|(\\{599fb5a5-a334-4547-8a42-afccc1ddb347\\})|(\\{4bff9999-2ede-4b60-8572-a2915411abbf\\})|(\\{3a9a4c90-d87d-48e9-a799-072a7aa5be64\\})|(\\{822d29f8-9376-4da8-a7a0-4fa2eb5964c7\\})|(\\{c4926e5b-5b37-4781-87a2-28ce0b522d6b\\})|(\\{e36ea66b-30c3-481c-9e00-057b364c1c4a\\}))$/","prefs":[],"schema":1578927737593,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608886","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"361f3333-3cdf-43cd-b99e-78b666ec33ae","last_modified":1579039174816},{"guid":"{b7037d81-2c5c-4747-99e4-f4fc1c888b85}","prefs":[],"schema":1578938241613,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608887","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"RoliTrade"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bd9c30ab-d112-4f58-be0d-0e213350b6e7","last_modified":1579039174813},{"guid":"{5cc1b399-c98f-483e-9799-be29c6627246}","prefs":[],"schema":1578656865603,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608432","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Rolimons Plus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"05061ed7-378d-45a0-b105-3216c256b486","last_modified":1578927737176},{"guid":"/^((hddenobdjekcmnkgfpkodhohcjghiijm@chrome-store-foxified-1800284493)|(\\{90e41842-755d-40e0-9136-8129dd44a65c\\})|(\\{edf47ed5-7efe-4725-85d9-5e7a30d42998\\}))$/","prefs":[],"schema":1578665901864,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608433","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6975177c-1dc8-4fad-94f0-7a43ed397977","last_modified":1578927737173},{"guid":"/^((\\{3acb1e80-e126-4024-840f-3297659f9448\\})|(\\{44e3f210-6036-4364-90b9-3e8bb6fb3d98\\})|(\\{51e7e0fa-69e1-43f8-9578-d8372c2885b7\\})|(\\{1c2393b0-f2f7-497d-a34e-399dc6002d26\\})|(\\{a6a02c49-fafc-45d0-bb60-9f940a64c99a\\})|(\\{02a0090d-026a-4d02-a530-1b4d96e80c14\\})|(\\{9a988579-6773-48c2-91ab-8e917b20ab90\\})|(\\{22dfee7d-aa7c-4765-95e6-e81513cc7d37\\})|(\\{8c6d03f8-db65-4d5c-8431-ff66365847c4\\})|(\\{168b7acd-43d3-46d5-b76a-de3139dd9570\\})|(\\{abc95bbf-2548-4bf3-a0b9-9cb028496277\\})|(\\{d1282b8a-c467-4b02-9c11-e63e614ee8a8\\})|(\\{338422e6-bcf6-4171-9541-1c0f8c3dc3db\\})|(\\{10d5b345-535a-472b-8e8f-4f1a1cec9f2b\\})|(\\{64813672-8b55-4ac3-8dd2-c1da80132b77\\})|(\\{00e7df6e-7a0f-44d1-9fc1-0ddbdb473f4e\\})|(\\{564c2b95-b70b-4243-84dd-21fead791642\\})|(\\{71deda20-495f-4061-9c90-f46d1f7dfedd\\})|(\\{054d7610-9edb-47a7-af57-aed4be023015\\})|(\\{2b3f6877-99b0-4d35-8b85-9f75dd53ac92\\})|(\\{299f2568-3330-4466-8b47-4240643f8200\\})|(\\{077ead0f-8e84-4d6e-8fb1-a22126f9bf4f\\})|(\\{8ae52853-efd8-4d3d-b8f4-f70b048a389c\\})|(\\{36321783-e1c3-4f95-859a-d1c88eb75327\\})|(\\{7f878add-6b95-4b57-ab16-d8688819373a\\})|(\\{10148e15-b7f7-43bd-89c0-01957aad8188\\})|(\\{65e3540e-c3d9-4831-9dbf-598f2ef38d7f\\})|(\\{6fe77565-de36-4d06-ae30-59e3c98fc974\\})|(\\{7c79599d-ddde-4f62-9561-3c7aaea788a6\\})|(\\{d2fb1b99-98c4-48ea-ac43-8d729a1a8963\\})|(\\{38387674-fcc2-4292-a20b-08931ea0936e\\})|(\\{f00678a9-4b60-4a24-bdb0-4ce6c960cd28\\})|(\\{15d08bce-4f8a-451f-bdb5-5d1f720dde7d\\})|(\\{3a1da641-0fcc-4c06-b4b9-21d8d5dd3720\\})|(\\{6b7a8c7d-3956-4ac3-8c98-423a0bed1d75\\})|(\\{28f786b3-64a1-4152-9629-efabdede0b4c\\})|(\\{b1535617-e25a-48fe-b47d-c57affc65d5a\\})|(\\{255f303c-d5ce-47af-a925-1ad2c84c710f\\})|(\\{0ab25c60-4750-45f1-85f2-913440d6c6fc\\})|(\\{6cf0ef3e-d911-44c0-8b58-7abcb99d0243\\})|(\\{991c3933-0b3b-49f5-b3a3-1a60bf62f269\\})|(\\{bc5e31d7-42da-49c2-9624-1b4d5707b5ec\\})|(\\{8d8320f0-df3c-48f1-8839-f6969cbd3c17\\})|(\\{35f35aaa-506e-41d4-8468-3c4f4a56b434\\})|(\\{f1f6e2bb-32d1-4d79-8e5a-659e5af15b78\\})|(\\{1109f231-559f-44dd-bd84-85fac05f845b\\})|(\\{b6111372-b58f-4130-a6ae-a1445a196d85\\})|(\\{b21099c0-e496-443b-8d43-610a9aae60fb\\})|(\\{d8a40da5-bbca-417e-9ea5-e77332739366\\})|(\\{5dcaea9a-e152-4667-a4d5-b29f5afe9e61\\})|(\\{98b95d2a-1de8-4234-a73f-568531785850\\})|(\\{b11ad72d-2f64-4494-9f5e-6ad2e36bfc16\\})|(\\{3503a09e-76e5-4fba-8d65-d8bbb198b2c1\\})|(\\{f45fac5e-f3b0-4932-8c8b-254c6dcd3219\\})|(\\{4210d4ec-9e2a-40d1-83de-53a9728c01d5\\})|(\\{10691e9c-7399-4fb2-b824-256ed6c8c08e\\})|(\\{148338c2-ee0d-4659-baed-5b9aca28407f\\})|(\\{f3a2a32b-ec49-4fc5-bb46-f00f86d4cbff\\})|(\\{425bd894-b282-4a58-a2d0-3054fe3fd856\\})|(\\{7ccc3a62-7f92-4a1e-8e32-af734721a136\\})|(\\{91c939ae-00db-400d-a814-a964dc85fcf8\\})|(\\{83fdf43f-c064-4ae0-ac5f-6668fca576b0\\})|(\\{824f975f-a740-47d5-b4c8-0868fdcb154f\\})|(\\{2404f236-28ae-4852-b50d-50e66312f69f\\})|(\\{3f307709-bdf8-4dc5-afd7-4aaeb2a85176\\})|(\\{24f3c174-f09b-41fe-8c26-dfc051b2f352\\})|(\\{ecb81864-05bd-45f9-a1a3-5f56ad62c1c0\\})|(\\{fecad0e5-5f8c-4539-8893-9a4c9e4ab567\\})|(\\{03badfb9-bba5-4a3b-ae1e-0bde1bef38f3\\})|(\\{1f2defb6-af80-4822-b1d2-816c0575dd8b\\})|(\\{195450ff-844e-4ec7-b111-166c28e54b6b\\})|(\\{abd20b0f-3f79-4cdd-b2f7-6ed4f9a3e546\\})|(\\{b1a2d328-e1bc-46b5-b6d3-d4c5366a6262\\})|(\\{49d113aa-c37c-4a49-b73e-69eaaaec519d\\})|(\\{f9fe81b9-29be-4e30-ba7e-821e96b74c00\\})|(\\{c47a57e5-9486-4b58-b4e9-2e49e02c39df\\})|(\\{48aecb91-709c-4660-b0f8-681c177628bb\\})|(\\{0033af2c-0017-4237-821d-24e1ce20ed20\\})|(\\{d95d2ab6-2728-4d89-b4f2-74fc3abcfe26\\})|(\\{813bec70-cac2-497b-9117-8873b5e33cbc\\})|(\\{b613e7fc-3274-4874-b59c-b2afaaba60b5\\})|(\\{f88e19b5-9434-455a-a2bf-de13250a642b\\})|(\\{562fec92-ba72-4461-a73b-48b0cc87c943\\})|(\\{c8d2d52a-5617-420e-9568-983c0c7a6982\\})|(\\{7e32bebe-f9ef-4328-a4f8-7a86afdb9568\\})|(\\{b95fa449-7f1d-44dd-84c7-65565334d1e1\\})|(\\{788d6386-606f-45fb-83a6-af4956d9aa11\\})|(\\{00a646ad-3d34-4ca9-9633-9ea96be7a225\\})|(\\{a745c5df-b386-4906-80ba-ec9b6aa6b37a\\})|(\\{a3b508d5-864d-43c5-a4ec-9d5523cd01a6\\})|(\\{4e945e2a-b553-45e6-8dcb-495c60a663a0\\})|(\\{1a6ea1a0-1a2a-4a57-91c8-07cb629588ce\\})|(\\{20ef853f-2c16-496c-bcd2-5109a7a1be59\\})|(\\{cb5604d4-d166-4060-978e-1c7ddfda4a94\\})|(\\{9207a89d-db88-4ef1-bf2e-a89c12d882fa\\})|(\\{f561afa7-165c-45c5-beef-754e16b40794\\})|(\\{09021ead-28e3-415a-8f9d-ed250954147c\\})|(\\{1d6ef53c-0407-4eb6-aa80-b672788f9d0a\\}))$/","prefs":[],"schema":1578858092043,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608815","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"2Ring"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1491ea56-7723-431d-be05-5808a3101bf5","last_modified":1578927737169},{"guid":"/^((\\{2b046d1e-b392-4073-ad8d-bb882b073be0\\})|(\\{69a8db6c-b55c-4560-bfa7-edf21ed9f265\\})|(\\{d41d46ca-a557-48df-a951-e968a1168137\\})|(\\{845d89e8-e3c0-4447-ad36-9fcba4d3d28c\\})|(\\{da572bae-f959-4f9d-aade-afda00b83e2b\\})|(\\{fe334432-8ba6-4444-8cf9-1bb59c308aa0\\})|(\\{b8242421-8cd0-4064-a6e8-bbfdd62d67fa\\})|(\\{7d863da3-4f8f-4b2c-87cf-5bc7a03b24c8\\})|(\\{fc53c14b-9bdf-4a0b-9f07-421109bcab31\\})|(\\{7771103f-bf4a-4757-b679-2ec30eae8cfb\\})|(\\{66196147-9b28-4050-a46c-c9bf668511d2\\})|(\\{a41db617-17b7-429d-b135-5fd5d54b9ad6\\})|(\\{aa0e1b27-728c-4e45-9b7e-7731e8d6451f\\})|(\\{6e12cb13-d166-47e9-b1a6-ce980e1489bb\\})|(\\{3b3e3db5-2710-4bfd-bce8-bf3a1b5e0bc0\\})|(\\{3e4763fc-2175-4a69-9854-f437774da824\\})|(\\{63708597-3f14-494c-981c-bbecb10fddcc\\})|(\\{ec2c5f61-37e6-49dd-a430-6f0060f6e152\\})|(\\{8eb7ade7-96d3-4be9-b20e-f321fe07c9ec\\})|(\\{b9b60c96-b158-495b-87ab-db97fe2aecac\\})|(\\{5d885234-3fff-4c81-bfe0-7e01ca9701f1\\})|(\\{79cb8cb6-a0fe-434f-a6d6-2af167fbb069\\})|(\\{ec41b4cb-5c60-471f-a68a-d52e91f54292\\})|(\\{fc64c6fc-4356-42e4-8253-75facb478836\\})|(\\{d68b6b30-81e6-450b-aa7d-b0e3f1b11e2e\\})|(\\{6E01B689-3E52-44B7-A33A-197C48498C0D\\})|(\\{D4EE626F-0BE2-4CE3-B635-11498D2EAF24\\})|(\\{bea54a21-f8e6-4a47-a739-84aa5a03a391\\})|(\\{57FE0157-8BDB-4C11-BCD6-6654E0C1AE3D\\})|(\\{8B8E2B7E-7DBE-4EDD-ADA1-8AA93098E3F3\\})|(\\{66c281ce-2682-4182-91da-6d3742ce9a9a\\}))$/","prefs":[],"schema":1578922331209,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608815","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"2Ring"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d8ef0aae-2659-4076-be2a-ef0cf0388c49","last_modified":1578927737166},{"guid":"/^((\\{d26e41d8-8dfa-4a08-ad90-6df0240c8290\\})|(\\{9ee44d55-47d9-45bb-b56c-79ab2fecd93e\\}))$/","prefs":[],"schema":1578582285426,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608291","why":"This add-on violates Mozilla's add-on policies by executing remote code and/or collecting user data without disclosure or consent.","name":"Converto Wiz Ads Search & PDF Converter HD Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0c502c85-3f2d-4a3b-9abf-249eff0968f0","last_modified":1578656865193},{"guid":"/^((browser-safety@browser-safety\\.org)|(facebook-bookmark-manager@fbtools\\.io)|(facebook-video-downloader@fbtools\\.io)|(extensiondist@browser-safety\\.org)|(selfdestroyingcookies@dirtylittlehelpers\\.com)|(googlenotrackpro@dirtylittlehelpers\\.com)|(youtubemp3@yttools\\.io)|(youtubeadblockerpro@yttools\\.io)|(videodownloaderpro@dirtylittlehelpers\\.com)|(simplysearchpro@dirtylittlehelpers\\.com))$/","prefs":[],"schema":1578653962604,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608387","why":"This add-on has been blocked by Mozilla.","name":"Several add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6368943f-3d77-491c-82bc-f29591e170d6","last_modified":1578656865190},{"guid":"/^((\\{1c1a344c-b8d3-4783-ac5b-9a9d241c29b6\\})|(\\{a4fccc0e-a372-4127-983e-c0f607427a89\\})|(\\{275f2631-9a1b-4ab3-8c6a-4529ecd8512b\\})|(\\{0b1104bc-8ec5-437e-9d81-2cc641cbe8c6\\})|(\\{4e373c31-1942-4c9d-93b3-38b0ad701f27\\})|(\\{7f1af5f0-b450-44f2-aa5f-bc4c793553db\\})|(\\{68c84054-b43a-4a78-bb35-27ec06974d1d\\})|(\\{f959a2e9-f211-424b-b0cd-ea7ecf269753\\})|(\\{fef99996-e542-45b6-b383-86132e67a93f\\})|(\\{c1bd56b2-4b48-4366-8d04-16a0f69f7b4b\\})|(\\{17456fc3-4777-484a-b177-9b82752a738e\\})|(\\{9c746226-1a87-49e2-a083-725c5fc10885\\})|(\\{3056ec65-736e-4a77-abf7-9d0b44ba0b74\\})|(support@seovpn\\.net)|(\\{fbb6a675-8923-40da-86cc-a547eae63594\\})|(\\{bf9abe9d-4589-41f2-acd4-e5dd9d4a4595\\})|(\\{d012bf08-e9b1-43a2-b6b4-b60c0fdd6fb7\\})|(\\{0cc696dc-6214-406f-8831-1d0ae14c2eed\\})|(\\{39ef127b-a7c5-4cf6-8383-333ce2300707\\})|(\\{77af48b1-2786-430a-a2f8-f0e666ecdb86\\})|(\\{9807c7c0-0d7b-4ee9-b39e-4a2b10f74b74\\})|(\\{21ceb717-4e26-4843-9229-b0a55c629c6b\\})|(\\{ba87282f-fb6a-464b-b2b4-18ab718a6b9e\\})|(\\{f844e48e-929c-4dc7-8224-c829b67d453f\\})|(\\{2af80abc-e031-42c6-b800-02dd4dade3bc\\})|(\\{849583eb-dd9d-424e-af82-d64205b79bb2\\})|(\\{8d8963e3-810b-4e72-85d9-d6e8affbe8e1\\})|(\\{aa385b5c-14b4-4d2a-ad81-db3cd054efe6\\})|(\\{c30a6fea-44b9-4f3e-945a-401485d7e152\\})|(\\{327735cb-5842-4296-a8c9-660118c9dbe8\\})|(\\{2809097a-41e3-468b-9c33-2ce449bc18f9\\})|(\\{91b36c25-1dd4-4a1c-a722-a1868deed9a1\\})|(\\{3b61770f-a22e-4704-be5b-310a729e6652\\})|(\\{b1741149-382d-447a-b8fe-bd2dbf03b252\\})|(\\{8a5d399d-3716-4627-ad97-750cd10783e6\\})|(\\{a1bb458d-6a71-4efb-a032-04f44f638a0d\\})|(\\{8a86326c-5b59-4c87-af77-becea91bdc7f\\})|(\\{21b022a6-b739-4787-a071-268f45bd4f0f\\})|(\\{59e225c1-5a78-40b4-bb6a-9cd783eea9fd\\})|(\\{d0ba8c04-3d8d-4c87-8eec-355d3c1dbc57\\})|(\\{d0b408ae-c1b4-45b1-8d0f-5a9135dab115\\})|(\\{c802afcc-8fb2-410c-a50b-0dfc4e502364\\})|(\\{8ef92c49-fe9b-4354-b943-8fbce6156ab5\\})|(\\{40d41864-a14a-45e9-bc75-ff95189975cc\\})|(\\{b5f5f423-85e5-4641-8517-2549ef2597ff\\})|(\\{bd4e3180-94a8-4d2a-9186-b15ccbca2abb\\})|(\\{1099ff05-78d0-4a0f-a348-0e60d8e627f3\\})|(\\{9d7450f3-9f39-4dda-820b-ac50797229a5\\})|(\\{9762a546-d483-4d82-9e97-e8293b67ab3b\\})|(\\{233e675a-f2e9-494e-a62a-56a8e75440d1\\})|(\\{44b31737-7370-41ad-9a16-7e92f993d651\\})|(\\{5e8c48e7-43a3-4f5c-8f61-018e994ed581\\})|(\\{cabb5a82-b018-40eb-b551-08b7c6b28d25\\})|(\\{19c2d564-4774-4b52-b175-0d9a674a1ee7\\})|(\\{4d6bc7a3-8d17-44d9-a1c9-34b6c72d2a82\\})|(lin\\.Vin@userx\\.com)|(\\{a74a99d0-f5ac-4775-8af5-ad48341865de\\})|(\\{b8331308-eaa2-40ca-94e3-d5184b9555ab\\})|(\\{43a11cab-4d48-468d-88ac-6632c2b90f0a\\})|(\\{13fde54f-87aa-4966-801b-189946617b03\\})|(\\{051e900e-73a7-42e9-bf92-54a05b592814\\})|(\\{389a79d4-7af9-4c22-8e3f-0a424a9d16a6\\})|(\\{d80ce712-fad0-470f-bb42-7f0f5d10ac66\\})|(\\{b08e2ddf-304e-4336-b7b8-15698239be1a\\})|(\\{5bdae4dc-1859-4766-97c6-5d4b7d5ccb68\\})|(\\{a8b80325-5125-4d50-95b8-e3548eca99f9\\})|(\\{16f5bfef-6792-48da-9458-c15a904a3202\\})|(\\{821251e6-48aa-4eee-aca2-d2003047eba7\\})|(\\{e4d3e60e-2980-4899-aaa5-aa2c8571e8af\\})|(\\{00bde975-f669-4fef-aca4-de3335e5e629\\})|(\\{815e064e-df14-440a-a9c7-6191d47f302d\\})|(\\{12267241-c4e5-49b7-afc0-1ba02cd86146\\})|(\\{1461d5d5-0180-4e5c-870c-1648fd13eb3d\\})|(\\{09f52a46-5e5e-4bb7-92e4-5a802ba2dc65\\})|(\\{89fd7bd0-b6cf-49cb-981d-6eaa3515e09e\\})|(\\{309cf23f-2ca7-4308-9c31-03ef0cf0e8df\\})|(\\{604184f4-c000-4071-8b27-ae7c191dd575\\})|(\\{45c9a869-b55f-4792-aefd-e353229b48f1\\})|(\\{1b7f62a2-5dfb-4a7c-8613-a2333ae83337\\})|(\\{6e7e98a6-d7e7-4319-92bf-283cdcbf06b0\\})|(\\{2e60f9f6-f57f-46e5-9876-b50f84154a04\\})|(ali_nasiri@mefa\\.com)|(\\{d7909c43-9b01-44e8-aec2-d569a3461183\\})|(\\{d64d110d-2783-4663-b533-036338b0fabc\\})|(\\{8c5a0a9e-480c-4571-acb3-602cb081f9b9\\})|(\\{1efb16f1-34cb-4179-b27b-301f1a8d023a\\})|(ali@mefa\\.com)|(nasiri@mefa\\.com)|(nasiri_ali@mefa\\.com)|(\\{de57334f-24fb-4b0d-9087-d2945212ba76\\})|(\\{e45a208c-582f-4549-8c39-3e3b6c3f503d\\})|(\\{7cf37c0c-5cf2-4945-8c82-ffd5a1206abb\\})|(\\{aea2f3bb-b278-4ab3-a2b1-370b74a2795d\\})|(\\{c0d80342-fa84-4366-90d5-0d2c965a6c71\\})|(\\{e7953669-b2cb-49bf-8f53-9b2cedbe4df7\\})|(\\{0f5248f4-bb0b-41ee-9162-397ac92538c8\\})|(\\{f2a73021-b834-410c-95c9-6e9e826c5523\\})|(\\{ac9759e0-3657-40c0-8da8-aa83b2df14e1\\})|(\\{AABB3453-4EAC-421A-34FA-4789107489AE\\})|(\\{e471c14f-775a-474c-afde-e2562f35a1ee\\})|(\\{8a420af6-7de8-4d13-bc74-1b90e3a7c45e\\}))$/","prefs":[],"schema":1578325482610,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1607277","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"87a59976-a41c-48e0-a05f-b00ceddc3990","last_modified":1578409770946},{"guid":"/^((\\{29e8ec68-5717-4d25-8465-c8ad11c2493e\\})|(\\{1807ab11-ce49-47e8-b29f-2c7f3b27957c\\})|(\\{d497ce7b-9308-4a00-81c8-f1e20769d9f4\\})|(\\{3e2a7fe2-d800-4300-adbc-85d45101ccbb\\})|(\\{41a6db99-eb5a-436f-add8-6655030cd3c4\\})|(\\{d0041bb0-914b-4105-8335-f19dfe4000c5\\})|(\\{16c0318f-441f-4996-9420-9582cd8dc4a8\\})|(\\{11560f98-1a72-428e-901d-19eee028703d\\})|(\\{200fc207-8d2d-491f-a14d-898c2af6005c\\})|(\\{6098201e-19fe-4930-8235-507abc271c92\\})|(\\{47247604-b3df-42ef-a7d6-e6f54f3ed34d\\})|(\\{d9e45250-0a78-4fad-bda9-435289e1117d\\})|(\\{7897756a-f527-42fc-8327-23afa5a73037\\})|(\\{ebb45fe8-b626-4d4a-9b51-4c61be7d8ec8\\})|(\\{17a3a525-b5e9-4bdf-9f2f-0a6b82489261\\})|(\\{7d5e14ab-7973-45ee-9b5e-fb2af9105a58\\})|(\\{3db27392-c030-4b1d-a461-df246030e8ed\\})|(\\{687dbc1c-4640-420e-b5e0-69ffbff851a4\\})|(\\{99f71699-61a0-407e-9a1e-4f7f2b24032e\\})|(\\{9608a917-807d-426d-8b3d-4bd8e6669d3c\\})|(\\{6d0d1145-1b99-4c1b-9112-a0698ce1ad93\\})|(\\{02373fa8-bfe0-4f6d-bf65-cf843ae16ca9\\})|(\\{76e05242-0ea0-47dc-99ab-85a5768d24ee\\})|(\\{b2671579-9ae7-4e10-9aad-e484189f2599\\})|(\\{f8574a50-a306-455d-96b3-9a95590e3351\\})|(\\{d2a79680-fab2-40d5-93c7-3842a3c7a170\\})|(\\{6d3d4ff6-42b4-4ae6-8273-e55309e194ef\\})|(\\{e26d666b-5437-4b51-9a35-6a32ef2ebc93\\})|(\\{1d1e0112-694e-499e-9a6f-fd4fdd8a0400\\})|(\\{8fef18c6-29cc-44db-a373-2476eaa98d07\\})|(\\{bca08103-f769-42c1-9e83-c3dac1d073e5\\})|(\\{9be3ea2f-3def-4ace-a4ca-a36bd350ebe3\\})|(\\{e4a7d768-fe07-4b2d-8722-782ecd2d857d\\})|(\\{ed0bae9a-6c29-4615-b7b0-8134008f866d\\})|(\\{6a230256-13ad-4912-88fb-35dfe6fc8405\\})|(\\{f33c98b2-f1fb-4e82-a472-b27aa763b697\\})|(\\{692d8158-fc1a-43b9-901c-9211c5f00129\\})|(\\{f43b5702-0a0d-4f50-a012-a9fa25d19ac4\\})|(\\{e5d75e88-cd31-492b-a63c-ab6759658d4f\\})|(\\{706dac82-d1ce-43b6-81fd-77652fad15a9\\})|(\\{8c403e0e-104d-46ec-8355-5b7d57d35e6b\\})|(\\{c5a32b03-4044-4085-91d8-af1d688c0c66\\})|(\\{76e7835b-8600-473e-870f-aa1e9ac922de\\})|(amz@userx\\.com)|(\\{d2b50060-69cd-422b-bc5a-77590580adfa\\})|(\\{e9d1c5e0-e297-439d-a536-efd94b0baa06\\})|(\\{80816d1d-664a-4710-915a-99c298970b38\\})|(\\{3cf55a2e-ab5b-4a2a-8b5a-0760f46ffcc1\\})|(\\{be762a22-7fcf-4c67-a8e4-7f2b085a9f50\\})|(\\{2df2d33c-e1fb-4eeb-b276-a84bd3338e0f\\})|(\\{133ce0f4-83f3-4fec-b672-0067748ccf1f\\})|(\\{b575f7f6-5afe-40f8-8bb3-92c0ca24371f\\})|(\\{d514a041-1260-4512-9759-55c30b63bc20\\})|(\\{4129ed8c-e3ad-4e88-832e-66314cf44268\\})|(\\{9e97ac90-9eb9-429f-99f5-d61f60052068\\})|(\\{3366bcb1-8b0d-4451-9c1b-cf8aeb8e5df0\\})|(\\{3d06b84f-0b8b-4a7b-9a55-22c226c85a55\\})|(\\{e2f8e0bc-62bf-40f4-9dcd-3379a64db2bf\\})|(\\{3e998c2a-c05c-4445-9567-7a1948077970\\})|(\\{51cefcff-f7a1-4c57-b6bc-bad9fc9f275d\\})|(\\{84d6d305-ccc0-4879-b80f-708318ebcaa6\\})|(\\{05a2137a-9dde-476d-a63e-d80400d6bf36\\})|(\\{c2627d22-c3cc-4c5a-a69a-eca6cfe9ac90\\})|(\\{3cfe4756-4994-4c92-a97b-adc57243a277\\})|(\\{5a05e509-59a9-4358-b994-a062d97a7d0f\\})|(\\{791bc86d-dae4-45d5-957c-fe56843770f3\\})|(\\{8976df61-4480-4d4d-bfd1-2e9d0635eaa8\\})|(\\{f4ee4889-fed0-4598-a8b2-c3e224250d82\\})|(\\{e26b2735-47b6-4239-a3d2-0e4ca4293076\\})|(\\{ae9589dd-3141-47d1-9449-8e719044ff92\\})|(\\{ff18147b-3853-4938-b15f-241d99f4e590\\})|(\\{758126c6-d156-4eed-8870-477eefb17281\\})|(ella@fmt-tools\\.com)|(\\{e4df007c-60db-418b-97f3-d7896c441515\\})|(\\{90e41842-755d-40e0-9136-8129df55a65c\\})|(\\{faeee13b-39fb-49dd-82c5-47604a2e2e9a\\})|(\\{c3583bcf-271e-4b41-8207-32bd3db491a0\\})|(\\{cbe6f8d9-bd60-4f27-acd1-388a976e3749\\})|(\\{18be83e0-4bc9-469a-bde5-cc671acb022b\\})|(\\{97152370-246f-4059-999d-92f26f358e71\\})|(\\{8a975636-e12e-4532-ad35-9d9e691a246d\\})|(\\{3eb5ea84-a445-4dab-8074-d29dbf4e66f0\\})|(\\{f19cf85e-47ea-446b-808d-38f4010594b3\\})|(\\{b28a1358-5cdc-442e-b851-613bdf118320\\})|(\\{90f0ad05-0267-4ea6-9809-1098ec724905\\})|(\\{d18372a9-89d9-4799-87f1-ccd4cfac80d4\\})|(\\{d18372a9-89d9-4799-87f1-ccd4cfac80d5\\})|(\\{4625fcb8-6b60-49e7-9447-31cb1e2a2d59\\})|(\\{7dc2d526-d11b-4e6f-9301-a4bc620f5838\\})|(\\{d763ea47-6889-4e23-9b6c-ac56087c96a7\\})|(\\{3c7f00c4-4e4a-411b-960a-4ce782ece6c9\\})|(\\{8c1db2e7-c550-4d76-8009-ad9fca9c0813\\})|(\\{0b23f4db-0f49-44b7-9d27-b424ba9f6d62\\})|(\\{d798f753-a0e4-4d8b-866b-3b817b7b6d25\\})|(\\{e3d7ec01-ada7-4330-899b-bce60c64471b\\})|(\\{3a210e15-601e-4204-8690-cb05ed14019d\\})|(\\{51226db3-500d-45d1-bbc3-a9bf560caf39\\})|(\\{0aa6f915-ed71-4de8-aaeb-63f799d83af7\\})|(\\{3d46809c-6c20-469c-a608-3ece3121da4a\\}))$/","prefs":[],"schema":1578335483666,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1607277","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0bb0f9b4-6807-4642-9199-026411426eb2","last_modified":1578409770942},{"guid":"/^((\\{af51d321-202e-49af-9a3c-78a5ebb22b63\\})|(\\{749b293a-1e19-494b-8a3a-cb79d5464226\\})|(\\{fbe6ff3f-2675-466a-916e-352080c27adb\\})|(\\{ad0378a7-5153-4e6d-999c-6c8e49868293\\})|(\\{2f7de182-3427-4386-a880-c601050580ab\\})|(\\{99bad30d-3792-4a03-ab9d-8e88f5f1cccf\\})|(\\{475b8326-3218-492c-b4c3-32307053c21a\\})|(\\{18571b27-500b-4604-a4ea-e0e7d8b61ce6\\})|(\\{fad11a52-2f9a-4d89-b712-f61184d756e7\\})|(\\{113c9d19-e80a-4c72-9a23-58f7b08144cf\\})|(\\{a0b384d9-c275-4670-a4be-8b0be45d562e\\})|(\\{19bac525-be97-4470-b76a-c24168d5e6e8\\})|(\\{2a40afd4-e56b-425b-bff2-62f190d80fac\\})|(\\{cbc65b60-2350-4b7f-8c83-1b9182a56430\\})|(\\{6adb7178-1105-46e6-9a4d-1824385cef5d\\})|(\\{6d46665c-4708-495d-a929-096ea137a08d\\})|(\\{fd6273bc-3b55-4bf0-872c-146b3feb73f9\\})|(\\{707783a0-6669-4e1f-8036-53f5c936304b\\})|(\\{7086907a-f6fd-46f4-b51c-a7dd2b10509c\\})|(\\{0ed69e4f-6cec-4bfa-9004-076ebd0be34f\\})|(\\{d051ddb8-1de2-403c-84d2-afd96a3f4550\\})|(\\{52699f66-62fe-4970-83eb-5ad82bf72497\\})|(\\{6c32d68b-4866-4277-b454-d824a3a3209c\\})|(\\{d608864f-5573-47eb-a2d7-46d158ee3fa7\\})|(\\{38c59c7e-bc02-4e7f-89ea-c4d9555362c6\\})|(\\{981a212a-52b0-4413-976c-a4730f1df128\\})|(\\{06e004dc-40a8-4123-addc-c6b6eb5234c7\\})|(\\{c87d86f9-d5df-4a24-9fe0-dd39232e4d88\\})|(\\{86baf51d-21b6-456e-889b-c7d96ba2fd63\\})|(\\{db83a6c1-efb7-45a1-b074-8e3e5a53793e\\})|(\\{70c00ae0-5b15-4ee8-99f9-23d85c63c07e\\})|(\\{ff72e707-d6e2-446f-a760-6ff187f107c9\\})|(\\{6f65c53b-596f-4238-afa2-347150b3ada3\\})|(\\{95da423e-90ec-43d9-b5c8-e195bff7b432\\})|(\\{4a792129-a244-4a39-a416-ce4f7743918f\\})|(\\{d69204d4-610c-4144-9d26-8cf8b2ad6e16\\})|(\\{49242aa4-83ba-4e25-a827-4d1ec86972a8\\})|(\\{d69204d4-610c-4144-9d26-8cf8b2ad6e19\\})|(\\{3505b15c-533a-4c2e-9065-6d7b2381a7f9\\})|(\\{07daa733-944d-4b0b-9bce-01638b9d9b42\\})|(\\{ebb69cbc-b69f-4d3d-a676-83811a061baa\\})|(\\{f9327eb7-2532-4e45-a551-a9f8233e4ef7\\})|(\\{4fcb9938-6716-46ce-8107-73f3cc7b3900\\})|(\\{cee1ccee-5508-4927-a939-9a557e63bbc8\\})|(\\{c6973149-51bd-443a-898c-e4b26d4ee44b\\})|(@mouselessjj)|(\\{39772968-f7e5-4a84-87d2-adcd2d032c69\\})|(\\{3ba568f0-bb3a-4744-b64f-46c428f3bd99\\})|(benalio@gmail\\.com)|(\\{70c50468-54be-4d7c-b1b4-b7378d0ff45d\\})|(\\{f77c3471-806a-40d6-9fdc-7df832f7ae74\\})|(\\{cf660d66-4aac-461b-a05f-b71b62f549c6\\})|(\\{1c58ca6f-91ad-4423-b8bd-f5323df92eb3\\})|(\\{1a393581-d6ce-454f-a503-8a321ba0f022\\}))$/","prefs":[],"schema":1578339693692,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1607422","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"18cdf7c5-6650-46d5-a536-364ce9dcfa92","last_modified":1578409770937},{"guid":"/^((pro@affiliatebrowserguard\\.com)|(beta@affiliatebrowserguard\\.com))$/","prefs":[],"schema":1578394762485,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1607211","why":"This add-on violates Mozilla's add-on policies by redirecting requests without user consent or control.","name":"Affiliate Browser Guard"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c8aa2f43-2c48-4628-af4f-0987125d0441","last_modified":1578409770930},{"guid":"/^((@adultdownloader)|(\\{6391a084-dd1c-41b8-aefb-ce207da8bf21\\})|(\\{19e997bc-8449-4ab3-b4f2-f24db1053fa9\\})|(\\{e65a0802-7bbd-4c83-9bec-50ec16dadcdf\\})|(\\{6928cfc2-eda9-4971-8d8c-de26747c27ea\\})|(\\{93c15410-f7c9-41a7-a13d-28dba750f15e\\})|(\\{d7c369d6-74e2-4da7-8eef-dc134914facb\\})|(\\{e3109828-453d-4fc1-8019-488f891720d5\\})|(\\{d825dcfa-4340-4330-b4e7-b208439ee961\\})|(\\{8e7d2b8c-6167-496d-8e4c-45d9040a4a7a\\})|(\\{62935c48-c7bb-4a6c-a1b0-449fdc8737c0\\}))$/","prefs":[],"schema":1578166891954,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1605959","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c086bfd7-15ff-41eb-ac43-d84e95606eec","last_modified":1578325482223},{"guid":"/^((\\{943773bb-c8a8-4576-bf3a-7cacca534887\\})|(\\{0afab6d1-c267-4ff6-9289-4a2b2ad78f33\\})|(\\{4278c56e-7b67-43ab-8c87-f68a6a883df6\\})|(\\{f146cde8-6dcf-4ebf-9d67-b7eccc9bc8a6\\})|(\\{d0e43d96-0e73-48d7-9a60-b235022f4330\\})|(\\{a94ed9b8-24a6-4719-97af-08eaac91a42b\\})|(\\{d62ca114-0f4e-4d25-813e-292d0c682e05\\})|(\\{908b1c05-3766-45e1-b56b-f0b4457c6451\\})|(\\{068054b5-46c0-47c2-be37-dd015fb1c050\\})|(\\{1c1cde54-c8e9-4c61-a2be-30411888ac8a\\})|(\\{b06648df-3c80-49e8-9d9e-71741ba28c72\\})|(\\{a085da90-cc10-4c26-954e-ae4eb773c6d7\\})|(\\{1d53aa0d-eca3-4bb1-947c-aebfdd0770fd\\})|(\\{83ebd575-b66b-4b02-a628-d2764194d0a6\\})|(\\{fd5f7e74-2e60-454b-b702-05e9d66b334b\\})|(\\{fdd2f5a3-9061-4fc8-87d2-cf7f7668d336\\})|(\\{f890d432-ce0b-4857-b030-dc36fc791423\\})|(\\{d5b4e84c-7991-4be5-9c26-c3e92ba0901a\\})|(\\{8d54459a-34cb-461f-b1fe-2266484cc098\\})|(\\{67b21df3-a1da-48ee-aee8-18ae8ad7fe21\\})|(\\{18feff20-5892-43cd-8606-83e8e7c33ebd\\})|(\\{554e901f-5476-4fad-8714-a08b8249068b\\})|(\\{248c9c9f-404d-4284-bd12-2fa988edb0ad\\})|(\\{9c347568-2528-4dea-8a0d-6e9fa7f88512\\})|(\\{0447e445-abb9-450b-b12c-de16fa40e176\\})|(\\{3015019d-1c2f-4310-adf1-1b33c4566d9e\\})|(\\{a3aca1ed-74b4-46d4-9c73-ca9ba8c91ac6\\})|(\\{7b2aabfa-673f-4afb-9cba-7a9329a24d79\\}))$/","prefs":[],"schema":1578083875760,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1606925","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"New Tab add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"de533f3a-d0e3-4704-916e-fd2a297cee93","last_modified":1578084466436},{"guid":"/^((\\{a91c41b7-4196-4867-84b4-d417a1b10da2\\})|(\\{e3d3ea5c-c8c0-4c9e-89c6-f6b5677186cc\\})|(\\{fa3b6777-4f64-476c-9ace-a79709ccd0a6\\})|(\\{6251b844-0c54-44bc-8c5e-891e3ba86c2e\\})|(\\{8e588566-afb2-4612-a420-3e3bd18693e7\\})|(\\{a0bf35ec-76cc-4d86-875b-09d46e8790c2\\})|(\\{fd257beb-d772-4333-9901-dc5913aee499\\})|(\\{a9acb248-93fb-4081-9d88-92468f229842\\})|(\\{7e1b62bc-3ab4-4c4d-8182-b095a492eab4\\}))$/","prefs":[],"schema":1577994095119,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1606132","why":"This add-on violates Mozilla's add-on policies by using obfuscated code and/or executing remote code.","name":"CodeScript and WorldScript"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3d3f2971-9764-4b6d-94ef-2a0b97da7619","last_modified":1578066343576},{"guid":"@mendeleyimporter","prefs":[],"schema":1576845976756,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600910","why":"The add-on does not comply with Mozilla's requests to provide reviewable source code and is suspected to violate Mozilla's add-on policies by collecting data without disclosure or consent.","name":"Mendeley Importer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e028ecb3-be1e-48fb-9681-9c04ff7fad3d","last_modified":1576881756956},{"guid":"s3firefox@translator","prefs":[],"schema":1576845555478,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1605007","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"S3.Translator \u2013 s3firefox@translator"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"31a14241-2af8-4ec8-b597-d5c3ebedc30c","last_modified":1576845976374},{"guid":"/^((\\{cee1ccee-5503-4927-a923-9a557e63bbc8\\})|(\\{8a84b40d-84a4-40d6-96de-c504a4fcd114\\}))$/","prefs":[],"schema":1576784492013,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1605289","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Adobe Flash Player"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d940ce81-7ac8-4741-9fc8-2699cb92d4ef","last_modified":1576845555097},{"guid":"/^((therill@mozilla\\.com)|(Updates@mozilla\\.com))$/","prefs":[],"schema":1576756361317,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1480591","why":"These add-ons violate the no-surprises and user-control policy.","name":"Search engine hijacking malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e235a161-aaa1-4afd-8e9b-61ab2aeaf82e","last_modified":1576771657205},{"guid":"/^((\\{5620c992-8683-4ce1-b19d-3633b4c28bd0\\})|(\\{cbc29a75-5858-4b7b-98e4-c813a4e6a085\\})|(\\{4cf619a8-2de2-41cb-bf23-dfa52e4e7d5a\\})|(\\{3b013e48-d683-45ed-8715-a6ece06f0753\\})|(\\{9834ff7f-e3ea-485a-b861-801a2e33f822\\}))$/","prefs":[],"schema":1576756618517,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554606","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Various remote script injection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7c324513-5792-495d-a389-d7527a0433b2","last_modified":1576771657202},{"guid":"/^((\\{ab70d6ee-9d0a-4349-919f-2e3c9aa77927\\})|(\\{fe94f94a-75ff-48a9-9cab-03e626e30352\\})|(\\{085590fa-c340-423d-9b45-d8e963349513\\})|(\\{c06005f4-a53f-4503-b631-9c6fbea45e9e\\})|(\\{a1904bba-73b5-4fab-8556-95fdf0200c19\\})|(\\{4548ed4c-964e-4a53-acec-b24f5b9ea6a6\\})|(\\{99d68c16-4f64-463a-ad09-470a5ac07981\\})|(\\{14338345-a844-4c6e-9fca-d200a93f1d9b\\})|(\\{2bc78397-6bd3-4a2f-a737-dbc639ee9940\\}))$/","prefs":[],"schema":1576756684025,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1565184","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Private Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"92cedc61-c6c7-485e-98b0-a03c71eb2c5a","last_modified":1576771657198},{"guid":"/^((application@uk-manulap\\.com)|(application@uk-misafou\\.com)|(application@uk-nedmaf\\.com)|(application@uk-optalme\\.com)|(application@uk-plifacil\\.com)|(application@uk-poulilax\\.com)|(application@uk-rastafroc\\.com)|(application@uk-ruflec\\.com)|(application@uk-sabrelpt\\.com)|(application@uk-sqadipt\\.com)|(application@uk-tetsop\\.com)|(application@uk-ustif\\.com)|(application@uk-vomesq\\.com)|(application@uk-vrinotd\\.com)|(application@us-estuky\\.com)|(application@us-lesgsyo\\.com)|(applicationY@search-lesgsyo\\.com)|(\\{88069ce6-2762-4e02-a994-004b48bd83c1\\}))$/","prefs":[],"schema":1576756765926,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1487627","why":"Add-ons whose main purpose is to track user browsing behavior.","name":"Abusive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"42d1f27b-9cbf-4a3e-a18a-5c4418c2f5b6","last_modified":1576771657195},{"guid":"/^((\\{d1b87087-09c5-4e58-b01d-a49d714da2a2\\})|(\\{d14adc78-36bf-4cf0-9679-439e8371d090\\})|(\\{d64c923e-8819-488c-947f-716473d381b2\\})|(\\{d734e7e3-1b8e-42a7-a9b3-11b16c362790\\})|(\\{d147e8c6-c36e-46b1-b567-63a492390f07\\})|(\\{db1a103d-d1bb-4224-a5e1-8d0ec37cff70\\})|(\\{dec15b3e-1d12-4442-930e-3364e206c3c2\\})|(\\{dfa4b2e3-9e07-45a4-a152-cde1e790511d\\})|(\\{dfcda377-b965-4622-a89b-1a243c1cbcaf\\})|(\\{e4c5d262-8ee4-47d3-b096-42b8b04f590d\\})|(\\{e82c0f73-e42c-41dd-a686-0eb4b65b411c\\})|(\\{e60616a9-9b50-49d8-b1e9-cecc10a8f927\\})|(\\{e517649a-ffd7-4b49-81e0-872431898712\\})|(\\{e771e094-3b67-4c33-8647-7b20c87c2183\\})|(\\{eff5951b-b6d4-48f5-94c3-1b0e178dcca5\\})|(\\{f26a8da3-8634-4086-872e-e589cbf03375\\})|(\\{f992ac88-79d3-4960-870e-92c342ed3491\\})|(\\{f4e4fc03-be50-4257-ae99-5cd0bd4ce6d5\\})|(\\{f73636fb-c322-40e1-82fb-e3d7d06d9606\\})|(\\{f5128739-78d5-4ad7-bac7-bd1af1cfb6d1\\})|(\\{fc11e7f0-1c31-4214-a88f-6497c27b6be9\\})|(\\{feedf4f8-08c1-451f-a717-f08233a64ec9\\}))$/","prefs":[],"schema":1576756852767,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1476369","why":"These add-ons contain unwanted features and try to prevent the user from uninstalling themselves.","name":"Smash/Upater (malware) and similar"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0896a86b-a211-4c64-968c-8671a21b2b5a","last_modified":1576771657191},{"guid":"/^((\\{2926cc6a-5f5d-4ef7-9cd0-0417408e8809\\})|(\\{569a3468-ebdc-4d95-84ef-0b6cbbcb2119\\})|(\\{6ef88cf3-c31c-4a9b-973b-765c21bc6f81\\})|(\\{a36b6921-0b70-4fad-b39b-786b23716b74\\})|(\\{fcc6a194-c627-4bf1-b185-e9611dc8d56d\\})|(\\{ddc71014-7997-421d-bb86-3b70b2ab24d5\\})|(\\{453638fc-e7f1-4a3d-acfb-724a0c750686\\})|(\\{0283d25d-25e6-4710-845f-b112fb264d3f\\})|(\\{071b1860-ff82-46d0-816c-a458382beaa7\\})|(\\{f0f6892f-6d0d-4146-9de5-21cc7eb3672a\\})|(\\{845c7444-bd97-4200-8144-c95ce77c07be\\})|(\\{8bc84806-edbd-4713-8a53-19a8c345fdfb\\})|(\\{959dfd6a-fbc5-49f0-8284-34e8606c7fd2\\})|(\\{9f90e1c8-a63e-43a9-8cd5-ad1d6fdf0f3a\\})|(\\{6b7cde7b-a79d-4012-b36c-86719ebcc308\\})|(\\{57f57692-7ef1-473a-adf7-7507e0e31c7d\\})|(\\{34bc568b-4243-4001-b528-118df3310667\\})|(\\{521e44f0-374e-466a-8829-2a98af75104b\\})|(\\{a4de65f7-33ae-4622-bb17-15053f0383f2\\})|(\\{f5ca8ea6-e854-4163-bc55-1a6f4086c1b2\\})|(\\{45765127-988a-4f3e-807d-f7784d76ecd0\\})|(\\{dc95db1e-68c5-44f4-a924-daac966373d2\\})|(\\{4119a8f1-508c-490d-87d4-203e93bbc5fb\\})|(\\{85997b97-ae1f-49e2-b42b-60f9c78c2d03\\})|(\\{a39c31c3-a57a-4c26-8454-267414494eed\\})|(\\{fa47c7ee-e855-41b0-9d3d-3c1d46d98a19\\})|(\\{6255931b-744a-49a2-bf6d-69ba35556760\\})|(\\{54112e17-779d-4275-9a04-81760931d356\\})|(\\{cea0dfab-286c-44c5-b41e-79d8ca5d097e\\})|(\\{fd6b2837-7828-4ad8-9bfe-361336aba33e\\})|(\\{0a56d404-ece2-441d-8d0b-e276ae1a07c2\\})|(\\{be54a202-b6e0-485d-b60b-f77f117ae602\\})|(\\{ff927da8-a634-4b4f-9010-2e76e3a6db2d\\})|(\\{a91f82ce-675b-4940-b58f-96095eb004af\\})|(\\{885c70f6-e286-433e-8f42-d7f319321d9d\\})|(\\{3e52fa7b-34c5-48e3-9cc2-3e33464db303\\})|(\\{ca94cd4e-3aec-41af-aa3c-1a8ddba9b9be\\})|(\\{0971aa7e-3a32-418a-acca-fdb5dacfca2f\\})|(\\{4d16cfea-bbe5-4254-b98b-70267cf2a2bc\\})|(\\{5cb20af8-1a98-43b0-9f09-0ee6d494ce65\\}))$/","prefs":[],"schema":1576756919670,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558136","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various fake Flash/Avast/etc clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c81cb302-2519-4997-84de-75aa01f2dee9","last_modified":1576771657188},{"guid":"/^((jabcajffpafebcdcaddoegpenicdipdk@chrome-store-foxified-1110252619)|(jpegcert@freeverify\\.org)|(kmrfree@yahoo\\.com)|(lets-kingw@empotrm\\.com)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-29039950)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-77744803)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-357866719)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-447115206)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-549146896)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-1084455972)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-1602969934)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-2271560562)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-2595595173)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-3103352300)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-3116340547)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-3959272483)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-4076222235)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-4090031097)|(media-certificates@auth0\\.io)|(mingle-cash-extension@minglecash\\.com)|(MiningBlocker@MiningBlockerAddOn\\.com)|(multimedia@certifications\\.us)|(nominer-block-coin-miners@tubedownload\\.org)|(open-in-idm@tubedownload\\.org)|(sabqo@yolla\\.net)|(search-by-image@addonsmash)|(selfdestructingcookies@addonsmash)|(streaming-certficate@mdn\\.org)|(swt@gobck\\.com)|(tabs-re-open@gtk\\.cc)|(user-agent-rewriter@a\\.org)|(vba@vba\\.com)|(verification@bexp\\.co)|(vidcert@certs\\.org)|(xplayer@gobck\\.com)|(youtube_download_express@free-downloader\\.online)|(youtube_downloader@downloaders\\.xyz)|(youtube_grabber@utubegrabber\\.co)|(youtube-lyrics-by-rob-w@awesome\\.addons)|(youtube-mp4-downloader@tubedownload\\.org)|(ytdownloader@ytdownloader\\.org)|(yttools\\.download@youtube\\.com))$/","prefs":[],"schema":1576757015029,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1525880","why":"Add-ons that include abusive or malicious remote code.","name":"Various abusive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eaa146be-e47f-4c20-bdbd-c8046a929100","last_modified":1576771657184},{"guid":"/^((\\{ed4c3ce2-5372-429c-ae20-fa5b1f540fd7\\})|(\\{cd11da28-330d-4f09-a21f-fae7509f1b60\\})|(\\{74bc7a66-d4e6-4f1c-a0ef-1b65baa41cbf\\})|(\\{8069effc-45bb-4caf-8b27-a135431cd6b9\\})|(\\{577fc233-25bf-4e43-a164-aa75eb9d053a\\})|(\\{f5626996-f5cd-4d00-bcea-20dda6d9edd6\\})|(\\{9bb810ef-716e-4dc5-9f03-491a2c59384e\\})|(\\{02634a24-04d0-439f-9faf-a323ab4a1bac\\})|(\\{b73f7a43-a43a-47f5-8b1f-1ef7caa7857d\\})|(\\{3b5bf07b-5964-408a-8e43-e0239219c524\\})|(\\{73d3a404-150f-4594-ac2c-24f9beec78b1\\})|(\\{ef6a2133-5ed9-4dbc-a735-6ffe8490062e\\})|(\\{76b61321-01a1-4a17-850f-b064a0366b57\\})|(\\{bc41ca18-9209-4500-a847-4e514fea2536\\})|(\\{32c4c845-9bd7-4b20-97fa-a7616e7802ef\\})|(\\{410d9002-b517-471f-956e-30129e307af3\\})|(\\{43366e90-e4be-4ba6-bec0-3fb149128480\\})|(\\{8ebc90a4-f7a1-420a-8380-f85545403f80\\})|(\\{6d3fa41f-e896-4f85-ba59-321f4b26f380\\})|(\\{05c811f2-f828-4d3e-ad02-7386373e9a28\\})|(\\{e10a0ee6-8083-42a7-bed1-35400b029bf2\\})|(\\{c925be5a-ae0e-4958-be36-44dc2e64d4f7\\})|(\\{3803ed37-c101-4b21-a678-762f51b7eabf\\})|(\\{08a15cc0-d6cb-43c5-9a40-27443554b455\\})|(\\{d0953283-5970-4ebe-b270-940c6befdbb7\\})|(\\{7c983689-80c7-46dd-b9d2-4d2db1cf94a6\\})|(\\{8f320a17-868c-43dc-94fb-9d1ab7f4fe73\\})|(\\{843b406a-9593-49bf-9365-684fe8cb2f5a\\})|(\\{42cd0cbd-248d-4a44-88b6-1a3680d159ac\\})|(\\{23efa05d-99b1-49e0-a67d-5378f2afc20d\\})|(\\{f91c606c-dd33-42a4-9219-824187730f59\\})|(\\{9e233d16-18ae-4519-a83c-2806f4fee321\\})|(\\{a93cdf30-75da-463b-865b-f49cc7fd2697\\})|(\\{dcacb62c-9096-482d-845d-10413199a89b\\})|(\\{9d5da26f-c366-46b2-b3e7-5c8e3e0b9788\\})|(\\{dd176d1f-8cd5-4b5b-8b06-839449e87b5e\\})|(\\{9ada3b66-4412-427d-8696-ac0fe0ac891e\\})|(\\{9695495e-cb65-4cd6-8a93-52c9e2b8d767\\})|(\\{e9d1a027-a84c-4e90-b602-66ffe22a0ad6\\})|(\\{f71bda5e-c591-44aa-8f84-2f04989f7e7a\\})|(\\{e6e67c6f-c010-406d-8575-1835341ec4cf\\})|(\\{22fbf524-38be-4ead-b6ce-e55cb23ed74b\\})|(\\{866dafe9-1c49-47d7-a46c-1cb50ca52461\\})|(\\{3479fadc-41b1-492e-bb16-d8f9e514d488\\})|(\\{8c02daf2-79ed-4650-89ca-1e099d28c5e7\\})|(\\{65e6b805-7f0c-455f-b1b4-c34621056b46\\})|(\\{78de7006-944c-4c18-a33a-d6931619f2b0\\})|(\\{16c8051b-2c16-4641-bf29-2daee7883fd0\\})|(\\{19263ccc-a97f-49f4-867a-b49351c42c0c\\})|(\\{bfe416d8-e8c3-469c-908e-6926770152f0\\})|(\\{a29a4a96-2fcd-48f8-bfe1-a1d1df46e73d\\})|(\\{2d651636-a0fa-45b7-a97e-ebc85959ff23\\})|(\\{ac8a3af8-e264-4a0b-b813-d7fab03ae3fe\\})|(\\{4719ad8b-354b-443d-b1e6-4d60b851c465\\})|(\\{7679a9f9-29d8-4979-86e7-a5b5cf0e2fd3\\})|(\\{099e1648-58e7-492e-8019-3418263b9265\\})|(\\{9a83d154-4ea3-45f9-ae21-28f3c1f86773\\})|(\\{475b88fd-574c-4881-98e0-0184a03593cb\\})|(\\{d7b586f8-a22d-4986-9dfb-67d49ba46a68\\})|(\\{50b79e30-a649-4477-8612-7085c0ee3ad4\\})|(\\{e9b2d453-9a98-41e4-9837-c0d68ff1aeac\\})|(\\{b1814ce5-0d9f-495f-b260-a7e1e5538263\\})|(\\{9b06d35e-2eb0-4653-886f-a3f4cdcbb754\\})|(\\{e7d6a360-69d4-4f8c-a96f-fd63388995b2\\})|(\\{68a50af6-ddad-4750-a9a7-a71c55e019b7\\})|(\\{8286a0e0-ba89-48b3-871b-8c9acff32023\\})|(\\{b3c79903-9bc5-4ddf-aeeb-7d91989ae819\\})|(\\{7c5cc4ec-9637-428c-bcf7-28bba279cf84\\})|(\\{93d460ee-879f-4d8f-8599-a1c69ed59ec2\\})|(\\{207c95d5-2bb9-4760-b3a4-8c58ea173bff\\})|(\\{b3482681-1abf-4dfa-bace-dc7b51e6a150\\})|(\\{d3516cf6-d531-434a-b80a-df72c7166744\\})|(\\{da01a2aa-0cbb-4f57-a395-2256d142c519\\}))$/","prefs":[],"schema":1576757089378,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549214","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"71f2c72f-b4d7-4ea9-bb8f-70d4d86eb184","last_modified":1576771657180},{"guid":"/^((\\{84a9ae69-5c01-4a73-80d3-c2201410d8c1\\})|(\\{852c68da-c573-42f8-85f8-9dcf57684f87\\})|(\\{85a31d9e-063f-421f-9d3f-649a393e94ec\\})|(\\{876778c8-5329-461d-882e-d4983ae6062a\\})|(\\{8913da4a-46fb-461c-9e60-3e257ef2c0e6\\})|(\\{8aa0118c-998e-40ac-84e9-12c936e5d70e\\})|(\\{8b4a6441-811f-4461-b136-7ebf3aebe3dc\\})|(\\{8bc41c3b-e052-4fd8-8de3-970ef5224bd9\\})|(\\{8e03b200-aad9-434b-9a99-e7aae7493a5f\\})|(\\{8fe94d0d-4746-401c-ad05-e0e1be97ea0e\\})|(\\{900f3c9c-b327-4608-950b-9765119c2e7a\\})|(\\{915080f5-97a3-4584-861f-70cd91f56474\\})|(\\{91d034a6-1765-4a59-85e5-9ddeb371ed9b\\})|(\\{9207dfae-06fc-4545-9fa6-6466b7ed2559\\})|(\\{926b2440-8443-4de3-9025-9a448cf3b838\\})|(\\{952bfd34-d195-4b10-8a3c-b103786cf090\\})|(\\{95315ff2-427b-427c-a433-236fb3b5eda4\\})|(\\{971db1e5-a5cb-46f9-91f9-9b687f4e5832\\})|(\\{982e11b3-e092-4713-81d4-5da1eadd278e\\})|(\\{98a2b9a7-13fa-49ff-aaa4-83786fad7862\\})|(\\{99f52d4d-1cd2-4e17-8f57-fa2493848f3f\\})|(\\{9a467b2c-be87-4d55-80d9-998dc6243e8b\\})|(\\{9abfecfa-d53e-4aea-bb6c-4fe47367f61e\\})|(\\{9b0243a5-92fb-43a4-adcc-3161f0ec030c\\})|(\\{9c7bb0bf-1534-4805-b9fa-a91004bd7e30\\})|(\\{a00e65f6-bf34-4ef9-a0e5-b63002c823e9\\})|(\\{a0dce648-f703-4867-9f3f-9bfa7601d1b1\\})|(\\{a16a700a-35ff-4ed1-ab81-164e3c823342\\})|(\\{a1f14b23-0c36-44e8-8f0d-9c732acbb550\\})|(\\{a4ea8038-65ae-4d7c-92e2-dd95caf007f4\\})|(\\{a55cd5be-89e4-40ba-8c3b-0023a1f41c8e\\})|(\\{a57ec9eb-cbab-4ddb-bafd-80cf5fd38891\\})|(\\{a5aa1d1e-dec7-4e25-bead-0861099f9628\\})|(\\{a604a85d-ba8f-4e8f-8ca1-867ca8d13a13\\})|(\\{a7a33aad-9e17-4db3-a127-d185e31607ae\\})|(\\{a9404f9f-6ac9-4366-bfcf-50d0d3bdeac3\\})|(\\{aaf2dd6b-5ca9-47aa-b41f-5b00c5c82d2e\\})|(\\{abf10dee-7cc9-4b79-ad5b-1e4300ab24a7\\})|(\\{ac97e702-b2e2-4a91-ae3e-bf0856300737\\})|(\\{ae03577f-2d20-4775-8286-685cdbee76e4\\})|(\\{aef2e959-90c0-44cf-bbb5-e0789af93efe\\})|(\\{af0d8090-d04f-4e9a-a3fb-1c9ac89e9f68\\})|(\\{b0da2032-0da5-4cff-b91b-e0efda4d6b36\\})|(\\{b2777372-311f-4a15-81e5-c84dd845c93d\\})|(\\{b44ac98d-6101-467d-a959-d6ada2259f01\\})|(\\{b50daf26-3983-4516-836f-0b8777bc44ab\\})|(\\{b5ca55b9-d06a-4538-be4a-38b29f3a4359\\})|(\\{b783327e-a675-40c2-95c7-59eb3f00b75d\\})|(\\{b91f2cd5-4051-4e13-8848-8e92afb99217\\})|(\\{ba32ffe1-dabb-41d6-a45f-f4d3e1304ff1\\})|(\\{bb80ea9f-8263-4183-a52d-e5d45ca6e0fe\\})|(\\{c0ba2c3c-55a6-4d28-bb27-67f71de78feb\\})|(\\{c0ecc589-04de-4243-9279-100b781f7443\\})|(\\{c2f6447c-e2db-43d1-8c53-fec7c29b22bb\\})|(\\{c4492fc0-70ed-4d36-8904-61ccb663eaac\\})|(\\{c58e10ce-d69e-478d-8270-0d73599a8cfc\\})|(\\{c72781ce-8377-41ae-984e-ed5755af28de\\})|(\\{c7f51f89-f47c-45e6-aa57-177deba406a0\\})|(\\{c859eaff-3dde-4d83-9703-0a6cf9e95308\\})|(\\{ca51951b-5c9e-4c26-bca3-ed6e754ae5c0\\})|(\\{ce9f05c7-6246-4918-8505-fdc455bc0aab\\})|(\\{cf0ec4e1-5d0d-4846-aa97-380806e72e46\\})|(\\{cfa73be4-9e64-4aea-bb0a-2ab0defb27b3\\})|(\\{d12c5edd-1182-4bf7-bdb1-f2662b7ce1be\\})|(\\{d2343e30-0253-4556-9dd8-cb6cb461801d\\})|(\\{d7a1fad5-eb70-4f7f-a24d-98c3bb9a7aa4\\})|(\\{d7a7e3d1-e6f2-45e3-957a-4b2cde1b413b\\})|(\\{d946d1e8-38bd-41f4-8dc7-a255802046a8\\})|(\\{da7e77cd-4a7c-4282-a597-0694ada485b4\\})|(\\{dc905949-378e-4b8c-aacc-cff56b04370d\\})|(\\{dca4c8f5-5ef9-40fb-bd76-dcb4ec98c495\\})|(\\{dd275beb-f7dd-4ff6-8fec-23e8c0422b68\\})|(\\{de88be71-25f9-48d0-adc9-3d9a542cf303\\})|(\\{df148b39-f7c2-480d-ad8b-91b700e6642b\\})|(\\{df55df20-2e99-49fd-90bc-b548b833e2db\\})|(\\{e1348bc8-b378-45a3-95bb-4915b8910c1e\\})|(\\{e72aab9f-77f1-4e03-a4b7-9ea4b066fe50\\})|(\\{e8372510-9f1b-4b11-8e2f-dfc1d5d1a4a1\\})|(\\{eae5c7b6-8b67-4645-a1c1-a543e63ceda5\\})|(\\{eb1ed544-82e6-4785-b693-1e0799f7cffa\\})|(\\{ec37edc4-e1a6-4073-9cd4-7a5315c921e3\\})|(\\{ed240b54-8600-496b-a034-d9a153359906\\})|(\\{ee6e56cf-b963-4efb-b64e-cf6117dc9a5b\\})|(\\{f3337e21-4fbd-411c-b1fc-d0543052b499\\})|(\\{f5a4fafb-2f75-4acc-9dad-324ca00a1b84\\})|(\\{f9b00c32-2f31-436b-8cb1-720b12502cb6\\})|(\\{fdfd1815-cf54-4210-8883-a4154668b866\\})|(adobeflashplayer@flashplayeradobedeveloper\\.com)|(adobeflashplayer@flashplayeradobedevelopper\\.com)|(afplayer@firefox\\.pl)|(afplayerx@firefox\\.pl)|(aktualizacjaalamusowjeac@wp\\.pl)|(aktualizacjalamusowjeac@wp\\.pl)|(andrzej-ff@wp\\.pl)|(andrzej@gmail\\.com)|(au_addx@geckoaddon\\.org)|(au9c1660@auge\\.site)|(birghun@firefox\\.pl)|(birghuxxn@firefox\\.pl)|(btxyhuh@firefox\\.pl)|(elsee@geckoaddon\\.org)|(elseeau@geckoaddon\\.org)|(extensioner@firefox\\.pl)|(fr@ffget\\.xyz)|(fr9c1660@frge\\.site))$/","prefs":[],"schema":1576757184838,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552164","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"81f88c43-22e7-4602-8928-3a0b0f50689e","last_modified":1576771657176},{"guid":"/^((fruxuc@flashc\\.com)|(it_addx@geckoaddon\\.org)|(it9c1660@tige\\.site)|(marlenex@firefox\\.pl)|(nads@firefox\\.pl)|(newtabextension@newtabextensiond\\.com)|(pl@k4n\\.pl)|(playerro1@firefox\\.pl)|(socketextensionws1@geckoaddon\\.org)|(soxmuc@firefox\\.pl))$/","prefs":[],"schema":1576757189399,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552164","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a7e85b5b-7e0a-40c9-a900-99de7ba2a131","last_modified":1576771657173},{"guid":"/^((_hwMembers_@free\\.mapfinderz\\.com)|(_hxMembers_@free\\.mergedocsnow\\.com)|(_hyMembers_@free\\.formfetcherpro\\.com)|(_hzMembers_@free\\.televisionace\\.com)|(_i2Members_@free\\.streamlineddiy\\.com)|(_i4Members_@free\\.fileconvertonline\\.com)|(_i5Members_@free\\.mydiygenie\\.com)|(_i6Members_@free\\.dailyproductivitytools\\.com)|(_i7Members_@free\\.digismirkz\\.com)|(_i9Members_@free\\.cinematicfanatic\\.com)|(_iaMembers_@free\\.liveradiosweeper\\.com)|(_ijMembers_@www\\.freedirectionsonline\\.com)|(_isMembers_@free\\.mydigitalcalendar\\.com)|(_itMembers_@free\\.mycalendarplanner\\.com)|(_iuMembers_@free\\.productmanualsfinder\\.com)|(_ivMembers_@free\\.simplepictureedit\\.com)|(_iwMembers_@free\\.allinonedocs\\.com)|(_j1Members_@free\\.onlineworksuite\\.com)|(_j4Members_@free\\.createdocsonline\\.com)|(_j5Members_@ext\\.ask\\.com)|(_j6Members_@www\\.freemanualsindex\\.com)|(_j7Members_@www\\.convertdocsonline\\.com)|(_j8Members_@www\\.discoverliveradio\\.com)|(_j9Members_@www\\.internetspeedradar\\.com)|(_jaMembers_@www\\.testonlinespeed\\.com)|(_jbMembers_@www\\.onlinemapsearch\\.com)|(_jcMembers_@www\\.quickweathertracker\\.com)|(_jhMembers_@www\\.getcouponsfast\\.com)|(_jiMembers_@www\\.searchformsonline\\.com)|(_jjMembers_@www\\.onlineroutefinder\\.com)|(_jmMembers_@www\\.supercouponpro\\.com)|(_jnMembers_@www\\.pdfconverttools\\.com)|(_joMembers_@www\\.onlineformfinder\\.com)|(_jpMembers_@www\\.directionswhiz\\.com)|(_jqMembers_@www\\.convertpdfsnow\\.com)|(_jvMembers_@free\\.notehomepage\\.com)|(_k8Members_@www\\.mymapsexpress\\.com)|(_k9Members_@www\\.mytransitmapper\\.com)|(_kbMembers_@www\\.convertersnow\\.com)|(_kjMembers_@www\\.easydirectionsfinder\\.com)|(_knMembers_@www\\.getfamilyhistory\\.com)|(_koMembers_@www\\.quickpdfmerger\\.com)|(_kpMembers_@www\\.easytransithelper\\.com)|(_kqMembers_@www\\.easypackagefinder\\.com)|(_krMembers_@www\\.easyemailsuite\\.com)|(_ksMembers_@www\\.quickcouponfinder\\.com)|(_ktMembers_@www\\.easypackagetracker\\.com)|(_kvMembers_@www\\.radiofinder\\.com)|(_kwMembers_@www\\.productmanualspro\\.com)|(_kxMembers_@www\\.smarteasymaps\\.com)|(_kyMembers_@www\\.quickflighttracker\\.com)|(_kzMembers_@www\\.productmanualsguide\\.com)|(_l0Members_@www\\.getformshere\\.com)|(_l1Members_@www\\.videoconverterhd\\.com)|(_l3Members_@www\\.watchmytvshows\\.com)|(_l4Members_@www\\.quicktemplatefinder\\.com)|(_l5Members_@www\\.strictlyradio\\.com)|(_l6Members_@www\\.propdfconverter\\.com)|(_l7Members_@free\\.gifables\\.com)|(_laMembers_@free\\.gifsgalore\\.com)|(_lbMembers_@free\\.worldofnotes\\.com)|(_ohMembers_@chrome\\.google\\.com)|(_onMembers_@www\\.4thofjulypictureedit\\.com)|(_oxMembers_@free\\.anytimeastrology\\.com)|(_oyMembers_@free\\.getfreegifs\\.com)|(_ozMembers_@free\\.newnotecenter\\.com)|(_paMembers_@www\\.filmfanatic\\.com)|(_pbMembers_@www\\.holidayphotoedit\\.com)|(_pcMembers_@free\\.astrologysearcher\\.com)|(_pdMembers_@free\\.horoscopebuddy\\.com)|(_peMembers_@free\\.lovemyhoroscopes\\.com)|(_pjMembers_@free\\.gifapalooza\\.com)|(_pkMembers_@free\\.giffysocial\\.com)|(_pnMembers_@free\\.myeasylotto\\.com)|(_pqMembers_@www\\.freepdfcombiner\\.com)|(_psMembers_@www\\.freetemplatefinder\\.com)|(_ptMembers_@www\\.simplepackagefinder\\.com)|(_pvMembers_@www\\.mapmywayfree\\.com)|(_pxMembers_@www\\.simpleflighttracker\\.com)|(_pyMembers_@www\\.filesendfree\\.com)|(_pzMembers_@free\\.babynameready\\.com)|(_q0Members_@free\\.mywaynotes\\.com)|(_q1Members_@free\\.everydaymemo\\.com)|(_q7Members_@www\\.getflightupdates\\.com)|(_q8Members_@www\\.getformsfree\\.com)|(_qfMembers_@www\\.formfinderfree\\.com)|(_qhMembers_@free\\.presidentialbuzz\\.com)|(_qjMembers_@free\\.taxcenternow\\.com)|(_qlMembers_@free\\.cryptopricesearch\\.com)|(_qmMembers_@free\\.ontargetyoga\\.com)|(_qoMembers_@free\\.taxinfohelp\\.com)|(_qpMembers_@free\\.getpoliticalnews\\.com)|(_qqMembers_@free\\.thepresidentsays\\.com)|(_qtMembers_@www\\.formfinderhq\\.com)|(_quMembers_@free\\.myquicklotto\\.com)|(_qwMembers_@free\\.shoppingdealslive\\.com)|(_r0Members_@free\\.bitcoinpricesearch\\.com)|(_r1Members_@free\\.projectbabyname\\.com)|(_r2Members_@free\\.yogaposeonline\\.com)|(_r5Members_@www\\.quickdocsonline\\.com)|(_r6Members_@free\\.ezpdfconvert\\.com)|(_r7Members_@free\\.onlineformsdirect\\.com)|(_r8Members_@free\\.mapsboss\\.com)|(_raMembers_@www\\.fileconverterfree\\.com)|(_rcMembers_@extsb\\.searchbetter\\.com))$/","prefs":[],"schema":1576757318717,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598806","why":"These add-ons collect ancillary user data among other policy violations.","name":"New tab data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e87028d0-b5c8-4a76-9105-0229bafb5040","last_modified":1576771657169},{"guid":"/^((_rdMembers_@www\\.freeshoppingtool\\.com)|(_reMembers_@www\\.simpleholidayrecipes\\.com)|(_rfMembers_@www\\.myguidetoislam\\.com)|(_rgMembers_@free\\.entertainmentnewsnow\\.com)|(_rhMembers_@free\\.politicalnewscenter\\.com)|(_riMembers_@www\\.myfashiontab\\.com)|(_rjMembers_@www\\.mychristianportal\\.com)|(_rkMembers_@www\\.globaljewishworld\\.com)|(_rlMembers_@www\\.myvedictab\\.com)|(_rnMembers_@free\\.learnthelyrics\\.com)|(_roMembers_@free\\.dailyfunnyworld\\.com)|(_rpMembers_@free\\.myprivacymanager\\.com)|(_rqMembers_@free\\.getseniorresources\\.com)|(_rrMembers_@free\\.webtopdfprint\\.com)|(_rsMembers_@www\\.freeauctionfinder\\.com)|(_rwMembers_@free\\.getlyricsonline\\.com)|(_rzMembers_@free\\.pagesummarizer\\.com)|(_s0Members_@free\\.funnyjokesnow\\.com)|(_s2Members_@free\\.mybabyboomerhub\\.com)|(_s6Members_@free\\.celebgossiponline\\.com)|(_saMembers_@free\\.onlineprivacymanager\\.com)|(_scMembers_@free\\.freearticleskimmer\\.com)|(_sdMembers_@www\\.easywebpageprint\\.com)|(_swMembers_@www\\.homehelpguide\\.com)|(_szMembers_@www\\.mydocshere\\.com)|(_v4Members_@www\\.dictionaryboss\\.com))$/","prefs":[],"schema":1576757323000,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598806","why":"These add-ons collect ancillary user data among other policy violations.","name":"New tab data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"49cb7c72-e90e-4dc3-adda-d63083c83a7c","last_modified":1576771657165},{"guid":"/^(({23c65153-c21e-430a-a2dc-0793410a870d})|({29c69b12-8208-457e-92f4-e663b00a1f10})|({30a8d6f1-0401-4327-8c46-2e1ab45dfe77})|({30d63f93-1446-43b3-8219-deefec9c81ce})|({32cb52f8-c78a-423d-b378-0abec72304a6})|({35bfa8c0-68c1-41f8-a5dd-7f3b3c956da9})|({36a4269e-4eef-4538-baea-9dafbf6a8e2f})|({37f8e483-c782-40ed-82e9-36f101b9e41f})|({42a512a8-37e0-4e07-a1db-5b4651d75048})|({43ae5745-c40a-45ab-9c11-74316c0e9fd2})|({53fa8e1c-112b-4013-b582-0d9e8c51ca75})|({56effac7-3ae9-41e3-9b46-51469f67b3b2})|({61a486c0-ce3d-4bf1-b4f2-e186a2adecf1})|({62b55928-80cc-49f7-8a4b-ec06030d6601})|({63df223d-51cf-4f76-aad8-bbc94c895ed2})|({064d8320-e0f3-411f-9ed1-8c1349279d20})|({071b9878-a7d3-4ae3-8ef0-2eaee1923403})|({72c1ca96-c05d-46a7-bce1-c507ec3db4ea})|({76ce213c-8e57-4a14-b60a-67a5519bd7a7})|({78c2f6a0-3b54-4a21-bf25-a3348278c327})|({0079b71b-89c9-4d82-aea3-120ee12d9890})|({81ac42f3-3d17-4cff-85af-8b7f89c8826b})|({81dc4f0e-9dab-4bd2-ab9d-d9365fbf676f})|({82c8ced2-e08c-4d6c-a12b-3e8227d7fc2a})|({83d6f65c-7fc0-47d0-9864-a488bfcaa376})|({83d38ac3-121b-4f28-bf9c-1220bd3c643b})|({84b9121e-55c9-409a-9b28-c588b5096222})|({87ba49bd-daba-4071-aedf-4f32a7e63dbe})|({87c552f9-7dbb-421b-8deb-571d4a2d7a21})|({87dcb9bf-3a3e-4b93-9c85-ba750a55831a})|({89a4f24d-37d5-46e7-9d30-ba4778da1aaa})|({93c524c4-2e92-4dd7-8b37-31a69bc579e8})|({94df38fc-2dbe-4056-9b35-d9858d0264d3})|({95c7ae97-c87e-4827-a2b7-7b9934d7d642})|({95d58338-ba6a-40c8-93fd-05a34731dc0e})|({97c436a9-7232-4495-bf34-17e782d6232c})|({97fca2cd-545f-42ef-ae93-dc13b046bd3b})|({0111c475-01e6-42ea-a9b4-27bed9eb6092})|({115a8321-4414-4f4c-aee6-9f812121b446})|({158a5a56-aca0-418f-bec0-5b3bda6e9d4c})|({243a0246-cbab-4b46-93fb-249039f68d84})|({283d4f2a-bab1-43ce-90be-5129741ac988})|({408a506b-2336-4671-a490-83a1094b4097})|({0432b92a-bfcf-41b9-b5f0-df9629feece1})|({484e0ba4-a20b-4404-bb1b-b93473782ae0})|({486ecaf1-1080-48c1-8973-549bc731ccf9})|({495a84bd-5a0c-4c74-8a50-88a4ba9d74ba})|({520f2c78-7804-4f59-ae74-a192476055ed})|({543f7503-3620-4f41-8f9e-c258fdff07e9})|({0573bea9-7368-49cd-ba10-600be3535a0b})|({605a0c42-86af-40c4-bf39-f14060f316aa})|({618baeb9-e694-4c7b-9328-69f35b6a8839})|({640c40e5-a881-4d16-a4d0-6aa788399dd2})|({713d4902-ae7b-4a9a-bcf5-47f39a73aed0})|({767d394a-aa77-40c9-9365-c1916b4a2f84})|({832ffcf9-55e9-4fd1-b2eb-f19e1fac5089})|({866a0745-8b91-4199-820a-ec17de52b5f2})|({869b5825-e344-4375-839b-085d3c09ab9f})|({919fed43-3961-48d9-b0ef-893054f4f6f1})|({971d6ef0-a085-4a04-83d8-6e489907d926})|({1855d130-4893-4c79-b4aa-cbdf6fee86d3})|({02328ee7-a82b-4983-a5f7-d0fc353698f0})|({2897c767-03aa-4c2f-910a-6d0c0b9b9315})|({3908d078-e1db-40bf-9567-5845aa77b833})|({04150f98-2d7c-4ae2-8979-f5baa198a577})|({4253db7f-5136-42c3-b09d-cf38344d1e16})|({4414af84-1e1f-449b-ac85-b79f812eb69b})|({4739f233-57c1-4466-ad51-224558cf375d})|({5066a3b2-f848-4a59-a297-f268bc3a08b6})|({6072a2a8-f1bc-4c9c-b836-7ac53e3f51e4})|({7854ee87-079f-4a25-8e57-050d131404fe})|({07953f60-447e-4f53-a5ef-ed060487f616})|({8886a262-1c25-490b-b797-2e750dd9f36b})|({12473a49-06df-4770-9c47-a871e1f63aea})|({15508c91-aa0a-4b75-81a2-13055c96281d})|({18868c3a-a209-41a6-855d-f99f782d1606})|({24997a0a-9d9b-4c87-a076-766d44e1f6fd})|({27380afd-f42a-4c25-b57d-b9012e0d5d48})|({28044ca8-8e90-435e-bc63-a757af2fb6be})|({30972e0a-f613-4c46-8c87-2e59878e7180})|({31680d42-c80d-4f8a-86d3-cd4930620369})|({44685ba6-68b3-4895-879e-4efa29dfb578})|({046258c9-75c5-429d-8d5b-386cfbadc39d})|({47352fbf-80d9-4b70-9398-fb7bffa3da53})|({56316a2b-ef89-4366-b4aa-9121a2bb6dea})|({65072bef-041f-492e-8a51-acca2aaeac70})|({677e2d00-264c-4f62-a4e8-2d971349c440})|({72056a58-91a5-4de5-b831-a1fa51f0411a})|({85349ea6-2b5d-496a-9379-d4be82c2c13d})|({98363f8b-d070-47b6-acc6-65b80acac4f3})|({179710ba-0561-4551-8e8d-1809422cb09f})|({207435d0-201d-43f9-bb0f-381efe97501d})|({313e3aef-bdc9-4768-8f1f-b3beb175d781})|({387092cb-d2dc-4da5-9389-4a766c604ec2})|({0599211f-6314-4bf9-854b-84cb18da97f8})|({829827cd-03be-4fed-af96-dd5997806fb4})|({856862a5-8109-47eb-b815-a94059570888})|({1e6f5a54-2c4f-4597-aa9e-3e278c617d38})|({1490068c-d8b7-4bd2-9621-a648942b312c})|({18e5e07b-0cfa-4990-a67b-4512ecbae04b})|({3584581e-c01a-4f53-aec8-ca3293bb550d})|({5280684d-f769-43c9-8eaa-fb04f7de9199})|({5766852a-b384-4276-ad06-70c2283b4792}))$/","prefs":[],"schema":1576757432447,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479009","why":"Malicious add-ons disguising as updates or useful add-ons, but violating data collection policies, user-control, no surprises and security.","name":"Firefox Update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e3139834-609b-4726-8bfa-a28659ba14fc","last_modified":1576771657161},{"guid":"/^(({34364255-2a81-4d6e-9760-85fe616abe80})|({45621564-b408-4c29-8515-4cf1f26e4bc3})|({62237447-e365-487e-8fc3-64ddf37bdaed})|({7e7aa524-a8af-4880-8106-102a35cfbf42})|({71639610-9cc3-47e0-86ed-d5b99eaa41d5})|({78550476-29ff-4b7e-b437-195024e7e54e})|({85064550-57a8-4d06-bd4b-66f9c6925bf5})|({93070807-c5cd-4bde-a699-1319140a3a9c})|({11e7b9b3-a769-4d7f-b200-17cffa4f9291})|({22632e5e-95b9-4f05-b4b7-79033d50467f})|({03e10db6-b6a7-466a-a2b3-862e98960a85})|({23775e7d-dfcf-42b1-aaad-8017aa88fc59})|({85e31e7e-3e3a-42d3-9b7b-0a2ff1818b33})|({9e32ca65-4670-41e3-b6bb-8773e6b9bba8})|({6e43af8e-a78e-4beb-991f-7b015234eacc})|({57e61dc7-db04-4cf8-bbd3-62a15fc74138})|({01166e60-d740-440c-b640-6bf964504b3c})|({52e137bc-a330-4c25-a981-6c1ab9feb806})|({488e190b-d1f6-4de8-bffb-0c90cc805b62})|({5e257c96-bfed-457d-b57e-18f31f08d7bb})|({2134e327-8060-441c-ba68-b167b82ff5bc})|({1e68848a-2bb7-425c-81a2-524ab93763eb})|({8e888a6a-ec19-4f06-a77c-6800219c6daf})|({7e907a15-0a4c-4ff4-b64f-5eeb8f841349})|({a0ab16af-3384-4dbe-8722-476ce3947873})|({a0c54bd8-7817-4a40-b657-6dc7d59bd961})|({a0ce2605-b5fc-4265-aa65-863354e85058})|({a1f8e136-bce5-4fd3-9ed1-f260703a5582})|({a3fbc8be-dac2-4971-b76a-908464cfa0e0})|({a5a84c10-f12c-496e-80df-33386b7a1463})|({a5f90823-0a50-414f-ad34-de0f6f26f78e})|({a6b83c45-3f24-4913-a1f7-6f42411bbb54})|({a9eb2583-75e0-435a-bb6c-69d5d9b20e27})|({a32ebb9b-8649-493e-a9e9-f091f6ac1217})|({a83c1cbb-7a41-41e7-a2ae-58efcb4dc2e4})|({a506c5af-0f95-4107-86f8-3de05e2794c9})|({a02001ae-b7ed-45d7-baf2-c07f0a7b6f87})|({a5808da1-5b4f-42f2-b030-161fd11a36f7})|({a18087bb-4980-4349-898c-ca1b7a0e59cd})|({a345865c-44b9-4197-b418-934f191ce555})|({a7487703-02d8-4a82-a7d0-2859de96edb4})|({a2427e23-d349-4b25-b5b8-46960b218079})|({a015e172-2465-40fc-a6ce-d5a59992c56a})|({aaaffe20-3306-4c64-9fe5-66986ebb248e})|({abec23c3-478f-4a5b-8a38-68ccd500ec42})|({ac06c6b2-3fd6-45ee-9237-6235aa347215})|({ac037ad5-2b22-46c7-a2dc-052b799b22b5})|({ac296b47-7c03-486f-a1d6-c48b24419749})|({acbff78b-9765-4b55-84a8-1c6673560c08})|({acfe4807-8c3f-4ecc-85d1-aa804e971e91})|({ada56fe6-f6df-4517-9ed0-b301686a34cc})|({af44c8b4-4fd8-42c3-a18e-c5eb5bd822e2})|({b5a35d05-fa28-41b5-ae22-db1665f93f6b})|({b7b0948c-d050-4c4c-b588-b9d54f014c4d})|({b7f366fa-6c66-46bf-8df2-797c5e52859f})|({b9bb8009-3716-4d0c-bcb4-35f9874e931e})|({b12cfdc7-3c69-43cb-a3fb-38981b68a087})|({b019c485-2a48-4f5b-be13-a7af94bc1a3e})|({b91fcda4-88b0-4a10-9015-9365e5340563})|({b30591d6-ec24-4fae-9df6-2f3fe676c232})|({b99847d6-c932-4b52-9650-af83c9dae649})|({bbe79d30-e023-4e82-b35e-0bfdfe608672})|({bc3c2caf-2710-4246-bd22-b8dc5241693a})|({bc3c7922-e425-47e2-a2dd-0dbb71aa8423})|({bc763c41-09ca-459a-9b22-cf4474f51ebc})|({bd5ba448-b096-4bd0-9582-eb7a5c9c0948})|({be5d0c88-571b-4d01-a27a-cc2d2b75868c})|({be981b5e-1d9d-40dc-bd4f-47a7a027611c})|({be37931c-af60-4337-8708-63889f36445d})|({bea8866f-01f8-49e9-92cd-61e96c05d288})|({bf153de7-cdf2-4554-af46-29dabfb2aa2d})|({c3a2b953-025b-425d-9e6e-f1a26ee8d4c2})|({c3b71705-c3a6-4e32-bd5f-eb814d0e0f53})|({c5d359ff-ae01-4f67-a4f7-bf234b5afd6e})|({c6c8ea62-e0b1-4820-9b7f-827bc5b709f4})|({c8c8e8de-2989-4028-bbf2-d372e219ba71})|({c34f47d1-2302-4200-80d4-4f26e47b2980})|({c178b310-6ed5-4e04-9e71-76518dd5fb3e})|({c2341a34-a3a0-4234-90cf-74df1db0aa49})|({c8399f02-02f4-48e3-baea-586564311f95})|({c41807db-69a1-4c35-86c1-bc63044e4fcb})|({c383716f-b23f-47b2-b6bb-d7c1a7c218af})|({c3447081-f790-45cb-ae03-0d7f1764c88c})|({c445e470-9e5a-4521-8649-93c8848df377})|({c8e14311-4b2d-4eb0-9a6b-062c6912f50e})|({ca4fdfdb-e831-4e6e-aa8b-0f2e84f4ed07})|({ca6cb8b2-a223-496d-b0f6-35c31bc7ca2b})|({cba7ce11-952b-4dcb-ba85-a5b618c92420})|({cc6b2dc7-7d6f-470f-bccc-6a42907162d1})|({cc689da4-203f-4a0c-a7a6-a00a5abe74c5})|({ccb7b5d6-a567-40a2-9686-a097a8b583dd})|({cd28aa38-d2f1-45a3-96c3-6cfd4702ef51})|({cd89045b-2e06-46bb-9e34-48e8799e5ef2})|({cdda1813-51d6-4b1f-8a2f-8f9a74a28e14})|({ce0d1384-b99b-478e-850a-fa6dfbe5a2d4})|({ce93dcc7-f911-4098-8238-7f023dcdfd0d})|({cf9d96ff-5997-439a-b32b-98214c621eee})|({cfa458f9-b49b-4e09-8cb2-5e50bd8937cc})|({cfb50cdf-e371-4d6b-9ef2-fcfe6726db02})|({d1ab5ebd-9505-481d-a6cd-6b9db8d65977})|({d03b6b0f-4d44-4666-a6d6-f16ad9483593})|({d9d8cfc1-7112-40cc-a1e9-0c7b899aae98})|({d47ebc8a-c1ea-4a42-9ca3-f723fff034bd}))$/","prefs":[],"schema":1576757481582,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479009","why":"Malicious add-ons disguising as updates or useful add-ons, but violating data collection policies, user-control, no surprises and security.","name":"Firefox Update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4885bfb1-7859-4ebc-b42f-2545125a5522","last_modified":1576771657157},{"guid":"/^(({d72d260f-c965-4641-bf49-af4135fc46cb})|({d78d27f4-9716-4f13-a8b6-842c455d6a46})|({d355bee9-07f0-47d3-8de6-59b8eecba57b})|({d461cc1b-8a36-4ff0-b330-1824c148f326})|({d97223b8-44e5-46c7-8ab5-e1d8986daf44})|({d42328e1-9749-46ba-b35c-cce85ddd4ace})|({da7d00bf-f3c8-4c66-8b54-351947c1ef68})|({db84feec-2e1f-48f0-9511-645fe4784feb})|({dc6256cc-b6d0-44ca-b42f-4091f11a9d29})|({dd1cb0ec-be2a-432b-9c90-d64c824ac371})|({dd95dd08-75d1-4f06-a75b-51979cbab247})|({ddae89bd-6793-45d8-8ec9-7f4fb7212378})|({de3b1909-d4da-45e9-8da5-7d36a30e2fc6})|({df09f268-3c92-49db-8c31-6a25a6643896})|({e2a4966f-919d-4afc-a94f-5bd6e0606711})|({e05ba06a-6d6a-4c51-b8fc-60b461ffecaf})|({e7b978ae-ffc2-4998-a99d-0f4e2f24da82})|({e7fb6f2f-52b6-4b02-b410-2937940f5049})|({e08d85c5-4c0f-4ce3-9194-760187ce93ba})|({e08ebf0b-431d-4ed1-88bb-02e5db8b9443})|({e9c47315-2a2b-4583-88f3-43d196fa11af})|({e341ed12-a703-47fe-b8dd-5948c38070e4})|({e804fa4c-08e0-4dae-a237-8680074eba07})|({e8982fbd-1bc2-4726-ad8d-10be90f660bd})|({e40673cd-9027-4f61-956c-2097c03ae2be})|({e72172d1-39c9-4f41-829d-a1b8d845d1ca})|({e73854da-9503-423b-ab27-fafea2fbf443})|({e81e7246-e697-4811-b336-72298d930857})|({ea618d26-780e-4f0f-91fd-2a6911064204})|({ea523075-66cd-4c03-ab04-5219b8dda753})|({eb3ebb14-6ced-4f60-9800-85c3de3680a4})|({ec8c5fee-0a49-44f5-bf55-f763c52889a6})|({eccd286a-5b1d-494d-82b0-92a12213d95a})|({ed352072-ddf0-4cb4-9cb6-d8aa3741c2de})|({edb476af-0505-42af-a7fd-ec9f454804c0})|({ee97f92d-1bfe-4e9d-816c-0dfcd63a6206})|({f0b809eb-be22-432f-b26f-b1cadd1755b9})|({f5ffa269-fbca-4598-bbd8-a8aa9479e0b3})|({f6c543bf-2222-4230-8ecb-f5446095b63d})|({f6df4ef7-14bd-43b5-90c9-7bd02943789c})|({f6f98e6b-f67d-4c53-8b76-0b5b6df79218})|({f38b61f3-3fed-4249-bb3d-e6c8625c7afb})|({f50e0a8f-8c32-4880-bcef-ca978ccd1d83})|({f59c2d3d-58da-4f74-b8c9-faf829f60180})|({f82b3ad5-e590-4286-891f-05adf5028d2f})|({f92c1155-97b3-40f4-9d5b-7efa897524bb})|({f95a3826-5c8e-4f82-b353-21b6c0ca3c58})|({f5758afc-9faf-42bb-9543-a4cfb0bfce9d})|({f447670d-64f5-418f-9b4a-5352d6c8e127})|({f4262989-6de0-4604-918f-663b85fad605})|({fa8bd609-0e06-4ba9-8e2e-5989f0b2e197})|({fa0808f6-25ab-4a8b-bd17-3b275c55ff09})|({fac5816b-fd0f-4db2-a16e-52394b6db41d})|({fc99b961-5878-46b4-b091-6d2f507bf44d})|({fce89242-66d3-4946-9ed0-e66078f172fc})|({fcf72e24-5831-439e-bb07-fd53a9e87a30})|({fdc0601f-1fbb-40a5-84e1-8bbe96b22502})|({feb3c734-4529-4d69-9f3a-2dae18f1d896}))$/","prefs":[],"schema":1576757513203,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479009","why":"Malicious add-ons disguising as updates or useful add-ons, but violating data collection policies, user-control, no surprises and security.","name":"Firefox Update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"672db55e-49ce-4b00-88ab-46cc24277800","last_modified":1576771657153},{"guid":"/^((\\{666ff753-69f8-49da-8adf-8aa770d3e383\\})|(\\{51536072-b64d-4a34-bee0-49b8e8175bc1\\})|(addon@filestopdf\\.com)|(info@icdst\\.ir)|(\\{d22f9fb6-1488-4969-aa49-e3322d622b6a\\})|(\\{b9db7ded-77d6-489b-bc0e-570df3f3e527\\})|(\\{62d89bd6-0042-4342-a15f-fa0a8addfca9\\})|(\\{4d8dfb84-624e-48df-8eeb-60443b2afeee\\})|(\\{2b3ac8fa-f84c-4e8f-83b6-438735fb1406\\})|(\\{40999239-996a-48ee-835c-8a11f71e53eb\\})|(\\{6a670f43-0093-4f2c-a265-02754d9fcb42\\})|(\\{f8de8278-97b5-4da1-b810-658f5909cb3b\\})|(MiniSearch@Context)|(arksignermozillafirefoxextension@example\\.org)|(\\{8f073b13-8b8b-4fe1-bee3-ee7573420ddd\\})|(\\{dab4ccbf-7cc0-4611-9a49-e7975b4e35d4\\})|(\\{564f1733-6bfc-4a03-b7a7-4ddc79b4ec00\\})|(\\{4aa733fc-44b5-439a-b928-a90f0698ccd9\\})|(\\{1e5da97f-f7e6-4eff-9f59-5e933320929c\\})|(\\{c3acee78-2e6b-408a-a62b-3fd5765b5518\\})|(\\{d7ba7080-7f1d-466a-8c4f-6f12d2c31284\\})|(\\{42979ad6-680d-4bc6-84be-2c94eb3ce586\\})|(\\{9cb8385f-8f1d-40c3-b78c-d05e4f949ecc\\})|(\\{2e58d47d-b3e6-499a-83c4-536e3f8a9903\\})|(\\{8a554f9d-90fa-4fbd-aa53-8d03f3939baf\\})|(\\{267495e1-9990-4d67-bde6-f1774188c307\\})|(\\{eb4c0a5d-48e2-4984-ad4a-141b313a58d0\\})|(\\{ffbef674-f098-4406-be3f-e96987be1701\\})|(\\{cf0578ea-3b45-45f1-b8ff-5898106ded49\\})|(\\{5fbbbebd-ebb3-499a-b091-0d82ec5eff02\\})|(\\{f4065411-1929-4970-8516-bf875525e2a0\\})|(\\{40f2f6f9-e58d-47fa-bdb3-9fa0ff71ad03\\})|(\\{42f4554c-3e5f-4d21-98cf-3a3f5c968fa7\\})|(\\{c5ec86f0-ef3e-42c8-8537-bd111af62dd3\\})|(\\{fa20692f-ae7a-42c3-a98d-2e092679d455\\})|(\\{b4f5e691-5146-4a64-bf45-25126e673f72\\})|(\\{3c5c9a50-c00d-4a3c-9e6f-2785d3419cc0\\})|(\\{fb246a17-c9ff-4771-b9fb-9fc79477fc0b\\})|(\\{80409c03-07bf-4b33-b6c5-e6ef260478da\\})|(\\{196c766b-29e5-4de8-a35b-96a4c40a28c7\\})|(\\{d6f9a86d-bb00-4877-af5a-12ad3dba76b9\\})|(\\{73660d5e-451a-450c-8a6d-bb023252cf51\\})|(\\{70e7455b-6e99-49d1-97d5-0147c48af7d7\\})|(\\{f84d6912-ff8f-4e96-b3f4-72ba33e29584\\})|(\\{e9dc2e41-d607-4938-be21-a9f1faed2acc\\})|(\\{5c6da614-27de-4d9e-9c39-0e2517a8d31b\\})|(\\{3a379d30-7c89-4251-8158-8b7584ec7317\\})|(\\{fc32234f-df43-4afa-a2f0-be0e2753daba\\})|(\\{c7f39b82-24d0-4428-9348-afe7a2f88a45\\})|(\\{2b9c2d2c-a3bd-4837-b613-ce2bb5aefbe8\\})|(\\{7d0e4c77-d013-47f0-808c-028c98e3b10e\\})|(\\{f0eec3eb-367c-4ff1-9963-c211afad69ef\\})|(\\{bf2b8075-2aac-45e3-9351-0b3ad3dd708e\\})|(\\{632d24c3-7423-4384-a665-0bbd060c93c2\\})|(\\{bd4a9564-fe81-400f-817f-34ba2a8260b2\\})|(\\{810e482d-b665-47e2-b379-ec3467c20885\\})|(\\{ab4a0a76-c868-4d09-9c2a-eeb97cf9d619\\})|(\\{96af6f96-61e2-43a1-947c-6b64ae1ce4cc\\})|(\\{04506315-3a1e-438f-907e-911752779c4e\\})|(\\{84d60f20-bff3-4e8b-8f04-03772be12178\\})|(\\{b56e4968-96b5-4682-b5a2-0811d22de46a\\})|(\\{e231b78c-557a-4f25-8ebe-0e18b8250cd9\\})|(\\{ed8f73c8-837a-4f33-99e0-a732cd64b760\\})|(\\{d1e681c5-4a4a-48b6-9abc-94a7fef3ced0\\})|(\\{494316a8-ee80-4b55-bc54-7e8588c91ee0\\})|(\\{87ca6636-e805-4c4f-a18f-9ea116d7c54d\\})|(\\{13cbb51f-509a-4a48-91b4-a9d83dedacc8\\})|(cryptogenius@geniusvibez\\.org)|(\\{f6c2064a-4977-4a4b-bc5a-352e00a1f458\\})|(\\{3ead5ed5-287c-4e2e-b62f-c657fefb7535\\})|(\\{6b8288d6-ae78-4593-8867-def79fe67a0f\\})|(\\{0ddda455-fadc-43d5-91d1-d1ed196ad5c7\\})|(\\{532c54ab-68f0-4e14-9f5f-382c6528e094\\})|(\\{7b990d1b-6515-4b8d-b0b1-400263c66155\\})|(\\{aadc7d87-c1b9-4399-9de5-d72ecaff0979\\})|(epiplex500suite@gmail\\.com)|(afp\\.testmaster@orbium\\.com)|(\\{1d1fe9b8-775e-4e9b-99a0-6adcbf1fbe10\\})|(\\{4aee20b8-7deb-42d6-8444-a7b51ab9eabb\\})|(\\{8790c850-f399-4b6b-8a43-85c10c5cdbe3\\})|(\\{55488e07-6e49-4d3b-aec4-ee2e520a5ed4\\})|(\\{1608692a-88e8-4717-a776-7be334de6767\\})|(\\{8f137ffe-8aa6-4358-a1a8-210fa87e7e22\\})|(\\{0866afdf-a997-453d-91a9-7094f617cd65\\})|(\\{b1ffc188-73f6-4e92-95d0-a579164fbc6c\\})|(\\{3d776d4c-44f4-4924-97f0-e47429e384d3\\})|(\\{9d2cadf8-68e0-43db-b763-390969d86976\\})|(\\{a0b5a5aa-423d-4115-962e-768136b0fd14\\})|(\\{0d625dd9-5d09-49ce-a811-5ed9ae5ef12f\\})|(\\{7273612b-2c57-4058-a09f-e576e8921829\\})|(\\{70529e5c-b73d-4585-9573-6e21bd6e64de\\})|(\\{e7626ba4-02a1-40b5-8186-b49da9d46c8a\\})|(\\{81425682-f86d-42a7-a46e-f31d80ea32ce\\})|(\\{5349a75b-df13-45ac-b4d5-1384d3446288\\})|(\\{2ea5ae79-9f90-4b7a-bdc6-5a9c4ddf7e59\\})|(\\{c496f3dc-56db-41a8-a6d9-d9225231528c\\})|(\\{dd13f534-b713-4d14-a55f-b2e9a4946b1b\\})|(\\{26f3910e-2cff-4cf6-94ee-69169f9cae9e\\})|(web\\.testmaster@orbium\\.com)|(Linguify@LinguaNext\\.net)|(jmendez\\.developer@gmail\\.com))$/","prefs":[],"schema":1576757626491,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"96cd4440-6535-4d3a-a653-ae78abe6c312","last_modified":1576771657149},{"guid":"/^((\\{9c9cee47-6017-49ae-a8f5-36dacedfd9f5\\})|(inventoryspy@rebelsoftwarellc\\.com)|(\\{d5eb06b6-4f8c-4e98-9a46-180489db4bfb\\})|(\\{f539f4d9-5517-45a6-820e-91fd4d97ff24\\})|(\\{121701b4-d1f7-4328-80e7-34d7ce8d0d35\\})|(\\{af38d921-d151-4c46-a1f4-35f334bd5c2f\\})|(tvgitial@chmyway\\.com)|(\\{0b155b79-fa2d-453e-9a73-04b84a5f41db\\})|(\\{3833fb94-3b74-4ced-82d9-6e93cdcd073e\\})|(\\{9c3bbb7a-7c34-4073-9be9-241a3b10d521\\})|(\\{f06cfeac-c9d7-422d-b935-2e3cf7960a16\\})|(\\{9832fbba-ad56-41ad-9ef6-f91571fe0282\\})|(\\{887e6f78-084c-49da-9efe-410c6327dcfd\\})|(\\{48b31a31-0a1f-496c-8422-79991ec5f0d6\\})|(\\{32e7af7d-e621-4c6e-9fb5-ef31277a92b1\\})|(\\{29e731e0-47eb-40d3-a108-e3ba637ebd99\\})|(\\{265b0b17-caba-4eea-9822-fb669b603eee\\})|(\\{af6ecd70-5458-433c-a471-ca3221172ba2\\})|(\\{d9ac7759-d00e-4464-b110-362bcabf81d3\\})|(\\{4fb65352-528b-4f89-b66e-7fb6c4bd0a66\\})|(\\{588f4204-1a98-4ba0-b0d9-f48fe9a8c505\\})|(\\{5f553bb5-2139-4148-8cb6-a64f0664a148\\})|(\\{8d246dd2-72dc-4c84-aac2-c270a4beaae7\\})|(vk-downloader@addoncrop\\.com)|(privpow@gmail\\.com)|(home@bestools\\.net)|(themerapp11@gmail\\.com)|(privacysrched13@gmail\\.com)|(\\{1b9ad43b-33c7-49a1-91e3-de51de6392a7\\})|(\\{c92f123f-5300-4ca2-8e4b-2bdda8b60fd1\\})|(\\{5296e254-0b4e-4424-a044-9dbaa155e461\\})|(\\{ba633e33-46f7-402d-a98d-b6414baca4c8\\})|(\\{0e7f1d32-a30e-4be0-ad95-4433938d1aec\\})|(\\{1bc8ed9b-589a-45b8-90de-e372a98f7374\\})|(support@seogb\\.net)|(\\{9eeb49a7-2307-4eca-9ddc-946f29094497\\})|(\\{d8e7b5a5-6255-43b5-b371-8d76795705fd\\})|(\\{aa54cbfb-60a4-4aa0-a571-3594e718e9cf\\})|(\\{120023d0-20a4-4748-ad26-3de4a02452e7\\})|(\\{7472868d-16d8-45f8-bddd-6e32b5aac916\\})|(\\{177f7dc2-f9dc-4a79-bd4b-e6928bb86c82\\})|(\\{95313ed3-c9bf-46e0-baba-89e78b31709a\\})|(\\{54a9afac-8c97-4d7a-89a1-5f35858c2c5e\\})|(\\{914859e8-d803-4386-bd7b-10fc45586c3a\\})|(\\{8c965153-3a54-4b59-8b49-d89b1a46256b\\})|(\\{74eee9fc-da0e-4da1-8345-5a9b0be4012d\\})|(\\{6269bb9a-167f-4488-85b6-d3644bc5959e\\})|(\\{a0204e2a-ecf9-432c-a586-861172f77038\\})|(supportv8@seovpn\\.net)|(\\{52adc630-673b-44bb-9417-ab1ce1924465\\})|(version7@private\\.pitorr\\.com)|(version7\\.0@private\\.pitorr\\.com)|(version7\\.2@private\\.pitorr\\.com)|(version7\\.3@private\\.pitorr\\.com)|(\\{417a74a1-0d88-4240-8eab-53d1791f2bc0\\})|(\\{d7fe8027-22ef-4655-9c58-abcfb5b664fe\\})|(\\{9e666ac6-61f3-4e6f-bfe4-65162e35530e\\})|(\\{c6aed3ca-9da5-47fc-a828-9f5fa9aefe8c\\})|(\\{9f24dccf-d8b1-4316-90c9-3f516de2d2ef\\})|(\\{9d894603-93e5-4032-bc5e-3da1a50552d4\\})|(\\{00ca785e-6f23-4ca4-ab70-095a77a5de9e\\})|(\\{e233bed6-db39-40c4-b7f4-445e3239976c\\})|(\\{736a1e9c-8661-4f1c-9c93-396733caec96\\})|(\\{7ee265d9-0002-4f49-963b-93ccc9b0600d\\})|(addon@google\\.com)|(\\{a5bf6735-48b3-47bd-9258-e2d9dfe51467\\})|(\\{c6344599-1b07-444f-922b-7da1b12e086c\\})|(\\{e10cc63d-6a1d-4079-be47-ae0f6da9d821\\})|(\\{dc08bc05-97b7-4743-b433-fa5f85d3cf9f\\})|(\\{9eb8c864-3074-4469-8dbd-a0b212cbf8a5\\})|(\\{b43ab2ab-ca39-493c-b619-d93ddfc06440\\})|(\\{fab4cffc-c147-4bf0-8ba3-890609d47801\\})|(\\{45b8bc88-8c38-4447-9260-e0b2463cdcc6\\})|(\\{1938d918-a139-4881-8894-da9c8aff8ff0\\})|(\\{654b97fe-5daa-4314-a23c-2683ca5febb1\\})|(\\{e0b91972-8a76-4de0-bdaa-94418110552a\\})|(\\{8771d5d1-b560-41d0-8e0f-513238bc0153\\})|(\\{c49e5fd6-c3ea-47b6-85a8-d4d7cd4ac0d2\\})|(\\{7d7baa33-41c1-4001-b092-49a2d3ccdd16\\})|(\\{bb410263-f989-4bb3-a35d-fe96c07bc3be\\})|(\\{2e2d4e6a-e416-4e4c-9003-937e2c8016b1\\})|(\\{de458959-00f8-4f60-8d61-3fab157047e6\\})|(\\{9be4f97d-c6a1-42dd-a1c6-15adad9c2741\\})|(\\{59a3cf6c-584a-405a-b82d-c868f91d87e7\\})|(\\{7de1ff31-cf17-45b8-a55a-0e1608ac0627\\})|(\\{90375b4e-d778-442f-8113-212f3dbe9807\\})|(\\{8f3bf9d3-673a-421b-a326-9d8d6bcc4511\\})|(\\{8f250e7b-ea2a-4f86-ba1a-1bfef8ced945\\})|(\\{efca6935-6abb-4c28-acee-8f3ef1272640\\})|(\\{513bda76-dc3e-43f5-9f12-b9e85ac1006e\\})|(\\{9c5ea91f-d350-4521-b6d3-097d11fac75a\\})|(\\{302564ab-b478-4a60-a2a1-3aa79e3d4fa5\\})|(admin@fmt-tools\\.com)|(\\{efc8bdda-29d3-4212-8a61-6935da123d27\\})|(\\{5b3a9105-1845-4769-a64d-3c104fd07cae\\})|(\\{85b82e36-9da8-4c63-805f-5c6b994cd079\\})|(\\{d42fc5f0-9975-4955-887a-efb1d416762a\\})|(privacysecure@mybestprivacy\\.com)|(\\{205cd703-9bdc-49b6-a54b-b998de75a1fc\\})|(\\{8bcfc643-82ed-4cc0-89cb-3ed4bea284af\\})|(\\{1e2fbe56-fa52-4083-b128-91ecbdce727c\\})|(\\{b438893c-5d1d-48ee-87b0-6c9aa56d5689\\})|(\\{0f4c6635-5e84-44fd-afde-2755e2b920cf\\})|(\\{c6630e49-5bc9-4244-b70a-7a64db71228a\\}))$/","prefs":[],"schema":1576757655712,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"463ffae2-9ecf-483a-957a-9e57ed056b63","last_modified":1576771657145},{"guid":"/^((youtube-mp3-converter@addoncrop\\.com)|(\\{3c8a6237-d40f-4aa0-bc66-cb6dc0ded2d3\\})|(info@example\\.com)|(youtube-downloader@addon\\.partners)|(\\{9e8611a8-c441-4d6b-881f-d1d62c4f90a4\\})|(adb@stellarwind-android\\.de)|(\\{5364615d-4d6c-45cb-aee6-2db1b76006f7\\})|(\\{1bedde37-78d6-43e4-b3ab-54336f293345\\})|(\\{7853bd47-92eb-4734-8371-dad645895f23\\})|(\\{a878339f-334e-433d-b0ac-9c799c8a6df3\\})|(\\{5dd737e5-c9f4-4b1b-86f1-5a3aefecbe26\\})|(\\{5165c342-3181-49d1-bf23-2be2d8d8cd5f\\})|(\\{e94887d3-558f-415f-83d3-4500d0604e4e\\})|(\\{80f26b45-b5db-45df-b92b-dfedfccfe2d1\\})|(\\{ebaf3af1-cd42-44b0-8a0a-5adc22dbb152\\})|(\\{bce1fb2f-1bcd-4a25-a9cd-29cc3fe21dc4\\})|(\\{fc528fa4-3528-4575-93a0-f07428654105\\})|(\\{432a4cf4-8f0c-4ab5-b3e8-e78c17d4b9f8\\})|(\\{260bf76c-b563-41d1-8a7c-0f669306a9f0\\})|(\\{7346a6e5-aec7-43d1-9135-a3b99f538bf3\\})|(\\{22af4413-6bc5-47f4-824e-ab4f15452d02\\})|(\\{8f02443a-3e5e-4160-8eda-04e104dcd804\\})|(\\{b2580f2b-bd01-4f3d-af4c-89b8bf0d2d92\\})|(\\{9e5da5b0-02d9-45f0-869b-05014c2e70cd\\})|(\\{df8a06b4-e785-46d7-87c9-a32ac5700696\\})|(\\{6eeccf3d-479f-47ab-8b9e-3f8e98d6b1de\\})|(\\{d9f5995c-0f9f-4f61-99d3-bde3676f2fa6\\})|(\\{d7f04f66-50b5-47eb-9394-597e3f712c2f\\})|(blablatina@mailnesia\\.com)|(blablatinaa@mailnesia\\.com)|(mykibetesting@gmail\\.com)|(\\{c115630b-bf15-46d5-a5ae-b053e8a99ba9\\})|(mykibetesting@ghghgh\\.com)|(mykibetesting@testmyki\\.com)|(mykibetesting46\\.2@mykitext\\.com)|(\\{9917e548-009a-42bf-bfc7-54206e036ec7\\})|(\\{46e67e2e-236c-4ab9-82ad-12b412fa787f\\})|(\\{a1676ab3-281f-40d6-a636-ce19f7f5f859\\})|(\\{d43dfd69-7730-441d-937d-c437a6c437e6\\})|(\\{1fd94b47-2148-4b97-a4b5-623168904694\\})|(\\{a41a3038-1cc8-49ca-8390-a82f913e1b03\\})|(\\{8f554d4a-54b3-48e8-b2b9-883d80627758\\})|(\\{5d61791a-b908-44a2-9066-8ecd2f70a5bf\\})|(\\{5eaafeba-bb8b-487d-8a52-45862d820f4d\\})|(\\{a3cce15f-afbb-4a03-9ca9-60981827a93e\\})|(\\{dd1031d0-40ba-49f5-97e5-82f371d93ee7\\})|(\\{9f9e1012-2b04-4a3f-a4f9-bb841bc7a1be\\})|(\\{f0c68322-bd46-4993-a526-7791f702f086\\})|(\\{98a9898c-f2aa-4833-bc38-b3625647e49f\\})|(\\{75a72d8c-b801-4487-b83d-a210f2fab6b4\\})|(\\{75a72d8c-b801-4487-b83d-a210f2fab6b5\\})|(\\{dbc0aede-945c-4a9a-bc92-585c0e2835fd\\})|(\\{42d93019-2dd9-49a4-b386-af5d13dbb14c\\})|(\\{fd15bd74-4a8e-43e3-a5a6-8f7bfc316bfe\\})|(\\{9b7226b7-8a21-4dad-9766-7c94a06d69ae\\})|(nancyseopro@gmail\\.com)|(\\{b3ef58d1-d4eb-4e48-9eba-d17600bd2ce8\\})|(\\{9b99b90a-52e3-4e7b-a1e0-5c905bf86ca6\\})|(\\{ed754bf5-b0d0-4ae4-b19b-f240e591c213\\})|(\\{2800be5f-6e20-4b21-9a3c-eb5e94205d9f\\})|(\\{4321d5f9-9a06-4972-9480-6d32d0e9ed12\\})|(\\{2774d25b-053e-44a1-b903-4e86b5bbd2f8\\})|(\\{e155420f-e615-44bc-8d7e-bc73bd0e7ecc\\})|(\\{4e4ef05f-a637-4c4e-bd22-5533e0060ef9\\})|(\\{306f60e4-ef19-4037-9c82-c2898ff17432\\})|(\\{b9374b95-4938-46fa-9507-ef877582c0d2\\})|(\\{dc395849-97bb-4456-9b79-c263a83b40e0\\})|(\\{04ae852b-bbb5-475f-8b25-3da4b15893ba\\})|(\\{91f96cf6-7bde-474b-a0b1-dbfc60db6bdb\\})|(\\{b8aac9a1-08b9-47be-97a4-7e4e0462bdfa\\})|(\\{6db30b4c-0e2d-47d0-abe6-66b778818b42\\})|(\\{4e0ea2d4-786c-4c20-9f1f-12c3734de966\\})|(\\{98ec3e35-c63a-43db-aeb7-050b350f3036\\})|(\\{a6acb773-94f9-4440-9e48-393f50989f5f\\})|(\\{363faa67-80da-4378-a20f-d32492eaab78\\})|(\\{76d55e31-5870-45f3-8862-a7006951cedc\\})|(\\{a2ff5043-dc7b-4c20-b924-135349641b95\\})|(\\{a6cc4862-ac6d-41e9-b208-cf5b280aa41c\\})|(\\{88bfe254-1837-426c-8f48-15235d69663d\\})|(\\{0cffb3be-d34c-4e38-88cc-9e4c68aa5456\\})|(\\{543b980f-e6a4-4077-b633-64ba72cae82a\\})|(\\{d2f2d8e1-7809-44fa-8309-1d41fc09db31\\})|(cht@cobraro\\.com)|(\\{40aac576-c1cc-4ef4-9ff4-90016bf5b54e\\})|(mykibetesting46\\.18@mykitext\\.com)|(\\{afb010de-7961-41d0-ad72-6c6beb05e34c\\})|(\\{25d0b02c-3c47-11e9-8f6b-9be053c51313\\})|(\\{8a146307-6862-474c-b113-8ecf993f1cfd\\})|(\\{4c0f9c72-a81f-49bb-a921-ae24cca16d70\\})|(\\{bd3b1f37-4e61-46cd-b521-925eb3ad3c25\\})|(\\{8d0b1c60-ebb7-4b7b-ae63-c40cf90e68df\\})|(\\{80690353-afb7-455f-b93b-78c7acc19962\\})|(\\{ca593a7a-bd77-4abf-8014-d1fa89006c64\\})|(\\{850be3a2-ca5f-47ad-838c-fe39b006e0d1\\})|(\\{b865704b-ca40-4939-81f1-89ef3b4eca3b\\})|(\\{7ecf61aa-e961-4704-88ac-4d8547ac35e8\\})|(\\{c63d3200-dce7-4090-b383-140a906f9aa2\\})|(\\{14d487f8-6eaa-4bae-9cb4-f604a8e4ac89\\})|(\\{86131ede-587a-4900-8c8c-4779570bff3b\\})|(\\{02229a36-d71c-4999-a319-7a072017dd5c\\})|(\\{e31ad00a-45d1-4397-8b11-9eb0e160787f\\})|(\\{1491c081-4e0a-483f-bdc4-96f5a248438c\\}))$/","prefs":[],"schema":1576757686245,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e2dd31e1-4dfd-4dcc-ad4b-6d9ca4b7ed20","last_modified":1576771657140},{"guid":"/^((\\{df59cc82-3d49-4d2c-8069-70a7d71d387a\\})|(\\{ef78ae03-b232-46c0-8715-d562db1ace23\\})|(\\{4d12d613-99d9-4160-ae6c-5153e5ab0f3c\\})|(\\{41efa652-3fca-4f95-b828-8ed1fba66a84\\})|(\\{4c52e311-8d5b-4a10-95bc-b1b1e029c8d5\\})|(\\{cd627ef1-1059-4ed9-9217-1971806a9ed3\\})|(\\{c01e7fb9-2a24-4cf0-8562-896d53cd5a59\\})|(\\{83d91178-0a1e-4270-a901-b8e83aec3d0b\\})|(blabla@reallyimportantthing\\.com)|(\\{be2309ea-6113-4a99-bd3b-3b88c95cd41d\\})|(\\{02a5f8bb-9ffb-43c3-86d6-072d7316ff6d\\})|(\\{7e874309-fbf3-463b-8690-6ead9efccea0\\})|(\\{7420132f-055f-4f37-a962-3bf9ce42d798\\})|(\\{22c0c5ea-c554-498d-8a66-4c5b4be2f5e8\\})|(\\{ff95833e-5a0a-43cc-910a-e2859bc99ade\\})|(\\{92495a3e-062b-40e7-91e3-6b415c694c57\\})|(mykibetesting47\\.1@mykitext\\.com)|(\\{96cde09b-2d70-41ee-acf6-548728846d48\\})|(mykibetesting47\\.1000@mykitext\\.com)|(\\{98f556db-837c-489e-9c45-a06a6997492c\\})|(\\{bb19d814-d035-4f5d-b291-9b26e4a7fd37\\})|(\\{56a1e8d2-312d-4222-aca5-eee58e0f1234\\})|(\\{9cc56d18-c8fb-436a-861a-128cf2fc580c\\})|(\\{27eebcd1-7ef4-4de3-9d5e-db9e2348c990\\})|(\\{71d3ba6e-e461-44fa-8f27-02c6dbd9b653\\})|(connect@seovpn\\.net)|(\\{859bf655-0266-4f21-9c52-3bd156896259\\})|(\\{adc5c6d8-ac87-4b5f-b885-1adfd00265a7\\})|(\\{d826e099-f797-401f-b363-c03f29a8f9b7\\})|(\\{5621e792-bba7-4e66-a63b-56a9e145c089\\})|(\\{c3e4070e-7845-41fd-8996-8817bbc28790\\})|(\\{eb256992-3498-4262-9c7e-ac82f93aeaca\\})|(\\{da9d1606-dfde-429c-bb6a-63ebe5f8412c\\})|(\\{41e29257-1089-42c8-9d59-add5a0003ffa\\})|(seovpnv5@seovpn\\.net)|(direct-apk-s@eladkarako\\.com)|(\\{376063b4-f6b8-43e9-928f-437ad0ec5333\\})|(\\{b78bf75a-3cea-436b-b081-c9857f295618\\})|(\\{9b8ec882-b5dc-4df2-b9eb-097ba4dcb4b0\\})|(\\{8c0f6ff5-8ea2-4da0-be7b-e588baa02a03\\})|(\\{88295bde-3fc2-4bf9-8090-872d223f2f92\\})|(\\{67582ce8-8c5e-4207-9694-5b0ecc77887b\\})|(\\{db443bc5-4f91-4c82-a14a-298575ff6aba\\})|(\\{d7709ac2-bcde-4d15-a1a7-c459fe592d8e\\})|(\\{40fbe322-ca79-4472-9ac9-0d493f2623da\\})|(\\{77ca86a6-2042-4519-9cd5-4f5fd036d0eb\\})|(youtube-video-downloader@addoncrop\\.com)|(youtube-video-downloader-ff@addoncrop\\.com)|(\\{ed48a832-c064-4d79-bf2e-3c5b21242b3c\\})|(\\{1ce93624-96e6-449d-b038-3380db21cc48\\})|(\\{8957639f-8577-4df9-a1a7-f6d5a9fc9fcd\\})|(\\{c07d8367-6c2d-4a7d-a9ab-207b3104359f\\})|(\\{c4d3f949-60fd-45d5-9cc0-2501319bb60c\\})|(\\{b23bc17b-9fba-4a49-9afe-a1e9cd49c73b\\})|(\\{9f814c7c-0161-4cd4-9d19-50e203f5160c\\})|(\\{0a04ea15-85b4-40ac-a1d1-a6fb5967fb3b\\})|(\\{7bd5a0e9-e8c0-4e64-bda5-7b5310629777\\})|(unlazy@eladkarako\\.com)|(unsecure@eladkarako\\.com)|(xda@eladkarako\\.com)|(direct-filehippo@eladkarako\\.com)|(real-url@eladkarako\\.com)|(\\{63fcde93-baf6-40b5-892c-29cc34365b57\\})|(\\{2913327e-bd0b-4962-adce-2f44407fb521\\})|(\\{88f2e8f9-a7e1-4d68-901d-e5a9c805f4fa\\})|(\\{fd4fcb6a-cad2-43ab-b1c5-efd4d2102de8\\})|(youtube-mp3-converter-ff@addoncrop\\.com)|(\\{0a90b652-0de6-421a-bfee-1d2c5c3ee8fe\\})|(dropeextool@gmail\\.com)|(add_archive@ext\\.xpi)|(\\{47aa471f-3cf1-4a22-9c99-ab5baf326a60\\})|(\\{ac01f6a8-7c30-450b-9979-98d0c7795e11\\})|(\\{2c09761e-2c89-4537-b335-2bd30a7136c2\\})|(\\{c55ddee5-baab-4c90-9948-ca47033a82ce\\})|(\\{5cdb4845-56a8-45df-936b-de8279f2587d\\})|(\\{ea68dd52-2470-4d7c-b563-9a4c6d0e7eab\\})|(\\{01d33686-cab1-4f3b-b2ad-83bc1c35c60a\\})|(\\{fcb61a95-e861-4cf1-801b-f91c75c4714a\\})|(mg3a2mzdsug6fou4k8yk@mg3a2mzdsug6fou4k8yk\\.com)|(wh70nimqtlpwt951i12a@wh70nimqtlpwt951i12a\\.com)|(\\{b64109f0-5d2a-4c86-a38c-886589cb2703\\})|(legacy@context_search\\.com)|(\\{7b49d8bd-1e29-4887-9165-a272f553a154\\})|(\\{a49d6fa5-1967-43ed-b8bd-586f206326cd\\})|(\\{8b14f730-34fa-41e7-9590-d44df583a57f\\})|(\\{01dda21f-3b94-4297-b302-d92535b2e880\\})|(\\{6a33fb2c-3d3a-401f-be54-342ef4d57d1f\\})|(\\{887a4a9a-63ed-4af8-b82b-b68e9c23d39b\\})|(\\{6cae6de5-ff67-4682-a72b-39a1747fc682\\})|(\\{c5b5ac10-8592-4ee9-ad7b-003bb9706f87\\})|(\\{2fb3dc77-de0c-4e34-be3b-13a92bffe898\\})|(\\{82a92837-91de-4282-95d2-bda6d4ac682f\\})|(\\{dae5d3cf-42ba-40ad-85d9-482e25d4682c\\})|(\\{2328a4ad-9d5c-47fa-b580-c7d488bd7a7a\\})|(\\{deb5ba3b-3cf9-4333-99e3-ae2651a5297d\\})|(gespindola@unisuam\\.edu\\.br)|(\\{4518dbc6-fc51-4292-8d85-6eba66959dcb\\})|(\\{7864e12a-8628-415e-8ae8-5ac25edaa420\\})|(\\{b56e7db0-5504-4dd2-8c21-7fb645adae38\\})|(\\{c78ac5a8-0005-4cfb-8a01-5d116a225377\\})|(\\{468301ed-b30f-44f9-85aa-d5ff4c840008\\})|(\\{ae45b0a5-a02e-41df-8a2e-f745d7a7ede3\\})|(\\{f42b032c-3017-44d5-99a1-129524d02494\\}))$/","prefs":[],"schema":1576757713908,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0f3e4d6d-9b1c-4fe1-940a-2871943bac88","last_modified":1576771657136},{"guid":"/^((\\{7e81d973-d606-4f4b-a61f-9c37612c3947\\})|(\\{651d950b-9db7-445f-8263-2dd18265ed3b\\})|(\\{d408b96a-203d-462a-9577-84afb08aa951\\})|(\\{e1fc8acf-65d6-48a2-89d9-410a32bd86da\\})|(\\{1e9302af-a3e1-4c7c-8416-f814dd796cb9\\})|(\\{c4aba9b0-df06-4fc5-8e64-37f99df5e9e9\\})|(\\{24399e9e-50ef-47c3-a728-ebf3af91a0c6\\})|(\\{bdf866a5-ebdd-4e7d-b624-49b53be98a4b\\})|(\\{9ab09f29-f294-4bdd-a58a-c3abea54f032\\})|(\\{b678ee0d-0e1f-433d-8ce8-93e1b51b8834\\})|(\\{6ed0906f-7926-4fc2-ab60-1577631641b2\\})|(\\{0bed1847-54e3-40ac-9cee-0ffd6e4acf1f\\})|(\\{09041dc2-0caa-4955-bf87-de874a0c6b7b\\})|(\\{035ff918-be13-4906-bba3-25153c30b8c4\\})|(\\{e81cbba6-39d5-4f33-a6be-3b99545b54b1\\})|(\\{67d8820b-3078-4835-ab7a-11befb521d33\\})|(\\{c5ad3a58-824c-4db4-8f2c-33b91565417f\\})|(\\{6e289bc1-ab94-44be-adf7-deb1a85cf809\\})|(\\{f6a3d54b-bf6f-4878-881e-a521065412c4\\})|(latest-extension@surviv\\.io)|(\\{3ee8d899-be15-45e4-8c09-a1c10febfb4d\\})|(\\{7ccf5eca-d275-4967-939a-7b9b91d9e0f2\\})|(\\{cd8542c3-3c8e-4fa1-8463-4c5ea7aa25ce\\})|(\\{2994abd2-02a5-4c66-9fd2-38ad8d911324\\})|(\\{10a69518-499c-4339-a733-8ac27166a400\\})|(apzsqkoq0oxjal69l9zr@apzsqkoq0oxjal69l9zr\\.com)|(mbanzzhnky54hoe6jq62@mbanzzhnky54hoe6jq62\\.com)|(\\{ce926acf-d6ab-48b0-8e5d-82257de14011\\})|(\\{c42394d0-1c76-4e5e-8a94-f7c4a2de2ada\\})|(7eylx2qcpshoiehzcl2y@7eylx2qcpshoiehzcl2y\\.com))$/","prefs":[],"schema":1576757777185,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8f82683f-a1c2-4f61-bf9b-8f279d35f746","last_modified":1576771657132},{"guid":"/^((Astro_Connect_BHZNbNOGmL@www\\.astro-connect\\.com)|(Astro_Connect_HRMdSrojBR@www\\.astro-connect\\.com)|(Astro_Connect_lAOPFWMnqc@www\\.astro-connect\\.com)|(Astro_Connect_vMYMzqvERv@www\\.astro-connect\\.com)|(Astro_Daily_Online_1090c71e5da3cd9ab2d6af4985b43f5c@www\\.dailyastrotab\\.com)|(Astro_Daily_Online_clone_b82a3c2703d37e513b428067a34655d8@www\\.dailyastrotab\\.com)|(Astro_Daily_Online_clone_hqNzpeWZrm@www\\.astrodailyonline\\.com)|(Astro_Daily_Online_GzIzTViMnE@www\\.astrodailyonline\\.com)|(AstroDailyOnline\\.com_a7f59cbf31536249d41b97278115b17a@www\\.astrodailyonline\\.com)|(AstroDailyOnline\\.com_VqZjYRsphH@www\\.astrodailyonline\\.com)|(Bible_Quotes_97910bef6e96a7d0569f5fb44b2c607c@www\\.bible-quote\\.co)|(Bible_Quotes_clone_9699f1b771e162467f078c076eb9b695@www\\.bible-quote\\.co)|(Bible_Quotes_clone_wYibuualSr@www\\.bible-quote\\.co)|(Bible_Quotes_PHMyuAzCPa@www\\.bible-quote\\.co)|(blackfridaystoresco@www\\.blackfridaystores\\.co)|(Browse_Manuals_3ff31012f87f9a4c01e1ef723f48eff1@www\\.browsemanuals\\.co)|(Browse_Manuals_ca51c107572ab179fc1e8d4b652b19e1@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_2dbeb0fd48d84ff3a5d3e3a7b5fc3756@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_biPZDTWfln@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_ksNBKBSmge@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_lcMJgmivkD@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_UaWIZDqLBJ@www\\.browsemanuals\\.co)|(Calculate_Fast_uWtHrQKgWv@www\\.nowcalculatefast\\.com)|(cheapflightfaresco@www\\.cheapflightfares\\.co)|(Check_Astro_Today_wkptBasvVf@www\\.checkastrotoday\\.com)|(Check_Astro_Today_YgMcUMJFVL@www\\.checkastrotoday\\.com)|(Check_Astrology_GGZGReDTnd@www\\.checkastrology\\.co)|(Check_Directions_RmiiKOUYTf@www\\.checkdirection\\.com)|(Check_Mails_clone_tdpeulgItk@www\\.check-mail\\.co)|(Check_Mails_iLVZDNXtnY@www\\.checkmailsnow\\.link)|(Check_Mails_ITnrNsNpcj@www\\.checkmailsnow\\.today)|(Check_Mails_Now_clone_oOzxmNgfQn@www\\.checkmailsnow\\.net)|(Check_Mails_Now_clone_vVWZzkqahk@www\\.checkmailsnow\\.net)|(Check_Mails_Now_ePyetjMzel@www\\.checkmailsnow\\.link)|(Check_Mails_Now_IfFzRcCuJa@www\\.checkmailsnow\\.online)|(Check_Mails_Now_OqRkgMLHGo@www\\.checkmailsnow\\.live)|(Check_Mails_Now_pHoBMgvLtK@www\\.checkmailsnow\\.net)|(Check_Mails_Now_QMsZiFhjjH@www\\.checkmailsnow\\.online)|(Check_Mails_Now_qOSRXKCsHK@www\\.checkmailsnow\\.net)|(Check_Mails_Now_vnjdpXGSWk@www\\.checkmailsnow\\.net)|(Check_Mails_vNOoNISpGM@www\\.check-mail\\.co)|(Check_Maps_3ec1ffc98971e67fa854369f9e3486d0@www\\.check-maps\\.co)|(Check_Maps_BezZcNfeab@www\\.check-maps\\.link)|(Check_Maps_bKaiUcBTpN@www\\.check-maps\\.net)|(Check_Maps_clone_RUjCUUeRwF@www\\.checkmaps\\.co)|(Check_Maps_KzXAqTbRZi@www\\.check-maps\\.co)|(Check_Maps_ogQkeJhGuf@www\\.checkmaps\\.net)|(Check_Maps_SwGvtYCSWM@www\\.check-maps\\.org)|(Check_Maps_uYfjFOesyI@www\\.check-maps\\.org)|(Check_My_Mails_iAClnrnvyj@www\\.checkmymails\\.online)|(Check_My_Mails_TYlXbVPRXn@www\\.checkmymails\\.info)|(Check_My_Mails_XvyJVrZWQX@www\\.checkmymails\\.info)|(Check_My_Mails_ZAVfjZCgnv@www\\.checkmymails\\.co)|(Check_My_Speed_Now_OsGaqlODan@www\\.checkmyspeednow\\.com)|(Check_My_Speed_PQiWezZbqs@www\\.checkmyspeed\\.co)|(Check_My_Speed_qvklQhzugJ@www\\.checkmyspeed\\.co)|(Check_Net_Speed_aAaAYSEawi@www\\.checknetspeed\\.online)|(Check_Net_Speed_EKnEHmaiYm@www\\.checknet-speed\\.today)|(Check_Net_Speed_IcfzRgdvIx@www\\.checknet-speed\\.today)|(Check_Net_Speed_rqJpoOAXqE@www\\.checknet-speed\\.today)|(Check_Net_Speed_SoVZYFExRY@www\\.checknetspeed\\.today)|(Check_Net_Speed_sXCrVEDGiO@www\\.checknet-speed\\.today)|(Check_Net_Speed_VQGJrJvlIm@www\\.checknet-speed\\.today)|(Check_Net_Speed_wCexanRKNz@www\\.checknetspeed\\.link)|(Check_Net_Speed_yTZgqCpFPi@www\\.checknet-speed\\.today)|(Check_Net_Speed_zCCNoLFHOF@www\\.checknetspeed\\.online)|(Check_News_clone_qPYbwwKpgF@www\\.checknews\\.co)|(Check_News_dGPwUXsQpF@www\\.checknews\\.co)|(Check_Speed_Test_KohJtFpgLB@www\\.checkspeedtest\\.co)|(Check_Speed_Test_XcYMLbMdlh@www\\.checkspeedtest\\.co)|(Check_Weather_clone_FJgKgEEkzT@www\\.checkweather\\.co)|(Check_Weather_clone_TwXCcjNBdE@www\\.checkweather\\.co)|(Check_Weather_Daily_65ec7723f6fbbe7786d60bd4e2643b1c@www\\.checkweatherdaily\\.com)|(Check_Weather_Daily_YxdeQsIzIP@www\\.checkweatherdaily\\.com))$/","prefs":[],"schema":1576757846784,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ff5d3b75-f26c-47cd-85df-32c193a8d002","last_modified":1576771657128},{"guid":"/^((Check_Weather_Details_26e944ef07a6d60d7e6e109df96aadc6@www\\.checkweatherdetails\\.co)|(Check_Weather_NkuDUpBOfy@www\\.checkweathertoday\\.com)|(Check_Weather_Today_1b92f68f44010297e79e167abdbbad90@www\\.checkweathertoday\\.com)|(Check_Weather_Today_2b5b41fcbe35242dced42efd82346b62@www\\.checkweathertoday\\.com)|(Check_Weather_Today_37f90d6081f0f87dde0eca340268dd06@www\\.checkweathertoday\\.com)|(Check_Weather_Today_421f2bbc2e93713f42200c4cf4184b2f@www\\.checkweathertoday\\.com)|(Check_Weather_Today_647dda58dab18a066b5edcd1bf82f244@www\\.checkweathertoday\\.com)|(Check_Weather_Today_8d106128d380304fbf7cf760284ed189@www\\.checkweathertoday\\.com)|(Check_Weather_Today_a6606d84c174672bdc97a40ae26a7329@www\\.checkweathertoday\\.com)|(Check_Weather_Today_a7ec7b0d21c0b719949374759fa27f9e@www\\.checkweathertoday\\.com)|(Check_Weather_Today_AGSeXIfuyC@www\\.checkweathertoday\\.com)|(Check_Weather_Today_c72d09cea0b53ffdd1a496e376b22696@www\\.checkweathertoday\\.com)|(Check_Weather_Today_cbc523bdd189c28af1505f104443a1cf@www\\.checkweathertoday\\.com)|(Check_Weather_Today_e448585b8ce80f90b04ad34b57c00d6e@www\\.checkweathertoday\\.com)|(Check_Weather_Today_ed0f6099cd2a8e05500657b43f897afc@www\\.checkweathertoday\\.com)|(Check_Weather_Today_EppkRAhhSW@www\\.checkweathertoday\\.com)|(Check_Weather_Today_f06201395c0dc5e1aa9fd68e2059dc18@www\\.checkweathertoday\\.com)|(Check_Weather_Today_fd6b11d8d8cad6bb654cf46a0e100cbe@www\\.checkweathertoday\\.com)|(Check_Weather_Today_FdVgvyMTJo@www\\.checkweathertoday\\.com)|(Check_Weather_Today_leAPNcsALh@www\\.checkweathertoday\\.com)|(Check_Weather_Today_LFHBoYhhIu@www\\.checkweathertoday\\.com)|(Check_Weather_Today_MJoPqcUdAA@www\\.checkweathertoday\\.com)|(Check_Weather_Today_neiEtvLsDn@www\\.checkweathertoday\\.com)|(Check_Weather_Today_NvAaeiHaWs@www\\.checkweathertoday\\.com)|(Check_Weather_Today_OGjNKxAeXE@www\\.checkweathertoday\\.com)|(Check_Weather_Today_uABqfeATcz@www\\.checkweathertoday\\.com)|(Check_Weather_Today_WKqJGOJnJg@www\\.checkweathertoday\\.com)|(Check_Weather_Today_xCOMPlhuXu@www\\.checkweathertoday\\.com)|(Check_Weather_Today_XmOwlHQNSl@www\\.checkweathertoday\\.com)|(Check_Weather_wktudKPpvh@www\\.checkweather\\.co)|(Check_Your_Mail_5697289aed4cf7b184d93e5c53117e07@www\\.check-yourmail\\.co)|(Check_Your_Mail_BZSHAsKTzJ@www\\.check-yourmail\\.co)|(CheckMailPro\\.net_CheZLENbVx@checkmailpro\\.net)|(checkmaps@www\\.check-maps\\.co)|(CheckNetSpeed\\.co_tkZoSRvsPg@www\\.checknetspeed\\.co)|(checknetspeedco@www\\.checknetspeed\\.co)|(Convert_Doc_Online_ptdllbDbTd@www\\.convertdoconline\\.com)|(Convert_File_JHjKeEFAkZ@www\\.convert-file\\.net)|(Convert_File_ocNpurmujk@www\\.myfileconverter\\.org)|(Convert_File_Online_JfGXnualjV@www\\.convertfileonline\\.net)|(Convert_Files_Now_8390db80d295eac08ca91cc1687ebf6d@www\\.convertfilesnow\\.co)|(Convert_Files_Now_afb77fba2ab7b055f10896e538ebd2f6@www\\.convertfilesnow\\.online)|(Convert_Files_Now_fzusJnJyIU@www\\.convertfilesnow\\.co)|(Convert_Files_Now_YEHBPCVZfb@www\\.convertfilesnow\\.online)|(Convert_Files_Online_cf2d8484b67f12d038789a618bae5465@www\\.convertfilesonline\\.co)|(Convert_Files_Online_RptGXHLRjE@www\\.convertfilesonline\\.co)|(Convert_My_Doc_771b3d45ecf0ab980ab0dfdcb9dc1c16@www\\.convertmydoconline\\.com)|(Convert_My_Doc_ofLnqzQpvZ@www\\.convertmydoconline\\.com)|(Convert_My_Document_ynCvryXblL@www\\.convertmypdf\\.online)|(Convert_My_File_0e081da9309e2ee8cbe6e5e1ca3373d1@www\\.convertmyfile\\.co)|(Convert_My_File_2451d924787cf4b696596f09fde42c2f@www\\.convertmyfiles\\.net)|(Convert_My_File_35bbde2206c3bb498f5033610ab82af6@disable\\.convertthefiles\\.online)|(Convert_My_File_68884222b56f8d972093a20f7d5fcf94@www\\.convertmyfile\\.co)|(Convert_My_File_e4a4b99e91c46c64d75d2795ac8e8d58@www\\.convertthefiles\\.online)|(Convert_My_File_GHurKBBhRg@www\\.convertmyfile\\.co)|(Convert_My_File_HlOKyXsynN@www\\.convertmyfile\\.co)|(Convert_My_File_sdaXbdSqCR@www\\.convertmyfiles\\.net)|(Convert_My_File_SiQYEMQoEO@www\\.convertthefiles\\.online)|(Convert_My_File_SJjGzfwuEU@www\\.convertthefiles\\.online)|(Convert_My_File_SzhPQAPUZF@www\\.convertmyfile\\.co)|(Convert_My_File_zOqNatevtM@www\\.convertmyfiles\\.net)|(Convert_My_Files_41f090cd741517aacdcc2c939b5ba94e@disable\\.convertmyfiles\\.net)|(Convert_My_Files_AcwjJWzydY@www\\.convertmyfiles\\.co))$/","prefs":[],"schema":1576757889686,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"92d2dcba-9f62-4b16-8472-843bc53efef5","last_modified":1576771657124},{"guid":"/^((Convert_My_Files_clone_AtaaUykZUt@www\\.convertthefiles\\.co)|(Convert_My_Files_clone_iipeyamXvF@www\\.convert-myfiles\\.link)|(Convert_My_Files_GcaMuSvchr@www\\.convertmyfiles\\.co)|(Convert_My_Files_ITTiqkJdem@www\\.convertmyfiles\\.link)|(Convert_My_Files_mOqWpDqFfS@www\\.convertmy-files\\.link)|(Convert_My_Files_ObjwXXGRmQ@www\\.convertmyfiles\\.net)|(Convert_My_Files_OdEReOXPeW@www\\.convertmyfiles\\.link)|(Convert_My_Files_WdZEfGNUyl@www\\.convertmyfiles\\.link)|(Convert_My_Files_ZSVwsGAvMB@www\\.convert-myfiles\\.link)|(Convert_The_File_ajAXskmxxC@www\\.convertthefile\\.co)|(Convert_The_File_decdQgcxcJ@www\\.convertthefile\\.co)|(Convert_The_File_lfLaRLbLCX@www\\.convertthefile\\.online)|(Convert_The_File_pVtEvdXWNp@www\\.convertthefile\\.co)|(Convert_The_File_YeFOCclGsc@www\\.convertthefile\\.co)|(Convert_The_File_yfsuYhYdaU@www\\.convertthefile\\.net)|(Convert_The_PDF_clone_52933220d40bf58153ba067b1c9c2a0c@www\\.convertthepdf\\.com)|(Convert_The_PDF_clone_929829a88637d12dbf08fd4f782a93b8@www\\.convertthepdf\\.com)|(Convert_The_PDF_clone_WZNDVMgflh@www\\.convertthepdf\\.com)|(Convert_The_PDF_clone_xmrWNxzVTQ@www\\.convertthepdf\\.com)|(Convert_The_PDF_e8cd3270f4b0eec8bd7ec39dfe2b411c@www\\.convertthepdf\\.com)|(Convert_Your_Files_546ea793afdb11f0c3cb3866dcb02379@www\\.convertyourfiles\\.co)|(convertfilestopdfcom@www\\.convertfilestopdf\\.com)|(convertmypdfco@www\\.convertmypdf\\.co)|(convertmypdfonline@www\\.convertmypdf\\.online)|(convertthepdfco@www\\.convertthepdf\\.co)|(convertthepdfcom@www\\.convertthepdf\\.com)|(Cook_With_Me_oYyEsUWTmq@www\\.cookwithme\\.co)|(Coupon_Club_App_20ef9a3e126b1c339a97a60672528026@www\\.couponclubapp\\.co)|(Coupon_Club_App_295813467b3bbbd03ed2574a3a379041@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_dMsjQwVamC@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_pahxCWSfWG@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_tLIovhcRov@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_UKQIyoDcSk@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_wgpiIAHAQx@www\\.couponclubapp\\.co)|(Coupon_Club_App_imfeKPFBRv@www\\.couponclubapp\\.co)|(Coupon_Club_App_vqwFoUyfpL@www\\.couponclubapp\\.co)|(Coupon_Daily_DGaEVQJCVN@www\\.coupondaily\\.today)|(Coupon_Dealer_rRkzTRGEcA@www\\.coupondealer\\.co)|(Coupon_Finder_Hub_8f0b12e405b7568785bcc785d6be30d2@www\\.couponfinderhub\\.com)|(Coupon_Saver_Plus_ffb1e922e2994e938b8f9aeff598c90d@www\\.couponsaverplus\\.co)|(Coupon_Saver_Plus_GTTzegkxqL@www\\.couponsaverplus\\.co)|(Coupon_Store_MlfSWWimyu@www\\.mycouponstore\\.co)|(Coupon_Store_Search_clone_AbsQujloBm@www\\.thecouponstore\\.co)|(Coupons_Flash_clone_TCfVLxCpbB@www\\.couponsflash\\.co)|(Coupons_Flash_fYMZkaoiDb@www\\.couponsflash\\.co)|(Coupons_Flash_WRjXiQAOwJ@www\\.couponsflash\\.co)|(Coupons_Magic_AuVOPUiczY@www\\.couponsmagic\\.co)|(Coupons_Magic_MaDWggNxen@www\\.couponsmagic\\.co)|(Coupons_Magic_ZebFYzkzoN@www\\.couponsmagic\\.co)|(Coupons_Tab_9a56fd9df10d162f000ef7dac2689e8e@www\\.couponstab\\.co)|(Coupons_Tab_sFSnaAFdDP@www\\.couponstab\\.co)|(Coupons_Test_uyywuEAPjT@www\\.couponstab\\.co)|(couponstore@www\\.coupon-store\\.co)|(CutePuppyWallapers\\.com_nicLwcUsfw@www\\.cutepuppywallapers\\.com)|(Daily_Astrology_fPoifgshwY@www\\.daily-astrology\\.online)|(Daily_Astrology_WPGvllFIRz@www\\.my-dailyastrology\\.net)|(Daily_Coupon_Finder_XefkJELubc@www\\.dailycouponfinder\\.co)|(Daily_Coupon_Store_cdowGuTgIr@dailycouponstore\\.co)|(Daily_Coupons_Tab_2c96becddbca0072a93db91266fbfefa@www\\.recipeboardplus\\.com)|(Daily_Coupons_Tab_HRcyzwBTWg@www\\.dailycouponstab\\.com)|(Daily_Deals_Club_yIvuSLfnXr@www\\.dailydealsclub\\.co)|(Daily_Easy_Recipe_OlMvwdldaK@www\\.dailyeasyrecipe\\.com)|(Daily_Easy_Search_95c6b38eb0f04a21212c678a43291d12@www\\.dailyeasysearch\\.com)|(Daily_Easy_Search_MVXtvNQzSj@dailyeasysearch\\.com)|(Daily_File_Converter_23db4a874fc066754c187eef894ccbe7@www\\.dailyfileconverter\\.com)|(Daily_File_Converter_25b0c49fa35ba08d5b33edd7b48f2c92@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_9d4c9a6f7a5c796c84a594619c1e6993@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_b4b0ea08aa61314c75baffd0246b9bcf@www\\.dailyfileconverter\\.com)|(Daily_File_Converter_clone_RDUYhKAKFi@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_clone_yuTWwUVfoL@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_cVmGYeldAg@www\\.dailyfileconverter\\.co))$/","prefs":[],"schema":1576757965088,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6944f445-4df8-4331-93da-1b32fc130849","last_modified":1576771657120},{"guid":"/^((Daily_File_Converter_ooPlASGwFM@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_QMxMSpDXIk@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_UufmFacjfR@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_vaLEkEAYJg@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_VhHvpeSnpU@www\\.dailyfileconverter\\.com)|(Daily_Game_Search_EaLACFoFKS@www\\.daily-gamesearch\\.today)|(Daily_Game_Search_muvQxhbZNu@www\\.dailygamesearch\\.today)|(Daily_Game_Search_VSZsYHVLcK@www\\.dailygame-search\\.today)|(Daily_Game_Search_XpyakjSRnr@www\\.dailygamesearch\\.co)|(Daily_Games_40e88a4d6ecfd9f9af84e1e6c7d76ffe@www\\.gamesdaily\\.online)|(Daily_Games_53113db02f9dd623b086f331ade6d2a6@www\\.game-quest\\.co)|(Daily_Games_a3083ae69e261df3b7d43f5282b250d0@www\\.daily-games\\.co)|(Daily_Games_adebc8294b5d311f8d3b5abd659e09f6@disable\\.daily-games\\.co)|(Daily_Games_b0819ccb9f64203af68bb05e00f36c2a@www\\.dailygame\\.online)|(Daily_Games_BhJRTCwnnH@www\\.game-quest\\.co)|(Daily_Games_BYlaCwrbCa@www\\.dailygame\\.online)|(Daily_Games_c342718e3fb89df8a20b77f635ea0e0f@www\\.dailygame\\.online)|(Daily_Games_caf0a82b928c12c5d67d2e0d142acbcc@www\\.daily-games\\.online)|(Daily_Games_clone_MHxxZxsjgz@www\\.gamesdaily\\.co)|(Daily_Games_d859afcc6f811f0938e06c8b75ac15fc@www\\.gamesdaily\\.online)|(Daily_Games_e6da5a8f129fc23530fc715fd2f7b993@www\\.daily-games\\.today)|(Daily_Games_e858f8f836f17ab5e1c3b269639bc434@www\\.daily-games\\.co)|(Daily_Games_FHAIlDwdZF@www\\.gamesdaily\\.co)|(Daily_Games_IgqcabXnnH@www\\.dailygame\\.online)|(Daily_Games_NOgqDldYjE@www\\.daily-games\\.co)|(Daily_Games_qEgzrEJBZi@www\\.daily-games\\.co)|(Daily_Games_qFMKBgNfOc@www\\.gamesdaily\\.online)|(Daily_Games_vfGCbwKDjq@www\\.daily-games\\.online)|(Daily_Games_VoOHRAgAxg@www\\.daily-games\\.today)|(Daily_Games_vwRTUFvSbP@www\\.gamesdaily\\.online)|(Daily_Games_YoUYAafVuL@www\\.daily-games\\.co)|(Daily_Horoscope_Finder_f4f7f24d489880fa4779c5a4aff5278d@www\\.dailyhoroscopefinder\\.com)|(Daily_Local_Weather_RTvDyyEuxy@www\\.dailylocalweather\\.net)|(Daily_Mail_Tab_AMkImujKsG@www\\.dailymailtab\\.com)|(Daily_Mail_Tab_clone_BWhcKvnbJG@www\\.dailymailtab\\.com)|(Daily_Mail_Tab_clone_jkCRhwZjtG@www\\.dailymailtab\\.com)|(Daily_Mail_Tab_xMqjhKMBPX@www\\.dailymailtab\\.com)|(Daily_Net_Speed_gcVjCfMtcE@www\\.dailynetspeed\\.com)|(Daily_News_Reports_707e3c94519dc4f338e25415097fc409@disable\\.dailynewsreports\\.co)|(Daily_News_Reports_bc4cc8745c5c9113add6bbcc7a4e891d@www\\.dailynewsreports\\.co)|(Daily_News_Reports_MgfPHeboNM@www\\.dailynewsreports\\.co)|(Daily_News_Reports_RhfPUMZyKi@www\\.dailynewsreports\\.co)|(Daily_Package_Tracker_qJQSJblDIk@www\\.dailypackagetracker\\.com)|(Daily_PDF_Converter_cAlFsFtCmX@www\\.dailypdfconverter\\.com)|(Daily_Radio_Hub_4b6408c6028360c91e55070e8a8b6c07@www\\.dailyradiohub\\.com)|(Daily_Radio_Hub_CEgdHfrHfk@www\\.dailyradiohub\\.com)|(Daily_Recipe_Finder_LpHSZIWYdz@www\\.dailyrecipefinder\\.com)|(Daily_Recipe_Ideas_clone_xqrPqfTBif@www\\.dailyrecipeideas\\.co)|(Daily_Recipe_Ideas_dyhmXRtGGY@www\\.dailyrecipeideas\\.co)|(Daily_Recipe_Now_IXRimkpfYA@www\\.dailyrecipenow\\.com)|(Daily_Recipe_Search_wHQTXcltvc@www\\.dailyrecipesearch\\.co)|(Daily_Search_3e2f26bf46061e1fb6386bb2bc9fb3b1@www\\.dailysearch\\.co)|(Daily_Search_clone_RAfKSlJEDD@www\\.dailysearch\\.co)|(Daily_Search_Plus_b60c5575e4d5158e20036cb104c00bba@www\\.dailysearchplus\\.com)|(Daily_Search_Plus_f693ecbe1af3da784c31114acc402ec4@www\\.dailysearchplus\\.com)|(Daily_Search_Plus_oldtAgRAUL@www\\.dailysearchplus\\.com)|(Daily_Search_Plus_xCxtAmrZoI@www\\.dailysearchplus\\.com)|(Daily_Search_Web_f70aa46e9caf1e58a04aad7917c8d0aa@www\\.dailysearchweb\\.com)|(Daily_Search_Web_PvsRmlCiKL@www\\.dailysearchweb\\.com)|(Daily_Speed_Check_475174e16d0d170b447b7002797efade@www\\.dailyspeedcheck\\.com)|(Daily_Speed_Check_uqFEhmPbDE@www\\.dailyspeedcheck\\.com)|(Daily_Speed_Checker_1c6d34e9410cb2652228c18bed9eaf67@www\\.dailyspeedchecker\\.com)|(Daily_Speed_Checker_wcntWZhyvr@www\\.dailyspeedchecker\\.com)|(Daily_Transit_Guide_a4b1896ed15535c97cf0c19cb3960680@www\\.dailytransitguide\\.com)|(Daily_Transit_Guide_rOdLEeRGxw@www\\.dailytransitguide\\.com)|(Daily_Weather_Finder_94b59c3b4bf2e42f392be55572d25ac2@www\\.dailyweatherfinder\\.com)|(Daily_Weather_Finder_QhhPAMLPai@www\\.dailyweatherfinder\\.com)|(Daily_Weather_Forecast_cgMvSNkeBN@www\\.dailyweatherforecast\\.net))$/","prefs":[],"schema":1576757992072,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4acfb151-a1d2-4468-9794-5816fadef1b7","last_modified":1576771657116},{"guid":"/^((Daily_Weather_Forecast_clone_CSwGEuwNKr@www\\.dailyweatherforecast\\.co)|(Daily_Weather_Forecast_f7824fa0dfff1fdbe9f36ad33ecfa4b4@www\\.dailyweatherforecast\\.net)|(Daily_Weather_Forecast_kclkQdSlIO@www\\.dailyweatherforecast\\.co)|(DailyCoupons\\.store_zWkmEkoPgk@www\\.dailycoupons\\.store)|(DailyJobSearch\\.co_EKJtPSSMhB@www\\.dailyjobsearch\\.co)|(DailyJobsSearch\\.net_a2ba2cb41169ec0e7e1e381ae8cec363@www\\.dailyjobssearch\\.net)|(dailyjobssearch@www\\.dailyjobssearch\\.co)|(dailyjobssearchnet@www\\.dailyjobssearch\\.net)|(DailyLocalWeather\\.net_clone_jVyHpUvXAl@www\\.dailylocalweather\\.net)|(DailyLocalWeather\\.net_vzkDkoQoVN@www\\.dailylocalweather\\.net)|(DailyNetSpeedtest\\.co_HWGHkbkKGm@dailynetspeedtest\\.com)|(dailynewsupdatesinnet@www\\.dailynewsupdates\\.in\\.net)|(dailynewsupdatesonline@www\\.dailynewsupdates\\.online)|(DailyRecipeOnline\\.net_bVwwSbDKSk@www\\.dailyrecipeonline\\.net)|(DailyRecipeSearch\\.co_zXrOSYpFeH@www\\.dailyrecipesearch\\.co)|(DailyRecipeSearch\\.info_VJInpLJmig@www\\.dailyrecipesearch\\.info)|(Dictionary_Pro_App_HbjmnxLIZN@www\\.dictionaryproapp\\.com)|(Dictionary_Pro_PquztTZbLu@www\\.dictionarypro\\.co)|(Dictionary_Xpress_QeRWOLUqwj@www\\.mywordscribent\\.com)|(Directions_Finder_190cb6038fd06edbc48ea5423cc43227@www\\.finddirections\\.co)|(Directions_Finder_1e30de3303446cde1d03ee219a13f572@www\\.finddirection\\.online)|(Directions_Finder_868daddf032f443da0515e9c976159c9@www\\.finddirections\\.co)|(Directions_Finder_86fa782f7bd705c2e644aa07f6218661@www\\.finddirections\\.co)|(Directions_Finder_AcrlxGosjE@www\\.finddirections\\.co)|(Directions_Finder_BZDovhcQyV@www\\.findroutes\\.co)|(Directions_Finder_c005f28d896373d557e03e80f4b57d37@www\\.findroutes\\.co)|(Directions_Finder_e183b060f3f35940a9291cd2ed4791e3@www\\.finddirections\\.co)|(Directions_Finder_lHmoDZAZNo@www\\.finddirections\\.co)|(Directions_Finder_LKGiGUhRDf@www\\.finddirections\\.co)|(Directions_Finder_Now_NMzpPonhyb@www\\.directionsfindernow\\.com)|(Directions_Finder_QTCjmhKxhD@www\\.finddirection\\.online)|(Directions_Finder_V1_0c00deff96164188875cce59cb27ebb1@www\\.finddirections\\.co)|(Directions_Finder_V1_4668ec661e1b94a2474a1c1675158eb2@www\\.finddirections\\.co)|(Directions_Finder_V1_clone_BPDzngiFeD@www\\.finddirections\\.co)|(Directions_Finder_V1_clone_BPDzngiFeDic@www\\.finddirections\\.co)|(Directions_Finder_V1_clone_lkSfnVsTUN@www\\.finddirections\\.co)|(Directions_Finder_V1_clone_mPiHTaJZJi@www\\.finddirections\\.co)|(Directions_Finder_V1_de58f7b93a8d173bc071b3730806cf8c@www\\.finddirections\\.co)|(Directions_Finder_V1_ffc19350a43c8bf4db65930f95663016@www\\.finddirections\\.co)|(Directions_Finder_V1_xivwbBBnLX@www\\.finddirections\\.co)|(Directions_Found_1dc1261209c6647a8288498e180d5eef_2@www\\.directionsfound\\.com)|(Directions_Found_1dc1261209c6647a8288498e180d5eef_23@www\\.directionsfound\\.com)|(Directions_Found_1dc1261209c6647a8288498e180d5eef@www\\.directionsfound\\.com)|(Directions_Found_clone_hbtpEmPzTJ@www\\.directionsfound\\.com)|(Directions_Found_clone_hdjMdQYTvN@www\\.directionsfoundnt\\.com)|(Directions_Found_GLuiPTQCww@www\\.directionsfound\\.com)|(Directions_Found_mVBuOLkFzz@www\\.directionsfoundnt\\.com)|(Directions_Found_XmorLjjHtu@www\\.directionsfound\\.com)|(Directions_Quest_clone_qQtdSaDtmD@www\\.directionsquest\\.co)|(Directions_Quest_DuwqkuyNfU@www\\.directionsquest\\.co)|(Directions_Quest_FwNcHagZgz@www\\.directionsquest\\.co)|(Directions_Quest_XQDqehhuWR@www\\.directionsquest\\.co)|(Doc_Converter_0a0ede466240dc417f4f6d8594acd9a5@www\\.convertthepdf\\.co)|(Doc_Converter_Hub_sTIWsdHRFE@www\\.docconverterhub\\.com)|(Document_Converter_CZmoJDQssK@www\\.convertpdfnow\\.co)|(Driving_Directions_App_mUxSdxsgni@www\\.drivingdirectionsappn\\.org)|(Driving_Maps_Online_clone_jtpQCXsDzM@www\\.drivingmapsonline\\.com)|(Driving_Maps_Online_evmZdmROJS@www\\.drivingmapsonline\\.com)|(Easy_Directions_Now_a9718312f4e22a699b573a1cf508ccc9@www\\.easydirectionsnow\\.com)|(Easy_Directions_Now_TBmyGrTUZj@www\\.easydirectionsnow\\.com)|(Easy_Doc_Converter_393a2418db4856b1ec2d790e9b30ffc2@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_5a92e4df39328183b24ce0103f3dea19@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_79478769a5477116f6efd505f3b0cf15@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_a1be8989ddea6e7543bea0b843c6a2ba@www\\.easydocconverter\\.com))$/","prefs":[],"schema":1576758021535,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"125bc0c5-76dc-4426-b682-1c321843d645","last_modified":1576771657110},{"guid":"/^((Everyday_Astro_YjPsaMBBWj@www\\.everydayastro\\.online)|(Everyday_File_Converter_ed35274eecd2df2822fa50636b6d9c2c@www\\.everydayfileconverter\\.com)|(Everyday_File_Converter_NldTeZANPx@everydayfileconverter\\.com)|(Everyday_Horoscope_App_zsZEtFjPki@www\\.everydayhoroscopeapp\\.com)|(Everyday_News_Tab_eebc4520552865e4fa1472681eeb5a3d@www\\.everydaynewstab\\.com)|(Everyday_News_Tab_zARNxTxEiu@www\\.everydaynewstab\\.com)|(Everyday_Radio_1f1b997a2d674af1b684dd5457ae5356@www\\.myeverydayradio\\.com)|(Everyday_Radio_mTDVrswpBm@www\\.myeverydayradio\\.com)|(Everyday_Recipe_Guide_566183664fdda4ba4e650fa5115c6cfe@www\\.recipeboardplus\\.com)|(Everyday_Recipe_Guide_tiorNZIoRi@www\\.everydayrecipeguide\\.com)|(Everyday_Weather_Forecast_2a934b9a097e1f619a7066c2530ef60f@www\\.everydayweatherforecast\\.com)|(Everyday_Weather_Forecast_sPyCkYArmT@www\\.everydayweatherforecast\\.com)|(EverydayAstro\\.net_kTOmUMbUtk@www\\.everydayastro\\.net)|(ext_11637@www\\.map-buddy\\.net)|(extensionid@www\\.dailynewsupdates\\.in\\.net)|(extensionid@www\\.moviequest\\.co)|(Fast_Mail_Tab_BfwMzfJAdm@www\\.fastmailtab\\.com)|(Fast_Mail_Tab_clone_LPzCObgNLo@www\\.fastmailtab\\.com)|(Fast_Map_Finder_ae4f5334a91035cf082f4c9e0983fc15@www\\.fastmapfinder\\.com)|(Fast_Map_Finder_YxRYGsJekN@www\\.fastmapfinder\\.com)|(Federal_Forms_clone_NgrjNsxcUN@www\\.easyformsfinder\\.com)|(Federal_Forms_EBqDdPvCFF@www\\.easyformsfinder\\.com)|(File_Convert_Plus_clone_juAtPozquc@www\\.fileconvertplus\\.com)|(File_Convert_Plus_JfRqzQtMeK@www\\.fileconvertplus\\.com)|(File_Convert_Pro_hOblzzFvJL@www\\.fileconvertpro\\.co)|(File_Converter_37ced8ee9475a347afab0d20660cef63@www\\.pdf-convertn\\.co)|(File_Converter_clone_aWSjJQAWwa@www\\.pdf-convertn\\.co)|(File_Converter_Hub_wnuDyqJFOe@www\\.fileconverterhub\\.com)|(File_Converter_Live_hWXrCtYfna@www\\.fileconverterlive\\.com)|(File_Converter_Tab_63009c33f9d202492393146d23df95d0@www\\.fileconvertertab\\.com)|(File_Converter_Tab_bEfXMQovol@info\\.fileconvertertab\\.com)|(File_Converter_Tab_bHaEkegUAR@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_8d6f907bab9ab53a83b5d8a4505433f4@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_cCZhwgyHDr@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_gNPUWukwdG@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_pweczfyyvv@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_qygWFXkHri@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_XpUyfDDJsm@info\\.fileconvertertab\\.com)|(File_Converter_Tab_dd756ad1b37f999650834591ffd21464@www\\.fileconvertertab\\.com)|(File_Converter_Tab_deb5d97364d6e9ba4d04089f90afa043@www\\.fileconvertertab\\.com)|(File_Converter_Tab_V2_8fe7b393ec2d293e54abf1aada3bcb94@www\\.fileconvertertab\\.com)|(File_Converter_Tab_V2_clone_DrmwsZhTkw@www\\.fileconvertertab\\.com)|(File_Converter_Tab_XHmAqSTCbP@www\\.fileconvertertab\\.com)|(File_Converter_xdbvCaJxrb@www\\.myfileconverter\\.co)|(FileConvertPro_clone_gDJuPpeLjD@www\\.fileconvertpro\\.co)|(FileConvertPro_mLscTidBER@www\\.fileconvertpro\\.co)|(Find_Coupons_Daily_dxJFJCQcpS@www\\.finddaily-coupons\\.today)|(Find_Coupons_Daily_lIKYSwDOhr@www\\.findcouponsdaily\\.co)|(Find_Coupons_Daily_RjrQWQzreq@www\\.findcoupons-daily\\.today)|(Find_Coupons_Daily_UhahUhrtxP@www\\.find-couponsdaily\\.today)|(Find_Coupons_Daily_wUpPOFfkzc@www\\.findcouponsdaily\\.today)|(Find_Coupons_OWfYsAQras@www\\.findcoupons\\.live)|(Find_Daily_Coupons_6ea44d6d01a700e213070c692343e03d@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_71b6faf57612a3de273a55a228ec1703@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_a4c3252d270bd03507cfe77d8397e8b6@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_cf887ce0c30cf483939356fd9dc4753a@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_clone_sCMBPIejep@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_dBVmCxAeYJ@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_gSKACLrhGQ@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_sVYmYFumfX@www\\.finddailycoupons\\.com)|(Find_Daily_Games_gZnVxpnfzi@www\\.finddailygames\\.com)|(Find_Daily_Games_JHwXAakSOO@www\\.finddailygames\\.com)|(Find_Daily_Games_osIGANaBXk@www\\.finddailygames\\.com)|(Find_Daily_Games_rcRvgxUzAu@www\\.finddailygames\\.net)|(Find_Directions_euMftZJtWV@www\\.finddirections\\.co)|(Find_Easy_Directions_2252eb9a9264ef1685d45b8fe13f6a43@www\\.findeasydirections\\.com))$/","prefs":[],"schema":1576758100930,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a69a7be4-4f76-4c00-aa17-d1bbe66fd2db","last_modified":1576771657102},{"guid":"/^((Find_Easy_Directions_541d5ace0c28764eb8e88d98d0e28740@www\\.findeasydirections\\.com)|(Find_Easy_Directions_90d67b798ba3070d90d32d74ff70d1c8@www\\.findeasydirections\\.com)|(Find_Easy_Directions_gbailzSvPb@www\\.findeasydirections\\.com)|(Find_Easy_Directions_YiGOrfTNFT@www\\.findeasydirections\\.com)|(Find_Easy_Directions_zcYSFoeMgF@www\\.findeasydirections\\.com)|(Find_Jobs_Daily_clone_ZryioBAtLo@www\\.findjobsdaily\\.co)|(Find_Jobs_Daily_FpBesVkFoN@www\\.findjobsdaily\\.co)|(Find_Jobs_Daily_TxUobqrfTu@www\\.findjobsdaily\\.co)|(Find_Jobs_Daily_ZLJpRXDhXK@www\\.findjobsdaily\\.co)|(Find_Recipes_Online_kSjCdoBAFX@www\\.findrecipesonline\\.co)|(Find_Templates_Quick_LyRzafuNXE@www\\.findtemplatesquick\\.com)|(FindJobsDaily\\.net_ilHEYezmJM@www\\.findjobsdaily\\.net)|(FlirtyWallPapers\\.online_IEZjVbwbSl@www\\.flirtywallpapers\\.online)|(Forbes_Search_aOPKgBmHyw@forbes\\.dailynewsupdates\\.online)|(Free_Directions_Finder_KEDDaoHBQl@www\\.freedirectionsfinder\\.com)|(Free_Manuals_KkQAhLuDkf@www\\.browsemanuals\\.co)|(Game_Buddy_632c7a501a256d43af845a6c03d36c65@www\\.game-buddy\\.co)|(Game_Buddy_ef910a8045b370e3df14a73fb05c0ee1@www\\.game-buddy\\.co)|(Game_Buddy_emPnaqsxzR@www\\.game-buddy\\.co)|(Game_Buddy_ISrmuaRAHN@www\\.game-buddy\\.co)|(Game_Quest_3c4a7895681b0a9d0860d5397036f146@www\\.game-quest\\.co)|(Game_Quest_bd98408b6a98a0b19825f9ff5023f0e7@www\\.game-quest\\.co)|(Game_Quest_bTqWKJtOPG@www\\.games-quest\\.co)|(Game_Quest_clone_40442f8034b58a60951b7a3cdf5fe97a@www\\.game-quest\\.co)|(Game_Quest_clone_rajfrvipoU@www\\.game-quest\\.co)|(Game_Quest_GHFSWLkdAO@game-quest\\.com)|(Game_Quest_hMqLrbOzmC@www\\.game-quest\\.co)|(Game_Quest_NDifumcXqQ@www\\.games-quest\\.org)|(Game_Quest_nilKwpfZen@www\\.game-quest\\.co)|(Game_Quest_rXONqXzsZj@www\\.games-quest\\.org)|(Game_Search_BbtNWEfPKy@www\\.daily-gamesearch\\.today)|(Game_Search_eOUjptBQzk@www\\.gamessearch\\.live)|(Game_Search_eymrhMPxLu@www\\.dailygame-search\\.today)|(Game_Search_kZDJlntNQs@www\\.gamesearch\\.link)|(Game_Search_MdsPFfXaXl@www\\.game-search\\.link)|(Game_Search_mgkCKPquHh@www\\.dailygamesearch\\.co)|(Game_Search_mvoOwLJOeY@www\\.games-search\\.link)|(Game_Search_nKMbWrakmm@www\\.dailygamesearch\\.today)|(Game_Search_PDKlEPjhDw@www\\.games-search\\.link)|(Game_Tab_BoRsmjioSA@www\\.gametab\\.co)|(Game-Quest_WhVgUeMwZI@www\\.game-quest\\.co)|(GameQuest\\.website_IwplUMSUhd@www\\.gamequest\\.website)|(GameQuest\\.website_ZGhTUTKRhi@www\\.gamequest\\.website)|(Games_Daily_clone_UAnrFPWGxF@www\\.games-daily\\.net)|(Games_Daily_EVSeZYmPYK@www\\.games-daily\\.today)|(Games_Daily_nRQyywoJPm@www\\.games-daily\\.net)|(Games_Daily_SPRlOvPjlj_clone@www\\.games-daily\\.co)|(Games_Daily_SPRlOvPjlj@www\\.games-daily\\.co)|(Games_Daily_WnvPyaqCdX@www\\.games-daily\\.today)|(Games_Finder_Online_98e08661ac2ba2826d702b9de87c3fbc@www\\.gamesfinderonline\\.com)|(Games_Finder_Online_YCDTopLIiv@www\\.gamesfinderonline\\.com)|(Games_Quest_antJJCJcBk@www\\.games-quest\\.website)|(Games_Quest_clone_aTlPJPmJEm@www\\.games-quest\\.today)|(Games_Quest_OxdmpwtACa@www\\.games-quest\\.today)|(Games_Quest_qmlUmTihvS@www\\.gamesquest\\.today)|(Games_Quest_vnzuqLPUQQ@www\\.gamesquest\\.today)|(Games_Quest_WEpNvcmerl@www\\.games-quest\\.today)|(Games_Quest_wKWBKbLjpl@www\\.games-quest\\.today)|(Games_Quest_Zafeeizthl@www\\.games-quest\\.today)|(Games_Quest_ZVRwioHOnh@www\\.games-quest\\.online)|(Games_Search_FPDqSSnSlY@www\\.game-search\\.today)|(Games_Search_HAfeXALvGY@www\\.gamesquest\\.online)|(Games_Search_LSrSMudgNL@www\\.gamessearch\\.co)|(Games_Search_mDdAwBVasx@www\\.gamesearch\\.today)|(Games_Search_RgMSPqlluj@www\\.gamessearch\\.xyz)|(Games_Search_sfZySehUmo@www\\.gamessearch\\.online)|(Games_Search_shZkWBHwut@www\\.gamessearch\\.online)|(Games_Search_USoWCKOlGq@www\\.finddailygames\\.com)|(Games_Search_uXqDhnPDBw@www\\.gamesearch\\.today)|(Games_Search_vCVYFXcOnV@www\\.gamessearch\\.org)|(Games-Daily\\.net_NainTzjpve@www\\.games-daily\\.net)|(Get_Coupons_awAkTqqCxd@www\\.getcoupons\\.live)|(Get_Coupons_RGWEhnHIbr@www\\.getcoupons\\.live)|(Get_Directions_07d014a7ed5bba404eb7f2b1058ad2cb@www\\.getdirectionsmapsn\\.com)|(Get_Directions_CBakCNUUbo@www\\.map-finder\\.link)|(Get_Directions_clone_kxIvsTsDgE@www\\.getdirectionsmapsn\\.com)|(Get_Directions_HlEHEMFRkj@www\\.getdirectionsmapsn\\.com))$/","prefs":[],"schema":1576758133784,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f6c1160a-fa98-4541-bb03-cd6d02b825e3","last_modified":1576771657097},{"guid":"/^((Get_Directions_Quick_89a733fca5e8b5436c95fcec40ca5573@www\\.getdirectionsquickn\\.online)|(Get_Easy_Directions_b3f03018f3d77ab1327550851c2a2f94@www\\.geteasydirections\\.com)|(Get_Easy_Directions_FeEnVDLKMP@www\\.geteasydirections\\.com)|(Get_Easy_Maps_a92ae443f4d44fdbcf507f73934c5bff@www\\.geteasymaps\\.co)|(Get_Easy_Maps_clone_RsVkJokaAq@www\\.geteasymaps\\.co)|(Get_Easy_Maps_clone_TgEXtwRoQx@www\\.geteasymaps\\.co)|(Get_Easy_Maps_e66ef79b1701806812d764c8b2e87673@www\\.geteasymaps\\.co)|(Get_Easy_Maps_eUfwfdzBJN@www\\.geteasymaps\\.co)|(Get_Easy_Maps_f9341eebd729ecc7e5389769a7ac8c27@www\\.geteasymaps\\.com)|(Get_Easy_Maps_NoApMGqlhQ@www\\.geteasymaps\\.com)|(Get_Easy_Maps_PiUUlEtxCz@www\\.geteasymaps\\.co)|(Get_Easy_Maps_uopDIWsrOB@www\\.geteasymaps\\.co)|(Get_Easy_Maps_VZVoDVzTZP@www\\.geteasymaps\\.co)|(Get_Easy_Search_5a1bd32b3bb3d079d253b6fe048c6d4e@www\\.geteasysearch\\.com)|(Get_Easy_Search_b1272ab7a446984d2e1ddbf0b94016d0@www\\.geteasysearch\\.com)|(Get_Easy_Search_zjvfbWwXrA@www\\.geteasysearch\\.com)|(Get_Forms_Today_HmKpwNqqgw@www\\.getformstoday\\.com)|(Get_Local_Forecast_KSKPskMcZy@www\\.getlocalforecastn\\.com)|(Get_Map_Finder_clone_AVJpxOfDmZ@www\\.getmapfinder\\.link)|(Get_Map_Finder_clone_BGAfKOwTad@www\\.getmapfinder\\.link)|(Get_Map_Finder_clone_hwWbfqrHDh@www\\.getmapfinder\\.link)|(Get_Map_Finder_clone_YUnreTXyJo@www\\.getmapfinder\\.link)|(Get_Map_Finder_RDbuumWRlP@www\\.getmapfinder\\.link)|(Get_Map_Finder_vJqBDvfVEi@www\\.getmapfinder\\.link)|(Get_Map_Finder_zORQiNFbOh@www\\.getmapfinder\\.co)|(Get_Online_Converter_AbNmflhxCb@www\\.getonlineconverter\\.com)|(Get_Online_Converter_clone_255e60767a18e291b0b8b3cabd6f382c@www\\.getonlineconverter\\.com)|(Get_Online_Converter_clone_oCShEwyADp@www\\.getonlineconverter\\.com)|(Get_Online_Maps_clone_hGHOrvKQpE@www\\.getonlinemapsnow\\.com)|(Get_Package_Tracker_5a92260cd5155c5f26b16207532e9c5e@www\\.getpackagetracker\\.com)|(Get_Package_Tracker_clone_CztbvYsSLz@www\\.getpackagetracker\\.com)|(Get_Speed_Checker_CdqYfmDnVO@www\\.getspeedchecker\\.com)|(Get_Speed_Test_Ace_efd65663a0f689684ed5b60337c519ac@www\\.getspeedtestace\\.com)|(Get_Speed_Test_Ace_uNUzxBsIBO@www\\.getspeedtestace\\.com)|(GetOnlineConverter_62dc3ed61ba55b471bc5952d64f22e34@www\\.getonlineconverter\\.com)|(GetOnlineConverter_clone_hmwBWihZaf@www\\.getonlineconverter\\.com)|(Global_Weather_2abbd1bfe1f92474dc556a6abd23c97e@www\\.global-weathern\\.online)|(Global_Weather_qPjJvKHHjn@www\\.global-weathern\\.online)|(Go_Package_Tracker_CDyUCsNhYI@www\\.gopackagetracker\\.com)|(Go_Search_Easy_3b073071b9f9727f2a3c22961bc6aae7@www\\.gosearcheasy\\.com)|(Go_Search_Easy_fCSPxmpWqN@www\\.gosearcheasy\\.com)|(Go_Search_Easy_MTOfbhqqMt@www\\.gosearcheasy\\.com)|(Go_Video_Converter_clone_AtpxxXDpvq@www\\.govideoconverter\\.com)|(Go_Video_Converter_clone_b78d64ef3f6d32d836cb9cb45f64f3d4@www\\.govideoconverter\\.com)|(Go_Video_Converter_clone_ENqGVUhAYo@www\\.govideoconverter\\.com)|(Go_Video_Converter_cXhEAmNOBA@www\\.govideoconverter\\.com)|(Go_Video_Converter_daef20a38c38415e2819357035444fa2@www\\.govideoconverter\\.com)|(Go_Video_Converter_YLdugTFiBs@www\\.govideoconverter\\.com)|(holidaygiftingco@www\\.holidaygifting\\.co)|(Holy_Bible_daily_22c0372905eb878bf90eb726cf1c4cd7@www\\.holybibledaily\\.com)|(Holy_Bible_Daily_36d9839f134dba7393dcd1ce19e35114@www\\.holybibledaily\\.com)|(Holy_Bible_daily_clone_BwGilqVxow@www\\.holybibledaily\\.com)|(Holy_Bible_Daily_clone_TdHKbGqxyp@www\\.holybibledaily\\.com)|(Holy_Bible_daily_WRzbIpWLfR@www\\.holybibledaily\\.com)|(Horoscope_Finder_CQAkIhPhib@www\\.horoscopefinder\\.co)|(Hunt_New_Jobs_MQlcPgVQSY@www\\.huntnewjobs\\.com)|(Hunt_New_Jobs_TeypdaDdsy@www\\.huntnewjobs\\.com)|(Inbox_Tab_1549897502@www\\.inboxtab\\.com)|(Inbox_Tab_LTnzVZlfKv@www\\.inboxtab\\.com)|(Inbox_Tab_rOksOtIddG@www\\.inboxtab\\.com)|(Instant_Doc_Converter_1264fb8b31af7c6c3f56c4c33b825dab@www\\.instantdocconverter\\.com\\.removed)|(Instant_Doc_Converter_clone_LWgHiMFzyN@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_clone_OeEmGVRjdr@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_fe41778b25f65137ed606033eea89902@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_hMMLIeTKQH@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_UJTpBaxVPV@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_vZPKbExySk@www\\.instantdocconverter\\.com))$/","prefs":[],"schema":1576758169317,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9acbbf4c-ef5c-46d4-bc1d-f520b8ced595","last_modified":1576771657093},{"guid":"/^((Instant_Email_Login_3fff03c5bbd668d2f7093d5491f66518@www\\.instantemaillogin\\.com)|(Instant_Email_Login_WRGGywlQTy@www\\.instantemaillogin\\.com)|(Instant_Email_Plus_KAZiCvZFWB@www\\.instantemailplus\\.com)|(Instant_Inbox_clone_QKZmbMSVkA@www\\.instantinbox\\.co)|(Instant_Inbox_clone_QmVdpyuWwT@www\\.instantinbox\\.co)|(Instant_Inbox_clone_VlVOmivYUN@www\\.instantinbox\\.co)|(Instant_Inbox_clone_XLjUGcrTgI@www\\.instantinbox\\.co)|(Instant_Inbox_clone_YxmUgAsOrZ@www\\.instantinbox\\.co)|(Instant_Inbox_pzclglfDGq@www\\.instantinbox\\.co)|(Instant_Inbox_qnRYsobGem@www\\.instantinbox\\.co)|(Instant_Maps_clone_clone_zqdkjyMgdQ@www\\.checkmaps\\.co)|(Instant_Maps_ZefayBJOcD_test@www\\.checkmaps\\.co)|(Instant_Maps_ZefayBJOcD@www\\.checkmaps\\.co)|(Instant_Net_Speed_7291e707ced30428e6ed71611c3071ed@www\\.instantnetspeed\\.com)|(Instant_Net_Speed_iEjKvJreAi@www\\.instantnetspeed\\.com)|(Internet_Speed_Test_cf6c9b84dd607bc049898130dd8aa403@www\\.fastinternetspeedtestn\\.com)|(Internet_Speed_Test_RCgVciwcSD@www\\.fastinternetspeedtestn\\.com)|(Job_Search_Online_53e3be5488ce961c12d4341c2e3c830d@www\\.jobssearchonline\\.co)|(Job_Search_Online_clone_20bb80efe94b528ef6fa06730d560cbb@www\\.jobssearchonline\\.co)|(Job_Search_Online_clone_fUDgRmLxrl@www\\.jobssearchonline\\.co)|(Job_Search_Online_clone_jxgyVIROvt@www\\.jobssearchonline\\.co)|(Job_Search_Online_qNOPIVBSge@www\\.jobssearchonline\\.co)|(Job-Portal_dPNxZEZiQF@www\\.job-portal\\.co)|(Jobs_Now_jkAqvfwqNy@jobsnow\\.com)|(Just_Search_Easy_PJxNIOGbZS@www\\.justsearcheasy\\.com)|(justlovepetsonline@www\\.justlovepets\\.online)|(KC_Recipe_Finder_f8541026d8d56f16ba1db6664ac76ed8@www\\.testextension\\.online)|(LifeLock_Safe_Search_LDKQZxofGQ@searchsafe\\.lifelock\\.com)|(Live_Email_4cacc77ba79f2e88d808404b1487e27d@www\\.liveemail\\.co)|(Live_Email_clone_avmFyKjGHH_ach@www\\.liveemail\\.co)|(Live_Email_clone_avmFyKjGHH@www\\.liveemail\\.co)|(Live_Inbox_clone_HSqMlnurhx@www\\.liveinbox\\.co)|(Live_Inbox_ITUElbGJyq@www\\.liveinbox\\.co)|(Live_News_90155c3a670c030b75d27b2b060bab76@www\\.get-news\\.co)|(Live_News_ab96451cfc686d1903b9bd5bbefc58df@www\\.get-news\\.co)|(Live_News_Daily_coRwlwVUtL@www\\.livenewsdaily\\.net)|(Live_News_RoTkoRyzKW@www\\.get-news\\.co)|(Live_News_sQHxsfPWHn@www\\.get-news\\.co)|(Live_News_UPeYgtCNWH@www\\.get-news\\.co)|(liveemail@www\\.liveemail\\.co)|(LiveNewsDaily\\.co_Qrkavccepk@www\\.livenewsdaily\\.co)|(Local_Weather_Now_clone_CGdqWGvDuk@www\\.localweathernow\\.co)|(Local_Weather_Now_clone_PsfbncWCpz@www\\.localweathernow\\.co)|(Local_Weather_Today_af62b67de6656cd77ec1232ce28b0847@www\\.localweathertoday\\.co)|(Local_Weather_Today_b6bdb9471dfdbbe166ebba101bf87987@www\\.localweathertoday\\.co)|(Local_Weather_Today_clone_25d0f678c3de41078bfebfedb36f3e5e@www\\.localweathertoday\\.co)|(Local_Weather_Today_clone_ozBsMkxlfM@www\\.localweathertoday\\.co)|(Local_Weather_Today_clone_QFZOuAbpBy@www\\.localweathertoday\\.co)|(Local_Weather_Today_MoAsKEYZyC@www\\.localweathertoday\\.co)|(localweathertodayco@www\\.localweathertoday\\.co)|(localweathertodaynet@www\\.localweathertoday\\.net)|(Locate_Packages_JIjwUKeces@www\\.locatepackages\\.com)|(loginpro_bTqvLMpNXn@www\\.easy-maillogin\\.link)|(loginpro@www\\.loginemailpro\\.com)|(manifestdata_Check_clone_AraOARfaeL@hjm)|(manifestdata_Check_HFkEdcMQtX@hjm)|(manifestname@www\\.wallpaperonlinepro\\.com)|(Map_Buddy_svMNjHoVFQ@www\\.map-buddy\\.net)|(Map_Directions_Pro_hFzkEkDBXw@www\\.mapdirectionspro\\.co)|(Map_Directions_Pro_JAlSTUeoZW@www\\.mapdirectionspro\\.co)|(Map_Directions_Pro_vnuUbjddlF@www\\.mapdirectionspro\\.co)|(Map_Finder_GaEdNdyQoi@www\\.mapfinder\\.live)|(Map_Finder_Online_clone_HAzjiKHVFr@www\\.mapfinderonline\\.com)|(Map_Finder_Online_clone_vxRStAVXsj@www\\.mapfinderonline\\.com)|(Map_Finder_Online_DWFqZBeElh@www\\.mapfinderonline\\.com)|(Map_Finder_RIBbQLtJhY@www\\.map-finder\\.link)|(Map_Finder_ubFbNkPLbu@www\\.map-finder\\.co)|(Map_My_Journey_clone_dbZghybkTf@www\\.mapmyjourney\\.co)|(Map_My_Journey_gWimMkbjcf@www\\.mapmyjourney\\.co)|(Map_My_Journey_hwaFtGeeRF@www\\.mapmyjourney\\.co)|(Map_My_Journey_lOKajIjWRX@www\\.mapmyjourney\\.co)|(Map_My_Travel_3d7340d4339df15d23c823030d0b3dd4@www\\.mapmytravel1\\.co)|(Map_My_Travel_4c1060a52cb966087a862f50c66cff76@www\\.mapmytravel1\\.co)|(Map_My_Travel_66a1df798c97eecbcbc5ce97f5bb58ce@www\\.mapmytravel\\.co))$/","prefs":[],"schema":1576758213475,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f0cac174-d15f-427f-b310-9409e69a2ca6","last_modified":1576771657088},{"guid":"/^((Map_My_Travel_77440f39b0fc3ac74a9e894ff2e26617@www\\.mapmytravel\\.co)|(Map_My_Travel_ac398c1a8442efc53c141095c6e386f1@www\\.mapmytravel1\\.co)|(Map_My_Travel_b47128735efb1ae5232811bf674a5598@www\\.mapmytravel1\\.co)|(Map_My_Travel_c520fe83319115df915325944097f2d7@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_906668a067200f92f67c8a1d4934ca53@www\\.mapmytravel\\.co)|(Map_My_Travel_clone_agEGcivVyr@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_AojrINyqec@www\\.mapmytravel\\.co)|(Map_My_Travel_clone_CaXjHVvzvR@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_CmwkGssriz@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_KUUHhqDlkF@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_xjdUmTvEZE@www\\.mapmytravel\\.co)|(Map_My_Travel_clone_ZJilbRDhlx@www\\.mapmytravel1\\.co)|(Map_My_Travel_ea415ecadf91d96c596c61d748dfab3a@www\\.mapmytravel\\.co)|(Map_My_Travel_FGYxkNvlYu@www\\.mapmytravel1\\.com)|(Map_My_Travel_GnhWycuRWw@www\\.mapmytravel\\.co)|(Map_My_Travel_KoRBtjTOaQ@www\\.mapmytravel\\.co)|(Map_My_Travel_V2_1136cc214788f6e2c4fbd748c875f289@www\\.mapmytravel1\\.co)|(Map_Your_Way_dba6e11787a9a4c0ff802d30e2d84655@www\\.mapyourway\\.online)|(Map_Your_Way_RRrntXMhmV@www\\.mapyourway\\.online)|(Map-Buddy\\.net_YDYeEFqMMB@www\\.map-buddy\\.net)|(MapAssistant\\.net_IxpgMrxoal@www\\.mapassistant\\.net)|(Maps_Finder_clone_lXfNOQsASa@www\\.getmapfinder\\.com)|(Maps_Finder_clone_OHRJTSZWsp@www\\.getmapfinder\\.com)|(Maps_Finder_clone_qjbEfuxypy@www\\.getmapfinder\\.com)|(Maps_Finder_clone_sVixvNGfvq@www\\.getmapfinder\\.com)|(Maps_Finder_clone_XiwisRQHED@www\\.mapsfinder\\.co)|(Maps_Finder_cxamiyXEhG@www\\.maps-finder\\.co)|(Maps_Finder_ikDztWsXOS@www\\.mapsfinder\\.co)|(Maps_Finder_ISFXVmdcMZ@www\\.getmapfinder\\.com)|(Maps_Finder_NEJbQoRTxu@www\\.mymapfinder\\.co)|(Maps_Finder_OAXSzUFBAz@www\\.getmapfinder\\.com)|(Maps_Finder_Online_cb9ff9fa82db81028ec8b5a9c738c3d0@www\\.mymapsfinderonline\\.com)|(Maps_Finder_Online_fa0d46585631975dfefb9653fbdc5ae5@www\\.mapsfinderonline\\.com)|(Maps_Finder_Online_VBUnFyZArH@www\\.mapsfinderonline\\.com)|(Maps_Finder_OyeiUXSYyC@www\\.mymap-buddy\\.com)|(Maps_Finder_yiomudinei@www\\.mapsfinder\\.co)|(Maps_Now_1a47fbf8546a43d949f229efca9a2f34@www\\.mapsnow\\.co)|(Maps_Now_23f9f3cd0b483c22be85bb2568a2df4f@www\\.mapsnow\\.co)|(Maps_Now_85bb8ec9ca1c2baab2dc307af81964c2@www\\.mapsnow\\.co)|(Maps_Now_cbd62915225f7f059c5d15daa3a59cad@www\\.mapsnow\\.co)|(Maps_Now_clone_daDccVKFiR@www\\.mapsnow\\.co)|(Maps_Now_clone_eaIVjwJWMX@www\\.mapsnow\\.co)|(Maps_Now_clone_HmcRPOcjzE@www\\.mapsnow\\.co)|(Maps_Now_clone_QnqJIECgrq@www\\.mapsnow\\.co)|(Maps_Now_clone_VNlrSBkTlM@www\\.mapsnow\\.co)|(Maps_Now_clone_yDfyuWvMMp@www\\.mapsnow\\.co)|(Maps_Now_clone_YDpyMtVaLW@www\\.mapsnow\\.co)|(Maps_Now_clone_ZyNlPAcxdc@www\\.mapsnow\\.co)|(Maps_Now_tmnjrLnmFO@www\\.mapsnow\\.co)|(Maps_Now_uwqucqWEGq@www\\.mapsnow\\.co)|(Maps_Now_XSqhhyPFiH@www\\.mapsnow\\.co)|(Maps_Today_UoKEAlMYFh@www\\.mapmyjourneynt\\.co)|(mapsfinder@www\\.mapsfinder\\.co)|(Metric_Converter_Pro_437e424a1d8a287713fd991b4babb241@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_48e7e1cd7ea7a150ce498c7f4c1a8525@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_c1043f9d35c4300be27a136d2956b8bd@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_b151705ba46c35bf8530f6fcccad39ff@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_HoBPpUTrbw@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_KaiswSnKUV@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_SzGHQnHNkN@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_WchvzpVULZ@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_rEvcfmsuJW@www\\.metricconverterpro\\.com)|(Movie_Delight_LVlUUJCTfd@www\\.movie-delight\\.com)|(Movie_Delight_xWRWlvWNGj@www\\.movie-delight\\.com)|(Movie_Hunt_GzAuVRhAph@www\\.moviequest\\.online)|(Movie_Hunt_ioLSsIUbVX@www\\.themoviesearch\\.org)|(Movie_Hunt_jbuqRPUUVt@www\\.moviehunt\\.today)|(Movie_Hunt_jHPrIKUDZi@www\\.moviehunt\\.today)|(Movie_Hunt_Online_jJicoNDurf@www\\.moviehunt\\.online)|(Movie_Maniac_2462069208dfe0b3d754ec0d11bf7b40@www\\.themoviemaniac\\.co)|(Movie_Maniac_a84cd1cd277e4886cbd535cafddb9248@www\\.themoviemaniac\\.co)|(Movie_Maniac_clone_4b2e8fc1efa469664fbfe3b1cfd600ce@www\\.themoviemaniac\\.co)|(Movie_Maniac_clone_bbe030355b07de5cd10dee52a60db3e3@www\\.themoviemaniac\\.co))$/","prefs":[],"schema":1576758242842,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b009e1d2-ed9c-42b3-b795-b63d15b15deb","last_modified":1576771657084},{"guid":"/^((Movie_Maniac_clone_FhKByuyzfD@www\\.themoviemaniac\\.co)|(Movie_Maniac_clone_OzkDkQoxcV@www\\.themoviemaniac\\.co)|(Movie_Maniac_clone_pNBsVugeLv@www\\.themoviemaniac\\.co)|(Movie_Maniac_qNRzbWPyVh@www\\.themoviemaniac\\.co)|(Movie_Quest_DgloGEcqoQ@www\\.movie-quest\\.online)|(Movie_Quest_DHlTecEnbH@www\\.moviequest\\.online)|(Movie_Quest_lSUIfjeATU@www\\.movie-quest\\.org)|(Movie_Quest_ogkgHKpiCu@www\\.movie-quest\\.org)|(Movie_Quest_oIbDMPkLHN@www\\.the-moviequest\\.today)|(Movie_Quest_OYXdMYNGlQ@www\\.moviequest\\.online)|(Movie_Quest_WwjFqvwace@www\\.moviequest\\.online)|(Movie_Search_4634ea60272d58007cb594bddf4c2d14@www\\.moviesearchtoday\\.com)|(Movie_Search_5adb28a06e6a557580f892b00df54fe9@www\\.moviesearchtoday\\.com)|(Movie_Search_5e2468caef8b002ec4af47d33347d946@www\\.moviesearchtoday\\.com)|(Movie_Search_6a2835fbcfa21f071a72cf4b1d768ee1@www\\.moviesearchtoday\\.com)|(Movie_Search_82956306d33016e1612f6b93238abb8c@www\\.movie-searchtoday\\.com)|(Movie_Search_amo_hosting_clone_cdvWgyZchs@staging\\.themovie-portal\\.com)|(Movie_Search_clone_BPUjteCIKH@www\\.moviesearchtoday\\.com)|(Movie_Search_clone_hOjSGlUSJc@www\\.themovie-portal\\.com)|(Movie_Search_clone_tUhUWKFWEy@staging\\.themovie-portal\\.com)|(Movie_Search_clone_yNPQCvYjiE@www\\.search-movie\\.today)|(Movie_Search_fce3642a62f1d43d671b9cc1edae2248@www\\.moviesearchtoday\\.com)|(Movie_Search_GnuaPoCHyn@www\\.moviesearchtoday\\.com)|(Movie_Search_HQkuRtYSBi@www\\.movie-search\\.today)|(Movie_Search_JsPzrSgfUw@www\\.moviesearchtoday\\.com)|(Movie_Search_ldxwfXRmwB@www\\.movie-search\\.live)|(Movie_Search_LyOzXmENOz@www\\.movie-search\\.today)|(Movie_Search_OoYYDEappx@www\\.moviesearch\\.today)|(Movie_Search_qQXnYBWtZL@www\\.movie-searchtoday\\.com)|(Movie_Search_qSoQoWSxLl@www\\.movie-hunt\\.co)|(Movie_Search_ryfmFVsOyx@www\\.movie-search\\.today)|(Movie_Search_usVRdBSJFC@www\\.moviesearchtoday\\.com)|(Movie_Search_VbiTYRjDIi@www\\.themoviesearch\\.co)|(Movie_Search_wEfUXCokzy@www\\.moviesearch\\.today)|(Movie_Search_wGdgcYcPQb@www\\.moviesearchtoday\\.com)|(Movie-Hub\\.info_OmWUKRcKuS@www\\.movie-hub\\.info)|(Movie-Quest_KJpvmWXXVL@www\\.movie-quest\\.co)|(Movie-Quest\\.info_eUjlCfSYnv@www\\.movie-quest\\.info)|(Movie-Quest\\.info_kdhRhuajuC@www\\.movie-quest\\.info)|(movie-quest\\.today_ftrItBjuLQ@www\\.movie-quest\\.today)|(MovieQuest_jyRMkNmSGC@www\\.moviequest\\.co)|(moviequest\\.today_JlDnGylmbG@www\\.moviequest\\.today)|(moviequest@www\\.moviequest\\.co)|(MusicQuest_IuWBQBhiuw@www\\.music-quest\\.co)|(mvquest@www\\.moviequest\\.co)|(My_Astro_Tab_8e89559e65a469daf6766bb75d4376ab@www\\.myastrotab\\.com)|(My_Astro_Tab_KaAEnbwPUx@www\\.myastrotab\\.com)|(My_Coupon_Store_ylKTlAUXbo@www\\.mycouponstore\\.co)|(My_Daily_Astrology_MqfKduyqcg@www\\.my-dailyastrology\\.net)|(My_Daily_Utilities_4ebdffa571404d80516d8d0f530af9a6@www\\.mydailyutilities\\.co)|(My_Daily_Utilities_clone_4d4f3e4318db94478d9302c598ef468c@www\\.mydailyutilities\\.co)|(My_Daily_Utilities_clone_TQYRFwiprp@www\\.mydailyutilities\\.co)|(My_Daily_Utilities_clone_wsrcjEDqNR@www\\.mydailyutilities\\.co)|(My_Daily_Utilities_iwpgTQIUFx@www\\.mydailyutilities\\.co)|(My_Directions_Finder_c406a6ac6a2b0638fcb489f1b776b903@www\\.mydirectionsfinder\\.net)|(My_Directions_Finder_clone_alDWaOiCNo@www\\.mydirectionsfinder\\.com)|(My_Directions_Finder_clone_iIYkMlrcwN@www\\.mydirectionsfinder\\.net)|(My_Directions_Finder_clone_mBlfabAHtF@www\\.mydirectionsfinder\\.com)|(My_Directions_Finder_clone_oIFvReYNwJ@www\\.mydirectionsfinder\\.net)|(My_Directions_Finder_clone_TUeunTaGWJ@www\\.mydirectionsfinder\\.net)|(My_Directions_Finder_ejopyTsDPc@www\\.mydirectionsfinder\\.com)|(My_Directions_Finder_RIUfITHqsm@www\\.mydirectionsfinder\\.com)|(My_Doc_Converter_a70620b85cb93c122c397d5a0d6d6c17@www\\.mydocconverter\\.net)|(My_Doc_Converter_hTuhuUWAbu@www\\.mydocconverter\\.net)|(My_File_Converter_InJpDFniec@www\\.myfileconverter\\.net)|(My_File_Converter_MOLroWzmvk@www\\.myfileconverter\\.net)|(My_File_Converter_uJJIGUseRO@www\\.myfileconverter\\.org)|(My_Mail_Center_clone_AOBAQIlpph@www\\.mymailcenter\\.co)|(My_Mail_Center_clone_JJSlJDujLf@www\\.mymailcenter\\.co)|(My_Mail_Center_StbPlXiGzU@www\\.mymailcenter\\.co)|(My_Map_Buddy_AHxkFzHUSq@www\\.mymap-buddy\\.com)|(My_Map_Buddy_aJhRltItzB@www\\.mymap-buddy\\.co)|(My_Map_Buddy_dzzNGYdgEy@www\\.mymapbuddy\\.link)|(My_Map_Buddy_lCpBZhZcug@www\\.mymap-buddy\\.co))$/","prefs":[],"schema":1576758270991,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c264de14-d096-45d7-afd6-4e03f3f0874e","last_modified":1576771657080},{"guid":"/^((My_Map_Buddy_LlytpwAxzJ@www\\.my-mapbuddy\\.link)|(My_Map_Buddy_omjWWfWnZV@www\\.checkmaps\\.live)|(My_Map_Buddy_QniENdnZwH@www\\.mymapbuddy\\.co)|(My_Map_Buddy_qwjuFaLDiS@www\\.my-mapbuddy\\.link)|(My_Map_Finder_216cea355b90081b2fa2b35228afa8cd@www\\.mymapfinder\\.net)|(My_Map_Finder_FQhLxNAhOb@www\\.mymapfinder\\.net)|(My_Map_Finder_HIAdZUsdqP@www\\.easymapsfinder\\.com)|(My_Map_Key_bfebaaffd5e89eb58d8eede5550b7657@www\\.mymapkey\\.com)|(My_Map_Key_PNKwkyDcSv@www\\.mymapkey\\.com)|(My_Map_Quest_amtyvbVOvw@www\\.mymapquest\\.co)|(My_Map_Tab_e4256b0cd83dd5dc7ffd2d6fa89bb3ca@www\\.mymaptab\\.co)|(My_Map_Tab_fQPfsnZVRi@www\\.mymaptab\\.co)|(My_Maps_Daily_2216a0fb9fa410e585f75583c84bb1fc@www\\.mymapsdaily\\.com)|(My_Maps_Daily_HTtwoSgSmO@www\\.mymapsdaily\\.com)|(My_Maps_Finder_mlqpWnYOjs@www\\.mymapsfinderonline\\.com)|(My_Maps_Now_wouVnzxahG@www\\.mymapsnow\\.co)|(My_Metric_Converter_AZzUIIKwJY@www\\.mymetricconverter\\.com)|(My_Net_Speed_clone_LEPCOrGXJt@www\\.my-netspeed\\.co)|(My_Net_Speed_dIUrWuilrC@www\\.my-netspeed\\.co)|(My_Net_Speed_hQVahLtcSK@www\\.mynet-speed\\.com)|(My_Net_Speed_keJWBLUIYD@www\\.mynet-speed\\.com)|(My_Net_Speed_XhDnHJmvAF_1@www\\.mynetspeed\\.co)|(My_Net_Speed_XhDnHJmvAF@www\\.mynetspeed\\.co)|(My_Net_Speed_YGdxRAMaly@www\\.mynetspeed\\.link)|(My_Quick_Directions_384f670ee31df7278a1df86a202697c2@www\\.myquickdirections\\.com)|(My_Quick_Directions_IoipCjCqHK@www\\.myquickdirections\\.com)|(My_Quick_Search_HHmoLNFNZK@www\\.myquicksearch\\.co)|(My_Radio_Plus_clone_xijbeLEKut@www\\.myradioplus\\.co)|(My_Radio_Plus_clone_yLODfWIUzo@www\\.myradioplus\\.co)|(My_Radio_Plus_huJGcbKJdz@www\\.myradioplus\\.co)|(My_Recipe_Digest_806bc9c3d627874ac6f6c953e1174d41@www\\.myrecipedigest\\.com)|(My_Recipe_Digest_TQhDINXjet@www\\.myrecipedigest\\.com)|(My_Recipe_Guide_4bc8a248146602106b25349ec50b7395@www\\.myrecipeguideonline\\.com)|(My_Recipe_Guide_ZlrLqLHAKb@myrecipeguideonline\\.com)|(My_Route_Planner_6bb055b2be5912b90cec3a2788636830@www\\.myrouteplanner\\.co)|(My_Route_Planner_ccdd62d844c1769d5bf4db308b3bc9c9@www\\.myrouteplanner\\.co)|(My_Route_Planner_clone_AFCMlCneMs@www\\.myrouteplanner\\.co)|(My_Search_Plus_91de35f6bc26e7f423a701dc4a7d9e6b@www\\.mysearchplus\\.co)|(My_Search_Plus_clone_7d6359f4c55d1f5c5a9af0304e7dcf34@www\\.mysearchplus\\.co)|(My_Search_Plus_clone_ejVWzjJsWF@www\\.mysearchplus\\.co)|(My_Search_Plus_clone_fBHEaWXiDZ@_123456www\\.mysearchplus\\.co)|(My_Search_Plus_clone_fBHEaWXiDZ@www\\.mysearchplus\\.co)|(My_Search_Plus_clone_zHyeSWPlyQ@www\\.mysearchplus\\.co)|(My_Search_Plus_zasNrdaCMb@www\\.mysearchplus\\.co)|(My_Search_Wizard_7f2979e35d2bd7dd61433bbca4e930bf@www\\.mysearchwizard\\.co)|(My_Search_Wizard_887bc211e6c12bcd4c59204553e75ed5@www\\.mysearchwizard\\.co)|(My_Search_Wizard_clone_CuEYdreCCG@www\\.mysearchwizard\\.co)|(My_Search_Wizard_clone_MfzUjTpTSj@www\\.mysearchwizard\\.co)|(My_Search_Wizard_clone_PhkuhYznxq@www\\.mysearchwizard\\.co)|(My_Smart_Search\\.co_uUlxGOYDUP@www\\.mysmartsearch\\.co)|(My_Smart-Search\\.co_moHloXmlvd@www\\.mysmart-search\\.co)|(My_Smart-Search\\.co_nVQpezjwFN@www\\.mysmart-search\\.co)|(My_Weather_Services_MTCOGCZgEo@myweatherservicesn\\.org)|(My_Weather_Tab_cdb3a5fdbcc268762efb7f1b9088a935@www\\.myweathertab\\.co)|(My_Word_Scribe_6ac6fa9173610517a627c5298a38891a@www\\.mywordscribe\\.com)|(My_Word_Scribe_clone_RZEMcCVoIU@www\\.mywordscribe\\.com)|(My_Word_Scribe_clone_TAZVHOvofp@www\\.mywordscribe\\.com)|(My_Word_Scribe_GlqExrIfvA@www\\.mywordscribe\\.com)|(My_Word_Scribe_wRguUlbptJ@www\\.mywordscribe\\.com)|(MyAstroFinder_clone_meuCieSJGq@www\\.myastrofinder\\.co)|(MyAstroFinder_QqSSwnxQpy@www\\.myastrofinder\\.co)|(MyCareer-Search\\.co_IcpqItVxAi@www\\.mycareer-search\\.co)|(MyCoupon-Finder\\.co_DatSgecXGq@www\\.mycoupon-finder\\.co)|(MyCouponFinder\\.co_ZMMzlIEann@www\\.mycouponfinder\\.co)|(mydailyastrologyco@www\\.mydailyastrology\\.co)|(mydailyastrologyonline@www\\.mydailyastrology\\.online)|(mydailynewsonline@www\\.mydailynews\\.online)|(MyMapBuddy\\.net_oVKQZzxNzk@www\\.mymapbuddy\\.net)|(MyMusicSearch\\.co_zsqyyUdIfE@www\\.mymusicsearch\\.co)|(mynetspeedco@www\\.mynetspeed\\.co)|(MySearchTab\\.co_QXqKBErWIz@www\\.mysearchtab\\.co)|(Net_Speed_bfa1870197a5380d1f00708341444fe4@www\\.testnetspeed\\.co)|(Net_Speed_f61989f67aeb3c5ed6180f49b2160ea1@www\\.net-speed\\.co)|(Net_Speed_imtTaleZMk@www\\.net-speed\\.co))$/","prefs":[],"schema":1576758309063,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a3e1bff4-2e6a-4a7f-a1e3-f7eff451655b","last_modified":1576771657076},{"guid":"/^((Net_Speed_Ninja_rJSmpzPQRq@www\\.netspeedninja\\.co)|(Net_Speed_nYAhXCpaOF@www\\.testnetspeed\\.co)|(Net_Speed_Plus_MnPDDtnfZh@www\\.checkmyspeednownt\\.com)|(Net_Speed_Test_b419d25436f7b7cb3458407498bae21f@www\\.netspeedtesthub\\.com)|(Net_Speed_Test_Hub_OOlSMbcwOe@netspeedtesthub\\.com)|(Net_Speedtest_8e202a4f66675f188c265a8ef11e47fa@www\\.netspeedtest\\.co)|(Net_Speedtest_clone_ikAadlLvLs@www\\.netspeedtest\\.co)|(Net_Speedtest_ysCFtRLxZn@www\\.netspeedtest\\.co)|(NetSpeedCalculator\\.net_mzMnaouenc@www\\.netspeedcalculator\\.net)|(netspeedproco@www\\.netspeedpro\\.co)|(New_Jobs_Quest_8f6247b00ffc5b1bb2f3f30fc73a9de5@www\\.newjobsquest\\.co)|(News__Precinct_75018cea70cf57e0ab66d312ef3a769d@www\\.newsprecinct\\.com)|(News__Precinct_sggnBoSvRu@www\\.newsprecinct\\.com)|(News_Daily_UBtJmysrDA@www\\.newstrackrnt\\.co)|(News_Headlines_bKwUmAeFcG@www\\.newsheadlinespro\\.com)|(News_Headlines_f70874554c3c22b5fec6f98e845d9b4d@www\\.newsheadlinespro\\.com)|(News_Headlines_SfZxlPzEgN@www\\.newsheadlinespro\\.com)|(News_Precinct_05544a082b3c01a286c66f7cf4251700@www\\.newsprecinct\\.com)|(News_Precinct_clone_5cd166a363627a7f453b1b69769f436d@www\\.newsprecinct\\.com)|(News_Precinct_clone_NeRHwQGodq@www\\.newsprecinct\\.com)|(News_Precinct_clone_PTdBCNrWPD@www\\.newsprecinct\\.com)|(News_Precinct_dLqSikAjQC@www\\.newsprecinct\\.com)|(News_Precinct_gzVnHZnzOy@www\\.newsprecinct\\.com)|(NewStackr_uNFYKFwAWP@www\\.NewsTackR\\.com)|(NewsTrackr_clone_qKtwLAHfjm@www\\.newstrackr\\.co)|(NewsTrackr_clone_vJczLpOPSO@www\\.newstrackr\\.co)|(NewsTrackr_e1032761f4eb1beb126fdface070fb37@www\\.newstrackr\\.co)|(NewsTrackr_iDEHLRYWqj@www\\.newstrackr\\.co)|(NewsTrackr_ZtEQVEonqX@www\\.newstrackr\\.co)|(newsupdatesinnet@www\\.newsupdates\\.in\\.net)|(no_EzdEKVkeZk@www\\.test10\\.com)|(Online_Coupon_Finder_njhVhBdgcg@onlinecoupon-finder\\.co)|(Online_Coupon_Finder_QuNkIQQUVz@www\\.onlinecouponfinder\\.net)|(Online_Coupon_Finder_SZuYIubYMN@www\\.onlinecouponfinder\\.net)|(Online_Doc_Converter_7d7d0b74adad02f39590d705822a70e2@www\\.onlinedocconverter\\.com)|(Online_Doc_Converter_qpIkrHZegO@www\\.onlinedocconverter\\.com)|(Online_Document_Converter_clone_xZguXlOjJE@www\\.convertmypdf\\.co)|(Online_Package_Tracker_TNAcobvKgm@onlinepackagetracker\\.co)|(Online_PDF_Converter_aJsvvVEBaO@www\\.myonlinepdfconverter\\.net)|(Online_PDF_Converter_kxVNqagGZG@myonlinepdfconverter\\.com)|(Online_Recipe_RURMecAQzt@www\\.onlinerecipe\\.co)|(Online_Recipe_VNtLUGYjpI@www\\.onlinerecipe\\.co)|(Online_Speed_Radar_clone_YlZLvnSGjM@www\\.onlinespeedradar\\.com)|(Online_Web_Search_clone_WjoqJJklvS@www\\.onlinewebsearch\\.co)|(Online_Web_Search_d1b9b3e703905b67931858f6f5aecdca@www\\.onlinewebsearch\\.co)|(OnlineRecipeSearch\\.info_pEdBAUaqCR@www\\.onlinerecipesearch\\.info)|(Package_Trace_JOGQGobPMj@www\\.trackpackagequicknt\\.com)|(Package_Tracker_02a37a57871ec5b57a0555403157dcf8@www\\.package-tracker\\.co)|(Package_Tracker_07a2a700968a7da88eb77b9c46279b1c@www\\.dailypackagetracker\\.com)|(Package_Tracker_3ce363c30f45ee0016862ac499be7ff5@www\\.packagetrackeronline\\.com)|(Package_Tracker_698579ac9c231e14ca69e1894f353396@www\\.dailypackagetracker\\.com\\.disabled)|(Package_Tracker_75a19df973eae7cf6e19c396c3973451@www\\.package-tracker\\.co)|(Package_Tracker_clone_FNZBehhrfr@www\\.package-tracker\\.co)|(Package_Tracker_EOXBmHOBkZ@www\\.package-tracker\\.co)|(Package_Tracker_Express_clone_cbOTQhTNgs@www\\.packagetrackerexpress\\.com)|(Package_Tracker_Express_ZxaTHkYQxF@www\\.packagetrackerexpress\\.com)|(Package_Tracker_fd87086da3f36037204f4b0bf23f1ea1@www\\.package-tracker\\.co)|(Package_Tracker_HaMksfdhUi@www\\.dailypackagetracker\\.com)|(Package_Tracker_Hub_clone_cfdJxpAmIT@www\\.packagetrackerhub\\.com)|(Package_Tracker_Hub_EreNcpVUoK@www\\.packagetrackerhub\\.com)|(Package_Tracker_kaiHEFsqvp@www\\.ThePackageTrack\\.com)|(Package_Tracker_KwwfXjTWsn@www\\.package-tracker\\.co)|(Package_Tracker_OHnRIWuvmH@www\\.packagetrackeronline\\.com)|(Package_Tracker_Online_b49f3fc69d90679955379dab26b2a6fa@www\\.packagetrackeronline\\.com)|(Package_Tracker_Online_cleZBgkKxj@www\\.packagetrackeronline\\.com)|(Package_Tracker_Online_EmvHhroAmG@www\\.packagetrackeronline\\.com)|(Package_Tracker_QYmRTqNSxY@www\\.getpackagetracker\\.com)|(Package_Tracker_Tab_50fa581c36cad6995f117782f5105636@www\\.packagetrackertab\\.com))$/","prefs":[],"schema":1576758357512,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4bc321ad-e23b-4ed3-86bf-a1a3a38fbf75","last_modified":1576771657072},{"guid":"/^((Package_Tracker_yJbpZEQECr@www\\.package-tracker\\.co)|(packagefollowercom@www\\.packagefollower\\.com)|(PDF_Converter_AQpxoneXlZ@www\\.pdf-convertn\\.co)|(PDF_Converter_Plus_ZgLTNbAZUb@www\\.pdfconverterplus\\.com)|(PDF_Pro_Converter_eTqIXytHWq@www\\.pdfproconverter\\.com)|(Pets_Wallpapers_SKWDasMHYY@petswallpapers\\.net)|(phototab@www\\.wallpaperonlinepro\\.com)|(Premier_Search_clone_CcAEnLGkmK@www\\.premiersearch\\.co)|(Premier_Search_clone_wfigyWtsdL@www\\.premiersearch\\.co)|(Privacy-Search\\.biz_cXHpGjbGct@www\\.privacy-search\\.biz)|(Privacy-Search\\.club_fNwUjmGvkM@www\\.privacy-search\\.club)|(Privacy-Search\\.company_gzqnuNM@www\\.privacy-search\\.company)|(Privacy-Search\\.in\\.net_UdIeydXEbw@www\\.privacy-search\\.in\\.net)|(Privacy-Search\\.info_BzTWanpKDM@www\\.privacy-search\\.info)|(Privacy-Search\\.link_DATRCktqwk@www\\.privacy-search\\.link)|(Privacy-Search\\.one_NPLmbtQaBI@www\\.privacy-search\\.one\\.disabled\\.com)|(Privacy-Search\\.online_PwQLiKaWGq@www\\.privacy-search\\.online)|(Privacy-Search\\.site_zYtZQgkEtf@www\\.privacy-search\\.site)|(Privacy-Search\\.space_AjqewVnBVW@www\\.privacy-search\\.space)|(Privacy-Search\\.store_vNAqbjRGGn@www\\.privacy-search\\.store)|(Privacy-Search\\.today_NRVdCCeOIa@www\\.privacy-search\\.today)|(Privacy-Search\\.website_JwizWmtjPu@www\\.privacy-search\\.website)|(Privacy-Search\\.xyz_clone_juEABfQNOl@www\\.privacy-search\\.xyz)|(Privacy-Search\\.xyz_elSDqUATPt@www\\.privacy-search\\.xyz\\.disabled\\.com)|(Privacy-Search\\.xyz_oIkblTLPSN@www\\.privacy-search\\.xyz)|(PrivacySearch\\.biz_bAwIbiJVAP@www\\.privacysearch\\.biz)|(PrivacySearch\\.club_MRWkilEqOZ@www\\.privacysearch\\.club)|(PrivacySearch\\.company_hOwSWgQKdn@www\\.privacysearch\\.company\\.disabled\\.com)|(PrivacySearch\\.company_NAKTVsEmEC@www\\.privacysearch\\.company)|(PrivacySearch\\.in\\.net_NxaHlhdTlz@www\\.privacysearch\\.in\\.net)|(PrivacySearch\\.link_EOhtykDnGr@www\\.privacysearch\\.link)|(PrivacySearch\\.me_QSSIQcOMtH@www\\.privacysearch\\.me)|(PrivacySearch\\.one_WUIHjcIjXh@www\\.privacysearch\\.one)|(PrivacySearch\\.one_zOkggTAokc@www\\.privacy-search\\.one)|(PrivacySearch\\.online_CYiUatShgl@www\\.privacysearch\\.online)|(PrivacySearch\\.space_YagHPcSikB@www\\.privacysearch\\.space)|(PrivacySearch\\.store_pJBFyyaDRx@www\\.privacysearch\\.store)|(PrivacySearch\\.website_cGZdtKrFao@www\\.privacysearch\\.website)|(PrivacySearch\\.xyz_ZEUMZLHcqv@www\\.privacysearch\\.xyz)|(privacysearchco_xXdgBRl@info\\.privacysearch\\.co)|(privacysearchco@info\\.privacysearch\\.co)|(PrivateSearchOnline\\.com_IhKdmYiVeK@info\\.privatesearchonline\\.com)|(Pro_Games_Online_HVwluXulrt@www\\.progamesonline\\.co)|(Puppies_World_trFanlsdqu@www\\.puppiesworld\\.info)|(Puppy_Wallpapers_ZOWpJDLXFj@www\\.puppywallpapers\\.net)|(Quick_Career_Search_WDeLsGajVb@www\\.quickcareersearch\\.co)|(Quick_Daily_Mail_SKeVfXlhFp@www\\.quickdailymail\\.com)|(Quick_Email_App_EFITirXRRs@www\\.quickemailapp\\.com)|(Quick_Email_Checker_7796dc8c3c9cde3502870b6054bb34db@www\\.quickmailchecker\\.com)|(Quick_Email_Checker_BQerPmohdb@www\\.quickmailchecker\\.com)|(Quick_Map_Tab_98eb6af566aadaea6dae58aa6d841a70@www\\.quickmaptab\\.com)|(Quick_Map_Tab_IJTJmbzNOx@www\\.quickmaptab\\.com)|(Quick_Maps_clone_hIZNOOMdWQ@www\\.getquickmaps\\.com)|(Quick_Maps_clone_xRcOZiPvYl@www\\.getquickmaps\\.com)|(Quick_Maps_Online_7bcf0c280d92934d11d0b449980a1937@www\\.quickmapsonline\\.com)|(Quick_Maps_Online_QKDpNHmDpD@www\\.quickmapsonline\\.com)|(Quick_Maps_pjWqGYHPRE@www\\.getquickmaps\\.com)|(Quick_Online_Directions_0364feaec027aaab80a920e79ac1800c@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_clone_8cfe33dcf14406257fca53f436aad1ff@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_clone_bFKYEkYGUO@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_clone_JcSWuSfSrw@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_clone_qswqvmCxux@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_d922039a0497633824e490148707ca71@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_eddee69bb3984d22264d57b63e6f0115@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_OFYSSUWMOH@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_Test_gbFqFQwwaZ@www\\.quickonlinedirections\\.com)|(Quick_Recipe_Search_QumKWdGMdB@www\\.quickrecipesearch\\.today)|(Quick_Search_Tab_Cbzrnmuqub@www\\.quicksearchtab\\.co))$/","prefs":[],"schema":1576758405945,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"402be073-072f-44d7-a557-7c98914dc0da","last_modified":1576771657067},{"guid":"/^((Quick_Speed_Checker_09b7f7d1acd76f23f1d887e60ddcc474@www\\.quickspeedchecker\\.com)|(Quick_Speed_Checker_clone_3db2cd8f8f3e192f57ca83da50451660@www\\.quickspeedchecker\\.com)|(Quick_Speed_Checker_clone_bhRDSCySFq@www\\.quickspeedchecker\\.com)|(Quick_Speed_Checker_sqZXXzzpsT@www\\.quickspeedchecker\\.com)|(Quick_Weather_Forecast_IHOnRApsey@www\\.quickweatherforecast\\.com)|(Quick_Weather_Updates_6277aeb2d83428ca469904f0886e0938@www\\.quickweatherupdates\\.com)|(Quick_Weather_Updates_yieimwNJEx@www\\.quickweatherupdates\\.com)|(QuickNews\\.co_vZLHaiMlVV@www\\.quicknews\\.co)|(QuickRecipeSearch\\.co_hqhPDvuKrF@www\\.quickrecipesearch\\.co)|(qwertyuiopasdf@www\\.xyz\\.com)|(Radio_Hub_Online_YfJreNCpww@www\\.radiohubonline\\.com)|(rakshitchoudhary8@gmail\\.com)|(rakshitchoudhary8@gmail\\.om)|(Recipe_Board_Plus_7484a472b0b409e4895321bdd72e1945@www\\.recipeboardplus\\.com)|(Recipe_Board_Plus_f92fd9f713f932491e785a977401bb7c@www\\.recipeboardplus\\.com)|(Recipe_Board_Plus_gpeHSqIYiT@www\\.recipeboardplus\\.com)|(Recipe_Board_Plus_hYpxDyhZpP@www\\.myrecipeguideonline\\.com)|(Recipe_Board_Plus_pfyXDonFTr@www\\.recipeboardplus\\.com)|(Recipe_Book_Search_d62d1a871fc0f1d38ecf6b7653ae688b@www\\.recipebooksearch\\.com)|(Recipe_Book_Search_MRJMOtSRZt@www\\.recipebooksearch\\.com)|(Recipe_Book_Tab_3deea22a93f8e99342510c9cb16ccdf4@www\\.recipebooktab\\.com)|(Recipe_Guide_Plus_41c1f7d66a164e59a4721902d4a0a6c5@www\\.recipeguideplus\\.com)|(Recipe_Guide_Plus_dHGfHpqpFD@www\\.recipeguideplus\\.com)|(Recipe_Online_gwFoqximpy@www\\.recipeonline\\.net\\.test)|(Recipe_Search_Guide_e1d73ceb736fe3f0cf7b0da6063a92b3@www\\.recipesearchguide\\.com)|(Recipe_Search_Guide_mbFGBVqpia@www\\.recipesearchguide\\.com)|(Recipe_Search_Plus_5bc244154d5ed1b0fa3e2ff8e788ddbd@www\\.recipesearchplus\\.com)|(Recipe_Search_Plus_FxKIeZgMHD@www\\.recipesearchplus\\.com)|(Recipes_by_Alot_klEAJdojHM@www\\.mydailyrecipes\\.co)|(sahil@searchprivacy\\.co)|(Satellite_Maps_Now_aPVhlrXyLu@www\\.satellitemapsnow\\.com)|(Say_Rosary_7fbf455ac8a8d9319ec8e9c888bbc8f0@www\\.sayrosary\\.com)|(Say_Rosary_IoTPeJHVYN@www\\.sayrosary\\.com)|(Search_Anonymous_3914bca7a10a50db91f284a844eeec2f@www\\.searchanonymous\\.co)|(Search_Anonymous_kHrtzTbIUW@www\\.searchanonymous\\.co)|(Search_Atlas_8c11f710a756258b85fce73f36080a00@www\\.searchatlas\\.co)|(Search_Atlas_a65471976592d8afb32ab1d355329f4f@www\\.searchatlas\\.co)|(Search_Atlas_fgPWjhrMII@www\\.searchatlas\\.co)|(Search_Atlas_JvMkNyzBew@www\\.searchatlas\\.co)|(Search_Beacon_App_eqehzqftmN@www\\.searchbeaconapp\\.com)|(Search_Center_clone_jwMueYZfAC@www\\.searchcenter\\.co)|(Search_Central_c4359af19cd8d0828733d75832e3bb87@www\\.searchcentral\\.co)|(Search_Direct_Pro_qkzlUJiGov@www\\.searchdirectpro\\.com)|(Search_Easy_008d08b3ff05afbcae6df5b92296a6d0@www\\.search-easy\\.co)|(Search_Easy_Go_577387e8b765f721486040e639398c71@www\\.searcheasygo\\.com)|(Search_Easy_Go_80d5131cc8b26c5c4af3f4aa83886f7f@www\\.searcheasygo\\.com)|(Search_Easy_Go_AvYrOIFWDF@www\\.searcheasygo\\.com)|(Search_Easy_Hub_2f45453af53121c146d7bf5c3dd914c3@www\\.searcheasyhub\\.com)|(Search_Easy_kDZUkxUbSP@www\\.search-easy\\.co)|(Search_Easy_Plus_3f7d63b42346d0eb02176aa32f33b9a4@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_8965c3185ad17bdd1c759078bcde92f0@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_8d7d969cf1d24004447fa0066e4dfd02@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_8f70d67adfbdd9aa623aa2057efffc8b@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_9e6663ee2c4803fe1e7bf20b90f26e96@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_aMOxRncWIJ@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_cdb1d9b83ae0801f912e8b73cac0836f@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_dedOWbqqXd@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_DHIlDaCkwl@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_dWFEmfADcn@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_eRdOVuRKeX@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_HlNUDYUqua@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_njXAdPCyfZ@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_rrXYlzwRaJ@www\\.searcheasyplus\\.com)|(Search_Easy_Pro_20670965804c5d16d21370f657dcdca0@www\\.searcheasypro\\.com)|(Search_Easy_Pro_73aa350eceb1758d88bd3edb17b26a95@www\\.searcheasypro\\.com)|(Search_Easy_Pro_VDbJUdDuEi@www\\.searcheasypro\\.com)|(Search_Easy_Web_ad43024621fcd724bf50596e41f6852f@www\\.searcheasyweb\\.com))$/","prefs":[],"schema":1576758467216,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b0054d00-739f-43e5-a6a4-22a56fd09844","last_modified":1576771657063},{"guid":"/^((Search_Easy_Web_tvqEdWRwUI@www\\.searcheasyweb\\.com)|(Search_Express_CgqiRHXtYw@www\\.yoursearchexpress\\.com)|(Search_For_Maps_gLRdugmyXV@www\\.search-maps\\.net)|(Search_Plus_090a3f242292c36b80d33fd7e48aeb84@www\\.search-plus\\.co)|(Search_Plus_App_2d6fef8895df8a9a67c9bd3b15438abf@www\\.searchplusapp\\.com)|(Search_Plus_App_zZmjIdjudH@www\\.searchplusapp\\.com)|(Search_Plus_lPNIzNDSuX@www\\.search-plus\\.co)|(Search_Plus_Now_04ba3f2b13d728af94433e016d46239d@www\\.searchplusnow\\.com)|(Search_Plus_Now_312928a70ba3909e221b0524753bf126@www\\.weatherforecasttracker\\.com)|(Search_Plus_Now_7a64f4abfa7dba3075cabf9896c8fa19@www\\.searchplusnow\\.com)|(Search_Plus_Now_81c0506ff8d40fb8a7daa44222962215@www\\.searchplusnow\\.com)|(Search_Plus_Now_clone_sgREjdpaZx@www\\.searchplusnow\\.com)|(Search_Plus_Now_clone_SMpbwlnYxa@www\\.searchplusnow\\.com)|(Search_Plus_Now_fuKTpdNeOn@www\\.mapmytravel\\.co)|(Search_Plus_Now_RUxZwdNBtU@www\\.searchplusnow\\.com)|(Search_Plus_Now_YQIFAskSvi@www\\.weatherforecasttracker\\.com)|(Search_Plus_Pro_248f4aa071807a8d8f35bf57aef7b217@www\\.mapmytravel\\.co)|(Search_Plus_Pro_c5202d6e9fff0fb53512d681772f0244@www\\.searchpluspro\\.com)|(Search_Plus_Pro_cBmYtdkkFb@www\\.searchpluspro\\.com)|(Search_Plus_Pro_clone_egAEtDTMkX@www\\.searchpluspro\\.com)|(Search_Plus_Pro_clone_KRXJEhDHND@www\\.searchpluspro\\.com)|(Search_Plus_Pro_clone_odzZVUScjD@www\\.searchpluspro\\.com)|(Search_Plus_Pro_clone_SpGuCbnjPE@www\\.searchpluspro\\.com)|(Search_Plus_Pro_d67fb2263b88d9d41bae10a6e2ae855b@www\\.searchpluspro\\.com)|(Search_Plus_Pro_f7d126d7141628c1b739c58997b082b2@www\\.searchpluspro\\.com)|(Search_Plus_Pro_f889c071fa2a90062f8eeb4e7fd56db6@disable\\.searchpluspro\\.com)|(Search_Plus_Pro_fab7d78fa6444068be71b39db91e15ff@www\\.searchpluspro\\.com)|(Search_Privacy_clone_ozOdXpYKTM@www\\.search-privacy\\.live)|(Search_Privacy_clone_UDbsERGbgS@www\\.privacysearch\\.news)|(Search_Privacy_dIeFDdYUHg@www\\.searchprivacy\\.xyz)|(Search_Privacy_dKaGZWBFIM@www\\.searchprivacy\\.today)|(Search_Privacy_jpagAkMKvy@www\\.search-privacy\\.today)|(Search_Privacy_llZnkTGcOa@www\\.searchprivacy\\.today)|(Search_Privacy_naGfXaprzJ@info\\.searchprivacy\\.co)|(Search_Privacy_PQZCFxQkZX@www\\.privacysearch\\.news)|(Search_Privacy_qUxDJagEVN@www\\.searchprivacy\\.live)|(Search_Privacy_uVBxmwGLSk@www\\.privacy-search\\.works)|(Search_Privacy_wZVkQUHrHw@www\\.privacysearch\\.live)|(Search_Privacy_ZpneZaXeZp@www\\.search-privacy\\.live)|(Search_Privacy_ZvcIJuofJd@www\\.privacy-search\\.org)|(Search_Recipe_Pro_c299176cc8e5b03509bc091d92718516@www\\.searchrecipepro\\.com)|(search_Recipe_Pro_hZSnuXpHlI@www\\.searchrecipepro\\.com)|(Search_Secure_5fe09050cfe3944c0782c53e6aead42f@www\\.searchsecure\\.co)|(Search_Secure_5fe09050cfe3944c0782c53e6aead42fhsadghs@www\\.searchsecure\\.co)|(Search_Secure_clone_haBhKCwJbD_34@www\\.searchsecurepro\\.co)|(Search_Secure_clone_haBhKCwJbD1@www\\.searchsecurepro\\.co)|(Search_Secure_PUhUZXSDqx@www\\.searchsecure\\.co)|(Search_Select_804ce00595966fa5ced4efb6e0919d6f@www\\.searchselect\\.co)|(Search_Select_FQCSJqYZdP@www\\.searchselect\\.co)|(Search_Voyager_91c3275d156ab7272e24590b4f7f49d6@www\\.searchvoyager\\.co)|(Search_Voyager_PgzBPOqQhh@www\\.searchvoyager\\.co)|(search-movie\\.net_cURRAPTBgN@www\\.search-movie\\.net)|(search-movie\\.online_PqiotXlNOM@www\\.search-movie\\.online)|(search-movie\\.today_jpmWHncsRI@www\\.search-movie\\.today)|(Search-Privacy\\.biz_ZPdXCSGFgO@www\\.search-privacy\\.biz)|(Search-Privacy\\.club_CtlbxhsuVt@info\\.search-privacy\\.club)|(Search-Privacy\\.desi_AdRXpDarGi@info\\.search-privacy\\.desi)|(Search-Privacy\\.in\\.net_WibIleNEHx@info\\.search-privacy\\.in\\.net)|(Search-Privacy\\.info_rsNLqucdiG@info\\.search-privacy\\.info)|(Search-Privacy\\.link_wDxGmBgqcl@www\\.search-privacy\\.link)|(Search-Privacy\\.me_AvAriQFEhU@www\\.search-privacy\\.me)|(Search-Privacy\\.net_nWVLWwvLtN@www\\.search-privacy\\.net)|(Search-Privacy\\.online_cYKHeBuuMA@www\\.search-privacy\\.online)|(Search-Privacy\\.org_HWNXCRCnGt@info\\.search-privacy\\.org)|(Search-Privacy\\.site_qacnidOLmc@www\\.search-privacy\\.site)|(Search-Privacy\\.space_FjfWuiGHqH@info\\.search-privacy\\.space)|(Search-Privacy\\.store_xyaGgMqtWA@www\\.search-privacy\\.store)|(Search-Privacy\\.website_smicMDEmxB@www\\.search-privacy\\.website)|(Search-Privacy\\.xyz_gBlCbCGBMh@info\\.search-privacy\\.xyz))$/","prefs":[],"schema":1576758508310,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4f75a73b-1541-4d50-b7c7-4d3524619899","last_modified":1576771657059},{"guid":"/^((Search-Tab\\.net_qpBMgxRRKX@www\\.search-tab\\.net)|(searchmovie\\.today_rRBhPdnLIB@www\\.searchmovie\\.today)|(SearchPrivacy\\.Biz_TQxQMmZjax@info\\.searchprivacy\\.biz)|(SearchPrivacy\\.club_sbgzeaMJld@info\\.searchprivacy\\.club)|(SearchPrivacy\\.company_lbwegvHahG@www\\.searchprivacy\\.company)|(SearchPrivacy\\.in\\.net_ozDwuJlbCG@info\\.searchprivacy\\.in\\.net)|(SearchPrivacy\\.Info_zDsfyaIpyx@info\\.searchprivacy\\.info)|(SearchPrivacy\\.link_MEIDSFxuIf@www\\.searchprivacy\\.link)|(SearchPrivacy\\.me_SHWxbNO@info\\.searchprivacy\\.me)|(SearchPrivacy\\.one_JRipaiPyZz@www\\.searchprivacy\\.one)|(SearchPrivacy\\.space_AJTsgDwydV@info\\.searchprivacy\\.space)|(SearchPrivacy\\.store_NqrJweiCoL@www\\.searchprivacy\\.store)|(SearchPrivacy\\.website_EYeCzNtENe@www\\.searchprivacy\\.website)|(searchprivacy@searchprivacy\\.co)|(searchprivacyco@info\\.search-privacy\\.co)|(searchprivacydemo@searchprivacy\\.co)|(SearchSafe_cmZnrUyIXL@www\\.searchsafe\\.site)|(SearchSafe\\.online_bTqWKNIadp@www\\.searchsafe\\.online)|(SearchSafe\\.website_NFNXBQxRPA@www\\.searchsafe\\.website)|(searchsafee_VRAYffGolz@staging\\.findmaps\\.co)|(SearchTab\\.co_bEVNcWEgQN@www\\.searchtab\\.co)|(SearchTab\\.online_gZFeDEkoQl@www\\.searchtab\\.online)|(Severe_Weather_Check_51c60f3de3995f14f71373a70593618c@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_bcb8c4ad7063c40e0e5b2d0f64ba11a5@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_clone_joZdMWExSs@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_clone_VlvXXiHGHD@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_clone_xBNchBtncq@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_muRAWnsLSV@www\\.severeweathercheck\\.com)|(Single_Login_pHoBMgvLtK@single\\.login\\.com)|(Smart_-_Search_cQYvhxQOuG@www\\.EasyOnlineRecipe\\.net)|(SMART_-_SEARCH_hYubbcgBlB@www\\.netspeedcalculator\\.net)|(Smart_File_Converter_clone_BVgFKwVsaS@www\\.smartfileconverter\\.com)|(Smart_File_Converter_IasnkilxwD@www\\.smartfileconverter\\.com)|(Smart_Package_Tracker_06309abe3838d3a65fcbc43e2958851e@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_1e9ff4a4ee10df2fb289180d5bb635bb@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_705864a844f3d8d84a5aecba1f675809@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_9ef0b4fcd24ee214476e73afb6adbb2e@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_bfc6ce01ede9446711a752c034df59c4@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_KVsdeebRuB@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_OvvQZsPtpR@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_SRguaqnzXn@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_XRHzsWuwOn@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_yPTsguhReR@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_ZxioLKlnOD@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_db3d13974ca0682b514ad40e0f1fc682@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_jqLcWhCacs@www\\.smartpackagetracker\\.com)|(Smart_Search_05fc1caf5755ccc74a092042913cbbda@www\\.finddirections\\.co)|(Smart_Search_10751eb8462a19515e0f9f1525333d1d@www\\.game-quest\\.co)|(Smart_Search_118237f18afcc2ce76539a9d1e015bc2@www\\.dailygame\\.online)|(Smart_Search_13d2b5842a0358c117dd87411a84db0d@www\\.convertfilesonline\\.co)|(Smart_Search_2160f8e9f48a63f3d9d7a019b9a5c53d@www\\.finddirections\\.co)|(Smart_Search_2834376aee173a89462511cf3ae21633@www\\.dailyrecipesearch\\.net)|(Smart_Search_287a4b04b4dca219a02375ca2f6a4985@www\\.finddailycoupons\\.com)|(Smart_Search_3f36608d872e4e46edd8b4e57902e6bd@www\\.dailyrecipesearch\\.net)|(Smart_Search_5cad449f0283b0b10b9cd78472de5c54@www\\.finddirections\\.co)|(Smart_Search_69eb8884d7d2e0aabdad154644e38401@www\\.convertmyfile\\.co)|(Smart_Search_6a0b26a582308b0dd9ae82634ccfe6f7@www\\.localweathertoday\\.net)|(Smart_Search_77710b6943d36049c1b72d9035a63379@www\\.localweathertoday\\.net)|(Smart_Search_7f90cdefd25d69c792d02cec7763b41d@www\\.finddirections\\.co)|(Smart_Search_814229d05c1e81d4ce1e73a3ca7c3eaa@www\\.smartsearchnow\\.co)|(Smart_Search_94fb06cfccd5d4112f555fb00a1b38ec@www\\.finddirections\\.co)|(Smart_Search_a1e27539ac89c70a170688ee375c5426@www\\.finddailycoupons\\.com)|(Smart_Search_a98fb26ee015d18ad91a68c7124e1f30@www\\.get-news\\.co)|(Smart_Search_abeJBrRXlb@www\\.smart-search\\.one))$/","prefs":[],"schema":1576758534450,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"24adcec0-6f62-41bd-9e13-97895838bf64","last_modified":1576771657055},{"guid":"/^((Smart_Search_aKLddQIYMY@www\\.gamesdaily\\.online)|(Smart_Search_aQBxkbfpqq@www\\.finddirections\\.co)|(Smart_Search_aStviFIoor@www\\.finddirections\\.co)|(Smart_Search_aTGazruEUE@www\\.search-smart\\.co)|(Smart_Search_ayroufrtQb@www\\.finddirections\\.co)|(Smart_Search_b08c081d9f06123fb6172679fdf4fcb6@www\\.finddirections\\.co)|(Smart_Search_b859bcf9fb977dc2076199076b2f9081@www\\.convertmyfile\\.co)|(Smart_Search_bbgycNKlXh@www\\.dailyjobssearch\\.net)|(Smart_Search_bdDgpqbSTU@www\\.smartsearchnow\\.co)|(Smart_Search_bnnlTJEfCZ@www\\.search-smart\\.live)|(Smart_Search_BWMiEUiCaH-my@www\\.findmaps\\.co)|(Smart_Search_BWMiEUiCaH@www\\.findmaps\\.co)|(Smart_Search_c14750a49aa2937ede499b641a6c4390@www\\.finddirections\\.co)|(Smart_Search_cb20a26ab1dc76cc9f793fb975be4b02@www\\.smartsearchnow\\.co)|(Smart_Search_cFSWRyjwef@www\\.smart-search\\.today)|(Smart_Search_chUMEQmsSU@www\\.finddirections\\.co)|(Smart_Search_CIWmtesCzJ@www\\.mycouponstore\\.co)|(Smart_Search_cKezTfCPJB@www\\.checkmaps\\.live)|(Smart_Search_cKnSYkYtgM@www\\.check-yourmail\\.co)|(Smart_Search_clone_bZjlXmDRQB@www\\.finddirections\\.co)|(Smart_Search_clone_duXXvsUEtZ@www\\.finddirections\\.co)|(Smart_Search_clone_EQDmJygWxO@www\\.searchsmart\\.online)|(Smart_Search_clone_ETXwzVYwpI@www\\.search-smart\\.work)|(Smart_Search_clone_HsJXCDiNNC@www\\.smartsearch\\.link)|(Smart_Search_clone_JxJqcLVLOv@www\\.finddirections\\.co)|(Smart_Search_clone_SoSaSQDKGZ@www\\.dailyrecipesearch\\.net)|(Smart_Search_CQbLIZDIOl@www\\.smartsearch\\.link)|(Smart_Search_CxIpAXIPVs@www\\.smart-search\\.co)|(Smart_Search_d0f38b4ff2f0e788c442249a857e4dde@www\\.finddirections\\.co)|(Smart_Search_d16ea913837e848252ad5d856d9c8b02@www\\.dailyjobssearch\\.net)|(Smart_Search_d8982f2dae25e7422cc1392ccf974d04@www\\.dailyrecipesearch\\.net)|(Smart_Search_da3cc67017bdcd720cbd7fc26f24d743@www\\.check-yourmail\\.co)|(Smart_Search_dcf5af05538a3c68edd4625c7f0d2dc4@www\\.finddailycoupons\\.com)|(Smart_Search_DLsAIStnQX@www\\.smartsearch\\.link)|(Smart_Search_dTBjWAGKlN@www\\.testnetspeed\\.co)|(Smart_Search_e34c59b523a7a1585da696e4576b101c@www\\.gamesdaily\\.online)|(Smart_Search_e6d57c56077122ca0bcef12a39e3f6a3@www\\.localweathertoday\\.net)|(Smart_Search_ea5e7bb722049dd11af40116816edee3@disable\\.convertmyfile\\.co)|(Smart_Search_EkAoOFUJwV@www\\.games-daily\\.co)|(Smart_Search_eMDQwPVVyj@www\\.search-smart\\.co)|(Smart_Search_f377b2bb34f42cbb572c36d9bfb3d9c3@www\\.finddirections\\.co)|(Smart_Search_fbd05acb7ab6331297e367f816ff0a20@www\\.testnetspeed\\.co)|(Smart_Search_FCphmgFrTz@www\\.finddailygames\\.co)|(Smart_Search_FMxybFLCfE@www\\.smart-search\\.today)|(Smart_Search_gGkCXJUDEH@www\\.game-quest\\.co)|(Smart_Search_HnEqPdzcek@www\\.search-smart\\.live)|(Smart_Search_IbBWPmuFLU@www\\.convertfilesonline\\.co)|(Smart_Search_JcpHMeulsq@www\\.dailyrecipesearch\\.net)|(Smart_Search_JJPKAMJWLv@www\\.finddailycoupons\\.com)|(Smart_Search_JTruqraRrz@www\\.localweathertoday\\.net)|(Smart_Search_JViAyYSxof@www\\.search-smart\\.today)|(Smart_Search_KjzSKpViVv@www\\.getmapfinder\\.com)|(Smart_Search_LBQKLuCjDu@www\\.search-smart\\.work)|(Smart_Search_LBUbgBMxrr@www\\.convertmyfile\\.co)|(Smart_Search_lKbvfFvWdq@www\\.finddirections\\.co)|(Smart_Search_LPxWJiUiWP@dailyrecipesearch\\.net)|(Smart_Search_lVYnIBRyYO@www\\.search-smart\\.today)|(Smart_Search_lzlfscclxO@www\\.smartsearch\\.news)|(Smart_Search_mmUSVHTgZN@www\\.searchsmart\\.website)|(Smart_Search_MYlsYAHChr@www\\.search-smart\\.one)|(Smart_Search_OYMxotguWV@www\\.thecoupon-store\\.co)|(Smart_Search_PncWXXrZyE@www\\.get-news\\.co)|(Smart_Search_PxUetfSxfK@www\\.finddirections\\.co)|(Smart_Search_qbdedBcsMV@www\\.mysmartsearch\\.online)|(Smart_Search_QFEtHYupEv@www\\.localweathertoday\\.net)|(Smart_Search_rmcVsyMvUV@www\\.finddailycoupons\\.com)|(Smart_Search_sfQjeIHqAg@www\\.onlinecouponfinder\\.net)|(Smart_Search_SLKIYTovfO@www\\.dailygame\\.online)|(Smart_Search_snYvsooWFZ@www\\.dailycoupons\\.store)|(Smart_Search_SRonsLzSpz@www\\.search-smart\\.link)|(Smart_Search_SUWIUWczzW@www\\.search-smart\\.club)|(Smart_Search_trFxvKvCFp@www\\.dailyrecipesearch\\.net)|(Smart_Search_tTrjAmWOoR@www\\.convertmyfile\\.co)|(Smart_Search_txfWPOCTvy@www\\.finddailycoupons\\.com)|(Smart_Search_UgGHEdLtFf@www\\.search-smart\\.one)|(Smart_Search_UXuBBPZiCD@www\\.search-smart\\.website)|(Smart_Search_VFsgkOxdvk@www\\.convertmyfile\\.co))$/","prefs":[],"schema":1576758569109,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"65197a67-44c8-440d-b22c-26d84b2d763e","last_modified":1576771657051},{"guid":"/^((Templates_Online_clone_UmejRGyzBe@www\\.gettemplatesonline\\.com)|(Templates_Online_clone_WiWqHXsGkm@www\\.gettemplatesonline\\.com)|(Templates_Online_xUPYerdIfL@www\\.gettemplatesonline\\.com)|(test_fhwkrCFoHO@test)|(test_searchprivacy@info\\.searchprivacy\\.info)|(TestFirefoxAddon_ahdBLDcQql@www\\.testfirefoxaddon\\.com)|(testsearchprivacy@info\\.searchprivacy\\.co)|(Text_From_Your_PC_9e43d427bd5cde52e50706cf2ce04da8@www\\.textfromyourpc\\.com)|(Text_From_Your_PC_cBapqdxFhR@www\\.textfromyourpc\\.com)|(The_Coupon_-_Store_ERhPcJTQll@thecoupon-store\\.co)|(The_Coupon_King_1209d556e43b7c529e282d8b8842da76@www\\.thecouponking\\.co)|(The_Coupon_King_lgTjuAddLR@www\\.thecouponking\\.co)|(The_Coupon_King_UwqzosFLgL@www\\.thecouponking\\.com)|(The_Coupon_Store_FuajgfDoOD@www\\.thecouponstore\\.co)|(The_Coupon_Store_lPVGxmIRUf@www\\.thecouponstore\\.co)|(The_Coupon_Store_Test_jkAVapBJTo@www\\.thecouponstore\\.co\\.test)|(The_Coupon_Trail_bdc89c2aeb9eb486945d9f9d80bdbb02@www\\.thecoupontrail\\.com)|(The_Coupon_Trail_MMnMCLSPWo@www\\.thecoupontrail\\.com)|(The_Coupon_Trial_IteRooFtcL@www\\.thecoupontrial\\.com)|(The_Coupons_Daily_efc9df81f19dc213cb2a20067afa4ccb@www\\.thecouponsdaily\\.com)|(The_Coupons_Daily_NAEBGGQbOZ@www\\.thecouponsdaily\\.com)|(The_Coupons_King_cb3ed44aa8013a310be07e3d3fcc4dc2@www\\.thecouponsking\\.co)|(The_Currency_Switch_987755b6cd2466fcb08f71503c38cbfa@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_c80da7ec7cd15c168fc419b3d69aa602@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_clone_e0f313620f09d4dfc50e3a362bac8a9a@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_clone_geyyIAUtgm@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_clone_JZMSasbVPc@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_QlvIbtxDLF@www\\.thecurrencyswitch\\.co)|(The_Movie_Quest_BPyzyFXOpw@www\\.themoviequest\\.today)|(The_Movie_Search_IgbQnCESAN@www\\.themoviesearch\\.co)|(The_Movie_Search_zFBfJgLeGc@www\\.themoviesearch\\.co)|(The_News_Prompter_e90ebcdb43eb03954526e4576d6c6b71@www\\.thenewsprompter\\.com)|(The_News_Prompter_mbjJOGhbsK@www\\.thenewsprompter\\.com)|(The_Package_Track_9e0db37d4fc02628a9996d9be9ee7ad6@www\\.thepackagetrack\\.com)|(The_Quiz_Tab_xWbNAmFREz@www\\.thequiztab\\.com)|(The_Search_Easy_44e7c2c276e66b66d8bfb874777d4a2e@www\\.thesearcheasy\\.com)|(The_Search_Easy_XObNZOoESy@www\\.thesearcheasy\\.com)|(The_Search_Plus_37976642e8a885a46631002f0051ff23@www\\.thesearch-plus\\.co)|(The_Search_Plus_UawsDpTchY@www\\.thesearch-plus\\.co)|(thecouponstore@www\\.thecoupon-store\\.co)|(TheMovie-Hub\\.net_YezkChdTjo@www\\.themovie-hub\\.net)|(TheMovie-Portal_tPUcBCgXvk_1@www\\.themovie-portal\\.com)|(TheMovie-Portal_tPUcBCgXvk@www\\.themovie-portal\\.com)|(TheMovie-Quest\\.com_wlPrmnAQDs@www\\.themovie-quest\\.com)|(TheMovieQuest\\.co_cORgvNNjpL@www\\.themoviequest\\.co)|(TheMovieQuest\\.co_fQQHMPPCrc@www\\.themoviequest\\.co)|(themoviesearch\\.today_NaQhVgVlwL@www\\.themoviesearch\\.today)|(This_is_my_extension_qZkKGOuZcR@www\\.exampleAMO\\.com)|(This_is_New_AMO_dyIGZrXnWN@www\\.kite\\.com)|(This_is_New_AMO_QVeIjjGbol@www\\.kite\\.com)|(Trace_Packages_f406b9f80935c80df1166017cdb4d6f1@www\\.tracepackages\\.com)|(Track_Daily_News_1eaf6dc15b67e558badb4d0cfe763913@www\\.trackdailynews\\.com)|(Track_Daily_News_6e84f45f079de0ffcc94b2d968db9bee@www\\.trackdailynews\\.com)|(Track_Daily_News_a339167d304bfa5f599a249dda7ce993@www\\.trackdailynews\\.com)|(Track_Daily_News_EIMlViVmYz@www\\.trackdailynews\\.com)|(Track_Daily_News_sCvLoGjBau@www\\.trackdailynews\\.com)|(Track_Flight_Pro_7b52baadaefaac0bc71eaa5d3ffdd62c@www\\.trackflightpro\\.com)|(Track_Flight_Pro_c7f7b664812211123e6c54706eb66c3e@www\\.trackflightpro\\.com)|(Track_Flight_Pro_clone_hNojYqaWwF@www\\.trackflightpro\\.com)|(Track_Flight_Pro_eZAWVNMAAT@www\\.trackflightpro\\.com)|(Track_Package_Pro_clone_xayswwXtnt@www\\.trackpackagepro\\.com)|(Track_Package_Pro_clone_xBtZVauyZo@www\\.trackpackagepro\\.com)|(Track_Package_Pro_KvcoWaXXaa@www\\.trackpackagepro\\.com)|(Track_Package_Quick_525020a307e84998fc7ad8a634296e1d@www\\.trackpackagequick\\.com)|(Track_Package_Quick_clone_SjXacYcSKg@www\\.trackpackagequick\\.com)|(Track_Package_Quick_clone_zTowhYQtBK@www\\.trackpackagequick\\.com)|(Track_Package_Quick_lFiXdhlnGK@www\\.trackpackagequick\\.com)|(trackthatpackagecom@www\\.trackthatpackage\\.com)|(trailertab@www\\.trailertab\\.co))$/","prefs":[],"schema":1576758629163,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5cd48455-378c-4e67-a37d-8c39d497b4af","last_modified":1576771657042},{"guid":"/^((Translate_cgjqtumrjO@app\\.translate\\.com)|(Travel_Deals_Center_clone_GJNQLATOqW@www\\.traveldealscenter\\.co)|(Travel_Deals_Center_rqctZxkUaz@www\\.traveldealscenter\\.co)|(Travel_Directions_clone_FfMthspRaM@www\\.traveldirections\\.co)|(Travel_Directions_clone_ourIqJKEoa@www\\.traveldirections\\.co)|(Travel_Directions_mvJHkLHMMo@www\\.traveldirections\\.co)|(Tv_Shows_Online_4331a381f3f1b8d9f9f0b56793be73be@www\\.tvshowsonline\\.co)|(Tv_Shows_Online_MpTzgCmWDM@www\\.tvshowsonline\\.co)|(TV_Streaming_Plus_ARhtOdhYyz@www\\.tvstreamingplus\\.co)|(tyghn_EbxtKCSoQf@ghn)|(Universal_Package_Tracker_vEmOcVlKPs@www\\.universalpackagetrackern\\.online)|(Weather_Alert_Pro_BodPvrEWvi@www\\.weatheralertpro\\.co)|(Weather_Alert_Pro_clone_sTGOfwOqRV@www\\.weatheralertpro\\.co)|(Weather_Alert_Pro_eAvhNglZrt@www\\.weatheralertpro\\.com)|(Weather_Center_App_06cc2a6dd45345b134670c50b38c8692@www\\.weathercenterapp\\.com)|(Weather_Center_App_edIZBMRKqw@www\\.weathercenterapp\\.com)|(Weather_Center_App_ef684143ed5bb6671446fa504a5feec8@www\\.weathercenterapp\\.com)|(Weather_Center_App_f860fbbefafc691d55516dbf9ff9de42@www\\.weathercenterapp\\.com)|(Weather_Center_App_FCsxbRlcmB@www\\.weathercenterapp\\.com)|(Weather_Center_App_rEbQRyobNS@www\\.weathercenterapp\\.com)|(Weather_Coach_aRmHcdLWxv@www\\.weather-coach\\.com)|(Weather_Coach_cnhVSyfNQb@www\\.weather-coach\\.com)|(Weather_Coach_SdaRyeWHza@www\\.weather-coach\\.com)|(Weather_Details_a74cceec1f4c6974ce48a55da22c4fc8@www\\.weather-details\\.co)|(Weather_Details_clone_WmbTEchnZv@www\\.weather-details\\.today)|(Weather_Details_DBDwBdsiUV@www\\.weather-details\\.online)|(Weather_Details_LZKpPYrFpw@www\\.weather-details\\.today)|(Weather_Details_UMhKKuOmLm@www\\.weather-details)|(Weather_Details_xrNgYMjMud@www\\.weather-details\\.today)|(Weather_Forecast_0c98741392250106567fdcdf92e662ed@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_22873441e62b17d83e57bee8dae28096@disable\\.checkweathernow\\.co)|(Weather_Forecast_26bbf7afaa8ca321d3eb1793eab261eb@www\\.checkweathernow\\.co)|(Weather_Forecast_34a39ecaa08283313fa326a45884233b@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_5432f72204437596f302a717de4410ab@www\\.localweathertoday\\.net)|(Weather_Forecast_5c6a315e6da8023a47a4e247bcd60544@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_5d13ac5f68d80a584ad913b02540fae5@www\\.checkweather\\.today)|(Weather_Forecast_647cf952e5329d490351c5b250e81e54@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_6f6484fab931bf3f3fcf75dfa65adc37@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_7462a90b29dc5f13bb4628cce7d2c6dc@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_a4fe2e9e47d66eebd6220e13d10434ef@www\\.checkweathernow\\.co)|(Weather_Forecast_BjIrtPRHri@www\\.weatherforecasttracker\\.com)|(Weather_Forecast_Buddy_hqZFZdAdSe@www\\.weatherforecastbuddy\\.com)|(Weather_Forecast_c27096e498d3541e341f2597fa7124b0@www\\.weatherforecasttracker\\.com)|(Weather_Forecast_c6509e49a9a27bdab9facfb442488a79@www\\.localweathertoday\\.net)|(Weather_Forecast_ca28589b2ca67136318e4bfdf954002d@www\\.checkweathertoday\\.net)|(Weather_Forecast_cbf70b1126d7690bf9180b2e6c43e8f6@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_ChxOzHZcLa@www\\.localweathertoday\\.net)|(Weather_Forecast_clone_60d8346940b46a116579ec1ea3906d5d@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_chFFSZCgvz@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_clone_94a823ffc8bedf3bd1e6ab4465826581@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_clone_clone_apzzlMbkyB@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_clone_clone_f2e4cad9766f8cde8ffbdd484efbdd2b@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_clone_yQjWeYXXXI@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_HErKKKDyFS@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_HOrAZgjBCz@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_jMGHMuyVVi@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_KYlMwumWQY@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_kyUmeEeefY@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_pDcEnQJDXJ@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_piPIkUDQPc@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_QoJcNyLaQt@www\\.weatherforecasttracker\\.com))$/","prefs":[],"schema":1576758680309,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a083664b-0301-45cd-a2ee-0c690be250b6","last_modified":1576771657038},{"guid":"/^((Weather_Forecast_clone_TSGzGLieya@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_UBimgpjhsm@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_XcnVeRvMca@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_YQnByPToHy@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_zkFObDWDhS@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_Daily_CTzpOZENfa@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_e3838c6031faf63c6209533e71b456c0@www\\.weatherforecastdaily\\.disabled\\.com)|(Weather_Forecast_EnkDNfGxAS@www\\.checkweathernow\\.co)|(Weather_Forecast_epwQJrNJwH@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_eWEHJWtQzM@www\\.checkweathertoday\\.net)|(Weather_Forecast_eWFHhLxmdi@www\\.checkweathernow\\.co)|(Weather_Forecast_f5d79bda8e7d666123f8cff0f49720ab@www\\.localweathertoday\\.net)|(Weather_Forecast_FbozBLKAnT@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_fc107df349d96479678eb88a9d2f58b3@www\\.weatherforecasttracker\\.com)|(Weather_Forecast_KlMFWMEnxo@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_KNdWdwrVBg@www\\.weather-forecast\\.link)|(Weather_Forecast_lESFprnxRC@www\\.checkweathernow\\.co)|(Weather_Forecast_nsdhLSCwEt@www\\.weather-forecast\\.news)|(Weather_Forecast_OMezCgBGlR@www\\.weather-forecast\\.link)|(Weather_Forecast_Plus_81c2ce246488019a54fed798354fbb85@www\\.weatherforecastplus\\.com)|(Weather_Forecast_Plus_WVxlZhsVCn@www\\.weatherforecastplus\\.com)|(Weather_Forecast_QqFyFxILHq@www\\.checkweather\\.today)|(Weather_Forecast_rUPfzmWQNa@www\\.localweathertoday\\.net)|(Weather_Forecast_Search_4f3974a0460bd8947f25b61879196ae6@www\\.weatherforecastsearch\\.com)|(Weather_Forecast_Search_SPAKKzWPua@www\\.weatherforecastsearch\\.com)|(Weather_Forecast_SjMIOdqezy@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_Tab_d586ce62eebca7b5ccd054f645ab3278@www\\.weatherforecasttab\\.com)|(Weather_Forecast_Tab_LHutnjYcaD@www\\.weatherforecasttab\\.com)|(Weather_Forecast_UZnBodXSQY@www\\.localweathertoday\\.net)|(Weather_Forecast_V2_c8e3c1f489201dcee4f10ed13b88423b@www\\.weatherforecasttracker1\\.com)|(Weather_Info_AdPTHnolyR@www\\.weatherinfo\\.live)|(Weather_Info_clone_IylhdngkdZ@www\\.weatherinfo\\.live)|(Weather_Info_clone_LAyJxkrWYr@www\\.weatherinfo\\.live)|(Weather_Info_mYTEbKRsJk@www\\.weatherinfo\\.live)|(Weather_Info_rBUleVUgYg@www\\.weatherinfo\\.today)|(Weather_Info_ZurIhFqkfO@www\\.weatherinfo\\.live)|(Weather_Online_Now_clone_gXBxUraWkz@www\\.weatheronlinenow\\.com)|(Weather_Online_Now_clone_VEajkSqfLm@www\\.weatheronlinenow\\.com)|(Weather_Online_Now_LxMeLWImMw@www\\.weatheronlinenow\\.com)|(Weather_Report_69d519795ecb2edb106cf07b8e5fcbae@www\\.weatherreportlive\\.co)|(Weather_Report_JHDIwuETLZ@www\\.weather-report\\.live)|(Weather_Report_PdxgfapiBL@www\\.weatherreportlive\\.co)|(Weather_Report_WKPqFTsXUk@www\\.weather-report\\.live)|(Weather_Reporter_98959e99f2103eef2d02f3d351ba89b9@www\\.weatherreporter\\.co)|(Weather_Reports_BjGuRgCpLB@www\\.weather-reportsnow\\.com)|(Weather_Reports_c982e1b51cd8bc347ab328410329fbb6@www\\.weatherreports\\.live)|(Weather_Reports_clone_fRjlGYJSnk@www\\.weatherreports\\.live)|(Weather_Reports_clone_NMTTAUMqtY@www\\.dailyweatherreports\\.co)|(Weather_Reports_EQVqqGZdlM@www\\.weather-report\\.link)|(Weather_Reports_HlXmMSuFKX@www\\.weatherreports\\.live)|(Weather_Reports_KDxyqUBBwO@www\\.dailyweatherreports\\.co)|(Weather_Reports_UyzmbxlFVx@www\\.weather-reports\\.today)|(Weather_Reports_xaeygHwNhf@www\\.weatherreports\\.live)|(Weather_Reports_zDpccdTchc@www\\.weatherreports\\.today)|(Weather_Reports_zKYmoRPwNT@www\\.weatherreports\\.live)|(Weather_Tab_Pro_clone_aTBTPSAEUX@www\\.weathertabpro\\.com)|(Weather_Updates_TGBOowTNwY@www\\.weather-updates\\.co)|(Weather-Bee_1b435f4656c8c4f6df6b455cc302cf9b@www\\.weather-bee\\.co)|(Weather-Bee_cbff90268cbc8e1fd65336342cfcf056@www\\.weather-bee\\.co)|(Weather-Bee_deb8c4f31d28d8ef924d8604c528f43b@www\\.weather-bee\\.com)|(Weather-Bee_gFubKNACfC@www\\.weather-bee\\.co)|(Weather-Bee_HyIkcLzmEL@www\\.weather-bee\\.co)|(Weather-Bee_oUeUqEGckY@www\\.weather-bee\\.com)|(WeatherDetails_qGhRPwNzlD@www\\.weatherdetails\\.net)|(Web_Gamer_World_clone_bBqNIFWIiJ@www\\.webgamerworld\\.com)|(Web_Gamer_World_clone_vSvnetvjxh@www\\.webgamerworld\\.com)|(Web_Gamer_World_EnPQSoVMPy@www\\.webgamerworld\\.com))$/","prefs":[],"schema":1576758713481,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"86bffc98-7002-4c94-84b1-2036f19f1345","last_modified":1576771657033},{"guid":"/^((WheresMyPackage\\.co_04c5041d404a424ae04b3bdae470bf36@www\\.wheresmypackage\\.co)|(WheresMyPackage\\.co_nkiJdrfSTz@www\\.wheresmypackage\\.co)|(wheresmypackageco@www\\.wheresmypackage\\.co)|(Wonder_Wallpaper_7445d465b196ea5672cf5ddad5121e20@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_86c968090b99d54af67a65a1c6010dc8@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_clone_b3a8885c9af58cc53b837522fbeab5fa@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_clone_BdEgqQaNqI@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_clone_rujWfVzPPf@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_XONDNNciYs@www\\.wonderwallpaper\\.co)|(www\\.search-privacy\\.in\\.net_frtQaDOkLW@www\\.search-privacy\\.in\\.net)|(www\\.search-privacy\\.info_hyVgVlpUDh@www\\.search-privacy\\.info)|(Your_Mail_Tab_06f9e0cacb38332e7d67d6f6eb36fbf4@www\\.yourmailtab\\.com)|(Your_Mail_Tab_27811aa670d957af7c67c9b40421db33@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_FFlaTZQUzT@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_kckMtSXzhP@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_rZgtWWxFTE@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_tplYnwtbOB@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_UStpWwUYys@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_wQEiyJhcTK@www\\.yourmailtab\\.com)|(Your_Mail_Tab_sHxtuglHxJ@www\\.yourmailtab\\.com)|(Your_Map_Tab_caf5c90424b052d0a732d773f984284d@www\\.yourmaptab\\.com)|(Your_Map_Tab_MGrwdnTuFV@www\\.yourmaptab\\.com)|(Your_Maps_Finder_1cb2c0753a9f2089208e662ff7887eff@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_283a77e3a6a0c1cb4d803b12b7b3f38d@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_299d66c546dc1bf61c2f1ac4a823d848@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_2b2f2c9fdc74da065784a5537d7cbe8a@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_493f8ad05595d053fc466c6d712a0f5b@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_5fb3ba7aabc0df0482f721f2b8226c49@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_8ec3602a25914b2b98753c78f3ff0792@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_a4e12e88158bb14fe3f3b23935d1005b@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_clone_KCngJjrrAW@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_CVslhcZliG@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_dfeYIGYOsX@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_gSkAwghnnM@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_HbjLLgCqVI@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_IAQSXqZaut@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_IjXrmViPjV@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_jfCclXiWUZ@www\\.yourmapsfinder\\.com)|(Your_Maps_Guide_gJsxGXyDUk@www\\.yourmapsguide\\.com)|(Your_Recipes_Guide_6e2b67bec168f977b275d2cb8e38cb99@www\\.yourrecipesguide\\.com)|(Your_Recipes_Guide_pjXpEcLtqt@www\\.yourrecipesguide\\.com)|(Yum_Recipe_finder_5de2cc2f278f3bfc1a3715a70c8661f0@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_93a02159e31918ef11d89db653420167@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_clone_AoObYTQNIW@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_clone_c3c1e13d25490ca78859e8857319b432@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_clone_nFKjdQhPjD@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_clone_oIeIcINzWP@www\\.yumrecipefinder\\.com)|(Yum_Recipe_Finder_CqcblSJbqU@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_eb8981fe181afd4e02a57fd9c4b9e8f2@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_mgdDNujmFJ@www\\.yumrecipefinder\\.com))$/","prefs":[],"schema":1576758771928,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bfa84d62-24de-474e-bc35-a69b1f46f331","last_modified":1576771657029},{"guid":"/^((@FirefoxUpdate)|(@googledashboard)|(@smash_mov)|(@smash_tv)|(@smashdashboard)|(@smashmovs)|(@smashtvs)|(\\{0be01832-7cce-4457-b8ad-73b743914085\\})|(\\{0e1c683e-9f34-45f1-b365-a283befb471a\\})|(\\{0c72a72d-6b2e-4a0e-8a31-16581176052d\\})|(\\{0ccfc208-8441-4c27-b1cb-799accb04908\\})|(\\{0ede8d39-26f2-49c4-8014-dfc484f54a65\\})|(\\{1fc1f8e6-3575-4a6f-a4d1-c4ca1c36bd2a\\})|(\\{3a1d6607-e6a8-4012-9506-f14cd157c171\\})|(\\{03b3ac4d-59a3-4cc6-aa4d-9b39dd8b3196\\})|(\\{3bb6e889-ac7a-46ca-8eed-45ba4fbe75b5\\})|(\\{3c841114-da8c-44ea-8303-78264edfe60b\\})|(\\{3f3bcb3e-dd73-4410-b102-60a87fcb8323\\})|(\\{3f951165-fd85-42ae-96ef-6ff589a1fe72\\})|(\\{04c86cb3-5f52-4083-9e9a-e322dd02181a\\})|(\\{4d8b44ef-9b8b-4d82-b668-a49648d2749d\\})|(\\{4d25d2b4-6ae7-4a66-abc0-c3fca4cdddf6\\})|(\\{5c9a2eca-2126-4a84-82c0-efbf3d989371\\})|(\\{6ecb9f49-90f0-43a1-8f8a-e809ea4f732b\\})|(\\{6fb8289d-c6c8-4fe5-9a92-7dc6cbf35349\\})|(\\{7fea697d-327c-4d20-80d5-813a6fb26d86\\})|(\\{08a3e913-0bbc-42ba-96d7-3fa16aceccbf\\})|(\\{8b04086b-94a5-4161-910b-59e3e31e4364\\})|(\\{08c28c16-9fb6-4b32-9868-db37c1668f94\\})|(\\{8cd69708-2f5e-4282-a94f-3feebc4bce35\\})|(\\{8dc21e24-3883-4d01-b486-ef1d1106fa3d\\})|(\\{8f8cc21a-2097-488f-a213-f5786a2ccbbf\\})|(\\{9c8b93f7-3bf8-4762-b221-40c912268f96\\})|(\\{9ce66491-ef06-4da6-b602-98c2451f6395\\})|(\\{1e1acc1c-8daa-4c2e-ad05-5ef01ae65f1e\\})|(\\{10b0f607-1efa-4762-82a0-e0d9bbae4e48\\})|(\\{24f338d7-b539-49f1-b276-c9edc367a32d\\})|(\\{40c9030f-7a2f-4a58-9d0a-edccd8063218\\})|(\\{41f97b71-c7c6-40b8-83b1-a4dbff76f73d\\})|(\\{42f3034a-0c4a-4f68-a8fd-8a2440e3f011\\})|(\\{52d456e5-245a-4319-b8d2-c14fbc9755f0\\})|(\\{57ea692b-f9fe-42df-bf5e-af6953fba05a\\})|(\\{060c61d8-b48f-465d-aa4b-23325ea757c3\\})|(\\{65c1967c-6a5c-44dd-9637-0d4d8b4c339b\\})|(\\{65d40b64-b52a-46d8-b146-580ff91889cb\\})|(\\{75b7af0d-b4ed-4320-95c8-7ffd8dd2cb7c\\})|(\\{77fe9731-b683-4599-9b06-a5dcea63d432\\})|(\\{84b20d0c-9c87-4340-b4f8-1912df2ae70d\\})|(\\{92b9e511-ac81-4d47-9b8f-f92dc872447e\\})|(\\{95afafef-b580-4f66-a0fe-7f3e74be7507\\})|(\\{116a0754-20eb-4fe5-bd35-575867a0b89e\\})|(\\{118bf5f6-98b1-4543-b133-42fdaf3cbade\\})|(\\{248eacc4-195f-43b2-956c-b9ad1ae67529\\})|(\\{328f931d-83c1-4876-953c-ddc9f63fe3b4\\})|(\\{447fa5d3-1c27-4502-9e13-84452d833b89\\})|(\\{476a1fa9-bce8-4cb4-beff-cb31980cc521\\})|(\\{507a5b13-a8a3-4653-a4a7-9a03099acf48\\})|(\\{531bf931-a8c6-407b-a48f-8a53f43cd461\\})|(\\{544c7f83-ef54-4d17-aa91-274fa27514ef\\})|(\\{546ea388-2839-4215-af49-d7289514a7b1\\})|(\\{635cb424-0cd5-4446-afaf-6265c4b711b5\\})|(\\{654b21c7-6a70-446c-b9ac-8cac9592f4a9\\})|(\\{0668b0a7-7578-4fb3-a4bd-39344222daa3\\})|(\\{944ed336-d750-48f1-b0b5-3c516bfb551c\\})|(\\{1882a9ce-c0e3-4476-8185-f387fe269852\\})|(\\{5571a054-225d-4b65-97f7-3511936b3429\\})|(\\{5921be85-cddd-4aff-9b83-0b317db03fa3\\})|(\\{7082ba5c-f55e-4cd8-88d6-8bc479d3749e\\})|(\\{7322a4cb-641c-4ca2-9d83-8701a639e17a\\})|(\\{90741f13-ab72-443f-a558-167721f64883\\})|(\\{198627a5-4a7b-4857-b074-3040bc8effb8\\})|(\\{5e5b9f44-2416-4669-8362-42a0b3f97868\\})|(\\{824985b9-df2a-401c-9168-749960596007\\})|(\\{4853541f-c9d7-42c5-880f-fd460dbb5d5f\\})|(\\{6e6ff0fd-4ae4-49ae-ac0c-e2527e12359b\\})|(\\{90e8aa72-a7eb-4337-81d4-538b0b09c653\\})|(\\{02e3137a-96a4-433d-bfb2-0aa1cd4aed08\\})|(\\{9e734c09-fcb1-4e3f-acab-04d03625301c\\})|(\\{a6ad792c-69a8-4608-90f0-ff7c958ce508\\})|(\\{a512297e-4d3a-468c-bd1a-f77bd093f925\\})|(\\{a71b10ae-b044-4bf0-877e-c8aa9ad47b42\\})|(\\{a33358ad-a3fa-4ca1-9a49-612d99539263\\})|(\\{a7775382-4399-49bf-9287-11dbdff8f85f\\})|(\\{afa64d19-ddba-4bd5-9d2a-c0ba4b912173\\})|(\\{b4ab1a1d-e137-4c59-94d5-4f509358a81d\\})|(\\{b4ec2f8e-57fd-4607-bf4f-bc159ca87b26\\})|(\\{b06bfc96-c042-4b34-944c-8eb67f35630a\\})|(\\{b9dcdfb0-3420-4616-a4cb-d41b5192ba0c\\})|(\\{b8467ec4-ff65-45f4-b7c5-f58763bf9c94\\})|(\\{b48e4a17-0655-4e8e-a5e2-3040a3d87e55\\})|(\\{b6166509-5fe0-4efd-906e-1e412ff07a04\\})|(\\{bd1f666e-d473-4d13-bc4d-10dde895717e\\})|(\\{be572ad4-5dd7-4b6b-8204-5d655efaf3b3\\})|(\\{bf2a3e58-2536-44d4-b87f-62633256cf65\\})|(\\{bfc5ac5f-80bd-43e5-9acb-f6d447e0d2ce\\})|(\\{bfe3f6c1-c5fe-44af-93b3-576812cb6f1b\\})|(\\{c0b8009b-57dc-45bc-9239-74721640881d\\})|(\\{c1cf1f13-b257-4271-b922-4c57c6b6e047\\})|(\\{c3d61029-c52f-45df-8ec5-a654b228cd48\\})|(\\{c39e7c0b-79d5-4137-bef0-57cdf85c920f\\})|(\\{ce043eac-df8a-48d0-a739-ef7ed9bdf2b5\\})|(\\{cf62e95a-8ded-4c74-b3ac-f5c037880027\\})|(\\{cff02c70-7f07-4592-986f-7748a2abd9e1\\}))$/","prefs":[],"schema":1576756770976,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1476369","why":"These add-ons contain unwanted features and try to prevent the user from uninstalling themselves.","name":"Smash/Upater (malware) and similar"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c7d7515d-563f-459f-821c-27d4cf825dbf","last_modified":1576771657025},{"guid":"/^((search-unlisted2@mozilla\\.com)|(search-unlisted3@mozilla\\.com)|(search-unlisted4@mozilla\\.com)|(search-unlisted5@mozilla\\.com)|(search-unlisted11@mozilla\\.com)|(search-unlisted12@mozilla\\.com)|(search-unlisted55@mozilla\\.com)|(search-unlisted111@mozilla\\.com)|(search-unlisted400@mozilla\\.com)|(search-unlisted40110@mozilla\\.com)|(search-unlisted17441000051@mozilla\\.com)|(search-unlisted174410000522777441@mozilla\\.com)|(search-unlisted@mozilla\\.com)|({0a054930-63d7-46f4-937a-de80eab21da4})|({0b24cf69-02b8-407d-83db-e7af04fc1f3e})|({0c4df994-4f4a-4646-ae5d-8936be8a4188})|({0d50d8aa-d1ed-4930-b0a0-f3340d2f510e})|({0eb4672d-58a6-4230-b74c-50ca3716c4b0})|({0f9e469e-4245-43f8-a7a8-7e730f80d284})|({0fc9fcc7-2f47-4fd1-a811-6bd4d611294b})|({4479446e-40f3-48af-ab85-7e3bb4468227})|({1a927d5b-42e7-4407-828a-fdc441d0daae})|({1a760841-50c3-4143-9f7e-3c8f04e8f9d1})|({1bd8ba17-b3ed-412e-88db-35bc4d8771d7})|({1c7d6d9e-325a-4260-8213-82d51277fc31})|({01c9a4a4-06dd-426b-9500-2ea6fe841b88})|({1cab8ccf-deff-4743-925d-a47cbd0a6b56})|({1cb0652a-4645-412d-b7e8-0b9e9a83242f})|({1d6634ca-dd37-4a31-aad1-321f05aa2bb3})|({1d9997b2-f61e-429a-8591-999a6d62becc})|({1ed2af70-9e89-42db-a9e8-17ae594003ac})|({01f409a5-d617-47be-a574-d54325fe05d1})|({2a8bec00-0ab0-4b4d-bd3d-4f59eada8fd8})|({2aeb1f92-6ddc-49f5-b7b3-3872d7e019a9})|({2bb68b03-b528-4133-9fc4-4980fbb4e449})|({2cac0be1-10a2-4a0d-b8c5-787837ea5955})|({2d3c5a5a-8e6f-4762-8aff-b24953fe1cc9})|({2ee125f1-5a32-4f8e-b135-6e2a5a51f598})|({2f53e091-4b16-4b60-9cae-69d0c55b2e78})|({3a65e87c-7ffc-408d-927e-ebf1784efd6d})|({3a26e767-b781-4e21-aaf8-ac813d9edc9f})|({3c3ef2a3-0440-4e77-9e3c-1ca8d48f895c})|({3dca6517-0d75-42d2-b966-20467f82dca1})|({3f4191fa-8f16-47d2-9414-36bfc9e0c2bf})|({3f49e12b-bb58-4797-982c-4364030d96d9})|({4aa2f47a-0bae-4a47-8a1b-1b93313a2938})|({04abafc7-7a65-401d-97f3-af2853854373})|({4ad16913-e5cb-4292-974c-d557ef5ec5bb})|({4b1050c6-9139-4126-9331-30a836e75db9})|({4b1777ec-6fe4-4572-9a29-5af206e003bf})|({4beacbbb-1691-40e7-8c1e-4853ce2e2dee})|({4c140bc5-c2ad-41c3-a407-749473530904})|({4cbef3f0-4205-4165-8871-2844f9737602})|({4dac7c77-e117-4cae-a9f0-6bd89e9e26ab})|({04ed02dc-0cb0-40c2-8bc8-6f20843024b8})|({4f6b6aaf-c5a1-4fac-8228-ead4d359dc6d})|({4f8a15fb-45c2-4d3b-afb1-c0c8813a4a5a})|({5af74f5a-652b-4b83-a2a9-f3d21c3c0010})|({5b0f6d3c-10fd-414c-a135-dffd26d7de0f})|({5b421f02-e55e-4b63-b90e-aa0cfea01f53})|({5b620343-cd69-49b8-a7ba-f9d499ee5d3d})|({5c5cf69b-ed92-4429-8d26-ff3bb6c37269})|({5cf77367-b141-4ba4-ac2a-5b2ca3728e81})|({5da81d3d-5db1-432a-affc-4a2fe9a70749})|({5eac1066-90c3-4ba0-b361-e6315dcd6828})|({5ec4c837-59b9-496d-96e2-ff3fa74ca01f})|({5efd8c7a-ff37-41ac-a55c-af4170453fdf})|({5f4e63e4-351f-4a21-a8e5-e50dc72b5566})|({6a934ff5-e41d-43a2-baf5-2d215a869674})|({06a71249-ef35-4f61-b2c8-85c3c6ee5617})|({6ad26473-5822-4142-8881-0c56a8ebc8c0})|({6cee30bc-a27c-43ea-ac72-302862db62b2})|({6ed852d5-a72e-4f26-863f-f660e79a2ebb})|({6eee2d17-f932-4a43-a254-9e2223be8f32})|({6f13489d-b274-45b6-80fa-e9daa140e1a4})|({6fa41039-572b-44a4-acd4-01fdaebf608d})|({7ae85eef-49cf-440d-8d13-2bebf32f14cf})|({7b3c1e86-2599-4e1a-ad98-767ae38286c8})|({7b23c0de-aa3d-447f-9435-1e8eba216f09})|({7b71d75e-51f5-4a71-9207-7acb58827420})|({7c6bf09e-5526-4bce-9548-7458ec56cded})|({7ca54c8d-d515-4f2a-a21f-3d32951491a6})|({7d932012-b4dd-42cc-8a78-b15ca82d0e61})|({7d5e24a1-7bef-4d09-a952-b9519ec00d20})|({7eabad73-919d-4890-b737-8d409c719547})|({7eaf96aa-d4e7-41b0-9f12-775c2ac7f7c0})|({7f8bc48d-1c7c-41a0-8534-54adc079338f})|({7f84c4d8-bdf5-4110-a10d-fa2a6e80ef6a})|({8a6bda75-4668-4489-8869-a6f9ccbfeb84})|({8a0699a0-09c3-4cf1-b38d-fec25441650c})|({8ab8c1a2-70d4-41a8-bf78-0d0df77ac47f})|({8b4cb418-027e-4213-927a-868b33a88b4f})|({8fcfe2b3-598e-4861-a5d4-0d77993f984b})|({9a941038-82fa-4ae4-ba98-f2eb2d195345})|({9b8a3057-8bf4-4a9e-b94b-867e4e71a50c})|({9b8df895-fcdd-452a-8c46-da5be345b5bc})|({09c8fa16-4eec-4f78-b19d-9b24b1b57e1e})|({09cbfddf-5e55-4676-920d-5a16cb9e4cb5})|({9cf8d28f-f546-4871-ac4d-5faff8b5bde3})|({9d592fd5-e655-461a-9b28-9eba85d4c97f})|({9fc6e583-78a5-4a2b-8569-4297bb8b3300})|({014d98ce-dab9-4c1d-8643-166e75d7cb4d})|({18c64b09-4ccb-4c21-ba6f-ebd4a1efa034})|({21d83d85-a636-4b18-955d-376a6b19bd19})|({22ecf14b-ead6-4684-a498-7b2b839a4c97}))$/","prefs":[],"schema":1576757328395,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479009","why":"Malicious add-ons disguising as updates or useful add-ons, but violating data collection policies, user-control, no surprises and security.","name":"Firefox Update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cae5d906-0b1d-4d1c-b83f-f9727b8c4a29","last_modified":1576771657022},{"guid":"/^(({0f9e469e-4245-43f8-a7a8-7e730f80d284})|({117ca2f3-df4c-4e17-a5c5-b49077e9c731})|({11db147a-a1cb-43dd-9c05-0d11683483e1})|({1ed2af70-9e89-42db-a9e8-17ae594003ac})|({24ed6bdc-3085-413b-a62e-dc5dd30272f4})|({2aa19a7a-2a43-4e0d-a3dc-abb33fa7e2b6})|({3d6fbbb3-6c80-47bb-af20-56fcaebcb9ca})|({42f4c194-8929-42b9-a9a3-afa56dd0913b})|({46740fa0-896d-4f2e-a240-9478865c47c2})|({4718da68-a373-4a03-a77b-0f49b8bb40ee})|({4d41e0b8-bf7e-45ab-bd90-c426b420e3ee})|({50957a38-c15d-42da-94f5-325bc74a554c})|({5650fc63-a7c5-4627-8d0a-99b20dcbd94b})|({5c5c38ec-08bf-493a-9352-6ccf25d60c08})|({67ecb446-9ccd-4193-a27f-7bd1521bd03c})|({71f01ffe-226d-4634-9b21-968f5ce9f8f5})|({72f31855-2412-4998-a6ff-978f89bba0c3})|({7b3c1e86-2599-4e1a-ad98-767ae38286c8})|({7c37463c-001e-4f58-9e88-aaab2a624551})|({7de64f18-8e6b-4c41-9b05-d8872b418026})|({82dcf841-c7e1-4764-bb47-caa28909e447})|({872f20ea-196e-4d11-8835-1cc4c877b1b8})|({8efee317-546f-418d-82d3-60cc5187acf5})|({93deeba1-0126-43f7-a94d-4eecfce53b33})|({9cc12446-16da-4200-b284-d5fc18670825})|({9cd27996-6068-4597-8e97-bb63f783a224})|({9fdcedc7-ffde-44c3-94f6-4196b1e0d9fc})|({a191563e-ac30-4c5a-af3d-85bb9e9f9286})|({a4cb0430-c92e-44c6-9427-6a6629c4c5f6})|({a87f1b9b-8817-4bff-80fd-db96020c56c8})|({ae29a313-c6a9-48be-918d-1e4c67ba642f})|({b2cea58a-845d-4394-9b02-8a31cfbb4873})|({b420e2be-df31-4bea-83f4-103fe0aa558c})|({b77afcab-0971-4c50-9486-f6f54845a273})|({b868c6f4-5841-4c14-86ee-d60bbfd1cec1})|({b99ae7b1-aabb-4674-ba8f-14ed32d04e76})|({b9bb8009-3716-4d0c-bcb4-35f9874e931e})|({c53c4cbc-04a7-4771-9e97-c08c85871e1e})|({ce0d1384-b99b-478e-850a-fa6dfbe5a2d4})|({cf8e8789-e75d-4823-939f-c49a9ae7fba2})|({d0f67c53-42b5-4650-b343-d9664c04c838})|({dfa77d38-f67b-4c41-80d5-96470d804d09})|({e20c916e-12ea-445b-b6f6-a42ec801b9f8})|({e2a4966f-919d-4afc-a94f-5bd6e0606711})|({e7d03b09-24b3-4d99-8e1b-c510f5d13612})|({fa8141ba-fa56-414e-91c0-898135c74c9d})|({fc99b961-5878-46b4-b091-6d2f507bf44d})|(firedocs@mozilla\\.com)|(firetasks@mozilla\\.com)|(getta@mozilla\\.com)|(javideo@mozilla\\.com)|(javideo2@mozilla\\.com)|(javideos@mozilla\\.com)|(javideosz@mozilla\\.com)|(search_free@mozilla\\.com)|(search-unlisted@mozilla\\.com)|(search-unlisted101125511@mozilla\\.com)|(search-unlisted10155511@mozilla\\.com)|(search-unlisted1025525511@mozilla\\.com)|(search-unlisted1099120071@mozilla\\.com)|(search-unlisted1099125511@mozilla\\.com)|(search-unlisted109925511@mozilla\\.com)|(search-unlisted11@mozilla\\.com)|(search-unlisted111@mozilla\\.com)|(search-unlisted12@mozilla\\.com)|(search-unlisted14400770034@mozilla\\.com)|(search-unlisted144007741154@mozilla\\.com)|(search-unlisted144436110034@mozilla\\.com)|(search-unlisted14454@mozilla\\.com)|(search-unlisted1570124111@mozilla\\.com)|(search-unlisted1570254441111@mozilla\\.com)|(search-unlisted15721239034@mozilla\\.com)|(search-unlisted157441@mozilla\\.com)|(search-unlisted15757771@mozilla\\.com)|(search-unlisted1577122001@mozilla\\.com)|(search-unlisted15777441001@mozilla\\.com)|(search-unlisted15788120036001@mozilla\\.com)|(search-unlisted157881200361111@mozilla\\.com)|(search-unlisted1578899961111@mozilla\\.com)|(search-unlisted157999658@mozilla\\.com)|(search-unlisted158436561@mozilla\\.com)|(search-unlisted158440374111@mozilla\\.com)|(search-unlisted15874111@mozilla\\.com)|(search-unlisted1741395551@mozilla\\.com)|(search-unlisted17441000051@mozilla\\.com)|(search-unlisted174410000522777441@mozilla\\.com)|(search-unlisted1768fdgfdg@mozilla\\.com)|(search-unlisted180000411@mozilla\\.com)|(search-unlisted18000411@mozilla\\.com)|(search-unlisted1800411@mozilla\\.com)|(search-unlisted18011888@mozilla\\.com)|(search-unlisted1801668@mozilla\\.com)|(search-unlisted18033411@mozilla\\.com)|(search-unlisted180888@mozilla\\.com)|(search-unlisted181438@mozilla\\.com)|(search-unlisted18411@mozilla\\.com)|(search-unlisted18922544@mozilla\\.com)|(search-unlisted1955511@mozilla\\.com)|(search-unlisted2@mozilla\\.com)|(search-unlisted3@mozilla\\.com)|(search-unlisted4@mozilla\\.com)|(search-unlisted400@mozilla\\.com)|(search-unlisted40110@mozilla\\.com)|(search-unlisted5@mozilla\\.com)|(search-unlisted55@mozilla\\.com)|(search@mozilla\\.com)|(searchazsd@mozilla\\.com)|(smart246@mozilla\\.com)|(smarter1@mozilla\\.com)|(smarters1@mozilla\\.com)|(stream@mozilla\\.com)|(tahdith@mozilla\\.com))$/","prefs":[],"schema":1576611696962,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1480591","why":"These add-ons violate the no-surprises and user-control policy.","name":"Search engine hijacking malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cee5c2ab-1059-4b15-a78c-1203116552c4","last_modified":1576771657018},{"guid":"/^((application2@fr-metoun\\.com)|(application@br-annitop\\.com)|(application@br-atoleg\\.com)|(application@br-cholty\\.com)|(application@br-debozoiz\\.com)|(application@br-echite\\.com)|(application@br-estracep\\.com)|(application@br-exatrom\\.com)|(application@br-iginot\\.com)|(application@br-imastifi\\.com)|(application@br-isobiv\\.com)|(application@br-ludimaro\\.com)|(application@br-pintoula\\.com)|(application@br-proufta\\.com)|(application@br-qhirta\\.com)|(application@br-qibizar\\.com)|(application@br-qopletr\\.com)|(application@br-roblaprouf\\.com)|(application@br-rosalop\\.com)|(application@br-samalag\\.com)|(application@br-sopreni\\.com)|(application@br-stoumo\\.com)|(application@br-villonat\\.com)|(application@br-zoobre\\.com)|(application@de-barbuna\\.com)|(application@de-bicelou\\.com)|(application@de-blabuma\\.com)|(application@de-dalofir\\.com)|(application@de-elplic\\.com)|(application@de-erotah\\.com)|(application@de-ertuck\\.com)|(application@de-eurosty\\.com)|(application@de-ezigat\\.com)|(application@de-lorelam\\.com)|(application@de-losimt\\.com)|(application@de-luchil\\.com)|(application@de-miligap\\.com)|(application@de-open-dog\\.com)|(application@de-rydima\\.com)|(application@de-slapapi\\.com)|(application@de-soqano\\.com)|(application@de-treboola\\.com)|(application@de-vasurk\\.com)|(application@de-ygivas\\.com)|(application@es-biloufer\\.com)|(application@es-boulass\\.com)|(application@es-cemaseur\\.com)|(application@es-elixet\\.com)|(application@es-gestona\\.com)|(application@es-glicalol\\.com)|(application@es-griloup\\.com)|(application@es-iblep\\.com)|(application@es-iglere\\.com)|(application@es-jounyl\\.com)|(application@es-klepst\\.com)|(application@es-nofinaj\\.com)|(application@es-ofarnut\\.com)|(application@es-phistouquet\\.com)|(application@es-pronzal\\.com)|(application@es-roterf\\.com)|(application@es-taapas\\.com)|(application@es-tatoflex\\.com)|(application@fr-acomyl\\.com)|(application@fr-avortep\\.com)|(application@fr-blicac\\.com)|(application@fr-bloubil\\.com)|(application@fr-carazouco\\.com)|(application@fr-cichalou\\.com)|(application@fr-consimis\\.com)|(application@fr-cropam\\.com)|(application@fr-deplitg\\.com)|(application@fr-doadoto\\.com)|(application@fr-domeoco\\.com)|(application@fr-domlaji\\.com)|(application@fr-eferif\\.com)|(application@fr-eivlot\\.com)|(application@fr-eristrass\\.com)|(application@fr-ertike\\.com)|(application@fr-esiliq\\.com)|(application@fr-fedurol\\.com)|(application@fr-grilsta\\.com)|(application@fr-hyjouco\\.com)|(application@fr-intramys\\.com)|(application@fr-istrubil\\.com)|(application@fr-javelas\\.com)|(application@fr-jusftip\\.com)|(application@fr-lolaji\\.com)|(application@fr-macoulpa\\.com)|(application@fr-mareps\\.com)|(application@fr-metoun\\.com)|(application@fr-metyga\\.com)|(application@fr-mimaloy\\.com)|(application@fr-monstegou\\.com)|(application@fr-oplaff\\.com)|(application@fr-ortisul\\.com)|(application@fr-pastamicle\\.com)|(application@fr-petrlimado\\.com)|(application@fr-pinadolada\\.com)|(application@fr-raepdi\\.com)|(application@fr-soudamo\\.com)|(application@fr-stoumo\\.com)|(application@fr-stropemer\\.com)|(application@fr-tlapel\\.com)|(application@fr-tresdumil\\.com)|(application@fr-troglit\\.com)|(application@fr-troplip\\.com)|(application@fr-tropset\\.com)|(application@fr-vlouma)|(application@fr-yetras\\.com)|(application@fr-zorbil\\.com)|(application@fr-zoublet\\.com)|(application@it-bipoel\\.com)|(application@it-eneude\\.com)|(application@it-glucmu\\.com)|(application@it-greskof\\.com)|(application@it-gripoal\\.com)|(application@it-janomirg\\.com)|(application@it-lapretofe\\.com)|(application@it-oomatie\\.com)|(application@it-platoks\\.com)|(application@it-plopatic\\.com)|(application@it-riploi\\.com)|(application@it-sabuf\\.com)|(application@it-selbamo\\.com)|(application@it-sjilota\\.com)|(application@it-stoploco\\.com)|(application@it-teryom\\.com)|(application@it-tyhfepa\\.com)|(application@it-ujdilon\\.com)|(application@it-zunelrish\\.com)|(application@uk-ablapol\\.com)|(application@uk-blamap\\.com)|(application@uk-cepamoa\\.com)|(application@uk-cloakyz\\.com)|(application@uk-crisofil\\.com)|(application@uk-donasip\\.com)|(application@uk-fanibi\\.com)|(application@uk-intramys\\.com)|(application@uk-klastaf\\.com)|(application@uk-liloust\\.com)|(application@uk-logmati\\.com))$/","prefs":[],"schema":1576756704239,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1487627","why":"Add-ons whose main purpose is to track user browsing behavior.","name":"Abusive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"914ec360-d35e-4420-a88f-1bad3513f054","last_modified":1576771657015},{"guid":"/^((\\{0bf1c111-c256-4a17-891d-1bc69338162e\\})|(\\{0ffbc4b1-f269-4cff-9552-5f77337ebc1a\\})|(\\{1bbdc69d-55d3-4872-bd03-14eb05e7a7ad\\})|(\\{1ce00b82-ac47-43e6-a69c-f7dc9344168a\\})|(\\{2b01628b-0110-4965-972c-7a0b624fb99f\\})|(\\{3a84e0b0-3151-449e-b6e8-1062036afac6\\})|(\\{3bbcc16b-23f7-40a6-b88c-9ced9d009c93\\})|(\\{3ea48f4a-b585-44a7-aff5-faeb5e5b47d5\\})|(\\{7b161d2c-ee98-4321-a78a-433950672c8a\\})|(\\{8a8d97d8-b879-4024-8321-765e0f395b84\\})|(\\{9c0d6766-debe-4461-b14f-68ddfc13a78a\\})|(\\{014f9781-c104-41a4-a983-fc6aa4690664\\})|(\\{27ffdb27-0a34-4dea-a483-3b357bc6a5fe\\})|(\\{81ba256a-4f32-40df-86b5-e6b9861481e1\\})|(\\{338c7503-fb54-4b69-a84b-916f7452c7fa\\})|(\\{400e053f-55df-4e86-a91a-eae8d7b7bcd1\\})|(\\{617e0484-8346-44f2-851e-60ab89a919f9\\})|(\\{656a0095-d852-4dcc-a107-764df7ad0ec4\\})|(\\{754a330b-efbe-4016-8526-bf0f2e11e45e\\})|(\\{802ba900-013c-42f6-a11a-093c4bf35baa\\})|(\\{2771ce08-4898-4f58-89a5-e2b9d00bfab2\\})|(\\{3906b944-92f3-4d43-89dc-31ad6484a77c\\})|(\\{6516cdbc-9332-437f-89ac-b57470655542\\})|(\\{6847c507-1793-4be2-be86-4c2cc0b445bf\\})|(\\{9687db9b-410c-47f2-8c36-fde63c7c29e4\\})|(\\{0035237e-97ab-40eb-ba9d-c453fb6aa079\\})|(\\{20143127-e0bd-4396-aee9-52229cf9b5eb\\})|(\\{33254399-d5b2-4d84-b90b-9c4d4dc71112\\})|(\\{34621968-1952-4428-909d-df5b220efe74\\})|(\\{83769978-21cf-417c-b4a9-582b4161e395\\})|(\\{aa369db0-4232-47b8-bbbb-49ad31d49dce\\})|(\\{aff733de-d7d8-49c2-824a-7f2b2e282927\\})|(\\{c0b587fe-766b-446f-9aae-bc6edc9f6f4c\\})|(\\{c47a75b9-c6d2-4009-a245-c6dcedeea932\\})|(\\{c51bd197-28bd-442f-8537-dea5ae129047\\})|(\\{cac044a2-b93c-4f24-bf2f-b902741d29a8\\})|(\\{de17ce6f-389f-4368-9675-b9ed93133f17\\})|(\\{e2b105bc-1821-4838-bdf9-0fa4f6781b18\\})|(\\{e6c8bc7f-0133-418a-86ed-ba2c0a6925df\\})|(\\{f4acda5f-a75b-4b3b-8a73-8ca3df8d5f57\\})|(\\{f4fd18ee-8f6a-4708-8338-7e7981b73453\\})|(\\{f2320322-1fff-4998-bc28-4ad61621012a\\})|(\\{ff939f5e-a97c-4c14-b853-9c82519dbf73\\})|(@complete-youtube-downloader)|(@swsearchassist)|(@swsearchassist2)|(@youtube-download-helper-addon-1)|(@youtube-download-helper-addon-3)|(@ytd-support)|(@ytmp4-support)|(@ytu-support)|(18-plus-bypass@agebypass\\.org)|(18plus@sweetytweety\\.jp)|(addon@firefox-addon-s\\.com)|(ageverify@doubletrouble\\.net)|(auto-fill-dhruv\\.techapps@gmail\\.com)|(awesomeaddons@gmail\\.com)|(blndkmebkmenignoajhoemebccmmfjib@chrome-store-foxified--730948579)|(boomerang-for-gmailtm@chrome-store-foxified--1895216441)|(boomerang-for-gmailtm@chrome-store-foxified-1472004183)|(browsing_certificate@easycerts\\.in)|(certs-js@verify\\.org)|(clear-flash-cookies@tubedownload\\.org)|(dghpnfeglanbbjaggjegpbijhcbnfdno@chrome-store-foxified--1026618965)|(dghpnfeglanbbjaggjegpbijhcbnfdno@chrome-store-foxified--1382673267)|(dghpnfeglanbbjaggjegpbijhcbnfdno@chrome-store-foxified-3810896411)|(dhiaggccakkgdfcadnklkbljcgicpckn@chrome-store-foxified-1917762393)|(dhiaggccakkgdfcadnklkbljcgicpckn@chrome-store-foxified-2539369515)|(dhiaggccakkgdfcadnklkbljcgicpckn@chrome-store-foxified-3411285726)|(dhiaggccakkgdfcadnklkbljcgicpckn@chrome-store-foxified-3957753373)|(dhruv@gmail\\.com)|(easy\\.download@youtube\\.com)|(easy18plusverify@agehelper\\.com)|(EasyQR@johndoe)|(easytranslate@johndoehits)|(ecaieeiecbdhkcgknidmfelflleobbnp@chrome-store-foxified-2878848146)|(eurekasakamika@chrome-store-foxified-unsigned)|(faeeclonpikbempnbjbbajfjjajjgfio@chrome-store-foxified--1071037210)|(faeeclonpikbempnbjbbajfjjajjgfio@chrome-store-foxified-335403930)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified--546579415)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified--929033716)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified--1776201342)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-411918147)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-711293137)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-1406852911)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-1805495496)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-2344964585)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-2515600300)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-2947667317)|(generated-c5el8k8zv2b1gcncleefj9@chrome-store-foxified--1160265316)|(html5-video-everywhere@lejenome\\.me)|(iapifmceeokikomajpccajhjpacjmibe@chrome-store-foxified-6029610)|(info@ytdownloader\\.info))$/","prefs":[],"schema":1576756923769,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1525880","why":"Add-ons that include abusive or malicious remote code.","name":"Various abusive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"be96c9a1-0b01-468e-ac9b-761ba3587162","last_modified":1576771657011},{"guid":"/^((\\{7e4a75c1-dddc-4496-9963-1c6ac99cf226\\})|(\\{35af257d-14dd-4cd0-8ebd-2d30c2b30561\\})|(\\{d6362448-1e8f-47bf-9d2f-491648d18e3d\\})|(\\{80a42dcf-193e-43a2-b662-d6b14882403f\\})|(\\{044e39fc-333b-423c-8291-26078a780b02\\})|(\\{68b3c6ce-162f-4ece-9ffa-8279855a4228\\})|(\\{057b93a7-84e6-43ff-9686-d452435ed3c5\\})|(\\{1223cfa2-7aad-4a16-b98a-6bf63b346835\\})|(\\{9815ca8b-a77c-4e4d-beac-aad1c7021dcb\\})|(\\{e3f2795a-cefc-4f7f-9435-5f091b988d2f\\})|(\\{98fd0bd5-f486-4d81-9eb1-e89e9d56bfa2\\})|(\\{f96fafd2-5860-4bfa-9537-3f2ca9dd496e\\})|(\\{da93cdd9-6aca-410e-b2f2-e927da726559\\})|(\\{d97e0506-d330-4547-8a5c-093b8aa08d7a\\})|(\\{425ad6b3-72b8-43c0-be7c-2f6585fa0ec1\\})|(\\{0375f007-f5ba-46ec-86d2-c5da84576562\\})|(\\{e8915f55-6566-4872-97eb-d77fbdbf2fb3\\})|(\\{ebd3a0c4-bf9e-4dfa-b487-f77722055edb\\})|(\\{7cc62e47-ed20-45bc-8c92-bb57128e78d6\\})|(\\{b5a15631-6429-49bd-a670-e83ac41f93a9\\})|(\\{f263d545-3234-460f-b546-a8406a0a729d\\})|(\\{6468c148-9888-4243-8de5-cb6291cac82a\\})|(\\{da2281db-0036-46f6-8878-ff26e1cf6a2b\\})|(\\{63f579ba-eaf5-4e1a-a7c2-c5e889beaf9f\\})|(\\{84569fbb-d367-40ce-b24b-fd3b611283b8\\})|(\\{da2bc16f-b499-401b-8771-9d9f32d88f86\\})|(\\{1a275ad6-5dd3-47e9-a563-41a0bebdfd90\\})|(\\{e07ebf1e-5917-46a2-95d9-61d9b51f3797\\})|(\\{0d6791d2-ce0b-4f78-90e4-8e773703bd35\\})|(\\{502c7ef7-745c-4ea0-8066-a17cf1b74957\\})|(\\{c93f0aeb-ae9b-49d9-835b-c58a6b03aa46\\})|(\\{1f0bf2a4-aff5-42d3-8633-71e65f289250\\})|(\\{28766320-358e-42e3-a2c7-67ec77552424\\})|(\\{74d4fcda-c103-4fb7-810a-4596530c00a4\\})|(\\{7b3fd37a-a127-41a0-9e4d-59ccfa165e41\\})|(\\{787fa0b0-d5f1-4454-8b0c-72d191d6775f\\})|(\\{e2bae2ed-0368-48e7-8671-3bdcc5d7713f\\})|(\\{fee16fb4-830f-438a-a3d5-f7e911d23e02\\})|(\\{72113405-b4a5-46c3-a7c6-5353568b87bd\\})|(\\{5ede50a4-4151-4635-804f-a6f56115a0c6\\})|(\\{c11487a0-d104-4bc3-814b-474f8c29049c\\})|(\\{35690b6e-1979-4ea3-89aa-44a94dda2afa\\})|(\\{e9d698ef-bad4-4960-9df3-8c41605a6d7b\\})|(\\{1472b3c1-cae8-42c4-bbdf-e71134dccf08\\})|(\\{7a40b654-1232-4e76-81e7-d95260db25cd\\})|(\\{f54699c8-c82f-4d6e-a161-919bbe8410de\\})|(\\{dca6a5cd-0d24-442a-afd4-80572bb20c34\\})|(\\{b8d5d169-f076-4098-b671-a3cb8b410f56\\})|(\\{903e6561-0646-4c38-8039-d372d8e7c90a\\})|(\\{b39977b9-bcb2-448b-9d7b-9aec7f62bc26\\})|(\\{059b5c30-b96a-48df-8083-5fff97a8f9bf\\})|(\\{1d0351bb-1d96-4779-b639-44eeceb2ebfb\\})|(\\{80c0bdb4-ba98-472d-ae56-afd8b3021115\\})|(\\{4dfc5596-9655-4b0c-819d-e2ff48fb8556\\})|(\\{d7d3ed3c-6f73-42cb-b724-c33fccc1b465\\})|(\\{b378a858-89bb-492e-8b4d-eb83e910a14b\\})|(\\{ec1fa94c-8700-49d0-ba5d-df99a912519e\\})|(\\{4db5d249-881f-4442-8c01-28536c45ebfd\\})|(\\{7a411d82-fc50-4f20-bd2c-b2b065f18097\\})|(\\{675e002b-e144-4694-a725-9e8cc6a3fa67\\})|(\\{1902a069-c039-421e-b502-1e367c237196\\})|(\\{866bb3a8-82bb-4c9a-bca5-26fd5f37c4ec\\})|(\\{6a4e7017-43cd-4646-bb48-003620bb60fe\\})|(\\{bc5c676e-a75f-475b-a27c-79687b1de3ec\\})|(\\{6b544e1a-932d-4da9-aafe-c4b4bbfe1958\\})|(\\{99631434-ff1e-49d3-88d3-9ac40d0dd1bd\\})|(\\{623b31e0-f289-47cf-995e-5a195e261758\\})|(\\{1b4d88a5-4b5d-44c8-849c-82f129a7dacd\\})|(\\{48ba880a-b7c2-4e4e-af55-9134ac926c61\\})|(\\{4b498e2a-8b17-47c0-a449-89a76b6e737f\\})|(\\{d9cbd45f-cdbc-4be1-bb16-8e60764630ff\\})|(\\{bfaaa94a-1a93-4a1c-9b54-9dbe98f3ef07\\})|(\\{87b93e6e-70a6-4538-9848-e9d0f060e372\\})|(\\{fea4fd50-ed6a-4b8e-b00d-3b2276df6e34\\})|(\\{c15450f8-8da2-4add-a8f6-603d90e8d344\\})|(\\{ec972135-8e5c-49d4-bff8-b6006b21f2d2\\})|(\\{b039f24d-8b51-40d3-abf7-55e1dc502112\\})|(\\{b308870f-ae9a-4972-af28-0218717a47f4\\})|(\\{9349a202-8b8e-4777-ba93-c723810da51e\\})|(\\{798750dc-0057-47e0-a1af-73dec73544fa\\})|(\\{186e4b6a-e3f0-4970-8f7b-05ab6bc50320\\})|(\\{dec8de3e-d3a4-4946-bcbd-c3523fee11c5\\})|(\\{06539c62-00d3-4513-9aa4-048dd273107a\\})|(\\{b200a289-900a-4953-b2c6-b7a323d6fb66\\})|(\\{4080defb-6c6b-4012-bcac-71379e9c430f\\})|(\\{b110855c-90dd-427a-894c-54b93c6572b7\\})|(\\{dd599e99-3a48-4e36-9d83-56f8c0019d4d\\})|(\\{4f43f2c7-c1e6-4091-88fe-c829b3bfe553\\})|(\\{b7a022bc-6b89-4ac1-a1fa-bf02251336b0\\})|(\\{1aa370ca-9865-4c52-89a8-79e95abc82f7\\})|(\\{fb727d0f-7c3d-4bf6-8be4-284e7e8b8f83\\})|(\\{1579b5dd-ef3d-4754-bc59-8a7707fe1219\\})|(\\{66f0cb42-bb3e-4a16-90c1-bed1e3be4aad\\})|(\\{f13a1f79-f63a-4332-a9c9-11fc50328fc2\\})|(\\{29962f4d-bf74-4775-9d02-31fe546d6fa6\\})|(\\{aa539764-9ec3-41a6-af0e-6c2dc46ecbf5\\})|(\\{9412adf1-2714-4cb2-ad5b-13d41096234a\\})|(\\{86f2f4cc-97c5-4cc5-8151-c327ab379fba\\}))$/","prefs":[],"schema":1576757017958,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549214","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"654077f4-a8b3-4822-8962-0bb1cac1d70d","last_modified":1576771657006},{"guid":"/^((\\{0209c9a2-f58e-4ca5-ba95-80de8a0bec36\\})|(\\{0429d1cf-e6c7-46b9-9959-4d24263f5b9f\\})|(\\{04aed622-650c-44b2-968e-a8740024bdfe\\})|(\\{054ccccf-bb7d-4d0d-ae7e-94931a469627\\})|(\\{06440d64-2a92-45a7-8e8e-c14a35f9224d\\})|(\\{06e83ce4-370c-41c0-bfb7-62bb0e77cabb\\})|(\\{06fe00d4-24df-497f-90e0-88db402cc9d6\\})|(\\{077e07c1-b948-4e88-9965-226cde465f9f\\})|(\\{07b424b4-8a9d-4fe6-afd5-1f2135f5f4ea\\})|(\\{080f27b3-ad41-4bf4-84bb-b6df1d395b0e\\})|(\\{0a3ba90b-224e-48ae-9440-b92d4ac03ee6\\})|(\\{0bd278d9-fbc6-40dd-914d-5e696c4255cb\\})|(\\{0c3c7c7c-3d15-4cf7-936d-dcf6070e82ce\\})|(\\{0ee32a7c-74b2-4a55-b388-8034b39c6b1d\\})|(\\{0f806e24-dbcc-4f14-b8f5-cfd7f88d6302\\})|(\\{0f9b7554-16d4-4496-8f01-e396256033b7\\})|(\\{1331d9a3-b9ec-43fc-a369-f73a926849b9\\})|(\\{14aca62f-1cc5-4424-a30a-ffb3d424b5bc\\})|(\\{14ec0bb2-f06f-46ad-b951-b810f7651284\\})|(\\{16744b56-7518-4526-bf9a-2531d694fb1a\\})|(\\{179d7013-b6d8-4a89-a861-30e0e8a7faee\\})|(\\{17cff984-12b5-438d-a915-41d7d006de4f\\})|(\\{17ee37ab-fe67-45bd-9666-bcf57a371e46\\})|(\\{19f6f2dd-32df-47a2-9b89-76543a987d46\\})|(\\{1a6ddac5-6ca0-4d59-a8e5-02345c67f703\\})|(\\{1b50ef3b-a364-4089-8ef6-1031cc7a0d1d\\})|(\\{1b830180-08d2-4381-a516-b84aba36e52f\\})|(\\{1cdff066-cb3a-4abf-95d0-39691e53dc75\\})|(\\{1e778837-1740-4a35-9eb1-e16b2c189037\\})|(\\{260d8452-72d2-4860-b14e-dd3fcb779656\\})|(\\{262c435a-42e0-4ca1-a713-f52672691f4e\\})|(\\{26d2406b-5118-44fe-a479-15a8c4f6f2bd\\})|(\\{28a26807-fdc2-4e79-b2a1-efcb1c21d199\\})|(\\{28c24c28-a094-4915-a2ff-5ff91caf076b\\})|(\\{2afddffd-6246-45f6-af19-a7803095bdf0\\})|(\\{2d37fd0a-5ae0-4d83-bc0e-fc7d870587c6\\})|(\\{2df75889-c43e-4f4d-b43b-e51d9b50167c\\})|(\\{2e4e320a-d5f6-4685-89f0-4d7084209c06\\})|(\\{2f93ea6a-1c1b-4456-b821-e8ba50aedece\\})|(\\{3034cb02-b9bb-4e8a-8749-cdd7fd1a6902\\})|(\\{3862859a-78c6-474e-b30e-303e86a7c6a4\\})|(\\{386afcb7-64f4-41db-b3e8-a76602ebb2fa\\})|(\\{38b61e2b-1af3-4f35-bdf0-cc4e3afc4880\\})|(\\{395065fd-1b7f-400f-aecb-9cfbcd9d607e\\})|(\\{3b0055c9-ea2c-43be-a927-ecd342946367\\})|(\\{3b37c6dd-d5f0-494d-9dd2-175db561b99c\\})|(\\{3e5a09c0-5f26-4d40-a5d0-a853f1fa759d\\})|(\\{3f2d032a-29ac-4cbe-9463-563f3ba6eb7f\\})|(\\{3f6ea025-e6c2-4372-adca-cb60b811e4da\\})|(\\{4253e6be-5b91-4b66-b44e-11f6260cee0e\\})|(\\{42c5b340-7cda-4d89-81a4-4a20754b5250\\})|(\\{42d8241e-e5f6-47d7-95f6-b6649143b12a\\})|(\\{46061237-f12b-4738-b1e4-7b7070fc03ca\\})|(\\{46bcaa76-c21e-44a2-aed8-6ba630fcc961\\})|(\\{47f394e0-02be-4a08-b865-287b993ac40e\\})|(\\{497c92fb-4d7d-4b9e-9884-a178e5991ee1\\})|(\\{498d00a0-3d8a-45ff-8e8f-3c27fcd12df6\\})|(\\{49ec4e6d-8152-461e-a2f5-095ede6c3cab\\})|(\\{4a87eeaa-4aa5-4695-b393-1ca4f00b2f3e\\})|(\\{4b0d3b3a-d61c-4968-a338-8de76d044f80\\})|(\\{4b9b2a47-e06f-4948-a20f-78ec1ef4e84c\\})|(\\{4dc32f1c-374e-4886-9a62-80ecfc23ed17\\})|(\\{4e901df2-8301-4588-9bc9-1e9f6c4f996f\\})|(\\{4fb6f5ed-eb5a-4115-a635-57fecad85d50\\})|(\\{50c0ae9a-ebaf-44f7-9ea7-52c7d1066721\\})|(\\{5160a705-c8e9-40b9-900e-6d26559038de\\})|(\\{5232e216-65a2-44d0-ba11-05fc8c332af7\\})|(\\{53e6e44a-a0af-49e2-af72-db4518f153bb\\})|(\\{58c7b5da-a1cc-437a-9401-2a56eb77df7d\\})|(\\{59aa5a90-0034-4350-adfe-76aff37e73ee\\})|(\\{59c5d279-711e-4217-8e5e-1aa1497ffcaa\\})|(\\{5a3f607d-7e1a-4faf-88e2-5806d74d18d4\\})|(\\{5a6364f7-3237-462d-bd3f-7c501830ceb0\\})|(\\{5dc73bfe-4193-4390-ae50-ad928655e21f\\})|(\\{5e085187-2509-4f8f-80ed-78c06351a77a\\})|(\\{5edfb7c3-04a5-447d-9069-2093289a7b98\\})|(\\{6219dabe-8f5f-4130-a650-8cfa971d7182\\})|(\\{62c9c13b-d001-4c42-819c-31b9763973c0\\})|(\\{656da759-0ae4-4f3e-a798-8293a5df9476\\})|(\\{66d70c4a-ad30-4f3c-afb4-b498a60c49b3\\})|(\\{68cb3185-4f55-42cb-97ea-188924b1d6c3\\})|(\\{6b99e0e4-e2e8-4fff-9da5-81c0b9e92b62\\})|(\\{6de81b5e-7556-4fc4-9cac-df56e898f3bf\\})|(\\{7162613f-ea9c-48b3-a0e3-6700ea61a4c8\\})|(\\{71ef8107-d5fd-4d2c-94b7-2dcd07448622\\})|(\\{7284399c-6be5-42ff-8ddc-5cc52d46ab40\\})|(\\{7422ce07-cac7-4fe6-af6b-16f5e7e27d05\\})|(\\{76a7b38d-7044-4e36-8315-38db10506ec8\\})|(\\{7772f851-8dd4-4d96-b426-6cd9f739a599\\})|(\\{797129e6-8cc9-401e-b9fe-0fee15533e9a\\})|(\\{7a3429ae-f293-4a70-a13d-f57f153557e3\\})|(\\{7bed7063-0842-43d9-b672-5e5e55915d5d\\})|(\\{7c0220cc-89e5-4726-ada1-fa2ffa412f28\\})|(\\{7c3c79d6-7e31-4947-b9b4-dd21f461ccd4\\})|(\\{7c70cbc0-e80c-4f3b-97b2-2530c4ac1349\\})|(\\{7fc4f148-2648-40f5-bd99-d057ac1292a6\\})|(\\{808a2093-68ff-4f73-b239-0d0f105c4d98\\})|(\\{8411b8e3-e302-48a2-91ee-550102b938f6\\}))$/","prefs":[],"schema":1576757094905,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552164","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2a4b5087-eca0-43e8-96f4-6632aabd83d3","last_modified":1576771657003},{"guid":"/^((akjbfncbadcmnkopckegnmjgihagponf@chromeStoreFoxified)|(akjbfncbadcmnkopckegnmjgihagponf@chromeStoreFoxified-2563213750)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3767541208)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-2330732719)|(cidchfadpgepemappcgeafeicnjomaad@chrome-store-foxified-509978031)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-558690357)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3523362862)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-850818380)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3686225023)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3659951669)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-1114585181)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-2593088680)|(edmdnjinnadgoalbaojbhkbognfappih@chrome-store-foxified-206569335)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3272316989)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-96331909)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-2158751912)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-1554953450)|(kadbillinepbjlgenaliokdhejdmmlgp@chrome-store-foxified-323465212)|(kadbillinepbjlgenaliokdhejdmmlgp@chrome-store-foxified-3112875041)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-1868258955)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-611481225)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-162688242)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-1394660953)|(\\{de07e1ed-1597-45f9-957d-4edc44399451\\})|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-294092903)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified--2032791676)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified--786206880)|(\\{76f8d31f-d1b6-4171-885e-6fcde28ca547\\})|(\\{b7492f2d-72b6-4816-83d5-9c82b3cc5581\\})|(\\{3f0fa616-3f92-42e2-ac1e-69ae7b1c7872\\})|(\\{2e324574-0761-4017-bc96-66270563e277\\})|(\\{950d03c6-722e-498d-90fc-ec9d9c1ab893\\})|(\\{6cb64844-2dca-4f29-82d1-cb59459ad824\\})|(\\{5347a8c7-a156-4455-8301-7d19d269bd2c\\})|(\\{17c69a23-df19-4655-aaa9-e8a35f186ddf\\})|(\\{381eb5ad-0f02-4146-85f4-2cc7c7a7dee4\\})|(\\{e797aab6-f3df-4d0d-89c2-320371720194\\})|(\\{91a95e76-4b27-427f-9554-7c1aa58c8489\\})|(\\{5bd5f5a3-3f30-4c90-bf5c-7ff32eae9fac\\})|(\\{e9cbcded-05e0-4cf0-9163-8507de356646\\})|(\\{4262365c-085f-4f2b-9bd7-048d7d1c90de\\})|(\\{d6d89cdf-36e4-44b5-8ea2-2283e25e99b9\\})|(\\{3ab34cbc-4a18-4fac-b629-3b10091d505e\\})|(\\{28beb080-37b1-42ec-a6e9-89cff276cc3e\\})|(\\{d83baff8-42f1-485c-bc61-0df0a2fa2834\\})|(\\{f1260949-ea01-4f69-b302-87ac898bc677\\})|(\\{f2bb825a-19b7-46ba-b759-557885e28ff9\\})|(\\{d1023b1e-87f6-49d4-b93d-80d94cafb101\\})|(\\{605bf342-f990-43b3-9053-b6ad563cc944\\})|(\\{20da0f4c-c6ee-4c4a-be76-8cb0fdd759b7\\})|(\\{29563a03-2ea3-4187-b3dc-af3027287df8\\})|(\\{9fc76cae-b6b4-45af-aa0e-81d1bf419812\\})|(\\{b83f6a6c-6bb3-492f-aad2-56a6b79a02d4\\})|(\\{4e340962-9d78-486c-8ec8-fdc8ba0448c3\\})|(\\{4f420c0e-824f-408b-8327-418934c566e9\\})|(\\{51057732-1a37-491c-afeb-dccbb18e2341\\})|(\\{ac9415c8-b978-4636-a0f6-99b75f1bfacc\\})|(\\{ba9d81ff-13da-4183-8b32-19cc18a198c3\\})|(\\{614f9cd7-d46e-47a5-bcd6-fc9cefc846ac\\})|(\\{83ab005b-85f8-4185-b500-26c78f29e470\\})|(\\{814b9b95-0470-42f5-9be1-b322ae1a300c\\})|(\\{c565d582-ef45-4ee5-a13d-e0bc544bb483\\})|(\\{bbc0a83c-ff01-4f55-beed-c8dd6256d99b\\})|(\\{00d71c76-8b41-4e12-877b-62ad742c5b5b\\})|(\\{22c15bb7-3cac-4480-ad95-8ef2b4762689\\})|(\\{4ce4a857-3ba4-46d3-83e1-424e608f8a1d\\})|(\\{638ad118-0407-437c-a657-f8bde7b0c511\\})|(\\{c35dba3d-eed7-4ee2-b7ed-b2f636810ea1\\})|(\\{7635e554-de52-4a55-81f4-5d4e7ac9e416\\})|(\\{b768c014-21ff-49c9-9a27-186e33574612\\})|(\\{e31ae098-b80a-4286-8688-8514ace2d0fd\\})|(\\{104607b9-ad49-4760-882a-5cc13164531a\\})|(\\{bf78148e-f4d1-48b7-92b2-93ca2003d619\\})|(\\{877777da-7695-4d7e-a469-2a4b4cfbe0c4\\})|(\\{b09f3de0-26c4-4790-ba8e-50a1d1725053\\})|(\\{a24b471c-9100-455c-825a-689533d24979\\})|(\\{12a8c732-c19a-468e-8be4-a16f9a27c845\\})|(\\{bad6c6a4-6108-4e44-b7e3-c05bed9d4e50\\})|(\\{1b598a16-ca58-41bf-8cc2-3741356363b9\\})|(\\{a5520fcc-b75a-4527-931b-e403aa8772ef\\})|(\\{cec7aeec-9352-4ed1-8362-8e384704ab29\\})|(\\{1bf3e066-3707-41eb-b62d-55da5bbe930d\\})|(\\{1fd8204a-f25b-47d0-bfac-35c41451e2e7\\})|(\\{ab1f1e53-9102-4f4f-a793-0a81f5669e13\\}))$/","prefs":[],"schema":1576756466412,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554606","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Various remote script injection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8258f92c-5b89-42a7-a984-dd4e94fa301a","last_modified":1576771656999},{"guid":"/^((\\{ca33d7f8-5b8c-4215-bf6e-a29b721024b8\\})|(\\{ef107eb3-c699-42ce-9310-1f36890fcac5\\})|(\\{48a3b395-8cb9-4093-b557-d967c653b13f\\})|(\\{27e7c4c8-916b-4dae-ab1d-46573fe889e6\\})|(\\{4795f211-f8b2-45b1-852c-982e1912414e\\})|(\\{000d5ed8-cf10-4929-89b5-f5369f50bbcd\\})|(\\{4b249174-1bc4-49c2-a0ca-eaa51facd4b0\\})|(\\{34d96b10-c44d-4398-9410-8d7d550d023a\\})|(\\{c067681d-dc69-4b05-8052-34fa69549aa8\\})|(\\{5b2dcc2b-08a9-4d36-a249-680a9e994938\\})|(\\{68cb60e7-4bfc-43cf-9875-f9548ad5d913\\})|(\\{ddca4204-8f9c-4e35-a8fe-47e94ffced48\\})|(\\{c5138dc7-3cf8-4117-9988-041c2a85868c\\})|(\\{140c670f-ee4d-4a16-bf83-c4012279b923\\})|(\\{d88779b5-daad-4ae8-abdc-3ff58c80da8a\\})|(\\{ab80f9f6-2a50-4074-b560-f839f1674bb3\\})|(\\{a8187405-efb6-4c1c-a9dc-e90fc064f55d\\})|(\\{f0d5c8c8-0697-4ee9-830d-3271ad125c17\\})|(\\{34e3121a-a2f2-4ada-b271-c661b8e0a215\\})|(\\{c4d8c3ad-ba8e-43e7-ae76-90521132805e\\})|(\\{ec5441c0-ddd4-4e70-8d02-92b99eb5f306\\})|(\\{ba00c2cd-f59d-44c5-984c-fbd066cdabfe\\})|(\\{b41fb99b-8e21-4eb8-b825-c6855daeb9c3\\})|(\\{c8329103-f242-4dee-9fca-b98e2e15c096\\})|(\\{59d0d43f-875f-4ebd-beeb-4dfa213a7d20\\})|(\\{9ce5d8a7-e97b-4341-bf16-c12ad44368c7\\})|(\\{e10ea3cf-17ea-4270-8602-83162b1c8309\\})|(\\{303e86df-ad8c-4a55-b921-5e2a32441834\\})|(\\{8ecebe6c-0ac5-4f3a-a32f-50b1686ee538\\})|(\\{b5150eb9-3cf8-4162-b114-56b289c45f75\\})|(\\{c04252ab-747b-4718-9d1c-bb90c72c4874\\})|(\\{976ecad8-b154-4201-a55e-4478a1651a42\\})|(\\{a0f98d44-f4b9-4726-9f01-7587ee46634c\\})|(\\{6b9c9f21-1108-4ae9-a1d8-d56566e20f13\\})|(\\{fdacc9f4-06f1-4619-bfbc-61f790e279df\\})|(\\{74d5b273-dcf7-4606-9b9d-0c5c38cbab80\\})|(\\{6fee68c0-1b38-483f-963b-43919f4ea797\\})|(\\{017a0e34-4942-47d7-a0ff-2093f14e17ae\\})|(\\{71251d4a-7ff4-4450-9459-163b911d9518\\})|(\\{6da358f8-9746-4c39-957d-b6821561b566\\})|(\\{4613ad29-db02-4d30-b857-b84a8ab412a2\\})|(\\{7993943a-0d47-4d30-8989-ce039ec1636f\\})|(\\{ac2fbafe-f182-49f0-920c-2e0d026b6c1f\\})|(\\{5f79fd50-fb20-42f1-adf5-3021aaf3f0e9\\})|(\\{a4295850-5057-46ab-bb31-2d283dff2474\\})|(\\{74517834-8cb5-4895-9f8b-3de15b771d92\\})|(\\{3dbebe53-9687-4e36-8c1e-79fcb098cecf\\})|(\\{275fc9ab-64fd-4430-8a35-43f73a87e8b9\\})|(\\{a26cdedc-b1eb-4fd2-b331-e71033c489a0\\})|(\\{d8fa69e8-1008-4f32-9db2-13ea7589bcec\\})|(\\{59704739-f6df-4272-968d-32f7c599da09\\})|(\\{208f846e-851a-4c07-a448-a66c40a2294c\\})|(\\{46c7b5ea-c1d0-4c2b-9122-3baa2e3bda3e\\})|(\\{39220be1-e69c-4b22-a5ff-545fcacf215f\\})|(\\{c0975246-6858-46e2-8f09-7d80d810c040\\})|(\\{8f284821-a420-4d79-bb7f-c1aae7a2fa90\\})|(\\{86d3e654-73c5-4b7f-a942-bd2347d4517a\\})|(\\{3d1af64b-542e-47ee-98a3-1f89bfca0f2a\\})|(\\{f0c2850d-101b-4de1-be16-3f09963048ab\\})|(\\{7388541e-8d9e-48a9-ac43-87dfdced6e87\\})|(\\{5d37398b-bea7-4ca7-bc4f-95de295be960\\})|(\\{3d8b3d51-3621-4aa5-b229-731cee83ee64\\})|(\\{ba67c9cf-ef60-4085-b6cf-729e5245089a\\})|(\\{1efe8d5d-ca8d-4a53-b2d4-a41380067041\\})|(\\{7698ee9d-345b-4395-b9e7-0479ed91f98d\\})|(\\{5f233e13-1892-41b6-81c6-a26c702d4a09\\})|(\\{d569420c-50a6-4082-b6d9-41c7bcb33464\\})|(\\{e406fddd-5ba4-4fdc-aa46-d556f97c8ef9\\})|(\\{29066f7e-a4ed-40b1-a02d-38ddf25d9533\\})|(\\{57e3e757-ca29-440c-9ef8-864da0e7ee72\\})|(\\{1237079a-7a08-4660-8fdb-6c3fdcecc787\\})|(\\{60429834-7a98-45e7-b525-6f31d55bbb3c\\})|(\\{bb850649-4ada-4735-a861-072ce9b647dd\\})|(\\{dfb103ab-cfee-49cd-b33a-e134367408c5\\})|(\\{24a0a50a-15d2-4806-9226-78491b3e986c\\})|(\\{2eb4b76a-f057-4d14-8d63-a5afa3571158\\})|(\\{cb5ad67a-5304-4351-bb15-530b159fa1f7\\})|(\\{0bd8bfda-24f5-4652-a434-664621e04a36\\})|(\\{f249d964-ac83-4059-893a-c3c5b38cc746\\})|(\\{94ba7f66-aef6-4590-8044-03aa705a4a2b\\})|(\\{dd178abb-e6fb-4e0a-b242-a64a53b24fb5\\})|(\\{7ff1da48-ae61-45f1-bcbf-2c22b4571d58\\})|(\\{d01909f7-598b-41b0-8907-2a9815c5c457\\})|(\\{93a37679-eb92-4eec-93b2-7bf77b0f94ca\\})|(\\{3ff7ce60-fbe5-4a50-9733-a347a02f09e5\\})|(\\{f076d6ff-1daf-42f3-b485-5b54b13aaf3e\\})|(\\{571d827c-5c84-42cc-8386-9e12abb8209a\\})|(\\{f6515794-8d44-402c-9a3d-3d712cb437bb\\})|(\\{796a59ab-77a7-4add-9481-5c7deee7c037\\})|(\\{a9b99a24-6cc1-491a-a81b-946cb42bc9f2\\})|(\\{9767896a-9561-426e-90d1-03b884d34eda\\})|(\\{95a6ebd9-52bc-4859-b92f-70a7c103e2b8\\})|(\\{4d24059d-463b-40b0-a86a-0a1de38fccb9\\})|(\\{d7c03c15-7287-4fb0-add0-c49744b48410\\})|(\\{6074519d-2d7c-45b6-b239-ea5452e93140\\})|(\\{425dafa9-0997-48df-b971-623847853747\\})|(\\{847688e9-b1d7-4607-b4fd-44c2365c01ba\\})|(\\{1383930d-64e9-4c3d-a629-361c70e3cd26\\}))$/","prefs":[],"schema":1576756857135,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558136","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various fake Flash/Avast/etc clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"72593718-af38-4f63-bcb9-7c6afd13de8f","last_modified":1576771656996},{"guid":"/^((\\{9aa1f441-7c04-4b00-83b2-6a4362090b41\\})|(\\{3001d016-bc15-49af-a81b-2c8764139321\\})|(\\{0af1d242-b004-49ae-91fc-00fa0f642bf9\\})|(\\{95a5a094-ba8e-4fe1-80bb-6f6c0a01bc2c\\})|(\\{36b33158-36fc-4728-bf08-8e532100af58\\})|(\\{5bda1d03-6533-4d8c-adb4-7179402ddeec\\})|(\\{dc7d18c8-c832-42cd-b9b0-f6a46a737ad1\\})|(\\{56d85baf-c366-491b-b93c-733a4a36009d\\})|(\\{1b08c0c7-d2fd-4905-82ab-d4d759af4051\\})|(\\{1b8a9b33-b3d9-42ea-adce-cec910c44f29\\})|(\\{0be707e8-d7d6-45d5-8212-3fd3784d7de7\\})|(\\{fb2e3c38-be42-480f-b60c-d614d372e218\\})|(\\{c088d705-9f59-40ac-98eb-192f67c44f03\\})|(\\{9570bbbd-d761-4380-850c-d9cc15200916\\})|(\\{2652d5a4-26b1-4e6f-9134-304d7b57af7a\\})|(\\{1e0a2a5f-170c-43c1-b458-c8fc8bdd7dec\\})|(\\{47595710-e0b3-4a88-9bf7-54e1f3bb6772\\})|(\\{c25a320e-dc50-486a-9589-13ef22f75a21\\})|(\\{645237c8-7da2-4298-a789-e11fbaaa580e\\})|(\\{f2356af6-9b9d-4c69-876a-710d446a9124\\})|(\\{98a67ccd-599a-4675-9578-35af1824fdd2\\})|(\\{f3924f49-64a3-4fde-8598-76eec8e67f34\\})|(\\{2a46402d-b6c4-4a0b-87f0-dc90bb24fa93\\})|(\\{40d92297-295d-4a44-8a0f-dd69510c9c30\\})|(\\{a5462b0d-6528-47d5-ada5-4a23d1e0355e\\})|(\\{280f7325-eaf0-451a-ad2d-3b2c4e80e070\\})|(\\{ee5a7045-e216-4836-949a-07f5aa1dabc3\\})|(\\{34ee38f4-e2ba-4e9d-8b1f-dd06e8bd205f\\})|(\\{7c71c234-ba74-467c-b750-727ee7e38382\\})|(\\{a83b3b31-4bfc-4343-beab-761f21b97f57\\})|(\\{b85d35a4-3a03-430d-a1a0-437448a86c22\\})|(\\{8b6c1e29-5009-477e-a798-244b0efb1515\\})|(\\{64891348-7fc0-4299-bd6a-6bfaa6cf21a6\\})|(\\{baa828ff-1723-483b-8034-145ad2795efd\\})|(\\{81fd4851-7ea3-4ea5-8775-49372fe1c8c8\\})|(\\{ce7d8e95-c7d3-49dc-8abf-e860ee707b09\\})|(\\{d84109e8-9945-48bc-90e8-0dd0b1b63b73\\})|(\\{ec12fd66-7294-4167-8fbc-4774150c0fa4\\})|(\\{0c506de9-8467-4a92-8cd3-11c87e121db2\\})|(\\{b1671fe5-c90a-4f68-b8bf-e54a147b5d05\\})|(\\{8b25277a-4df8-4d2d-b3b4-f8219e2ce7d6\\})|(\\{5705cd04-46c2-459f-8a9a-97ce57eee1ae\\})|(\\{8340b371-ed61-4b07-b293-853aa5dbb866\\})|(\\{87bbb065-e195-48ac-989e-ba48ee63b404\\})|(\\{c455fc20-6e9d-418c-9b45-75fd85852b32\\})|(\\{a80c87a7-3366-4192-b9cc-d1e862e1c13d\\})|(\\{5f4ba05c-c1a5-4bc7-b8d3-c14e807b2c64\\})|(\\{0114315a-beda-4d55-89a3-e00f6346e7be\\})|(\\{0fb7b987-721e-4828-9a0e-a72860ded1b2\\})|(\\{c44cd2a5-bf28-4520-ab2d-187752e51a26\\})|(\\{3a34c1a6-3cbf-49a0-bfe9-beff60da5ec6\\})|(\\{677e89a4-ae10-42f3-8e9d-d51be40daf8f\\})|(\\{85d70eae-fde6-4ac0-ab82-0148f2eb1543\\})|(\\{fddac013-6d12-41a4-9924-f5ea7618f22d\\})|(\\{84b5ca75-a431-45c7-995d-6d7268decd0d\\})|(\\{7374dd37-a901-4b65-993c-3323f87e0f3c\\})|(\\{157a5c60-7899-4328-a90c-83d34d0844d4\\})|(\\{5b288e8d-f33c-4602-a945-07f96e43a041\\})|(\\{80f059bd-602a-42d5-9b17-9f2c6a074102\\})|(\\{8e5a8075-8e21-4ab2-b189-5d435208122c\\})|(\\{d5b94c09-0ff8-4b86-b52a-590d5e5ad9af\\})|(\\{a569eb31-9456-49a9-9aa9-e69a8db159d3\\})|(\\{0431a147-f9f5-4ee3-8dca-57303110c226\\})|(\\{88c77421-5ebd-46fb-92a8-e0459b6edd20\\})|(\\{a4a0697d-9a01-4b21-bb88-5ac949cdb7b3\\})|(\\{03e0da0a-da1d-46f2-85c7-08258189fc04\\})|(\\{351f5a4d-a0fd-4ce7-a85a-6cb74fb6c57d\\})|(\\{0e0b22ea-831e-4104-9c2e-612d7ebf82e2\\})|(\\{7b5c604f-ea41-4bfa-88d1-843f27645199\\})|(\\{863f023c-a2e5-4043-8e49-8e3029004b19\\})|(\\{20e4b367-f8ad-4c9a-b590-976be87206aa\\})|(\\{436ca3ce-f10a-4cdc-86c2-a46f086b5fdb\\})|(\\{a53983bc-545e-429a-8aaa-6332e1a6287f\\})|(\\{5fb1995e-ac7e-4c01-a592-8b262856e039\\})|(\\{56086da0-b20d-4118-9670-56e85624c875\\})|(\\{67ef5673-5769-4d5b-902f-ba22cb16a51b\\})|(\\{1d50e81b-0594-4c24-80c2-abc479be4d18\\})|(\\{b190f2cf-f3f0-40e7-a05b-8eed296a0c8d\\})|(\\{490d8bfc-fd42-4ded-9fee-1f009e777468\\})|(\\{1d647c69-8e4b-4fe8-b0f3-d914a1410ee8\\})|(\\{4958ae27-1251-49b4-a9d4-2af7c36c833b\\})|(\\{6e80fdc3-79c7-423a-8e95-0e123c0f2187\\})|(\\{d8d3230d-5642-4c3f-a64e-5ff690f7a466\\})|(\\{ddbe5d7a-e037-4749-89bc-3460d358aca1\\})|(\\{48cd023c-52ef-4fe7-a2ff-101c22c49a5e\\})|(\\{fef34931-b7ca-49a5-8827-bec353efaa08\\})|(\\{331a936b-a87e-4271-b9a6-30935dad77ed\\})|(\\{21084437-803c-49c3-8f84-9a615bfa5dfe\\})|(\\{93511e9d-badf-4b5c-9fbc-17ef6a9786ae\\})|(\\{470e388e-a039-43f8-a7a7-d8f54d273feb\\})|(\\{e4cd5604-caec-4139-9781-94add5f41ba3\\})|(\\{f00bc2b9-2b69-4f68-8bef-91d498686731\\})|(\\{7b3206c4-dc98-4ad9-88ba-5a7b3048fd92\\})|(\\{8e19f5f7-2445-48b1-8910-55d42d9dfe34\\})|(\\{770e30c6-f1b9-4df4-8551-c7f09ddbd8ed\\})|(\\{bb9a8679-1f82-4ab7-8ea2-bac864a38542\\})|(\\{13f5e078-b80a-45fb-a907-c4515a7bb0fa\\})|(\\{d8df47e3-5e86-4669-9a15-a37f8a8593db\\}))$/","prefs":[],"schema":1576756624851,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1565184","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Private Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9f945be6-12e7-4948-af77-668bc3996ff3","last_modified":1576771656992},{"guid":"/^((_0dMembers_@www\\.myaudiotab\\.com)|(_12Members_@free\\.myscrapnook\\.com)|(_14Members_@download\\.totalrecipesearch\\.com)|(_1cMembers_@www\\.bringmesports\\.com)|(_29Members_@www\\.headlinealley\\.com)|(_2bMembers_@www\\.bettercareersearch\\.com)|(_2jMembers_@free\\.recipehub\\.com)|(_2jMembers_@www\\.recipekart\\.com)|(_2vMembers_@www\\.dailybibleguide\\.com)|(_39Members_2@www\\.mapsgalaxy\\.com)|(_49Members_@www\\.utilitychest\\.com)|(_4jMembers_@www\\.radiorage\\.com)|(_4lMembers_@www\\.bibletriviatime\\.com)|(_4zMembers_@www\\.videodownloadconverter\\.com)|(_57Members_@free\\.marineaquariumfree\\.com)|(_5aMembers_@download\\.mywebface\\.com)|(_5eMembers_@www\\.translationbuddy\\.com)|(_5mMembers_@download\\.myfuncards\\.com)|(_5pMembers_@www\\.metrowhiz\\.com)|(_64Members_@www\\.televisionfanatic\\.com)|(_69Members_@www\\.packagetracer\\.com)|(_6xMembers_@www\\.readingfanatic\\.com)|(_73Members_@www\\.easyhomedecorating\\.com)|(_7eMembers_@www\\.homeworksimplified\\.com)|(_7jMembers_@download\\.gardeningenthusiast\\.com)|(_7nMembers_@download\\.crazyforcrafts\\.com)|(_8eMembers_@download\\.howtosimplified\\.com)|(_8hMembers_@download\\.allin1convert\\.com)|(_8iMembers_@download\\.audiotoaudio\\.com)|(_8jMembers_@download\\.myimageconverter\\.com)|(_8lMembers_@free\\.filesharefanatic\\.com)|(_94Members_@www\\.motitags\\.com)|(_9eMembers_@free\\.findmefreebies\\.com)|(_9pMembers_@free\\.onlinemapfinder\\.com)|(_9tMembers_@download\\.internetspeedtracker\\.com)|(_9tMembers_@free\\.internetspeedtracker\\.com)|(_apMembers_@free\\.puzzlegamesdaily\\.com)|(_b7Members_@free\\.mytransitguide\\.com)|(_beMembers_@free\\.dailylocalguide\\.com)|(_brMembers_@free\\.yourtemplatefinder\\.com)|(_ceMembers_@free\\.easypdfcombine\\.com)|(_chMembers_@free\\.discoverancestry\\.com)|(_d0Members_@free\\.gostudyhq\\.com)|(_d1Members_@free\\.mysocialshortcut\\.com)|(_d9Members_@www\\.everydaylookup\\.com)|(_dbMembers_@free\\.getformsonline\\.com)|(_dgMembers_@free\\.trackapackage\\.net)|(_dhMembers_@www\\.packagetracking\\.net)|(_diMembers_@www\\.easymaillogin\\.com)|(_djMembers_@www\\.emailfanatic\\.com)|(_dnMembers_@www\\.webmailworld\\.com)|(_doMembers_@free\\.convertanyfile\\.com)|(_dpMembers_@free\\.findyourmaps\\.com)|(_dqMembers_@www\\.downspeedtest\\.com)|(_drMembers_@free\\.downloadinboxnow\\.com)|(_dsMembers_@free\\.internetspeedutility\\.net)|(_duMembers_@free\\.funpopulargames\\.com)|(_dvMembers_@www\\.testinetspeed\\.com)|(_dxMembers_@www\\.download-freemaps\\.com)|(_dzMembers_@www\\.pconverter\\.com)|(_e1Members_@free\\.actionclassicgames\\.com)|(_e5Members_@www\\.productivityboss\\.com)|(_e6Members_@www\\.freelocalweather\\.com)|(_e7Members_@free\\.gamingassassin\\.com)|(_eaMembers_@www\\.mynewsguide\\.com)|(_ebMembers_@download\\.metrohotspot\\.com)|(_ecMembers_@www\\.instantradioplay\\.com)|(_edMembers_@free\\.myradioaccess\\.com)|(_eeMembers_@download\\.freeradiocast\\.com)|(_efMembers_@free\\.funcustomcreations\\.com)|(_ehMembers_@free\\.dailyrecipeguide\\.com)|(_eiMembers_@www\\.100sofrecipes\\.com)|(_ejMembers_@free\\.downloadrecipesearch\\.com)|(_ekMembers_@free\\.biggamecountdown\\.com)|(_eoMembers_@www\\.transitsimplified\\.com)|(_erMembers_@free\\.getvideoconvert\\.com)|(_esMembers_@free\\.downloadmanagernow\\.com)|(_euMembers_@free\\.filesendsuite\\.com)|(_ewMembers_@free\\.mergedocsonline\\.com)|(_exMembers_@free\\.easydocmerge\\.com)|(_f7Members_@download\\.smsfrombrowser\\.com)|(_fdMembers_@wallpapers\\.myway\\.com)|(_fkMembers_@free\\.getflightinfo\\.com)|(_foMembers_@free\\.flightsearchapp\\.com)|(_fpMembers_@free\\.passwordlogic\\.com)|(_frMembers_@free\\.testforspeed\\.com)|(_fsMembers_@free\\.pdfconverterhq\\.com)|(_ftMembers_@free\\.mytelevisionhq\\.com)|(_fvMembers_@free\\.directionsace\\.com)|(_fwMembers_@free\\.howtosuite\\.com)|(_fxMembers_@free\\.mytransitplanner\\.com)|(_g3Members_@free\\.easyphotoedit\\.com)|(_gcMembers_@www\\.weatherblink\\.com)|(_gpMembers_@free\\.mymapswizard\\.com)|(_gtMembers_@free\\.gamingwonderland\\.com)|(_h2Members_@free\\.calendarspark\\.com)|(_hbMembers_@free\\.quickphotoedit\\.com)|(_hfMembers_@free\\.everydaymanuals\\.com)|(_hgMembers_@free\\.atozmanuals\\.com)|(_hmMembers_@free\\.easyweatheralert\\.com)|(_hnMembers_@free\\.quickweatheralert\\.com)|(_hoMembers_@free\\.directionsbuilder\\.com)|(_hpMembers_@free\\.easyfileconvert\\.com)|(_hqMembers_@free\\.scenichomepage\\.com)|(_hvMembers_@free\\.myfileconvert\\.com))$/","prefs":[],"schema":1576757193463,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598806","why":"These add-ons collect ancillary user data among other policy violations.","name":"New tab data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1b799430-d1a3-49a8-91a2-f45069528ebe","last_modified":1576771656988},{"guid":"/^((\\{02cfe44d-20d1-4275-b325-42888248443d\\})|(\\{03476021-f140-425d-8e62-a6455206a874\\})|(\\{0a50fe22-313f-4a59-9032-2fd63bdd2815\\})|(\\{21c91802-e348-4dd0-820a-07aca1de12a5\\})|(\\{24f43a02-83c5-44cd-a611-0bae2093393f\\})|(\\{257284b0-be1d-44e4-8321-b2a7a56c2eb5\\})|(\\{2610c188-123a-4e4f-a6c7-2ed7e8b70bf6\\})|(\\{26a28ba8-d8e3-4284-ab58-8542144ff657\\})|(\\{27e8838f-91ab-486b-8851-9de8bd633aac\\})|(\\{27f348a5-adb0-4037-bc03-f6832cfd6fc3\\})|(\\{28f5d824-8067-4859-8fe3-22a5f96552bc\\})|(\\{32f66767-230f-4dd8-8538-d6dca8b327f6\\})|(\\{35a35db0-010b-4105-9dc3-d5fe761023ab\\})|(\\{3d61019d-c636-4c0d-91d2-6e2d734014e0\\})|(\\{44c9b9cf-b960-45fc-bf0a-9be9c455c975\\})|(\\{48e711a3-644f-4520-8205-11b377df480e\\})|(\\{50ba963f-1b4a-4ed0-b22f-8e1c18d17364\\})|(\\{53150391-1080-4a50-96ed-de24a6ea24c6\\})|(\\{5570199f-fc69-45eb-a0b0-7cc60089022c\\})|(\\{595c83ad-5a64-4740-a118-39a49aede0e3\\})|(\\{5ae5110f-449e-4c5e-b247-9d1e9971d3bc\\})|(\\{61b734ef-f886-4466-8525-8276e9b19b55\\})|(\\{64e9998b-c477-4c29-bf1d-945146cf9376\\})|(\\{682ff4d6-9b2b-4e1b-99b0-e2dcc2476bd1\\})|(\\{6836a626-1ec1-4c3c-9b25-5e4cd5048ad5\\})|(\\{69f1dda4-a6fa-49f6-a16c-7b3bc3e0e520\\})|(\\{6b7eb4f0-ef7d-4da4-8c3d-21b7c2dfb19f\\})|(\\{725f919c-8adf-4192-9c0e-89ab1027161e\\})|(\\{7320730b-e202-4405-8d76-97a862239701\\})|(\\{79821b50-57ca-4267-9dbf-84aeb061e126\\})|(\\{7ee25d12-df90-4a6a-a068-7a6919651bc7\\})|(\\{816b4ade-7b69-4a73-994a-b37f9939d5d8\\})|(\\{82956d74-9e19-4770-97cc-73caa2c9f711\\})|(\\{839b2467-6857-49f9-a730-baf7b2a98039\\})|(\\{85af3203-f8a3-4ba5-8d0f-c3ee1d38c0d8\\})|(\\{8866f414-2f72-44a6-b7dc-6959891e9ee3\\})|(\\{914f8b0b-f4e0-46d5-bae6-4fadd78ebe8c\\})|(\\{93969099-a7b4-43aa-bcc0-241676204257\\})|(\\{972315f7-e09e-4f7d-b4d7-1ed093e06dc0\\})|(\\{98c7dc13-2e24-4ea0-8f02-34a2e19f19f1\\})|(\\{99ca0fea-aa27-42b9-9dfb-5c2b02601d30\\})|(\\{9cd8f1f0-b739-427a-9378-16dee329a2b6\\})|(\\{9f0a0293-94ca-4e27-b697-2032f455a12f\\})|(\\{a41f8d9a-ea42-4d59-8966-5f9e805246a5\\})|(\\{b21eea41-def0-4ab6-afe4-ec98397bf59c\\})|(\\{b7561855-e073-4a3a-b827-33bd97042442\\})|(\\{b8b11c35-1c11-4634-9b20-6aff2344a65d\\})|(\\{b90bc248-5b37-4de0-be18-0f208c5cf958\\})|(\\{be17a3b2-18a6-4925-aa7c-bb377bec7793\\})|(\\{be82443f-f8e0-46eb-8cda-80ff1d911a16\\})|(\\{ccce69c0-3cc6-4e63-acb6-77a7c63772ed\\})|(\\{daf9a25c-83b8-4e4b-aca2-ff7ca55289d3\\})|(\\{db7d9d1b-1758-44a0-a8fb-0eb2f3ac4d36\\})|(\\{de34ccf4-0634-4ba2-9bdc-42b293c8cdc8\\})|(\\{df2bbd0f-0a8a-45de-a75b-4349835a8576\\})|(\\{e203bc10-6462-49e6-8f2f-223a29ce82d7\\})|(\\{e66e26fe-5092-4fbd-9851-78a1f5c34575\\})|(\\{ebaf7169-6df9-463f-bf15-10f48143bf73\\})|(\\{ebe3c932-d6fe-4ad7-9eb9-7857aa6fd1ca\\})|(\\{f83c3eae-8dd8-4f38-b7c0-272e34599771\\})|(\\{fb00fead-b480-4906-8b4c-4039c272b83d\\})|(\\{fc14529e-1b64-4717-8a1f-6634cc343c7c\\})|(@blackfridaystores)|(@blackfridaystoresco)|(@blah)|(@celebjunky)|(@checkmaps)|(@childt)|(@convertmypdf)|(@convertmypdfco)|(@dailyjobssearch)|(@dogs)|(@email\\.superextension\\.info)|(@flirtywallpapers)|(@justlovepetscom)|(@liveemail)|(@localweathertoday)|(@localweathertodayco)|(@loginpro)|(@mapsfinder)|(@mynetspeed)|(@mynetspeed\\.co)|(@mynetspeedco)|(@qwertyuiop)|(@qwertyuiopasdf)|(@searchprivacy)|(@searchprivacy-fx)|(@searchprivacy-fx-1\\.1\\.15)|(@searchprivacy-fx-1\\.1\\.16)|(@searchprivacy-fx-1\\.1\\.17)|(@searchprivacy-fx-1\\.1\\.18)|(@searchprivacy-fx-1\\.1\\.19)|(@searchprivacy-fx-1\\.1\\.20)|(@sportsbulletin)|(@sportsupdates)|(@thecouponstore)|(@trailertab)|(@wheresmypackage)|(@wheresmypackageco)|(@www\\.blackfridaystores\\.co)|(@www\\.convertmypdf\\.online)|(@www\\.convertthepdf\\.com)|(@www\\.dailyjobssearch\\.net)|(@www\\.easyonlinerecipe\\.info)|(@www\\.EasyOnlineRecipe\\.net)|(@www\\.easyrecipesearch\\.net)|(@www\\.findmaps\\.co)|(@www\\.job-portal\\.co)|(@www\\.justlovepets\\.online)|(@www\\.movie-quest\\.co)|(@www\\.mymapbuddy\\.net)|(@www\\.mynetspeed\\.co)|(@www\\.searchsafe\\.online)|(@www\\.searchsafe\\.site)|(@www\\.searchsafe\\.space)|(@www\\.searchsafe\\.website)|(@www\\.thecouponstore\\.co)|(@www\\.thecouponstore\\.co\\.test2)|(abc_KtOQLgxUgW@abc)|(Access_Mails_Now_YEsNTbvoal@www\\.accessmailsnow\\.com)|(Access_My_Inbox_zPsghWWAPc@www\\.accessmyinbox\\.com)|(Accurate_Weather_Today_clone_vGXzNgIjwr@www\\.accurateweathertoday\\.com)|(Accurate_Weather_Today_clone_zpRLPSpMcU@www\\.accurateweathertoday\\.com)|(alot_Search_unSoxsuUZQ@www\\.searchalot\\.co))$/","prefs":[],"schema":1576757781685,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a0be3662-6b8f-4d91-bbe1-fde9500adb48","last_modified":1576771656985},{"guid":"/^((\\{a4b95555-755a-4a3f-bc64-f6999377963d\\})|(djamol@webdownloader)|(\\{b23e59ff-5491-40f4-adb2-577d31d8778a\\})|(\\{90e41842-755d-40e0-9136-8129df55a644\\})|(\\{8e0ccf87-6ea4-4985-b07f-4d503f105d91\\})|(\\{69d0ae35-7d39-4c41-b455-4d751117317e\\})|(\\{df0dfe82-78a9-456e-9dc1-c832a94d43a7\\})|(\\{7bbd26d9-d245-48d3-b3a6-5e19948dfa14\\})|(\\{3d9109d8-463e-4dde-9416-d25c6ea995df\\})|(\\{2726adf8-c1f9-4ed9-baf1-9a3c1742b659\\})|(\\{bfc40cf5-a085-4f0b-a3ef-5e124f2e445e\\})|(\\{37927c18-d5a5-4187-9e6e-6a787364bd9f\\}))$/","prefs":[],"schema":1576093292597,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1603731","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b8daa919-7a9f-4a83-8aef-4a5d3fbfb502","last_modified":1576242123974},{"guid":"{d69204d4-610c-4144-9d26-8cf8b2ad6e15}","prefs":[],"schema":1576032043088,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1603086","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"IDM Integration Module"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c3774104-d770-48a5-acd7-c7136d62bb40","last_modified":1576068160484},{"guid":"{d69204d4-610c-4144-9d26-8cf8b2ad6e14}","prefs":[],"schema":1576012075125,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1603001","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"IDM Integration Module"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8c92ab3a-9c31-4f75-b980-19e39b702fd8","last_modified":1576032042722},{"guid":"/^((\\{108dfe62-0473-47cd-b33e-8270d062db77\\})|(\\{e4a4e54a-5d49-4ac3-93d7-ec0d30ad06ef\\})|(\\{ccad95df-add6-4d8a-aa5c-cdc484075bad\\}))$/","prefs":[],"schema":1575996881649,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602162","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fd42cd0b-a72a-4a0f-9a6a-965ee2f29cb6","last_modified":1576012074754},{"guid":"{7bb202fa-9247-49c6-898c-ce0d36bc44e3}","prefs":[],"schema":1575976576210,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602821","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"MyPopupBlocker"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"810f4d41-368a-4cfc-8513-81063587b97c","last_modified":1575996881281},{"guid":"@cloaking-skull","prefs":[],"schema":1575920492132,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602736","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Cloaking Skull"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4438f49a-2f78-48d9-bc7e-a897f3f62945","last_modified":1575976575848},{"guid":"/^((photoplus@4329fgjfdgkf343\\.com)|(\\{1b1c9b32-9dd3-461c-85c6-bbac4ef2af10\\})|(\\{7DC6D86C-EA66-48C3-9BA7-AE26A8ECB175\\})|(david\\.janitzek@gmail\\.com)|(\\{ac393d9e-1610-4eaa-8951-77655f98b4f7\\}))$/","prefs":[],"schema":1575890870070,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602406","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aa154bb5-7fc9-4226-928e-199aa7eded69","last_modified":1575892910839},{"guid":"/^((\\{e1d407bc-1986-4577-bc31-a63d07cbae10\\})|(\\{3a2831f6-37df-4a42-baf6-0b81d5b6a68f\\})|(s3google@translator))$/","prefs":[],"schema":1575889775993,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602293","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"S3 Translator"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eac7bf16-aae5-4958-8b85-5dcc9a3a1ce8","last_modified":1575890869693},{"guid":"/^((\\{87dd9a06-b692-4fa0-91c4-0aead43c25cc\\})|(\\{9082269e-1de7-4d34-9736-1174917f9459\\}))$/","prefs":[],"schema":1575747691126,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602285","why":"These add-ons violate Mozilla's add-on policy by executing remote code and/or collecting ancillary data.","name":"HomeTab/FLSearch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1af528d2-d0e1-4981-acfa-3b10501aed34","last_modified":1575889775630},{"guid":"/^((xh5yh45p59fdrtimlot6@xh5yh45p59fdrtimlot6\\.com)|(758ct3wkmbrvd8equs21@758ct3wkmbrvd8equs21\\.com))$/","prefs":[],"schema":1575661660854,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602098","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"235d9439-305c-48db-a6da-5a8639ab9c80","last_modified":1575663903042},{"guid":"{ecc522ab-9926-4dc5-90ab-8f979db871ed}","prefs":[],"schema":1575651664337,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602087","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"YTMP4DL"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"01645c30-87fc-4332-9c94-255ef9e50120","last_modified":1575661660491},{"guid":"/^((\\{81f244fc-e5ab-4233-bad0-f61f334dcd43\\})|(\\{98222415-4241-4b89-b81d-651c1a872881\\}))$/","prefs":[],"schema":1575628797035,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1601546","why":"This add-on violates Mozilla's add-on policies by facilitating access to malicious web content and software.","name":"Video download add-ons (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"404e3032-80a6-43f5-a02e-c7d4e8f684d5","last_modified":1575632376941},{"guid":"{c5b1783f-29c8-4bb0-ab8b-a6a9a0c5e4e0}","prefs":[],"schema":1575627603102,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1601747","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"IDM Download faster music (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ef1c681a-ecca-4ea0-b798-6a093765b984","last_modified":1575628796682},{"guid":"/^((smartnav@navigation-internet\\.com)|(game@ultimate-cosmo\\.com)|(update@ultimate-cosmo\\.com)|(extension@gum-gum-streaming\\.com)|(extension@one-piece-fighting\\.com)|(extension@manga-vf\\.fr)|(adblock@gum-gum-streaming\\.com)|(adblock@manga-vf\\.fr))$/","prefs":[],"schema":1575313586028,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600592","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0b0c648b-1f8d-49f4-bd6e-96e69bbebb45","last_modified":1575376981463},{"guid":"/^((\\{33a89146-6b66-4834-bea3-18733d7646f8\\})|(\\{55f304c0-a431-4b35-8cd0-472569a9dd86\\})|(\\{581fae86-7847-448d-9950-5a96127b293a\\})|(\\{9f2a514d-e9dd-4bd6-b743-b15492c10167\\})|(\\{28bf22b4-d52d-4d8a-b710-3868b3bc46ce\\})|(\\{3e9246fc-8125-499b-984e-a8b68507bd36\\})|(\\{731784b0-81c4-4fe9-8741-f5960e12088c\\})|(\\{21585a0f-bcb6-480c-9f70-5cd33cf64833\\})|(\\{2741fd42-3faa-4cef-9b08-361f0c4990ea\\})|(\\{4c479c80-2f53-4d38-a366-0f0c3a346d40\\})|(\\{c4471705-e0eb-47ed-8af9-046c1e808fdd\\})|(\\{2b2bc8ab-5a38-4a26-8ce1-2af9fa2ad7bf\\})|(\\{6840b587-8324-44a0-b176-56d15580dde4\\})|(\\{44d8d882-f6a0-4349-93bc-d3a2353a3fd3\\})|(\\{ddf7716b-badc-417c-b3ce-6322fd67cc65\\})|(\\{82abdf82-f361-47ab-bab7-7f862e132e06\\})|(\\{d24e0155-d36c-402e-943f-d5816451e86f\\})|(\\{926f1f58-3c6e-4f07-8847-2998dc0f1dbd\\})|(\\{e8d228cc-ecb9-4ef6-98e3-8052858fd3ea\\})|(\\{86a868c9-707f-46e8-88ca-5edde6a549e2\\})|(\\{7d5a68c2-261f-449f-af8d-b99a7ae7a01f\\})|(\\{e579c6fb-bf80-4ae5-b3d2-613e084af7fa\\})|(\\{ef7a3832-deb4-4798-b61b-a7cc8b8aa1e2\\})|(\\{48532584-e4dc-4902-b27d-ce35cb29c4c7\\})|(\\{b792fe29-4eb1-412b-bd0b-458252dfab39\\})|(\\{c6f8a307-8024-4e6f-a5f1-595ba43d765e\\})|(\\{7c7a26bd-b1cb-4088-a16e-48f26d22d569\\})|(\\{ff3b2825-86da-4525-abe6-c673b70f58cc\\})|(\\{d4def0be-0d09-453a-9cca-ddc1e1cc9a1d\\})|(\\{0024b95a-9610-4e9d-b836-da40c99c959e\\})|(\\{b09a0797-b6d2-485e-8afc-8361055761ea\\})|(\\{f5c86ae7-cf67-43f8-895c-b2b19209ee81\\})|(\\{bc5d5c2b-e895-49d5-966b-cd1aaee9d324\\})|(\\{a6a8b5c9-45da-457e-990c-b89515139e80\\})|(\\{6d00e6c8-2f26-4dad-81e6-888c080ddfc7\\})|(\\{8f4412a8-c670-4298-a0bc-da30dc3a5ae2\\})|(\\{912d27f7-d9ac-489b-8d7c-2873526e11fc\\})|(\\{3d47bef5-277d-4f06-8ad8-802266e57d17\\})|(\\{0e0bbc6c-914e-47e2-96b9-33f94af6f0a7\\})|(\\{e0f289e7-1284-496b-aa09-f052089d61a3\\})|(\\{64832a69-731b-4481-ad59-3c8aa4006643\\})|(\\{c174dc42-ad4e-4378-8f07-8a47025f8407\\})|(\\{28753278-896f-4f48-8ef3-ea3379896a40\\})|(\\{cdb22d53-d13d-4500-af92-7e653e988722\\})|(\\{65d037b6-c44d-49c5-aa10-a947940c61cb\\})|(\\{d4906685-5b71-49a8-92b5-76f19f2b0a66\\})|(\\{2bebc776-9ee0-47c8-9c99-0351b140ffd2\\})|(\\{58d56295-8d0f-4fe1-8538-2d916911e304\\})|(\\{19283d7a-9fb5-417e-9401-b952ce14a268\\})|(\\{7338a117-ff10-4862-8992-b42829b2e47b\\})|(\\{8defb767-abf1-4d39-88df-9cfc6a39a8e3\\})|(\\{15a77f39-2b56-46b5-b5d6-6064a6f1fbdd\\})|(\\{87fd9298-3176-400b-be06-45538ecd0702\\})|(\\{cda1cc52-9961-477d-8faa-95c7f9025498\\})|(\\{c8056cfe-0bd7-43db-88ae-468f78cc8637\\})|(\\{54bf103a-3f38-43aa-b1ed-2ccbcadb4e0b\\})|(\\{bb67004c-57d6-4632-bc89-8991560a011f\\})|(\\{2902f9ee-b79a-415f-99bf-b661c2bf42e0\\})|(\\{81e0bd24-a93d-4db0-8db9-d5560805c153\\})|(\\{3004ff5d-c68c-4e2b-80b4-2dc21bde9195\\})|(\\{25bcebd4-1d72-4502-8927-a1a6ac35d595\\})|(\\{0b440d2f-8a97-4d2e-bacb-703260897903\\})|(\\{7d0cc577-51fb-4994-8926-7df70f5f16fc\\})|(\\{a6c138fd-c83d-416b-90a8-74bfafefb67a\\}))$/","prefs":[],"schema":1575229292065,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600576","why":"This add-on violates Mozilla's add-on policy by collecting data without user disclosure or consent.","name":"Add-ons collecting data without user disclosure or consent"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"80a34f3f-1f4e-47cb-99a4-1b343b322455","last_modified":1575285295616},{"guid":"/^((_qdMembers_@extmys\\.mysearch\\.com)|(_qjMembers_@www\\.taxcenternow\\.com)|(_ohMembers_@www\\.whizds1\\.com)|(_opMembers_@tvhero\\.thewhizmarketing\\.com)|(_oqMembers_@sportsaddict\\.thewhizproducts\\.com)|(_ooMembers_@yourdailytrailer\\.yournewtab\\.com)|(_olMembers_@screendream\\.yournewtab\\.com)|(_orMembers_@sporthero\\.thewhizmarketing\\.com)|(_osMembers_@gogamego\\.thewhizproducts\\.com)|(_r3Members_@www\\.mysearch\\.com)|(_ojMembers_@www\\.whizds2\\.com)|(_flMemberstest_@free\\.myformsfinder\\.com)|(_dqMemberstest_@www\\.downspeedtest\\.com)|(_flMembersAlt_@free\\.myformsfinder\\.com)|(_dqMembersAlt_@www\\.downspeedtest\\.com)|(_rcMembers_@www\\.extsb\\.searchbetter\\.com)|(_piMembers_@install\\.mysporttab\\.com)|(_phMembers_@install\\.streamfrenzy\\.com)|(_pfMembers_@install\\.myvideotab\\.com)|(_qxMembers_@install\\.utili-site\\.com)|(_qyMembers_@install\\.cryptoconvertertab\\.com)|(_r4Members_@install\\.salah-time\\.com)|(_r9Members_@install\\.speed-exam\\.com)|(_rbMembers_@Install\\.movie-canal\\.com)|(_poMembers_@www\\.linkuryds1\\.com)|(_l9Members_@www\\.plaskodss3\\.com)|(_ppMembers_@www\\.firstofferzds1\\.com)|(_qkMembers_@www\\.exploreads\\.com)|(_kfMembers_@www\\.bluecpads\\.com)|(_k2Members_@www\\.arcadejetds\\.com)|(_qiMembers_@tvguru-lp\\.olympuswaymarketing\\.com)|(_p8Members_@www\\.easywatch\\.online)|(_kcMembers_@www\\.utilitytab\\.com)|(_kdMembers_@www\\.utilitytab\\.com)|(_qrMembers_@www\\.install\\.utilitytab\\.com)|(_qsMembers_@www\\.utilitytab\\.com)|(_izMembers_@www\\.geteasyarcade\\.com)|(_qgMembers_@www\\.getinstantpdf\\.com)|(_p7Members_@www\\.tigersdeal\\.com)|(_jgMembers_@www\\.greathippo\\.com)|(_jdMembers_@www\\.greathippo\\.com)|(_juMembers_@arcadejet\\.com)|(\\{90ac1d06-caf8-46b9-9325-59c82190b687\\}))$/","prefs":[],"schema":1575056491406,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600273","why":"These add-ons collect ancillary user data among other policy violations.","name":"New Tab Data Collection Extensions"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"196e36b5-3225-4f8d-a1a0-6696ea8885f9","last_modified":1575066166785},{"guid":"{99454877-875a-473e-a0c7-03ab910a8461}","prefs":[],"schema":1575040644063,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600327","why":"The add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Smart Screen Capture"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3f98e9e7-40d0-4af5-969c-9ea1aadbf280","last_modified":1575041576477},{"guid":"/^((Stark-vpn\\.5\\.16@firefox\\.com)|(Video_Downloader_Plus@gmail\\.com))$/","prefs":[],"schema":1575038746215,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600322","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"89027d84-8871-4d44-8a14-18f029df268b","last_modified":1575040643688},{"guid":"/^((\\{b3d1c58f-b27e-4da8-bd4c-c3188346139f\\})|(\\{17101510-b5fb-4361-9e02-70a0e714b591\\})|(\\{d46a3635-4ca8-4e70-8bee-e49714896521\\}))$/","prefs":[],"schema":1574981048393,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600315","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Search hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"36b86fac-a1f2-4df5-937a-d5667e0e824d","last_modified":1575038745843},{"guid":"/^((_orMembers_@www\\.apn\\.ask\\.com)|(_jsMembers_@www\\.apn\\.ask\\.com)|(_osMembers_@www\\.apn\\.ask\\.com)|(_otMembers_@www\\.apn\\.ask\\.com)|(_owMembers_@www\\.apn\\.ask\\.com)|(_ogMembers_@seen-on-screen\\.thewhizmarketing\\.com)|(_qeMembers_@app\\.mysearch\\.com)|(_otMembers_@muzikfury\\.thewhizmarketing\\.com)|(_oiMembers_@screenaddict\\.thewhizproducts\\.com)|(_omMembers_@screenwatch\\.yournewtab\\.com)|(_okMembers_@www\\.whizds3\\.com)|(_j0Members_@www\\.gettvstreamnow\\.com)|(_64Members_b@www\\.televisionfanatic\\.com)|(_ruMembers_@getscreenmania\\.com)|(_rxMembers_@www\\.gamelocket\\.com)|(_s1Members_@www\\.deadlockds\\.com)|(_s3Members_@www\\.mysearchappwhiz\\.com)|(_rvMembers_@www\\.groovymediads\\.com)|(_s8Members_@secure\\.norton\\.myway\\.com)|(_r3Members_@free\\.mysearch\\.com)|(_sgMembers_@www\\.easyhowtoguide\\.com)|(_shMembers_@www\\.fastformsfinder\\.com)|(_siMembers_@www\\.mydirectionsfinder\\.com)|(_seMembers_@www\\.brightcast\\.com)|(_spMembers_@www\\.onlinemapsnow\\.com)|(_slMembers_@www\\.creativeinternetds\\.com)|(_hpMembers0619_@free\\.easyfileconvert\\.com)|(_ceMembers0619_@free\\.easypdfcombine\\.com)|(_euMembers0619_@free\\.filesendsuite\\.com)|(_dpMembers0619_@free\\.findyourmaps\\.com)|(_dxMembers0619_@www\\.download-freemaps\\.com)|(_65Members0619_@download\\.fromdoctopdf\\.com)|(_dbMembers0619_@free\\.getformsonline\\.com)|(_39Members0619_@www\\.mapsgalaxy\\.com)|(_ewMembers0619_@free\\.mergedocsonline\\.com)|(_flMembers0619_@free\\.myformsfinder\\.com)|(_d1Members0619_@free\\.mysocialshortcut\\.com)|(_b7Members0619_@free\\.mytransitguide\\.com)|(_ozMembers0619_@free\\.newnotecenter\\.com)|(_jbMembers0619_@www\\.onlinemapsearch\\.com)|(_jjMembers0619_@www\\.onlineroutefinder\\.com)|(_69Members0619_@www\\.packagetracer\\.com)|(_fsMembers0619_@free\\.pdfconverterhq\\.com)|(_jnMembers0619_@www\\.pdfconverttools\\.com)|(_gcMembers0619_@www\\.weatherblink\\.com)|(_brMembers0619_@free\\.yourtemplatefinder\\.com)|(_s5Members_@www\\.bluecpads1\\.com)|(_j5Members0619_@ext\\.ask\\.com)|(_5zMembersff0619_@www\\.couponxplorer\\.com)|(_1gMembersff0619_@www\\.inboxace\\.com)|(_flMembersff1219_@free\\.myformsfinder\\.com)|(_j5Membersff1219_@ext\\.ask\\.com)|(_8eMembersff1219_@download\\.howtosimplified\\.com)|(_8jMembersff1219_@download\\.myimageconverter\\.com)|(_94Membersff1219_@www\\.motitags\\.com)|(_ceMembersff1219_@free\\.easypdfcombine\\.com)|(_d1Membersff1219_@free\\.mysocialshortcut\\.com)|(_dqMembersff1219_@www\\.downspeedtest\\.com)|(_dzMembersff1219_@www\\.pconverter\\.com)|(_dpMembersff1219_@free\\.findyourmaps\\.com)|(_e1Membersff1219_@free\\.actionclassicgames\\.com)|(_e5Membersff1219_@www\\.productivityboss\\.com)|(_ewMembersff1219_@free\\.mergedocsonline\\.com)|(_euMembersff1219_@free\\.filesendsuite\\.com)|(_dsMembersff1219_@free\\.internetspeedutility\\.net)|(_fsMembersff1219_@free\\.pdfconverterhq\\.com)|(_iwMembersff1219_@free\\.allinonedocs\\.com)|(_hoMembersff1219_@free\\.directionsbuilder\\.com)|(_hpMembersff1219_@free\\.easyfileconvert\\.com)|(_hxMembersff1219_@free\\.mergedocsnow\\.com)|(_hyMembersff1219_@free\\.formfetcherpro\\.com)|(_i2Membersff1219_@free\\.streamlineddiy\\.com)|(_i4Membersff1219_@free\\.fileconvertonline\\.com)|(_j6Membersff1219_@www\\.freemanualsindex\\.com)|(_jbMembersff1219_@www\\.onlinemapsearch\\.com)|(_jaMembersff1219_@www\\.testonlinespeed\\.com)|(_joMembersff1219_@www\\.onlineformfinder\\.com)|(_jnMembersff1219_@www\\.pdfconverttools\\.com)|(_k8Membersff1219_@www\\.mymapsexpress\\.com)|(_koMembersff1219_@www\\.quickpdfmerger\\.com)|(_kxMembersff1219_@www\\.smarteasymaps\\.com)|(_l6Membersff1219_@www\\.propdfconverter\\.com)|(_l4Membersff1219_@www\\.quicktemplatefinder\\.com)|(_l1Membersff1219_@www\\.videoconverterhd\\.com)|(_ozMembersff1219_@free\\.newnotecenter\\.com)|(_lbMembersff1219_@free\\.worldofnotes\\.com)|(_q8Membersff1219_@www\\.getformsfree\\.com)|(_psMembersff1219_@www\\.freetemplatefinder\\.com)|(_pvMembersff1219_@www\\.mapmywayfree\\.com)|(_gcMembersff1219_@www\\.weatherblink\\.com)|(_65Membersff1219_@download\\.fromdoctopdf\\.com)|(_sxMembers_@www\\.mapsmasteronline\\.com)|(_j6Members_@ext\\.ask\\.com)|(_66Members_@download\\.fromdoctopdf\\.com)|(_htMembers_@free\\.gamingwonderland\\.com)|(_5zMembers_@www\\.videodownloadconverter\\.com))$/","prefs":[],"schema":1574953312771,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598777","why":"These add-ons collect ancillary user data among other policy violations.","name":"New Tab Data Collection Extensions"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f541ab9d-f671-421f-9aed-b27c63d11377","last_modified":1574981047945},{"guid":"/^((\\{7410146d-cf60-4175-a74a-0a7f7785bbff\\})|(\\{e9083fad-c9c7-4ff3-8bb5-b300d3f33546\\})|(\\{6bed141b-56b5-4209-84e1-93c67bf87711\\}))$/","prefs":[],"schema":1574883692223,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1599563","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"51353b78-a8ca-4411-98b8-e9585c03f8c7","last_modified":1574953312403},{"guid":"/^((\\{d251b448-d876-4f25-87b3-9dd858a077df\\})|(\\{3f711bc3-65bc-41bd-842f-d21b6cb90313\\}))$/","prefs":[],"schema":1574869966668,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1599833","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ff958539-ae4f-4008-8413-a3fd86950380","last_modified":1574876724352},{"guid":"/^((\\{cce3a95c-5f17-4ca1-aa0b-b5a8dc3a1b45\\})|(\\{f7c272df-f8e3-419f-b48d-759b9326d51a\\})|(\\{75a25121-873d-4da0-9aec-c4fa83cf13d3\\})|(\\{042080fd-5127-409c-88e7-47136fda641f\\})|(\\{12b167db-911b-4091-b8e5-e9292643610f\\})|(\\{d386a8b2-fba8-47ab-924d-f43d86d9edd0\\})|(\\{995f0889-b95c-4ae7-9510-e6fddf76b62c\\})|(\\{9be5400b-715c-4f49-9085-e1bdfda4a873\\})|(\\{6680a4ae-e659-47f5-9e4e-0ee72494e3af\\})|(\\{2215fd58-f9b5-4d6d-be8a-805716380cac\\})|(\\{041e6a70-edc0-4e6b-a799-0b15d1c95ddb\\})|(\\{4ba68aef-ec5e-412b-9516-d2a7401c0a22\\})|(\\{5c97c09b-6a3f-43cb-950e-c02074193751\\})|(\\{de5d0076-fa35-468e-8b72-6b5524be0684\\})|(\\{702841c9-cd9b-411f-9c8f-7616e75ce749\\})|(\\{bdfaccd7-c343-435a-b22a-fbb8052bd40b\\})|(\\{3a37182d-5653-4c5e-9729-eee005d24dfd\\})|(\\{18a44708-ff7b-45f6-96de-f2ce4373d185\\})|(\\{6c632bb3-04d3-4744-b04d-cd5dbfef41d2\\})|(\\{7ae0db73-6402-44f7-b4f3-81b7ce81bf6a\\})|(\\{716440c3-3ced-41a7-a5b3-ee1da1bfa9f2\\})|(\\{abf84dc9-1ff8-47df-a68b-70e2e8627610\\})|(\\{a369dded-b0bc-446a-b900-c56eaa74042d\\})|(\\{828e6aed-955b-4a9f-9ec2-126f7dc51f37\\})|(\\{58f9ab34-78e6-4432-912a-c13fafc24a03\\})|(\\{68b7cc55-0874-4f91-a519-7b8283b7e974\\})|(\\{71545b8d-0ebb-4767-8864-5fc8dbdbbdee\\})|(\\{217e14c5-4d4b-4691-8428-48ad484f8c04\\})|(\\{6d20b3d7-ccd6-4fa5-ae08-0343193b5518\\})|(\\{ffdb8967-9d19-4377-a728-735f21941d15\\})|(\\{5edc78a5-f41b-4e4b-90e3-ef4fa429feef\\})|(\\{12fb0651-0d2f-4c97-aa37-9121bade678c\\})|(\\{b7c5d63f-b160-48fb-a1fc-485d5e014c63\\})|(\\{4e72d89b-8481-40ae-93d9-93d3316a5d40\\})|(\\{edd994cd-7724-43d3-807b-19bc2749187a\\})|(\\{238a0064-70ee-4d1e-8dca-4bb5a893b44f\\})|(\\{3671ddcb-11ea-4f05-b97d-989d94c42279\\}))$/","prefs":[],"schema":1574789062671,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1599537","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"310e84ca-b967-4d81-b990-4d0697d62a6e","last_modified":1574869966292},{"guid":"/^((oawef0q29r43oq2\\.com@oawef0q29r43oq2\\.com)|(950opeokfp242@950opeokfp242\\.com)|(jggzkdudsuumeasqvler@jggzkdudsuumeasqvler\\.com)|(bdcixfqemzjezxbnzicj@bdcixfqemzjezxbnzicj\\.com)|(ne3787m9ykowhnicg8yx@ne3787m9ykowhnicg8yx\\.com)|(799v8e4cklkpetj0l56x@799v8e4cklkpetj0l56x\\.com)|(o7b1gs6trq2nkaocoejp@o7b1gs6trq2nkaocoejp\\.com)|(sta528sfzizg0ay009cs@sta528sfzizg0ay009cs\\.com)|(8x837zsyl6iw9hpjxu2w@8x837zsyl6iw9hpjxu2w\\.com)|(3bwrbcltn5fjo73lci00@3bwrbcltn5fjo73lci00\\.com)|(kmqm7cm5tk1l5s55yq7j@kmqm7cm5tk1l5s55yq7j\\.com)|(9n4v5kw9bf8e1f4dl0rq@9n4v5kw9bf8e1f4dl0rq\\.com)|(o4d5u4gzx14iqfuyobjr@o4d5u4gzx14iqfuyobjr\\.com)|(2ln3gtttxoz3tjerbbta@2ln3gtttxoz3tjerbbta\\.com))$/","prefs":[],"schema":1574538091411,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1599186","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0ee9e971-ba48-4d51-a907-a3b5533e8e28","last_modified":1574707139043},{"guid":"{3d09bd90-da37-41b5-a719-8da173e9870f}","prefs":[],"schema":1574441398813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598708","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Google Translate (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e6a12342-3936-41cf-910d-cc133db44d2a","last_modified":1574445055964},{"guid":"Stark-vpn.5.14@firefox.com","prefs":[],"schema":1574438767458,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598688","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Stark VPN"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5d2478e3-cbaa-4192-89f0-5abf3ea10656","last_modified":1574441398416},{"guid":"/^((\\{ac9ec764-a247-4d71-8807-20aa20f93e17\\})|(\\{4253de43-775d-48bc-8e08-fb3f58a2ddaf\\}))$/","prefs":[],"schema":1574434609524,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598672","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Search-hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fa044b4d-b39e-4ee0-a737-07aca2d672ef","last_modified":1574438767139},{"guid":"/^((\\{cc08012a-f9cd-4bfc-b526-ad8773934a0c\\})|(\\{16fd1825-3f7d-4c38-aa98-78cc4f0a6758\\})|(\\{87261aed-8d85-4037-81fb-4988ae80ee23\\})|(\\{90f51854-74d4-4df9-bf4c-b86f30346bd8\\}))$/","prefs":[],"schema":1574365292775,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598646","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"YD"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"46ed3cc3-8534-484a-bc58-349824debec6","last_modified":1574434609189},{"guid":"@youtube-adblocker-addon","prefs":[],"schema":1574334260915,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598287","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"YouTube Adblocker"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"126a0720-a22f-41f1-876f-0a3e18b79d2b","last_modified":1574342360895},{"guid":"/^((youtubetomp3@addons\\.youtube\\.com)|(addons-mozilla@youtube-to-mp4))$/","prefs":[],"schema":1574260409481,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598242","why":"The add-on violates Mozilla's add-on policy by opening websites with malicious intent.","name":"YOUTUBE to MP3"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9729654a-6cd1-4e20-8cf5-47a3ff544ef5","last_modified":1574334260570},{"guid":"/^((\\{333d6dd8-43ed-4f01-944d-b7c737a5db72\\})|(\\{f5712532-777e-4080-b6b9-d548040f7675\\})|(\\{abf3f8d7-bc95-4dd5-ab96-c390ad5f8756\\})|(\\{f769002a-608d-4a8c-adc4-05f4857ff3ae\\})|(\\{1980667f-9bde-4e7e-8d0c-132db12c1b30\\}))$/","prefs":[],"schema":1574192492672,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1597784","why":"Use of affiliate redirects in violation of policy","name":"Affiliate Redidrecting Add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"28831b71-8a9a-466e-9f34-1f40f2f0e27a","last_modified":1574260409142},{"guid":"/^((_1gMembers_@www\\.inboxace\\.com)|(_39Members_@www\\.mapsgalaxy\\.com)|(_5zMembers_@www\\.couponxplorer\\.com)|(_65Members_@download\\.fromdoctopdf\\.com)|(_flMembers_@free\\.myformsfinder\\.com))$/","prefs":[],"schema":1573749618972,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1594461","why":"This add-on does not provide users with an opportunity to refuse the storage of or access to cookies.","name":"New Tab add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d39750c3-a305-4487-bc0f-21500c3597dd","last_modified":1573804224556},{"guid":"/^((\\{c8476e06-0a50-41ec-a840-a2db436cf38c\\})|(youtube\\.downloader@firefox\\.dev)|(youtubedownloader@firefox\\.com)|(youtubehddownloader@firefox\\.com)|(youtube\\.d@firefox\\.dev)|(advblock@blocker)|(YouTube@HD\\.Downloader)|(adt-3\\.0\\.7@blocker)|(\\{7131880e-d327-4802-b5ed-fee33c281abd\\})|(\\{5cb84843-504e-406e-8fb7-051c7fc3c9d3\\})|(\\{d8686bde-e666-4084-ae01-c75aa7a30f93\\})|(\\{96d35545-d94a-4ee1-bc43-d3055650587c\\})|(ali-image-search@4\\.0)|(\\{e7634c48-0d36-448e-891e-b2036beebcd0\\})|(\\{442de29c-b710-45d4-b121-7b4be387c327\\})|(lite-vpn-4\\.1\\.14@gmail\\.com))$/","prefs":[],"schema":1573674093610,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1596468","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons injecting remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"19c04aaf-c02d-4583-9978-c519245cd4fb","last_modified":1573749588529},{"guid":"extension@safeguard.ws","prefs":[],"schema":1573501291938,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1595616","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Safe-Guard"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"53d8f35e-99ec-44fd-8082-3b713a5afcb3","last_modified":1573507879434},{"guid":"crisorgblack@rampampam","prefs":[],"schema":1573155692372,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1595200","why":"This add-on contains unexpected features in violation of our policies.","name":"Flash Update"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2bb20972-0d56-44c8-a5d6-0e73a1827e92","last_modified":1573247974595},{"guid":"/^((\\{be2f72d6-0c71-4fd0-8914-e27057e51099\\})|(adblock-2019@youtube-addons))$/","prefs":[],"schema":1573060222748,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1594498","why":"These add-ons are suspected deceptive and have been disabled for your protection.","name":"Deceptive ad-blocking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"477174ca-470a-40ff-bf8d-2de81c2dc458","last_modified":1573063322832},{"guid":"/^((\\{8f11d935-4bcf-42c8-88c1-7e32e4541c98\\})|(\\{b0a6cb7d-3e77-4a96-aea5-7d0090e55832\\})|(\\{c5a5fd9f-8e84-460d-93dd-499e23b530e9\\})|(\\{ac7c91e8-6797-42ec-a202-5b34dacaa83a\\})|(\\{3784e311-4758-4180-b3e2-2ae42bfb081d\\})|(\\{10f3b1e0-4b97-4cc2-9af6-06a9162ec022\\})|(\\{e1109008-6d70-453d-a84e-3cc0c44af07e\\})|(\\{bb7190ac-8aeb-4a8d-83cf-89c179a4d65e\\})|(\\{a752512a-8287-40c0-97f2-071146da2caf\\})|(\\{185dbeea-416b-4fd6-8512-9ddb941e50b5\\})|(\\{d199eeb9-0964-4dff-94d2-69116fd03418\\})|(\\{d37310a3-08dd-4cb8-a276-3f2bee174555\\})|(\\{b239ce6b-2513-4758-a74e-eae3c8f0a04a\\})|(\\{f0f240d7-ae38-4bf4-a8e2-23d775eb07f4\\})|(\\{1804789c-d056-4887-839c-7a0dcab3be83\\})|(\\{d6115dfe-e3d2-44af-8361-1308c234b14c\\})|(\\{48a804b3-cf0f-4aa1-b798-82e944d7afb0\\})|(\\{3026b451-392b-47d5-b60f-995fb075cfd1\\})|(\\{e050f24c-8e06-4d6f-a962-c6073788ac29\\})|(\\{f45a7c28-423a-46ff-abb6-fc855912d074\\})|(\\{699d463b-dd6c-4cde-bad8-81beb345cb85\\})|(\\{f3a3544e-905d-4cc2-99e2-dd4c928bfc24\\})|(\\{2fa8e43c-084a-4fd7-9873-2d462f535929\\})|(\\{a7a69509-aa1d-42b3-8c8d-b3a2885f9aa7\\})|(\\{f4ca82a2-58cc-4d4f-ab95-1ca0424dcd52\\})|(\\{6f9cc262-0164-47e5-b138-024a525d2498\\})|(\\{b3061ee4-1281-482a-8022-f351c023db8d\\})|(\\{48d4fb44-5ebe-49a0-a731-541f11491d92\\})|(\\{fe8a3e05-e9ff-48d2-9291-b97bd3cba97b\\})|(\\{b7eb6ae4-2476-4ba0-a005-b868eb4bf9b2\\})|(\\{2992ca99-6c98-4864-afbf-d51c9c35ed5a\\})|(\\{2017e4f8-a7fb-421f-a1c5-d7b62189f1db\\})|(\\{d44be860-e0d3-4df2-97e1-eef2075474bc\\})|(\\{d6d4e269-00c4-4eeb-b458-d76222ff52e9\\})|(\\{a0242f56-118b-415c-83d6-8eac264dad4c\\})|(\\{25e8b980-6548-45c4-bb58-a641c13b9807\\})|(\\{40fae6f3-c629-4b2d-b690-bf022ebb2cd8\\})|(\\{359c22b8-d670-4b0e-ba77-e29615b633fb\\})|(\\{8fce6deb-83f3-4695-9c5d-76bf366757bf\\})|(\\{1edcaf80-0c4a-4380-9752-4f2953b8a053\\})|(\\{664101ff-e2e4-43b3-b470-ddb71642df7a\\})|(\\{fee7c990-6f9c-4b44-91fb-74998b2498c5\\}))$/","prefs":[],"schema":1573055872812,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1594479","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5e200b1f-e1d0-4819-89e3-3bd34f90c5c1","last_modified":1573059528009},{"guid":"/^((\\{697995ae-b9ee-4556-824b-8e82621f45dd\\})|(\\{6971a39a-916e-4b3f-a14f-bac10571b9f0\\})|(\\{d1047c9a-157b-4f87-a223-a6e6a150e1f8\\})|(\\{f23c6402-4b76-4aa4-b49a-6d083f92ae88\\})|(\\{1a7401bd-96e7-4857-bc5b-7ee66cdecc3c\\})|(\\{ccec0135-ee34-4713-a10c-607a45956d9b\\})|(\\{70428092-3df7-4151-b973-974ca511ae33\\})|(\\{cf2cc560-d765-4b59-b7b7-09a0ae4292f2\\})|(\\{880b8863-e204-47fe-8c8d-db29a10b8c8a\\})|(\\{c95951f5-2b2b-481a-9975-e38abf1f881b\\})|(\\{865df6b7-3ac1-4bd8-be0b-4cc8bb6aab7e\\})|(\\{b6124efd-aa84-42bf-80c7-01c078dc9ef2\\})|(\\{f888f1c9-a936-4ed1-a7f1-5a835ea9e6a0\\})|(\\{c434dae6-9ece-4488-8e9d-0d06d523d95a\\})|(\\{5531f988-1512-4b18-937c-7bc7e209c70f\\})|(\\{fd4fc8ae-fe95-490f-8013-6964455afb34\\})|(\\{84189ee5-4494-4068-b467-49a1b946cba1\\})|(\\{21f0db68-3156-41b4-8180-a48824b35962\\})|(\\{6a3e8874-61b4-40bf-923c-199493cfd284\\})|(\\{683172b8-3a91-4cbc-92f3-2a385f321c98\\})|(\\{269136f3-cd51-4e2d-b1eb-74878262fcef\\})|(\\{1ca4e866-0d45-4898-8138-398f49925cab\\})|(\\{9d53c5bc-9cf2-4c50-9ce5-8aaa113de07f\\})|(\\{19b80768-1437-4d18-972b-41df04a3b0a9\\})|(\\{7090cae8-4f58-4f07-9e53-b37cb4f3f8ad\\})|(\\{31911e49-6d40-4435-b152-c333096ae185\\})|(\\{4910e0bd-d803-4785-9ec4-6e8c9414a53e\\})|(\\{f3a131a1-73fe-4e8c-b499-629aa7a3e405\\})|(\\{94e53c23-cb3e-43c9-b29f-43ea953c61f6\\})|(\\{0a024f33-43b3-4d15-89dc-694964063869\\})|(\\{fa561d95-e80a-4ab9-b71c-556c7fce3b83\\})|(\\{f78a3354-dafd-48e6-8392-0ed1aa8e8a91\\})|(\\{a6b84ecd-25df-41c5-8979-a1a9d962d78b\\})|(\\{5d7282aa-0600-4a16-ad0e-917d20232d2a\\})|(\\{90e0c87b-f534-486f-b5fe-beddad5cfcfb\\})|(\\{c64d3989-b6f6-4eec-b86f-b549a5b2056a\\})|(\\{ccdd4a2e-11a4-4922-8bd2-d8ff05d3194f\\})|(\\{b9f73347-01c2-4727-85cd-7521a2a2841c\\})|(\\{1be85529-e82e-4dfe-aa33-3c62fc37ae8e\\})|(\\{b91fff1b-d45e-47b2-95da-5d774319b88d\\})|(\\{8c81cdd1-4fc2-4510-83c2-641ea7ee7c24\\})|(\\{e5db6079-1786-4072-80f5-d5c894074cc2\\})|(\\{5981e135-789c-4709-8b22-85e0665c8396\\})|(\\{a235175f-3391-43c6-bf58-34c1f6b8f4a6\\})|(\\{617ebed4-628f-4ca3-92de-bec510cab1dd\\})|(\\{3aaa37bc-0fa9-4e34-abbb-d5a34ff729a3\\})|(\\{2d3521bc-914f-4990-ba0a-5d488f176f4e\\})|(\\{17c7768d-c672-4e99-aef2-2fdd35a96804\\})|(\\{7e517ca8-6f65-4de2-869f-dddce73a274c\\})|(\\{9c99bd01-7567-47e6-80f2-bf229b97415f\\})|(\\{5357eef8-cc2f-496a-82d2-5f3b6ca5f7b1\\})|(\\{b83a8605-057b-46ef-86ed-d53db9a9f16f\\})|(\\{55383502-1800-4cf8-8522-df16d6cb9809\\})|(\\{14d742cf-cd34-46a5-984e-1e28fc16e55c\\})|(\\{f5d6d1af-6a02-4eb4-a7fb-ec3486239875\\})|(\\{fac56640-6cad-49a2-b224-9424e18b4009\\})|(\\{79c16aa2-f8a9-40d3-9e81-74884b987e48\\})|(\\{b02eae40-18d6-4e28-8af7-6b161a458769\\})|(\\{9398d059-fc67-43e2-8548-bc60cfa82998\\})|(\\{cd0a4138-8670-4a6b-b15c-0cad1ef290e6\\})|(\\{503dc84b-9967-4b1f-8199-cee55bcd919e\\})|(\\{d0245186-049d-4594-88f9-3fe54e735551\\})|(\\{7208c980-005e-426c-991f-1cd22227b7fb\\})|(\\{19dcb8c5-3577-4279-b70f-eb48a594f821\\})|(\\{fda599e0-d842-47d9-8c8e-21c26ef0afa6\\})|(\\{470eab98-7ad9-49a5-883f-42cb51996fc7\\})|(\\{8c353e56-0d27-4b83-b081-6e012bda5601\\})|(\\{a1931145-d58d-41a2-b190-04549ef9c225\\})|(\\{916d2e1d-aabf-45aa-84ec-a9bb9ee40391\\})|(\\{f2aa9466-c326-440c-b9a8-f2fef8571341\\})|(\\{52a02f53-b805-41d1-af02-0283da3ef383\\})|(\\{aad686bf-b881-4177-8a8f-12c9455e319f\\})|(\\{cec578f9-9103-44f8-9b41-bbe26ba8a993\\})|(\\{6891bcc0-4ad2-4531-9699-ce82528ddcc0\\})|(\\{a5d93cd7-b187-46f8-961b-9f4fc0b4f37f\\})|(\\{b220428d-2f07-4ecd-9114-3a3261d5f7fc\\})|(\\{b0f4740a-6e0f-489e-ab86-3fb3abb7dd15\\})|(\\{611781ad-a17d-4487-8caf-bf72818bacfc\\})|(\\{0b4efcee-b7eb-4151-bdd2-b2f66fedd4fa\\})|(\\{25da4f88-e61c-4823-9c32-864c3a348aab\\})|(\\{e44b4144-0a1a-4c29-95c0-50083ed5c606\\})|(\\{4dbf4218-1a54-4fa1-8448-0521da5b5391\\})|(\\{7140247a-7ee6-4474-9fe9-0cdf6ec7e2e7\\})|(\\{50eac97c-bb52-4107-a3be-6d40eba5b229\\})|(\\{4bd98a1f-d8f6-411a-a1e8-0cf1b482c682\\})|(\\{a7d60016-47ac-4480-b2bc-83dd4e20b096\\})|(\\{a2657d9a-94d1-41e8-a1e5-72e60c032afe\\}))$/","prefs":[],"schema":1572982905588,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1594460","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f1eaa18e-75c8-4134-87cf-5a02e3349e44","last_modified":1573055860762},{"guid":"/^((web@3753c687-a0c6-4cd1-b8ff-bab3c76b1236)|(ext@286f29a6-184e-4195-b1e5-1212ebf372a0)|(web@fd9b3d8a-1178-45ab-92a8-a172d0b70000)|(web@e7a72615-19b1-42a5-8e34-ddfa89ce0000)|(web@af1e58bc-4ead-11e8-81fc-065ad97f0000)|(web@7398cc9a-684e-40a4-afe1-b620e1a80000)|(web@2DC2452E-6999-11E8-A1CA-6C6318C60000)|(web@B7CCDA78-8455-11E8-91A4-ED179E46D000)|(web@8842eb7c-5f5c-4d33-aabe-81c27ae87000)|(web@ca5a2803-6421-4582-97e1-9e30fe440000)|(web@00022358-d56d-4f5e-a89c-d4534d7c5565)|(\\{ff26fde6-4d73-49a3-bd6c-1ca7876484fc\\})|(290e9605-6fb1-4c8b-a3d4-0084bfad201e@UniversalConverter)|(web@EmailNewTab)|(web@WhatsMySpeed)|(test@FormsHub)|(web@Forms2)|(newweb@MapsNewTab)|(\\{4b1d718d-58ae-404b-a5d2-b7b977cfcb56\\}))$/","prefs":[],"schema":1572291693826,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1592597","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3bdd5b53-ddb1-4fb0-b250-d75a604a5546","last_modified":1572443230107},{"guid":"/^((\\{a059a924-e43a-495d-9620-ad8c111d62d9\\})|(\\{79f4bfc6-b1da-4dc4-85cc-ecbcc5dd152e\\}))$/","prefs":[],"schema":1571600493541,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1589974","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Page Translator"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9e8f80d6-a818-4004-9a20-deec55f3fb96","last_modified":1571605630002},{"guid":"/^((firefox@browser-security\\.de)|(firefox@smarttube\\.io)|({0fde9597-0508-47ff-ad8a-793fa059c4e7})|(info@browser-privacy\\.com)|({d3b98a68-fd64-4763-8b66-e15e47ef000a})|({36ea170d-2586-45fb-9f48-5f6b6fd59da7})|(youtubemp3converter@yttools\\.io)|(simplysearch@dirtylittlehelpers\\.com)|(extreme@smarttube\\.io)|(selfdestructingcookies@dirtylittlehelpers\\.com)|({27a1b6d8-c6c9-4ddd-bf20-3afa0ccf5040})|({2e9cae8b-ee3f-4762-a39e-b53d31dffd37})|(adblock@smarttube\\.io)|({a659bdfa-dbbe-4e58-baf8-70a6975e47d0})|({f9455ec1-203a-4fe8-95b6-f6c54a9e56af})|({8c85526d-1be9-4b96-9462-aa48a811f4cf})|(mail@quick-buttons\\.de)|(youtubeadblocker@yttools\\.io)|(extension@browser-safety\\.org)|(contact@web-security\\.com)|(videodownloader@dirtylittlehelpers\\.com)|(googlenotrack@dirtylittlehelpers\\.com)|(develop@quick-amz\\.com))$/","prefs":[],"schema":1571235422841,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483995","why":"Sending user data to remote servers unnecessarily, and potential for remote code execution. Suspicious account activity for multiple accounts on AMO.","name":"Web Security and others"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.0.9","minVersion":"0"}],"id":"96b2e7d5-d4e4-425e-b275-086dc7ccd6ad","last_modified":1571235848152},{"guid":"{381f21b1-95bf-4042-bc5c-3a40b2a03f10}","prefs":[],"schema":1571235400908,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1583468","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Francezon"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.0","minVersion":"0"}],"id":"dd1261a3-6944-4f51-8118-b0a8f2055d69","last_modified":1571235422828},{"guid":"addon@shoppingguru.info","prefs":[],"schema":1571235356487,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1583862","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"ShoppingGuru"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2104.1111.1110.4221","minVersion":"0"}],"id":"70655a4b-064d-44ab-8d0e-3bec419343ee","last_modified":1571235400895},{"guid":"sparalarm@chip.de","prefs":[],"schema":1571082106908,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1586677","why":"The add-on is force-installed for users through sideloading, bypassing user consent.","name":"Sparalarm"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"14.39.1","minVersion":"0"}],"id":"19f599bd-2226-49e2-90fd-685fd106fc3d","last_modified":1571235356473},{"guid":"/^((\\{65a93e3b-e350-440d-bf8f-68e18e38d27d\\})|(\\{9db1fb44-b661-4719-9d90-67af3e6a314c\\}))$/","prefs":[],"schema":1571059482617,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1586834","why":"This add-on contains an unexpected feature that is collecting ancillary data.","name":"Google Custom Logo and Search Counter"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"be5d02cb-0a36-4c20-b184-509b86d243c5","last_modified":1571060494402},{"guid":"{c4d46c5f-9832-4057-8a1d-635949ed6a55}","prefs":[],"schema":1570909292250,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587121","why":"This add-on makes use of search settings with unexpected behavior.","name":"LM Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"57c094fd-9a37-4ede-9bb0-a1c2d66415f0","last_modified":1571059471124},{"guid":"/^((\\{2B0EC7FF-F330-4e0c-8B33-EFFEC8D39E70\\})|(\\{f70c89b0-bbf3-41a9-bc1f-0912dcf53f33\\})|(@Classifieds)|(@Converter)|(@Coupons)|(@Directions)|(@DownloadManager)|(@Email)|(@Fitness)|(@Flights)|(@FormsApp)|(@Games)|(@Maps)|(@News)|(@Package)|(@Photo)|(@Radio)|(@Recipes)|(@search-encrypt)|(@search-incognito)|(@searchencrypt-b)|(@searchencryptblocker)|(@Speedtest)|(@Sports)|(@Transit)|(@TV)|(@Weather)|(aweapps@Email)|(classified@jetpack)|(email@searchleasier\\.com)|(foo-bar@example\\.com)|(games@jetpack)|(JS@Converter)|(login@easier)|(maps-webext@jetpack)|(Maps@SSA)|(web-ext@games\\.com)|(web@ShoppingNewTab)|(web@SocialNewTab)|(web@WebDesignNewTab)|(webapp@LoginAssistantTab)|(webex@Converter)|(webex@Email)|(webtab@Shopping)|(webtab@Social)|(webtab@WebDesign))$/","prefs":[],"schema":1570701667316,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587782","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Addons collection ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"986aac02-beba-40b2-b463-d8447a778a2e","last_modified":1570713923845},{"guid":"{2a78ab07-91b2-4086-889d-619e43d5e5f8}","prefs":[],"schema":1570563693690,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587734","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"SVSrch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bb76b262-7087-4cf2-a82f-12cfbf91239a","last_modified":1570701652245},{"guid":"{2e106fa4-ee23-4b4a-9ed0-f93edee539b5}","prefs":[],"schema":1570534326932,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587074","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"SVsrch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ab0b6868-6077-4d47-bd58-1df3f572c04d","last_modified":1570540061375},{"guid":"/^((oigfsj9434lavvv@oigfsj9434lavvv\\.com)|(mity82900jf2@mity82900jf2\\.com))$/","prefs":[],"schema":1570527949565,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1586780","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Page organizer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3ece7523-cdec-46cf-ac20-9e939a4d4802","last_modified":1570534316570},{"guid":"/^((web@MapsNewTab)|(ext@WhatsMySpeed)|(ext@MyEmailCenter)|(ext@TemplateHelper)|(ext@FreeLiveRadio)|(ext@FreeFormsNow)|(web@ConverterNewTab)|(web@EmailAccountNewTab)|(spweb@EmailNewTab)|(web@PackagesNewTab)|(web@ManualsNewTab)|(web@ClassifiedsNewTab)|(web@FormsNewTab)|(web@AncestryNewTab)|(web@RecipesNewTab)|(web@TVNewTab)|(web@WeatherNewTab)|(web@translationsNewTab)|(web@SportsNewTab)|(web@CouponsNewTab)|(web@FlightsNewTab)|(test@InstaFormsFinder)|(web@NewsNewTab)|(web@SpeedTestNewTab)|(web@TransitNewTab)|(web@BibleNewTab)|(web@RadioNewTab)|(web@TemplateNewTab)|(web@PhotoEditorNewTab)|(web@AudioConverterNewTab)|(web@GamesNewTab)|(web@VideoConverterNewTab)|(test@TheWeatherChecker)|(web@InterestsNewTab)|(test@SearchHub)|(web@CalendarNewTab)|(web@TaxesNewTab)|(web@BankNewTab)|(web@CrimeReportNewTab)|(web@CryptoNewTab)|(web@eBooksNewTab)|(web@FinanceNewTab)|(web@FitnessNewTab)|(web@JobsNewTab)|(web@MoviesNewTab)|(web@NotepadNewTab)|(web@OfficeNewTab)|(web@PCTextingNewTab)|(web@PhotoNewTab)|(web@ScrapbookNewTab)|(web@UtilityNewTab)|(test@FlightTrackerUpdate)|(test@FreeForms)|(test@UniversalConverter)|(test@MyEmailCenter)|(test@TemplateHelper)|(test@FreeLiveRadio)|(test@FreeFormsNow)|(ext@FormsHub)|(webext@WhatsMySpeed)|(webext@WatchTelevision)|(webext@EmailExpressTab)|(webext@MyConverterTab)|(webext@TemplateCreatorTab)|(webext@LocalForecastTab)|(webext@EZDirectionsandMapsTab)|(webext@MapsNDirectionsTab)|(webext@MyEmailCenter)|(webext@TemplateHelper)|(webext@FreeLiveRadio)|(webext@FreeFormsNow)|(webext@InstaFormsFinder)|(webext@TheWeatherChecker)|(webext@FlightTrackerUpdate)|(webext@FreeForms)|(webext@UniversalConverter)|(webext@FormsHub)|(webext@SearchHub)|(ds@DirectSearchPro)|(webext@AppDiscoveryTools)|(webext@LiveRadioProTab)|(webext@TheWeatherPilotTab)|(webext@ExpressPackageFinderTab)|(webext@LoginAssistantTab)|(webext@SelectSearch)|(addon@SelectSearch)|(webext@ExpressSpeedChecker)|(webext@BreakingNewsPlus)|(webext@WorldEventsToday)|(addon@WorldEventsToday)|(webext@OnlineTVAccess)|(webext@FindingFormsPro)|(webext@EasyClassifieds)|(webext@SpeedCheckerPlus)|(webext@GetFreeCoupons)|(addon@MyEmailChecker)|(app@FlightTrackerUpdate)|(app@WatchTelevision)|(app@WhatsMySpeed)|(app@MyEmailCenter)|(app@TemplateCreatorTab)|(app@FreeLiveRadio)|(app@FreeFormsNow)|(app@InstaFormsFinder)|(app@SearchHub)|(app@TheWeatherChecker)|(app@FormsHub)|(webtab@Maps)|(app@FreeForms)|(app@UniversalConverter)|(app@EmailExpressTab)|(app@MyConverterTab)|(app@TemplateHelper)|(app@LocalForecastTab)|(app@EZDirectionsandMapsTab)|(app@MapsNDirectionsTab)|(app@AppDiscoveryTools)|(app@LiveRadioProTab)|(app@TheWeatherPilotTab)|(app@ExpressPackageFinderTab)|(app@WorldEventsToday)|(app@OnlineTVAccess)|(app@SpeedCheckerPlus)|(app@EasyClassifieds)|(app@GetFreeCoupons)|(app@FindingFormsPro)|(app@TemplatesHereTab)|(webtab@Packages)|(webtab@Forms)|(webtab@Email)|(webtab@Radio)|(app@MyEmailChecker)|(webtab@TV)|(webtab@Classifieds)|(webtab@Ancestry)|(webtab@Weather)|(webtab@Manuals)|(webtab@SpeedTest)|(app@MyDailyCalendar)|(webtab@Transit)|(webtab@Converter)|(webtab@Coupons)|(webtab@Recipes)|(webtab@News)|(webtab@Sports)|(webtab@translations)|(webtab@Template)|(webtab@AudioConverter)|(webtab@Flights)|(webtab@Photo)|(webtab@Bible)|(webtab@PhotoEditor)|(app@MyVideoConverter)|(webtab@Games)|(app@MyLoginHelper)|(app@QuickEmailAccess)|(app@MyRecipeFinder)|(app@MyFlightFinder)|(webtab@Fitness)|(webtab@VideoConverter)|(webtab@Taxes)|(webtab@Bank)|(webtab@Calendar)|(webtab@CrimeReport)|(webtab@Crypto)|(webtab@eBooks)|(webtab@Finance)|(webtab@Interests)|(webtab@Jobs)|(webtab@Notepad)|(webtab@Movies)|(webtab@Office)|(webtab@PCTexting)|(webtab@Scrapbook)|(webtab@Utility))$/","prefs":[],"schema":1570483391885,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587028","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bd51d01b-20bf-4682-a588-c03e988eb746","last_modified":1570527938865},{"guid":"{67d4f93e-6857-45ab-9e7a-158cc61f15d2}","prefs":[],"schema":1570052453260,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585735","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"zidaza"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6ce8f6d0-5cef-457c-b7e4-d5c08d61531a","last_modified":1570053270833},{"guid":"/^((\\{049aedf7-b1dc-49b7-9ef4-51cd026f8592\\})|(\\{27c743d8-4731-44ff-9194-9f663df6a3c3\\})|(\\{8bf2bae7-273a-4496-9073-c1ad6688cda8\\})|(\\{b9cfeaaa-2465-4b21-903a-7955fcd4e59a\\})|(\\{07848e3a-f42b-48bf-ac70-f918a7b79258\\})|(\\{02b2eed4-2ca5-4d6f-b19a-a8b1738501f0\\})|(\\{d2af93ad-a542-4b30-b929-7437c2b02afe\\})|(\\{b8e33742-5b78-4c08-89e1-94ebe22fbafe\\})|(\\{502b29ef-b05f-4043-949b-069160f39e32\\})|(\\{2c60eb88-2f38-4b1a-9329-eaa18ad41720\\})|(\\{ccb18b6f-0680-4347-afd5-5ed864114f05\\})|(\\{c9622009-2b37-44f1-a5cf-f0aa869a6bff\\})|(\\{cc241172-6e33-4395-bc68-dd76fa6b6091\\})|(\\{904a47b7-c2c3-465d-a7f9-326c51e8fee0\\})|(\\{365ae96e-15f8-445f-816e-74cd5897613c\\})|(\\{527ccde6-f15c-4437-a061-052593c2ac5b\\})|(\\{063b5c1a-b708-4f05-873b-b3e161d1d49a\\})|(\\{d5422b3f-fcb3-4eca-b2a9-b4b8010fd4c1\\})|(\\{60bab1b2-e7fc-4683-85ef-2ec6cdb5e148\\})|(\\{aad32311-3e2f-419d-8e6b-82c4e28c44d3\\}))$/","prefs":[],"schema":1570045305267,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585810","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Add-ons using obfuscating code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a942e2e5-6a55-439f-b078-6288da1cfe68","last_modified":1570052444069},{"guid":"/^((\\{6be4ca4f-8b7e-4d91-994b-24a7c5384086\\})|(\\{1709abf0-19ba-48a8-a9dc-03e931b17f48\\})|(\\{5d5af81d-6501-4d77-a64c-ad2cdc34ceae\\})|(\\{b7de0a65-0b4b-4b74-a4e6-70fc2c36a80a\\})|(\\{64704bd2-ced7-4dd8-a5d2-d20df624288f\\}))$/","prefs":[],"schema":1570036215253,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585723","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Add-ons using obfuscated code."},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4e487385-fe8d-451a-909e-a6f6609b0d7b","last_modified":1570036367326},{"guid":"{5dbbb375-3520-4ace-bb84-df9d92ae1a25}","prefs":[],"schema":1570017905113,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585708","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Wappalyzer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9a12e67a-ef6d-4f06-9de6-7dc8bcb19517","last_modified":1570036206290},{"guid":"{d41cf5b5-67b7-4510-8633-d8e2c0ec5d46}","prefs":[],"schema":1570001773270,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585625","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Xisey"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"87d99543-1e31-46b3-9fd1-91d9c79ff592","last_modified":1570017897427},{"guid":"mozilla_cc3@internetdownloadmanager.com","prefs":[],"schema":1569844559791,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585071","why":"Some versions of this add-on violate Mozilla's add-on policies by using unreviewable source code. Please update to a newer version.","name":"IDM Integration Module"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"6.35.5","minVersion":"0"}],"id":"21f14cff-afef-4e0e-97e8-4dbc0207a7a6","last_modified":1569865071841},{"guid":"{546bc2af-d6e7-499f-90b6-58305b836702}","prefs":[],"schema":1569699691574,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1583809","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"MapsFrontier"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f3133639-f5e5-4b47-a80f-2993fa97ca4a","last_modified":1569844523596},{"guid":"{f39b7905-00d5-4391-9a4b-751ca08dd6b2}","prefs":[],"schema":1569440826824,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1583814","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Tic-Tac-Toe Evolution_G"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4c3153a8-7551-48f3-a4fa-8ad6cb28faa8","last_modified":1569441800696},{"guid":"/^((ehfiibbkgllccnbifchmillffgdlmidi@chrome-store-foxified-3843796584)|(ehfiibbkgllccnbifchmillffgdlmidi@chrome-store-foxified-3264908934))$/","prefs":[],"schema":1569242005272,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1582781","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Proxy add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"72464ab8-9b51-420f-8e54-bc0f8bb01cf1","last_modified":1569244094631},{"guid":"/^((@searchincognito)|(@si-defaultsearch)|(@si-defaultsearch-listed)|(@searchassistincognito)|(@DiscreteSearch)|(@Discrete-Search)|(@searchsafe)|(@SearchSafeOrg)|(ffredirector@discretesearch\\.com)|(ffredirector@encryptedsearch\\.org)|(ffredirector@searchdefence\\.com)|(ffredirector@searchencrypt\\.com)|(ffredirector@searchencrypted\\.com)|(ffredirector@searchincognito\\.com)|(ffredirector@searchsafe\\.co)|(ff_redirector@discretesearch\\.com)|(ff_redirector@encryptedsearch\\.org)|(ff_redirector@searchdefence\\.com)|(ff_redirector@searchencrypt\\.com)|(ff_redirector@searchencrypted\\.com)|(ff_redirector@searchincognito\\.com)|(ff_redirector@searchsafe\\.co)|(@encryptedsearch)|(@searchdefence)|(@searchencrypted)|(@42e62954-834c-11e7-bb31-be2e44b06b34)|(@DiscreteSearchx)|(@4aec09f1-f1c9-456d-8c40-e0e86f302a0d)|(@566ff1c3-9432-4ed4-bd3d-b43cba47e051)|(@1df4e663-b9f3-4708-9f5d-44265b33397e)|(ff_redirector@searchsafe)|(\\{9b62bdf8-a3c7-43d3-ba7f-0970cabffdaa\\})|(\\{95b48d11-b256-48ad-8ba1-bfe52f0a8bb8\\})|(\\{9e35a2be-64bd-49e3-aa47-fbeedf1834eb\\})|(\\{3ba10b5f-d9fa-4b40-8683-034d3dfc71d4\\})|(\\{20c31601-ebee-4677-a2f0-40e178bf7c77\\})|(\\{98e02622-f905-434e-9003-6c061b5c11c0\\})|(@tabwow)|(gaidpiakchgkapdgbnoglpnbccdepnpk@chrome-store-foxified-258456913)|(@tabwow2)|(\\{be8901e4-2a07-4554-aa05-a64351496e29\\})|(moviestmpd@mozilla\\.com)|(gaidpiakchgkapdgbnoglpnbccdepnpk@chrome-store-foxified-876542484)|(\\{4a8ef415-e453-458f-bfbd-ae92569214db\\})|(fireaction@mozilla\\.com)|(\\{bd9c448c-58b3-434f-9bb6-4ed2c155ba8e\\})|(\\{ebdfa19b-0906-4f78-9e95-7ef74d34c335\\})|(websecure-unlisted@mozilla\\.com)|(\\{2d06d70b-8f32-4007-8f8b-1e0445bcebe7\\})|(\\{ddbe7345-acf4-4ebb-9baf-cd6d2df73b28\\})|(\\{b09d5b98-2d65-46fb-990c-69710577efa0\\})|(\\{3894384e-c719-4a0c-8d24-3816160fc56b\\})|(search-encrypt-tab@mozilla\\.xpi)|(\\{1dafa1da-3894-48b9-ac8f-00bdc4f1868a\\})|(\\{99cfe634-328a-41a5-9a23-64094e4f4919\\})|(inco-plugin@mozilla\\.xpi)|(incognito-window@mozilla\\.xpi)|(mac-search@mozilla\\.xpi)|(fvdplayer@fvd\\.com)|(playernewpp@ext\\.com)|(\\{492936c6-9121-4e54-8d4f-97f544e5bf98\\})|(\\{108a22ea-f316-4c2f-8427-fe65e02f9e2c\\})|(cold@being\\.net)|(\\{38b99237-6c28-406f-898c-cc89df86051d\\})|(search_redirect@mozilla\\.xpi)|(\\{d2ef4a8d-6ec0-4733-9f3f-2394178ecbf3\\})|(tab_plugin@mozilla\\.xpi)|(\\{ae228e30-f40a-41a3-9e7e-53a094dcb8c6\\})|(\\{00ee7237-53cb-4036-8d4f-e78d78ca89e7\\})|(\\{d2f4002c-031b-4ad3-9fb1-afb003e8f932\\})|(\\{c0f366b3-7b3d-4486-a6f3-4ca1d7045091\\})|(\\{ccc6cfc4-3832-4d05-bf28-43a9722de93f\\})|(\\{dd02f638-ce6d-464e-8add-6ea0f314b1d1\\})|(\\{749ed3ff-4d23-4b32-812e-a35e3cf8c000\\})|(tab_cleanup@mozilla\\.xpi)|(incognito_tab@mozilla\\.xpi)|(\\{47c51f55-4f0b-499f-9fdd-c7c66bf4796a\\})|(\\{cd70c7c8-557d-46fa-9688-399c7c8d3d66\\})|(\\{681ad8e0-d1df-4cd2-a4cf-b97c1d6502a3\\})|(\\{0d58e690-bd48-4e3a-baf3-67aa40bc286a\\})|(\\{77bfbf26-4618-4120-9cb6-1fc7c92b8ddc\\})|(\\{037c6f6a-71f8-405b-9cff-fadf2ded6c47\\})|(\\{91cc3274-90d5-4e16-80e3-cd02fc513689\\})|(\\{2225b2af-0c3c-4345-adac-4f5bd40c2182\\})|(\\{81ca6b1e-a95b-4b44-9638-3ff3ea1a571d\\})|(\\{1e32acf8-fc1e-40ae-8783-c501ce50d597\\})|(\\{19670785-b1db-4d69-9538-2880ad8fdf20\\})|(\\{0113b4ad-15ca-4215-adeb-f0404f619ca6\\})|(\\{c7245149-4224-4c5c-91a4-84ea189f2227\\})|(\\{04dd2232-f1b1-4275-ae74-8bd27f3d850c\\})|(prosearch@mozilla\\.xpi)|(\\{d549a064-98e7-49ed-ba9e-a724e79a004f\\})|(\\{fddd3bc6-9d4e-4ee7-b490-0d6141ff7d7f\\})|(\\{122795b5-ae28-4371-9b61-878f5db888ac\\})|(\\{e3d491de-802a-4f82-91eb-9403c9f43637\\}))$/","prefs":[],"schema":1569181301396,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1561752","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Various search redirectors"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bea9680c-28c0-48a1-b8d4-e418adeba748","last_modified":1569241020387},{"guid":"{87bd05d5-d79e-4421-9c78-5c98ea78c351}","prefs":[],"schema":1568901038866,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1582168","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"TypeScript-Console"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b9d746da-8881-4854-8026-ecb708a588f6","last_modified":1568905123995},{"guid":"/^((hd@youtube\\.com)|(@youtube-to-mp4)|(youtube-downloader@youtube\\.com))$/","prefs":[],"schema":1568885060842,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1579965","why":"These add-ons violate Mozilla's add-on policies by including unexpected features without user consent.","name":"More Youtube Downloaders"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ea29de20-dfe2-40c0-a5ec-45b1c780815d","last_modified":1568901023136},{"guid":"/^((\\{d81c0c7d-7420-4737-a3b9-dd9edeb4412f\\})|(\\{2bc89af7-d0ff-4b22-b7f6-ec87d15d999e\\})|(\\{3ee12352-a9db-4370-aa27-7e1d9acb628a\\}))$/","prefs":[],"schema":1568816167726,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1581368","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"FSCH"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1e56fd0a-77b6-477d-bada-78a5c18a37dd","last_modified":1568816392824},{"guid":"/^((@yvd-addon)|(ydh@downloader\\.youtube\\.com)|(tomp3@youtube\\.com))$/","prefs":[],"schema":1568814899255,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1579965","why":"These add-ons violate Mozilla's add-on policies by including unexpected features without user consent","name":"Youtube Downloaders"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"73cae2b8-f60e-47b3-afca-a1ff555f4ec5","last_modified":1568816154119},{"guid":"{91c43d32-3a20-40cb-933b-47fd7c4b5a4e}","prefs":[],"schema":1568662894970,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1581111","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Cookies Next"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e22dbf2b-70c8-41ed-b17a-32f53a22055b","last_modified":1568814886596},{"guid":"{23db2a76-49ca-4af2-af50-fccedd607e12}","prefs":[],"schema":1568317295345,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1580616","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"YUI"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"13056233-543d-4c51-b89a-2a6b96ee324e","last_modified":1568374273725},{"guid":"{1056b983-063b-4bd0-b7f7-1295f7e04ade}","prefs":[],"schema":1568226375813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1580749","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fast Browser"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"886e480a-8838-43c7-b9ca-b02592e23065","last_modified":1568285711403},{"guid":"/^((\\{8d0073fa-3193-4a7f-8c95-6a4e3d9272ba\\})|(445ac9f4aa1b833ce2dc75d6d6d6c76d0cef7cc7@temporary-addon)|(\\{cd0672d3-72dc-43d2-ae77-6cda31fb7c88\\})|(\\{403321a6-be8d-4ae3-a66d-e5c846f993b8\\}))$/","prefs":[],"schema":1568154081436,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1580503","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Proxy Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a54f1c3-93e1-4a38-885c-afb98e7bc4f2","last_modified":1568224845558},{"guid":"{0fbe26d1-6891-475e-af3e-34f38a30348d}","prefs":[],"schema":1567971701994,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1580118","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Lookbox"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"67a61ba7-ad12-4eae-bdcc-e5b9b856dff4","last_modified":1568105279739},{"guid":"{a59679da-f097-4db4-b2bc-6ad7b645e127}","prefs":[],"schema":1567019346545,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"GetMedia - Movies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.18","minVersion":"0"}],"id":"db043b8d-c91a-4d1d-b420-58087beef552","last_modified":1567022112963},{"guid":"{850be3a2-ca5f-47ad-838c-fe39b006e0da}","prefs":[],"schema":1567018965949,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Safe Browsing"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.19","minVersion":"0"}],"id":"aeb6bc24-36cf-4199-94d9-68f4822fa2cf","last_modified":1567019082710},{"guid":"{ecb03616-f3c2-4580-99dd-6a233047abdd}","prefs":[],"schema":1567018902311,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Sport TV"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.19","minVersion":"0"}],"id":"7e71a557-5664-4319-a792-c94b2bf744d8","last_modified":1567018965935},{"guid":"{8387ccbe-b9ac-438d-b049-c86b30a6dacb}","prefs":[],"schema":1567017236054,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":" This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"GoMusic"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.17","minVersion":"0"}],"id":"9d598ecb-2473-4416-98b9-26658ea7746e","last_modified":1567018491638},{"guid":"{7ff51e81-f4b1-4682-9f45-43a771d80748}","prefs":[],"schema":1567017189557,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"GoMovies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.16","minVersion":"0"}],"id":"627a5309-d310-4130-9827-d3e6d3116ba2","last_modified":1567017236040},{"guid":"{2ef58672-740c-46bd-a50d-b9880986b574}","prefs":[],"schema":1567017167776,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Universe Start"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.5","minVersion":"0"}],"id":"c0767051-017a-45d7-b96f-632d7cae7c47","last_modified":1567017189541},{"guid":"{df9f6ab1-c82c-41d4-85ce-86dcfe839ce9}","prefs":[],"schema":1567017037001,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Media Start"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.0","minVersion":"0"}],"id":"6e9ea480-7f5f-49c7-b130-fb8af66bec0b","last_modified":1567017167761},{"guid":"{b89efd87-232e-4829-87d2-22148919d72f}","prefs":[],"schema":1566762089721,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1576681","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Ad-Blocker"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"04365e2c-fbc2-4393-b2b3-a23ea5de6b79","last_modified":1566934428180},{"guid":"/^((\\{fb2cbb8e-a6f9-464b-97c7-aca958a404d6\\})|(\\{8cc60aa4-fceb-4a74-bef4-bbbdc23b85fb\\}))$/","prefs":[],"schema":1566419767711,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1573237","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Adobe Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"055d2447-c7b7-49a2-bb27-b1c09a592f32","last_modified":1566422986828},{"guid":"/^((AKMWWOEASKZXXCCRFA@AXXX)|(RF_WOEKTAMS@BASDFZMD)|(TI_BOAMZKXFFEE@ZCAOKEE)|(BMMAOSIKZX_TI_EE@BOASLL)|(ZN_ASVVZXLEOOO@ABOVVAE)|(MZXVCKMSSD_ZN_EF@GBOAAOS)|(UA_CZVVMSOEEE@DOPEEZXA)|(ZXCLASKDASD_UA_VV@AVLLZAA)|(VS_SOEOKAKXC@BOOCLLAA)|(AIWEKDZSV_VS_ASCZ@SAAAOOBB)|(IF_AZXOOVVVAA@EALXCOAA)|(VVALLEIASD_IF_AZ@OOBAAXXA)|(ZN_BF_AOXZAOKSD@VZXMASLX)|(VMZKMALSKD_BF_ZN@VIAAEOOSL)|(aunastralaa_1@auzn\\.ne)|(VXKCVLSO_ON_SOC@KIZIAO)|(ON_OPPOWOAKKS@BLZOAAAASL)|(nostallkka@iofjjakk\\.me)|(VZKKAKOOEE_LN_FK@BOOAASSDD)|(LN_VSOAJKXXXZZ@UDPPPADK)|(BNKZKASKDIE_EB_AKK@BLALEEKK)|(EB_AISJIKZLAA@DFKKAKE)|(NLDFKOBASOKCK@KFOLAAAEE)|(BBDMLDSFKER_AF_GG@AYYRR)|(OMVXNSDF_R_F_W@BMAMSEEE)|(EIGKFDAODS_RF_PDNAP_WEN@HUUUHJAA)|(GOEORG_RF_ANA_N@BDOFKOKK)|(BFDISDF_RG_AZXC@BDOFKAQ)|(OKOKDFBDFBDFG_RG_KS_BDK@AAAJAHU)|(ODKFOBKDPFB_PJ_FGK_AKK@AJIIJAA)|(UBXODJ_PA_PJ@XMVCOAKS))$/","prefs":[],"schema":1565206889166,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1572346","why":"This add-on violates Mozilla's add-on policies by executing unwanted actions on websites without the user's consent or control.","name":"Page update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"85411892-1225-46fb-8f1b-5aa424bc2c01","last_modified":1565344753436},{"guid":"Shield_My_Searches_ehHQAdRPxE@shieldmysearches.com","prefs":[],"schema":1565034099452,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1572066","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Shield My Searches"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"74e070ac-891b-4f79-ac76-09a170d21a91","last_modified":1565181472444},{"guid":"{4f71ae77-8abe-43df-bb9f-cf440d6f7756}","prefs":[],"schema":1564993164184,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1571059","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Adblock for Youtube2019"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0f73f6c1-38cf-4255-bb8f-8a61f19afd99","last_modified":1565003019901},{"guid":"{f2539eac-e545-475a-85b4-822347022dd8}","prefs":[],"schema":1564861308712,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1571130","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Woor"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ae64120f-d93a-4224-ac75-4038b0d2a33b","last_modified":1564993145778},{"guid":"/^((\\{8842eb7c-5f5c-4d33-aabe-81c27ae87dcc\\})|(web@1A72D794-697C-11E8-9D8C-1C0018C6383E)|(web@2a366bba-0a94-11e8-ba89-0ed5f89f718b)|(web@2bf1a18d-3240-42ad-9f7d-46017edc432c)|(web@2DC2452E-6999-11E8-A1CA-6C6318C6383E)|(web@2DC2452E-6999-11E8-A1CA-6C6318C63000)|(web@3)|(web@3ab4d660-8caf-412a-84eb-9cf2924f54c7)|(web@4)|(web@5)|(web@48F0D4BC-6FB8-11E8-B36A-905EE70C2B9F)|(web@82FCE0DC-836E-11E8-9E9B-164B9D46D017)|(web@90c91611-b4c8-470a-b251-77bb1f859dba)|(web@899ce5cc-06fc-436e-a59e-93a70eb4c810)|(web@3681a37c-6383-4e94-8076-28496af53983)|(web@7398cc9a-684e-40a4-afe1-b620e1a863b2)|(web@7398cc9a-684e-40a4-afe1-b620e1a86000)|(web@8842eb7c-5f5c-4d33-aabe-81c27ae87dcc)|(web@10722358-d56d-4f5e-a89c-d4534d7c5000)|(web@10722358-d56d-4f5e-a89c-d4534d7c5565)|(web@67887931-77b9-4b1b-baee-9f23a4a384de)|(web@a3ea9864-1034-47b9-a25a-e9cc207a9319)|(web@af1e58bc-4ead-11e8-81fc-065ad97f23a5)|(web@af1e58bc-4ead-11e8-81fc-065ad97f2000)|(web@B7CCDA78-8455-11E8-91A4-ED179E46D017)|(web@ca5a2803-6421-4582-97e1-9e30fe44e100)|(web@ca5a2803-6421-4582-97e1-9e30fe44ee00)|(web@ca5a2803-6421-4582-97e1-9e30fe44eee0)|(web@cacf1377-a1b0-43e6-84bc-c0518922b22c)|(web@e7a72615-19b1-42a5-8e34-ddfa89ce006e)|(web@e7a72615-19b1-42a5-8e34-ddfa89ce0060)|(web@e7a72615-19b1-42a5-8e34-ddfa89ced000)|(web@e7a72615-19b1-42a5-8e34-ddfa89cee000)|(web@e4058a8a-59ca-4ba7-b503-dfcf75639305)|(web@f3ac4769-1d70-444e-aa46-06d0427473b9)|(web@FACD83DA-68CC-11E8-8484-3DA118C6383E)|(web@fd9b3d8a-1178-45ab-92a8-a172d0b7c000)|(web@fd9b3d8a-1178-45ab-92a8-a172d0b7c32e)|(web@fd9b3d8a-1178-45ab-92a8-a172d0b7c39e)|(web@ourdom)|(web@oursrchdom)|(web@test)|(web@testss))$/","prefs":[],"schema":1564669690124,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570659","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5aa0a7da-cf9e-4bac-bbed-1b7625109cc7","last_modified":1564671502746},{"guid":"{97ab6723-bc9a-4c5b-a08b-5b162d29ad4f}","prefs":[],"schema":1564669434797,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570385","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Toors"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"30d0ec83-70ac-4a03-9239-7af6c4061cde","last_modified":1564669681391},{"guid":"@weatherhubpro","prefs":[],"schema":1564668992535,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570380","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"FreeWeather Pro"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"47315374-a775-4701-adc3-d0cfb61a44b8","last_modified":1564669425544},{"guid":"YouTube@develop.com","prefs":[],"schema":1564662247837,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570377","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Youtube Downloader (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"176a0ef0-bd71-4b96-a3e3-14c17eaad3dd","last_modified":1564668305895},{"guid":"/^((nickrr878@gmail\\.com)|(\\{a06de0b3-b00f-472c-a34e-3a74b64d1747\\})|(spar\\.team@spar\\.team\\.com)|(\\{59904ffa-b247-41ea-9ac1-2ce0a2da8c98\\})|(\\{69c49344-90ec-458d-9811-a55878e26bd1\\}))$/","prefs":[],"schema":1564660970729,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570622","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Shopping add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"26b10e69-d842-40ef-90ce-f96552e269a3","last_modified":1564661731567},{"guid":"/^((web@AppConverter)|(web@SearchManager)|(web@Email2)|(web@DefaultSearch)|(web@AudioConverter)|(web@translations)|(web@Manuals)|(web@HowTo)|(web@Property)|(my@WeatherTab)|(login@EmailAccount)|(web@WebDesign)|(web@Utility)|(web@Ancestry)|(web@Bank)|(web@CrimeReport)|(web@Taxes)|(web@Notepad)|(web@Crypto)|(web@peoplesearch)|(web@Weather)|(web@VideoConverter)|(web@TV)|(web@Transit)|(web@Template)|(web@Sports)|(web@SpeedTest)|(web@Social)|(web@Shopping)|(web@Scrapbook)|(web@Recipes)|(web@Radio)|(web@PhotoEditor)|(web@Photo)|(web@PCTexting)|(web@Packages)|(web@Office)|(web@News)|(web@Movies)|(web@Maps)|(web@Jobs)|(web@Interests)|(web@Games)|(web@Forms)|(web@Flights)|(web@Fitness)|(web@EmailAccount)|(web@Finance)|(web@Email)|(web@eBooks)|(web@DM)|(web@Coupons)|(web@Classifieds)|(web@Calendar)|(web@BrandedTab)|(web@Bible)|(web@Converter))$/","prefs":[],"schema":1564599359459,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570620","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b5e2f528-3a9c-43af-9f6d-98040157a59a","last_modified":1564660457769},{"guid":"{795697ee-695f-45d4-a997-6fe845b473d5}","prefs":[],"schema":1564342890085,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1569556","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"IDM integration (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"21bbd8dd-b79e-41b8-bd18-db1592e743c9","last_modified":1564399822770},{"guid":"/^((\\{86f185bb-b672-4a24-b3d9-a8751231b687\\})|(\\{8d98cfc9-3757-4fd9-b017-30ad60fb94ed\\})|(\\{288a7d51-4627-44c9-8cf0-cf18742a6f67\\})|(\\{49e5562b-38e2-4292-8080-ca3ffe8cea42\\}))$/","prefs":[],"schema":1563809747757,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1567876","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eeaa940b-b984-43da-88ce-d26891347e3d","last_modified":1563810026497},{"guid":"/^((\\{e656b354-3c95-4a63-a271-fe301b294da0\\})|(\\{f5ab4224-43ca-4654-b189-23aa9c960803\\})|(\\{fb68ec9f-d02a-48c9-a356-3020bd1d3e21\\})|(\\{2eabd9de-b8bc-43f2-9e77-624a0e04e38d\\})|(\\{426fe5e4-5da1-41b3-81d4-28bd59724f84\\})|(\\{4b1d9906-5cc4-44a6-ad64-a6c7b0e2ebba\\})|(\\{bbe2e2b3-4a77-4108-9183-e0b02676c09d\\})|(\\{01aef979-833c-4f7d-85a0-6be87462c05e\\})|(\\{9b51394e-a1a9-4864-9876-cc1d6f1a47d5\\})|(\\{7c4f0798-6edc-417b-8702-d97ca1c894c6\\})|(\\{ad93f537-5824-4057-a44f-cef1f97c2d68\\})|(\\{ff62fb9d-c5b7-414d-8c2b-bc5d796475e8\\})|(\\{46998928-4162-46e0-b4c7-260a8520aad9\\})|(\\{731367f8-f5e8-4ade-b8cf-5aaf8c2a455b\\})|(\\{eb6b098d-7811-4a20-a94f-ca91721d4aab\\})|(\\{6ddb9deb-d435-4ec2-be8b-ca65900e43e9\\})|(\\{288e4bb9-454e-4374-8734-1069241d618e\\}))$/","prefs":[],"schema":1563306101159,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1566026","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1f35915e-2de0-4973-adf4-4e77073e0b42","last_modified":1563367115113},{"guid":"/^((\\{7e9c2e2c-8d2d-4406-bb3d-993176f59b34\\})|(\\{f743e1bf-9a1c-43ab-b8ab-57972761b919\\})|(\\{b8274b35-eeaf-4d98-8a6a-cc4fd56603ed\\})|(\\{fd90393d-6ac6-4245-a048-9d423baacbd1\\})|(\\{3f7b376e-23ad-4296-8fd1-77fb254610bc\\})|(\\{fd918017-a23c-40f0-88e1-798ed6fc51f7\\})|(\\{bac48192-5c1f-4dae-aa1c-2fa9ca65dbe0\\}))$/","prefs":[],"schema":1563284869997,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1566557","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Add-ons overriding search settings"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"59cf2549-3930-4a60-a212-af84facbee32","last_modified":1563302090004},{"guid":"/^((general@mapseasy\\.net)|(\\{fd4b0f58-5268-4d52-b09b-547e867fef27\\})|(\\{efe13936-3bfa-44ce-9224-e8cb27f0f216\\})|(\\{c6b767a7-b0c1-4b68-8ac6-d08fee14c5a0\\})|(\\{a9df2ef3-9746-4d5e-b7aa-0baa531538d2\\})|(\\{2d947dd9-fa0f-4f20-8812-31ce9e29081b\\})|(\\{3e800ada-345b-4ac4-82a5-0dbfd00d7877\\})|(\\{a5fcf820-575a-42c2-aeb1-de1a794db1b9\\})|(\\{da844d4c-44e1-4799-ac53-9bb1ad2c8227\\})|(private-tab@mozilla\\.xpi)|(\\{56dbb679-8db4-47ce-851b-a7eab0e215cc\\})|(\\{c1415289-4471-4b6a-b7b7-4feaf9506b38\\})|(\\{29439407-f908-4779-9078-eb190f21dc4f\\})|(\\{5401ea8b-def8-4df3-bf9a-f520b147df69\\})|(newtab-plugin@mozilla\\.xpi))$/","prefs":[],"schema":1563133289502,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1565994","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Search hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c349ecdc-5fa8-4b87-bfa2-c732dfde094d","last_modified":1563186751969},{"guid":"/^((langpacasdjasdk-de@firefox\\.mozilla\\.org)|(langpack-de-7@niklasb)|(langpack-de-8@niklasb)|(langpack-de-9@niklasb)|(langpack-de-10@niklasb)|(langpack-de-nightly-1@firefox\\.mozilla\\.org))$/","prefs":[],"schema":1562673203781,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1564401","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"German language pack (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d38035ff-7945-49cc-88fb-6de9f8a13658","last_modified":1562673628501},{"guid":"sourcegraph-for-firefox@sourcegraph.com","prefs":[],"schema":1562614890305,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1541010","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Sourcegraph for Firefox"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0"}],"id":"9fde5729-9be6-4955-9627-67742c5ed62a","last_modified":1562667113062},{"guid":"/^((\\{6d0887bd-1f51-4852-9307-cf2a223c3a9a\\})|(\\{4cb2b177-e2a2-4ae1-b759-03606a85df61\\})|(\\{df28b68e-ad39-4300-add2-b2dc8bf54f71\\})|(\\{eff0a5d5-3f53-4b75-b451-5acffd5bb61d\\})|(\\{7561d328-6b59-449a-bf7a-46fea5027be4\\})|(\\{854246c0-f678-44ff-85f3-f340f33c5da9\\})|(\\{9e976e36-9eb7-44bd-97a3-4901ab3e1021\\})|(\\{2e9a0a60-8423-4ffc-89ef-74a02ca8c5e8\\})|(\\{a5e298c3-2d74-4268-8d13-e0efcb77d896\\})|(\\{39838189-7836-432f-9a34-a009886a61f8\\})|(\\{a3f781a4-adc7-4a12-9812-20da06e7b6d9\\})|(\\{365b3845-1e12-4096-80f1-8be24456d741\\})|(\\{701511ef-2e5a-458f-b735-c789b7ae6feb\\})|(\\{888807df-4517-4b97-ac73-e4294865e375\\})|(\\{ea7c7094-9d83-416d-bd13-e85fcef481a5\\})|(\\{1f67e4bd-6eb6-4fd7-a694-b8b360494cc3\\})|(\\{4f9520a5-caa6-4832-9582-2b26b8739305\\})|(\\{06f5112b-da03-481b-bef1-bf752ddbe7a2\\}))$/","prefs":[],"schema":1562269304530,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1563454","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Fake Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f8e35175-572a-4b00-b5d3-9c8df255f1ec","last_modified":1562320360370},{"guid":"/^((\\{fc2dbae0-1ab3-40fe-9a38-cbee911b903e\\})|(\\{82e3e07c-0cf3-4b9f-a625-65d378698af3\\})|(\\{2904a7ee-0b54-4adb-a500-b932b77b6936\\})|(\\{f6932562-1f6d-4779-b5a4-f4c4654980dd\\})|(\\{97f0cc0f-69cf-4e5a-af68-f404aa3f1ce5\\})|(\\{c346f3ce-08bc-44b7-9410-bd8ad65f32d5\\})|(\\{f68f3bd2-ece8-4a85-b071-cea253cd78ac\\})|(\\{d9b6a925-e00c-4e36-a282-e6b76833e5b5\\})|(\\{e8a67ebd-655e-48f9-99e7-619c850f6bcc\\})|(\\{15942451-8c62-457f-8ff1-8525ce647c0d\\})|(\\{8fcdb966-eec2-4cd0-865e-1d105e9b59e2\\})|(\\{6ae58312-7d81-4d39-84f1-454ae6ace826\\})|(\\{023cd859-1b7c-4384-80e5-eca82c68a21c\\})|(\\{694e912f-011f-4be4-add9-25c85af8014d\\})|(\\{b889539e-4b8c-4e52-a605-a0b33532fd05\\})|(\\{596c6d7c-49ab-440e-a50d-220e5db393f7\\})|(\\{f0fd5c9c-1fcd-4085-ac41-47c379517420\\})|(\\{545dbede-b51c-477b-b23b-936dd5e7a428\\})|(\\{c3f9f4e6-b5ed-49fb-82c6-313b9617cddb\\})|(\\{309908bd-c2fe-4066-82c5-0631571e77fc\\})|(\\{75f93037-6366-4f88-b92b-c3174d68a836\\})|(\\{36e57809-88bb-47ef-9b6c-90170bb753d5\\})|(\\{da83ef9e-f36a-4416-a4ab-29a09c981690\\})|(\\{09e50933-f19f-435a-8e6a-7663715ea3fc\\})|(\\{7f35f6f3-714d-4c0d-befa-5a6843c62b6f\\})|(\\{b3b3f9c6-6b64-47d0-bf5a-f9796d1d7cfc\\})|(\\{116c6521-bda8-469c-9ca6-0702860aca67\\})|(\\{98566ed5-4c57-4da4-946f-03beeaa6145b\\})|(\\{8fc257d4-612c-4196-9688-dd7de0979c44\\})|(\\{9b7f873c-cf3f-4d8d-9cd2-3c68ce0f831f\\}))$/","prefs":[],"schema":1562096490180,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1563454","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Fake Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7f55f27d-37e5-4c3e-bd9d-02924496ba3d","last_modified":1562227635293},{"guid":"/^((\\{a3250b1a-de19-432b-829f-3d4c18ff4549\\})|(\\{b315912c-03f9-4ca8-a9fd-9410786d242a\\})|(\\{d1e4d5e2-9c6d-4e1d-9638-d329d64e5484\\})|(\\{898e64b3-38b0-4748-93a2-7e68874a73c9\\})|(\\{062f9d2e-1e5d-47e1-a9e6-0a4eb1e8182c\\})|(\\{434cedce-3d36-4ec1-b99d-e2b5ec929e8f\\})|(\\{b429f2f0-62de-4c72-9722-9ccbcc43500c\\})|(\\{7405ed28-67e9-4836-9c38-26bb7175da3b\\})|(\\{ebb5fe5c-5561-47e8-8240-bae4ba4b0389\\})|(\\{a9a5ac46-ade8-4927-85db-5c36bb26fd2c\\})|(\\{34d93cc4-a468-4ddd-98a4-31d1237b9986\\})|(\\{394a7da5-0f59-425c-ae83-49ad47c30a51\\})|(\\{15532ccb-c575-4b8b-9a62-ca2e4b9cbd7d\\})|(\\{d0579f20-4e35-4d7e-be6a-3da1b7660ce7\\})|(\\{f39c789b-9a2f-477e-885e-675f499e8307\\})|(\\{7adb91a0-6c6b-4fc6-911c-63a0c10bb363\\})|(\\{8b51d36c-f5d2-4c9d-b431-2c5011168470\\}))$/","prefs":[],"schema":1562061057131,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562598","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various Fake Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"432368eb-333d-4280-846d-e9508ac0a8c4","last_modified":1562061250280},{"guid":"/^((chromelogger@usernamewilson\\.com)|(firefoxsecurity@usernamewilson\\.com))$/","prefs":[],"schema":1562001599116,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562597","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fire Security"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c4cd1e9e-b81f-40ef-8c0d-86b42d884a7e","last_modified":1562061057121},{"guid":"/^((\\{02421745-5b6e-45e3-925c-670b72162fa5\\})|(\\{165626db-f5c5-4e96-b7c5-dafaed6357f4\\})|(\\{87115bc9-2e52-455a-b82d-2753d3303d0c\\})|(\\{be0863e2-c325-48cf-9623-88bcc6d01970\\})|(\\{09298d3c-f8f1-401d-bd70-43cb66af1594\\}))$/","prefs":[],"schema":1561988438120,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562634","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3031bfa1-90c6-4b7a-ba03-7fcd7e010914","last_modified":1561988914045},{"guid":"/^((\\{fd605874-13ff-4b86-8018-9167923792c9\\})|(\\{687ac7de-0c7c-4e5d-9fac-10757591026d\\})|(\\{c9c11fd7-6774-4657-afe4-0cbf1081b505\\})|(\\{5970609b-547d-4094-b806-a9b0a2996c62\\})|(\\{f77d7ff3-05df-4455-aa23-8031dd341ec0\\})|(\\{d5238802-9ff3-49fd-a427-8eb7a73a08e1\\})|(\\{93a425f5-cc32-42bb-ab4d-63b53512cb52\\})|(\\{23de42fd-b546-4792-ae2f-e2f808e13b52\\})|(\\{209b8c63-d260-4fc7-be92-20e3b04eb944\\})|(\\{e6610c1e-4bd2-4ced-9d40-0a4fc125fd42\\})|(\\{6631ea49-4664-4acc-97dc-0d7e4a67a417\\})|(\\{b811cceb-fcd6-4eb6-b07b-c8c01794eaad\\})|(\\{8ad9f113-7b59-4c45-9c90-59609e7ee91a\\})|(\\{130f1820-9c73-439d-a9c8-114702e1d415\\})|(\\{6dd75c5f-407d-4f3b-9c29-90c422c82d85\\})|(\\{99968b5b-6b54-42e8-932f-0414bfd17405\\})|(\\{1a69e311-e730-48af-b050-f60247a32fe9\\})|(\\{67f715b0-1262-4660-9fa2-c6f7bc29ecc9\\})|(\\{3a8513a4-cac1-4619-ae36-9686bcbb42a2\\})|(\\{27af1be9-f9d9-40d7-878c-78d8bcd94dd5\\})|(\\{7b59b760-964a-43af-83b6-b4ef08fd2e07\\})|(\\{861bd389-6024-4aae-a31b-f334163c1406\\})|(\\{cdcdbb24-88fb-42f8-872c-3df116f82cad\\})|(\\{8c60aa85-e195-4203-8529-073a6db56c54\\})|(\\{c5781fde-fe4f-4792-9e01-4e1239c00b08\\})|(\\{1361b734-0efa-4d8d-8108-ead9400b50d8\\})|(\\{ce79c320-0b55-430a-a431-2cd69cc2919e\\})|(\\{cb976837-ff98-4f37-b81b-98571f3a7828\\})|(\\{21dd7ebb-6736-470a-afe0-5dcea38b3db7\\})|(\\{84b09a06-0f25-40ff-8198-98e2e54a739b\\})|(\\{b869d674-37ba-4df4-a34d-dc9be47a963d\\})|(\\{e18783e4-8e04-457e-9b35-611d20fc12e8\\})|(\\{04042b52-3398-4e42-a638-ef9200c589f4\\})|(\\{96292080-d058-458d-a6c6-bff1d52425a2\\})|(\\{aa584391-2c81-4dfb-b06e-5118b026104e\\})|(\\{6285eae8-ff36-4887-b46c-3772ec04390f\\})|(\\{ea28f6ac-affc-45cb-a536-1eb1bceae142\\})|(\\{340afda6-c1e6-4ac4-8e5f-a5b439a9dfa1\\})|(\\{62202f8d-8e11-4ce0-af66-2235ad17051c\\})|(\\{d4e05835-d503-4d21-9701-a24dd61b0513\\})|(\\{3e8d4f85-d823-4dac-84fd-4b87b33e7852\\})|(\\{c04dbf0d-9b39-4730-93fa-6680aa0909f1\\})|(\\{019be100-cda8-43ae-8136-a014db9e7a9f\\})|(\\{73c512b3-a9c9-4690-bba5-fbfb94aeabd7\\})|(\\{0c78c766-7ebb-4b2b-85dc-d4fcd4da6e9e\\})|(\\{a318cd63-2e84-4d05-96b8-13b721fdec8c\\})|(\\{97d03ad5-3911-4c72-8ff9-5f4b9beade68\\})|(\\{77c5010c-c799-469c-85b8-5e7e0140fb10\\})|(\\{16458eb7-545e-4626-8620-e31d71cfbcc3\\})|(\\{a5a61ddf-c248-4109-a1ba-b8bf84e728c3\\})|(\\{6b18c850-65e3-4cc8-b3f6-e78969c9a428\\})|(\\{4ae632f1-6735-4077-8b62-f73d68eab36c\\})|(\\{db7b2525-ccd1-4ee6-8daa-890d7879ed07\\})|(\\{9e382691-320d-4500-b378-90c9ad922422\\})|(\\{1bf86700-b428-4e67-9701-536f66ec0a2c\\})|(\\{d6841f20-fd15-4373-944d-a0dd6a286d69\\})|(\\{18169628-a7de-4c93-9d30-efb66f45b5a4\\})|(\\{d9979d00-eb14-4cb3-bb21-452d2c02e3dd\\})|(\\{cb868690-a1dc-4fe0-bd2e-2ab291cd54a4\\})|(\\{230faf82-9048-43e9-ab19-94bfe1113ad9\\})|(\\{e0723460-a1a2-4877-bb20-a3f14e01e594\\})|(\\{2431dfee-a855-46b4-a740-6d0e4dbaa662\\})|(\\{1d44053a-5ff6-494c-8fef-0084039eb8ac\\})|(\\{bc77d204-ecd7-42ee-8006-cd54be0a400e\\})|(\\{9e22fccc-6b4a-4674-87f2-e6ecd4b409d6\\})|(\\{62474e9a-8a3a-41cc-9530-97baf6f8b7af\\})|(\\{6932ebe8-ed27-4291-86fd-d5147e0f5702\\})|(\\{aa5b9279-e324-4951-8a12-b0712f37e233\\})|(\\{420e769f-b577-420d-bf07-182299d75882\\})|(\\{11a0fbd7-b2c9-427a-8d33-e7fd8e845630\\})|(\\{a4dfd321-45e6-42dc-9ac8-9d606ad4a672\\})|(\\{54685c20-9401-48d7-a950-81e7b10bd9ed\\})|(\\{2605a51d-53d1-4345-9fbc-380fab2a0c4e\\})|(\\{c3699f84-dacd-4734-a60c-7ecb1b28289a\\})|(\\{074b0ddb-5187-484b-9783-22d187e6dd08\\}))$/","prefs":[],"schema":1561923700391,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562630","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"56849c09-6253-44ed-bc59-1cd7a61ce961","last_modified":1561988438110},{"guid":"tab-api@mozilla.xpi","prefs":[],"schema":1561710153929,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562154","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Tab API"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9f484302-44da-4b6a-afd8-94113b83c0f6","last_modified":1561710520557},{"guid":"/^((\\{b7a0ecf9-212b-49ca-bec1-ead0c6dc2128\\})|(\\{6e977a6d-b31d-4735-a586-41dc25df2100\\})|(\\{67155a2a-6538-42b1-bdc9-f48b442f57e7\\})|(\\{b4d4abc0-5e6e-4a34-a7e3-bfe7319160b8\\})|(\\{2102c5a9-f3c4-4f71-bb6e-c45c9d07b6c8\\})|(\\{071c1c7a-cde3-4a22-aefe-7c8f98df6277\\})|(\\{aa2f3e70-7dcf-4b4e-92c5-54c8280b98de\\})|(\\{3b376420-b276-4a0c-9e28-340dcc0547ce\\})|(\\{ed192371-abcc-4520-ab76-d22afbe51dff\\})|(\\{ad5a457f-59c8-4d90-8e3e-59f13a3bc2b2\\})|(\\{06aa60ab-91ad-4b8a-bfda-98e33b65fbb5\\})|(\\{c2875a12-da6a-4f90-a919-1d2bef57fbff\\})|(\\{b01d1c5b-58b5-4411-86d0-555131c7bd07\\})|(\\{0a79c7eb-5fe9-4e37-841e-18686bc86a20\\})|(\\{341ca205-d6e0-4d03-93be-04939c429412\\})|(\\{855e09d9-ac3a-4885-828d-557734060c1f\\})|(\\{8ac01eb1-9819-4c41-b2b7-042d8cdb3f2e\\}))$/","prefs":[],"schema":1561657651090,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562153","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3460b6b7-8251-4588-8f12-81ac8d288c88","last_modified":1561710153920},{"guid":"/^((\\{65b88db7-9c07-4d03-80eb-2e5cf6cd7aa8\\})|(\\{aa2ef90f-db17-4ece-abab-4f87830457db\\})|(\\{e50969c9-088c-4978-9ffb-5d78015dabcc\\})|(\\{15fd1a8e-db53-41fa-9c46-93ec5b7473c1\\})|(\\{ed84b63e-faa2-4c48-b080-e9612cbc2e49\\})|(\\{c784f63e-5609-47a8-92ee-33a2bcb3239b\\})|(\\{1641b1ec-9a3d-4e3c-b52e-bc80671349f9\\}))$/","prefs":[],"schema":1561587664411,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1561854","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3e88dad8-f640-46dd-8b00-4b955eea7b24","last_modified":1561626172388},{"guid":"/^((\\{f0df6aa3-9792-4476-daa6-4709f93bbce3\\})|(\\{fe934134-3d0f-462b-d56e-e7187dfa8c98\\})|(\\{429999c4-1b8b-46fb-863f-ce19a08afc9c\\})|(\\{b8003074-2123-45be-91cf-654ef9671e1a\\})|(\\{9712066a-d491-4293-cd31-8ef8ee907d40\\})|(\\{dcfbb98b-783b-4df0-8427-e269114736cb\\})|(\\{66c44e3b-2df2-4741-ff07-0067cca4fe95\\})|(\\{af0a4d96-3403-496f-9d9a-5c766bf44bac\\})|(\\{82c60958-45da-4e6a-de21-879775c5473a\\})|(\\{c9118234-5787-488d-b30c-7d0a904fbabb\\})|(\\{f07d3da6-81ea-464f-9bef-6ff5470b307b\\})|(\\{c2454a12-7f57-440e-f695-0a9618f48b80\\})|(\\{f6e1d884-8100-49e7-88b9-bff8d9295cd2\\}))$/","prefs":[],"schema":1561552773231,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1561603","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Various script injection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0c227983-1180-4b4a-b25b-8160738e7238","last_modified":1561554563187},{"guid":"/^((\\{4200b565-5c4a-410f-b4fb-478daae2537f\\})|(\\{a0bba103-21d5-49c8-96f3-4eabbe78ced3\\})|(\\{ec46fe21-5690-4757-8ebc-1c77f826fe6b\\})|(\\{ce45d605-3bb6-4fad-8c1b-238ecee0d3df\\})|(\\{c70bd1fe-1d7d-4ae5-a731-3d513e6c46ba\\})|(\\{aeec96ca-81b9-405c-bd70-01ea6a50be9d\\})|(\\{0a1603a8-839f-4890-b1e3-1b8e00a7a0c9\\})|(\\{45febc8f-eaeb-4cec-90ea-07a7edc22793\\})|(\\{a7c7febd-6726-4d0e-9947-2edfd8bea35a\\})|(\\{eda3389e-ae07-4a2c-9b50-ce4e9008f297\\})|(\\{0e5d1d65-4fbb-4dd9-9042-3b568d9e2489\\})|(\\{1461f0e5-3c4a-453e-aed2-ca45ff5db747\\})|(\\{e842e73d-9d8a-45a8-bf0d-ef974ab24767\\})|(\\{e1d4fa8a-3da0-4fee-8b4f-0c7233fcb49a\\}))$/","prefs":[],"schema":1561541784349,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1561595","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2e886e0c-00ab-44c2-bcbe-7c8793d46d89","last_modified":1561551163572},{"guid":"/^((\\{0eddfecf-eb8a-4a08-8189-004932a77d5b\\})|(\\{b8181b05-a263-410c-8c07-5d7e8c80f9a2\\})|(\\{561d3a53-8e1f-417c-9b46-af1ea9942c4d\\})|(\\{cae0f640-a4b8-4ea0-8667-39ec00651b54\\})|(\\{142aae9b-ff6a-4ae3-b4c4-75e99534e661\\})|(\\{0592cc75-3027-420c-9a9c-22b23a21af5b\\})|(\\{23f8f54b-1f6a-4760-bd9a-414aba8d93c4\\})|(\\{09d0cd99-4cde-42d2-9a4e-8002f7595834\\}))$/","prefs":[],"schema":1561380181925,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560886","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"ADB amazon"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dba9e10e-ff77-45dd-a2fc-e7daf5f09fd5","last_modified":1561381085652},{"guid":"/^((\\{99a325df-ca23-41da-84ce-477796f46737\\})|(\\{86a9b963-ebd2-4ef5-abaf-5ffd7cf86387\\})|(\\{9c05da6f-e5e2-4455-bae3-2754e1b36db4\\})|(\\{002d0276-03dc-439b-bea4-576976bbd7c4\\})|(\\{4476484a-2a0a-4a7a-8612-18ac22e02ac9\\})|(\\{edb28501-65bc-49f1-b168-1ea5e84d4a19\\})|(\\{13b0c2d6-0a44-47e0-aced-0664877b8a4e\\})|(\\{fdd30cab-1f29-439b-829d-80c5546087e0\\})|(\\{2abed6fc-d8ac-479f-8fdb-f5d20b0a5c27\\})|(\\{7afb7eb5-7837-474f-a925-62728be18488\\})|(\\{ff86f12d-e38b-4c70-ab00-9cd20174ddcd\\})|(\\{31b72d81-14d8-40e5-a2c2-7259a7d40d96\\})|(\\{84e3002a-a0ea-42f8-b30c-1739cb21b105\\})|(\\{47d8027c-a331-4f8b-8c69-4c95680caba5\\})|(\\{d03ae30a-58b5-4dc1-afd9-bc4ea8efc761\\})|(\\{eb745394-234d-48b4-bf1e-cdec66de26d3\\})|(\\{b5614c0a-878a-412f-ad7b-bc5a7916b3bf\\})|(\\{1d5916f7-3a78-40ce-92a0-35989646fe8d\\})|(\\{34cfd020-1dce-4f12-9499-f7e3b02582d0\\})|(\\{7fbdd1c1-82a4-4cfc-a3c2-ad192f5c8cf8\\})|(\\{04fbbb51-3b76-484a-99ca-ccd3e484da26\\}))$/","prefs":[],"schema":1561379624735,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560888","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5525a8a4-2b7f-4cb8-8932-5daf35a2acc9","last_modified":1561380181911},{"guid":"/^((superzoom-unlisted@funnerapps\\.com)|(superzoom-unlisted-test@funnerapps\\.com)|(superzoom-hosted@funnerapps\\.com))$/","prefs":[],"schema":1561260352539,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560927","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"SuperZoom"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a7a12a25-37c2-4ec7-8fa2-e016442b4457","last_modified":1561379624719},{"guid":"/^((\\{dfc97392-12f9-474c-9a61-fba12334d09f\\})|(\\{ca0e7543-892d-4625-8565-3671141a4ac4\\})|(\\{d50b1b61-8ba1-471b-833e-c5526ea4f307\\})|(\\{ae53880e-f5b2-4020-bdb5-0872cc1196af\\})|(\\{cb8982c0-1f56-439e-94a0-83a0308ea952\\})|(\\{91ca701d-73e3-4d76-80bc-4cbefc16beae\\})|(\\{f238a031-3366-4792-89b0-736f5e1af888\\})|(\\{35f7fa51-338b-4a7c-9f74-055708e2c941\\}))$/","prefs":[],"schema":1561232502012,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560614","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More fake Flash players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9a6e32f3-3d97-4393-8733-1a24b8796aa3","last_modified":1561246819959},{"guid":"/^((\\{eb585608-4896-4892-8a9b-1786929a6517\\})|(\\{b53cec3a-0479-4887-93b2-4732059e6f95\\})|(\\{52e84405-484c-4bfb-a279-da57dc8f89d4\\})|(\\{65136894-4082-4eac-a968-ad5dfd1771f8\\})|(\\{98d5570d-3606-40f8-8af2-2d2144698a92\\})|(\\{5ced4e6d-5c50-4e26-9d8b-b82a8d9b4e87\\})|(\\{fc97e534-4690-462b-8227-af38c67b57e2\\})|(\\{8aa21cc1-d9ac-4c43-b205-bfbd87aa8163\\})|(\\{f3dd0563-975b-475b-b295-2922f6e69717\\})|(\\{b1ee58e1-90de-425b-ab76-dd8e034305c8\\})|(\\{ae026b4b-7159-4415-98d4-1fb712092028\\})|(\\{452ec3ac-8fba-4de8-a5dd-db1cf9b89c35\\})|(\\{4c0a3c25-f706-4160-8128-197137e814b8\\})|(\\{30c347c6-642c-46cf-899d-442632d90e25\\})|(\\{7dd79020-d8d4-4241-b1fe-efca66530d5d\\}))$/","prefs":[],"schema":1561059702370,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560614","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More fake Flash players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"61f4423b-7171-4a82-8aae-71621233ee2a","last_modified":1561148779474},{"guid":"/^((\\{2adb8263-d69a-4436-a46e-b8595c35d3e4\\})|(\\{d2d96579-be7c-4bc0-9d94-7eb8920ed437\\})|(\\{3ef03e82-ae5c-4bb4-85f2-d0925d3b1d8f\\})|(\\{5f89e2ff-b113-45a7-bd44-a8cbb6b3e18e\\})|(\\{d0a65809-897d-40af-974c-df6baa16e0d6\\})|(\\{17d71711-a428-4231-93f7-25f65dc7a05f\\})|(\\{88bf0d44-b815-4654-b177-25ed224587de\\})|(\\{0bc2f2bb-b040-4512-b0bf-a2a875bfbcc7\\})|(\\{c05607b1-ce5d-4a14-ac71-91d93e5adc7c\\})|(\\{14d1d1c6-3982-4379-bf48-67aff16b0b40\\})|(\\{db395935-5b36-43e0-9c21-2fc546e3504b\\})|(\\{031a0658-d9a4-4dab-8b9a-3608a92d3d9f\\})|(\\{28a6ee49-33dd-4cc1-8650-7abc95ff30c1\\})|(\\{578c5cb1-ed39-4270-9010-3d7c623e4ed3\\}))$/","prefs":[],"schema":1560890279256,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560126","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More fake flash players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"39d92b03-d7b7-41d3-8d14-73088972f735","last_modified":1560959139660},{"guid":"/^((\\{52e29477-bb59-452a-a929-7d238ab68dc8\\})|(\\{e7c3e8d7-0cd7-4cea-8fe6-afd0dda61f56\\})|(\\{f57df33b-b222-4524-86c3-531a6d20b4c2\\})|(\\{5bfc5ee1-d8de-4efd-80f5-966b94eec12b\\})|(\\{ed229f56-afbb-48e5-8422-2ad940afa02f\\})|(\\{c87d1f11-ce0e-46eb-8710-1288416b709b\\})|(\\{177b00c2-4fb2-4268-b0c7-cb5a1ad08d83\\})|(\\{33850c97-5260-409e-9796-bd9e03aeb411\\}))$/","prefs":[],"schema":1560874921856,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1559787","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b44844c7-0ba9-477c-b0f3-bd12725c620e","last_modified":1560875340234},{"guid":"/^((\\{004b2982-0956-4c66-a7f3-7dba26eeda94\\})|(\\{31606ee8-6af1-4d3e-98d0-451b8483a498\\})|(\\{914f7369-d844-4e72-a8de-043378710864\\})|(\\{87506f0b-af77-4113-8358-fbb0a9f6daa7\\})|(\\{74832b41-91e6-4bf0-a6a9-5e74bf3e5683\\})|(\\{94e526a9-70ec-4566-995c-53e597166c8c\\})|(\\{1679b342-31d5-44b2-ae2b-91c487b2654f\\})|(\\{ead96242-a6c8-4478-88c5-5e2c54d9ace1\\})|(\\{ab0e69c5-d215-4825-8e40-de0bcae97da9\\})|(\\{2607b07a-90e6-4c0e-9bd8-94eb16982303\\})|(\\{c8336a7e-f5ef-41d8-9754-31676cb4f6c4\\})|(\\{49185403-71d8-40ed-9e30-71171231a2c0\\})|(\\{724540be-a261-4d92-bee5-ede7c6375ed6\\})|(\\{6b687abb-9aa2-4e76-bdc9-cb542809cf7a\\})|(\\{faec57e2-f33f-4974-b29c-3afc2d710ae5\\})|(\\{2dc254ac-f312-4db3-84b2-29690e20ce4d\\})|(\\{c60eb214-f702-48fd-b173-756b528cee4b\\})|(\\{6cf50082-5b79-400b-846a-8902d6609a37\\})|(\\{a45c880d-5037-4428-9e1c-ec1cd45fe830\\})|(\\{d410777f-d023-44d5-bdb8-a54b0c927daa\\})|(\\{36fbd9e9-1d2d-411f-981d-b57fbc1067db\\})|(\\{170130b4-3178-4dc2-a1f6-98a788299b16\\})|(\\{aa54e92d-20ad-4f3f-a0c7-95a97bd5e99d\\})|(\\{6e73d781-bce5-40e0-a847-63a936f58ca6\\})|(\\{861af4ed-838b-4e5f-94c7-0e95bc6b709b\\})|(\\{3e000c1f-3ad5-455c-9a20-f18035273746\\})|(\\{aeacd5ad-8949-46a0-96b0-96c9f93f0b8b\\})|(\\{c7f65d43-1a36-4683-864f-c7224037289e\\}))$/","prefs":[],"schema":1560874615935,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1559776","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Norton add-ons and clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7434a6e0-c434-4017-b475-625bd0f85890","last_modified":1560874921842},{"guid":"/^((\\{c3ff7a71-7392-4aa1-a193-95fd393a7389\\})|(\\{9255568f-d790-4b45-9fe7-d4d1bcc193cd\\})|(\\{76d7025a-8c31-4b0b-a9de-c6679919ef81\\})|(\\{6b93c35f-74c4-4d79-8557-b3fcb090049a\\})|(\\{f9dbfda2-5680-43f1-9575-5cb044264f7c\\})|(\\{096e84e1-36c8-48fe-b642-03c91c1ef14f\\})|(\\{a11e0be8-9b45-4d69-9aad-339d3220147c\\})|(\\{fb754f2e-c021-4190-96fd-7142cbcb985e\\})|(\\{69187792-e951-4ea9-ad26-378f25efee81\\})|(\\{6468fac9-e37b-43e9-9895-36143902e431\\})|(\\{ff1db01d-4e0d-4917-b487-7f3c28d7f5da\\})|(\\{1adb7040-3a78-4270-b4d3-b926819d4c72\\})|(\\{9b3d09a1-2134-48e3-bf0c-a6dc659aad93\\})|(\\{bfa38150-f24e-4443-9d07-875b21ff479e\\})|(\\{05c8e9b0-0b8a-4da2-9e44-a215e691302c\\})|(\\{e4868162-b7f2-40dc-9101-4eab9858876b\\})|(\\{541118b3-1905-4d4a-9059-3ac745b0b043\\})|(\\{d38507bd-22ee-4839-be07-cae4806ac227\\})|(\\{dbef35f1-fc95-42e3-a4a6-b94a970b8a7a\\})|(\\{f34d7289-64c7-4720-90e9-6a6cad0ddc9c\\})|(\\{96b900d3-784a-4e93-8b9f-5f7885424117\\})|(\\{a6ccaf93-4d0a-4bcd-b574-b6d1417bdb0d\\})|(\\{186d942f-cc7f-4054-9673-067f9aaae190\\})|(\\{f7c0f615-d406-4cf8-b5de-bde347f7d9f9\\})|(\\{ddf49e42-2db2-448f-9717-96a93bdb078d\\})|(\\{add62eb4-d1c1-4217-920c-dfb462e955aa\\})|(\\{71ef4372-6321-4e99-937a-0a4a03476348\\})|(\\{053307b4-d841-4d42-8fda-881aa7f7777d\\})|(\\{458e497b-8e5c-4901-82be-1e33832bdac2\\})|(\\{3bf07b01-bc56-4b28-acb4-7d56bb6f5fc8\\})|(\\{7e50978d-cf4e-429b-8482-946c86991bfd\\})|(\\{7691a931-7d5e-4daf-ad20-14539572c215\\})|(\\{c1d8d622-aa7b-4e36-9d5e-e1de1b1044da\\})|(\\{f1b85cd5-bc61-4994-96fb-74df9c62d385\\})|(\\{e26cab94-6216-47e7-b725-948613f2a08c\\})|(\\{2278a05e-3b98-4fe4-83f3-f90d42ce0870\\})|(\\{85240094-c94c-40b7-84ac-6dcf1d50cee5\\})|(\\{7e5f5b7a-ef9d-41a8-8137-da6399afdd5d\\})|(\\{85d01efb-0331-4f7c-9ef2-f5f35c0df0a9\\})|(\\{f455923d-856d-4f2e-8e1b-8cffb0b7a4a4\\})|(\\{cd4fab1b-03b4-42eb-9800-1664c4de06c2\\})|(\\{44ad1c10-baa5-4efe-96bf-743d6a86079e\\})|(\\{73cf3b22-f479-495e-8bab-54ca07e3341f\\})|(\\{c4e856fe-5594-4484-9463-a139eb6071e5\\})|(\\{6f110a84-aa60-4849-8408-9ee70c868e8e\\})|(\\{67d91fb9-3da3-481c-a426-a350788764f2\\})|(\\{eb7699e3-9886-40d5-863e-0bf6862f2f98\\})|(\\{e18709ec-f4d2-40de-8e88-ef7a6f1d4fef\\})|(\\{f83cd650-3411-454d-aadd-79bbd82f3793\\})|(\\{edb44a75-f988-4ce7-ad83-1b7cfe3da54b\\})|(\\{b328a40e-52a7-48df-8960-8f79927bfd35\\})|(\\{f8681a1c-062e-4934-a1ff-6479f179aa97\\})|(\\{f052ef52-7b0e-4a99-9490-892b515d7ace\\}))$/","prefs":[],"schema":1560714091988,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1559772","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Adobe Flash and clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"34b4e88a-ca61-48fc-a6c7-7e08aedf7887","last_modified":1560874615921},{"guid":"/^((\\{c5ab9361-f8d8-454a-b268-a4b355b37a83\\})|(\\{f7bbdf7b-7f4e-4319-b9c6-ba62f38e1d5c\\})|(\\{97154c2a-2a3d-4ddb-814d-5451e3c35103\\})|(\\{1665bb10-e8d5-44ea-8cd3-531b6ebfaef9\\})|(\\{f3b474a6-b76c-4a9e-ae57-df0a3992d8f1\\}))$/","prefs":[],"schema":1560430131572,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1559330","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"436f1b52-16b8-4c70-b67d-ad6c39f6bd39","last_modified":1560502059138},{"guid":"/^((de\\.firefoxextension12345@asdf\\.pl)|(deex1@de\\.com)|(esex1@ese\\.com)|(estrellach@protonmail\\.com)|(fifi312@protonmail\\.com)|(finex1@fin\\.com)|(firefoxextension123@asdf\\.pl)|(firefoxextension1234@asdf\\.pl)|(firefoxextension12345@asdf\\.pl)|(firefoxextension123456@asdf\\.pl)|(frexff1@frexff1\\.com)|(frexff2@frexff2\\.com)|(frexff3@frexff3\\.com)|(ind@niepodam\\.pl)|(jacob4311@protonmail\\.com)|(javonnu144@protonmail\\.com)|(keellon33-ff@protonmail\\.com)|(keellon33@protonmail\\.com)|(masetoo4113@protonmail\\.com)|(mikecosenti11@protonmail\\.com)|(paigecho@protonmail\\.com)|(salooo12@protonmail\\.com)|(swex1@swe\\.com)|(swex2@swe\\.com)|(swex3@swe\\.com)|(willburpoor@protonmail\\.com)|(williamhibburn@protonmail\\.com))$/","prefs":[],"schema":1560426922081,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483769","why":"Malware targeting Facebook","name":"Facebook malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"202fbae4-e904-430a-a244-63b0fb04385f","last_modified":1560429929334},{"guid":"/^((\\{50c31b2c-af26-4238-bbbc-f11218d19682\\})|(\\{7c244b9b-4058-4362-9c3f-6f553c75d051\\})|(\\{bc90f38a-c295-45c4-a09f-7038ed6139a7\\})|(\\{d55311d8-83ce-4320-b30f-a7acac9224ac\\})|(\\{39d2838c-8b0d-453d-b685-71b2af4f3ff5\\})|(\\{95fdb905-de6c-4499-b7f2-372910a44405\\}))$/","prefs":[],"schema":1560371525142,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558791","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5bcce386-ce8e-4e59-838d-a02d35de154b","last_modified":1560417609081},{"guid":"/^((\\{615a653c-240f-4dac-a42b-66751cfe7405\\})|(\\{3119fa71-b8b7-430e-ba44-4c25d5d2a4e8\\})|(\\{98075bd1-491f-4506-9e0a-262b08042e5b\\})|(\\{6102d260-a977-46a0-8635-7cdf3f3b72b3\\})|(\\{593356cd-e02b-4529-9d14-c5e4740fe749\\})|(\\{15b2bf6b-274d-477e-8456-3efc218f9fe4\\})|(\\{78311b1c-ffbe-413a-86c2-86b136aacd17\\})|(\\{98f992f6-d311-4248-939c-05f5db60ee78\\})|(\\{b1f0bcd0-0bf2-43c5-b61c-ee1fdf7f88fe\\})|(\\{7113cc05-ebbf-4c1a-9c6e-a9f959817851\\})|(\\{5325d52b-99b5-4a98-8625-24bbc8098b7f\\})|(\\{b6e3b23b-adfc-4f23-986b-4e62faedf402\\})|(\\{fd000b48-0259-4356-9c5e-2ff22d8784b7\\})|(\\{7fae693e-a917-40eb-9881-769c85f64ab3\\})|(\\{c0b9ae3d-d604-4327-95a7-67733d00bc89\\})|(\\{bc6b6fa2-ef8d-41f8-99de-ad838ad09594\\})|(\\{9dfbbcab-e7d0-4483-85ca-ca71ba03b769\\})|(\\{1d4ef484-d567-436c-ba0b-9cc0fb224708\\})|(\\{9874efa4-3a66-459a-aa77-ecf9ac8d1fe4\\})|(\\{47faaf0b-ec1e-46d3-ad59-bb44345b86d2\\})|(\\{b4b433dd-adcd-4491-8f80-ecdfb4788dc4\\}))$/","prefs":[],"schema":1560340682934,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558791","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c016d195-ae3c-45d9-ab13-1010f0711b88","last_modified":1560340840541},{"guid":"/^((\\{43c62192-abed-474e-a619-9d486383f5d2\\})|(\\{9506f10a-e5c1-4a0a-83e7-8e83b3fb77d2\\})|(\\{a4fd5625-6912-4cc3-861e-f5338e4c36f8\\})|(\\{2ff20211-5540-4c13-8c06-6769902b0e15\\})|(\\{e15e3074-88a0-4a6d-bd1f-a7149eff3a6a\\})|(\\{e5800ff7-8cf3-410c-91a6-4b61838e4486\\})|(\\{22754446-97f4-473f-8da2-3ffbd44abdc3\\})|(\\{eea1ab8b-a4bd-4905-aa02-80874a452fff\\})|(\\{b0bfaa8c-702e-47ea-84ff-6b20ef979385\\})|(\\{f13622f7-470e-4ad3-85a5-25a0fd43f9fa\\})|(\\{f75cba29-48aa-4c02-8d7e-704532de1aa6\\})|(\\{43325b83-0f60-4d46-9b43-f9be2e91682c\\}))$/","prefs":[],"schema":1560251614258,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558543","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various fake clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2399177f-4b21-4c46-ae74-ab7db1edb879","last_modified":1560339940028},{"guid":"{e1bb4a20-9e0d-443a-b171-4d3b71f27211}","prefs":[],"schema":1560247588269,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1557680","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Biis"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f42edc78-6eda-4dfc-9f7b-fbaaa869852e","last_modified":1560248603844},{"guid":"/^((\\{f7b6b9aa-4564-443b-9da0-a194492cecb9\\})|(\\{f20526fe-45cb-441b-96e1-6d8aad20b97f\\})|(\\{2a7ada19-27c1-4f16-b67d-64344e85565f\\})|(\\{7faf6c45-9883-49c8-9d90-c70fd4fb72bd\\}))$/","prefs":[],"schema":1559835473927,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1557381","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3f781593-e000-464e-b46e-204201f42003","last_modified":1559836209248},{"guid":"/^((\\{4580e89a-d987-4a54-acd5-103eb91374df\\})|(\\{04767859-e649-473a-9ff8-1491f9217a2f\\})|(add-on@fdvoyzaxvni)|(add-on@mxdshahek)|(add-on@plgargwikihoves)|(add-on@plgbrhovtwitpor)|(add-on@plgeshovwikies)|(add-on@plgfrhovinstafr)|(add-on@plgfrscroltwofr)|(add-on@plgnlscroltwonl)|(add-on@plgsngicosnsac)|(app@clzohispatolas)|(app@plgarghovtwitt)|(app@plgargtydownesp)|(app@plgautriczoomde)|(app@plgcohovtwites)|(app@plgdehotwittde)|(app@plgdeudownlde)|(app@plgeshovtwittes)|(app@plgindhovtwiten)|(app@plgitscroltwoit)|(app@plgnlhovtwittnl)|(app@plgphscroltwoen)|(app@plgsajjhamzooph)|(app@plgsingchewmve)|(appapp@plgindzoplshind)|(application@arzoplgirasta)|(application@blibluk)|(application@breplgdownporbr)|(application@es9hsgaedr)|(application@es10gfjqzma)|(application@gerluk)|(application@grasow)|(application@plgbehovtwittnl)|(application@plgbelgdownflam)|(application@plgbescroltwonl)|(application@plgbrhovwikibr)|(application@plgdescroltwode)|(application@plgfihovinstafi)|(application@plgindiendownen)|(application@plgindzoplshind)|(application@plgphhovtwiten)|(application@twexispolavieda)|(ext@es8dffdsghe)|(ext@plgagscroltwoes)|(ext@plgbehovtwittfr)|(ext@plgbelgizompnl)|(ext@plgbgzowomawfr)|(ext@plgesscroltwoes)|(ext@plgithovinstait)|(ext@plgsescroltwose)|(ext@plgukscroltwoen)|(ext@sgdlpictomagi)|(ext@uksfdahdhsc)|(extension@es5dssdsj)|(extension@itsfahqiaxb)|(extension@plgauthovtwitde)|(extension@plgbrscroltwopt)|(extension@plgdehoverwikde)|(extension@plgfrdownlnewfr)|(extension@plgfrhoverwikfr)|(extension@plgfrsearchfr)|(plg@defdgajbisl)|(plg@es6fdhfec)|(plg@es7fdsfddqa)|(plg@esfdhalmbwn)|(plg@frhadiadsk)|(plg@indplgomenawc)|(plg@plgbescroltwofr)|(plg@plgbrhovinstapt)|(plg@plgbrsearchpt)|(plg@plgesdownopenew)|(plg@plgitadownaudit)|(plg@plgithovertwitt)|(plg@plgnlhovwikinl)|(plg@plgnlscroltwonl)|(plg@plgnorvegzoom)|(plg@plgsuhovtwittde)|(plg@plgukhovwikien)|(plg@singplganowong)|(plugin@frmdehpzamdoas)|(plugin@pldinddowninen)|(plugin@plgdahovinstada)|(plugin@plgdesearchde)|(plugin@plghowtwifr)|(plugin@plgitsearchit)|(plugin@plgitwikihoveit)|(plugin@plgnohovtwitno)|(plugin@plgpaysbasdownl)|(plugin@plgukendowauden)|(plugin@plgukhovtwitten)|(plugin@ptgouloumette)|(plugin@sgpongextejmk))$/","prefs":[],"schema":1559815025832,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1557258","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"67ab85b2-4241-4f2a-8589-801b4221b79d","last_modified":1559835396847},{"guid":"{ca6a76c4-1831-4e90-9ed8-2a3768114563}","prefs":[],"schema":1559739635606,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556974","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Xtif"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5c7614a2-793c-454d-967e-35b06de2cbd1","last_modified":1559814857242},{"guid":"/^((\\{8dcc43e0-bd17-44db-a0a1-4cf179f4a97f\\})|(\\{a4ef8092-6d9b-4ca2-bc6a-021fc9e8e156\\})|(\\{9fb5bfd6-27d6-4321-8af9-47b6ceacac3f\\})|(\\{3c9052cd-10e7-4ccf-9dda-8524cccf66a7\\})|(\\{da554ce8-5c96-4511-93f2-4e00a85aeb20\\}))$/","prefs":[],"schema":1559677299211,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1557027","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a7bc4a56-2f54-4791-b644-0ed2403bb9db","last_modified":1559739185033},{"guid":"/^((__MSG_name__@crx-to-xpi)|(\\{3fedc417-0513-4d15-a7e5-978d044cc9b9\\})|(\\{5c0f4cf6-b6f5-4485-a941-6c25f65c54eb\\})|(\\{5e1948ce-2889-4504-9e53-170753e731f6\\})|(\\{5fbf70b1-6dd8-4cd3-83fd-fbc53c59b7f7\\})|(\\{6ed4cb78-09ec-4a85-ad8c-d29382beb6d2\\})|(\\{6f7b3f15-30ab-40ce-9424-9a03a4969bea\\})|(\\{7d516686-2f77-4f2f-8a24-2441f9661187\\})|(\\{8c50589a-419d-40b5-8edb-4027a509725a\\})|(\\{8cf8a461-47f0-4eef-966c-faf0ae9593f8\\})|(\\{9ae1dd88-5e97-4ff4-b6a6-907689b6289b\\})|(\\{17a98bce-6b45-4c91-82ac-2916264e79ad\\})|(\\{50bf8563-c1e1-4c6d-80f8-281cd0d9f453\\})|(\\{51c03d30-c160-409f-be23-a576bf6ee2a6\\})|(\\{76a4a4cd-0bbb-4c6b-b285-d3aa4b55a99e\\})|(\\{94c8b1f5-7675-48fb-8c2b-3a8c7faa059e\\})|(\\{110b4b76-4314-4c63-9ae7-01e0e30f995f\\})|(\\{204d5f5f-d2bf-4892-a35d-e02d7436a410\\})|(\\{358af48c-726e-4853-a941-a19f9f4bcf8a\\})|(\\{02110a55-b817-49e7-bddd-5ce06d7f66e3\\})|(\\{9521b96b-f232-4689-81eb-907ba68872fb\\})|(\\{83034ff5-c83d-4560-8e6e-646862d2f405\\})|(\\{167357db-2afa-43a2-90df-ca2c6527ed78\\})|(\\{08429889-d4dd-4dc0-a607-5e26d976f376\\})|(\\{20289793-a4b4-48de-b640-672e6be44f5e\\})|(\\{a1be3447-d87d-409b-8721-d895935f65b8\\})|(\\{bf599b22-fc5d-43ac-ae24-343016cf6a94\\})|(\\{c8faeded-34a7-4eb6-8e21-407c82040ca1\\})|(\\{d8b5848f-b314-483b-8fd3-9f919f0f3b8b\\})|(\\{d768a761-3df5-4676-8cbe-5e3f4f426f6d\\})|(\\{e5d45ac7-1a6d-4ec8-89ae-d75ff07b89b3\\})|(\\{e5705290-3609-4b11-a062-6c55fd074d80\\})|(\\{ec92f712-38a6-4d81-80fb-529990a5b83d\\})|(\\{f14fbd1c-1df9-4ab3-a983-a8889f88fec2\\})|(\\{fcdb43b5-add6-49f2-a102-761147cb88fe\\})|(\\{fddfb568-5055-4dc7-ac3c-5eabc69c3c75\\})|(anhjddeakbabimdgmonfbnpbainknbfa@chrome-store-foxified--782543786)|(anhjddeakbabimdgmonfbnpbainknbfa@chrome-store-foxified-875652714)|(darktheme@addon\\.com))$/","prefs":[],"schema":1559660128156,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556759","why":"This add-on violates Mozilla's add-on policies by changing request setting without user control or consent.","name":"Malicious request manipulation add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6016087e-a255-4d70-8ffa-d7095af42e00","last_modified":1559660502221},{"guid":"{31dea008-38a8-44c5-8404-d1b110f47ab5}","prefs":[],"schema":1559648801945,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555768","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"FastProxy - \u0423\u043a\u0440\u0430\u0438\u043d\u0430"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.2","minVersion":"0"}],"id":"dc8887b5-eae3-4cc9-937f-229b8830ba83","last_modified":1559649064547},{"guid":"{4bf7c817-a8ab-4d98-b84d-65f79f05415d}","prefs":[],"schema":1559647486096,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555768","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"FastProxy - \u0420\u043e\u0441\u0441\u0438\u044f"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.14","minVersion":"0"}],"id":"96dbcd8a-d40a-4949-957b-b6eda96d0b95","last_modified":1559648801932},{"guid":"/^((\\{366bbde3-553b-4587-99d1-ce34f6b52e1b\\})|(\\{af48b3a0-a899-4722-a6b0-72ea823c9c57\\})|(\\{bc4dba63-23da-47ce-9ed5-574859c80ae2\\})|(\\{e390c529-7e38-4191-9cee-7b6902c9d833\\}))$/","prefs":[],"schema":1559647399044,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556700","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0561368d-755a-498b-a3ba-55274d9bc925","last_modified":1559647486083},{"guid":"{5a3477ec-7abe-4efc-b44a-7ede3cc02217}","prefs":[],"schema":1559563381261,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556698","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"youtube video download pro"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"94404f29-bf39-473a-a299-57d922f51c6c","last_modified":1559647399030},{"guid":"/^((jid1-93CWPmRaVPjRQA@jetpack)|(\\{3c78ca35-67af-4917-a24b-7699456ca61e\\})|(\\{8a8f48ed-3daf-41b9-88f4-73730459aaf6\\})|(\\{f906b9c7-576c-45ad-8f48-358271e15e5b\\})|(\\{de4f3cf2-cd35-4a2f-a405-33a4a29918a2\\})|(\\{7a365978-94e2-49d4-b5f7-6178dc80ed69\\})|(\\{dbc00301-7930-4421-91d8-23bf463228c2\\})|(\\{4f42055b-fd40-4b98-b71f-a58725d729d1\\})|(\\{8b6ae26a-4479-4727-bd89-46aef6f6e5d6\\})|(\\{b6a95353-bf1f-4c03-b4e5-43eca107ecbf\\})|(\\{933d68b5-80f4-44ba-bceb-2a6338c0ac7e\\})|(\\{cc9eb257-0f4e-423a-b124-318c59271a3b\\})|(\\{d0dc10cb-6b80-4e88-aec9-605d4e75ae59\\})|(\\{8dc1a829-e888-4ce5-a19e-614277de4d7a\\})|(\\{81ad5a42-34cb-4c35-b354-2306dbe418fb\\})|(\\{2fe8edfa-61ab-4257-848b-59def269a511\\})|(\\{55de894d-cfd0-4654-af30-719020792149\\})|(\\{4b9ffc29-0e02-4583-89d9-495084f96b43\\})|(\\{aa94dd9b-7d23-4776-ac2e-9939a3cf7bb0\\})|(\\{b43a0fd7-b010-42ae-a613-db7e792c995f\\})|(\\{af57625d-4b59-4028-874d-767a37bc9ebd\\})|(\\{84387d47-147e-4d50-8a3a-6e2bb4b522e5\\}))$/","prefs":[],"schema":1559562690935,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555945","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Adobe Flash Players and related add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a9526a76-d420-4adf-9a57-7096172d6077","last_modified":1559563142131},{"guid":"/^((\\{e914f532-5b99-4c2c-a6d9-56c6f9e07f09\\})|(\\{d7904110-ef0b-4daf-8fe1-1627c9cd14b9\\})|(\\{091d1ebc-55f9-4af0-871a-b3b383b70241\\})|(\\{eaf253cb-0418-4994-98cd-4fcfb5b827c1\\}))$/","prefs":[],"schema":1559562473865,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555848","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"WFot and others"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"740446f0-e16d-484d-a946-873f92d78c79","last_modified":1559562690921},{"guid":"/^((\\{3d35fa06-3f8e-457c-9ffa-a115f33e8e7b\\})|(\\{fd834065-2938-4522-ae8c-55592bf7e870\\})|(\\{d52afc01-3504-45eb-aa06-3fa55d2dc7cd\\})|(\\{2a34eba4-2a55-4863-91a6-c389d8e108c9\\})|(\\{45082e42-ceef-4df8-9f27-b5adf766ed8d\\})|(\\{8f77cfd1-6eee-4489-93d0-ae8627d8211d\\}))$/","prefs":[],"schema":1559562343779,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555481","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"BatchSerialized and others"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"10b029a4-72af-4e6a-b53a-492b94d1813f","last_modified":1559562473850},{"guid":"/^((\\{0c955fab-3d51-4989-aca5-d806cf0f2ea4\\})|(\\{1b382a66-46e8-4d33-a8a4-a857dc03cf12\\})|(\\{3f41aff5-f248-4b99-9c76-b7d192d9e979\\})|(\\{5c3d28a2-b778-4b48-9d71-da6fc2c37ccd\\})|(\\{8ef9fda9-1384-4efa-bbac-02f76f9a75dc\\})|(\\{8fd2e113-76cc-45cd-b4b0-cbef46166d76\\})|(\\{9c914f01-3e9f-45af-8d53-618ce7659d96\\})|(\\{70d353ca-2edb-4196-9294-d80cbca9ae3a\\})|(\\{79fba572-6a81-42be-abf8-92037bd908db\\})|(\\{106c67c5-a780-4076-af33-94945b16d4f1\\})|(\\{177bb2d7-15a6-475a-a34a-94f964b22731\\})|(\\{248d26ad-c8d7-4a1c-8d7e-22a36226f52b\\})|(\\{679b892e-c913-4993-bc18-1b737ac5de8d\\})|(\\{877e11b1-0725-41f9-b0e0-1b89cd88097a\\})|(\\{902b9979-3273-44cd-a717-8c55aec563fe\\})|(\\{3515e081-cd1d-482c-898a-62ade3007f8d\\})|(\\{4080f1c9-b07f-408e-9678-bdda4822f536\\})|(\\{7631efe5-237b-44e3-9193-205346744e31\\})|(\\{8157ad65-a32e-41f3-b99f-5c6f60a82d3e\\})|(\\{9434fbdd-d45c-43ee-98ac-a1c794f89c43\\})|(\\{19976dc8-c059-4058-a7b4-ba734cde798f\\})|(\\{32678e4c-b8df-4a19-91d8-3294b84ce78a\\})|(\\{773450d4-d2d7-48c2-9378-5affb64c4575\\})|(\\{894136b3-8133-432a-b46d-6f528608aa49\\})|(\\{7804268c-4d4f-44c1-a53c-2680e61b6687\\})|(\\{a12fdc00-7623-459d-8188-8e954b6f6eb7\\})|(\\{a46f0ac4-bd96-475d-bba6-2ab01575e06f\\})|(\\{c7dfadc5-8d54-4f00-bc2f-c1ba1483eb41\\})|(\\{cc89ddb5-7f2d-4b9c-bcf6-fc8057869838\\})|(\\{d7c4c15f-e91d-496d-8f78-79809c114a57\\})|(\\{d2925b02-9e1e-4b81-9a72-714a772be945\\})|(\\{dc59a997-f35a-4fa6-9ac0-40c1dce4829b\\})|(\\{def69fda-720f-4e2b-8783-93491939d9a1\\})|(\\{dfbe87b9-0fb6-41fb-a143-f8e0a47452f7\\})|(\\{f778e9f0-ea54-4264-83fb-6783906bce17\\}))$/","prefs":[],"schema":1559504489486,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556339","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keylogger Add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e57383a8-d67b-40b9-8df0-ac8a8a6321fb","last_modified":1559555647852},{"guid":"@yt-adblock","prefs":[],"schema":1559145199457,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555403","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"YouTube Adblock"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c34988ff-b712-4123-ad14-11d24d2d3a18","last_modified":1559147777278},{"guid":"/^((\\{6f35f413-21ef-4d85-96f7-64b7cccb947b\\})|(\\{7ec94ecf-7215-4cd1-a193-402c3b6e8474\\})|(\\{767e59b0-41da-4cf5-bfe1-56c8402c1ca2\\})|(\\{0770eaac-f694-49a9-bac0-39933e62862a\\})|(\\{5319ec46-b72f-4b1c-90a7-67b1b392af05\\})|(\\{7765a798-ae6b-4ea9-920d-fe7f6d07043a\\})|(\\{93927b7e-0c83-4ce8-b66e-36bb88e2551f\\})|(\\{bd6bd2fb-8614-4302-a67d-bf4f7da55e20\\}))$/","prefs":[],"schema":1559136970465,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555357","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons exfiltrating user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a8ca8b1b-1897-45b6-b12a-b64c45d8959e","last_modified":1559139447403},{"guid":"{f6bca217-8cdc-4c85-b8ae-30da228dbd71}","prefs":[],"schema":1559127564301,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555026","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Gmail checker plus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5a110749-4dbf-46c9-a6a8-56c19d6eb346","last_modified":1559136956255},{"guid":"/^((\\{cc9f487a-618e-4c48-b0a9-65f25d53c887\\})|(\\{8fcc31d3-f865-40fc-9f31-a38ab9973e9a\\}))$/","prefs":[],"schema":1559124226003,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555282","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Remote script add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c3025513-0716-4a0b-8a1b-9d5636c90f79","last_modified":1559124311799},{"guid":"/^((\\{207df7ea-6d21-4fdb-b4fb-566ae3666245\\})|(\\{e622e0a7-d0c6-4747-bf5f-fe0321da85e6\\})|(\\{8ea990c1-ea81-4aa8-8f0b-ab6ddb888bbc\\})|(\\{1f0f312f-85ae-4603-9761-4dea6a699227\\})|(\\{f9b0e524-7ccc-4392-9130-09a7c84f9730\\})|(\\{f9567a86-accf-4710-bf33-d5ff890416af\\}))$/","prefs":[],"schema":1559123848301,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555280","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keylogger add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"32891270-8ebe-41b1-b89c-9caf80944c89","last_modified":1559124225988},{"guid":"/^((\\{8fad4bef-56e9-4879-8780-ca7c18aa1171\\})|(\\{a6ce9b9f-cea4-44b6-ada5-a96c6bbf6d83\\})|(\\{a14b3807-8409-4b4d-bb16-5d1996492672\\}))$/","prefs":[],"schema":1559122494410,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555273","why":"This add-on violates Mozilla's add-on policies by collecting ancillary user data.","name":"Keylogger malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"57a3e7c7-3cf9-46a5-88ac-3f87029e4b5a","last_modified":1559122823674},{"guid":"/^((\\{5d840f65-c476-479b-a2e3-5a19b7a0a853\\})|(\\{021b8ac0-4a36-4294-8261-662d947a83d4\\})|(\\{038b50d5-8590-4479-93d2-4c07b619f402\\})|(\\{882bf6a6-47d7-47c3-8bbf-4f8fb259358d\\})|(\\{0918fee5-aee0-4e84-9613-a8b1e59dfcff\\})|(\\{90854ba5-e748-4f74-b8c2-9a6aa409894c\\})|(\\{a22263da-63d6-44fc-bdb8-381ba7e3c36a\\})|(\\{ec50f1de-0bae-4bfa-b665-59254094089e\\})|(\\{f48a449e-54f7-44fd-90f2-34a9526d5766\\}))$/","prefs":[],"schema":1559046153546,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554962","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keylogger add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6c8516bd-c427-4a7a-9f52-10c942e083a2","last_modified":1559046242210},{"guid":"/^((\\{a43383bc-1d39-4d94-b353-ceaf942c7d52\\})|(\\{0a727455-07c0-4c8b-a0e2-7853347e13e4\\})|(\\{3810f596-bf50-74e2-a47c-9894ebdc5179\\})|(\\{03ce6944-6491-4f7c-ae42-3f2a9c3f9c99\\})|(\\{3523e8cd-09e2-4442-ae13-e1d1575d4b27\\})|(\\{a08f79e0-c70f-4021-80e9-44614d5f8b5a\\})|(\\{e43b625a-f337-4cd6-b3d1-6763b5213223\\})|(\\{744c464d-4cc3-4303-b3d1-5b756144cd5e\\})|(\\{c948603c-496d-426f-a7ff-9af3d7ac1380\\})|(\\{ceaea029-439b-4d0d-99ca-a261de44d0dd\\}))$/","prefs":[],"schema":1559039806318,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554942","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keylogger add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"940f09a9-e0ba-4b98-8dd1-edb78573b62f","last_modified":1559039956017},{"guid":"/^((\\{d227e621-ef26-4b4d-b724-0138e5bb03dc\\})|(\\{ec418296-8754-46fa-a265-9856f1706f8d\\})|(\\{e64aeb61-251e-46ed-863c-b9a7c4849cfd\\}))$/","prefs":[],"schema":1559039652168,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554941","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Service Processor and others"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2ea28df4-7fdc-4571-95ba-10b61e270c72","last_modified":1559039806304},{"guid":"/^((\\{e7f0881e-39e9-4569-85b5-71b925294de3\\})|(\\{4d19382a-c81d-488a-98ac-f73484a6dd2b\\})|(\\{6d68222e-1982-4b74-9fd1-52b6a4b4c2a5\\}))$/","prefs":[],"schema":1558986099090,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554675","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Microsoft .NET Framework Helper"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2b5e298d-9dfd-4c66-ae18-1671001f4cf2","last_modified":1559039652155},{"guid":"/^((\\{59feb34b-bb64-4063-933b-d5af131da847\\})|(\\{9d84eba6-c1cb-4ec2-8b4b-b6be1ecd902a\\})|(\\{7c98044a-2ab6-481b-bc75-e2e5df6c4de8\\})|(\\{62457714-ded1-44fd-b107-b14da63a2850\\}))$/","prefs":[],"schema":1558975224053,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554740","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Youtube Downloader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a5c8e26-d7c8-4c45-91cc-d86bd1aaa0f3","last_modified":1558976967835},{"guid":"/^((\\{6f2cec94-2f78-4812-9898-1bf98d7ccbfe\\})|(\\{e8cff71e-5c43-4fd3-b63b-7b9f6c29d54c\\}))$/","prefs":[],"schema":1558959050284,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554676","why":"This add-on violates Mozilla's add-on policies by using a deceiving name and exfiltrating user data.","name":"Data exfiltration malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"98aa70f7-d993-490b-ab07-108cc5a8f38c","last_modified":1558967785430},{"guid":"/^((\\{b3c1723b-6e69-4a3d-b3f6-90793bbd6500\\})|(\\{ba38e6b7-7480-4e58-9f5b-162e83c6ece8\\})|(\\{ff08056a-a34e-44b1-bcae-805d3770738f\\})|(\\{29806031-d49c-4ef3-a37a-32ee29e5fc0b\\})|(\\{541e33f8-ec74-4311-b7a3-8baa185aeb7e\\})|(\\{d8196867-5419-450c-aee4-1e349b4b0b5f\\})|(\\{ebd7a4e7-056e-4009-bb5e-753c1d1eed93\\})|(\\{01935a63-d565-478a-9f91-9ff9aa49ce61\\})|(\\{d0e7ce73-9829-4a10-b5f2-83f8bf2c730b\\})|(\\{b70f302a-84ad-4f10-8af3-f6ea4aa327fb\\})|(\\{e5f1a2e5-798b-4915-b109-5ebbe2b57821\\})|(\\{7921669d-959a-4992-857d-f47761b5b4ac\\})|(\\{80808d17-bf74-4b91-8fa5-694c3107950d\\})|(\\{84984575-1b73-4b96-ba1c-d9959393e742\\})|(\\{20587256-b018-41c2-91fc-5a278a2837f2\\})|(\\{577f8c9b-c791-4999-9c39-1e4584f4e9d6\\})|(\\{3691584f-c3a3-4fde-8817-b2501802ef54\\})|(\\{e1680c37-e6ff-4280-8f97-943d77e63022\\})|(\\{013ae092-188d-4e95-9138-2b4d98dda7cd\\})|(\\{05e3806c-00e6-40c7-8503-9c30f3db8e63\\})|(\\{9552ab33-c43e-4338-a020-80dc3636f577\\})|(\\{8fd3c74f-57d7-4e1b-9e52-6c4517ef89f0\\})|(\\{9b0ad6aa-7c54-4655-aca5-78e973b0ebd4\\})|(\\{e648ecf7-4858-40f8-9d85-5cc5f68eae6c\\})|(\\{9430fbaf-aa5d-4492-92c2-0f1354c5c860\\})|(\\{d58bd1fd-6451-42d5-b066-4baf7d4271f9\\})|(\\{948790d7-57d3-4db1-8fc7-7ccee4abf047\\})|(\\{1b8d5392-1641-43c1-a6d6-d1429e9d4109\\})|(\\{3ae072ea-3ffc-4395-8f3c-ebe92f355c3d\\})|(\\{32f9b8a8-505a-4621-979b-b6919633f787\\})|(\\{e939e079-1e15-4491-95b3-6fb8a836e80b\\}))$/","prefs":[],"schema":1558954910531,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554635","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e454fe70-d5d7-40c0-a571-e9253d1361d5","last_modified":1558955090783},{"guid":"{19ed30e8-28ad-405a-a7e4-18a8c78b1078}","prefs":[],"schema":1558951086426,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554624","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"OpTurs"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3a3b8837-605f-48dd-8b40-a66777f45108","last_modified":1558951513292},{"guid":"{9834ff7f-e3ea-485a-b861-801a2e33f822}","prefs":[],"schema":1558813299527,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554465","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"LinkT"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b9496c5f-b37d-4b8e-abaf-509b980ab553","last_modified":1558868765210},{"guid":"/^((\\{0e9ab3be-c296-4825-aecd-3923ded051f6\\})|(\\{9f737295-e8d2-4e70-b226-8809f6b135c9\\})|(\\{68e1d557-8fc1-40e0-b197-43f8f3d36239\\})|(\\{90221614-a0b9-4301-b141-3f8a23fb4835\\})|(\\{d3255cb0-bf30-43b0-afd3-db97bfeeede4\\})|(\\{b4498268-c0d0-435c-944e-8dd6e8518654\\})|(\\{93d90a45-a10e-47df-a106-2ffeefe3052a\\})|(\\{d7b04034-ea8b-4219-ad1c-ffa061a2e0cb\\})|(\\{391772ba-a23c-4892-b30d-45d2a935be3c\\})|(\\{0b2aaa98-1f4b-483a-815f-3f864711a737\\})|(\\{2564ed8f-305b-4ade-a787-6fae696c14ab\\})|(\\{fc2fe0a7-9886-4a7e-9850-cccc2879b0e7\\}))$/","prefs":[],"schema":1558712940017,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554227","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"768bde60-2086-487f-b374-ca3fa6e712fd","last_modified":1558713145915},{"guid":"{4ee078c0-ded1-4f82-9bb1-de645e778924}","prefs":[],"schema":1558712019540,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554097","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Switch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a0508904-1f0b-4352-a5e6-a33f8fa26ce8","last_modified":1558712846698},{"guid":"/^((spp@avast\\.com)|(\\{056790bb-9676-40fb-845a-feae6dedfbee\\})|(\\{15d51e39-3ccf-4ce2-a434-dbbf1785e867\\})|(\\{2bbdf86f-3c6b-48d6-9934-9051ce5f5976\\})|(\\{2f6d1519-33b5-4970-a7ec-561f5e067ba0\\})|(\\{2fd10339-a9db-4846-bdd7-ee41cea97312\\})|(\\{31390faf-ef95-4f4b-a1a4-3c3a09dd7b5a\\})|(\\{411bfbf9-646d-401c-b87d-e77d812a68ce\\})|(\\{44e4b2cf-77ba-4f76-aca7-f3fcbc2dda2f\\})|(\\{5422d0cd-3b45-4fcd-9886-463be7e1a05f\\})|(\\{5ae5a1f8-a994-4e61-8c99-54a9fe58a9c4\\})|(\\{5d4c1f36-196d-4e9a-909b-8ad138546f79\\})|(\\{7150cd87-1b5f-41ea-b659-5cae4b753e2d\\})|(\\{78a02646-2bf6-417e-9498-32f29a4ef89a\\})|(\\{7bdac7a1-be1d-4ecd-8cf1-a1db64adfaaf\\})|(\\{80686e70-c06a-4ab3-b7bf-fd4c05985c1b\\})|(\\{83830f14-c5d0-4546-af99-cbaba3ab832d\\})|(\\{869a5e06-732e-4635-8da3-90a2802f9c80\\})|(\\{87ea875a-396a-4c7b-b202-cecd5a4fe0d4\\})|(\\{94847025-c5a9-4dd7-83df-54c17b79eeb8\\})|(\\{992e4d3d-f56b-4f71-b826-0dd976681228\\})|(\\{a259d36e-9c24-4216-8b28-d3e83c07a832\\})|(\\{a669b31a-3a2b-4c75-838c-a8542f77c79f\\})|(\\{af35bf73-7d25-4286-9be6-fa822818ac82\\})|(\\{b01f0319-b398-4a6e-b9c9-e59e2d99eee7\\})|(\\{c516baf9-a911-453e-be0e-26389cfb33ac\\})|(\\{c88fc74d-31b5-40d4-bb8a-008f2d7a1ea0\\})|(\\{ca6b87f3-2d8b-49ea-9627-95e900c5f108\\})|(\\{cdc01730-6108-4581-b5da-36f7fa8e3d2e\\})|(\\{cfbbd54d-26dd-4f20-b0c9-26b2d920bc04\\})|(\\{d384c2ef-9e42-4dfa-bba5-73b9b6ad2e61\\})|(\\{d7ef08b6-ef77-43b6-ad60-74ea67495674\\})|(\\{dec788dd-9a21-416d-91c7-bf79250cab04\\})|(\\{fb182266-3336-4dcb-8898-859affe73e7f\\})|(\\{fe17e98b-1ed8-45fe-a6e5-8280902d2500\\})|(\\{febfdee8-5724-4aea-8b70-6be9e22248fc\\})|(\\{ff471567-6ff5-48d9-8db6-d2c9134f0aed\\}))$/","prefs":[],"schema":1558674107244,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554004","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Keyloggers and Fake Anti-Virus or VPN add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3b36e078-7c88-411c-9366-033ac185c66d","last_modified":1558711200727},{"guid":"{e256d52b-d9ae-4709-aa9f-ba4d1eb1b284}","prefs":[],"schema":1558637428118,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553531","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Reading Cursors"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4b943d8a-828f-45d2-b8e7-f16e6c3f860c","last_modified":1558637573461},{"guid":"{7d3c46ed-b9f7-497e-bccc-e6d878032d14}","prefs":[],"schema":1558636256156,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553746","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Zoom"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1282ea00-9aa1-47c6-9a93-4fc17aa4fcc4","last_modified":1558637428108},{"guid":"{cc02a70f-0610-456c-bc5e-5eefb6716904}","prefs":[],"schema":1558636068339,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553761","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"headingsMap"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"37c5c7d6-e0ce-4c6b-8c89-49d94b6fe159","last_modified":1558636256148},{"guid":"/^((\\{5768d1b3-4e2d-4088-bd65-c7a62353ea3a\\})|(\\{65b99c4e-a9bb-4bb9-913d-503fa9bcdc46\\})|(\\{31ebd11b-bb60-403b-94a9-e09a3bf7d64f\\})|(\\{571339cd-9f45-47be-9476-767a62cb6c97\\})|(\\{ed4f9665-1851-4398-ab15-46c5e3ab8fac\\})|(\\{972319b8-8dd8-4ed0-8de2-9bc6582f0560\\})|(\\{4a0d8618-3e21-4bb8-8ae3-d04316b55a1e\\})|(devlopper61@avast\\.com)|(\\{8df3e056-6d4f-42fa-b0ad-40ee9a79d9c4\\})|(\\{e7e68020-07de-4f9f-9aec-6df29e9f64b8\\}))$/","prefs":[],"schema":1558635731472,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553857","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Easy Screenshot, Youtube Download*"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7f8e7584-6c6c-4579-882a-6f6ed21766dd","last_modified":1558636068330},{"guid":"{b19d065e-4460-4714-9208-3f2b38907522}","prefs":[],"schema":1558537447980,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553521","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"QxSearch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"60311c2e-044e-4e24-9abe-6ee75d7f5467","last_modified":1558537465968},{"guid":"addonfx@horoscope-france.com","prefs":[],"schema":1558537035045,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553518","why":"This add-on violates Mozilla's add-on policies by overriding search setting without user's consent or control and executing remote code.","name":"Horoscope France"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ec32be61-2646-4686-9829-7cff21f5d1f8","last_modified":1558537447957},{"guid":"{65dc18e1-109f-4039-929b-f8a7a29be090}","prefs":[],"schema":1558536906311,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553517","why":"This add-on violates Mozilla's add-on policies by overriding search setting without user's consent or control.","name":"Magnif)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bf7a8bf0-e60e-4516-9e93-777c19509ef6","last_modified":1558537035028},{"guid":"{3fc1db2b-e7db-4512-b24e-1faf4d3a1b4d}","prefs":[],"schema":1558536030188,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553479","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"quikaxes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"43966df2-e95c-415b-bffc-13814e1d2b11","last_modified":1558536765550},{"guid":"{a37a7625-b64e-45f3-8b79-f71634f14438}","prefs":[],"schema":1558467699805,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553326","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Lift"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7e86024e-5621-4ded-bc16-184f94fa2e29","last_modified":1558528706505},{"guid":"/^((\\{3e20d1e2-a7ee-4ce2-ab9c-51c8300a8ff6\\})|(\\{30906bbc-0942-445b-89c8-f74dac0edb8f\\}))$/","prefs":[],"schema":1558382009200,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553071","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"Amiri"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9c5f5681-8547-4e65-9c05-5796e483b8e1","last_modified":1558434518612},{"guid":"/^((\\{ec19994c-c5a5-46d9-bd4d-0fc417c6f4b8\\})|(\\{a0be7e8d-b0a3-460b-8a52-429c79e49ee2\\})|(\\{1814dd58-4147-4cca-a0a3-c5aa35966d9c\\}))$/","prefs":[],"schema":1558381075651,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551937","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Inspiring Quotes + Daily Quote Tab + Pug Extension"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"efecef61-549b-4c13-8a52-394c636dd24b","last_modified":1558381320379},{"guid":"{dc6176c4-a192-4a92-849f-ad13abe889ad}","prefs":[],"schema":1558379927394,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551934","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Easy Speedtest"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a5fa8f77-7761-4996-a11d-d8cf723103da","last_modified":1558381015030},{"guid":"{ac4be7d1-4db6-4b4c-bf48-e345350bcb59}","prefs":[],"schema":1558379796996,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552830","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code and exfiltrating user data.","name":"Browser type hider"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"41137e55-8a11-4259-a009-42c29daadf17","last_modified":1558379927382},{"guid":"{da993d54-9605-42f7-a32f-9f565245070c}","prefs":[],"schema":1558362750147,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552834","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Adblocker"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2212748f-ad60-497f-af7b-50d20b326e40","last_modified":1558379796981},{"guid":"/^((\\{2b3eed60-8f6e-4afc-99f1-38d12f4253da\\})|(\\{3a6f9dac-3a93-4f6f-8b74-9ebc0f501306\\})|(\\{46bba8e9-7a75-4dd6-932e-bdd74141cb87\\})|(\\{4b480ab6-b63a-43f8-b4f4-d312972ab086\\})|(\\{6106687e-ca0c-4d7e-93bc-115929e4d299\\})|(\\{717ce133-3c0a-448e-b6ed-fc7d22b76534\\})|(\\{7224f1ae-c342-4bb5-8441-d324a8951624\\})|(\\{768e9638-2eba-42e4-a13a-4f3f1df391a2\\})|(\\{7b655f43-c871-46d2-8f6d-31989e8ee939\\})|(\\{7e46c692-9488-4671-8c39-7830f92628b0\\})|(\\{83bc6b56-545f-4ba1-a80b-f82d55cc0f68\\})|(\\{970a774e-b7a7-498f-b3f2-d88b14b4dab1\\})|(\\{9d2e8731-3287-46eb-9c19-ece63fe693c7\\})|(\\{a37ccd20-e04f-4949-b055-98ca58639606\\})|(\\{af85f82c-3e8f-4ee5-ab53-b8d3aaac34ec\\})|(\\{b35c6d47-8b07-4d49-89a9-dfe8c10f58f6\\})|(\\{c2485579-368c-4593-a1cd-985b2fa0b990\\})|(\\{c85c16ba-78b4-41b3-9201-f80fa662c52f\\})|(\\{c97e5535-6f2e-4d34-a5a3-0e6e07f7fd13\\})|(\\{ce7db166-9564-482f-91d9-3a450ec3216d\\})|(\\{d64a2c73-ff21-4e3e-998f-ec2dc42ad725\\})|(\\{db6d93c3-67a0-410c-b7bd-f72f267f0cec\\})|(\\{e513775f-359f-47aa-a3d9-eddc946aabe0\\})|(\\{f70258e4-643b-4ec2-9c84-de89009eec61\\})|(\\{f8794e87-82b2-4df4-bce6-db207f62c165\\}))$/","prefs":[],"schema":1558349836861,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552847","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0225ae55-626d-42b2-8f48-46ec95ec89f8","last_modified":1558361121954},{"guid":"jid1-HfFCNbAsKx6Aow@jetpack","prefs":[],"schema":1558343683249,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549020","why":"Versions up to 2.9.1.0 of this add-on violate Mozilla\u2019s add-on policies by executing remote code through the native messaging host.","name":"SConnect"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.9.1.0","minVersion":"0"}],"id":"413065ac-176f-440d-b4a7-0f928f3e330d","last_modified":1558349549359},{"guid":"/^((\\{78d3cced-d2a7-46e9-9fea-5be7ed61eea8\\})|(\\{3233777f-a1a7-4ea4-8c2c-fba1a0a68383\\})|(\\{0eb43948-2a3d-4490-b32d-7ca37dd83f07\\})|(\\{64fd625d-2977-46a6-96ca-77f81ebfd54d\\})|(\\{6e138cae-1be3-449e-a964-b3c3060d89b9\\})|(\\{f875c255-8b92-4229-95e1-6d9adaf20dd7\\})|(\\{3c62ef7f-ae8f-4baa-9d2d-27a377480b79\\})|(\\{35a91fe5-c255-498b-9f9f-bec506fdb257\\})|(\\{7d3c52e6-2b7f-4ce8-b28b-032306fe32df\\})|(\\{0ecf6f68-d506-4239-bc69-f77de8f03758\\})|(\\{7290f2b1-3d70-4990-a828-40c775c05f82\\})|(\\{50150580-86bc-460f-ae3a-12e51b9d842e\\})|(\\{a1b46cda-8a83-48e0-b355-7eca4250694f\\})|(\\{614d8f88-b5b4-4897-adc0-0207613f4d4f\\})|(\\{ddc259e9-3738-4b18-a00c-9259dad206ae\\})|(\\{5b2bf836-5322-4161-82dd-fcc8ac6e4247\\})|(\\{97a90c0a-5e3d-47bf-aacc-230e4cb1f2d1\\}))$/","prefs":[],"schema":1558341490879,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552764","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Search overriding malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4bda902e-fb36-417b-940f-992ab7a18fde","last_modified":1558343652556},{"guid":"{3241efcf-4bfe-4405-ba7e-029d3efb03bf}","prefs":[],"schema":1558341442463,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552681","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Neat"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"657d264f-23d2-40f9-bac3-1d7c8b5d8453","last_modified":1558341473815},{"guid":"{c4da221b-461a-4ed9-b2d2-6ef1842a94bd}","prefs":[],"schema":1558341410023,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552639","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Dimensions"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f48c8fe3-70c4-4d9e-84f4-79aeee9970f0","last_modified":1558341442447},{"guid":"{72a6bcef-d0ce-49f5-9773-1b78265174a2}","prefs":[],"schema":1558341352074,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552306","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"YtDow"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d4ab989c-1517-493b-9486-f0c4a59a1c95","last_modified":1558341410006},{"guid":"{ad6f5b9a-c894-4d15-8c65-4b0f5a29503c}","prefs":[],"schema":1558341285260,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551964","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Magnif)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f7135e2e-249f-45d4-bfe3-88b834ddb636","last_modified":1558341352061},{"guid":"{ad6f5b9a-c894-4d15-8c65-4b0f5a29503c}","prefs":[],"schema":1558313782700,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551903","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Top Scroller"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fdc0d028-2915-4130-a19c-c5819b3acc81","last_modified":1558341285245},{"guid":"websurf@mizilla.org","prefs":[],"schema":1557871049351,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550673","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Websurf"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a2b8447b-ea50-45bb-936a-64d790ebe448","last_modified":1557871228984},{"guid":"{d8f707bf-0a35-462f-8e4d-f90205770547}","prefs":[],"schema":1557870872432,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550689","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"STPs"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"be42b13c-301b-4304-a1ed-89b4c13d9eb2","last_modified":1557871049337},{"guid":"{0b66e692-1991-4b46-89df-c8101925bad1}","prefs":[],"schema":1557870310029,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551079","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Base6"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a308009d-3320-49af-b0b8-1174f5a25fe6","last_modified":1557870872418},{"guid":"/^((\\{198586f6-9fdc-4ce6-8f21-7bdd85eab432\\})|(\\{1cd349e4-1d52-46ec-b648-6da8ba2ef659\\})|(\\{28c26373-1066-4cb5-8e92-1926cb31f83c\\})|(\\{2b99ea1d-9e25-4005-adeb-2fc9fc6700fc\\})|(\\{2be44a2e-f432-4527-a249-f7a6aecc8464\\})|(\\{2eda700f-8674-43fd-842f-73289b6e317f\\})|(\\{3745fc58-1413-4029-aea4-e1aa8a2c0cad\\})|(\\{3c19f6fc-1b86-411c-8d9a-7fdde31600b2\\})|(\\{450f8d34-b065-46a6-bd9f-ee7f614d750b\\})|(\\{498e999a-2d6b-47e7-8da2-97e0f694f6ff\\})|(\\{56862943-b999-45ef-be94-b97211126ba4\\})|(\\{5dc4633d-2c01-4d8d-8980-a90055d0679c\\})|(\\{77101ac4-6fe7-43ed-8362-75ad2a4b3299\\})|(\\{83ae749b-9ab3-41f9-ba8a-f73470399abe\\})|(\\{8ef68e62-a602-477c-95c2-9b861f91e813\\})|(\\{b81c02f0-e563-4794-8fd3-18a65b0f35fe\\})|(\\{c03bf205-6673-4495-abd7-f12556d3d8ce\\})|(\\{d1e8be12-c4e4-481b-9be1-400f54257dfa\\})|(\\{d3f73060-8ca3-4c24-b389-6a896f43f538\\})|(\\{e5e98141-81c0-433d-ade2-4174ea951243\\})|(\\{ec6ff98f-7315-4cfb-88b9-e6a64bb97ef6\\})|(\\{ee765c0e-cf70-426e-ac5d-704c874202af\\})|(\\{f8a4dc88-e967-4c75-acb3-6176ab166bf4\\}))$/","prefs":[],"schema":1557849229557,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551093","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8436c1bb-43f2-42d6-acec-05145fdbeccf","last_modified":1557870310012},{"guid":"{61121092-5257-4607-b16a-12364832f0e4}","prefs":[],"schema":1557835907235,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551260","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"Page Image Previewer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dbd3690c-2ce4-474b-b13d-97f9ab2c54c5","last_modified":1557835935826},{"guid":"/^((\\{2e510835-3d3c-4995-ba75-2eee6ff203c7\\})|(\\{bc72fefd-ab07-40ce-8555-45f9b23ef8c0\\}))$/","prefs":[],"schema":1557835858186,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551259","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9ced28d2-c4bf-4933-b369-1ded1ca7f6dc","last_modified":1557835907221},{"guid":"{4037503e-7401-4ccf-8fc1-af9f8c9fc168}","prefs":[],"schema":1557835817321,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551243","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"APKCombo"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"abc5acc2-c9ea-4d44-b8ab-3fefb5723194","last_modified":1557835858172},{"guid":"{52484281-3051-4c52-9309-83896b989ddf}","prefs":[],"schema":1557835777799,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551162","why":"This add-on violates Mozilla's add-on policy by overriding search settings without user consent or control.","name":"Fppl"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"73b95004-eb42-428b-852b-3671edbc3913","last_modified":1557835817308},{"guid":"{3555a8e7-6fc1-4ad8-9e35-b09877d94a8c}","prefs":[],"schema":1557776499103,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551080","why":"This add-on violates Mozilla's add-on policy by overriding search settings without user consent or control and executing remote code.","name":"Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a941e00d-4ec8-41db-ac90-75041af68a3b","last_modified":1557835777786},{"guid":"/^((\\{da61a3e5-5a98-4c47-ae6c-f4db738f1133\\})|(\\{b0e13c2b-c1cd-426b-bed9-905bf9557fbf\\})|(\\{328c22c5-5f1c-4eb7-95a3-148fd4ad429d\\})|(\\{f6cca5fb-5aa1-471f-88f3-e2ffa87281ef\\})|(\\{d342bf37-554e-41c9-b67b-72769e59b82b\\})|(\\{03ec69b5-3e8e-4bb8-8eda-28f12c54bff8\\})|(\\{a8c876cb-af13-4ad9-9a86-fc3c0722b48c\\})|(\\{56136c32-0159-4368-9d28-c1b8b1515c89\\})|(\\{79bf4660-9729-444b-ae03-6c8005869611\\})|(\\{aa7fdaa5-d888-47e2-b27b-4fa4b3225339\\})|(\\{31e0d180-52b1-4c1d-8f84-7e625715edc4\\})|(\\{f7d20549-e5ee-4045-9e8f-9705bb10c104\\})|(\\{303abacb-760b-43c3-9640-5b456d92db78\\})|(\\{debabd67-2e0a-485e-8213-ac081065a027\\})|(\\{971e739b-c528-41b6-a60c-48fc3cdb52d9\\})|(\\{ffb3a485-2723-4a88-b3ad-8b29773759c4\\})|(\\{b076177a-a5c4-4652-9f6d-953f89f9a81a\\})|(\\{66210cb7-6352-45d5-9d22-ad7a0fb5e247\\})|(\\{8053ad7b-5129-4c74-ade9-8166c38e8636\\})|(\\{1a435c36-133e-4163-ac71-8701a147880c\\})|(\\{8c40c6df-7c9d-4876-bcbe-0621734aba45\\})|(\\{40e1e7d9-ae29-4aec-9465-5e0d49859583\\})|(\\{74eab03b-35cd-4950-b436-7afce3876e58\\})|(\\{95839c11-63a7-4b2b-b3d3-eee9d2c5c42d\\})|(\\{bfaa03c3-744e-48eb-8fb6-4ad61791d4d8\\})|(\\{f123e726-9396-4899-822a-172b8bcb2c5f\\})|(\\{157e255b-2053-4140-b95c-ff003b62bf17\\})|(\\{3e49a17b-b58e-417b-9ebb-a7e8c2317893\\})|(\\{4df1d536-e30f-4344-bee6-6ef2def890c2\\})|(\\{f33ce070-63f4-4d2b-823e-d52fc7a30ba7\\})|(\\{2003e2a5-e848-4fc5-8e7d-3af1efe4f992\\})|(\\{ff2157da-6981-40b6-aa60-d8125e73868e\\})|(\\{d89fa1e5-c9d4-4104-ad8e-00b39e5c6d15\\})|(\\{66e45d14-550f-4489-98c6-8a0caed33375\\})|(\\{86e6d45f-1dfe-4e53-bf52-22bf65b9ae6d\\})|(\\{e71407fe-e1ed-4755-af8f-dd64a952ce1a\\})|(\\{b67b3615-d8fe-4961-a41e-391864afde2d\\})|(\\{5785789b-ccba-44a1-9018-1135b56bd37f\\})|(\\{6dfb93d1-2add-471c-bbbc-b6164b4c1d94\\}))$/","prefs":[],"schema":1557495790401,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550581","why":"I\u2019ve reviewed the add-on and confirmed that it is collecting ancillary user data, violating our policies.","name":"Adobe Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fee4b92e-146b-437d-9cc0-95cfc800f0e0","last_modified":1557497630665},{"guid":"jid1-NIfFY2CA8fy1tg@jetpack","prefs":[],"schema":1557437285372,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547789","why":"The $rewrite filter functionality allows for remote script injection under certain conditions. Please upgrade to the latest version of Adblock for Firefox to resolve this issue.","name":"Adblock for Firefox ($rewrite filter)"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.28.0","minVersion":"3.19.0"}],"id":"8ff19ad3-e4e0-40e3-8f02-fd80d18f63b5","last_modified":1557437486195},{"guid":"{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}","prefs":[],"schema":1557437276676,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547789","why":"The $rewrite filter functionality allows for remote script injection under certain conditions. Please upgrade to the latest version of Adblock Plus to resolve this issue.","name":"Adblock Plus ($rewrite filter)"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.5.1","minVersion":"3.2"}],"id":"f0fc8d21-d0ec-4285-82d7-d482dae772bc","last_modified":1557437285359},{"guid":"{2b10c1c8-a11f-4bad-fe9c-1c11e82cac42}","prefs":[],"schema":1557437241208,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547789","why":"The $rewrite filter functionality allows for remote script injection under certain conditions. Please upgrade to the latest version of \u00b5Block to resolve this issue.","name":"\u00b5Block ($rewrite filter)"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"0.9.5.14","minVersion":"0.9.5.11"}],"id":"12a0c69f-e755-428b-97dc-229bccb8a5b0","last_modified":1557437276663},{"guid":"/^((\\{4e84c504-10e8-4e75-8885-dcc0c90999b9\\})|(\\{8ce99d6d-8d0d-4420-bd17-c303bd8a763e\\})|(\\{16de314a-56cd-4175-9baf-bbe0b09dfed3\\}))$/","prefs":[],"schema":1557434135180,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549744","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Secure Privacy + Trustnave + Fastwebnav"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"04a300c2-04fc-401e-a428-c7c887bf2bff","last_modified":1557434278943},{"guid":"{5308dcd8-f3c7-4b85-ad66-54a120243594}","prefs":[],"schema":1557433916783,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550428","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"F_Feed"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"312e30b0-0b4c-4a43-8f6c-8b8447a20f6a","last_modified":1557434135166},{"guid":"/^((\\{c8d0fea0-d7b7-4f6f-b9bc-9df6722d9d18\\})|(\\{bed8e1f2-b00b-44e3-8cf0-5335080d0003\\}))$/","prefs":[],"schema":1557433212304,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550435","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Webplus+Fastnav"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b9686c72-1902-4868-88d1-6587fd24a57c","last_modified":1557433916770},{"guid":"/^((\\{d389cdfe-843e-44cb-b127-441492e46e63\\})|(\\{1340c760-3f4c-4428-b2c0-88821a84de2b\\})|(\\{38524a16-a73d-4a8f-8111-f9347bb5266c\\}))$/","prefs":[],"schema":1557258104673,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549740","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2feeb46a-6784-4c6e-8c07-e120bec00b14","last_modified":1557394160484},{"guid":"/^((adsmin@vietbacsecurity\\.com)|(\\{efdefbd4-5c30-42c3-ad2b-4c49082ec4cd\\})|(\\{63d83b36-a85c-4b51-8f68-8eb6c0ea6922\\})|(\\{4613a1ed-6cb1-410b-a8b1-3f81f73b6e00\\})|(\\{90b1aef7-7a52-4649-b5ca-91b5e81b5eab\\})|(\\{d6e2e76d-edff-416b-8c04-53052ff9fec7\\})|(\\{43af2e0f-b5ce-409b-9ee6-5360785c9b08\\})|(\\{e45fa96d-8b74-4666-86de-3bbfb774a74f\\})|(\\{4f8332b6-6167-4b7f-a1f9-61d8eb89b102\\})|(cpcnbnofbhmpimepokdpmoomejafefhb@chrome-store-foxified-14654081)|(developios89@gmail\\.com)|(\\{d82da356-1fa8-4550-958a-bd2472972314\\})|(\\{1dfbd1c3-a8ca-4eb3-8747-d30bfd20ecd5\\})|(\\{6f9fa22a-128f-4d1b-8ef5-d20a44d24245\\})|(\\{5f6af572-35c1-44d7-9d0f-dffbb62fcafe\\})|(developper@avast\\.com)|(\\{886a6486-37b3-4bcd-891b-fd0e335e7b1a\\})|(\\{886a6486-37b3-4bcd-891b-fd0e355e7b1a\\})|(\\{d1cd26ff-fde7-46a4-85cc-48e3bb7e9e8d\\})|(\\{ae11d5cc-8efb-43a0-89bf-e5a779b4fa40\\})|(\\{aca140ce-8249-4e6e-8e2c-cd5b1c987441\\})|(\\{f68b2ca7-0d2c-44cc-afc8-a606a896c467\\})|(\\{321db3c3-8cfd-49f1-99de-fcdc3485b379\\}))$/","prefs":[],"schema":1557222463147,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549558","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b62c9ee1-d66f-4964-906e-2a9b07e3fdc1","last_modified":1557222511299},{"guid":"artur.dubovoy@gmail.com","prefs":[],"schema":1557162612874,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549444","why":"This add-on violates Mozilla's policies by executing remote code.","name":"Flash Video Downloader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"16.3.9","minVersion":"16.3.5"}],"id":"d7ca07b4-9c97-4f49-a304-117c874ff073","last_modified":1557162636319},{"guid":"{93d460ee-879f-4d8f-8599-a1c69ed59ec2}","prefs":[],"schema":1556912498785,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549069","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Browser Security &Adblock"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"95cfb43b-72c3-4fb3-a0f2-fc975aff398d","last_modified":1556977392946},{"guid":"{fc4c96b2-4eaa-4221-86a6-392dc1eb919a}","prefs":[],"schema":1556797012258,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1548536","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"AspectResolver"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3f6acc8a-f46c-42cb-8220-48c2e5885bd3","last_modified":1556808070195},{"guid":"/^((premium-enhancer@ext\\.com)|(notif-rm-unlisted@ext\\.com)|(search-updater@ext\\.com)|(updt-lite-unlisted@ext\\.com)|(coldsearch@ext\\.com)|(reader@ext\\.com)|(local@ext\\.com)|(fptool@ext\\.com)|(gflash@ext\\.com)|(advplayer@ext\\.com)|(yfp@ext\\.com)|(ytbenhancer@ext\\.com)|(yoump@ext\\.com)|(floating@ext\\.com)|(ytbhelper@ext\\.com))$/","prefs":[],"schema":1556792823258,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547311","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Various fake player/search add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9efe3274-2bd2-44a3-aa7f-92934581470b","last_modified":1556794746654},{"guid":"{a38141d9-ef67-4d4b-a9da-e3e4d0b7ba6a}","prefs":[],"schema":1556787949626,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1548473","why":"This add-on violates Mozilla's add-on policies by changing search behavior without users consent or control.","name":"ReStyle"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b0ff609b-c98e-4d29-8323-61c3e064ec9c","last_modified":1556791242742},{"guid":"{0beedf0b-dc79-48bd-adff-2ed36acdb806}","prefs":[],"schema":1556787897696,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547930","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"71475499-ca6f-4b71-8bef-2b95cf59ee30","last_modified":1556787931409},{"guid":"{c11adb01-56bc-44d6-ac05-6f364e2afe01}","prefs":[],"schema":1556787838618,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547934","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e6371474-8681-4498-8e89-421f25fd2e12","last_modified":1556787897686},{"guid":"{a1f6fa05-26cd-4399-a97a-7996067d04b0}","prefs":[],"schema":1556739699995,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1548134","why":"This add-on violates Mozilla's add-on policies by changing search behavior without users consent or control.","name":"TC"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3659d4a2-3121-45cd-b8b6-5b2c96ebc17f","last_modified":1556787838607},{"guid":"{c65b18e1-cd3d-4773-a901-15a0753e7d81}","prefs":[],"schema":1556224830338,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1546994","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"PrincipalInterceptor"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"af62a050-b136-4d56-ab3a-af85a2510bc4","last_modified":1556224874229},{"guid":"{4bf110f8-5f50-4a35-b7fa-64228bfa2d0b}","prefs":[],"schema":1556224790813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547048","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Predicate Property"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5968da82-1d7e-407e-bf93-5d2247ce55c1","last_modified":1556224830329},{"guid":"{0bd4e0af-664d-4273-a670-7cb3d0b5a4a5}","prefs":[],"schema":1556224295744,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547046","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"ConsumerWatcher"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a6cc6fb-dce1-49cd-b624-7b44afacf157","last_modified":1556224790803},{"guid":"{bbddf452-1a72-4a5d-a833-0416ac7fd76f}","prefs":[],"schema":1556197615318,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1546989","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"AV Scanner (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"20c25379-aed8-4ab4-9e7f-f2d3f5d948a7","last_modified":1556206274610},{"guid":"/^((\\{1601769e-0b0d-4c43-97a7-723ce374996b\\})|(\\{d714118b-5cdd-4829-9299-1066fecc0867\\})|(\\{e8671db6-24be-4744-808c-a63fb744ccca\\}))$/","prefs":[],"schema":1556133515829,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1545834","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"XPC and Tabs"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1b536121-fd82-4639-bc70-30d7060e42d3","last_modified":1556133806451},{"guid":"{3f5f741d-a980-4b58-8552-b1ae328841f4}","prefs":[],"schema":1556099103820,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1546480","why":"This add-on violates Mozilla's add-on policy by intentionally weakening website security and adding fraudulent content to web pages.","name":"Google Translate (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ae288e5e-78d5-4b49-8b4d-fa9f25c3baa2","last_modified":1556112119390},{"guid":"{3fab603e-3ee1-1222-a859-5f85a3441216}","prefs":[],"schema":1555527937277,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1545213","why":"This add-on violates Mozilla's add-on policy by overriding search behavior without user consent or control.","name":"Add security (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"74ad8c8b-a65a-470c-aa2f-ca14e1e8774d","last_modified":1555528639011},{"guid":"/^((\\{880cacfe-5793-4346-89ce-fbbd368d394c\\})|(\\{f0780038-50b9-11e9-9c72-4ba2d8f2ec9f\\})|(\\{22ffe411-2b0e-11e9-87f9-c329f1f9c8d2\\})|(\\{cf4bae43-026f-4e7e-a85a-952a7ca697a1\\})|(\\{17052516-09be-11e9-a008-03419f6c8bc6\\})|(\\{333fb3de-18a8-18e8-b6d3-e73213911efb\\})|(\\{aa4abac2-1ffa-12aa-bbdd-9305cb2c1254\\})|(\\{72222e70-2fd6-11e9-956b-27f7787b8d2d\\})|(\\{637212d8-3484-11e9-9812-005056b22b42\\})|(\\{4a222e60-31de-1eca-8476-37565daf6afb\\})|(\\{7fc6d222-48d5-11e9-b586-17e94c73a1b1\\})|(\\{e111c358-121b-13fa-bf23-bb57da32d184\\})|(\\{9674445c-8dff-4580-96b2-99442a7ae9af\\}))$/","prefs":[],"schema":1555525532852,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1544315","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"Various"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cbd7444f-e62a-4639-b172-845548b6d4a7","last_modified":1555527929174},{"guid":"{674fff65-6cd0-488a-9453-fb91fc3d7397}","prefs":[],"schema":1555406446874,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543924","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Assistant"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8aff4cb0-4d5f-4e74-8db7-b04f616c3b60","last_modified":1555503879816},{"guid":"{40cd7fd2-a3e4-43f9-9d86-0e0a70376203}","prefs":[],"schema":1555184501005,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1544268","why":"This add-on maliciously injects remote code for execution.","name":"Scan Tech"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"881d3476-f18a-4560-b065-cded406783d2","last_modified":1555228377222},{"guid":"{8ee8602c-aba6-4e2a-9faa-1724c3f4f9ba}","prefs":[],"schema":1555102738661,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1544205","why":"The add-on is maliciously loading remote code for execution.","name":"Service Proccesor"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"94621e2f-28a0-4b18-97c6-5f6203f5912e","last_modified":1555161086175},{"guid":"{d8b03707-e39f-4b17-8e56-56354fb14af5}","prefs":[],"schema":1555100104657,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1544103","why":"This add-on maliciously injects scripts, violating our policies.","name":"Interruptible Observer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3a921aa8-d44a-4272-be63-0fd102577f59","last_modified":1555100575898},{"guid":"{132cb2fd-a6ae-45d2-84cf-b48d591f037d}","prefs":[],"schema":1555099951278,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543922","why":"This add-on injects remote scripts and overrides search behavior without user consent or control. It also masks as an add-on with a different purpose.","name":"Player"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"371796e4-387a-4dd0-9ddc-47ba1dd85be7","last_modified":1555100104648},{"guid":"H.264.Addon.Test@firefox.com","prefs":[],"schema":1555099832659,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543919","why":"This add-on exfiltrates user data without consent or control and may be misleading the user into believing this is an add-on by Firefox.","name":"H.264 Video Codec Fake"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"53ef1aad-7bdb-4f4e-8d46-55d6ec2d78ab","last_modified":1555099951269},{"guid":"{608f71eb-5bd6-45d8-bc93-b9e812cf17b7}","prefs":[],"schema":1555099501294,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543801","why":"This add-on maliciously injects remote scripts, violating our policies.","name":"Consumer Tech"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ea00841e-8dc2-4e11-9119-7a599e47d800","last_modified":1555099832650},{"guid":"/^((\\{8220ccaf-15a4-4f47-a670-a4119a4296a4\\})|(\\{9da72c11-44d7-423c-b19c-c75cd6188c3e\\})|(\\{99d0e4d0-c5ef-4567-b74c-80c5ed21ad99\\}))$/","prefs":[],"schema":1555011689511,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543848","why":"This add-on violates Mozilla's add-on policy by overriding search behavior without user's consent or control.","name":"Search overriding add-on"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"03554696-58fe-4b90-89d1-72b72f88f82e","last_modified":1555069748234},{"guid":"/^((\\{b37f383f-e60f-4eb1-ac0f-9147e0e8f2f7\\})|(\\{8ad567d2-3fe2-446b-bce9-a3acbe878dba\\}))$/","prefs":[],"schema":1554997740201,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543673","why":"These add-ons are overriding search behavior without user's consent or control.","name":"Hash"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"036e2e7d-5403-49be-92cf-b5187ceef7ec","last_modified":1554997910212},{"guid":"{be6ab6a9-7004-4c5c-8df9-8d36122d8b14}","prefs":[],"schema":1554997613727,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543705","why":"This add-on injects remote scripts with malicious intent.","name":"asin"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6fd3ab94-8e38-47f3-b129-3ca8396d0a22","last_modified":1554997740187},{"guid":"/^((\\{61f433aa-45fd-42a9-9c90-c1d7820661d5\\})|(\\{86cd46b6-433a-439c-bff2-722846709f44\\})|(\\{98e126a4-4e70-4300-b893-3b2cca19bc9b\\})|(\\{8f42dc3a-1c46-4fc2-8c7f-dd76a63b1cf7\\})|(\\{a24d3582-2fc2-475c-8440-335736e17c6e\\})|(\\{cf0b5280-cd08-465d-ad7d-70308538f30a\\})|(\\{936f3c79-5dc9-4694-bca8-47932de3357a\\})|(\\{e48d5888-8736-4858-83ba-e816378ffef8\\})|(\\{5305f89c-ceec-4217-8bae-c9c376c7462b\\})|(\\{a2ac47e5-d225-4718-9b57-18a932f87610\\})|(\\{79f60f07-6aee-42cd-9105-c0a52f401316\\}))$/","prefs":[],"schema":1554981266268,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543664","why":"These add-ons exfiltrate user data while masking as a legit add-on.","name":"Adobe Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fc38e782-d55b-4fb7-8f9c-374aa18af09c","last_modified":1554997613713},{"guid":"/^((\\{0913599d-3094-44a7-8cc2-b8467d5afc7c\\})|(\\{7bee7f1b-d8ad-424d-807d-e69e6634988e\\}))$/","prefs":[],"schema":1554898779160,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543462","why":"This add-on violates Mozilla's policies by exfiltrating user data without their consent or control.","name":"Malware exfiltrating user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0d86ba71-7baa-4cb3-b3b8-da4ccdfa36b9","last_modified":1554976164809},{"guid":"/^((\\{9946bf2f-0aef-4040-bc57-cdae2bde196a\\})|(\\{d511784e-d088-4fce-b77c-14c186f08641\\})|(\\{fe59312a-97bd-4ca7-bce3-b0db95b1e251\\}))$/","prefs":[],"schema":1554897771015,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543118","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without user consent or control.","name":"Invert (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ed01b7e5-73d1-42a6-9fc8-af2d83879854","last_modified":1554898652923},{"guid":"{c75432cb-980d-4e64-98c8-d7947b382a2c}","prefs":[],"schema":1554897109129,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543255","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Concrete Tech"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7fd0eb9c-9f6c-40ea-ba39-645cafb1d5a0","last_modified":1554897390260},{"guid":"/^((\\{6a99a9ec-f149-4ad3-b644-15e44290d00c\\})|(\\{cd9d1582-13dc-4ce1-9c83-4aaa31c6bc36\\})|(\\{3414a827-ee54-4331-85eb-736a824bb7e0\\}))$/","prefs":[],"schema":1554896836686,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543181","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users' consent or control.","name":"Drag (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a4f0ac78-ba85-4b5a-9d1f-f3f2c6ae4f7c","last_modified":1554897104624},{"guid":"/^((\\{4b6e66db-ee0b-4fc3-abe6-b97cb4798faf\\})|(\\{8aff5f41-86f8-40f1-896d-954eae7fb670\\}))$/","prefs":[],"schema":1554817097951,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543049","why":"Search hijacking","name":"Fit"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8a7efe6b-8670-4714-b4b2-08ce5f202ee7","last_modified":1554818136441},{"guid":"{81425b21-cc8c-42d0-98e8-69844bcb7404}","prefs":[],"schema":1554811583185,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543048","why":"Remote Script Injection","name":"Tech Chip"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dafcc63d-37e0-42e2-b439-59727cf9de48","last_modified":1554811754967},{"guid":"{d85aa6ef-639b-43a1-8560-ddeb59935d10}","prefs":[],"schema":1554803024628,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543047","why":"Remote Script Injection","name":"BatchSerialize"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"204b7b05-d8e1-4de3-86f9-fcf95edb40c0","last_modified":1554811583171},{"guid":"/^((\\{bf163ed1-e9f9-4c98-ae4b-8391133472d1\\})|(\\{ec283482-2d66-49b2-9dc5-0d03bcbffe65\\})|(\\{0a19856e-4168-4765-a8ab-a3a34fa88ec1\\})|(\\{e2019dd1-4591-42e2-864a-535a99972b1a\\})|(\\{88a65f0c-f952-41f0-8868-f22fa12597b3\\}))$/","prefs":[],"schema":1554754247858,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540998","why":"Exfiltrating user data to a remote site while masking as a different add-on","name":"More Flash Player Clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ddd97fae-7040-4758-811f-1dd53116e6ab","last_modified":1554755273775},{"guid":"/^((\\{743fc0de-1085-4078-8611-848024989608\\})|(\\{02acc043-f402-4e48-aa15-56ee1364e17c\\})|(\\{1b7892ab-6dbe-49d1-9c71-bbb70458c830\\})|(\\{25b3b5bc-b77a-49d1-ab56-c0e760fe02ff\\})|(\\{2c78aa89-8cdd-4a96-821a-e35628aea2fb\\})|(\\{2f154b99-05c2-4629-b687-f2aa031d9f65\\})|(\\{36df6f78-16c4-42c2-a6b8-9210a2953739\\})|(\\{40ada62f-72a8-46b7-8e50-4153f660ce34\\})|(\\{49f58462-fc24-472c-b85a-4a3dbbf48741\\})|(\\{4a8cb3fd-0400-47b3-a799-9f2964229bfa\\})|(\\{5429f6da-d7fe-4f1b-a85e-6dc721ec0037\\})|(\\{74480b2f-1198-45b3-86b3-ca0778482216\\})|(\\{777f1169-a824-459d-8a2d-ca2ffaf59424\\})|(\\{81e610be-656a-4a71-866d-dd94b5096c60\\})|(\\{81ee3e70-b6e4-44d0-b5c2-94ded26bb5ac\\})|(\\{881c71c1-6800-4e8b-89de-0d14ef67d588\\})|(\\{9b5d7f59-be9c-4f1e-bf0c-31f085c17726\\})|(\\{9eff0ead-25a4-429c-b4b2-280ba3c6f2d9\\})|(\\{ad1b7e87-e260-4aee-a602-ef234743443e\\})|(\\{b54a530a-cacc-4c76-a7c3-feafd4ce0b13\\})|(\\{bd0d7634-770e-4d9f-8309-d264a5fbbfa9\\})|(\\{bdf16cc8-3da6-4317-a1eb-2ab8adce6b66\\})|(\\{bf484a7f-49fd-4681-afa5-8a063d010a14\\})|(\\{c7cf6d86-207b-4231-a96a-bbfdc9fe59aa\\})|(\\{d33f83c2-dbc6-41d2-a8b9-28fdaa96985e\\})|(\\{d71757ee-edc7-44d5-b536-cb0370d7d9f6\\})|(\\{daf86db4-7dd4-47d4-a1d1-7c31f6b9bbe3\\})|(\\{e27060a0-5fb5-4844-b446-d2655d7681fa\\})|(\\{fae0d133-05dd-44e6-88e1-e218ca2b2caf\\})|(\\{fbf69005-55d8-4360-a562-255a8c285fea\\})|(\\{fd6d1b53-89f5-4d91-9234-fb3e1b067c1b\\}))$/","prefs":[],"schema":1554753973658,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540998","why":"Exfiltrating user data to a remote site while masking as a different add-on","name":"Adobe Flash fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e12a97c7-2c83-4e1c-a2c3-66a653bc6048","last_modified":1554754247845},{"guid":"{ea173fdc-f27a-482a-8a0a-61fd1aa2ee2e}","prefs":[],"schema":1554744706554,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1541005","why":"Masks as a legit add-on and includes a remote script that is against our policies","name":"InterpreterInvocation"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8742ec6a-2e51-4e94-bc6a-653dac08521b","last_modified":1554753973644},{"guid":"{16768af9-4120-4566-95cf-c4234effa084}","prefs":[],"schema":1554733900697,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540999","why":"This add-on changes the search settings in a way that is not allowed per our policies","name":"Unknown search hijacking add-on"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3fb0ed8e-6e5d-489e-8c9d-b6f48705a742","last_modified":1554736392840},{"guid":"{35b9640e-ebbb-44b7-85af-d9ec3af3c6a6}","prefs":[],"schema":1554730607333,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540690","why":"Malicious remote script injection","name":"Patagonia Bit"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0eb3a151-ca6b-4dbb-81b3-c10635660c84","last_modified":1554733900683},{"guid":"{d574e1f8-537d-4b6c-97bb-9f7a138f4d67}","prefs":[],"schema":1554728269766,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540686","why":"Injects remote scripts and masks as a different add-on","name":"DistributedConsumer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a158055b-3387-4961-a4a3-a820d9299e15","last_modified":1554730607318},{"guid":"one-search@mozzilla.xpi","prefs":[],"schema":1554666099983,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1542208","why":"The add-on violates Mozilla's add-on policies by overriding search behavior without user consent or control.","name":"One Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1344c583-9593-412f-a565-c6cc96a07c28","last_modified":1554718843138},{"guid":"/^((\\{00b4b65b-79d9-4e92-bc1e-2b926918b91c\\})|(\\{0cb66591-e935-47e4-95c2-3063786f6555\\})|(\\{6cf25884-f86d-4a4e-a924-d95282ce5b71\\})|(\\{22cce9c6-a1de-457f-8938-c981b976b6f4\\})|(\\{89d99d4c-e7c4-4601-91a8-216e597a826b\\})|(\\{998d3ac7-b475-410e-ad3d-2eeb526c1853\\})|(\\{9423e8df-6200-45c0-877a-479c46e91b30\\})|(\\{64937e0b-6e00-4d5f-bf19-190d6614aae2\\})|(\\{91507dc4-c005-4534-80af-d8fbdeac29ed\\})|(\\{a2247e60-7b89-4857-a2fa-0eaee1cad460\\})|(\\{c9c28751-5865-449f-8e45-b3363edf9fb7\\})|(\\{cdfd004f-cddc-4ad7-8e2d-a58457e42b1f\\})|(\\{d3e7f35d-7d9f-4d38-9a2b-1581f6b3e870\\})|(\\{df574ffe-cce0-42db-857b-627cb164a4d4\\})|(\\{e06afe6e-ed52-40f8-82bf-d070a37387fb\\})|(\\{e7e7fb96-cfab-4a5b-85fe-20f621e1bc2e\\})|(\\{e12e5afd-bd1e-43c6-9288-321dc485cb1c\\})|(\\{e92d8545-0396-4808-96de-830c61c0d1b3\\})|(\\{e883b012-1987-4f37-8053-02e59e20c242\\})|(\\{ed3386c6-76c6-4786-a37b-9816d5f2a260\\}))$/","prefs":[],"schema":1554462951082,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1541662","why":"These add-ons violate Mozilla's add-on policies by overriding search preferences without user control or consent.","name":"Search overriding malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a1c376fe-20c5-4da3-9126-3fe95b874dce","last_modified":1554463075420},{"guid":"/^((\\{6ab41e83-2a91-4c2a-babb-86107a1d1f75\\})|(\\{d84a9d0d-7a31-459e-b45a-2ad111884d1f\\}))$/","prefs":[],"schema":1554293659259,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1541405","why":"This add-on violates Mozilla's add-on policies by overriding search settings without user control or notice.","name":"PopWin (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"04b2954e-4f83-4557-968e-2139a277bf1c","last_modified":1554301860877},{"guid":"/^((@searchlock-staging-automation)|(@searchlock-automation)|(@searchlock-fx)|(@searchlock-staging)|(jid1-vRJA7N8VwBoiXw@jetpack))$/","prefs":[],"schema":1554293340413,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540868","why":"This add-on violates Mozilla's add-on policies by executing remote code and overriding search preferences.","name":"SearchLock"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aacb25e1-71c5-4bee-ad16-e39e732210ba","last_modified":1554293606641},{"guid":"{03dfffe0-509f-11e9-aa00-e7e13d49f3de}","prefs":[],"schema":1554290590697,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540113","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Addon (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9c75fe89-7011-47ad-b213-57f5a81a4c89","last_modified":1554290693618},{"guid":"{e555c358-121b-13fa-bf23-bb57da32d184}","prefs":[],"schema":1554290541557,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540111","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Security (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1809ea7a-8155-4ae7-8c83-ee7c749d30f5","last_modified":1554290590689},{"guid":"{a9c33302-4c97-11e9-9a9d-af400df725e1}","prefs":[],"schema":1554147700324,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1539514","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Security (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b4e4e75-cc96-4ca9-aa9f-6a2d2f6cd96a","last_modified":1554290541548},{"guid":"{a3f765c3-8dde-4467-ad6e-fd70c3333e50}","prefs":[],"schema":1554119395186,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538143","why":"Remote script injection","name":"Angelic Bit"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"93dc42cc-4ff3-460d-a8f2-12f1d947b530","last_modified":1554119427564},{"guid":"{91f77263-866e-4acb-a569-f66ac47889f8}","prefs":[],"schema":1553974898434,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1539226","why":"Remote script injection","name":"Bit Apex"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c528f48a-9b2c-48ca-8b4a-eac442cc0bd0","last_modified":1554119395177},{"guid":"{2256fabf-19f1-4e12-9951-5d126dd9e928}","prefs":[],"schema":1553899022464,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540086","why":"Search hijacking","name":"Twit"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7c705f73-9d1d-4ee9-ad11-347d18729adb","last_modified":1553900528324},{"guid":"/^((\\{00f77164-eca9-4353-916d-8ea493a54c8d\\})|(\\{0716b2a5-8181-45b8-b675-915e38903761\\})|(\\{26124967-7e32-4577-b998-7296c68d3eb9\\})|(\\{273052bc-fc67-4fc1-a6fd-e62acc3ddad1\\})|(\\{4b5f53ac-36ac-4018-80cb-f1106f60ef96\\})|(\\{61065f61-51aa-462c-aca0-f1addbfa202b\\})|(\\{63383006-d617-4a00-9ca7-30a6864782ee\\})|(\\{7629c987-59ea-4e2f-bcde-b55646ecd268\\})|(\\{78e8c8fa-32ce-432b-9a40-b615bff7cd96\\})|(\\{8e9c05df-e0f5-479f-abb9-858650cb471e\\})|(\\{947f1ac0-09f2-4016-a345-dad0d2ee8f57\\})|(\\{9b9f8124-47bc-4699-8557-45573995b0af\\})|(\\{ab159932-d1dd-4d16-9332-8302a01e0ced\\})|(\\{b7340504-f6ba-43cb-8bd6-5ead88d29898\\})|(\\{bcb9265f-20fd-4311-a33f-212c2d08043a\\})|(\\{f8701822-2814-4d5d-af01-cf7fde4fd510\\}))$/","prefs":[],"schema":1553898687988,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1539910","why":"Data exfiltration, is not actually a flash player","name":"Adobe Flash Player fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"64fc6369-b504-4920-abab-f2cf3cc5424a","last_modified":1553899022456},{"guid":"/^((\\{7dd03112-82a0-4c82-9957-117dedaac14a\\})|(\\{59fd3cac-1a4d-4f0f-a129-c241b203eb51\\}))$/","prefs":[],"schema":1553897736388,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540287","why":"Search hijacking","name":"Song"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b32b14f5-0024-48fb-a4b6-1496add1dac0","last_modified":1553898687980},{"guid":"/^((\\{70c2cef0-6cc6-41b8-ad6b-bbd11182a101\\})|(\\{a0366612-376e-47e3-b5fa-b805c7176088\\}))$/","prefs":[],"schema":1553810805293,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540055","why":"Search hijacking, masking as legit add-on","name":"Pix"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d78262b0-ecfc-475e-9759-f7319451cb43","last_modified":1553847044919},{"guid":"/^((\\{10f1b84d-79ca-41d0-97f6-abb53cec0765\\})|(\\{7891c029-0071-4534-b7f0-7288f14ee0ad\\}))$/","prefs":[],"schema":1553810612956,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538476","why":"Remote script injection, search hijacking","name":"FX"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"50197dbd-71bc-492f-a0f1-6658ec454df4","last_modified":1553810696456},{"guid":"/^((\\{058769c7-784e-47a9-a2c4-dfd81bbf6c8c\\})|(\\{2a58598a-f951-4fb0-af2b-12fb7482bf33\\}))$/","prefs":[],"schema":1553810234714,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1539910","why":"Keylogger","name":"Fake adobe flash player"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e1355888-e1cd-4d21-9652-c3000662ed88","last_modified":1553810612947},{"guid":"/^((\\{54c7e57f-8ef0-48d5-92a0-6e95d193a12c\\})|(\\{32d262da-e3cd-4300-aa0b-c284eb4e17bf\\}))$/","prefs":[],"schema":1553802101395,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538536","why":"Search hijacking, masking as legit add-on","name":"TxP"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fa6c7cdb-e477-4478-8dd4-3e1106be6aa3","last_modified":1553810234705},{"guid":"/^((\\{36261798-4c2a-4206-89cc-6c28932b2e98\\})|(\\{b2b9bb64-78d5-43ca-b0cf-a9ee8460521b\\}))$/","prefs":[],"schema":1553616425198,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538234","why":"Clone of Feedbro with added remote scripts and search hijacking","name":"Feedbro Fake"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e00b2639-8a4f-427a-80d8-7c4937c58f31","last_modified":1553620435398},{"guid":"new-tab-search@mozzilla.xpi","prefs":[],"schema":1553616311575,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538500","why":"Search hijacking","name":"New Tab Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a4dca16a-9fa1-4b55-899c-0f8d5eda1a57","last_modified":1553616386570},{"guid":"{a9c33302-4c97-11e9-9a9d-af400df725e3}","prefs":[],"schema":1553616259023,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538141","why":"remote code execution","name":"Fake Security add-on"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0c09f067-6e5f-4ee0-9040-08b4297ebe02","last_modified":1553616311567},{"guid":"{7ab5c514-4ebe-22e9-a925-9b7c7317c373}","prefs":[],"schema":1553548654429,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538266","why":"remote code injection","name":"Eval"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a1f04f09-f4d5-4875-b4b1-a2c772178e8e","last_modified":1553616158755},{"guid":"{bc919484-f20e-48e2-a7c8-6642e111abce}","prefs":[],"schema":1553519202849,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538962","why":"Inserting monetization iframes and masking as a legit add-on. Contains patterns for known malicious add-ons.","name":"Pinterest Save Button clone"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7abbecfb-5512-47d1-ba9b-96d6a61b85ee","last_modified":1553548325261},{"guid":"/^((\\{157cd8f9-48f0-43a1-9bcf-c4316753e087\\})|(\\{157cd8f9-48f0-43a1-9bcf-c4316753e086\\})|(\\{157cd8f9-48f0-43a1-9bcf-c4316753e088\\}))$/","prefs":[],"schema":1553186907495,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1537895","why":"This add-on violates Mozilla's add-on policies by overriding search settings.","name":"SD App (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e263fbec-7155-442f-aa82-cdf218f9e3d7","last_modified":1553193746700},{"guid":"/^((\\{1c94bc8a-3ac1-12e1-aae7-0b314772229c\\})|(\\{8a22255c-4737-11e9-a86b-0bb66337cb31\\})|(\\{3fab603e-3ee1-1222-a859-5f85a3441216\\}))$/","prefs":[],"schema":1553166786114,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535655","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"'Security' add-ons (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6cf1b676-f0b8-4fea-8a5f-64957650dc2e","last_modified":1553172061896},{"guid":"{28ac81f1-b04d-448f-94be-1b8cc8fbd58d}","prefs":[],"schema":1553079961735,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1536513","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"UtilsBridge (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f60b3eec-b8b8-4bd7-8d2b-3f7912c3451f","last_modified":1553080348264},{"guid":"/^((\\{9332d73d-7991-46bf-8b67-6db1a21f0167\\})|(\\{b33715d3-eff8-4186-a252-0af5094b8644\\})|(\\{eb7aff78-6145-4a31-a7f5-f3c353ddb312\\})|(\\{6c5cd693-2919-4458-b776-2ac5b6ab1cb0\\})|(\\{daacefee-aaba-4f10-8d4d-059904d8a153\\})|(\\{94d8d504-838c-4392-9971-cd2f6e21ca21\\})|(\\{6574bb31-c971-454f-b08c-a75bfee00855\\})|(\\{1688ecb0-e382-481f-8c70-541d70bdd2e9\\})|(\\{f7b9f777-7b01-4f73-8eb8-f2ad85d4da1c\\})|(\\{598d7ac6-1789-4573-ae6a-5798ed7f6d83\\})|(\\{c0eb4d03-d18e-40bf-b21b-8237ee1bed76\\})|(\\{d0513185-1f20-4045-a232-f3a4252af379\\})|(\\{9ae8269f-eea1-4097-87fd-b7d2f102184d\\})|(\\{5683f95b-2517-4ca7-9d19-83d7f309b62a\\})|(\\{013d3691-0dd6-471b-bf0d-2750d7406a22\\})|(\\{ae73a262-1a27-4d1d-9be7-4b41a84dfd23\\})|(\\{1d92fc5d-5353-401f-8c5f-373b3b6dae67\\})|(\\{e8a81b54-3728-4a9c-8c63-18ef803ef9be\\})|(\\{d604961b-3a3d-4f60-87ae-35977c10b787\\})|(\\{cbe9b620-fac0-407a-b3be-b0a61b319ef8\\})|(\\{1cdb403e-11c7-421b-9c87-0c0d90263626\\})|(\\{f5fa0bfe-a981-48ff-b809-8faa3126f0bc\\})|(\\{7dc6d0d2-b2f0-4334-979d-6ebeff77785a\\})|(\\{13623b47-de82-4226-85f8-d3ae343e619b\\})|(\\{db7b6ea7-2605-44c7-807b-2419d7eec531\\})|(\\{b9298a4a-acca-446d-aa72-d37f5e1576cd\\})|(\\{2e689bc0-735f-445c-bcc7-2cc495f5eb40\\})|(\\{04acd977-4c2b-4162-af33-8c585bea90c5\\})|(\\{2436dde0-3230-4933-9020-c15b3b9e693b\\})|(\\{dcb556aa-ef6e-4778-9f60-c5ae18a72cfb\\})|(\\{5a24385f-ada4-455d-95ad-62cb6256360d\\})|(\\{97f88a13-5b79-4345-a85e-2560d54f577c\\})|(\\{12f4cde8-7d1c-4a9e-9ef7-431f5ecd53a4\\})|(\\{18a93813-7deb-40cf-b3a6-402369e6d817\\})|(\\{9cee5c92-eb1e-4892-86ff-d2d1c627f5b9\\})|(\\{cb1c544e-d444-4c85-8224-64aa26e82230\\})|(\\{1c3b247f-2ef4-4483-93a6-0a3da7bc3548\\})|(\\{1f6913f2-dead-4f96-bf96-0e64affd46ae\\})|(\\{109adc7d-f308-43a5-aa0e-07ccdc5dad2c\\})|(\\{7170e23c-c706-48a7-919f-c1c22548dbfb\\})|(\\{6aa47f05-1f3f-4798-908a-0ed01b2361e0\\})|(\\{33ef0e7b-15ea-4b08-a779-173731ac20b3\\})|(\\{a0361564-9461-4da0-8ec0-7dc6f418f707\\})|(\\{c12631ed-993a-4c2e-9bf0-37867ae40491\\})|(\\{00b79649-3f0e-4b12-a8f0-376a7b2db716\\})|(\\{89096e44-c8b4-4ce5-aad2-f5bac765f608\\})|(\\{6f4eff89-0e32-42bd-a5c1-354adc8417fd\\})|(\\{482c54ae-e080-4596-bf7c-ae972fdff9a3\\})|(\\{04868575-532f-4b43-9325-7e707c109c25\\})|(\\{042c3065-1291-4409-bae5-8d11f3c268e2\\})|(\\{126e7fc4-bf2d-4467-88b1-f3b17bc10da4\\})|(\\{cea21739-b9ce-46c7-ad3e-3607b1ff6538\\})|(\\{06eea1e7-a8be-4794-8cd5-ed12e5f86161\\})|(\\{50993bc5-011c-4322-b522-41e6f3997163\\})|(\\{219a2146-5d9b-472a-8630-4c96a0994bec\\})|(\\{1db94c2f-d957-4b12-a1dc-903bb28f5ff5\\})|(\\{2f7d887c-7d56-41fa-bf9b-eadf6e500427\\})|(\\{2b16f4ab-a2a9-43fd-8fd6-ad6f354b0d28\\})|(\\{034d2b14-29e6-42ad-b2db-2c31286f3fb7\\})|(\\{77058195-5ae1-440c-8f86-c60a96d12ca9\\})|(\\{8082ff2f-2151-4281-8134-1423e5961ca1\\})|(\\{9fa797e8-d7d4-4851-b7e9-76b61ecf046f\\})|(\\{87178fbe-17a5-4d8d-b5ed-48d17179b101\\})|(\\{f010d9e9-0878-4c83-af45-df966cbe8d26\\})|(\\{2aa8c5cd-18fa-4991-b354-d6f459efeca9\\})|(\\{4021839d-3f4a-4866-94fb-9fa809c5245b\\}))$/","prefs":[],"schema":1553024292304,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535088","why":"This add-on violates Mozilla's add-on policies by exfiltration user data and tracking online activities.","name":"Search overriding malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"478d4acd-3c01-4dd5-b784-4e06b69d1c05","last_modified":1553079818962},{"guid":"{781b89d4-fa53-45a1-bea4-151dd4c8b288}","prefs":[],"schema":1553013598703,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535280","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Drop Tech (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"81759002-967e-4856-9f55-61d7c30cdb3b","last_modified":1553013656506},{"guid":"{3b52063a-0683-4de2-b6e1-6192c78b6ba3}","prefs":[],"schema":1553013551744,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1536042","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Project Tech (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a7f932a-3911-4884-8cb9-d282d282c0cc","last_modified":1553013598695},{"guid":"{47610aad-982f-4822-93ca-8c27dc96a13b}","prefs":[],"schema":1552938092086,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534773","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Tech Hand (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"12874e4d-28b5-4e98-8c33-b6cf5eb032bf","last_modified":1553013551736},{"guid":"amqp-dwn-all-vd@artur.brown","prefs":[],"schema":1552916969263,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1536052","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Video Downloader Plus (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a3f5ce2f-d8ef-4dae-9fce-1d7fb69d2b37","last_modified":1552917123606},{"guid":"/^((\\{1d758385-fddd-478e-85a0-13eef59f60e5\\})|(\\{1ec3e92a-fd3c-4e16-82e2-56d44bd7bdf4\\})|(\\{3dadda0d-d67c-4452-9475-246c33198192\\})|(\\{4a48f6a8-c9d6-4ae2-8513-a7e9fe785a56\\})|(\\{4d2da172-b160-42b5-9fea-0ede63e0ab52\\})|(\\{5bcd4feb-ce52-4e6f-9da6-eef2a75a4f70\\})|(\\{5eb45d74-0f46-4269-bc0e-8a2a49d64267\\})|(\\{7e8c27c0-b94c-4026-8068-2d152143f073\\})|(\\{9ede19b2-bb97-4d1c-abab-b1d72e7d4c74\\})|(\\{19abb7a0-fb4d-41ff-97d4-65f1680c1348\\})|(\\{25efbdeb-04fa-4998-a9f8-99c1293c7b7f\\})|(\\{0049a401-f02d-4d16-8b5e-5933e5855a4c\\})|(\\{65b91ca5-cd06-42a6-9637-8ecde3a69fd6\\})|(\\{146ec14e-f623-4cb2-88ed-7d3bb8101090\\})|(\\{790d2797-82f3-4bc3-8759-c00d426bbf2f\\})|(\\{865f42b5-e073-4a36-84b1-47d09096b48b\\})|(\\{90055a5b-45a8-45c1-b0a0-979ab2a9064f\\})|(\\{a4f5c163-7b64-46c4-bfd3-348ecc99873a\\})|(\\{a8c40ee7-a376-417b-8022-40909a10181b\\})|(\\{a1031346-14d3-464f-9e50-c30dfd88ad92\\})|(\\{abd16535-2fa8-4bfd-b84e-ed09c9c60e53\\})|(\\{b5ee8c58-b5e5-4ba0-a899-9a54a2f0e386\\})|(\\{b246bb42-577e-4587-adf2-7274b378b0b4\\})|(\\{bb43765b-fe06-4d50-9802-0c6742b220aa\\})|(\\{bf3f628d-9e52-4727-b940-054c65a5a304\\})|(\\{c6bc710d-8cc8-4224-9287-44ecfa452a81\\})|(\\{c232edce-83c9-4184-9782-22df800f65e2\\})|(\\{c5397be4-b756-45b8-a247-339846fada52\\})|(\\{c6675bc5-f7ea-4a11-8252-1152d3783ae3\\})|(\\{cc6a088b-5a84-4e48-8de8-d2f6be3abae7\\})|(\\{e6c12219-f67e-4ea0-a9c3-2c541febeff1\\})|(\\{eb3a7ef7-a4d0-49a4-8b21-2a91c1758100\\})|(\\{ec34588b-86b4-4de3-a3bf-f4d1d8386475\\})|(\\{f4fd8825-648f-4b63-a499-3fd702d42149\\})|(\\{fc4f31f6-c5ed-4afd-8c19-df96e107ce7d\\})|(\\{fe337ef5-bb69-44bf-82a8-ee5c13406165\\})|(\\{ff285a1c-5672-44c3-890e-6c4f25976b83\\}))$/","prefs":[],"schema":1552908996320,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535421","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"25f18cc5-6ecc-419f-b093-b79e9f261062","last_modified":1552916969252},{"guid":"{a4491aab-e273-4bc3-b45e-a7b9b9414a5f}","prefs":[],"schema":1552695264438,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534792","why":"Search takeover not according to policies, masking as a different add-on","name":"FFCop"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d2da9c45-59f8-4257-9d7e-07c4fa5de958","last_modified":1552695747900},{"guid":"/^((\\{0f6b717d-1625-4434-b770-5ae33eb64b16\\})|(\\{6d092be7-0bad-46af-9489-04e4b3988644\\})|(\\{7f6049d6-e8b0-4c42-8028-204d1458ddb6\\})|(\\{12b75028-c038-40bd-be5b-2809b7d18d78\\})|(\\{46f35a01-faaf-4fab-95e6-7dfc8b6d8b73\\})|(\\{55d2c6f7-62fa-4091-988b-7f4c4b3c1bff\\})|(\\{75aeaeec-d415-404d-84ba-bd70bcc5e70c\\})|(\\{76b8cf24-227d-4e2b-af4c-39ec5b47babf\\})|(\\{77b725cc-5d0e-4b82-88f0-ec6961acd697\\})|(\\{90fc8426-06ba-43ab-8110-7478ff86f531\\})|(\\{90fc8426-06ba-43ab-8110-7478ff86f539\\})|(\\{157cd8f9-48f0-43a1-9bcf-c4316753e084\\})|(\\{157cd8f9-48f0-43a1-9bcf-c4316753e085\\})|(\\{201ec7f7-57b1-48dd-945c-b1ea7489195d\\})|(\\{280fc0f5-6dfb-4a3c-92ae-acb2d5352175\\})|(\\{388f6d65-4a1b-43ac-b791-387882c30599\\})|(\\{0575cabd-38f3-4964-bdc3-0141a2f062e9\\})|(\\{927e4189-4f56-437e-a0d4-5e232612b5c7\\})|(\\{7277d7cf-c598-420b-ab6e-ab066e1e2fdd\\})|(\\{67775ec2-c879-438b-9409-89fba7ffc684\\})|(\\{397386d2-bb76-4b69-8121-86fad15c5216\\})|(\\{bd7f03dc-b362-4744-b118-43ab916205f9\\})|(\\{c133fb29-c967-4aec-953a-4974e8cbdb26\\})|(\\{cc94c8a7-efa3-435c-91fe-ca305f70e39d\\})|(\\{cfd2ff68-6579-4448-8a26-561bdb63877c\\})|(\\{d00f0050-a66c-49fc-9236-1498d4d29f67\\})|(\\{daa287a2-5916-413e-9b61-52c00b5aa061\\})|(\\{dcfac76f-2fd2-4477-9a60-22d167cabcb4\\})|(\\{dd1bbcf4-bff3-4f15-8a2c-3d52ce987f70\\})|(\\{ddb546b5-6490-4af5-8813-8e701bc06e26\\})|(\\{ead6848b-4bd6-4f9a-93bd-b8460c6f6973\\})|(\\{eb8f7a97-ffb0-40f1-9321-5ab1de884f1c\\})|(\\{ec3e8a3d-df39-4f84-ab31-dae369a225e4\\})|(\\{ef986f55-2dc9-4e39-8c87-618cf4fe5e69\\})|(\\{f8b4b601-7917-40c1-94ec-8efbbf125a46\\})|(\\{f8bc456c-0fb4-4d5d-a85f-dfeb25459e76\\})|(\\{f0458469-cc09-407e-a891-be8606553341\\})|(\\{fa73622c-8b41-45b8-9d93-6d66e7633765\\})|(@loveroms)|(loveroms-ash1280@jetpack)|(searchdimension@gmail\\.com))$/","prefs":[],"schema":1552655172725,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535402","why":" This add-on violates Mozilla add-on policies by including abusive search behavior.","name":"Add-ons including abusive search behavior"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f9cd41dd-9e52-4506-bb58-a31e189f4ab9","last_modified":1552655392045},{"guid":"{b6f5f2d0-1aa3-4e43-b536-6db1b1bf7d1c}","prefs":[],"schema":1552592498693,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535601","why":"This add-on violates Mozilla's add-on policies by exfiltrating user data.","name":"FFcanu (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b807d5f-a192-450a-a0b3-98113c4beff1","last_modified":1552655172717},{"guid":"{e19fed8c-637a-42e3-b62a-3a6c4040ded8}","prefs":[],"schema":1552570939014,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535345","why":"This add-on violates Mozilla's add-policies by executing remote code.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5027a1c1-e050-434f-ba77-56417bc2d7cf","last_modified":1552589019976},{"guid":"{fb62e856-f09b-4cbc-ba07-642ab55f6cb4}","prefs":[],"schema":1552567880022,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534781","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"EncDNA module (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ce66baec-1237-481c-87db-ccc1bcf0359d","last_modified":1552567941331},{"guid":"{54fc344c-e8ba-462a-a6d9-9ce1b794ce46}","prefs":[],"schema":1552567837850,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534817","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4bec4aaf-dd5b-4754-bd01-461fdc7ea5ca","last_modified":1552567880014},{"guid":"{7b6def45-d585-431a-a479-5bb2badf2506}","prefs":[],"schema":1552567781490,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535055","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"PredicitionR (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e9227d28-b627-48b8-8392-e9fb5a00d9b6","last_modified":1552567837842},{"guid":"{6fb28b6b-abf2-4937-af28-340851faa971}","prefs":[],"schema":1552567721181,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534769","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"metamedian (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ed853ce8-83e0-42b7-8d93-7f48041d4987","last_modified":1552567781482},{"guid":"{ae5b30dd-b29d-4ae6-844b-5d7bfc3d7915}","prefs":[],"schema":1552567676370,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534807","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Crypto Valuator (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3cfd9af5-a7d0-49d3-971b-7af5e2eab78f","last_modified":1552567721173},{"guid":"web-private@ext.com","prefs":[],"schema":1552567616148,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534828","why":"This add-on violates Mozilla's add-on policies by overriding search preferences.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3d52fe32-71e5-47bd-8eda-d98fa0c489e9","last_modified":1552567676362},{"guid":"/^((ads@firefox\\.pl)|(adsfinland@firefox\\.pl)|(adsfrance@firefox\\.pl)|(dodateknowy@o2\\.pl)|(dodateksuper1@firefox\\.pl)|(dodateksuper2@firefox\\.pl)|(dodateksuper3@firefox\\.pl)|(dodateksuper5@firefox\\.pl)|(dodateksuper6@firefox\\.pl)|(dodateksuper@firefox\\.pl)|(test_b@iext\\.pro)|(\\{697be03c-cdd2-430e-b6cf-0f9b5f0556ee\\})|(\\{c9ced03f-a5cf-4dbf-b5ba-67673e442590\\})|(\\{cbe59f66-a23a-45c1-81ac-d0cbedf9ea4e\\})|(\\{dbf0a186-d41c-40ae-8841-e9d8a6b49d8d\\}))$/","prefs":[],"schema":1552493457658,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534940","why":"This add-on violates Mozilla's add-on policies by using a deceiving name and exfiltrating user data.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"67025e3b-860c-4680-949f-ec472cd72fae","last_modified":1552567437766},{"guid":"/^((\\{86c18738-11ed-4c16-af92-786aa036c83c\\})|(\\{d0fee16a-f4eb-4dc1-9961-82b913e5943d\\})|(\\{1c4937a1-c678-4607-8665-a16384ee302e\\})|(\\{22caeb02-38a3-415d-b168-64fadccbb4a4\\})|(\\{1c9372e7-5f0e-4541-99cf-dfbf2ab00b01\\})|(\\{9fe66994-8ed1-4317-a20a-1d0544ca062f\\})|(\\{6df222d8-97c7-42bf-9683-1cf8119c1e9e\\})|(\\{4c2dda03-bad0-4160-a8a1-6d089200420e\\})|(\\{7aae7d4f-55b9-42eb-b683-932591265e17\\})|(\\{e6f8ab99-3c96-410c-95d1-267ad48ed3e2\\})|(\\{6d8c5068-d0cb-47a5-af5e-3f23064f4608\\})|(\\{90481f38-d06a-465e-a54c-206bbb1ee9ae\\})|(\\{4b75aeb8-f14a-4ef3-b1ad-09733b40dac3\\})|(\\{3a8ca495-f5ab-4320-b070-4f44266fe3d1\\})|(\\{84f8914f-0dec-48ed-a0fd-4a7712c06793\\})|(\\{aa613fce-603c-41df-bf49-9b09614cebe6\\})|(\\{30314350-199a-4951-9c05-c3537a946492\\})|(\\{a2edce1d-10ab-483d-8c01-5e5fe0c82902\\})|(\\{ec91a3d4-8311-4700-aa15-b3941f21a052\\})|(\\{e9049687-164a-4cf3-be1f-1291cfb0f44a\\})|(\\{2be73925-ebaf-43ca-8b26-bd820887f591\\})|(\\{840eadea-1c68-411f-b4e9-08d9f236385d\\})|(\\{0a89d040-5fb1-46d7-bf81-43b55e83695d\\})|(\\{6a1e76ed-4ac2-4a0c-8beb-43ae63558b36\\})|(\\{1b90c930-e7d7-486a-9085-8b57129489c7\\})|(\\{eab649ca-af76-4de9-95b0-8036e35a66cc\\})|(\\{0628e652-98f4-4e58-9ecb-ad996b061aef\\})|(elfr@geckoaddon\\.org)|(else@geckoaddon\\.org)|(fr_b@iext\\.pro)|(it_b@iext\\.pro)|(sv_b@iext\\.pro)|(no_b1@iext\\.pro)|(fi_b@iext\\.pro)|(au_b@iext\\.pro)|(elfr12@geckoaddon\\.org)|(test@informations\\.to)|(se_pop@informations\\.to)|(it@spongebog\\.funny-ok\\.com)|(it@tsunami\\.funny-ok\\.com)|(fi@spongebog\\.funny-ok\\.com)|(fi@tsunami\\.funny-ok\\.com)|(no@spongebog\\.funny-ok\\.com)|(no@tsunami\\.funny-ok\\.com)|(fr@tsunami\\.funny-ok\\.com)|(fr@spongebog\\.funny-ok\\.com)|(se@tsunami\\.funny-ok\\.com)|(se@spongebog\\.funny-ok\\.com)|(au@spongebog\\.funny-ok\\.com)|(au@tsunami\\.funny-ok\\.com)|(nz@spongebog\\.funny-ok\\.com)|(nz@tsunami\\.funny-ok\\.com)|(gr@spongebog\\.funny-ok\\.com)|(gr@tsunami\\.funny-ok\\.com)|(nz_fnew@tsunami\\.funny-ok\\.com))$/","prefs":[],"schema":1552320039514,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534103","why":"Stealing cookies, browsing history and other information","name":"Rogue Updater add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b57d9505-21bf-4a24-accb-05ceac50dadc","last_modified":1552323475989},{"guid":"{c04d9d7d-1c8c-4eab-a51a-828c47e1b8b7}","prefs":[],"schema":1552246898392,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1533780","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"asin (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2c739daa-ffee-48d9-a825-e53c8fd2bb3c","last_modified":1552300402314},{"guid":"/^((\\{ee2d725e-9726-43ac-8040-60ce9ff2831b\\})|(\\{55417a80-e6f7-4d77-8d73-f59045e5e890\\}))$/","prefs":[],"schema":1551728497880,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1532269","why":"This add-on violates Mozilla's add-on policies by using a deceptive name.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aca80fb4-760e-4cd4-9fec-649fb38b2947","last_modified":1551794995188},{"guid":"/^((\\{5084f455-bc8f-483c-b145-91245bcbfd64\\})|(\\{bd69d5d0-4b2f-48cb-bab5-dcf1e0f9c63b\\}))$/","prefs":[],"schema":1551398716775,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1531416","why":"Maliciously collecting form data and cookie modification","name":"Adblock/Adobe Flash fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7718be46-8e84-4bc7-a5a9-4c5de18378ee","last_modified":1551399019543},{"guid":"/^((\\{6745ccb4-833d-497e-b582-d98a5e790e8c\\})|(\\{cd205ddb-b106-4d2a-a965-5d1c610b5072\\})|(\\{218ec82e-2839-42da-acaa-e527454f4237\\})|(\\{7af25a3d-1caf-49f8-8be9-8ae6065db7c5\\}))$/","prefs":[],"schema":1551397746059,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530911","why":"Search hijacking, remote scripts","name":"Emoj1 clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"77a32be3-94ce-49c2-b129-fa2562a7f47b","last_modified":1551398716765},{"guid":"Youtube-video@Myaddons.com","prefs":[],"schema":1551397521494,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529887","why":"Remote script injection and data exfiltration","name":"YouTube Video and MP3 Downloader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a30f9f2a-aa68-48b7-88cc-8a582405b385","last_modified":1551397746049},{"guid":"Youtube-downloader@Myaddons.com","prefs":[],"schema":1551396963937,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529873","why":"Remote script injection, data exfiltration","name":"YouTube MP3 Converter"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1d596a69-157f-4743-9465-f86d6452206b","last_modified":1551397521482},{"guid":"{ba74c7ee-32b1-11e9-ade5-1f2222a4f325}","prefs":[],"schema":1551382900634,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529573","why":"Remote script injection and user data exfiltration","name":"GET Security"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"01825fea-8c5c-4d76-bd06-e1019c188056","last_modified":1551396963926},{"guid":"/^((\\{e0686c32-99b4-44d8-972f-88bf08b68f88\\})|(\\{b2225e4c-9d1d-472b-8aeb-5ff203bcff9a\\}))$/","prefs":[],"schema":1551210091992,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530932","why":"This add-on is distributed violates Mozilla's add-on policies by being distributed through a fake Firefox update page.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"37252271-9e38-46a9-b23a-2b6d7048c0db","last_modified":1551250023025},{"guid":"{9d7cfde2-39ae-11e9-bde0-02427e2eba50}","prefs":[],"schema":1551104404768,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530640","why":"This add-on violates Mozilla's add-on policies by including abusive remote functionality, negatively affecting security and performance.","name":"Unnamed malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7bb234b0-cfda-4a23-bf02-9c82fb3500a3","last_modified":1551204284998},{"guid":"{4603d01d-ae80-4653-9288-d5ef98b99a17}","prefs":[],"schema":1551099702949,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529924","why":"This add-on violates Mozilla add-on policies by including abusive remote code.","name":"IMmailgun (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"32227de6-a7bf-454c-bf44-4478ddd96abe","last_modified":1551099805258},{"guid":"{157cd8f9-48f0-43a1-9bcf-c4316753e083}","prefs":[],"schema":1551037300209,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529926","why":"This add-on violates Mozilla add-on policies by including abusive search behavior.","name":"SD App (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b3fe8de-6d05-4d95-a6d2-cd5695f1b0c0","last_modified":1551099426266},{"guid":"{5288d05d-253f-4675-be3b-152bf02aa3ec}","prefs":[],"schema":1550683849233,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529328","why":"Remote script injection along with deceptive code to hide the fact","name":"Unicode & Emoji Support"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9600b4cd-da02-4947-a4f5-c56c657ba197","last_modified":1550684288501},{"guid":"restore.old@youtube.com","prefs":[],"schema":1550580649249,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529126","why":"This add-ons does remote script injection in a way that attempts to hide the injection. The code being executed runs on all pages which is contrary to what the add-on is described to do.","name":"Restore Old Youtube"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"27917953-17fb-4ffc-bcf1-5fc2727174b4","last_modified":1550617105595},{"guid":"/^((pohhpifegcbplaijeeonlbkjgocfgjbf@chrome-store-foxified-18573537)|(pohhpifegcbplaijeeonlbkjgocfgjbf@chrome-store-foxified-570932499)|(aackamlchlgmalkmcphbhhcjebbpnfdf@chrome-store-foxified-233164420)|(pohhpifegcbplaijeeonlbkjgocfgjbf@chrome-store-foxified-1808417494)|(nnfhjlgginbfdejaajhbboeemajpjgfp@chrome-store-foxified-699139867)|(dilkapnoekabmkkhhdlpnpfgjcmddlia@chrome-store-foxified-1808417494)|(dilkapnoekabmkkhhdlpnpfgjcmddlia@chrome-store-foxified-1190639722)|(nnfhjlgginbfdejaajhbboeemajpjgfp@chrome-store-foxified-2745518014)|(fibaefnljghpmdibfkhnlaniblfkkndi@chrome-store-foxified-1955364993)|(dilkapnoekabmkkhhdlpnpfgjcmddlia@chrome-store-foxified-1516694386)|(generated-rk4dtanssk56goquir78sz@chrome-store-foxified--1594555229)|(nnfhjlgginbfdejaajhbboeemajpjgfp@chrome-store-foxified-1388315457)|(oaoebpgbkehlcdggaeeohgfpopdhjell@chrome-store-foxified-1823310541)|(fibaefnljghpmdibfkhnlaniblfkkndi@chrome-store-foxified--1031675095)|(ancjheohbkbnkgcmfaldcaepoeeplkgh@chrome-store-foxified-1823310541)|(generated-lwcbpuj27wcknyyl6pkap7@chrome-store-foxified-1823310541)|(generated-bmtr2hbgikv399aj6aeycd@chrome-store-foxified-1823310541)|(generated-8w9odie82h2ugbsrofooj3@chrome-store-foxified-1823310541)|(\\{4170faaa-ee87-4a0e-b57a-1aec49282887\\})|(\\{b66dd4bc-7f5e-41d9-bc43-84c5736d0c87\\})|(\\{507ad1fb-08ae-43ac-a596-fd5b6e7dea9a\\})|(\\{8bf85207-66df-4eb7-b913-ac162498c687\\})|(\\{b063895a-8077-452d-b049-ebc20a39f882\\})|(\\{5776bd90-3d09-43b5-a769-8da373e9820f\\})|(\\{f6bdce44-3d5a-4f88-9a64-e39fcb4f0717\\})|(\\{1c22e687-6a02-440c-a6d5-c1ccaf520e10\\})|(\\{f7be824f-7287-466a-8590-2f48007a223b\\})|(\\{89ffc0b4-97f7-447c-bd6f-9c519b0188bd\\})|(\\{3a67084b-c231-4b4b-a924-ffa741f90921\\})|(\\{fac8b1d0-f321-491d-9234-c40d89b3660d\\})|(\\{a8053a83-8d1a-4f0e-9f88-d31cfe00cf83\\})|(\\{d10fa57e-37d3-43d3-39f8-e6d5b2a7759d\\})|(savetube_downloader@savetube\\.co)|(\\{95a8a08c-53a8-7e1d-5a80-f1a5cd4751bf\\})|(\\{5037bd74-c23b-4bbf-8865-6b5a09e07342\\})|(\\{830c558c-70f0-4b07-95f1-8e06ad34ee2c\\})|(\\{e4d93c37-1299-452f-9b60-adee15ad3802\\})|(googlemaps@search))$/","prefs":[],"schema":1550502645324,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1528761","why":"Malicious add-ons injecting remote scripts and exfiltrating data for monetization purposes. Some of the add-ons are masking themselves as legit add-ons and using various obfuscation tactics to hide their injections.","name":"Rogue Youtube downloaders and related add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f2483d7d-1895-4ae6-9901-7321e59062a6","last_modified":1550502978653},{"guid":"/^((((generated-e0yf8zkhypow3jjifkqzwo)|(iiinclagpealgnaglbmkdbfbgchjjbpg)|(jaehkpjddfdgiiefcnhahapilbejohhj))@chrome-store-foxified--?\\d+)|(jid1-9ETkKdBARv7Iww@jetpack)|(\\{813fe658-5a29-4dcc-ba6c-3941676e4f19\\}))$/","prefs":[],"schema":1550254444783,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1528308","why":"This add-on violates Mozilla's add-on policies by tracking user behavior and including remote code.","name":"BuyHatke Best Price Comparison, Graph, Coupons (and similar)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d6b2dbad-31e9-4984-b649-19036cd38e1d","last_modified":1550265430182},{"guid":"/^((odnenajaeicndaeiapagpglohiklndhe@chrome-store-foxified-2174031944)|(akdibckdjeocfbcjaikipkhhbggcbgkg@chrome-store-foxified-699805590)|(\\{bd9f5830-bf8c-4e38-933d-09f85b24d744\\})|(youtube-downloader@addoncrop\\.com)|(dailymotion-downloader@addoncrop\\.com)|(youtube-mp3-iframe-downloader@addoncrop\\.com)|(youtube-downloader-lite@addoncrop\\.com)|(dailymotion-downloader-lite@addoncrop\\.com)|(generated-p5qj07ef5ceqfktp5v8whw@chrome-store-foxified--505607522)|(generated-tuag2j5gwq73xzp8fbw3j8@chrome-store-foxified--505607522)|(generated-uj53d5j612ap5pz11hwgv2@chrome-store-foxified--505607522)|(\\{f51f0244-bfb0-40ce-bf9d-af49f5949e61\\})|(\\{81751484-2dc9-47bf-aec3-b8e556237178\\})|(\\{d89d1e20-57af-4164-82cc-650af45cf0a5\\})|(\\{a5e28713-14c3-4967-befe-2ec253e317cd\\})|(\\{335ac35b-6c16-4304-93f0-64a418e5bf81\\})|(\\{d3fdb429-ef84-40a4-b160-010745ee0098\\})|(\\{d66db057-7d38-4df4-a0ba-63c272be25ee\\})|(\\{ff7f7151-09e3-4e35-9052-b21e23e7e2c1\\})|(\\{1479da02-e759-4a6f-8f62-c08096583806\\})|(\\{42d59cda-c117-459e-b244-1b850c27ccc9\\})|(\\{bec48f33-7869-4158-8cbc-5cf1606f9afa\\})|(\\{08ca656c-4973-46a8-85a9-3d771399c86e\\})|(\\{dc5336c8-5624-4f74-a794-bb15f3760f34\\})|(\\{6a3d97de-1b42-4624-880a-1a68bc917142\\})|(\\{ad965166-3a34-449d-8230-a636fb5cae57\\})|(video-view@vv\\.us)|(video-view@excoe\\.com)|(xeco@rama\\.com)|(ghj@brem\\.com)|(fgtr@rembgr\\.com)|(xero@saltam\\.com)|(sora@remjem\\.com)|(repo@saram\\.com)|(tora@empoytr\\.net)|(saving@ropbart\\.com)|(japa@vbgt\\.com)|(rtya@nop\\.net)|(asan@khazan\\.com)|(xerb@tangot\\.com)|(audiotools@ramdeen\\.com)|(webat@extrolm\\.com)|(media@medplus\\.com)|(audio@audequl\\.com)|(control@medcontrols\\.com)|(sabqo@rimjim\\.com)|(repto@secroa\\.com)|(meters@videobf\\.com)|(betro@diskra\\.com)|(codeca@vxmrop\\.com)|(revoca@feronx\\.com)|(brota@vidbrghta\\.com))$/","prefs":[],"schema":1550173301925,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1527603","why":"This add-on violates Mozilla's add-on policy by including malicious remote code.","name":"Various add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d94f7e0f-7088-43c9-a8da-eae102781079","last_modified":1550253583075},{"guid":"superzoom@funnerapps.com","prefs":[],"schema":1549578756953,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1525405","why":"This add-on includes abusive functionality including violating the user's security and privacy.","name":"SuperZoom (Abusive)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f7c4b329-7a54-48d3-9494-81783fe99d90","last_modified":1549627400713},{"guid":"/^((addon@firefox-updater\\.com)|(downloader@youtube-download\\.org)|(downloader2@youtube-download\\.org)|(downloader1@youtube-download\\.org))$/","prefs":[],"schema":1549369087422,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1525153","why":"These add-ons include abusive behavior.","name":"\"FF Manual Update (Required)\" and \"Easy Youtube Video Downloader Express\" (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6b72e942-af54-469c-b9f2-9e436ad2c0d1","last_modified":1549373215201},{"guid":"/^((\\{0b347362-773f-4527-a006-f96e9db437e5\\})|(\\{9edb10ad-67af-4ad0-af45-efe452479321\\})|(\\{202e2671-6153-450d-bc66-5e67cee3603f\\}))$/","prefs":[],"schema":1548963700621,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1524357","why":"This add-on includes hidden abusive functionality.","name":"Video download add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"680a99e9-c972-4a14-9b15-e56eeeed75eb","last_modified":1549037404012},{"guid":"/^((\\{a9bc520e-68ab-49c2-a8df-75a0349d54fd\\})|(\\{bfc5d009-c6bd-4526-92ce-a9d27102f7f2\\}))$/","prefs":[],"schema":1548699141208,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1522959","why":"Add-ons that contain abusive functionality.","name":"Unnamed (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"97c4ee31-4009-40de-ae02-f1b349c87d01","last_modified":1548699177099},{"guid":"{4e47160d-ec83-417c-ab01-cda978378d9e}","prefs":[],"schema":1548699076839,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1522970","why":"The add-on contains abusive functionality.","name":"mlflow (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"62c54642-73ab-4641-b5c2-47e4ae29bbc5","last_modified":1548699141199},{"guid":"/^((\\{feff5ea4-ed4a-46a3-9331-12fec01d52a9\\})|(\\{8ffc339c-0ca1-46e3-acb3-3bfd889f9a21\\})|(\\{1fe481b5-baad-44e9-b410-082cf0f2acbb\\})|(\\{92c85192-b325-4599-82e2-a110f193eae6\\})|(\\{5bc21266-26f1-469a-bc1a-a49d7b70ecb9\\})|(\\{dc2dd143-f2e7-4f46-a8ff-4dc1a985e889\\})|(\\{c1233bb6-31a9-4c7d-8469-f8f44adee9ba\\})|(\\{d0d48905-1065-43dc-ab96-434d100602ed\\})|(\\{11deae99-2675-4d5e-86cd-7bd55b88daf2\\})|(\\{a7014e8e-eacf-4ba0-9047-c897c4ed3387\\})|(\\{b9c545a5-0ffa-490a-8071-2fee09478cfe\\})|(\\{39e8eebb-4d9e-4a03-93a8-4468fdd7a186\\})|(\\{8ccc00b1-2010-4155-a07c-f4d7c4d6dec2\\})|(\\{a1056511-4919-43b7-a9e5-ac2b770de810\\})|(\\{90a6da19-9165-44c1-819c-e3b53409f9c9\\})|(\\{e3862078-8f9f-4f8e-99dc-55ba558f0619\\})|(\\{d89fcf34-2615-4efc-a267-1e83ab6a19d0\\})|(\\{588151ce-eab4-4acf-83a7-bb5ccaf4d867\\})|(\\{6ab6312d-5fd4-42a9-ab10-08b954e53f9d\\})|(\\{24a6cbde-be68-4b7d-9f1b-d4d5dfd178a3\\})|(\\{55ae1a08-105f-4f7f-9d4e-e448b517db2b\\})|(\\{74fe9d83-df17-4812-bd3f-27b84b0086b7\\})|(\\{21140e51-713a-4bf8-865b-e2ee07282409\\})|(\\{24f39610-2958-4dc8-a73b-75cc9665bffa\\})|(\\{c50a45a5-efa4-44af-8946-6f20e4748d47\\})|(\\{41d0b7e0-0d93-4f67-bed9-da6d7688ad16\\})|(\\{c2bee222-2163-4c0f-89f5-4ac502f06810\\})|(\\{4be4602e-2b20-473f-8f2b-85e8c53d17dc\\})|(\\{dec2e9b5-e787-4fb5-a7bc-5894f80f7367\\})|(\\{179526e1-1824-49f7-afb3-49fdaadaa503\\})|(\\{4f07d826-ca9e-4370-a508-b984f54758de\\})|(\\{d0558df2-714f-4793-9d85-d2d648de4f2e\\})|(\\{daf1a69b-f47b-4936-bd25-5ac21f4e27ec\\}))$/","prefs":[],"schema":1548099697813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1521975","why":"Remote script injection and deceptive tactics to hide the fact","name":"ext-affiliate add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"87c17ce6-aaef-4d47-a662-588efff34041","last_modified":1548198338831},{"guid":"hlper@xero.com","prefs":[],"schema":1548076840649,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1521533","why":"This add-on executes abusive remote code.","name":"Av Player Helper (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1e2ae4c0-66cd-40bc-9cf6-5ca0ce9548f7","last_modified":1548084072622},{"guid":"/^((xtera@soravem\\.net)|(nozl@ssave\\.net))$/","prefs":[],"schema":1547926889113,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1521429","why":"This add-on injects abusive remote code.","name":"Video Assist (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c69997df-0b61-4de5-a351-b640123a9c3b","last_modified":1548073537411},{"guid":"/^((\\{94f608b3-76b6-4b7b-8cef-7360df22a930\\})|(\\{9648b74f-35ea-4218-acf0-ec2191f509f6\\}))$/","prefs":[],"schema":1547754101798,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1520813","why":"Add-ons that leak private user data.","name":"Instagram Register and Google Register (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a15e8d7e-0726-4190-8187-c75e2b46d429","last_modified":1547810271416},{"guid":"reopen@closedtab.com","prefs":[],"schema":1547067530457,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1518847","why":"This add-on contains unwanted abusive behavior unrelated to the add-ons functionality.","name":"Reopen Closed Tabs (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"451d950f-ca89-491b-87e7-45123e4f5ab4","last_modified":1547206877909},{"guid":"{43ecded1-f7cb-4bb6-a03d-4bec23b9f22d}","prefs":[],"schema":1547025691087,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1518580","why":"This add-on violates Mozilla's policy and user's security/privacy by loading abusive code from remote.","name":"lamme (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"06c6868e-055f-4e7d-aa8f-5ba577f43e85","last_modified":1547027153061},{"guid":"youtube_downloader@addon.partners","prefs":[],"schema":1546890104853,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1518032","why":"This add-on contains unwanted abusive functionality.","name":"YouTube Download Tool HD (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5a42c5bb-9cb4-4d96-b978-8d9f816322e6","last_modified":1547025691078},{"guid":"/^((\\{00cf6ee0-14f3-4e35-a4fd-d2160fe2f05e\\})|(\\{0da583da-e623-41f2-b2d2-0ac61b493171\\})|(\\{105c14a6-8b6f-49ef-b0d6-41bad99ad5e8\\})|(\\{10a15a74-271f-4098-a662-bd827db4f8bc\\})|(\\{13e02b9b-2797-4100-8144-65b73c4145c4\\})|(\\{1eb56568-8a30-42b1-a646-ad9f485f60fe\\})|(\\{1eb8a08c-82a8-4d1d-8b80-f7b5cd4751bf\\})|(\\{2f8220a8-b2a7-4277-ba6b-bdcb6958f669\\})|(\\{33f39a5d-137c-4757-9f9d-e86395c8bf20\\})|(\\{347ca189-9e63-43d2-8a2f-5d5141598bdc\\})|(\\{396056fc-1697-4954-b535-06de8d62fe1b\\})|(\\{3d530918-dbe8-442c-8faf-1f4ca7ca8ab9\\})|(\\{3e283c2e-cde3-4baa-8076-226ca8fb90ef\\})|(\\{591468f8-ebbd-497a-92f1-fa0a1206adb4\\})|(\\{5f6c3eb8-aa32-489a-bb01-b12b23d2001a\\})|(\\{6cbb397a-d865-42b2-8454-25a75b710dff\\})|(\\{7ae2bde0-f7ea-4bf3-a055-06953f9fcf31\\})|(\\{7b402578-ddec-4eee-9c8b-98e4e8db0059\\})|(\\{7fb00cf7-40d3-4415-a0c8-a48d3fbe847f\\})|(\\{87a8a08c-82a8-4d1d-8b80-f7b5cd4751bf\\})|(\\{888220a8-b2a7-4277-ba6b-bdcb6958f669\\})|(\\{8b1dd8f3-224b-4975-bda2-cb2dd184d4d8\\})|(\\{8bcdc9cc-f6be-4203-ae43-a9d281f0bcdb\\})|(\\{8cda9ce6-7893-4f47-ac70-a65215cec288\\})|(\\{8dc9b946-0bb9-4264-9c76-fd9ff1e159a2\\})|(\\{942e0fec-19f2-4ebc-8a74-009da7fa625d\\})|(\\{b2a720a8-b2a7-4277-aa6b-bdeb6958f669\\})|(\\{bdcf953b-d2aa-4e7a-8176-aeb1e95a0caf\\})|(\\{cae82615-f7be-4aff-875d-33da1bc93923\\})|(\\{d2aa953b-bdcf-4f7a-8476-ddb1e9500caf\\})|(\\{da0fa57e-17d3-40d3-99f8-e9d5b2a7759d\\})|(\\{da1237ca-e35d-4653-b2b5-d98043f33781\\})|(\\{e164563a-1512-4b81-99ff-95f2644c4075\\})|(\\{e2a720a8-b3a7-1277-aa2b-bdeb2958f669\\})|(\\{e6a90490-6ef7-407d-863a-7dd120f6f7dc\\})|(\\{f15cfa53-fa9b-43cf-84e8-16ece6695922\\})|(\\{f722c845-2d8b-4a0a-b518-4f39af703e79\\})|(\\{ff1c4e62-7c11-4ea7-b734-3462417ceeb5\\})|(\\{ffa0a57e-17d2-41d3-96f8-e8d5b2a0759d\\}))$/","prefs":[],"schema":1546378806655,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1517154","why":"Executing remote code containing coin mining and other undisclosed monetization","name":"Various remote iframe add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"53c5fb08-1001-471e-87ce-31185a84bcbc","last_modified":1546439268437},{"guid":"{02267dc4-36f2-4c22-8103-9e26477b48ef}","prefs":[],"schema":1545922885656,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1516539","why":"Google Search hijacking and affiliate injection","name":"Markdown"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6dd73da4-cb2f-4eb8-8850-890e80c8d57b","last_modified":1545926512914},{"guid":"{d064563a-1542-4b8b-99ff-95f1644c4075}","prefs":[],"schema":1545921144932,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1516488","why":"Obfuscated remote script injection stealing data","name":"PDF Print and Save"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"875bc1c6-257e-438a-8624-3bfe963747b0","last_modified":1545922824252},{"guid":"/^((\\{83768008-e10c-48c0-b303-5a0f1de763a1\\})|(\\{430b0612-bfad-463b-8783-cf2e32801513\\})|(\\{519adb83-4abb-4a66-8e94-243754b8adce\\})|(\\{228a707d-55c1-465b-a759-a2129eb6602e\\}))$/","prefs":[],"schema":1545853297809,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1516131","why":"Remote script injection and data exfiltration","name":"Various malicious remote script injection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c0cb1a85-c6c6-453e-b126-0e6e26ceaf88","last_modified":1545870108716},{"guid":"/^((\\{4c4ceb83-f3f1-ad73-bfe0-259a371ed872\\})|(\\{a941b5ab-8894-41e1-a2ca-c5a6e2769c5f\\})|(\\{56488007-bd74-4702-9b6d-aee8f6cc05ea\\})|(\\{9eebac07-ac86-4be7-928f-e1015f858eee\\})|(\\{5a993517-5be7-480e-a86c-b8e8109fa774\\})|(\\{309ad78e-efff-43cf-910c-76361c536b20\\})|(\\{cefcf45b-dfec-4072-9ffc-317094c69c28\\})|(\\{5b04980b-25e9-4bc6-b6ea-02c58d86cc5e\\})|(\\{0021a844-360f-480e-ac53-47391b7b17b4\\})|(\\{2bed9f51-62a8-4471-b23c-827e6727c794\\})|(\\{7d2130d3-d724-4f58-b6b7-8537a9e09d4c\\})|(\\{ccd3847a-e5ec-4d28-bf98-340230dcbd4d\\})|(\\{83716b9b-6e6e-4471-af76-2d846f5804f3\\})|(\\{5154c03a-4bfc-4b13-86a9-0581a7d8c26d\\})|(\\{24f51c5c-e3f5-4667-bd6c-0be4f6ef5cc2\\})|(\\{73554774-4390-4b00-a5b9-84e8e06d6f3c\\})|(\\{c70cfd12-6dc3-4021-97f2-68057b3b759b\\})|(\\{ef5fe17b-eb6a-4e5e-9c18-9d423525bbbd\\})|(\\{461eb9b4-953c-4412-998e-9452a7cb42e0\\})|(\\{966b00fe-40b0-4d4b-8fde-6deca31c577b\\})|(\\{dab908ac-e1b0-4d7e-bc2e-86a15f37621f\\})|(\\{01a067d3-7bfa-44ac-8da7-2474a0114a7e\\})|(\\{6126261f-d025-4254-a1db-068a48113b11\\})|(\\{6c80453f-05ec-4243-bb71-e1aac5e59cae\\})|(\\{f94ec34b-5590-4518-8546-c1c3a94a5731\\})|(\\{5d4c049e-7433-485a-ac62-dd6e41af1a73\\})|(\\{507f643d-6db8-47fe-af9c-7a7b85a86d83\\})|(\\{5c56eeb4-f97c-4b0d-a72f-8e639fbaf295\\})|(\\{2ef98f55-1e26-40d3-a113-a004618a772e\\})|(\\{77d58874-d516-4b00-b68a-2d987ef83ec5\\})|(\\{7a0755d3-3ba2-4b19-98ce-efcdc36423fc\\})|(\\{47ee3ba1-8974-4f71-b8a4-8033d8c2155f\\})|(\\{a477f774-bc36-4cc8-85bd-99f6b04ea255\\})|(\\{1a2e41e3-4343-4a00-90cd-ce77ac77a8af\\})|(\\{7b180e9a-afd6-4693-94a1-c7b5ed9b46fa\\})|(\\{51f76862-f222-414d-8724-6063f61bbabf\\})|(\\{d47a0c63-ac4c-48ce-8fc7-c5abc81d7f75\\})|(\\{b8adf653-f262-413c-b955-100213b105ad\\})|(\\{ccedf35b-dfd6-417a-80de-fb432948861d\\})|(\\{70e29b0e-7cd8-40df-b560-cf6eb066350d\\})|(\\{9926f8ad-b4c3-4122-a033-1b8a5db416db\\})|(\\{62eefb1c-a2d8-40ba-ab94-9fc2f2d31b2f\\})|(\\{17f14919-00bd-44a4-8c14-78ab9728038f\\})|(\\{20e36a3e-672c-4448-9efb-5750cbffe90c\\})|(\\{6070c95f-6460-4ffd-9846-2bbd7238697f\\})|(\\{1edb8a4e-f105-4623-9e19-e40fb082b132\\})|(\\{223a1503-772d-45eb-8cb8-e2e49563703d\\})|(\\{59e0f01c-1f70-445c-a572-7be5d85549bd\\})|(\\{8ec160b7-1089-4944-a999-a1d6afa71c5d\\})|(\\{d2d111d6-0ea1-4880-ae7b-2e82dff3a719\\})|(\\{cfacacd6-191c-46c4-b78c-8a48289b2829\\})|(\\{1155e72f-2b21-433f-ba9a-5af6ed40c8ee\\})|(\\{583910bd-759f-40f6-b96a-1d678d65650f\\}))$/","prefs":[],"schema":1545162093238,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1514865","why":"Remote script injection and data exfiltration","name":"Various add-ons using .cool domains"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"53168513-103a-4ea0-a48f-bc291354cc9f","last_modified":1545232187960},{"guid":"{56a1e8d2-3ced-4919-aca5-ddd58e0f31ef}","prefs":[],"schema":1544470901949,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491312","why":"The add-on introduces unwanted functionality for users.","name":"Web Guard (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1dc366d6-c774-4eca-af19-4f9495c2c55e","last_modified":1544544484935},{"guid":"/^((\\{a99e680b-4349-42a5-b292-79b349bf4f3d\\})|(\\{f09a2393-1e6d-4ae4-a020-4772e94040ae\\})|(\\{c9ed9184-179f-485f-adb8-8bd8e9b7cee6\\})|(\\{085e53da-25a2-4162-906e-6c158ec977ac\\})|(\\{bd6960ba-7c06-493b-8cc4-0964a9968df5\\})|(\\{6eeec42e-a844-4bfd-a380-cfbfc988bd78\\})|(\\{3bbfb999-1c82-422e-b7a8-9e04649c7c51\\})|(\\{bfd229b6-089d-49e8-a09c-9ad652f056f6\\})|(\\{ab23eb77-1c96-4e20-b381-14dec82ee9b8\\})|(\\{ebcce9f0-6210-4cf3-a521-5c273924f5ba\\})|(\\{574aba9d-0573-4614-aec8-276fbc85741e\\})|(\\{12e75094-10b0-497b-92af-5405c053c73b\\})|(\\{99508271-f8c0-4ca9-a5f8-ee61e4bd6e86\\})|(\\{831beefc-cd8c-4bd5-a581-bba13d374973\\})|(\\{c8fe42db-b7e2-49e6-98c4-14ac369473a4\\})|(\\{f8927cca-e6cb-4faf-941d-928f84eb937f\\})|(\\{17e9f867-9402-4b19-8686-f0c2b02d378f\\})|(\\{f12ac367-199b-4cad-8e5a-0a7a1135cad0\\})|(\\{487003ce-5253-4eab-bf76-684f26365168\\})|(\\{487003ce-5213-2ecb-bf16-684f25365161\\}))$/","prefs":[],"schema":1543088493623,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1509864","why":"Add-ons that track users and load remote code, while pretending to provide cursor customization features.","name":"Various cursor and update add-ons (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a8d942b3-779d-4391-a39c-58c746c13b70","last_modified":1543241996691},{"guid":"{97f19f1f-dbb0-4e50-8b46-8091318617bc}","prefs":[],"schema":1542229276053,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1507191","why":"Fraudulent Adobe Reader add-on","name":"Adobe Reader (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"03120522-ee87-4cf8-891a-acfb248536ff","last_modified":1542272674851},{"guid":"/^((video-downloader@vd\\.io)|(image-search-reverse@an\\.br)|(YouTube\\.Downloader@2\\.8)|(eMoji@ems-al\\.io))$/","prefs":[],"schema":1542023230755,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1506560","why":"Add-ons that contain malicious copies of third-party libraries.","name":"Malware containing unwanted behavior"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cd079abe-8e8d-476f-a550-63f75ac09fe8","last_modified":1542025588071},{"guid":"/^({b384b75c-c978-4c4d-b3cf-62a82d8f8f12})|({b471eba0-dc87-495e-bb4f-dc02c8b1dc39})|({36f623de-750c-4498-a5d3-ac720e6bfea3})$/","prefs":[],"schema":1541360505662,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1504619","why":"Add-ons that contain unwanted behavior.","name":"Google Translate (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aa5eefa7-716a-45a6-870b-4697b023d894","last_modified":1541435973146},{"guid":"{80869932-37ba-4dd4-8dfe-2ef30a2067cc}","prefs":[],"schema":1538941301306,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1497161","why":"Malicious page redirection","name":"Iridium (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dd5b0fa4-48fd-4bf6-943d-34de125bf502","last_modified":1538996335645},{"guid":"admin@vietbacsecurity.com","prefs":[],"schema":1537309741764,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491716","why":"Logging and sending keystrokes to a remote server.","name":"Vietnamese Input Method (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"89d714f6-9f35-4107-b8af-a16777f66337","last_modified":1537309752952},{"guid":"Safe@vietbacsecurity.com","prefs":[],"schema":1537309684266,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491717","why":"Logging and sending keystrokes to a remote server.","name":"SafeKids (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c651780e-c185-4d6c-b509-d34673c158a3","last_modified":1537309741758},{"guid":"/^((\\{c9226c62-9948-4038-b247-2b95a921135b\\})|(\\{5de34d4f-b891-4575-b54b-54c53b4e6418\\})|(\\{9f7ac3be-8f1c-47c6-8ebe-655b29eb7f21\\})|(\\{bb33ccaf-e279-4253-8946-cfae19a35aa4\\}))$/","prefs":[],"schema":1537305338753,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491298","why":"These add-ons inject remote malicious scripts on Google websites.","name":"Dll and similar (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"54b3e69a-40ae-4be5-b7cf-cf51c526dcfb","last_modified":1537306138745},{"guid":"updater-pro-unlisted@mozilla.com","prefs":[],"schema":1537305285414,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491306","why":"Redirects search queries.","name":"Updater Pro (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3108c151-9f25-4eca-8d80-a2fbb2d9bd07","last_modified":1537305338747},{"guid":"/^((\\{686fc9c5-c339-43db-b93a-5181a217f9a6\\})|(\\{eb4b28c8-7f2d-4327-a00c-40de4299ba44\\})|(\\{58d735b4-9d6c-4e37-b146-7b9f7e79e318\\})|(\\{ff608c10-2abc-415c-9fe8-0fdd8e988de8\\})|(\\{5a8145e2-6cbb-4509-a268-f3121429656c\\})|(\\{6d451f29-1d6b-4c34-a510-c1234488b0a3\\})|(\\{de71f09a-3342-48c5-95c1-4b0f17567554\\})|(\\{df106b04-984e-4e27-97b6-3f3150e98a9e\\})|(\\{70DE470A-4DC0-11E6-A074-0C08D310C1A8\\})|(\\{4dcde019-2a1b-499b-a5cd-322828e1279b\\})|(\\{1ec3563f-1567-49a6-bb5c-75d52334b01c\\})|(\\{c140c82e-98e6-49fd-ae17-0627e6f7c5e1\\})|(\\{2581c1f6-5ad9-48d4-8008-4c37dcea1984\\})|(\\{a2bcc6f7-14f7-4083-b4b0-c335edc68612\\})|(\\{4c726bb6-a2af-44ed-b498-794cfd8d8838\\})|(\\{fa6c39a6-cd11-477b-966d-f388f0ba4203\\})|(\\{26c7bd04-18d3-47f5-aeec-bb54e562acf2\\})|(\\{7a961c90-2071-4f94-9d9a-d4e3bbf247c0\\})|(\\{a0481ea2-03f0-4e56-a0e1-030908ecb43e\\})|(\\{c98fb54e-d25f-43f4-bd72-dfaa736391e2\\})|(\\{da57263d-adfc-4768-91f7-b3b076c20d63\\})|(\\{3abb352c-8735-4fb6-9fd6-8117aea3d705\\})|(contactus@unzipper\\.com)|(\\{a1499769-6978-4647-ac0f-78da4652716d\\})|(\\{581D0A4C-1013-11E7-938B-FCD2A0406E17\\})|(\\{68feffe4-bfd8-4fc3-8320-8178a3b7aa67\\})|(\\{823489ae-1bf8-4403-acdd-ea1bdc6431da\\})|(\\{4c0d11c3-ee81-4f73-a63c-da23d8388abd\\})|(\\{dc7d2ecc-9cc3-40d7-93ed-ef6f3219bd6f\\})|(\\{21f29077-6271-46fc-8a79-abaeedb2002b\\})|(\\{55d15d4d-da76-44ab-95a3-639315be5ef8\\})|(\\{edfbec6b-8432-4856-930d-feb334fb69c1\\})|(\\{f81a3bf7-d626-48cf-bd24-64e111ddc580\\})|(\\{4407ab94-60ae-4526-b1ab-2521ffd285c7\\})|(\\{4aa2ba11-f87b-4950-8250-cd977252e556\\})|(\\{646b0c4d-4c6f-429d-9b09-37101b36ed1c\\})|(\\{1b2d76f1-4906-42d2-9643-0ce928505dab\\})|(\\{1869f89d-5f15-4c0d-b993-2fa8f09694fb\\})|(\\{7e4edd36-e3a6-4ddb-9e98-22b4e9eb4721\\})|(\\{e9c9ad8c-84ba-43f2-9ae2-c1448694a2a0\\})|(\\{6b2bb4f0-78ea-47c2-a03a-f4bf8f916eda\\})|(\\{539e1692-5841-4ac6-b0cd-40db15c34738\\}))$/","prefs":[],"schema":1536183366865,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1488578","why":"These add-ons take away user control by redirecting search.","name":"Tightrope search add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"81eb67a5-3fdb-448c-aadd-5f4d3b7cf281","last_modified":1536186868443},{"guid":"/^((\\{f01a138a-c051-4bc7-a90a-21151ce05755\\})|(\\{50f78250-63ce-4191-b7c3-e0efc6309b64\\})|(\\{3d2b2ff4-126b-4874-a57e-ed7dac670230\\})|(\\{e7c1abd4-ec8e-4519-8f3a-7bd763b8a353\\})|(\\{4d40bf75-fbe2-45f6-a119-b191c2dd33b0\\})|(\\{08df7ff2-dee0-453c-b85e-f3369add18ef\\}))$/","prefs":[],"schema":1535990752587,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1488248","why":"Add-ons that inject malicious remote code.","name":"Various Malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"67f72634-e170-4860-a5a3-133f160ebc32","last_modified":1535992146430},{"guid":"/^((\\{1cfaec8b-a1cb-4fc5-b139-897a22a71390\\})|(\\{2ed89659-09c1-4280-9dd7-1daf69272a86\\})|(\\{5c82f5cc-31f8-4316-bb7d-45a5c05227e6\\})|(\\{6a98a401-378c-4eac-b93c-da1036a00c6c\\})|(\\{6d83ebde-6396-483c-b078-57c9d445abfa\\})|(\\{07efb887-b09f-4028-8f7f-c0036d0485ea\\})|(\\{36f4882f-ff0b-4865-8674-ef02a937f7da\\})|(\\{61dea9e9-922d-4218-acdd-cfef0fdf85e7\\})|(\\{261be583-9695-48e0-bd93-a4feafaa18e6\\})|(\\{401ae092-6c5c-4771-9a87-a6827be80224\\})|(\\{534b7a84-9fc6-4d7c-9d67-e3365d2ae088\\})|(\\{552a949f-6d0e-402d-903d-1550075541ba\\})|(\\{579b8de8-c461-4301-ab09-695579f9b7c7\\})|(\\{754d3be3-7337-488e-a5bb-86487e495495\\})|(\\{2775f69b-75e4-46cb-a5aa-f819624bd9a6\\})|(\\{41290ec4-b3f0-45ad-b8f3-7bcbca01ed0d\\})|(\\{0159131f-d76f-4365-81cd-d6831549b90a\\})|(\\{01527332-1170-4f20-a65b-376e25438f3d\\})|(\\{760e6ff0-798d-4291-9d5f-12f48ef7658b\\})|(\\{7e31c21c-156a-4783-b1ce-df0274a89c75\\})|(\\{8e247308-a68a-4280-b0e2-a14c2f15180a\\})|(\\{b6d36fe8-eca1-4d85-859e-a4cc74debfed\\})|(\\{bab0e844-2979-407f-9264-c87ebe279e72\\})|(\\{d00f78fe-ee73-4589-b120-5723b9a64aa0\\})|(\\{d59a7294-6c08-4ad5-ba6d-a3bc41851de5\\})|(\\{d145aa5b-6e66-40cb-8a08-d55a53fc7058\\})|(\\{d79962e3-4511-4c44-8a40-aed6d32a53b1\\})|(\\{e3e2a47e-7295-426f-8517-e72c31da3f23\\})|(\\{e6348f01-841d-419f-8298-93d6adb0b022\\})|(\\{eb6f8a22-d96e-4727-9167-be68c7d0a7e9\\})|(\\{fdd72dfe-e10b-468b-8508-4de34f4e95e3\\}))$/","prefs":[],"schema":1535830899087,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1487472","why":"Several add-ons that change forcefully override search settings.","name":"Various malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"43f11241-88e3-4139-9f02-ac39489a241f","last_modified":1535990735167},{"guid":"/^((\\{35253b0b-8109-437f-b8fa-d7e690d3bde1\\})|(\\{0c8d774c-0447-11e7-a3b1-1b43e3911f03\\})|(\\{c11f85de-0bf8-11e7-9dcd-83433cae2e8e\\})|(\\{f9f072c8-5357-11e7-bb4c-c37ea2335fb4\\})|(\\{b6d09408-a35e-11e7-bc48-f3e9438e081e\\}))$/","prefs":[],"schema":1535658090284,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1486754","why":"Add-ons that execute remote malicious code.","name":"Several malicious add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"56bd2f99-57eb-4904-840a-23ca155d93ad","last_modified":1535701073599},{"guid":"/^((fireAnalytics\\.download@mozilla\\.com)|(fireabsorb@mozilla\\.com)|(fireaccent@mozilla\\.com)|(fireaccept@mozilla\\.com)|(fireads@mozilla\\.com)|(firealerts@mozilla\\.com)|(fireapi@mozilla\\.com)|(fireapp@mozilla\\.com)|(fireattribution@mozilla\\.com)|(fireauthenticator@mozilla\\.com)|(firecalendar@mozilla\\.com)|(firemail@mozilla\\.com)|(firemarketplace@mozilla\\.com)|(firequestions@mozilla\\.com)|(firescript@mozilla\\.com)|(firesheets@mozilla\\.com)|(firespam@mozilla\\.com)|(firesuite@mozilla\\.com)|(\\{3b6dfc8f-e8ed-4b4c-b616-bdc8c526ac1d\\})|(\\{834f87db-0ff7-4518-89a0-0167a963a869\\})|(\\{4921fe4d-fbe6-4806-8eed-346d7aff7c75\\})|(\\{07809949-bd7d-40a6-a17b-19807448f77d\\})|(\\{68968617-cc8b-4c25-9c38-34646cdbe43e\\})|(\\{b8b2c0e1-f85d-4acd-aeb1-b6308a473874\\})|(\\{bc0b3499-f772-468e-9de6-b4aaf65d2bbb\\}))$/","prefs":[],"schema":1535555549913,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1486636","why":"Add-ons that hijack search settings.","name":"Various malicious add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fcd12629-43df-4751-9654-7cc008f8f7c0","last_modified":1535555562143},{"guid":"/^((\\{25211004-63e4-4a94-9c71-bdfeabb72bfe\\})|(\\{cbf23b92-ea55-4ca9-a5ae-f4197e286bc8\\})|(\\{7ac0550e-19cb-4d22-be12-b0b352144b33\\})|(Mada111@mozilla\\.com)|(\\{c71709a9-af59-4958-a587-646c8c314c16\\})|(\\{6ac3f3b4-18db-4f69-a210-7babefd94b1e\\})|(addon@fastsearch\\.me)|(\\{53d152fa-0ae0-47f1-97bf-c97ca3051562\\})|(\\{f9071611-24ee-472b-b106-f5e2f40bbe54\\})|(\\{972920f1-3bfd-4e99-b605-8688a94c3c85\\})|(\\{985afe98-fa74-4932-8026-4bdc880552ac\\})|(\\{d96a82f5-5d3e-46ed-945f-7c62c20b7644\\})|(\\{3a036dc5-c13b-499a-a62d-e18aab59d485\\})|(\\{49574957-56c6-4477-87f1-1ac7fa1b2299\\})|(\\{097006e8-9a95-4f7c-9c2f-59f20c61771c\\})|(\\{8619885d-0380-467a-b3fe-92a115299c32\\})|(\\{aa0587d6-4760-4abe-b3a1-2a5958f46775\\})|(\\{bdada7ae-cf89-46cf-b1fe-f3681f596278\\})|(\\{649bead3-df51-4023-8090-02ceb2f7095a\\})|(\\{097c3142-0b68-416a-9919-9dd576aedc17\\})|(\\{bc3cced8-51f0-4519-89ee-56706b67ea4b\\})|(\\{796da6e3-01c0-4c63-96dd-1737710b2ff6\\}))$/","prefs":[],"schema":1535485297866,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1487083","why":"Add-ons that hijack search settings and contain other unwanted features.","name":"Vairous malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"016676cc-c381-4c01-adcf-2d46f48142d0","last_modified":1535550828514},{"guid":"/^((Timemetric@tmetric)|(image-fastpicker@eight04.blogspot\\.com)|(textMarkertool@underFlyingBirches\\.org)|(youpanel@jetpack)|({0ff32ce0-dee9-4e7e-9260-65e58373e21d})|({4ca00873-7e8d-4ada-b460-96cad0eb8fa9})|({6b427f73-2ee1-4256-b69d-7dc253ebe030})|({6f13489d-b274-45b6-80fa-e9daa140e1a4})|({40a9d23b-09ef-4c82-ae1d-7fc5c067e987})|({205c2185-ebe4-4106-92ab-0ffa7c4efcbb})|({256ec7b0-57b4-416d-91c1-2bfdf01b2438})|({568db771-c718-4587-bcd0-e3728ee53550})|({5782a0f1-de26-42e5-a5b3-dae9ec05221b})|({9077390b-89a9-41ad-998f-ab973e37f26f})|({8e7269ac-a171-4d9f-9c0a-c504848fd52f})|({3e6586e2-7410-4f10-bba0-914abfc3a0b4})|({b3f06312-93c7-4a4f-a78b-f5defc185d8f})|({c1aee371-4401-4bab-937a-ceb15c2323c1})|({c579191c-6bb8-4795-adca-d1bf180b512d})|({d0aa0ad2-15ed-4415-8ef5-723f303c2a67})|({d8157e0c-bf39-42eb-a0c3-051ff9724a8c})|({e2a4966f-919d-4afc-a94f-5bd6e0606711})|({ee97f92d-1bfe-4e9d-816c-0dfcd63a6206}))$/","prefs":[],"schema":1535356061028,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1485145","why":"Add-ons that run remote malicious code from websites that trick the user into installing the add-on.","name":"Malware running remote malicious code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a0d44ee3-9492-47d7-ac1c-35f520e819ae","last_modified":1535393877555},{"guid":"/^((fastplayer@fastsearch\\.me)|(ff-search-flash-unlisted@mozilla\\.com)|(inspiratiooo-unlisted@mozilla\\.com)|(lite-search-ff-unlisted@mozilla\\.com)|(mysearchprotect-unlisted@mozilla\\.com)|(pdfconverter-unlisted@mozilla\\.com)|(plugin-search-ff-unlisted@mozilla\\.com)|(pro-search-ff-unlisted@mozilla\\.com)|(pro-search-unlisted@mozilla\\.com)|(searchincognito-unlisted@mozilla\\.com)|(socopoco-search@mozilla\\.com)|(socopoco-unlisted@mozilla\\.com)|(\\{08ea1e08-e237-42e7-ad60-811398c21d58\\})|(\\{0a56e2a0-a374-48b6-9afc-976680fab110\\})|(\\{193b040d-2a00-4406-b9ae-e0d345b53201\\})|(\\{1ffa2e79-7cd4-4fbf-8034-20bcb3463d20\\})|(\\{528cbbe2-3cde-4331-9344-e348cb310783\\})|(\\{6f7c2a42-515a-4797-b615-eaa9d78e8c80\\})|(\\{be2a3fba-7ea2-48b9-bbae-dffa7ae45ef8\\})|(\\{c0231a6b-c8c8-4453-abc9-c4a999a863bd\\}))$/","prefs":[],"schema":1535139689975,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483854","why":"Add-ons overwriting search changes without consent and remote script injection","name":"\"Flash Updater\" and search redirectors"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"46779b5a-2369-4007-bff0-857a657626ba","last_modified":1535153064735},{"guid":"/^(({aeac6f90-5e17-46fe-8e81-9007264b907d})|({6ee25421-1bd5-4f0c-9924-79eb29a8889d})|({b317fa11-c23d-45b9-9fd8-9df41a094525})|({16ac3e8f-507a-4e04-966b-0247a196c0b4}))$/","prefs":[],"schema":1534946831027,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1485609","why":"Add-ons that take away user control by changing search settings.","name":"Search hijacking malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ab029019-0e93-450a-8c11-ac31556c2a77","last_modified":1535020847820},{"guid":"@testpilot-addon","prefs":[],"schema":1534876689555,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1485083","why":"Older versions of the TestPilot add-on cause stability issues in Firefox.","name":"Testpilot (old, broken versions)"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"2.0.8-dev-259fe19","minVersion":"0"}],"id":"ee2d12a4-ea1d-4f3d-9df1-4303e8993f18","last_modified":1534946810180},{"guid":"/^((@svuznnqyxinw)|(myprivacytools@besttools\\.com)|(powertools@penprivacy\\.com)|(privacypro@mybestprivacy\\.com)|(realsecure@top10\\.com)|(rlbvpdfrlbgx@scoutee\\.net)|(vfjkurlfijwz@scoutee\\.net))$/","prefs":[],"schema":1534382102271,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1482322","why":"Add-ons that change the default search engine, taking away user control.","name":"Search hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"df852b6a-28be-4b10-9285-869f4761f111","last_modified":1534382538298},{"guid":"/^(({1a3fb414-0945-405c-a62a-9fe5e1a50c69})|({1a45f6aa-d80a-4317-84d2-0ce43671b08a})|({2d52a462-8bec-4708-9cd1-894b682bdc78})|({3f841cfc-de5a-421f-8bd7-2bf1d943b02a})|({5c7601bf-522b-47e5-b0f0-ea0e706af443})|({7ebe580f-71c9-4ef8-8073-f38deaeb9dfb})|({8b2188fd-1daf-4851-b387-28d964014353})|({8cee42ac-f1fe-40ae-aed6-24e3b76b2f77})|({8d13c4a9-5e8c-47a6-b583-681c83164ac9})|({9b1d775a-1877-45c9-ad48-d6fcfa4fff39})|({9efdbe5f-6e51-4a35-a41b-71dc939e6221})|({23f63efb-156e-440b-a96c-118bebc21057})|({026dfc8c-ecc8-41ba-b45f-70ffbd5cc672})|({34aa433c-27e9-4c87-a662-9f82f99eb9af})|({36f34d69-f22f-47c3-b4cd-4f37b7676107})|({39bd8607-0af4-4d6b-bd69-9a63c1825d3c})|({48c6ad6d-297c-4074-8fef-ca5f07683859})|({54aa688d-9504-481d-ba75-cfee421b98e0})|({59f59748-e6a8-4b41-87b5-9baadd75ddef})|({61d99407-1231-4edc-acc8-ab96cbbcf151})|({68ca8e3a-397a-4135-a3af-b6e4068a1eae})|({71beafd6-779b-4b7d-a78b-18a107277b59})|({83ed90f8-b07e-4c45-ba6b-ba2fe12cebb6})|({231dfb44-98e0-4bc4-b6ee-1dac4a836b08})|({273f0bce-33f4-45f6-ae03-df67df3864c2})|({392f4252-c731-4715-9f8d-d5815f766abb})|({484ec5d0-4cfd-4d96-88d0-a349bfc33780})|({569dbf47-cc10-41c4-8fd5-5f6cf4a833c7})|({578cad7a-57d5-404d-8dda-4d30de33b0c2})|({986b2c3f-e335-4b39-b3ad-46caf809d3aa})|({1091c11f-5983-410e-a715-0968754cff54})|({2330eb8a-e3fe-4b2e-9f17-9ddbfb96e6f5})|({5920b042-0af1-4658-97c1-602315d3b93d})|({6331a47f-8aae-490c-a9ad-eae786b4349f})|({6698b988-c3ef-4e1f-8740-08d52719eab5})|({30516f71-88d4-489b-a27f-d00a63ad459f})|({12089699-5570-4bf6-890f-07e7f674aa6e})|({84887738-92bf-4903-a5e8-695fd078c657})|({8562e48e-3723-412a-9ebd-b33d3d3b29dd})|({6e449795-c545-41be-92c0-5d467c147389})|({1e369c7c-6b61-436e-8978-4640687670d6})|({a03d427a-bd2e-42b6-828f-a57f38fac7b5})|({a77fc9b9-6ebb-418d-b0b6-86311c191158})|({a368025b-9828-43a1-8a5c-f6fab61c9be9})|({b1908b02-410d-4778-8856-7e259fbf471d})|({b9425ace-c2e9-4ec4-b564-4062546f4eca})|({b9845b5d-70c9-419c-a9a5-98ea8ee5cc01})|({ba99fee7-9806-4e32-8257-a33ffc3b8539})|({bdf8767d-ae4c-4d45-8f95-0ba29b910600})|({c6c4a718-cf91-4648-aa9b-170d66163cf2})|({ca0f2988-e1a8-4e83-afde-0dca56a17d5f})|({cac5db09-979b-40e3-8c8e-d96397b0eecb})|({d3b5280b-f8d8-4669-bdf6-91f23ae58042})|({d73d2f6a-ea24-4b1b-8c76-563fce9f786d})|({d77fed37-85c0-4b94-89bb-0d2849472b8d})|({d371abec-84bb-481b-acbf-235639451127})|({de47a3b4-dad1-4f4a-bdd6-8666586e29e8})|({ded6afad-2aaa-446b-b6bd-b12a8a61c945})|({e0c3a1ca-8e21-4d1b-b53b-ea115cf59172})|({e6bbf496-6489-4b48-8e5a-799aad4aa742})|({e63b262a-f9b8-4496-9c4b-9d3cbd6aea90})|({e73c1b5d-20f7-4d86-ad16-9de3c27718e2})|({eb01dc49-688f-4a21-aa8d-49bd88a8f319})|({edc9816b-60b4-493c-a090-01125e0b8018})|({effa2f97-0f07-44c8-99cb-32ac760a0621})|({f6e6fd9b-b89f-4e8d-9257-01405bc139a6})|({ff87977a-fefb-4a9d-b703-4b73dce8853d})|({ffea9e62-e516-4238-88a7-d6f9346f4955}))$/","prefs":[],"schema":1534335096640,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483191","why":"Add-ons that change the default search engine, taking away user control.","name":"Search hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d9892a76-b22e-40bd-8073-89b0f8110ec7","last_modified":1534336165428},{"guid":"/^((Timemetric@tmetric)|(textMarkertool@underFlyingBirches\\.org)|(youpanel@jetpack)|({6f13489d-b274-45b6-80fa-e9daa140e1a4})|({568db771-c718-4587-bcd0-e3728ee53550})|({829827cd-03be-4fed-af96-dd5997806fb4})|({9077390b-89a9-41ad-998f-ab973e37f26f})|({8e7269ac-a171-4d9f-9c0a-c504848fd52f})|({aaaffe20-3306-4c64-9fe5-66986ebb248e})|({bf153de7-cdf2-4554-af46-29dabfb2aa2d})|({c579191c-6bb8-4795-adca-d1bf180b512d})|({e2a4966f-919d-4afc-a94f-5bd6e0606711})|({ee97f92d-1bfe-4e9d-816c-0dfcd63a6206}))$/","prefs":[],"schema":1534275699570,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483206","why":"Add-ons that execute malicious remote code","name":"Various malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2734325e-143b-4962-98bf-4b18c77407e2","last_modified":1534334500118},{"guid":"{5834f62d-6164-4cdd-a0a3-c00c66ec9d13}","prefs":[],"schema":1532704368947,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479002","why":"This add-on violates our security and user-choice/no surprises policies.","name":"Youtube Dark Mode (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d0a401cb-0c70-4784-8288-b06a88b2ae8a","last_modified":1532705151926},{"guid":"/^((@asdfjhsdfuhw)|(@asdfsdfwe)|(@asdieieuss)|(@dghfghfgh)|(@difherk)|(@dsfgtftgjhrdf4)|(@fidfueir)|(@fsgergsdqtyy)|(@hjconsnfes)|(@isdifvdkf)|(@iweruewir)|(@oiboijdjfj)|(@safesearchavs)|(@safesearchavsext)|(@safesearchincognito)|(@safesearchscoutee)|(@sdfykhhhfg)|(@sdiosuff)|(@sdklsajd)|(@sduixcjksd)|(@sicognitores)|(@simtabtest)|(@sodiasudi)|(@test13)|(@test131)|(@test131ver)|(@test132)|(@test13s)|(@testmptys)|(\\{ac4e5b0c-13c4-4bfd-a0c3-1e73c81e8bac\\})|(\\{e78785c3-ec49-44d2-8aac-9ec7293f4a8f\\})|(general@filecheckerapp\\.com)|(general@safesearch\\.net))$/","prefs":[],"schema":1532703832328,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1475330","why":"These Add-ons violate our data collection, no surprises and user-choice policies.","name":"Safesearch (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d664412d-ed08-4892-b247-b007a70856ff","last_modified":1532704364007},{"guid":"{dd3d7613-0246-469d-bc65-2a3cc1668adc}","prefs":[],"schema":1532684052432,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1478731","why":"This add-on violates data practices outlined in the review policy.","name":"BlockSite"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"4.0.3","minVersion":"0"}],"id":"e04f98b5-4480-43a3-881d-e509e4e28cdc","last_modified":1532684085999},{"guid":"{bee8b1f2-823a-424c-959c-f8f76c8b2306}","prefs":[],"schema":1532547689407,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1478731","why":"This add-on violates data practices outlined in the review policy.","name":"Popup blocker for FireFox"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"4.0.7.3","minVersion":"0"}],"id":"f0713a5e-7208-484e-b3a0-4e6dc6a195be","last_modified":1532684052426},{"guid":"/^((\\{39bd8607-0af4-4d6b-bd69-9a63c1825d3c\\})|(\\{273f0bce-33f4-45f6-ae03-df67df3864c2\\})|(\\{a77fc9b9-6ebb-418d-b0b6-86311c191158\\})|(\\{c6c4a718-cf91-4648-aa9b-170d66163cf2\\})|(\\{d371abec-84bb-481b-acbf-235639451127\\})|(\\{e63b262a-f9b8-4496-9c4b-9d3cbd6aea90\\}))$/","prefs":[],"schema":1532386339902,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1477950","why":"Add-ons that contain malicious functionality like search engine redirect.","name":"Smash (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c37c7c24-e738-4d06-888c-108b4d63b428","last_modified":1532424286908},{"guid":"/^((\\{ac296b47-7c03-486f-a1d6-c48b24419749\\})|(\\{1cab8ccf-deff-4743-925d-a47cbd0a6b56\\})|(\\{5da81d3d-5db1-432a-affc-4a2fe9a70749\\})|(\\{071b9878-a7d3-4ae3-8ef0-2eaee1923403\\})|(\\{261476ea-bd0e-477c-abd7-33cdf626f81f\\})|(\\{224e66d0-6b11-4c4b-9bcf-41180889898a\\})|(\\{1e90cf52-c67c-4bd9-80c3-a2bf521fc981\\})|(\\{09c4799c-00f1-439e-9e60-3827c589b372\\})|(\\{d3d2095a-9faa-466f-82ae-3114179b34d6\\})|(\\{70389ea5-7e4d-4515-835c-fbd047f229dd\\})|(\\{2e8083a5-cd88-4aaa-bb8b-e54e9753f280\\})|(\\{fbf2480b-5c19-478e-bfd0-192ad9f84dc9\\})|(\\{6c7dc694-89f8-477e-88d5-c55af4d6a846\\})|(\\{915c12c6-901a-490d-9bfc-20f00d1ad31d\\})|(\\{d3a4aa3e-f74c-4382-876d-825f592f2976\\})|(\\{0ad91ec1-f7c4-4a39-9244-3310e9fdd169\\})|(\\{9c17aa27-63c5-470a-a678-dc899ab67ed3\\})|(\\{c65efef2-9988-48db-9e0a-9ff8164182b6\\})|(\\{d54c5d25-2d51-446d-8d14-18d859e3e89a\\})|(\\{e458f1f1-a331-4486-b157-81cba19f0993\\})|(\\{d2de7e1f-6e51-41d6-ba8a-937f8a5c92ff\\})|(\\{2b08a649-9bea-4dd4-91c8-f53a84d38e19\\})|(\\{312dd57e-a590-4e19-9b26-90e308cfb103\\})|(\\{82ce595a-f9b6-4db8-9c97-b1f1c933418b\\})|(\\{0a2e64f0-ea5a-4fff-902d-530732308d8e\\})|(\\{5fbdc975-17ab-4b4e-90d7-9a64fd832a08\\})|(\\{28820707-54d8-41f0-93e9-a36ffb2a1da6\\})|(\\{64a2aed1-5dcf-4f2b-aad6-9717d23779ec\\})|(\\{ee54794f-cd16-4f7d-a7dd-515a36086f60\\})|(\\{4d381160-b2d5-4718-9a05-fc54d4b307e7\\})|(\\{60393e0e-f039-4b80-bad4-10189053c2ab\\})|(\\{0997b7b2-52d7-4d14-9aa6-d820b2e26310\\})|(\\{8214cbd6-d008-4d16-9381-3ef1e1415665\\})|(\\{6dec3d8d-0527-49a3-8f12-b05f2a8b95b2\\})|(\\{0c0d8d8f-3ae0-4c98-81ac-06453a316d16\\})|(\\{84d5ef02-a283-484a-80da-7087836c74aa\\})|(\\{24413756-2c44-47c5-8bbf-160cb37776d8\\})|(\\{cf6ac458-06e8-45d0-9cbf-ec7fc0eb1710\\})|(\\{263a5792-933a-4de1-820a-d04198e17120\\})|(\\{b5fd7f37-190d-4c0a-b8dd-8b4850c986ac\\})|(\\{cb5ef07b-c2e7-47a6-be81-2ceff8df4dd5\\})|(\\{311b20bc-b498-493c-a5e1-22ec32b0e83c\\})|(\\{b308aead-8bc1-4f37-9324-834b49903df7\\})|(\\{3a26e767-b781-4e21-aaf8-ac813d9edc9f\\}))$/","prefs":[],"schema":1532361925873,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1476553","why":"Third-party websites try to trick users into installing add-ons that inject remote scripts.","name":"Various malicious add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"52842139-3d11-41ac-9d7f-8e51122a3141","last_modified":1532372344457},{"guid":"{46551EC9-40F0-4e47-8E18-8E5CF550CFB8}","prefs":[],"schema":1530711142817,"blockID":"i1900","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1472948","why":"This add-on violates data practices outlined in the review policy.","name":"Stylish"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.1.1","minVersion":"3.0.0"}],"id":"c635229f-7aa0-44c5-914f-80c590949071","last_modified":1530716488758},{"guid":"/^(contactus@unzipper.com|{72dcff4e-48ce-41d8-a807-823adadbe0c9}|{dc7d2ecc-9cc3-40d7-93ed-ef6f3219bd6f}|{994db3d3-ccfe-449a-81e4-f95e2da76843}|{25aef460-43d5-4bd0-aa3d-0a46a41400e6}|{178e750c-ae27-4868-a229-04951dac57f7})$/","prefs":[],"schema":1528400492025,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1460331","why":"Add-ons change search settings against our policies, affecting core Firefox features. Add-on is also reportedly installed without user consent.","name":"SearchWeb"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5afea853-d029-43f3-a387-64ce9980742a","last_modified":1528408770328},{"guid":"{38363d75-6591-4e8b-bf01-0270623d1b6c}","prefs":[],"schema":1526326889114,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1461625","why":"This add-on contains abusive functionality.","name":"Photobucket Hotlink Fix"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0f0764d5-a290-428b-a5b2-3767e1d72c71","last_modified":1526381862851},{"guid":"@vkmad","prefs":[],"schema":1526154098016,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1461410","why":"This add-on includes malicious functionality.","name":"VK Universal Downloader (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cbfa5303-c1bf-49c8-87d8-259738a20064","last_modified":1526322954850},{"guid":"/((@extcorp\\.[a-z]+)|(@brcorporation\\.com)|(@brmodcorp\\.com)|(@teset\\.com)|(@modext\\.tech)|(@ext?mod\\.net)|(@browcorporation\\.org)|(@omegacorporation\\.org)|(@browmodule\\.com)|(@corpext\\.net)|({6b50ddac-f5e0-4d9e-945b-e4165bfea5d6})|({fab6484f-b8a7-4ba9-a041-0f948518b80c})|({b797035a-7f29-4ff5-bd19-77f1b5e464b1})|({0f612416-5c5a-4ec8-b482-eb546af9cac4}))$/","prefs":[],"schema":1525290095999,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1458330","why":"These are malicious add-ons that inject remote scripts and use deceptive names.","name":"\"Table\" add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3ab9f100-e253-4080-b3e5-652f842ddb7a","last_modified":1525377099954},{"guid":"/^({b99ae7b1-aabb-4674-ba8f-14ed32d04e76})|({dfa77d38-f67b-4c41-80d5-96470d804d09})$/","prefs":[],"schema":1524146566650,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1455291","why":"These add-ons claim to be the flash plugin.","name":"Flash Plugin (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"96b137e6-8cb5-44d6-9a34-4a4a76fb5e38","last_modified":1524147337556},{"guid":"/^({6ecb9f49-90f0-43a1-8f8a-e809ea4f732b})|(@googledashboard)|(@smashdashboard)|(@smash_tv)|(@smash_mov)|(@smashmovs)|(@smashtvs)|(@FirefoxUpdate)|({92b9e511-ac81-4d47-9b8f-f92dc872447e})|({3c841114-da8c-44ea-8303-78264edfe60b})|({116a0754-20eb-4fe5-bd35-575867a0b89e})|({6e6ff0fd-4ae4-49ae-ac0c-e2527e12359b})|({f992ac88-79d3-4960-870e-92c342ed3491})|({6ecb9f49-90f0-43a1-8f8a-e809ea4f732b})|({a512297e-4d3a-468c-bd1a-f77bd093f925})|({08c28c16-9fb6-4b32-9868-db37c1668f94})|({b4ab1a1d-e137-4c59-94d5-4f509358a81d})|({feedf4f8-08c1-451f-a717-f08233a64ec9})$/","prefs":[],"schema":1524139371832,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1454691","why":"This malware prevents itself from getting uninstalled ","name":"Malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"feb2d0d7-1b76-4dba-bf84-42873a92af5f","last_modified":1524141477640},{"guid":"{872f20ea-196e-4d11-8835-1cc4c877b1b8}","prefs":[],"schema":1523734896380,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1454413","why":"Extension claims to be Flash Player","name":"Flash Player (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1e5f5cb2-346c-422a-9aaa-29d8760949d2","last_modified":1523897202689},{"guid":"adbeaver@adbeaver.org","prefs":[],"schema":1521630548030,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1445031","why":"This add-on generates numerous errors when loading Facebook, caused by ad injection included in it. Users who want to continue using this add-on can enable it in the Add-ons Manager.","name":"AdBeaver"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0"}],"id":"baf7f735-d6b6-410a-8cc8-25c60f7c57e2","last_modified":1522103097333},{"guid":"{44685ba6-68b3-4895-879e-4efa29dfb578}","prefs":[],"schema":1521565140013,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1447042","why":"This add-on impersonates a Flash tool and runs remote code on users' systems.","name":"FF Flash Manager"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"547037f2-97ae-435a-863c-efd7532668cd","last_modified":1521630548023},{"guid":"/^(addon@fasterweb\\.com|\\{5f398d3f-25db-47f5-b422-aa2364ff6c0b\\}|addon@fasterp\\.com|addon@calculator)$/","prefs":[],"schema":1520338910918,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1443478","why":"These are malicious add-ons that use deceptive names and run remote scripts.","name":"FasterWeb add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f58729ec-f93c-41d9-870d-dd9c9fd811b6","last_modified":1520358450708},{"guid":"{42baa93e-0cff-4289-b79e-6ae88df668c4}","prefs":[],"schema":1520336325565,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1443196","why":"The add-on claims to be \"Adobe Shockwave Flash Player\"","name":"Adobe Shockwave Flash Player (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0cd723fe-d33d-43a0-b84f-7a3cad253212","last_modified":1520338780397},{"guid":"{f3c31b34-862c-4bc8-a98f-910cc6314a86}","prefs":[],"schema":1519242096699,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1440736","why":"This is a malicious add-on that is masked as an official Adobe Updater and runs malicious code.","name":"Adobe Updater (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"adfd98ef-cebc-406b-b1e0-61bd4c71e4b1","last_modified":1519409417397},{"guid":"/^(\\{fd0c36fa-6a29-4246-810b-0bb4800019cb\\}|\\{b9c1e5bf-6585-4766-93fc-26313ac59999\\}|\\{3de25fff-25e8-40e9-9ad9-fdb3b38bb2f4\\})$/","prefs":[],"schema":1519069296530,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1439432","why":"These are malicious add-ons that are masked as an official Adobe Updater and run malicious code.","name":"Adobe Updater"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4e28ba5c-af62-4e53-a7a1-d33334571cf8","last_modified":1519078890592},{"guid":"/^(\\{01c9a4a4-06dd-426b-9500-2ea6fe841b88\\}|{5e024309-042c-4b9d-a634-5d92cf9c7514\\}|{f4262989-6de0-4604-918f-663b85fad605\\}|{e341ed12-a703-47fe-b8dd-5948c38070e4\\}|{cd89045b-2e06-46bb-9e34-48e8799e5ef2\\}|{ac296b47-7c03-486f-a1d6-c48b24419749\\}|{5da81d3d-5db1-432a-affc-4a2fe9a70749\\}|{df09f268-3c92-49db-8c31-6a25a6643896\\}|{81ac42f3-3d17-4cff-85af-8b7f89c8826b\\}|{09c8fa16-4eec-4f78-b19d-9b24b1b57e1e\\}|{71639610-9cc3-47e0-86ed-d5b99eaa41d5\\}|{83d38ac3-121b-4f28-bf9c-1220bd3c643b\\}|{7f8bc48d-1c7c-41a0-8534-54adc079338f\\})$/","prefs":[],"schema":1518550894975,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1438028","why":"These are malicious add-ons that inject remote scripts into popular websites.","name":"Page Marker add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cc5848e8-23d5-4655-b45c-dc239839b74e","last_modified":1518640450735},{"guid":"/^(https|youtube)@vietbacsecurity\\.com$/","prefs":[],"schema":1517909997354,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1435974","why":"These add-ons contain malicious functionality, violating the users privacy and security.","name":"HTTPS and Youtube downloader (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"646e2384-f894-41bf-b7fc-8879e0095109","last_modified":1517910100624},{"guid":"{ed352072-ddf0-4cb4-9cb6-d8aa3741c2de}","prefs":[],"schema":1517514097126,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1434893","why":"This is a malicious add-on that injects remote scripts into popular pages while pretending to do something else.","name":"Image previewer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2104a522-bb2f-4b04-ad0d-b0c571644552","last_modified":1517577111194},{"guid":"/^({be5d0c88-571b-4d01-a27a-cc2d2b75868c})|({3908d078-e1db-40bf-9567-5845aa77b833})|({5b620343-cd69-49b8-a7ba-f9d499ee5d3d})|({6eee2d17-f932-4a43-a254-9e2223be8f32})|({e05ba06a-6d6a-4c51-b8fc-60b461ffecaf})|({a5808da1-5b4f-42f2-b030-161fd11a36f7})|({d355bee9-07f0-47d3-8de6-59b8eecba57b})|({a1f8e136-bce5-4fd3-9ed1-f260703a5582})$/","prefs":[],"schema":1517260691761,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.\n","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"70f37cc7-9f8a-4d0f-a881-f0c56934fa75","last_modified":1517260722621},{"guid":"/^({d78d27f4-9716-4f13-a8b6-842c455d6a46})|({bd5ba448-b096-4bd0-9582-eb7a5c9c0948})|({0b24cf69-02b8-407d-83db-e7af04fc1f3e})|({e08d85c5-4c0f-4ce3-9194-760187ce93ba})|({1c7d6d9e-325a-4260-8213-82d51277fc31})|({8a0699a0-09c3-4cf1-b38d-fec25441650c})|({1e68848a-2bb7-425c-81a2-524ab93763eb})$/","prefs":[],"schema":1517168490224,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"805ee80e-0929-4c92-93ed-062b98053f28","last_modified":1517260691755},{"guid":"/^({abec23c3-478f-4a5b-8a38-68ccd500ec42}|{a83c1cbb-7a41-41e7-a2ae-58efcb4dc2e4}|{62237447-e365-487e-8fc3-64ddf37bdaed}|{b12cfdc7-3c69-43cb-a3fb-38981b68a087}|{1a927d5b-42e7-4407-828a-fdc441d0daae}|{dd1cb0ec-be2a-432b-9c90-d64c824ac371}|{82c8ced2-e08c-4d6c-a12b-3e8227d7fc2a}|{87c552f9-7dbb-421b-8deb-571d4a2d7a21})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c92f2a05-73eb-454e-9583-f6d2382d8bca","last_modified":1516829074251},{"guid":"/^({618baeb9-e694-4c7b-9328-69f35b6a8839}|{b91fcda4-88b0-4a10-9015-9365e5340563}|{04150f98-2d7c-4ae2-8979-f5baa198a577}|{4b1050c6-9139-4126-9331-30a836e75db9}|{1e6f5a54-2c4f-4597-aa9e-3e278c617d38}|{e73854da-9503-423b-ab27-fafea2fbf443}|{a2427e23-d349-4b25-b5b8-46960b218079}|{f92c1155-97b3-40f4-9d5b-7efa897524bb}|{c8e14311-4b2d-4eb0-9a6b-062c6912f50e}|{45621564-b408-4c29-8515-4cf1f26e4bc3}|{27380afd-f42a-4c25-b57d-b9012e0d5d48})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2d4fe65b-6c02-4461-baa8-dda52e688cf6","last_modified":1516829040469},{"guid":"/^({4dac7c77-e117-4cae-a9f0-6bd89e9e26ab}|{cc689da4-203f-4a0c-a7a6-a00a5abe74c5}|{0eb4672d-58a6-4230-b74c-50ca3716c4b0}|{06a71249-ef35-4f61-b2c8-85c3c6ee5617}|{5280684d-f769-43c9-8eaa-fb04f7de9199}|{c2341a34-a3a0-4234-90cf-74df1db0aa49}|{85e31e7e-3e3a-42d3-9b7b-0a2ff1818b33}|{b5a35d05-fa28-41b5-ae22-db1665f93f6b}|{1bd8ba17-b3ed-412e-88db-35bc4d8771d7}|{a18087bb-4980-4349-898c-ca1b7a0e59cd}|{488e190b-d1f6-4de8-bffb-0c90cc805b62})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9a3fd797-0ab8-4286-9a1b-2b6c97f9075b","last_modified":1516829006347},{"guid":"/^({f6df4ef7-14bd-43b5-90c9-7bd02943789c}|{ccb7b5d6-a567-40a2-9686-a097a8b583dd}|{9b8df895-fcdd-452a-8c46-da5be345b5bc}|{5cf77367-b141-4ba4-ac2a-5b2ca3728e81}|{ada56fe6-f6df-4517-9ed0-b301686a34cc}|{95c7ae97-c87e-4827-a2b7-7b9934d7d642}|{e7b978ae-ffc2-4998-a99d-0f4e2f24da82}|{115a8321-4414-4f4c-aee6-9f812121b446}|{bf153de7-cdf2-4554-af46-29dabfb2aa2d}|{179710ba-0561-4551-8e8d-1809422cb09f}|{9d592fd5-e655-461a-9b28-9eba85d4c97f})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aae78cd5-6b26-472e-ab2d-db4105911250","last_modified":1516828973824},{"guid":"/^({30972e0a-f613-4c46-8c87-2e59878e7180}|{0599211f-6314-4bf9-854b-84cb18da97f8}|{4414af84-1e1f-449b-ac85-b79f812eb69b}|{2a8bec00-0ab0-4b4d-bd3d-4f59eada8fd8}|{bea8866f-01f8-49e9-92cd-61e96c05d288}|{046258c9-75c5-429d-8d5b-386cfbadc39d}|{c5d359ff-ae01-4f67-a4f7-bf234b5afd6e}|{fdc0601f-1fbb-40a5-84e1-8bbe96b22502}|{85349ea6-2b5d-496a-9379-d4be82c2c13d}|{640c40e5-a881-4d16-a4d0-6aa788399dd2}|{d42328e1-9749-46ba-b35c-cce85ddd4ace})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"750aa293-3742-46b5-8761-51536afecaef","last_modified":1516828938683},{"guid":"/^({d03b6b0f-4d44-4666-a6d6-f16ad9483593}|{767d394a-aa77-40c9-9365-c1916b4a2f84}|{a0ce2605-b5fc-4265-aa65-863354e85058}|{b7f366fa-6c66-46bf-8df2-797c5e52859f}|{4ad16913-e5cb-4292-974c-d557ef5ec5bb}|{3c3ef2a3-0440-4e77-9e3c-1ca8d48f895c}|{543f7503-3620-4f41-8f9e-c258fdff07e9}|{98363f8b-d070-47b6-acc6-65b80acac4f3}|{5af74f5a-652b-4b83-a2a9-f3d21c3c0010}|{484e0ba4-a20b-4404-bb1b-b93473782ae0}|{b99847d6-c932-4b52-9650-af83c9dae649})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a29aed6f-6546-4fa2-8131-df5c9a5427af","last_modified":1516828911059},{"guid":"/^({2bb68b03-b528-4133-9fc4-4980fbb4e449}|{231e58ac-0f3c-460b-bb08-0e589360bec7}|{a506c5af-0f95-4107-86f8-3de05e2794c9}|{8886a262-1c25-490b-b797-2e750dd9f36b}|{65072bef-041f-492e-8a51-acca2aaeac70}|{6fa41039-572b-44a4-acd4-01fdaebf608d}|{87ba49bd-daba-4071-aedf-4f32a7e63dbe}|{95d58338-ba6a-40c8-93fd-05a34731dc0e}|{4cbef3f0-4205-4165-8871-2844f9737602}|{1855d130-4893-4c79-b4aa-cbdf6fee86d3}|{87dcb9bf-3a3e-4b93-9c85-ba750a55831a})$/","prefs":[],"schema":1516822896448,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5c092b0d-7205-43a1-aa75-b7a42372fb52","last_modified":1516828883523},{"guid":"/^({fce89242-66d3-4946-9ed0-e66078f172fc})|({0c4df994-4f4a-4646-ae5d-8936be8a4188})|({6cee30bc-a27c-43ea-ac72-302862db62b2})|({e08ebf0b-431d-4ed1-88bb-02e5db8b9443})$/","prefs":[],"schema":1516650096284,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1432560","why":"These are malicious add-ons that make it hard for the user to be removed.","name":"FF AntiVir Monitoring"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9dfeee42-e6a8-49e0-8979-0648f7368239","last_modified":1516744119329},{"guid":"/^(\\{1490068c-d8b7-4bd2-9621-a648942b312c\\})|(\\{d47ebc8a-c1ea-4a42-9ca3-f723fff034bd\\})|(\\{83d6f65c-7fc0-47d0-9864-a488bfcaa376\\})|(\\{e804fa4c-08e0-4dae-a237-8680074eba07\\})|(\\{ea618d26-780e-4f0f-91fd-2a6911064204\\})|(\\{ce93dcc7-f911-4098-8238-7f023dcdfd0d\\})|(\\{7eaf96aa-d4e7-41b0-9f12-775c2ac7f7c0\\})|(\\{b019c485-2a48-4f5b-be13-a7af94bc1a3e\\})|(\\{9b8a3057-8bf4-4a9e-b94b-867e4e71a50c\\})|(\\{eb3ebb14-6ced-4f60-9800-85c3de3680a4\\})|(\\{01f409a5-d617-47be-a574-d54325fe05d1\\})$/","prefs":[],"schema":1516394914836,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are a set of malicious add-ons that block the add-ons manager tab from opening so they can't be uninstalled.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5bf72f70-a611-4845-af3f-d4dabe8862b6","last_modified":1516394982586},{"guid":"/^(\\{ac06c6b2-3fd6-45ee-9237-6235aa347215\\})|(\\{d461cc1b-8a36-4ff0-b330-1824c148f326\\})|(\\{d1ab5ebd-9505-481d-a6cd-6b9db8d65977\\})|(\\{07953f60-447e-4f53-a5ef-ed060487f616\\})|(\\{2d3c5a5a-8e6f-4762-8aff-b24953fe1cc9\\})|(\\{f82b3ad5-e590-4286-891f-05adf5028d2f\\})|(\\{f96245ad-3bb0-46c5-8ca9-2917d69aa6ca\\})|(\\{2f53e091-4b16-4b60-9cae-69d0c55b2e78\\})|(\\{18868c3a-a209-41a6-855d-f99f782d1606\\})|(\\{47352fbf-80d9-4b70-9398-fb7bffa3da53\\})$/","prefs":[],"schema":1516311993443,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are a set of malicious add-ons that block the add-ons manager tab from opening so they can't be uninstalled.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4ca8206f-bc2a-4428-9439-7f3142dc08db","last_modified":1516394914828},{"guid":"{5b0f6d3c-10fd-414c-a135-dffd26d7de0f}","prefs":[],"schema":1516131689499,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1430577","why":"This is a malicious add-on that executes remote scripts, redirects popular search URLs and tracks users.","name":"P Birthday"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8088b39a-3e6d-4a17-a22f-3f95c0464bd6","last_modified":1516303320468},{"guid":"{1490068c-d8b7-4bd2-9621-a648942b312c}","prefs":[],"schema":1515267698296,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1428754","why":"This add-on is using a deceptive name and performing unwanted actions on users' systems.","name":"FF Safe Helper"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"674b6e19-f087-4706-a91d-1e723ed6f79e","last_modified":1515433728497},{"guid":"{dfa727cb-0246-4c5a-843a-e4a8592cc7b9}","prefs":[],"schema":1514922095288,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1426582","why":"Version 2.0.0 shipped with a hidden coin miner, which degrades performance in users who have it enabled. Version 1.2.3 currently available on AMO is not affected.","name":"Open With Adobe PDF Reader 2.0.0"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"2.0.0","minVersion":"2.0.0"}],"id":"455772a3-8360-4f5a-9a5f-a45b904d0b51","last_modified":1515007270887},{"guid":"{d03b6b0f-4d44-4666-a6d6-f16ad9483593}","prefs":[],"schema":1513366896461,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1425581","why":"This is a malicious add-on posing as a legitimate update.","name":"FF Guard Tool (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"10d9ce89-b8d4-4b53-b3d7-ecd192681f4e","last_modified":1513376470395},{"guid":"{7e907a15-0a4c-4ff4-b64f-5eeb8f841349}","prefs":[],"schema":1510083698490,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate update.","name":"Manual Update"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f7569261-f575-4719-8202-552b20d013b0","last_modified":1510168860382},{"guid":"{3602008d-8195-4860-965a-d01ac4f9ca96}","prefs":[],"schema":1509120801051,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate antivirus.\n","name":"Manual Antivirus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"28c805a9-e692-4ef8-b3ae-14e085c19ecd","last_modified":1509120934909},{"guid":"{87010166-e3d0-4db5-a394-0517917201df}","prefs":[],"schema":1509120801051,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate antivirus.\n","name":"Manual Antivirus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"84dd8a02-c879-4477-8ea7-bf2f225b0940","last_modified":1509120881470},{"guid":"{8ab60777-e899-475d-9a4f-5f2ee02c7ea4}","prefs":[],"schema":1509120801051,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate antivirus.\n","name":"Manual Antivirus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ccebab59-7190-4258-8faa-a0b752dd5301","last_modified":1509120831329},{"guid":"{368eb817-31b4-4be9-a761-b67598faf9fa}","prefs":[],"schema":1509046897080,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate antivirus.","name":"Manual Antivirus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9abc7502-bd6f-40d7-b035-abe721345360","last_modified":1509120801043},{"guid":"@68eba425-7a05-4d62-82b1-1d6d5a51716b","prefs":[],"schema":1505072496256,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1398905","why":"Misleads users into thinking this is a security and privacy tool (also distributed on a site that makes it look like an official Mozilla product).","name":"SearchAssist Incognito"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0"}],"id":"595e0e53-b76b-4188-a160-66f29c636094","last_modified":1505211411253},{"guid":"@H99KV4DO-UCCF-9PFO-9ZLK-8RRP4FVOKD9O","prefs":[],"schema":1502483549048,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1340877","why":"This is a malicious add-on that is being installed silently.","name":"FF Adr (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5df16afc-c804-43c9-9de5-f1835403e5fb","last_modified":1502483601731},{"guid":"@DA3566E2-F709-11E5-8E87-A604BC8E7F8B","prefs":[],"schema":1502480491460,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1340877","why":"This is a malicious add-on that is being installed silently into users' systems.","name":"SimilarWeb (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0a47a2f7-f07c-489b-bd39-88122a2dfe6a","last_modified":1502483549043},{"guid":"/^({95E84BD3-3604-4AAC-B2CA-D9AC3E55B64B}|{E3605470-291B-44EB-8648-745EE356599A}|{95E5E0AD-65F9-4FFC-A2A2-0008DCF6ED25}|{FF20459C-DA6E-41A7-80BC-8F4FEFD9C575}|{6E727987-C8EA-44DA-8749-310C0FBE3C3E}|{12E8A6C2-B125-479F-AB3C-13B8757C7F04}|{EB6628CF-0675-4DAE-95CE-EFFA23169743})$/","prefs":[],"schema":1494022576295,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1362585","why":"All of these add-ons have been identified as malware, and are being installed in Firefox globally, most likely via a malicious application installer.","name":"Malicious globally-installed add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3fd71895-7fc6-4f3f-aa22-1cbb0c5fd922","last_modified":1494024191520},{"guid":"@safesearchscoutee","prefs":[],"schema":1494013289942,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1362553","why":"This add-on intercepts queries sent to search engines and replaces them with its own, without user consent.","name":"SafeSearch Incognito (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"edad04eb-ea16-42f3-a4a7-20dded33cc37","last_modified":1494022568654},{"guid":"msktbird@mcafee.com","prefs":[],"schema":1493150718059,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1354912","why":"These versions of this add-on are known to cause frequent crashes in Thunderbird.","name":"McAfee Anti-Spam Thunderbird Extension 2.0 and lower"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.0","minVersion":"0","targetApplication":[{"guid":"{3550f703-e582-4d05-9a08-453d09bdfdc6}","maxVersion":"*","minVersion":"0"}]}],"id":"9e86d1ff-727a-45e3-9fb6-17f32666daf2","last_modified":1493332747360},{"guid":"/^(\\{11112503-5e91-4299-bf4b-f8c07811aa50\\})|(\\{501815af-725e-45be-b0f2-8f36f5617afc\\})$/","prefs":[],"schema":1491421290217,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1354045","why":"This add-on steals user credentials for popular websites from Facebook.","name":"Flash Player Updater (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c142360c-4f93-467e-9717-b638aa085d95","last_modified":1491472107658},{"guid":"fr@fbt.ovh","prefs":[],"schema":1490898754477,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1351689","why":"Scam add-on that silently steals user credentials of popular websites","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0f8344d0-8211-49a1-81be-c0084b3da9b1","last_modified":1490898787752},{"guid":"{95E84BD3-3604-4AAC-B2CA-D9AC3E55B64B}","prefs":[],"schema":1487179851382,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1338690","who":"All users who have this add-on installed.","why":"This is a malicious add-on that is silently installed in users' systems.","name":"youtube adblock (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"04b25e3d-a725-493e-be07-cbd74fb37ea7","last_modified":1487288975999},{"guid":"ext@alibonus.com","prefs":[],"schema":1485297431051,"blockID":"i1524","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1333471","who":"All Firefox users who have these versions installed.","why":"Versions 1.20.9 and lower of this add-on contain critical security issues.","name":"Alibonus 1.20.9 and lower","created":"2017-01-24T22:45:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.20.9","minVersion":"0","targetApplication":[]}],"id":"a015d5a4-9184-95db-0c74-9262af2332fa","last_modified":1485301116629},{"guid":"/^(ciscowebexstart1@cisco\\.com|ciscowebexstart_test@cisco\\.com|ciscowebexstart@cisco\\.com|ciscowebexgpc@cisco\\.com)$/","prefs":[],"schema":1485212610474,"blockID":"i1522","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1333225","who":"All Firefox users who have any Cisco WebEx add-ons installed.","why":"A critical security vulnerability has been discovered in Cisco WebEx add-ons that enable malicious websites to execute code on the user's system.","name":"Cisco WebEx add-ons","created":"2017-01-23T22:55:58Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0.1","minVersion":"1.0.0","targetApplication":[]}],"id":"30368779-1d3b-490a-0a34-253085af7754","last_modified":1485215014902},{"guid":"googlotim@gmail.com","prefs":[],"schema":1483389810787,"blockID":"i1492","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1328594","who":"All users who have Savogram version 1.3.2 installed. Version 1.3.1 doesn't have this problem and can be installed from the <a href=\"https://addons.mozilla.org/addon/savogram/\">add-on page</a>. Note that this is an older version, so affected users won't be automatically updated to it. New versions should correct this problem if they become available.","why":"Version 1.3.2 of this add-on loads remote code and performs DOM injection in an unsafe manner.","name":"Savogram 1.3.2","created":"2017-01-05T19:58:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.3.2","minVersion":"1.3.2","targetApplication":[]}],"id":"0756ed76-7bc7-ec1e-aba5-3a9fac2107ba","last_modified":1483646608603},{"guid":"support@update-firefox.com","prefs":[],"schema":1483387107003,"blockID":"i21","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=629717","who":"All users of the add-on in all Mozilla applications.","why":"This add-on is adware/spyware masquerading as a Firefox update mechanism.","name":"Browser Update (spyware)","created":"2011-01-31T16:23:48Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dfb06be8-3594-28e4-d163-17e27119f15d","last_modified":1483389809169},{"guid":"{2224e955-00e9-4613-a844-ce69fccaae91}","prefs":[],"schema":1483387107003,"blockID":"i7","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=512406","who":"All users of Internet Saving Optimizer for all Mozilla applications.","why":"This add-on causes a high volume of Firefox crashes and is considered malware.","name":"Internet Saving Optimizer (extension)","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b9efb796-97c2-6434-d28f-acc83436f8e5","last_modified":1483389809147},{"guid":"supportaccessplugin@gmail.com","prefs":[],"schema":1483387107003,"blockID":"i43","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=693673","who":"All users with Firefox Access Plugin installed","why":"This add-on is spyware that reports all visited websites to a third party with no user value.","name":"Firefox Access Plugin (spyware)","created":"2011-10-11T11:24:05Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1ed230a4-e174-262a-55ab-0c33f93a2529","last_modified":1483389809124},{"guid":"{8CE11043-9A15-4207-A565-0C94C42D590D}","prefs":[],"schema":1483387107003,"blockID":"i10","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=541302","who":"All users of this add-on in all Mozilla applications.","why":"This add-on secretly hijacks all search results in most major search engines and masks as a security add-on.","name":"Internal security options editor (malware)","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e2e0ac09-6d68-75f5-2424-140f51904876","last_modified":1483389809102},{"guid":"admin@youtubespeedup.com","prefs":[],"schema":1483387107003,"blockID":"i48","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=714221","who":"All users with any version of Youtube Speed UP! installed on any Mozilla product.","why":"This add-on hijacks your Facebook account.","name":"Youtube Speed UP! (malware)","created":"2011-12-29T19:48:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a93922c4-8a8a-5230-8f76-76fecb0653b6","last_modified":1483389809057},{"guid":"pink@rosaplugin.info","prefs":[],"schema":1482945809444,"blockID":"i84","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=743484","who":"All Firefox users who have this add-on installed","why":"Add-on acts like malware and performs user actions on Facebook without their consent.","name":"Facebook Rosa (malware)","created":"2012-04-09T10:13:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"66ad8de9-311d-076c-7356-87fde6d30d8f","last_modified":1482945810971},{"guid":"videoplugin@player.com","prefs":[],"schema":1482945809444,"blockID":"i90","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=752483","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware disguised as a Flash Player update. It can hijack Google searches and Facebook accounts.","name":"FlashPlayer 11 (malware)","created":"2012-05-07T08:58:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d25943f1-39ef-b9ec-ab77-baeef3498365","last_modified":1482945810949},{"guid":"youtb3@youtb3.com","prefs":[],"schema":1482945809444,"blockID":"i60","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=723753","who":"All Firefox users who have this extension installed.","why":"Malicious extension installed under false pretenses.","name":"Video extension (malware)","created":"2012-02-02T16:38:41Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cae3093f-a7b3-5352-a264-01dbfbf347ce","last_modified":1482945810927},{"guid":"{8f42fb8b-b6f6-45de-81c0-d6d39f54f971}","prefs":[],"schema":1482945809444,"blockID":"i82","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=743012","who":"All Firefox users who have installed this add-on.","why":"This add-on maliciously manipulates Facebook and is installed under false pretenses.","name":"Face Plus (malware)","created":"2012-04-09T10:04:28Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"09319ab3-55e7-fec1-44e0-84067d014b9b","last_modified":1482945810904},{"guid":"{95ff02bc-ffc6-45f0-a5c8-619b8226a9de}","prefs":[],"schema":1482945809444,"blockID":"i105","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=763065","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that inserts scripts into Facebook and hijacks the user's session.\r\n","name":"Eklenti D\u00fcnyas\u0131 (malware)","created":"2012-06-08T14:34:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"afbbc08d-2414-f51e-fdb8-74c0a2d90323","last_modified":1482945810858},{"guid":"{fa277cfc-1d75-4949-a1f9-4ac8e41b2dfd}","prefs":[],"schema":1482945809444,"blockID":"i77","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=738419","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware that is installed under false pretenses as an Adobe plugin.","name":"Adobe Flash (malware)","created":"2012-03-22T14:39:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"81753a93-382d-5f9d-a4ca-8a21b679ebb1","last_modified":1482945810835},{"guid":"youtube@youtube3.com","prefs":[],"schema":1482945809444,"blockID":"i57","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=722823","who":"All Firefox users that have installed this add-on.","why":"Malware installed on false pretenses.","name":"Divx 2012 Plugin (malware)","created":"2012-01-31T13:54:20Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4a93a0eb-a513-7272-6199-bc4d6228ff50","last_modified":1482945810811},{"guid":"{392e123b-b691-4a5e-b52f-c4c1027e749c}","prefs":[],"schema":1482945809444,"blockID":"i109","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=769781","who":"All Firefox users who have this add-on installed.","why":"This add-on pretends to be developed by Facebook and injects scripts that manipulate users' Facebook accounts.","name":"Zaman Tuneline Hay\u0131r! (malware)","created":"2012-06-29T13:20:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b9a805aa-cae7-58d6-5a53-2af4442e4cf6","last_modified":1482945810788},{"guid":"msntoolbar@msn.com","prefs":[],"schema":1482945809444,"blockID":"i18","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=599971","who":"Users of Bing Bar 6.0 and older for all versions of Firefox.","why":"This add-on has security issues and was blocked at Microsoft's request. For more information, please see <a href=\"http://support.microsoft.com/kb/2430460\">this article</a>.","name":"Bing Bar","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"6.*","minVersion":" 0","targetApplication":[]}],"id":"9b2f2039-b997-8993-d6dc-d881bc1ca7a1","last_modified":1482945810764},{"guid":"yasd@youasdr3.com","prefs":[],"schema":1482945809444,"blockID":"i104","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=763065","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that inserts scripts into Facebook and hijacks the user's session.\r\n","name":"Play Now (malware)","created":"2012-06-08T14:33:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8a352dff-d09d-1e78-7feb-45dec7ace5a5","last_modified":1482945810740},{"guid":"fdm_ffext@freedownloadmanager.org","prefs":[],"schema":1482945809444,"blockID":"i2","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=408445","who":"Users of Firefox 3 and later with versions 1.0 through 1.3.1 of Free Download Manager","why":"This add-on causes a high volume of crashes.","name":"Free Download Manager","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.3.1","minVersion":"1.0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.0a1"}]}],"id":"fc46f8e7-0489-b90f-a373-d93109479ca5","last_modified":1482945810393},{"guid":"flash@adobe.com","prefs":[],"schema":1482945809444,"blockID":"i56","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=722526","who":"All Firefox users who have this add-on installed.","why":"This add-on poses as an Adobe Flash update and injects malicious scripts into web pages. It hides itself in the Add-ons Manager.","name":"Adobe Flash Update (malware)","created":"2012-01-30T15:41:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"696db959-fb0b-8aa4-928e-65f157cdd77a","last_modified":1482945810371},{"guid":"youtubeer@youtuber.com","prefs":[],"schema":1482945809444,"blockID":"i66","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=726787","who":"All Firefox users who have installed this add-on.","why":"Add-on behaves maliciously, and is installed under false pretenses.","name":"Plug VDS (malware)","created":"2012-02-13T15:44:20Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0878ce4e-b476-ffa3-0e06-21a65b7917a1","last_modified":1482945810348},{"guid":"flash@adobee.com","prefs":[],"schema":1482945809444,"blockID":"i83","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=743497","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware installed under false pretenses.","name":"FlashPlayer 11 (malware)","created":"2012-04-09T10:08:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"09bb4661-331c-f7ba-865b-9e085dc437af","last_modified":1482945810259},{"guid":"youtube@2youtube.com","prefs":[],"schema":1482945809444,"blockID":"i71","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=730399","who":"All Firefox users who have installed this add-on.","why":"Extension is malware, installed under false pretenses.","name":"YouTube extension (malware)","created":"2012-02-27T10:23:23Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5d389c1f-b3a0-b06f-6ffb-d1e8aa055e3c","last_modified":1482945810236},{"guid":"webmaster@buzzzzvideos.info","prefs":[],"schema":1482945809444,"blockID":"i58","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=722844","who":"All Firefox users who have installed this add-on.","why":"Malware add-on that is installed under false pretenses.","name":"Buzz Video (malware)","created":"2012-01-31T14:51:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f7aab105-e2c2-42f5-d9be-280eb9c0c8f7","last_modified":1482945810213},{"guid":"play5@vide04flash.com","prefs":[],"schema":1482945809444,"blockID":"i92","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=755443","who":"All Firefox users who have this add-on installed.","why":"This add-on impersonates a Flash Player update (poorly), and inserts malicious scripts into Facebook.","name":"Lastest Flash PLayer (malware)","created":"2012-05-15T13:27:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7190860e-fc1f-cd9f-5d25-778e1e9043b2","last_modified":1482945810191},{"guid":"support3_en@adobe122.com","prefs":[],"schema":1482945809444,"blockID":"i97","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=759164","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware disguised as the Flash Player plugin.","name":"FlashPlayer 11 (malware)","created":"2012-05-28T13:42:54Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"decf93a1-2bb0-148c-a1a6-10b3757b554b","last_modified":1482945810168},{"guid":"a1g0a9g219d@a1.com","prefs":[],"schema":1482945809444,"blockID":"i73","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=736275","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware disguised as Flash Player. It steals user cookies and sends them to a remote location.","name":"Flash Player (malware)","created":"2012-03-15T15:03:04Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6dd66b43-897d-874a-2227-54e240b8520f","last_modified":1482945810146},{"guid":"ghostviewer@youtube2.com","prefs":[],"schema":1482945809444,"blockID":"i59","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=723683","who":"All Firefox users who have installed this add-on.","why":"Malicious add-on that automatically posts to Facebook.","name":"Ghost Viewer (malware)","created":"2012-02-02T16:32:15Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"06dfe833-8c3d-90ee-3aa8-37c3c28f7c56","last_modified":1482945810123},{"guid":"kdrgun@gmail.com","prefs":[],"schema":1482945809444,"blockID":"i103","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=763065","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that inserts scripts into Facebook and hijacks the user's session.","name":"Timeline Kapat (malware)","created":"2012-06-08T14:32:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a9a46ab2-2f56-1046-201c-5faa3435e248","last_modified":1482945810078},{"guid":"youtube2@youtube2.com","prefs":[],"schema":1482945809444,"blockID":"i67","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=728476","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware, installed under false pretenses.","name":"Youtube Online (malware)","created":"2012-02-18T09:10:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"14650ece-295b-a667-f9bc-a3d973e2228c","last_modified":1482945810055},{"guid":"admin@youtubeplayer.com","prefs":[],"schema":1482945809444,"blockID":"i51","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=717165","who":"All Firefox users with this extension installed.","why":"This add-on is malware, doing nothing more than inserting advertisements into websites through iframes.","name":"Youtube player (malware)","created":"2012-01-18T14:34:55Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"16b2ce94-88db-0d79-33fc-a93070ceb509","last_modified":1482945809957},{"guid":"youtubeee@youtuber3.com","prefs":[],"schema":1482945809444,"blockID":"i96","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=758503","who":"All Firefox users who have installed this add-on.","why":"This is a malicious add-on that is disguised as a DivX plugin.","name":"Divx 2012 Plugins (malware)","created":"2012-05-25T09:26:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f01be9cb-5cf2-774a-a4d7-e210a24db5b9","last_modified":1482945809912},{"guid":"{3252b9ae-c69a-4eaf-9502-dc9c1f6c009e}","prefs":[],"schema":1482945809444,"blockID":"i17","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=599971","who":"Users of version 2.2 of this add-on in all versions of Firefox.","why":"This add-on has security issues and was blocked at Microsoft's request. For more information, please see <a href=\"http://support.microsoft.com/kb/2430460\">this article</a>.","name":"Default Manager (Microsoft)","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"2.2","minVersion":"2.2","targetApplication":[]}],"id":"38be28ac-2e30-37fa-4332-852a55fafb43","last_modified":1482945809886},{"guid":"{68b8676b-99a5-46d1-b390-22411d8bcd61}","prefs":[],"schema":1482945809444,"blockID":"i93","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=755635","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that post content on Facebook accounts and steals user data.","name":"Zaman T\u00fcnelini Kald\u0131r! (malware)","created":"2012-05-16T10:44:42Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"733aff15-9b1f-ec04-288f-b78a55165a1c","last_modified":1482945809863},{"guid":"applebeegifts@mozilla.doslash.org","prefs":[],"schema":1482945809444,"blockID":"i54","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=721562","who":"All Firefox users that install this add-on.","why":"Add-on is malware installed under false pretenses.","name":"Applebees Gift Card (malware)","created":"2012-01-26T16:17:49Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1372c8ab-5452-745a-461a-aa78e3e12c4b","last_modified":1482945809840},{"guid":"activity@facebook.com","prefs":[],"schema":1482945112982,"blockID":"i65","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=726803","who":"All Firefox users who have installed this add-on.","why":"Add-on behaves maliciously and poses as an official Facebook add-on.","name":"Facebook extension (malware)","created":"2012-02-13T15:41:02Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"79ad1c9b-0828-7823-4574-dd1cdd46c3d6","last_modified":1482945809437},{"guid":"jid0-EcdqvFOgWLKHNJPuqAnawlykCGZ@jetpack","prefs":[],"schema":1482945112982,"blockID":"i62","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=724650","who":"All Firefox users who have installed this add-on.","why":"Add-on is installed under false pretenses and delivers malware.","name":"YouTube extension (malware)","created":"2012-02-06T14:46:33Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5ae1e642-b53c-54c0-19e7-5562cfdac3a3","last_modified":1482945809415},{"guid":"{B7082FAA-CB62-4872-9106-E42DD88EDE45}","prefs":[],"schema":1482945112982,"blockID":"i25","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=637542","who":"Users of McAfee SiteAdvisor below version 3.3.1 for Firefox 4.\r\n\r\nUsers of McAfee SiteAdvisor 3.3.1 and below for Firefox 5 and higher.","why":"This add-on causes a high volume of crashes and is incompatible with certain versions of Firefox.","name":"McAfee SiteAdvisor","created":"2011-03-14T15:53:07Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.3.0.*","minVersion":"0.1","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.7a1"}]}],"id":"c950501b-1f08-2ab2-d817-7c664c0d16fe","last_modified":1482945809393},{"guid":"{B7082FAA-CB62-4872-9106-E42DD88EDE45}","prefs":[],"schema":1482945112982,"blockID":"i38","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=660111","who":"Users of McAfee SiteAdvisor below version 3.3.1 for Firefox 4.\r\n\r\nUsers of McAfee SiteAdvisor 3.3.1 and below for Firefox 5 and higher.","why":"This add-on causes a high volume of crashes and is incompatible with certain versions of Firefox.","name":"McAfee SiteAdvisor","created":"2011-05-27T13:55:02Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"3.3.1","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"5.0a1"}]}],"id":"f11de388-4511-8d06-1414-95d3b2b122c5","last_modified":1482945809371},{"guid":"youtube@youtube7.com","prefs":[],"schema":1482945112982,"blockID":"i55","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=721646","who":"All Firefox users with this add-on installed.","why":"This is malware posing as video software.","name":"Plugin Video (malware)","created":"2012-01-27T09:39:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"08ceedf5-c7c1-f54f-db0c-02f01f0e319a","last_modified":1482945809304},{"guid":"crossriderapp3924@crossrider.com","prefs":[],"schema":1482945112982,"blockID":"i76","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=738282","who":"All Firefox users who have installed this add-on.","why":"This add-on compromises Facebook privacy and security and spams friends lists without user intervention.","name":"Fblixx (malware)","created":"2012-03-22T10:38:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"39d0a019-62fb-837b-1f1f-6831e56442b5","last_modified":1482945809279},{"guid":"{45147e67-4020-47e2-8f7a-55464fb535aa}","prefs":[],"schema":1482945112982,"blockID":"i86","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=748993","who":"All Firefox users who have this add-on installed.","why":"This add-on injects scripts into Facebook and performs malicious activity.","name":"Mukemmel Face+","created":"2012-04-25T16:33:21Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"960443f9-cf48-0b71-1ff2-b8c34a3411ea","last_modified":1482945809255},{"guid":"{4B3803EA-5230-4DC3-A7FC-33638F3D3542}","prefs":[],"schema":1482945112982,"blockID":"i4","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=441649","who":"Users of Firefox 3 and later with version 1.2 of Crawler Toolbar","why":"This add-on causes a high volume of crashes.","name":"Crawler Toolbar","created":"2008-07-08T10:23:31Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.2","minVersion":"1.2","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.0a1"}]}],"id":"a9818d53-3a6a-8673-04dd-2a16f5644215","last_modified":1482945809232},{"guid":"flashupdate@adobe.com","prefs":[],"schema":1482945112982,"blockID":"i68","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=722526","who":"All Firefox users who have this add-on installed.","why":"Add-on is malware, installed under false pretenses.","name":"Flash Update (malware)","created":"2012-02-21T13:55:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1ba5b46e-790d-5af2-9580-a5f1e6e65522","last_modified":1482945809208},{"guid":"plugin@youtubeplayer.com","prefs":[],"schema":1482945112982,"blockID":"i127","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=783356","who":"All users who have this add-on installed.","why":"This add-on tries to pass as a YouTube player and runs malicious scripts on webpages.","name":"Youtube Facebook Player (malware)","created":"2012-08-16T13:03:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"17a8bece-e2df-a55d-8a72-95faff028b83","last_modified":1482945809185},{"guid":"GifBlock@facebook.com","prefs":[],"schema":1482945112982,"blockID":"i79","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=739482","who":"All Firefox users who have installed this extension.","why":"This extension is malicious and is installed under false pretenses.","name":"Facebook Essentials (malware)","created":"2012-03-27T10:53:33Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"728451e8-1273-d887-37e9-5712b1cc3bff","last_modified":1482945809162},{"guid":"ff-ext@youtube","prefs":[],"schema":1482945112982,"blockID":"i52","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=719296","who":"All Firefox users that have this add-on installed.","why":"This add-on poses as a YouTube player while posting spam into Facebook account.","name":"Youtube player (malware)","created":"2012-01-19T08:26:35Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cd2dd72a-dd52-6752-a0cd-a4b312fd0b65","last_modified":1482945809138},{"guid":"ShopperReports@ShopperReports.com","prefs":[],"schema":1482945112982,"blockID":"i22","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=630191","who":"Users of Shopper Reports version 3.1.22.0 in Firefox 4 and later.","why":"This add-on causes a high volume of Firefox crashes.","name":"Shopper Reports","created":"2011-02-09T17:03:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.1.22.0","minVersion":"3.1.22.0","targetApplication":[]}],"id":"f26b049c-d856-750f-f050-996e6bec7cbb","last_modified":1482945809115},{"guid":"{27182e60-b5f3-411c-b545-b44205977502}","prefs":[],"schema":1482945112982,"blockID":"i16","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=599971","who":"Users of version 1.0 of this add-on in all versions of Firefox.","why":"This add-on has security issues and was blocked at Microsoft's request. For more information, please see <a href=\"http://support.microsoft.com/kb/2430460\">this article</a>.","name":"Search Helper Extension (Microsoft)","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0","minVersion":"1.0","targetApplication":[]}],"id":"2655f230-11f3-fe4c-7c3d-757d37d5f9a5","last_modified":1482945809092},{"guid":"{841468a1-d7f4-4bd3-84e6-bb0f13a06c64}","prefs":[],"schema":1482945112982,"blockID":"i46","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=712369","who":"Users of all versions of Nectar Search Toolbar in Firefox 9.","why":"This add-on causes crashes and other stability issues in Firefox.","name":"Nectar Search Toolbar","created":"2011-12-20T11:38:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0.1","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"9.0","minVersion":"9.0a1"}]}],"id":"b660dabd-0dc0-a55c-4b86-416080b345d9","last_modified":1482945809069},{"guid":"support@daemon-tools.cc","prefs":[],"schema":1482945112982,"blockID":"i5","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=459850","who":"Users of Daemon Tools Toolbar version 1.0.0.5 and older for all Mozilla applications.","why":"This add-on causes a high volume of crashes.","name":"Daemon Tools Toolbar","created":"2009-02-13T18:39:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0.0.5","minVersion":"0","targetApplication":[]}],"id":"8cabafd3-576a-b487-31c8-ab59e0349a0e","last_modified":1482945809045},{"guid":"{a3a5c777-f583-4fef-9380-ab4add1bc2a8}","prefs":[],"schema":1482945112982,"blockID":"i53","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=719605","who":"All users of Firefox with this add-on installed.","why":"This add-on is being offered as an online movie viewer, when it reality it only inserts scripts and ads into known sites.","name":"Peliculas-FLV (malware)","created":"2012-01-19T15:58:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.0.3","minVersion":"2.0.3","targetApplication":[]}],"id":"07bc0962-60da-087b-c3ab-f2a6ab84d81c","last_modified":1482945809021},{"guid":"royal@facebook.com","prefs":[],"schema":1482945112982,"blockID":"i64","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=725777","who":"All Firefox users who have installed this add-on.","why":"Malicious add-on posing as a Facebook tool.","name":"Facebook ! (malware)","created":"2012-02-09T13:24:23Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dd1d2623-0d15-c93e-8fbd-ba07b0299a44","last_modified":1482945808997},{"guid":"{28bfb930-7620-11e1-b0c4-0800200c9a66}","prefs":[],"schema":1482945112982,"blockID":"i108","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=766852","who":"All Firefox user who have this add-on installed.","why":"This is malware disguised as an Adobe product. It spams Facebook pages.","name":"Aplicativo (malware)","created":"2012-06-21T09:24:11Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"908dc4fb-ebc9-cea1-438f-55e4507ba834","last_modified":1482945808973},{"guid":"socialnetworktools@mozilla.doslash.org","prefs":[],"schema":1482945112982,"blockID":"i78","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=739441","who":"All Firefox users who have installed this add-on.","why":"This add-on hijacks the Facebook UI and adds scripts to track users.","name":"Social Network Tools (malware)","created":"2012-03-26T16:46:55Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1064cd25-3b87-64bb-b0a6-2518ad281574","last_modified":1482945808950},{"guid":"youtubeeing@youtuberie.com","prefs":[],"schema":1482945112982,"blockID":"i98","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=759663","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware disguised as a Youtube add-on.","name":"Youtube Video Player (malware)","created":"2012-05-30T09:30:14Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3484f860-56e1-28e8-5a70-cdcd5ab9d6ee","last_modified":1482945808927},{"guid":"pfzPXmnzQRXX6@2iABkVe.com","prefs":[],"schema":1482945112982,"blockID":"i99","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=759950","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware disguised as a Flash Player update.","name":"Flash Player (malware)","created":"2012-05-30T17:10:18Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"29cc4abc-4f52-01f1-eb0b-cad84ba4db13","last_modified":1482945808881},{"guid":"/^(pdftoword@addingapps.com|jid0-EYTXLS0GyfQME5irGbnD4HksnbQ@jetpack|jid1-ZjJ7t75BAcbGCX@jetpack)$/","prefs":[],"schema":1482341309012,"blockID":"i1425","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1325060","who":"All users who have any of the affected versions installed.","why":"A security vulnerability was discovered in old versions of the Add-ons SDK, which is exposed by certain old versions of add-ons. In the case of some add-ons that haven't been updated for a long time, all versions are being blocked.","name":"Various vulnerable add-on versions","created":"2016-12-21T17:23:14Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"150e639f-c832-63d0-a775-59313b2e1bf9","last_modified":1482343886365},{"guid":"{cc8f597b-0765-404e-a575-82aefbd81daf}","prefs":[],"schema":1480349193877,"blockID":"i380","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=866332","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts and performs unwanted actions on behalf of the user.","name":"Update My Browser (malware)","created":"2013-06-19T13:03:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4950d7aa-c602-15f5-a7a2-d844182d5cbd","last_modified":1480349217152},{"guid":"extension@FastFreeConverter.com","prefs":[],"schema":1480349193877,"blockID":"i470","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:26Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"649dd933-debf-69b7-020f-496c2c9f99c8","last_modified":1480349217071},{"guid":"59D317DB041748fdB89B47E6F96058F3@jetpack","prefs":[],"schema":1480349193877,"blockID":"i694","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1053540","who":"All Firefox users who have this add-ons installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This is a suspicious add-on that appears to be installed without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"JsInjectExtension","created":"2014-08-21T13:46:30Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"75692bd4-18e5-a9be-7ec3-9327e159ef68","last_modified":1480349217005},{"guid":"/^({bfec236d-e122-4102-864f-f5f19d897f5e}|{3f842035-47f4-4f10-846b-6199b07f09b8}|{92ed4bbd-83f2-4c70-bb4e-f8d3716143fe})$/","prefs":[],"schema":1480349193877,"blockID":"i527","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949566","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and uses multiple IDs.","name":"KeyBar add-on","created":"2013-12-20T14:13:38Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6d68dd97-7965-0a84-8ca7-435aac3c8040","last_modified":1480349216927},{"guid":"support@vide1flash2.com","prefs":[],"schema":1480349193877,"blockID":"i246","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=830159","who":"All Firefox users who have this add-on installed.","why":"This is an add-on that poses as the Adobe Flash Player and runs malicious code in the user's system.","name":"Lastest Adobe Flash Player (malware)","created":"2013-01-14T09:17:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2004fba1-74bf-a072-2a59-6e0ba827b541","last_modified":1480349216871},{"guid":"extension21804@extension21804.com","prefs":[],"schema":1480349193877,"blockID":"i312","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835665","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"Coupon Companion","created":"2013-03-06T14:14:05Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b2cf1256-dadd-6501-1f4e-25902d408692","last_modified":1480349216827},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i602","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:18:05Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.8.*","minVersion":"3.15.8","targetApplication":[]}],"id":"b2b4236d-5d4d-82b2-99cd-00ff688badf1","last_modified":1480349216765},{"guid":"{FE1DEEEA-DB6D-44b8-83F0-34FC0F9D1052}","prefs":[],"schema":1480349193877,"blockID":"i364","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=867670","who":"All Firefox users who have this add-on installed. Users who want to enable the add-on again can do so in the Add-ons Manager.","why":"This add-on is side-installed with other software, and blocks setting reversions attempted by users who want to recover their settings after they are hijacked by other add-ons.","name":"IB Updater","created":"2013-06-10T16:14:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a59b967c-66ca-7ad9-2dc6-d0ad37ded5fd","last_modified":1480349216652},{"guid":"vpyekkifgv@vpyekkifgv.org","prefs":[],"schema":1480349193877,"blockID":"i352","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=872211","who":"All Firefox users who have this add-on installed.","why":"Uses a deceptive name and injects ads into pages without user consent.","name":"SQLlite Addon (malware)","created":"2013-05-14T13:42:04Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8fd981ab-7ee0-e367-d804-0efe29d63178","last_modified":1480349216614},{"guid":"thefoxonlybetter@quicksaver","prefs":[],"schema":1480349193877,"blockID":"i702","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1053469","who":"All Firefox users who have any of these versions of the add-on installed.","why":"Certain versions of The Fox, Only Better weren't developed by the original developer, and are likely malicious in nature. This violates the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> for reusing an already existent ID.","name":"The Fox, Only Better (malicious versions)","created":"2014-08-27T10:05:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"1.10","targetApplication":[]}],"id":"60e54f6a-1b10-f889-837f-60a76a98fccc","last_modified":1480349216512},{"guid":"{f0e59437-6148-4a98-b0a6-60d557ef57f4}","prefs":[],"schema":1480349193877,"blockID":"i304","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=845975","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">installation guidelines</a> and is dropped silently into user's profiles.","name":"WhiteSmoke B","created":"2013-02-27T13:10:18Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0469e643-1a90-f9be-4aad-b347469adcbe","last_modified":1480349216402},{"guid":"xz123@ya456.com","prefs":[],"schema":1480349193877,"blockID":"i486","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=939254","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware and is installed silently in violation of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BetterSurf (malware)","created":"2013-11-15T13:34:53Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b9825a25-a96c-407e-e656-46a7948e5745","last_modified":1480349215808},{"guid":"{C7AE725D-FA5C-4027-BB4C-787EF9F8248A}","prefs":[],"schema":1480349193877,"blockID":"i424","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=860641","who":"Users of Firefox 23 or later who have RelevantKnowledge 1.0.0.2 or lower.","why":"Old versions of this add-on are causing startup crashes in Firefox 23, currently on the Beta channel. RelevantKnowledge users on Firefox 23 and above should update to version 1.0.0.3 of the add-on.","name":"RelevantKnowledge 1.0.0.2 and lower","created":"2013-07-01T10:45:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0.0.2","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"23.0a1"}]}],"id":"c888d167-7970-4b3f-240f-2d8e6f14ded4","last_modified":1480349215779},{"guid":"superlrcs@svenyor.net","prefs":[],"schema":1480349193877,"blockID":"i545","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949596","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enable it in the Add-ons Manager.","why":"This add-on is in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, using multiple add-on IDs and potentially doing other unwanted activities.","name":"SuperLyrics","created":"2014-01-30T11:52:42Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"002cd4fa-4c2b-e28b-9220-4a520f4d9ec6","last_modified":1480349215672},{"guid":"mbrsepone@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i479","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=937331","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Mozilla Lightweight Pack (malware)","created":"2013-11-11T15:42:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0549645e-5f50-5089-1f24-6e7d3bfab8e0","last_modified":1480349215645},{"guid":"mbroctone@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i476","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=936590","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks the users' Facebook account.","name":"Mozilla Storage Service (malware)","created":"2013-11-08T15:32:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"92198396-8756-8d09-7f18-a68d29894f71","last_modified":1480349215504},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i616","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:24:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.28.*","minVersion":"3.15.28","targetApplication":[]}],"id":"f11b485f-320e-233c-958b-a63377024fad","last_modified":1480349215479},{"guid":"/^({e9df9360-97f8-4690-afe6-996c80790da4}|{687578b9-7132-4a7a-80e4-30ee31099e03}|{46a3135d-3683-48cf-b94c-82655cbc0e8a}|{49c795c2-604a-4d18-aeb1-b3eba27e5ea2}|{7473b6bd-4691-4744-a82b-7854eb3d70b6}|{96f454ea-9d38-474f-b504-56193e00c1a5})$/","prefs":[],"schema":1480349193877,"blockID":"i494","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=776404","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on changes search settings without user interaction, and fails to reset them after it is removed. It also uses multiple add-on IDs for no apparent reason. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"uTorrent and related","created":"2013-12-02T14:52:32Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"485210d0-8e69-3436-536f-5d1deeea4167","last_modified":1480349215454},{"guid":"{EB7508CA-C7B2-46E0-8C04-3E94A035BD49}","prefs":[],"schema":1480349193877,"blockID":"i162","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=799266","who":"All Firefox users who have installed any of these add-ons.","why":"This block covers a number of malicious add-ons that deceive users, using names like \"Mozilla Safe Browsing\" and \"Translate This!\", and claiming they are developed by \"Mozilla Corp.\". They hijack searches and redirects users to pages they didn't intend to go to.\r\n\r\nNote: this block won't be active until bug 799266 is fixed.","name":"Mozilla Safe Browsing and others (Medfos malware)","created":"2012-10-11T12:25:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"07566aa3-4ff9-ac4f-9de9-71c77454b4da","last_modified":1480349215428},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i614","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:23:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.26.*","minVersion":"3.15.26","targetApplication":[]}],"id":"ede541f3-1748-7b33-9bd6-80e2f948e14f","last_modified":1480349215399},{"guid":"/^({976cd962-e0ca-4337-aea7-d93fae63a79c}|{525ba996-1ce4-4677-91c5-9fc4ead2d245}|{91659dab-9117-42d1-a09f-13ec28037717}|{c1211069-1163-4ba8-b8b3-32fc724766be})$/","prefs":[],"schema":1480349193877,"blockID":"i522","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947485","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed and using multiple add-on IDs.","name":"appbario7","created":"2013-12-20T13:15:33Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"580aed26-dc3b-eef8-fa66-a0a402447b7b","last_modified":1480349215360},{"guid":"jid0-O6MIff3eO5dIGf5Tcv8RsJDKxrs@jetpack","prefs":[],"schema":1480349193877,"blockID":"i552","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=974041","who":"All Firefox users who have this extension installed.","why":"This extension is malware that attempts to make it impossible for a second extension and itself to be disabled, and also forces the new tab page to have a specific URL.","name":"Extension_Protected (malware)","created":"2014-02-19T15:26:37Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e53063b4-5702-5b66-c860-d368cba4ccb6","last_modified":1480349215327},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i604","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:18:58Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.11.*","minVersion":"3.15.10","targetApplication":[]}],"id":"b910f779-f36e-70e1-b17a-8afb75988c03","last_modified":1480349215302},{"guid":"brasilescapefive@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i483","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=938473","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Facebook Video Pack (malware)","created":"2013-11-14T09:37:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"85ee7840-f262-ad30-eb91-74b3248fd13d","last_modified":1480349215276},{"guid":"brasilescapeeight@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i482","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=938476","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Mozilla Security Pack (malware)","created":"2013-11-14T09:36:55Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"457a5722-be90-5a9f-5fa0-4c753e9f324c","last_modified":1480349215249},{"guid":"happylyrics@hpyproductions.net","prefs":[],"schema":1480349193877,"blockID":"i370","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=881815","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into Firefox without the users' consent, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Happy Lyrics","created":"2013-06-11T15:42:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"730e616d-94a7-df0c-d31a-98b7875d60c2","last_modified":1480349215225},{"guid":"search-snacks@search-snacks.com","prefs":[],"schema":1480349193877,"blockID":"i872","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1082733","who":"All users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Search Snacks","created":"2015-03-04T14:37:33Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7567b06f-98fb-9400-8007-5d0357c345d9","last_modified":1480349215198},{"os":"WINNT","guid":"{ABDE892B-13A8-4d1b-88E6-365A6E755758}","prefs":[],"schema":1480349193877,"blockID":"i107","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=764210","who":"All Firefox users on Windows who have the RealPlayer Browser Record extension installed.","why":"The RealPlayer Browser Record extension is causing significant problems on Flash video sites like YouTube. This block automatically disables the add-on, but users can re-enable it from the Add-ons Manager if necessary.\r\n\r\nThis block shouldn't disable any other RealPlayer plugins, so watching RealPlayer content on the web should be unaffected.\r\n\r\nIf you still have problems playing videos on YouTube or elsewhere, please visit our <a href=\"http://support.mozilla.com/\">support site</a> for help.","name":"RealPlayer Browser Record Plugin","created":"2012-06-14T13:54:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"15.0.5","minVersion":"0","targetApplication":[]}],"id":"e3b89e55-b35f-8694-6f0e-f856e57a191d","last_modified":1480349215173},{"guid":"amo-validator-bypass@example.com","prefs":[],"schema":1480349193877,"blockID":"i1058","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1227605","who":"All users who install this add-on.","why":"This add-on is a proof of concept of a malicious add-on that bypasses the code validator.","name":" AMO Validator Bypass","created":"2015-11-24T09:03:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"86e38e3e-a729-b5a2-20a8-4738b376eea6","last_modified":1480349214743},{"guid":"6lIy@T.edu","prefs":[],"schema":1480349193877,"blockID":"i852","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128269","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"unIsaless","created":"2015-02-09T15:30:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"39798bc2-9c75-f172-148b-13f3ca1dde9b","last_modified":1480349214613},{"guid":"{a7f2cb14-0472-42a1-915a-8adca2280a2c}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i686","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1033809","who":"All users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-on Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"HomeTab","created":"2014-08-06T16:35:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"33a8f403-b2c8-cadf-e1ba-40b39edeaf18","last_modified":1480349214537},{"guid":"{CA8C84C6-3918-41b1-BE77-049B2BDD887C}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i862","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1131230","who":"All users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Ebay Shopping Assistant by Spigot","created":"2015-02-26T12:51:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9a9d6da2-90a1-5b71-8b24-96492d57dfd1","last_modified":1480349214479},{"guid":"update@firefox.com","prefs":[],"schema":1480349193877,"blockID":"i374","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=781088","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks Facebook accounts.","name":"Premium Update (malware)","created":"2013-06-18T13:58:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bb388413-60ea-c9d6-9a3b-c90df950c319","last_modified":1480349214427},{"guid":"sqlmoz@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i350","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=871610","who":"All Firefox users who have this extension installed.","why":"This extension is malware posing as Mozilla software. It hijacks Facebook accounts and spams other Facebook users.","name":"Mozilla Service Pack (malware)","created":"2013-05-13T09:43:07Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"715082e8-7a30-b27b-51aa-186c38e078f6","last_modified":1480349214360},{"guid":"mozillahmpg@mozilla.org","prefs":[],"schema":1480349193877,"blockID":"i140","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=791867","who":"All Firefox users who have installed this add-on.","why":"This is a malicious add-on that tries to monetize on its users by embedding unauthorized affiliate codes on shopping websites, and sometimes redirecting users to alternate sites that could be malicious in nature.","name":"Google YouTube HD Player (malware)","created":"2012-09-17T16:04:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"98150e2e-cb45-1fee-8458-28d3602ec2ec","last_modified":1480349214216},{"guid":"astrovia@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i489","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=942699","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Facebook Security Service (malware)","created":"2013-11-25T12:40:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6f365ff4-e48f-8a06-d19d-55e19fba81f4","last_modified":1480349214157},{"guid":"{bbea93c6-64a3-4a5a-854a-9cc61c8d309e}","prefs":[],"schema":1480349193877,"blockID":"i1126","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1251940","who":"All users who have this add-on installed.","why":"This is a malicious add-on that disables various security checks in Firefox.","name":"Tab Extension (malware)","created":"2016-02-29T21:58:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5acb9dcc-59d4-46d1-2a11-1194c4948239","last_modified":1480349214066},{"guid":"ffxtlbr@iminent.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i628","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=866943","who":"All Firefox users who have any of these add-ons installed. Users who wish to continue using them can enable them in the Add-ons Manager.","why":"These add-ons have been silently installed repeatedly, and change settings without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Iminent Minibar","created":"2014-06-26T15:47:15Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4387ad94-8500-d74d-68e3-20564a9aac9e","last_modified":1480349214036},{"guid":"{28387537-e3f9-4ed7-860c-11e69af4a8a0}","prefs":[],"schema":1480349193877,"blockID":"i40","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=665775","who":"Users of MediaBar versions 4.3.1.00 and below in all versions of Firefox.","why":"This add-on causes a high volume of crashes and is incompatible with certain versions of Firefox.","name":"MediaBar (2)","created":"2011-07-19T10:19:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"4.3.1.00","minVersion":"0.1","targetApplication":[]}],"id":"ff95664b-93e4-aa73-ac20-5ffb7c87d8b7","last_modified":1480349214002},{"guid":"{41e5ef7a-171d-4ab5-8351-951c65a29908}","prefs":[],"schema":1480349193877,"blockID":"i784","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"HelpSiteExpert","created":"2014-11-14T14:37:56Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0c05a0bb-30b4-979e-33a7-9f3955eba17d","last_modified":1480349213962},{"guid":"/^({2d7886a0-85bb-4bf2-b684-ba92b4b21d23}|{2fab2e94-d6f9-42de-8839-3510cef6424b}|{c02397f7-75b0-446e-a8fa-6ef70cfbf12b}|{8b337819-d1e8-48d3-8178-168ae8c99c36}|firefox@neurowise.info|firefox@allgenius.info)$/","prefs":[],"schema":1480349193877,"blockID":"i762","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1082599","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"These add-ons are silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SaveSense, neurowise, allgenius","created":"2014-10-17T16:58:10Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c5439f55-ace5-ad73-1270-017c0ba7b2ce","last_modified":1480349213913},{"guid":"{462be121-2b54-4218-bf00-b9bf8135b23f}","prefs":[],"schema":1480349193877,"blockID":"i226","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=812303","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently side-installed by other software, and doesn't do much more than changing the users' settings, without reverting them on removal.","name":"WhiteSmoke","created":"2012-11-29T16:27:36Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"994c6084-e864-0e4e-ac91-455083ee46c7","last_modified":1480349213879},{"guid":"firefox@browsefox.com","prefs":[],"schema":1480349193877,"blockID":"i546","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=936244","who":"All Firefox users who have this add-on installed. If you want to continue using it, it can be enabled in the Add-ons Manager.","why":"This add-on is silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BrowseFox","created":"2014-01-30T12:26:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"407d8c84-8939-cd28-b284-9b680e529bf6","last_modified":1480349213853},{"guid":"{6926c7f7-6006-42d1-b046-eba1b3010315}","prefs":[],"schema":1480349193877,"blockID":"i382","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844956","who":"All Firefox users who have this add-on installed. Those who wish to continue using it can enable it again in the Add-ons Manager.","why":"This add-on is silently installed, bypassing the Firefox opt-in screen and violating our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"appbario7","created":"2013-06-25T12:05:34Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2367bd94-2bdd-c615-de89-023ba071a443","last_modified":1480349213825},{"guid":"05dd836e-2cbd-4204-9ff3-2f8a8665967d@a8876730-fb0c-4057-a2fc-f9c09d438e81.com","prefs":[],"schema":1480349193877,"blockID":"i468","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935135","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be part of a <a href=\"https://www.drwebhk.com/en/virus_techinfo/Trojan.DownLoader9.50268.html\">Trojan software</a> package.","name":"Trojan.DownLoader9.50268 (malware)","created":"2013-11-07T14:43:39Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2fd53d9b-7096-f1fb-fbcb-2b40a6193894","last_modified":1480349213774},{"guid":"jid1-0xtMKhXFEs4jIg@jetpack","prefs":[],"schema":1480349193877,"blockID":"i586","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1011286","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware installed without user consent.","name":"ep (malware)","created":"2014-06-03T15:50:19Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"50ca2179-83ab-1817-163d-39ed2a9fbd28","last_modified":1480349213717},{"guid":"/^({16e193c8-1706-40bf-b6f3-91403a9a22be}|{284fed43-2e13-4afe-8aeb-50827d510e20}|{5e3cc5d8-ed11-4bed-bc47-35b4c4bc1033}|{7429e64a-1fd4-4112-a186-2b5630816b91}|{8c9980d7-0f09-4459-9197-99b3e559660c}|{8f1d9545-0bb9-4583-bb3c-5e1ac1e2920c})$/","prefs":[],"schema":1480349193877,"blockID":"i517","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947509","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing the add-on, and using multiple add-on IDs.","name":"Re-markit","created":"2013-12-20T12:54:33Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e88a28ab-5569-f06d-b0e2-15c51bb2a4b7","last_modified":1480349213344},{"guid":"safebrowse@safebrowse.co","prefs":[],"schema":1480349193877,"blockID":"i782","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1097696","who":"All Firefox users who have this add-on installed.","why":"This add-on loads scripts with malicious code that appears intended to steal usernames, passwords, and other private information.","name":"SafeBrowse","created":"2014-11-12T14:20:44Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"edd81c91-383b-f041-d8f6-d0b9a90230bd","last_modified":1480349213319},{"guid":"{af95cc15-3b9b-45ae-8d9b-98d08eda3111}","prefs":[],"schema":1480349193877,"blockID":"i492","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=945126","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Facebook (malware)","created":"2013-12-02T12:45:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7064e9e2-fba4-7b57-86d7-6f4afbf6f560","last_modified":1480349213294},{"guid":"{84a93d51-b7a9-431e-8ff8-d60e5d7f5df1}","prefs":[],"schema":1480349193877,"blockID":"i744","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080817","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on appears to be silently installed into users' systems, and changes settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Spigot Shopping Assistant","created":"2014-10-17T15:47:06Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dbc7ef8b-2c48-5dae-73a0-f87288c669f0","last_modified":1480349213264},{"guid":"{C3949AC2-4B17-43ee-B4F1-D26B9D42404D}","prefs":[],"schema":1480349193877,"blockID":"i918","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1170633","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-02T09:58:16Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"7f2a68f3-aa8a-ae41-1e48-d1f8f63d53c7","last_modified":1480349213231},{"guid":"831778-poidjao88DASfsAnindsd@jetpack","prefs":[],"schema":1480349193877,"blockID":"i972","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1190962","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Video patch (malware)","created":"2015-08-04T15:18:03Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"39471221-6926-e11b-175a-b28424d49bf6","last_modified":1480349213194},{"guid":"lbmsrvfvxcblvpane@lpaezhjez.org","prefs":[],"schema":1480349193877,"blockID":"i342","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=863385","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>. It also appears to install itself both locally and globally, producing a confusing uninstall experience.","name":"RapidFinda","created":"2013-05-06T16:18:14Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"98fb4536-07a4-d03a-f7c5-945acecc8203","last_modified":1480349213128},{"guid":"{babb9931-ad56-444c-b935-38bffe18ad26}","prefs":[],"schema":1480349193877,"blockID":"i499","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=946086","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Facebook Credits (malware)","created":"2013-12-04T15:22:02Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"be1d19fa-1662-322a-13e6-5fa5474f33a7","last_modified":1480349213100},{"guid":"{18d5a8fe-5428-485b-968f-b97b05a92b54}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i802","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080839","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astromenda Search Addon","created":"2014-12-15T10:52:49Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bc846147-cdc1-141f-5846-b705c48bd6ed","last_modified":1480349213074},{"guid":"{b6ef1336-69bb-45b6-8cba-e578fc0e4433}","prefs":[],"schema":1480349193877,"blockID":"i780","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Power-SW","created":"2014-11-12T14:00:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3b080157-2900-d071-60fe-52b0aa376cf0","last_modified":1480349213024},{"guid":"info@wxdownloadmanager.com","prefs":[],"schema":1480349193877,"blockID":"i196","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806451","who":"All Firefox users who have these add-ons installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Codec (malware)","created":"2012-11-05T09:24:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b62597d0-d2cb-d597-7358-5143a1d13658","last_modified":1480349212999},{"os":"WINNT","guid":"{C3949AC2-4B17-43ee-B4F1-D26B9D42404D}","prefs":[],"schema":1480349193877,"blockID":"i111","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=771802","who":"All Firefox users on Windows who have the RealPlayer Browser Record extension installed.","why":"The RealPlayer Browser Record extension is causing significant problems on Flash video sites like YouTube. This block automatically disables the add-on, but users can re-enable it from the Add-ons Manager if necessary.\r\n\r\nThis block shouldn't disable any other RealPlayer plugins, so watching RealPlayer content on the web should be unaffected.\r\n\r\nIf you still have problems playing videos on YouTube or elsewhere, please visit our <a href=\"http://support.mozilla.com/\">support site</a> for help.","name":"RealPlayer Browser Record Plugin","created":"2012-07-10T15:28:16Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"15.0.5","minVersion":"0","targetApplication":[]}],"id":"d3f96257-7635-555f-ef48-34d426322992","last_modified":1480349212971},{"guid":"l@AdLJ7uz.net","prefs":["browser.startup.homepage"],"schema":1480349193877,"blockID":"i728","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes user settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>","name":"GGoSavee","created":"2014-10-16T16:34:54Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e6bfa340-7d8a-1627-5cdf-40c0c4982e9d","last_modified":1480349212911},{"guid":"{6b2a75c8-6e2e-4267-b955-43e25b54e575}","prefs":[],"schema":1480349193877,"blockID":"i698","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1052611","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BrowserShield","created":"2014-08-21T15:46:31Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"492e4e43-f89f-da58-9c09-d99528ee9ca9","last_modified":1480349212871},{"guid":"/^({65f9f6b7-2dae-46fc-bfaf-f88e4af1beca}|{9ed31f84-c8b3-4926-b950-dff74047ff79}|{0134af61-7a0c-4649-aeca-90d776060cb3}|{02edb56b-9b33-435b-b7df-b2843273a694}|{da51d4f6-3e7e-4ef8-b400-9198e0874606}|{b24577db-155e-4077-bb37-3fdd3c302bb5})$/","prefs":[],"schema":1480349193877,"blockID":"i525","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949566","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and using multiple IDs.","name":"KeyBar add-on","created":"2013-12-20T14:11:14Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"78562d79-9a64-c259-fb63-ce24e29bb141","last_modified":1480349212839},{"guid":"adsremoval@adsremoval.net","prefs":[],"schema":1480349193877,"blockID":"i560","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=962793","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes various user settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Ad Removal","created":"2014-02-27T09:57:31Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4d150ad4-dc22-9790-07a9-36e0a23f857f","last_modified":1480349212798},{"guid":"firefoxaddon@youtubeenhancer.com","prefs":[],"schema":1480349193877,"blockID":"i445","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=911966","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that imitates a popular video downloader extension, and attempts to hijack Facebook accounts. The add-on available in the add-ons site is safe to use.","name":"YouTube Enhancer Plus (malware)","created":"2013-09-04T16:53:37Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"208.7.0","minVersion":"208.7.0","targetApplication":[]}],"id":"41d75d3f-a57e-d5ad-b95b-22f5fa010b4e","last_modified":1480349212747},{"guid":"{336D0C35-8A85-403a-B9D2-65C292C39087}","prefs":[],"schema":1480349193877,"blockID":"i224","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=812292","who":"All Firefox users who have this add-on installed.","why":"This add-on is side-installed with other software, and blocks setting reversions attempted by users who want to recover their settings after they are hijacked by other add-ons.","name":"IB Updater","created":"2012-11-29T16:22:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c87666e6-ec9a-2f1e-ad03-a722d2fa2a25","last_modified":1480349212655},{"guid":"G4Ce4@w.net","prefs":["browser.startup.homepage"],"schema":1480349193877,"blockID":"i718","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems and changes settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"YoutUbeAdBlaocke","created":"2014-10-02T12:21:22Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3e1e9322-93e9-4ce1-41f5-46ad4ef1471b","last_modified":1480349212277},{"guid":"extension@Fast_Free_Converter.com","prefs":[],"schema":1480349193877,"blockID":"i533","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949597","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing it.","name":"FastFreeConverter","created":"2013-12-20T15:04:18Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"726f5645-c0bf-66dc-a97a-d072b46e63e7","last_modified":1480349212247},{"guid":"@stopad","prefs":[],"schema":1480349193877,"blockID":"i1266","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1298780","who":"Users who have version 0.0.4 and earlier of the add-on installed.","why":"Stop Ads sends each visited url to a third party server which is not necessary for the add-on to work or disclosed in a privacy policy or user opt-in. Versions 0.0.4 and earlier are affected.","name":"Stop Ads Addon","created":"2016-08-30T12:24:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"0.0.4","minVersion":"0","targetApplication":[]}],"id":"3d1893dd-2092-d1f7-03f3-9629b7d7139e","last_modified":1480349212214},{"guid":"703db0db-5fe9-44b6-9f53-c6a91a0ad5bd@7314bc82-969e-4d2a-921b-e5edd0b02cf1.com","prefs":[],"schema":1480349193877,"blockID":"i519","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947509","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing the add-on, and using multiple add-on IDs.","name":"Re-markit","created":"2013-12-20T12:57:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a27d0f9f-7708-3d5f-82e1-e3f29e6098a0","last_modified":1480349212183},{"guid":"{13c9f1f9-2322-4d5c-81df-6d4bf8476ba4}","prefs":[],"schema":1480349193877,"blockID":"i348","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=867359","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>. It also fails to revert settings changes on removal.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"mywebsearch","created":"2013-05-08T15:55:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"372cf3df-0810-85d8-b5d7-faffff309a11","last_modified":1480349212102},{"guid":"{a6e67e6f-8615-4fe0-a599-34a73fc3fba5}","prefs":[],"schema":1480349193877,"blockID":"i346","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=867333","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>. Also, it doesn't reset its settings changes on uninstall.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Startnow","created":"2013-05-06T17:06:06Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1caf911c-ff2f-b0f6-0d32-29ef74be81bb","last_modified":1480349212077},{"guid":"9518042e-7ad6-4dac-b377-056e28d00c8f@f1cc0a13-4df1-4d66-938f-088db8838882.com","prefs":[],"schema":1480349193877,"blockID":"i308","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=846455","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed, bypassing our third-party opt-in screen, in violation of our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Solid Savings","created":"2013-02-28T13:48:32Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"df25ee07-74d4-ccd9-dbbe-7eb053015144","last_modified":1480349212020},{"guid":"jufa098j-LKooapd9jasJ9jliJsd@jetpack","prefs":[],"schema":1480349193877,"blockID":"i1000","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1201163","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Secure Video (malware)","created":"2015-09-07T14:00:20Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c3a98025-0f4e-3bb4-b475-97329e7b1426","last_modified":1480349211979},{"guid":"{46eddf51-a4f6-4476-8d6c-31c5187b2a2f}","prefs":[],"schema":1480349193877,"blockID":"i750","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963788","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Slick Savings","created":"2014-10-17T16:17:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9b4ef650-e1ad-d55f-c420-4f26dbb4139c","last_modified":1480349211953},{"guid":"{DAC3F861-B30D-40dd-9166-F4E75327FAC7}","prefs":[],"schema":1480349193877,"blockID":"i924","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1173154","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-09T15:28:17Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"be57998b-9e4d-1040-e6bb-ed9de056338d","last_modified":1480349211896},{"guid":"JMLv@njMaHh.org","prefs":[],"schema":1480349193877,"blockID":"i790","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1103516","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"YouttubeAdBlocke","created":"2014-11-24T14:14:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"070d5747-137d-8500-8713-cfc6437558a3","last_modified":1480349211841},{"guid":"istart_ffnt@gmail.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i888","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1152553","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-on Manager.","why":"This add-on appears to be malware, being silently installed and hijacking user settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Istart","created":"2015-04-10T16:27:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"32fad759-38d9-dad9-2295-e44cc6887040","last_modified":1480349211785},{"guid":"gystqfr@ylgga.com","prefs":[],"schema":1480349193877,"blockID":"i449","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=912742","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. It is installed bypassing the Firefox opt-in screen, and manipulates settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Define Ext","created":"2013-09-13T16:19:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8fe8f509-c530-777b-dccf-d10d58ae78cf","last_modified":1480349211748},{"guid":"e9d197d59f2f45f382b1aa5c14d82@8706aaed9b904554b5cb7984e9.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i844","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128324","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and attempts to change user settings like the home page and default search, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Sense","created":"2015-02-06T15:01:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f8f8695c-a356-a1d6-9291-502b377c63c2","last_modified":1480349211713},{"guid":"{184AA5E6-741D-464a-820E-94B3ABC2F3B4}","prefs":[],"schema":1480349193877,"blockID":"i968","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1164243","who":"All users who have this add-on installed.","why":"This is a malicious add-on that poses as a Java extension.","name":"Java String Helper (malware)","created":"2015-08-04T09:41:27Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fac1d2cb-eed7-fcef-5d5a-43c556371bd7","last_modified":1480349211687},{"guid":"7d51fb17-b199-4d8f-894e-decaff4fc36a@a298838b-7f50-4c7c-9277-df6abbd42a0c.com","prefs":[],"schema":1480349193877,"blockID":"i455","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=919792","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks Facebook accounts and posts spam to the users' friends.","name":"Video Console (malware)","created":"2013-09-25T10:28:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dd4d2e17-4ce6-36b0-3035-93e9cc5846d4","last_modified":1480349211660},{"guid":"prositez@prz.com","prefs":[],"schema":1480349193877,"blockID":"i764","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"ProfSitez","created":"2014-10-29T16:43:15Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"684ad4fd-2cbd-ce2a-34cd-bc66b20ac8af","last_modified":1480349211628},{"guid":"{25D77636-38B1-1260-887C-2D4AFA92D6A4}","prefs":[],"schema":1480349193877,"blockID":"i536","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=959279","who":"All Firefox users who have this extension installed.","why":"This is a malicious extension that is installed alongside a trojan. It hijacks searches on selected sites.","name":"Microsoft DirectInput Object (malware)","created":"2014-01-13T10:36:05Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cd174588-940e-f5b3-12ea-896c957bd4b3","last_modified":1480349211555},{"guid":"{badea1ae-72ed-4f6a-8c37-4db9a4ac7bc9}","prefs":[],"schema":1480349193877,"blockID":"i543","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963809","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enable it in the Add-ons Manager.","why":"This add-on is apparently malware that is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Address Bar Search","created":"2014-01-28T14:28:18Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8c1dd68e-7df6-0c37-2f41-107745a7be54","last_modified":1480349211119},{"guid":"{d87d56b2-1379-49f4-b081-af2850c79d8e}","prefs":[],"schema":1480349193877,"blockID":"i726","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080835","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Xplorer Lite","created":"2014-10-13T16:01:03Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7b0895b4-dd4f-1c91-f4e3-31afdbdf3178","last_modified":1480349211007},{"guid":"OKitSpace@OKitSpace.es","prefs":[],"schema":1480349193877,"blockID":"i469","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:35:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6a11aa68-0dae-5524-cc96-a5053a31c466","last_modified":1480349210982},{"guid":"{c96d1ae6-c4cf-4984-b110-f5f561b33b5a}","prefs":[],"schema":1480349193877,"blockID":"i808","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Better Web","created":"2014-12-19T09:36:52Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0413d46b-8205-d9e0-65df-4caa3e6355c4","last_modified":1480349210956},{"guid":"thefoxonlybetter@quicksaver","prefs":[],"schema":1480349193877,"blockID":"i706","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1053469","who":"All Firefox users who have any of these versions of the add-on installed.","why":"Certain versions of The Fox, Only Better weren't developed by the original developer, and are likely malicious in nature. This violates the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> for reusing an already existent ID.","name":"The Fox, Only Better (malicious versions)","created":"2014-08-27T14:50:32Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.6.160","minVersion":"1.6.160","targetApplication":[]}],"id":"bb2b2114-f8e7-511d-04dc-abc8366712cc","last_modified":1480349210859},{"guid":"CortonExt@ext.com","prefs":[],"schema":1480349193877,"blockID":"i336","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=864551","who":"All Firefox users who have this add-on installed.","why":"This add-on is reported to be installed without user consent, with a non-descriptive name, and ties a number of browser features to Amazon URLs, probably monetizing on affiliate codes.","name":"CortonExt","created":"2013-04-22T16:10:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a5bdd05d-eb4c-ce34-9909-a677b4322384","last_modified":1480349210805},{"guid":"1chtw@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i430","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=901770","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that uses a deceptive name and hijacks social networks.","name":" Mozilla Service Pack (malware)","created":"2013-08-05T16:42:24Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bf1e31c7-ba50-1075-29ae-47368ac1d6de","last_modified":1480349210773},{"guid":"lrcsTube@hansanddeta.com","prefs":[],"schema":1480349193877,"blockID":"i344","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=866944","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"LyricsTube","created":"2013-05-06T16:44:04Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"424b9f39-d028-b1fb-d011-d8ffbbd20fe9","last_modified":1480349210718},{"guid":"{341f4dac-1966-47ff-aacf-0ce175f1498a}","prefs":[],"schema":1480349193877,"blockID":"i356","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=868129","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"MyFreeGames","created":"2013-05-23T14:45:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"560e08b1-3471-ad34-8ca9-463f5ca5328c","last_modified":1480349210665},{"guid":"/^({d6e79525-4524-4707-9b97-1d70df8e7e59}|{ddb4644d-1a37-4e6d-8b6e-8e35e2a8ea6c}|{e55007f4-80c5-418e-ac33-10c4d60db01e}|{e77d8ca6-3a60-4ae9-8461-53b22fa3125b}|{e89a62b7-248e-492f-9715-43bf8c507a2f}|{5ce3e0cb-aa83-45cb-a7da-a2684f05b8f3})$/","prefs":[],"schema":1480349193877,"blockID":"i518","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947509","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing the add-on, and using multiple add-on IDs.","name":"Re-markit","created":"2013-12-20T12:56:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"145b0f22-501e-39eb-371e-ec8342a5add9","last_modified":1480349210606},{"guid":"{72b98dbc-939a-4e0e-b5a9-9fdbf75963ef}","prefs":[],"schema":1480349193877,"blockID":"i772","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SitezExpert","created":"2014-10-31T16:15:26Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"386cb2c9-e674-ce2e-345f-d30a785f90c5","last_modified":1480349210536},{"guid":"hha8771ui3-Fo9j9h7aH98jsdfa8sda@jetpack","prefs":[],"schema":1480349193877,"blockID":"i970","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1190963","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Video fix (malware)","created":"2015-08-04T15:15:07Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3ca577d8-3685-4ba9-363b-5b2d8d8dd608","last_modified":1480349210477},{"guid":"{7e8a1050-cf67-4575-92df-dcc60e7d952d}","prefs":[],"schema":1480349193877,"blockID":"i478","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935796","who":"All Firefox users who have this add-on installed.","why":"This add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"SweetPacks","created":"2013-11-08T15:42:28Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1519eb45-fcaa-b531-490d-fe366490ed45","last_modified":1480349210416},{"guid":"/^({66b103a7-d772-4fcd-ace4-16f79a9056e0}|{6926c7f7-6006-42d1-b046-eba1b3010315}|{72cabc40-64b2-46ed-8648-26d831761150}|{73ee2cf2-7b76-4c49-b659-c3d8cf30825d}|{ca6446a5-73d5-4c35-8aa1-c71dc1024a18}|{5373a31d-9410-45e2-b299-4f61428f0be4})$/","prefs":[],"schema":1480349193877,"blockID":"i521","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947485","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed and using multiple add-on IDs.","name":"appbario7","created":"2013-12-20T13:14:29Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"983cb7fe-e0b4-6a2e-f174-d2670876b2cd","last_modified":1480349210351},{"guid":"{dd6b651f-dfb9-4142-b0bd-09912ad22674}","prefs":[],"schema":1480349193877,"blockID":"i400","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835678","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This group of add-ons is silently installed, bypassing our install opt-in screen. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Searchqu","created":"2013-06-25T15:16:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"975d2126-f727-f5b9-ca01-b83345b80c56","last_modified":1480349210301},{"guid":"25p@9eAkaLq.net","prefs":["browser.startup.homepage"],"schema":1480349193877,"blockID":"i730","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes user settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>\r\n","name":"YYOutoubeAdBlocke","created":"2014-10-16T16:35:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5a0c5818-693f-43ae-f85a-c6928d9c2cc4","last_modified":1480349210275},{"guid":"tmbepff@trendmicro.com","prefs":[],"schema":1480349193877,"blockID":"i1222","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1275245","who":"All users of this add-on. If you wish to continue using it, you can enable it in the Add-ons Manager.","why":"Add-on is causing a high-frequency crash in Firefox","name":"Trend Micro BEP 9.1.0.1035 and lower","created":"2016-05-24T12:10:34Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"9.1.0.1035","minVersion":"0","targetApplication":[]}],"id":"8045c799-486a-927c-b972-b9da1c2dab2f","last_modified":1480349209818},{"guid":"pricepeep@getpricepeep.com","prefs":[],"schema":1480349193877,"blockID":"i220","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=811433","who":"All Firefox users who have Pricepeed below 2.1.0.20 installed.","why":"Versions older than 2.1.0.20 of the PricePeep add-on were silently side-installed with other software, injecting advertisements in Firefox. Versions 2.1.0.20 and above don't have the install problems are not blocked.","name":"PricePeep","created":"2012-11-29T16:18:26Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"2.1.0.19.99","minVersion":"0","targetApplication":[]}],"id":"227b9a8d-c18d-239c-135e-d79e614fe392","last_modified":1480349209794},{"guid":"hoverst@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i498","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=946029","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Adobe Flash Player (malware)","created":"2013-12-04T15:17:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2b25ba3e-45db-0e6c-965a-3acda1a44117","last_modified":1480349209745},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i606","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:20:07Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.13.*","minVersion":"3.15.13","targetApplication":[]}],"id":"c3d88e22-386a-da3b-8aba-3cb526e08053","last_modified":1480349209713},{"guid":"advance@windowsclient.com","prefs":[],"schema":1480349193877,"blockID":"i508","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=950773","who":"All Firefox users who have this add-on installed.","why":"This is not the <a href=\"https://addons.mozilla.org/addon/microsoft-net-framework-assist/\">Microsoft .NET Framework Assistant</a> created and distributed by Microsoft. It is a malicious extension that is distributed under the same name to trick users into installing it, and turns users into a botnet that conducts SQL injection attacks on visited websites.","name":"Microsoft .NET Framework Assistant (malware)","created":"2013-12-16T10:15:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e5d30a74-732e-c3fa-f13b-097ee28d4b27","last_modified":1480349209674},{"guid":"{5eeb83d0-96ea-4249-942c-beead6847053}","prefs":[],"schema":1480349193877,"blockID":"i756","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080846","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SmarterPower","created":"2014-10-17T16:30:30Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e101dbc0-190c-f6d8-e168-0c1380581cc9","last_modified":1480349209625},{"guid":"/^({7e8a1050-cf67-4575-92df-dcc60e7d952d}|{b3420a9c-a397-4409-b90d-bcf22da1a08a}|{eca6641f-2176-42ba-bdbe-f3e327f8e0af}|{707dca12-3f99-4d94-afea-06dcc0ae0108}|{aea20431-87fc-40be-bc5b-18066fe2819c}|{30ee6676-1ba6-455a-a7e8-298fa863a546})$/","prefs":[],"schema":1480349193877,"blockID":"i523","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947481","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted.","name":"SweetPacks","created":"2013-12-20T13:42:15Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a3a6bc8e-46a1-b3d5-1b20-58b90ba099c3","last_modified":1480349209559},{"guid":"{e0352044-1439-48ba-99b6-b05ed1a4d2de}","prefs":[],"schema":1480349193877,"blockID":"i710","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Site Counselor","created":"2014-09-30T15:28:14Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b8fedf07-dcaf-f0e3-b42b-32db75c4c304","last_modified":1480349209491},{"guid":"addlyrics@addlyrics.net","prefs":[],"schema":1480349193877,"blockID":"i426","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=891605","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Add Lyrics","created":"2013-07-09T15:25:30Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"81678e9e-ebf0-47d6-e409-085c25e67c7e","last_modified":1480349209383},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i610","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:21:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.22.*","minVersion":"3.15.22","targetApplication":[]}],"id":"935dfec3-d017-5660-db5b-94ae7cea6e5f","last_modified":1480349209128},{"guid":"info@allpremiumplay.info","prefs":[],"schema":1480349193877,"blockID":"i163","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806451","who":"All Firefox users who have these add-ons installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Codec-C (malware)","created":"2012-10-29T16:40:07Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6afbf9b8-ae3a-6a48-0f6c-7a3e065ec043","last_modified":1480349209076},{"guid":"now.msn.com@services.mozilla.org","prefs":[],"schema":1480349193877,"blockID":"i490","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=926378","who":"All Firefox users who have this add-on installed.","why":"As part of their ongoing work to fine-tune their editorial mix, msnNOW has decided that msnNOW will stop publishing on Dec. 3, 2013. Rather than having a single home for trending content, they will continue integrating that material throughout all MSN channels. A big thank you to everyone who followed msnNOW stories using the Firefox sidebar","name":"MSNNow (discontinued social provider)","created":"2013-11-27T08:06:04Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"de7d699d-016d-d973-5e39-52568de6ffde","last_modified":1480349209021},{"guid":"fftoolbar2014@etech.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i858","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1131078","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and changes users' settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"FF Toolbar","created":"2015-02-11T15:32:36Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6877bf40-9e45-7017-4dac-14d09e7f0ef6","last_modified":1480349208988},{"guid":"mbrnovone@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i477","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=936249","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Mozilla Security Service (malware)","created":"2013-11-08T15:35:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"758c2503-766d-a2f5-4c58-7cea93acfe05","last_modified":1480349208962},{"guid":"{739df940-c5ee-4bab-9d7e-270894ae687a}","prefs":[],"schema":1480349193877,"blockID":"i530","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949558","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted.","name":"WhiteSmoke New","created":"2013-12-20T14:49:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f8097aa6-3009-6dfc-59df-353ba6b1142b","last_modified":1480349208933},{"guid":"firefoxaddon@youtubeenhancer.com","prefs":[],"schema":1480349193877,"blockID":"i636","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1033120","who":"All Firefox users who have this version of the add-on installed.","why":"Version 199.7.0 of the YoutubeEnhancer extension isn't developed by the original developer, and is likely malicious in nature. It violates the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> for reusing an already existent ID.","name":"YoutubeEnhancer - Firefox","created":"2014-07-08T15:58:12Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"199.7.0","minVersion":"199.7.0","targetApplication":[]}],"id":"204a074b-da87-2784-f15b-43a9ea9a6b36","last_modified":1480349208851},{"guid":"extacylife@a.com","prefs":[],"schema":1480349193877,"blockID":"i505","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947741","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks users' Facebook accounts.","name":"Facebook Haber (malware)","created":"2013-12-09T15:08:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5acadb8d-d3be-e0e0-4656-9107f9de0ea9","last_modified":1480349208823},{"guid":"{746505DC-0E21-4667-97F8-72EA6BCF5EEF}","prefs":[],"schema":1480349193877,"blockID":"i842","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128325","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Shopper-Pro","created":"2015-02-06T14:45:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5f19c5fb-1c78-cbd6-8a03-1678efb54cbc","last_modified":1480349208766},{"guid":"{51c77233-c0ad-4220-8388-47c11c18b355}","prefs":[],"schema":1480349193877,"blockID":"i580","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1004132","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, it can be enabled in the Add-ons Manager.","why":"This add-on is silently installed into Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Browser Utility","created":"2014-04-30T13:55:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"0.1.9999999","minVersion":"0","targetApplication":[]}],"id":"daa2c60a-5009-2c65-a432-161d50bef481","last_modified":1480349208691},{"guid":"{a2bfe612-4cf5-48ea-907c-f3fb25bc9d6b}","prefs":[],"schema":1480349193877,"blockID":"i712","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Xplorer","created":"2014-09-30T15:28:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"13450534-93d7-f2a2-7f0a-e4e3948c4dc1","last_modified":1480349208027},{"guid":"ScorpionSaver@jetpack","prefs":[],"schema":1480349193877,"blockID":"i539","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963826","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enable it in the Add-ons Manager.","why":"This add-on is being silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>","name":"ScorpionSaver","created":"2014-01-28T14:00:30Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3499c968-6e8b-37f1-5f6e-2384807c2a6d","last_modified":1480349207972},{"guid":"{D19CA586-DD6C-4a0a-96F8-14644F340D60}","prefs":[],"schema":1480349193877,"blockID":"i42","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=690184","who":"Users of McAfee ScriptScan versions 14.4.0 and below for all versions of Firefox and SeaMonkey.","why":"This add-on causes a high volume of crashes.","name":"McAfee ScriptScan","created":"2011-10-03T09:38:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"14.4.0","minVersion":"0.1","targetApplication":[]}],"id":"1d35ac9d-49df-23cf-51f5-f3c228ad0dc9","last_modified":1480349207877},{"guid":"gjhrjenrengoe@jfdnkwelfwkm.com","prefs":[],"schema":1480349193877,"blockID":"i1042","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1212174","who":"All users who have this add-on installed.","why":"This is a malicious add-on that takes over Facebook accounts.","name":"Avant Player (malware)","created":"2015-10-07T13:12:54Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d6453893-becc-7617-2050-0db284e0e0db","last_modified":1480349207840},{"guid":"{33e0daa6-3af3-d8b5-6752-10e949c61516}","prefs":[],"schema":1480349193877,"blockID":"i282","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835683","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on violates our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">add-on guidelines</a>, bypassing the third party opt-in screen.","name":"Complitly","created":"2013-02-15T12:19:26Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.1.999","minVersion":"0","targetApplication":[]}],"id":"1f94bc8d-9d5f-c8f5-45c0-ad1f6e147c71","last_modified":1480349207789},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i608","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:20:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.20.*","minVersion":"3.15.18","targetApplication":[]}],"id":"e7d50ff2-5948-d571-6711-37908ccb863f","last_modified":1480349207761},{"guid":"{63eb5ed4-e1b3-47ec-a253-f8462f205350}","prefs":[],"schema":1480349193877,"blockID":"i786","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"FF-Plugin","created":"2014-11-18T12:33:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ca4558a2-8ce4-3ca0-3d29-63019f680c8c","last_modified":1480349207705},{"guid":"jid1-4vUehhSALFNqCw@jetpack","prefs":[],"schema":1480349193877,"blockID":"i634","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1033002","who":"All Firefox users who have this version of the add-on installed.","why":"Version 99.7 of the YouTube Plus Plus extension isn't developed by the original developer, and is likely malicious in nature. It violates the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> for reusing an already existent ID.","name":"YouTube Plus Plus 99.7","created":"2014-07-04T14:13:57Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"99.7","minVersion":"99.7","targetApplication":[]}],"id":"a6d017cb-e33f-2239-4e42-ab4e7cfb19fe","last_modified":1480349207680},{"guid":"{aab02ab1-33cf-4dfa-8a9f-f4e60e976d27}","prefs":[],"schema":1480349193877,"blockID":"i820","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems without their consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Incredible Web","created":"2015-01-13T09:27:49Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"847ecc6e-1bc1-f7ff-e1d5-a76e6b8447d2","last_modified":1480349207654},{"guid":"torntv@torntv.com","prefs":[],"schema":1480349193877,"blockID":"i320","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=845610","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"TornTV","created":"2013-03-20T16:35:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cdd492b8-8101-74a9-5760-52ff709fd445","last_modified":1480349207608},{"guid":"crossriderapp12555@crossrider.com","prefs":[],"schema":1480349193877,"blockID":"i674","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=877836","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"The add-on is silently installed, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"JollyWallet","created":"2014-07-22T16:26:19Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d4467e20-0f71-f0e0-8cd6-40c82b6c7379","last_modified":1480349207561},{"guid":"344141-fasf9jas08hasoiesj9ia8ws@jetpack","prefs":[],"schema":1480349193877,"blockID":"i1038","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1211169","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Video Plugin (malware)","created":"2015-10-05T16:42:09Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f7986b7b-9b5a-d372-8147-8b4bd6f5a29b","last_modified":1480349207485},{"guid":"meOYKQEbBBjH5Ml91z0p9Aosgus8P55bjTa4KPfl@jetpack","prefs":[],"schema":1480349193877,"blockID":"i998","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1201164","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Smooth Player (malware)","created":"2015-09-07T13:54:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"30c3e511-9e8d-15ee-0867-d61047e56515","last_modified":1480349207370},{"guid":"{8dc5c42e-9204-2a64-8b97-fa94ff8a241f}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i770","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1088726","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astrmenda Search","created":"2014-10-30T14:52:52Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8a9c7702-0349-70d6-e64e-3a666ab084c6","last_modified":1480349207320},{"guid":"savingsslider@mybrowserbar.com","prefs":[],"schema":1480349193877,"blockID":"i752","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963788","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Slick Savings","created":"2014-10-17T16:18:12Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9b1faf30-5725-7847-d993-b5cdaabc9829","last_modified":1480349207290},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i612","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:23:00Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.24.*","minVersion":"3.15.24","targetApplication":[]}],"id":"e0ff9df4-60e4-dbd0-8018-57f395e6610a","last_modified":1480349206818},{"guid":"{1e4ea5fc-09e5-4f45-a43b-c048304899fc}","prefs":[],"schema":1480349193877,"blockID":"i812","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Great Finder","created":"2015-01-06T13:22:39Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1ea40b9f-2423-a2fd-a5e9-4ec1df2715f4","last_modified":1480349206784},{"guid":"crossriderapp8812@crossrider.com","prefs":[],"schema":1480349193877,"blockID":"i314","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835665","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"Coupon Companion","created":"2013-03-06T14:14:51Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"06c07e28-0a34-e5ee-e724-491a2f6ce586","last_modified":1480349206708},{"guid":"/^(ffxtlbr@mixidj\\.com|{c0c2693d-2ee8-47b4-9df7-b67a0ee31988}|{67097627-fd8e-4f6b-af4b-ecb65e50112e}|{f6f0f973-a4a3-48cf-9a7a-b7a69c30d71a}|{a3d0e35f-f1da-4ccb-ae77-e9d27777e68d}|{1122b43d-30ee-403f-9bfa-3cc99b0caddd})$/","prefs":[],"schema":1480349193877,"blockID":"i540","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963819","who":"All Firefox users who have this add-on installed.","why":"This add-on has been repeatedly blocked before and keeps showing up with new add-on IDs, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"MixiDJ (malware)","created":"2014-01-28T14:07:56Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4c03ddda-bb3f-f097-0a7b-b7b77b050584","last_modified":1480349206678},{"guid":"hansin@topvest.id","prefs":[],"schema":1480349193877,"blockID":"i836","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1130406","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Inside News (malware)","created":"2015-02-06T14:17:39Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0945a657-f28d-a02c-01b2-5115b3f90d7a","last_modified":1480349206628},{"guid":"lfind@nijadsoft.net","prefs":[],"schema":1480349193877,"blockID":"i358","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=874131","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Lyrics Finder","created":"2013-05-24T14:09:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2307f11c-6216-0dbf-a464-b2921055ce2b","last_modified":1480349206603},{"guid":"plugin@getwebcake.com","prefs":[],"schema":1480349193877,"blockID":"i484","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=938264","who":"All Firefox users who have this add-on installed.","why":"This add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> and is broadly considered to be malware. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"WebCake","created":"2013-11-14T09:55:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2865addd-da1c-20c4-742f-6a2270da2e78","last_modified":1480349206578},{"guid":"{c0c2693d-2ee8-47b4-9df7-b67a0ee31988}","prefs":[],"schema":1480349193877,"blockID":"i354","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=837838","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Mixi DJ","created":"2013-05-23T14:31:21Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"03a745c3-0ee7-e262-ba31-62d4f78ddb62","last_modified":1480349206525},{"guid":"/^({7316e43a-3ebd-4bb4-95c1-9caf6756c97f}|{0cc09160-108c-4759-bab1-5c12c216e005}|{ef03e721-f564-4333-a331-d4062cee6f2b}|{465fcfbb-47a4-4866-a5d5-d12f9a77da00}|{7557724b-30a9-42a4-98eb-77fcb0fd1be3}|{b7c7d4b0-7a84-4b73-a7ef-48ef59a52c3b})$/","prefs":[],"schema":1480349193877,"blockID":"i520","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947485","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed and using multiple add-on IDs.","name":"appbario7","created":"2013-12-20T13:11:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e3901c48-9c06-fecb-87d3-efffd9940c22","last_modified":1480349206491},{"guid":"{354dbb0a-71d5-4e9f-9c02-6c88b9d387ba}","prefs":[],"schema":1480349193877,"blockID":"i538","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=964081","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Show Mask ON (malware)","created":"2014-01-27T10:13:17Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"aad90253-8921-b5df-3658-45a70d75f3d7","last_modified":1480349206465},{"guid":"{8E9E3331-D360-4f87-8803-52DE43566502}","prefs":[],"schema":1480349193877,"blockID":"i461","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=906071","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This is a companion add-on for the SweetPacks Toolbar which is <a href=\"https://addons.mozilla.org/firefox/blocked/i392\">blocked</a> due to guideline violations.","name":"Updater By SweetPacks","created":"2013-10-17T16:10:51Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ae8cca6e-4258-545f-9a69-3d908264a701","last_modified":1480349206437},{"guid":"info@bflix.info","prefs":[],"schema":1480349193877,"blockID":"i172","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806802","who":"All Firefox users who have this add-on installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Bflix (malware)","created":"2012-10-30T13:39:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7a9062f4-218d-51d2-9b8c-b282e6eada4f","last_modified":1480349206384},{"guid":"{dff137ae-1ffd-11e3-8277-b8ac6f996f26}","prefs":[],"schema":1480349193877,"blockID":"i450","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=917861","who":"All Firefox users who have this add-on installed.","why":"This is add-on is malware that silently redirects popular search queries to a third party.","name":"Addons Engine (malware)","created":"2013-09-18T16:19:34Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8e583fe4-1c09-9bea-2473-faecf3260685","last_modified":1480349206312},{"guid":"12x3q@3244516.com","prefs":[],"schema":1480349193877,"blockID":"i493","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=939254","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware and is installed silently in violation of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BetterSurf (malware)","created":"2013-12-02T12:49:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"af2a9e74-3753-9ff1-d899-5d1e79ed3dce","last_modified":1480349206286},{"guid":"{20AD702C-661E-4534-8CE9-BA4EC9AD6ECC}","prefs":[],"schema":1480349193877,"blockID":"i626","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1027886","who":"All Firefox users who have this add-on installed.","why":"This add-on is probably silently installed, and is causing significant stability issues for users, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"V-Bates","created":"2014-06-19T15:16:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9b9ccabe-8f9a-e3d1-a689-1aefba1f33b6","last_modified":1480349206261},{"guid":"{c5e48979-bd7f-4cf7-9b73-2482a67a4f37}","prefs":[],"schema":1480349193877,"blockID":"i736","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080842","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"ClearThink","created":"2014-10-17T15:22:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6e8b3e4f-2f59-cde3-e6d2-5bc6e216c506","last_modified":1480349206231},{"guid":"{41339ee8-61ed-489d-b049-01e41fd5d7e0}","prefs":[],"schema":1480349193877,"blockID":"i810","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"FireWeb","created":"2014-12-23T10:32:26Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a35f2ca6-aec4-c01d-170e-650258ebcd2c","last_modified":1480349206165},{"guid":"{845cab51-d8d2-472f-8bd9-2b44642d97c2}","prefs":[],"schema":1480349193877,"blockID":"i460","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=927456","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and handles users' settings, violating some of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Vafmusic9","created":"2013-10-17T15:50:38Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8538ccb4-3b71-9858-3f6d-c0fff7af58b0","last_modified":1480349205746},{"guid":"SpecialSavings@SpecialSavings.com","prefs":[],"schema":1480349193877,"blockID":"i676","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=881511","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This is add-on is generally considered to be unwanted and is probably silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SpecialSavings","created":"2014-07-22T16:31:56Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5e921810-fc3a-0729-6749-47e38ad10a22","last_modified":1480349205688},{"guid":"afurladvisor@anchorfree.com","prefs":[],"schema":1480349193877,"blockID":"i434","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844945","who":"All Firefox users who have this add-on installed.","why":"This add-on bypasses the external install opt in screen in Firefox, violating the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Hotspot Shield Helper","created":"2013-08-09T11:26:11Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"083585eb-d7e7-e228-5fbf-bf35c52044e4","last_modified":1480349205645},{"guid":"info@thebflix.com","prefs":[],"schema":1480349193877,"blockID":"i174","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806802","who":"All Firefox users who have these add-ons installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Bflix (malware)","created":"2012-10-30T13:40:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"811a61d4-9435-133e-6262-fb72486c36b0","last_modified":1480349205526},{"guid":"{EEE6C361-6118-11DC-9C72-001320C79847}","prefs":[],"schema":1480349193877,"blockID":"i392","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=881447","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on changes search settings without user interaction, and fails to reset them after it is removed. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SweetPacks Toolbar","created":"2013-06-25T12:38:45Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c1dc6607-4c0a-4031-9f14-70ef1ae1edcb","last_modified":1480349205455},{"guid":"/^(4cb61367-efbf-4aa1-8e3a-7f776c9d5763@cdece6e9-b2ef-40a9-b178-291da9870c59\\.com|0efc9c38-1ec7-49ed-8915-53a48b6b7600@e7f17679-2a42-4659-83c5-7ba961fdf75a\\.com|6be3335b-ef79-4b0b-a0ba-b87afbc6f4ad@6bbb4d2e-e33e-4fa5-9b37-934f4fb50182\\.com)$/","prefs":[],"schema":1480349193877,"blockID":"i531","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949672","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and using multiple IDs.","name":"Feven","created":"2013-12-20T15:01:22Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"46aa79a9-d329-f713-d4f2-07d31fe7071e","last_modified":1480349205287},{"guid":"afext@anchorfree.com","prefs":[],"schema":1480349193877,"blockID":"i466","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=933988","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't respect user choice, violating the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Hotspot Shield Extension","created":"2013-11-07T13:32:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8176f879-bd73-5468-e908-2d7cfc115ac2","last_modified":1480349205108},{"guid":"{FCE04E1F-9378-4f39-96F6-5689A9159E45}","prefs":[],"schema":1480349193877,"blockID":"i920","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1173154","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-09T15:26:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"eb191ff0-20f4-6e04-4344-d880af4faf51","last_modified":1480349204978},{"guid":"{9CE11043-9A15-4207-A565-0C94C42D590D}","prefs":[],"schema":1480349193877,"blockID":"i503","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947384","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that uses a deceptive name to stay in users' systems.","name":"XUL Cache (malware)","created":"2013-12-06T11:58:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dcdae267-8d3a-5671-dff2-f960febbbb20","last_modified":1480349204951},{"guid":"{0153E448-190B-4987-BDE1-F256CADA672F}","prefs":[],"schema":1480349193877,"blockID":"i914","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1170633","who":"All Firefox users who have this add-on installed in Firefox 39 and above.","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.","name":"RealPlayer Browser Record Plugin","created":"2015-06-02T09:56:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"2bfe0d89-e458-9d0e-f944-ddeaf8c4db6c","last_modified":1480349204871},{"guid":"{77beece6-3997-403a-92fa-0055bfcf88e5}","prefs":[],"schema":1480349193877,"blockID":"i452","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=916966","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, manipulating settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Entrusted11","created":"2013-09-18T16:34:58Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d348f91f-caeb-a803-dfd9-fd5d285aa0fa","last_modified":1480349204844},{"guid":"dealcabby@jetpack","prefs":[],"schema":1480349193877,"blockID":"i222","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=811435","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently side-installed with other software, injecting advertisements in Firefox.","name":"DealCabby","created":"2012-11-29T16:20:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6585f0bd-4f66-71e8-c565-d9762c5c084a","last_modified":1480349204818},{"guid":"{3c9a72a0-b849-40f3-8c84-219109c27554}","prefs":[],"schema":1480349193877,"blockID":"i510","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=951301","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks users' Facebook accounts.","name":"Facebook Haber (malware)","created":"2013-12-17T14:27:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7cfa3d0b-0ab2-5e3a-8143-1031c180e32f","last_modified":1480349204778},{"guid":"{2aab351c-ad56-444c-b935-38bffe18ad26}","prefs":[],"schema":1480349193877,"blockID":"i500","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=946087","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Adobe Photo (malware)","created":"2013-12-04T15:29:44Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f7a76d34-ddcd-155e-9fae-5967bd796041","last_modified":1480349204716},{"guid":"{0A92F062-6AC6-8180-5881-B6E0C0DC2CC5}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i864","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1131220","who":"All users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems and makes unwanted settings changes, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BlockAndSurf","created":"2015-02-26T12:56:19Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"acb16d1c-6274-93a3-7c1c-7ed36ede64a9","last_modified":1480349204612},{"guid":"trackerbird@bustany.org","prefs":[],"schema":1480349193877,"blockID":"i986","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1189264","who":"All Thunderbird users who have this version of the add-on installed on Thunderbird 38.0a2 and above.","why":"This add-on is causing consistent crashes on Thunderbird 38.0a2 and above.","name":"trackerbird 1.2.6","created":"2015-08-17T15:56:04Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.2.6","minVersion":"1.2.6","targetApplication":[{"guid":"{3550f703-e582-4d05-9a08-453d09bdfdc6}","maxVersion":"*","minVersion":"38.0a2"}]}],"id":"bb1c699e-8790-4528-0b6d-4f83b7a3152d","last_modified":1480349204041},{"guid":"{0134af61-7a0c-4649-aeca-90d776060cb3}","prefs":[],"schema":1480349193877,"blockID":"i448","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=912746","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our Add-on Guidelines. It manipulates settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"KeyBar add-on","created":"2013-09-13T16:15:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cf428416-4974-8bb4-7928-c0cb2cfe7957","last_modified":1480349203968},{"guid":"/^(firefox@vebergreat\\.net|EFGLQA@78ETGYN-0W7FN789T87\\.COM)$/","prefs":[],"schema":1480349193877,"blockID":"i564","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=974104","who":"All Firefox users who have these add-ons installed. If you wish to continue using these add-ons, you can enable them in the Add-ons Manager.","why":"These add-ons are silently installed by the Free Driver Scout installer, in violation of our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"veberGreat and vis (Free Driver Scout bundle)","created":"2014-03-05T13:02:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"487538f1-698e-147e-6395-986759ceed7e","last_modified":1480349203902},{"guid":"69ffxtbr@PackageTracer_69.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i882","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1153001","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on appears to be malware, hijacking user's settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"PackageTracer","created":"2015-04-10T16:18:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0d37b4e0-3c60-fdad-dd8c-59baff6eae87","last_modified":1480349203836},{"guid":"{a9bb9fa0-4122-4c75-bd9a-bc27db3f9155}","prefs":[],"schema":1480349193877,"blockID":"i404","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835678","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This group of add-ons is silently installed, bypassing our install opt-in screen. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Searchqu","created":"2013-06-25T15:16:43Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fb7a1dc7-16a0-4f70-8289-4df494e0d0fa","last_modified":1480349203633},{"guid":"P2@D.edu","prefs":[],"schema":1480349193877,"blockID":"i850","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128269","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"unIsaless","created":"2015-02-09T15:29:21Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"49536a29-fc7e-9fd0-f415-e15ac090fa56","last_modified":1480349203605},{"guid":"linksicle@linksicle.com","prefs":[],"schema":1480349193877,"blockID":"i472","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9b5b15b3-6da7-cb7c-3c44-30b4fe079d52","last_modified":1480349203581},{"guid":"{377e5d4d-77e5-476a-8716-7e70a9272da0}","prefs":[],"schema":1480349193877,"blockID":"i398","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835678","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This group of add-ons is silently installed, bypassing our install opt-in screen. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Searchqu","created":"2013-06-25T15:15:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ea94df32-2a85-23da-43f7-3fc5714530ec","last_modified":1480349203519},{"guid":"{4933189D-C7F7-4C6E-834B-A29F087BFD23}","prefs":[],"schema":1480349193877,"blockID":"i437","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=900695","who":"All Firefox users.","why":"This add-on is widely reported to be malware.","name":"Win32.SMSWebalta (malware)","created":"2013-08-09T15:14:27Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cbef1357-d6bc-c8d3-7a82-44af6b1c390f","last_modified":1480349203486},{"guid":"{ADFA33FD-16F5-4355-8504-DF4D664CFE10}","prefs":[],"schema":1480349193877,"blockID":"i306","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844972","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed, bypassing our third-party opt-in screen, in violation of our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>. It's also possible that it changes user settings without their consent.","name":"Nation Toolbar","created":"2013-02-28T12:56:48Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"017fd151-37ca-4646-4763-1d303fb918fa","last_modified":1480349203460},{"guid":"detgdp@gmail.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i884","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1152614","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware, hijacking user settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Security Protection (malware)","created":"2015-04-10T16:21:34Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1b5cc88e-499d-2a47-d793-982d4c05e6ee","last_modified":1480349203433},{"guid":"/^(67314b39-24e6-4f05-99f3-3f88c7cddd17@6c5fa560-13a3-4d42-8e90-53d9930111f9\\.com|ffxtlbr@visualbee\\.com|{7aeae561-714b-45f6-ace3-4a8aed6e227b}|{7093ee04-f2e4-4637-a667-0f730797b3a0}|{53c4024f-5a2e-4f2a-b33e-e8784d730938})$/","prefs":[],"schema":1480349193877,"blockID":"i514","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947473","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by using multiple add-on IDs and making unwanted settings changes.","name":"VisualBee Toolbar","created":"2013-12-20T12:25:50Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5f91eee1-7303-3f97-dfe6-1e897a156c7f","last_modified":1480349203408},{"guid":"FXqG@xeeR.net","prefs":["browser.startup.homepage"],"schema":1480349193877,"blockID":"i720","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems and changes settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"GoSSave","created":"2014-10-02T12:23:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8ebbc061-a4ff-b75b-ec42-eb17c42a2956","last_modified":1480349203341},{"guid":"kallow@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i495","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=945426","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Facebook Security Service (malware)","created":"2013-12-02T15:09:42Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1a2c37a9-e7cc-2d03-2043-098d36b8aca2","last_modified":1480349203247},{"guid":"008abed2-b43a-46c9-9a5b-a771c87b82da@1ad61d53-2bdc-4484-a26b-b888ecae1906.com","prefs":[],"schema":1480349193877,"blockID":"i528","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949565","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed.","name":"weDownload Manager Pro","created":"2013-12-20T14:40:58Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"da46065f-1c68-78f7-80fc-8ae07b5df68d","last_modified":1480349203131},{"guid":"{25dd52dc-89a8-469d-9e8f-8d483095d1e8}","prefs":[],"schema":1480349193877,"blockID":"i714","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Web Counselor","created":"2014-10-01T15:36:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e46c31ad-0ab3-e48a-47aa-9fa91b675fda","last_modified":1480349203066},{"guid":"{B1FC07E1-E05B-4567-8891-E63FBE545BA8}","prefs":[],"schema":1480349193877,"blockID":"i926","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1173154","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-09T15:28:46Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"09868783-261a-ac24-059d-fc772218c1ba","last_modified":1480349202708},{"guid":"/^(torntv@torntv\\.com|trtv3@trtv\\.com|torntv2@torntv\\.com|e2fd07a6-e282-4f2e-8965-85565fcb6384@b69158e6-3c3b-476c-9d98-ae5838c5b707\\.com)$/","prefs":[],"schema":1480349193877,"blockID":"i529","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949559","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed.","name":"TornTV","created":"2013-12-20T14:46:03Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"040e5ec2-ea34-816a-f99f-93296ce845e8","last_modified":1480349202677},{"guid":"249911bc-d1bd-4d66-8c17-df533609e6d8@c76f3de9-939e-4922-b73c-5d7a3139375d.com","prefs":[],"schema":1480349193877,"blockID":"i532","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949672","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and using multiple IDs.","name":"Feven","created":"2013-12-20T15:02:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d32b850d-82d5-b63d-087c-fb2041b2c232","last_modified":1480349202631},{"guid":"{7D4F1959-3F72-49d5-8E59-F02F8AA6815D}","prefs":[],"schema":1480349193877,"blockID":"i394","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=881447","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This is a companion add-on for the SweetPacks Toolbar which <a href=\"https://addons.mozilla.org/en-US/firefox/blocked/i392\">is blocked</a> due to guideline violations.","name":"Updater By SweetPacks","created":"2013-06-25T12:40:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"851c2b8e-ea19-3a63-eac5-f931a8da5d6e","last_modified":1480349202341},{"guid":"g@uzcERQ6ko.net","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i776","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes user settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>","name":"GoSave","created":"2014-10-31T16:23:36Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ee1e1a44-b51b-9f12-819d-64c3e515a147","last_modified":1480349202307},{"guid":"ffxtlbr@incredibar.com","prefs":[],"schema":1480349193877,"blockID":"i318","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=812264","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"IncrediBar","created":"2013-03-20T14:40:32Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9e84b07c-84d5-c932-85f2-589713d7e380","last_modified":1480349202280},{"guid":"M1uwW0@47z8gRpK8sULXXLivB.com","prefs":[],"schema":1480349193877,"blockID":"i870","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1131159","who":"All users who have this add-on installed.","why":"This is a malicious add-on that goes by the the name \"Flash Player 11\".","name":"Flash Player 11 (malware)","created":"2015-03-04T14:34:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"71d961b2-37d1-d393-76f5-3afeef57e749","last_modified":1480349202252},{"guid":"4zffxtbr-bs@VideoDownloadConverter_4z.com","prefs":[],"schema":1480349193877,"blockID":"i507","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949266","who":"All Firefox users who have this add-on installed.","why":"Certain versions of this add-on contains an executable that is flagged by multiple tools as malware. Newer versions no longer use it.","name":"VideoDownloadConverter","created":"2013-12-12T15:37:23Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"5.75.3.25126","minVersion":"0","targetApplication":[]}],"id":"0a0f106a-ecc6-c537-1818-b36934943e91","last_modified":1480349202156},{"guid":"contato@facefollow.net","prefs":[],"schema":1480349193877,"blockID":"i509","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=950846","who":"All Firefox users who have this add-on installed.","why":"This add-on spams users' Facebook accounts.","name":"Face follow","created":"2013-12-16T16:15:15Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"56f15747-af8c-342c-6877-a41eeacded84","last_modified":1480349202067},{"guid":"/^({83a8ce1b-683c-4784-b86d-9eb601b59f38}|{ef1feedd-d8da-4930-96f1-0a1a598375c6}|{79ff1aae-701f-4ca5-aea3-74b3eac6f01b}|{8a184644-a171-4b05-bc9a-28d75ffc9505}|{bc09c55d-0375-4dcc-836e-0e3c8addfbda}|{cef81415-2059-4dd5-9829-1aef3cf27f4f})$/","prefs":[],"schema":1480349193877,"blockID":"i526","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949566","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and uses multiple IDs.","name":"KeyBar add-on","created":"2013-12-20T14:12:31Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9dfa4e92-bbf2-66d1-59a9-51402d1d226c","last_modified":1480349202010},{"guid":"{f2548724-373f-45fe-be6a-3a85e87b7711}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i768","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1088726","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astro New Tab","created":"2014-10-30T14:52:09Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8510e9e2-c7d8-90d0-a2ff-eb09293acc6e","last_modified":1480349201854},{"guid":"KSqOiTeSJEDZtTGuvc18PdPmYodROmYzfpoyiCr2@jetpack","prefs":[],"schema":1480349193877,"blockID":"i1032","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1211172","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Video Player (malware)","created":"2015-10-05T16:22:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3d9188ac-235f-773a-52a2-261b3ea9c03c","last_modified":1480349201504},{"guid":"{849ded12-59e9-4dae-8f86-918b70d213dc}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i708","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1047102","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes homepage and search settings without the user's consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astromenda New Tab","created":"2014-09-02T16:29:08Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a319bfee-464f-1c33-61ad-738c52842fbd","last_modified":1480349201453},{"guid":"grjkntbhr@hgergerherg.com","prefs":[],"schema":1480349193877,"blockID":"i1018","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1208196","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"GreenPlayer (malware)","created":"2015-09-24T16:04:53Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9c47d940-bdd9-729f-e32e-1774d87f24b5","last_modified":1480349201425},{"guid":"{EEF73632-A085-4fd3-A778-ECD82C8CB297}","prefs":[],"schema":1480349193877,"blockID":"i165","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806451","who":"All Firefox users who have these add-ons installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Codec-M (malware)","created":"2012-10-29T16:41:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e5ecd02a-20ee-749b-d5cf-3d74d1173a1f","last_modified":1480349201262},{"guid":"firefox-extension@mozilla.org","prefs":[],"schema":1480349193877,"blockID":"i688","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1049533","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hides itself under the name Java_plugin, among others.","name":"FinFisher (malware)","created":"2014-08-06T17:13:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"98aca74a-69c7-9960-cccc-096a4a4adc6c","last_modified":1480349201235},{"guid":"{e44a1809-4d10-4ab8-b343-3326b64c7cdd}","prefs":[],"schema":1480349193877,"blockID":"i451","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=916966","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, manipulating settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Entrusted","created":"2013-09-18T16:33:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ad5f53ed-7a43-cb1f-cbd7-41808fac1791","last_modified":1480349201128},{"guid":"{21EAF666-26B3-4A3C-ABD0-CA2F5A326744}","prefs":[],"schema":1480349193877,"blockID":"i620","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024752","who":"All Firefox users who have this add-on installed.","why":"This add-on is probably silently installed, and is causing significant stability issues for users, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"V-Bates","created":"2014-06-12T15:27:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2d8833db-01a7-a758-080f-19e47abc54cb","last_modified":1480349201096},{"guid":"{1FD91A9C-410C-4090-BBCC-55D3450EF433}","prefs":[],"schema":1480349193877,"blockID":"i338","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844979","who":"All Firefox users who have this add-on installed.","why":"This extension overrides search settings, and monitors any further changes done to them so that they can be reverted. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">add-on guidelines</a>.","name":"DataMngr (malware)","created":"2013-04-24T11:30:28Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2e35995f-bec6-aa2b-3372-346d3325f72e","last_modified":1480349201059},{"guid":"9598582LLKmjasieijkaslesae@jetpack","prefs":[],"schema":1480349193877,"blockID":"i996","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1201165","who":"All users who have this add-on installed.","why":"This is a malicious add-on that takes over Facebook accounts.","name":"Secure Player (malware)","created":"2015-09-07T13:50:27Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"52f9c6e7-f7d5-f52e-cc35-eb99ef8b4b6a","last_modified":1480349201029},{"guid":"{bf7380fa-e3b4-4db2-af3e-9d8783a45bfc}","prefs":[],"schema":1480349193877,"blockID":"i406","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=776404","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on changes search settings without user interaction, and fails to reset them after it is removed. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"uTorrentBar","created":"2013-06-27T10:46:53Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3bcefc4b-110c-f3b8-17ad-f9fc97c1120a","last_modified":1480349201000},{"guid":"{424b0d11-e7fe-4a04-b7df-8f2c77f58aaf}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i800","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080839","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astromenda NT","created":"2014-12-15T10:51:56Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"07bdf6aa-cfc8-ed21-6b36-6f90af02b169","last_modified":1480349200939},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i618","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:25:04Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.31.*","minVersion":"3.15.31","targetApplication":[]}],"id":"825feb43-d6c2-7911-4189-6f589f612c34","last_modified":1480349200911},{"guid":"{167d9323-f7cc-48f5-948a-6f012831a69f}","prefs":[],"schema":1480349193877,"blockID":"i262","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=812303","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently side-installed by other software, and doesn't do much more than changing the users' settings, without reverting them on removal.","name":"WhiteSmoke (malware)","created":"2013-01-29T13:33:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a8f249fe-3db8-64b8-da89-7b584337a7af","last_modified":1480349200885},{"guid":"/^({988919ff-0cd8-4d0c-bc7e-60d55a49eb64}|{494b9726-9084-415c-a499-68c07e187244}|{55b95864-3251-45e9-bb30-1a82589aaff1}|{eef3855c-fc2d-41e6-8d91-d368f51b3055}|{90a1b331-c2b4-4933-9f63-ba7b84d60d58}|{d2cf9842-af95-48cd-b873-bfbb48cd7f5e})$/","prefs":[],"schema":1480349193877,"blockID":"i541","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963819","who":"All Firefox users who have this add-on installed","why":"This add-on has been repeatedly blocked before and keeps showing up with new add-on IDs, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"MixiDJ (malware)","created":"2014-01-28T14:09:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"36196aed-9d0d-ebee-adf1-d1f7fadbc48f","last_modified":1480349200819},{"guid":"{29b136c9-938d-4d3d-8df8-d649d9b74d02}","prefs":[],"schema":1480349193877,"blockID":"i598","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1011322","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed, in violation with our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Mega Browse","created":"2014-06-12T13:21:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"63b1c965-27c3-cd06-1b76-8721add39edf","last_modified":1480349200775},{"guid":"{6e7f6f9f-8ce6-4611-add2-05f0f7049ee6}","prefs":[],"schema":1480349193877,"blockID":"i868","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1086574","who":"All users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Word Proser","created":"2015-02-26T14:58:59Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f54797da-cdcd-351a-c95e-874b64b0d226","last_modified":1480349200690},{"guid":"{02edb56b-9b33-435b-b7df-b2843273a694}","prefs":[],"schema":1480349193877,"blockID":"i438","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=896581","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. It is installed bypassing the Firefox opt-in screen, and manipulates settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"KeyBar Toolbar","created":"2013-08-09T15:27:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"896710d2-5a65-e9b0-845b-05aa72c2bd51","last_modified":1480349200338},{"guid":"{1cdbda58-45f8-4d91-b566-8edce18f8d0a}","prefs":[],"schema":1480349193877,"blockID":"i724","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080835","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Counselor Pro","created":"2014-10-13T16:00:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7b70bd36-d2f7-26fa-9038-8b8dd132cd81","last_modified":1480349200288},{"guid":"{b12785f5-d8d0-4530-a3ea-5c4263b85bef}","prefs":[],"schema":1480349193877,"blockID":"i988","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1161573","who":"All users who have this add-on installed. Those who wish continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on overrides user's preferences without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Hero Fighter Community Toolbar","created":"2015-08-17T16:04:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3e6d73f2-e8e3-af69-866e-30d3977b09e4","last_modified":1480349200171},{"guid":"{c2d64ff7-0ab8-4263-89c9-ea3b0f8f050c}","prefs":[],"schema":1480349193877,"blockID":"i39","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=665775","who":"Users of MediaBar versions 4.3.1.00 and below in all versions of Firefox.","why":"This add-on causes a high volume of crashes and is incompatible with certain versions of Firefox.","name":"MediaBar","created":"2011-07-19T10:18:12Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"4.3.1.00","minVersion":"0.1","targetApplication":[]}],"id":"e928a115-9d8e-86a4-e2c7-de39627bd9bf","last_modified":1480349200047},{"guid":"{9edd0ea8-2819-47c2-8320-b007d5996f8a}","prefs":["browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i684","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1033857","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is believed to be silently installed in Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"webget","created":"2014-08-06T13:33:33Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d38561f5-370f-14be-1443-a74dad29b1f3","last_modified":1480349199962},{"guid":"/^({ad9a41d2-9a49-4fa6-a79e-71a0785364c8})|(ffxtlbr@mysearchdial\\.com)$/","prefs":["browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i670","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1036740","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on has been repeatedly been silently installed into users' systems, and is known for changing the default search without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"MySearchDial","created":"2014-07-18T15:47:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a04075e6-5df2-2e1f-85a6-3a0171247349","last_modified":1480349199927},{"guid":"/^({1f43c8af-e9e4-4e5a-b77a-f51c7a916324}|{3a3bd700-322e-440a-8a6a-37243d5c7f92}|{6a5b9fc2-733a-4964-a96a-958dd3f3878e}|{7b5d6334-8bc7-4bca-a13e-ff218d5a3f17}|{b87bca5b-2b5d-4ae8-ad53-997aa2e238d4}|{bf8e032b-150f-4656-8f2d-6b5c4a646e0d})$/","prefs":[],"schema":1480349193877,"blockID":"i1136","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1251940","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hides itself from view and disables various security features in Firefox.","name":"Watcher (malware)","created":"2016-03-04T17:56:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a2d0378f-ebe4-678c-62d8-2e4c6a613c17","last_modified":1480349199818},{"guid":"liiros@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i814","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1119657","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems without their consent and performs unwanted operations.","name":"One Tab (malware)","created":"2015-01-09T12:49:05Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"387c054d-cc9f-7ebd-c814-b4c1fbcb2880","last_modified":1480349199791},{"guid":"{97E22097-9A2F-45b1-8DAF-36AD648C7EF4}","prefs":[],"schema":1480349193877,"blockID":"i916","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1170633","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-02T09:57:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"94fba774-c4e6-046a-bc7d-ede787a9d0fe","last_modified":1480349199738},{"guid":"{b64982b1-d112-42b5-b1e4-d3867c4533f8}","prefs":[],"schema":1480349193877,"blockID":"i167","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=805973","who":"All Firefox users who have this add-on installed.","why":"This add-on is a frequent cause for browser crashes and other problems.","name":"Browser Manager","created":"2012-10-29T17:17:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"00bbe501-2d27-7a1c-c344-6eea1c707473","last_modified":1480349199673},{"guid":"{58bd07eb-0ee0-4df0-8121-dc9b693373df}","prefs":[],"schema":1480349193877,"blockID":"i286","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=842206","who":"All Firefox users who have this extension installed.","why":"This extension is malicious and is installed under false pretenses, causing problems for many Firefox users. Note that this is not the same <a href=\"https://addons.mozilla.org/firefox/addon/browserprotect/\">BrowserProtect extension</a> that is listed on our add-ons site. That one is safe to use.","name":"Browser Protect / bProtector (malware)","created":"2013-02-18T10:54:28Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b40a60d3-b9eb-09eb-bb02-d50b27aaac9f","last_modified":1480349199619},{"guid":"trtv3@trtv.com","prefs":[],"schema":1480349193877,"blockID":"i465","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=845610","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"TornTV","created":"2013-11-01T15:21:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3d4d8a33-2eff-2556-c699-9be0841a8cd4","last_modified":1480349199560},{"guid":"{d2cf9842-af95-48cd-b873-bfbb48cd7f5e}","prefs":[],"schema":1480349193877,"blockID":"i439","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=902569","who":"All Firefox users who have this add-on installed.","why":"This is another instance of the <a href=\"https://addons.mozilla.org/en-US/firefox/blocked/i354\">previously blocked</a> Mixi DJ add-on, which doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. If you wish to continue using it, it can be enabled in the Add-ons Manager.","name":"Mixi DJ V45","created":"2013-08-09T16:08:18Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e81c31fc-265e-61b9-d4c1-0e2f31f1652e","last_modified":1480349199478},{"guid":"/^({b95faac1-a3d7-4d69-8943-ddd5a487d966}|{ecce0073-a837-45a2-95b9-600420505f7e}|{2713b394-286f-4d7c-89ea-4174eeab9f5a}|{da7a20cf-bef4-4342-ad78-0240fdf87055})$/","prefs":[],"schema":1480349193877,"blockID":"i624","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947482","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is known to change user settings without their consent, is distributed under multiple add-on IDs, and is also correlated with reports of tab functions being broken in Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n","name":"WiseConvert","created":"2014-06-18T13:50:38Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ed57d7a6-5996-c7da-8e07-1ad125183e84","last_modified":1480349199446},{"guid":"{f894a29a-f065-40c3-bb19-da6057778493}","prefs":[],"schema":1480349193877,"blockID":"i742","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080817","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on appears to be silently installed into users' systems, and changes settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Spigot Shopping Assistant","created":"2014-10-17T15:46:59Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"39d8334e-4b7c-4336-2d90-e6aa2d783967","last_modified":1480349199083},{"guid":"plugin@analytic-s.com","prefs":[],"schema":1480349193877,"blockID":"i467","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935797","who":"All Firefox users who have this add-on installed.","why":"This add-on bypasses the external install opt in screen in Firefox, violating the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Analytics","created":"2013-11-07T14:08:48Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ffbed3f3-e5c9-bc6c-7530-f68f47b7efd6","last_modified":1480349199026},{"guid":"{C4A4F5A0-4B89-4392-AFAC-D58010E349AF}","prefs":[],"schema":1480349193877,"blockID":"i678","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=895668","who":"All Firefox users who have this add-on installed. If you wish to continue using it, you can enable it in the Add-ons Manager.","why":"This add-on is generally silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"DataMngr","created":"2014-07-23T14:12:23Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"151021fc-ce4e-a734-e075-4ece19610f64","last_modified":1480349198947},{"guid":"HxLVJK1ioigz9WEWo8QgCs3evE7uW6LEExAniBGG@jetpack","prefs":[],"schema":1480349193877,"blockID":"i1036","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1211170","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Mega Player (malware)","created":"2015-10-05T16:37:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"32e34b41-a73c-72d4-c96c-136917ad1d4d","last_modified":1480349198894},{"guid":"{6af08a71-380e-42dd-9312-0111d2bc0630}","prefs":[],"schema":1480349193877,"blockID":"i822","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1126353","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware, hiding itself in the Add-ons Manager, and keeping track of certain user actions.","name":"{6af08a71-380e-42dd-9312-0111d2bc0630} (malware)","created":"2015-01-27T09:50:40Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"96d0c12b-a6cf-4539-c1cf-a1c75c14ff24","last_modified":1480349198826},{"guid":"colmer@yopmail.com","prefs":[],"schema":1480349193877,"blockID":"i550","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=968445","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Video Plugin Facebook (malware)","created":"2014-02-06T15:49:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c394d10b-384e-cbd0-f357-9c521715c373","last_modified":1480349198744},{"guid":"fplayer@adobe.flash","prefs":[],"schema":1480349193877,"blockID":"i444","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=909433","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware disguised as the Flash Player plugin.","name":"Flash Player (malware)","created":"2013-08-26T14:49:48Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c6557989-1b59-72a9-da25-b816c4a4c723","last_modified":1480349198667},{"guid":"{6E19037A-12E3-4295-8915-ED48BC341614}","prefs":[],"schema":1480349193877,"blockID":"i24","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=615518","who":"Users of RelevantKnowledge version 1.3.328.4 and older in Firefox 4 and later.","why":"This add-on causes a high volume of Firefox crashes.","name":"comScore RelevantKnowledge","created":"2011-03-02T17:42:56Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.3.328.4","minVersion":"0.1","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.7a1pre"}]}],"id":"7c189c5e-f95b-0aef-e9e3-8e879336503b","last_modified":1480349198606},{"guid":"crossriderapp4926@crossrider.com","prefs":[],"schema":1480349193877,"blockID":"i91","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=754648","who":"All Firefox users who have installed this add-on.","why":"Versions of this add-on prior to 0.81.44 automatically post message to users' walls and hide them from their view. Version 0.81.44 corrects this.","name":"Remove My Timeline (malware)","created":"2012-05-14T14:16:43Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"0.81.43","minVersion":"0","targetApplication":[]}],"id":"5ee3e72e-96fb-c150-fc50-dd581e960963","last_modified":1480349198547},{"guid":"/^(93abedcf-8e3a-4d02-b761-d1441e437c09@243f129d-aee2-42c2-bcd1-48858e1c22fd\\.com|9acfc440-ac2d-417a-a64c-f6f14653b712@09f9a966-9258-4b12-af32-da29bdcc28c5\\.com|58ad0086-1cfb-48bb-8ad2-33a8905572bc@5715d2be-69b9-4930-8f7e-64bdeb961cfd\\.com)$/","prefs":[],"schema":1480349193877,"blockID":"i544","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949596","who":"All Firefox users who have this add-on installed. If you wish to continue using it, it can be enabled in the Add-ons Manager.","why":"This add-on is in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, using multiple add-on IDs and potentially doing other unwanted activities.","name":"SuperLyrics","created":"2014-01-30T11:51:19Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d8d25967-9814-3b65-0787-a0525c16e11e","last_modified":1480349198510},{"guid":"wHO@W9.net","prefs":[],"schema":1480349193877,"blockID":"i980","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1192468","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"BestSavEFOrYoU (malware)","created":"2015-08-11T11:20:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4beb917f-68f2-1f91-beed-dff6d83006f8","last_modified":1480349198483},{"guid":"frhegnejkgner@grhjgewfewf.com","prefs":[],"schema":1480349193877,"blockID":"i1040","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1212451","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Async Codec (malware)","created":"2015-10-07T13:03:37Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fb6ab4ce-5517-bd68-2cf7-a93a109a528a","last_modified":1480349198458},{"guid":"firefox@luckyleap.net","prefs":[],"schema":1480349193877,"blockID":"i471","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:33Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3a9e04c7-5e64-6297-8442-2816915aad77","last_modified":1480349198433},{"guid":"lugcla21@gmail.com","prefs":[],"schema":1480349193877,"blockID":"i432","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=902072","who":"All Firefox users who have this add-on installed.","why":"This add-on includes malicious code that spams users' Facebook accounts with unwanted messages.","name":"FB Color Changer (malware)","created":"2013-08-06T13:16:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b6943f35-9429-1f8e-bf8e-fe37979fe183","last_modified":1480349198372},{"guid":"{99079a25-328f-4bd4-be04-00955acaa0a7}","prefs":[],"schema":1480349193877,"blockID":"i402","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835678","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This group of add-ons is silently installed, bypassing our install opt-in screen. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Searchqu","created":"2013-06-25T15:16:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"16008331-8b47-57c8-a6f7-989914d1cb8a","last_modified":1480349198341},{"guid":"{81b13b5d-fba1-49fd-9a6b-189483ac548a}","prefs":[],"schema":1480349193877,"blockID":"i473","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:43Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"76debc7b-b875-6da4-4342-1243cbe437f6","last_modified":1480349198317},{"guid":"{e935dd68-f90d-46a6-b89e-c4657534b353}","prefs":[],"schema":1480349193877,"blockID":"i732","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Sites Pro","created":"2014-10-16T16:38:24Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"97fdc235-ac1a-9f20-1b4a-17c2f0d89ad1","last_modified":1480349198260},{"guid":"{32da2f20-827d-40aa-a3b4-2fc4a294352e}","prefs":[],"schema":1480349193877,"blockID":"i748","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963787","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Start Page","created":"2014-10-17T16:02:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6c980c8e-4a3c-7912-4a3a-80add457575a","last_modified":1480349198223},{"guid":"chinaescapeone@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i431","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=901770","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that uses a deceptive name and hijacks social networks.","name":"F-Secure Security Pack (malware)","created":"2013-08-05T16:43:24Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fbd89a9d-9c98-8481-e4cf-93e327ca8be1","last_modified":1480349198192},{"guid":"{cc6cc772-f121-49e0-b1f0-c26583cb0c5e}","prefs":[],"schema":1480349193877,"blockID":"i716","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Counselor","created":"2014-10-02T12:12:34Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"debcd28c-884b-ca42-d983-6fabf91034dd","last_modified":1480349198148},{"guid":"{906000a4-88d9-4d52-b209-7a772970d91f}","prefs":[],"schema":1480349193877,"blockID":"i474","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:48Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"326d05b9-ace7-67c6-b094-aad926c185a5","last_modified":1480349197744},{"guid":"{AB2CE124-6272-4b12-94A9-7303C7397BD1}","prefs":[],"schema":1480349193877,"blockID":"i20","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=627278","who":"Users of Skype extension versions below 5.2.0.7165 for all versions of Firefox.","why":"This add-on causes a high volume of Firefox crashes and introduces severe performance issues. Please <a href=\"http://www.skype.com/intl/en/get-skype/on-your-computer/click-and-call/\">update to the latest version</a>. For more information, please <a href=\"http://blog.mozilla.com/addons/2011/01/20/blocking-the-skype-toolbar-in-firefox/\">read our announcement</a>.","name":"Skype extension","created":"2011-01-20T18:39:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"5.2.0.7164","minVersion":"0.1","targetApplication":[]}],"id":"60e16015-1803-197a-3241-484aa961d18f","last_modified":1480349197667},{"guid":"f6682b47-e12f-400b-9bc0-43b3ccae69d1@39d6f481-b198-4349-9ebe-9a93a86f9267.com","prefs":[],"schema":1480349193877,"blockID":"i682","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1043017","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is being silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"enformation","created":"2014-08-04T16:07:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a7ae65cd-0869-67e8-02f8-6d22c56a83d4","last_modified":1480349197636},{"guid":"rally_toolbar_ff@bulletmedia.com","prefs":[],"schema":1480349193877,"blockID":"i537","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=950267","who":"All Firefox users who have this extension installed. If you want to continue using it, you can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing it.","name":"Rally Toolbar","created":"2014-01-23T15:51:48Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4ac6eb63-b51a-3296-5b02-bae77f424032","last_modified":1480349197604},{"guid":"x77IjS@xU.net","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i774","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes user settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>\r\n","name":"YoutubeAdBlocke","created":"2014-10-31T16:22:53Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4771da14-bcf2-19b1-3d71-bc61a1c7d457","last_modified":1480349197578},{"guid":"{49c53dce-afa0-49a1-a08b-2eb8e8444128}","prefs":[],"schema":1480349193877,"blockID":"i441","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844985","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"ytbyclick","created":"2013-08-09T16:58:50Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5f08d720-58c2-6acb-78ad-7af45c82c90b","last_modified":1480349197550},{"guid":"{bb7b7a60-f574-47c2-8a0b-4c56f2da9802}","prefs":[],"schema":1480349193877,"blockID":"i754","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080850","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"AdvanceElite","created":"2014-10-17T16:27:32Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f222ceb2-9b69-89d1-8dce-042d8131a12e","last_modified":1480349197500},{"guid":"/^((34qEOefiyYtRJT@IM5Munavn\\.com)|(Mro5Fm1Qgrmq7B@ByrE69VQfZvZdeg\\.com)|(KtoY3KGxrCe5ie@yITPUzbBtsHWeCdPmGe\\.com)|(9NgIdLK5Dq4ZMwmRo6zk@FNt2GCCLGyUuOD\\.com)|(NNux7bWWW@RBWyXdnl6VGls3WAwi\\.com)|(E3wI2n@PEHTuuNVu\\.com)|(2d3VuWrG6JHBXbQdbr@3BmSnQL\\.com))$/","prefs":[],"schema":1480349193877,"blockID":"i324","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=841791","who":"All users who have this add-on installed.","why":"This extension is malware, installed pretending to be the Flash Player plugin.","name":"Flash Player (malware)","created":"2013-03-22T14:48:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5be3a399-af3e-644e-369d-628273b3fdc2","last_modified":1480349197432},{"guid":"{8f894ed3-0bf2-498e-a103-27ef6e88899f}","prefs":[],"schema":1480349193877,"blockID":"i792","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"ExtraW","created":"2014-11-26T13:49:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bebc9e15-59a1-581d-0163-329d7414edff","last_modified":1480349197368},{"guid":"profsites@pr.com","prefs":[],"schema":1480349193877,"blockID":"i734","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.\r\n","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"ProfSites","created":"2014-10-16T16:39:26Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0d6d84d7-0b3f-c5ab-57cc-6b66b0775a23","last_modified":1480349197341},{"guid":"{872b5b88-9db5-4310-bdd0-ac189557e5f5}","prefs":[],"schema":1480349193877,"blockID":"i497","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=945530","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making settings changes that can't be easily reverted.","name":"DVDVideoSoft Menu","created":"2013-12-03T16:08:09Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e8da89c4-c585-77e4-9872-591d20723a7e","last_modified":1480349197240},{"guid":"123456789@offeringmedia.com","prefs":[],"schema":1480349193877,"blockID":"i664","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1036757","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that attempts to hide itself by impersonating the Adobe Flash plugin.","name":"Taringa MP3 / Adobe Flash","created":"2014-07-10T15:41:24Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6d0a7dda-d92a-c8e2-21be-c92b0a88ac8d","last_modified":1480349197208},{"guid":"{df6bb2ec-333b-4267-8c4f-3f27dc8c6e07}","prefs":[],"schema":1480349193877,"blockID":"i487","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=940681","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Facebook 2013 (malware)","created":"2013-11-19T14:59:45Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5867c409-b342-121e-3c3b-426e2f0ba1d4","last_modified":1480349197109},{"guid":"/^({4e988b08-8c51-45c1-8d74-73e0c8724579}|{93ec97bf-fe43-4bca-a735-5c5d6a0a40c4}|{aed63b38-7428-4003-a052-ca6834d8bad3}|{0b5130a9-cc50-4ced-99d5-cda8cc12ae48}|{C4CFC0DE-134F-4466-B2A2-FF7C59A8BFAD})$/","prefs":[],"schema":1480349193877,"blockID":"i524","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947481","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted.","name":"SweetPacks","created":"2013-12-20T13:43:21Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1a3a26a2-cdaa-e5ba-f6ac-47b98ae2cc26","last_modified":1480349197082},{"guid":"{87b5a11e-3b54-42d2-9102-0a7cb1f79ebf}","prefs":[],"schema":1480349193877,"blockID":"i838","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128327","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Cyti Web (malware)","created":"2015-02-06T14:29:12Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1ba0e57c-4c0c-4eb6-26e7-c2016769c343","last_modified":1480349196965},{"guid":"/^({bf67a47c-ea97-4caf-a5e3-feeba5331231}|{24a0cfe1-f479-4b19-b627-a96bf1ea3a56})$/","prefs":[],"schema":1480349193877,"blockID":"i542","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963819","who":"All Firefox users who have this add-on installed.","why":"This add-on has been repeatedly blocked before and keeps showing up with new add-on IDs, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"MixiDJ (malware)","created":"2014-01-28T14:10:49Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fc442b64-1b5d-bebb-c486-f431b154f3db","last_modified":1480349196622},{"guid":"/^({ebd898f8-fcf6-4694-bc3b-eabc7271eeb1}|{46008e0d-47ac-4daa-a02a-5eb69044431a}|{213c8ed6-1d78-4d8f-8729-25006aa86a76}|{fa23121f-ee7c-4bd8-8c06-123d087282c5}|{19803860-b306-423c-bbb5-f60a7d82cde5})$/","prefs":[],"schema":1480349193877,"blockID":"i622","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947482","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is known to change user settings without their consent, is distributed under multiple add-on IDs, and is also correlated with reports of tab functions being broken in Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"WiseConvert","created":"2014-06-18T13:48:26Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ffd184fa-aa8f-8a75-ff00-ce285dec5b22","last_modified":1480349196597},{"guid":"/^({fa95f577-07cb-4470-ac90-e843f5f83c52}|ffxtlbr@speedial\\.com)$/","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i696","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1031115","who":"All Firefox users who have any of these add-ons installed. Users who wish to continue using these add-ons can enable them in the Add-ons Manager.","why":"These add-ons are silently installed and change homepage and search defaults without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. They are also distributed under more than one add-on ID.","name":"Speedial","created":"2014-08-21T13:55:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"130c7419-f727-a2fb-3891-627bc69a43bb","last_modified":1480349196565},{"guid":"pennerdu@faceobooks.ws","prefs":[],"schema":1480349193877,"blockID":"i442","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=904050","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Console Video (malware)","created":"2013-08-13T14:00:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fb83e48e-a780-9d06-132c-9ecc65b43674","last_modified":1480349196541},{"guid":"{E90FA778-C2B7-41D0-9FA9-3FEC1CA54D66}","prefs":[],"schema":1480349193877,"blockID":"i446","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=788838","who":"All Firefox users who have this add-on installed. The add-on can be enabled again in the Add-ons Manager.","why":"This add-on is installed silently, in violation of our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"YouTube to MP3 Converter","created":"2013-09-06T15:59:29Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"83eb6337-a3b6-84e4-e76c-ee9200b80796","last_modified":1480349196471},{"guid":"{ad7ce998-a77b-4062-9ffb-1d0b7cb23183}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i804","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080839","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astromenda Search Addon","created":"2014-12-15T10:53:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"633f9999-c81e-bd7a-e756-de7d34feb39d","last_modified":1480349196438},{"guid":"dodatek@flash2.pl","prefs":[],"schema":1480349193877,"blockID":"i1279","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1312748","who":"Any user with version 1.3 or newer of this add-on installed.","why":"This add-on claims to be a flash plugin and it does some work on youtube, but it also steals your facebook and adfly credentials and sends them to a remote server.","name":"Aktualizacja Flash WORK addon","created":"2016-10-27T15:52:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"1.3","targetApplication":[]}],"id":"2dab5211-f9ec-a1bf-c617-6f94f28b5ee1","last_modified":1480349196331},{"guid":"{2d069a16-fca1-4e81-81ea-5d5086dcbd0c}","prefs":[],"schema":1480349193877,"blockID":"i440","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=903647","who":"All Firefox users who have this add-on installed.","why":"This add-on is installed silently and doesn't follow many other of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. If you want to continue using this add-on, you can enable it in the Add-ons Manager.","name":"GlitterFun","created":"2013-08-09T16:26:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e3f77f3c-b1d6-3b29-730a-846007b9cb16","last_modified":1480349196294},{"guid":"xivars@aol.com","prefs":[],"schema":1480349193877,"blockID":"i501","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=946420","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Video Plugin Facebook (malware)","created":"2013-12-04T15:34:32Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3303d201-7006-3c0d-5fd5-45503e2e690c","last_modified":1480349196247},{"guid":"2bbadf1f-a5af-499f-9642-9942fcdb7c76@f05a14cc-8842-4eee-be17-744677a917ed.com","prefs":[],"schema":1480349193877,"blockID":"i700","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1052599","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is widely considered malware and is apparently installed silently into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"PIX Image Viewer","created":"2014-08-21T16:15:16Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1b72889b-90e6-ea58-4fe8-d48257df7d8b","last_modified":1480349196212},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i600","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:16:08Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.5.*","minVersion":"3.15.5","targetApplication":[]}],"id":"51c4ab3b-9ad3-c5c3-98c8-a220025fc5a3","last_modified":1480349196158},{"guid":"{729c9605-0626-4792-9584-4cbe65b243e6}","prefs":[],"schema":1480349193877,"blockID":"i788","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Browser Ext Assistance","created":"2014-11-20T10:07:19Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3c588238-2501-6a53-65ea-5c8ff0f3e51d","last_modified":1480349196123},{"guid":"webbooster@iminent.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i630","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=866943","who":"All Firefox users who have any of these add-ons installed. Users who wish to continue using them can enable them in the Add-ons Manager.","why":"These add-ons have been silently installed repeatedly, and change settings without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Iminent Minibar","created":"2014-06-26T15:49:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d894ea79-8215-7a0c-b0e9-be328c3afceb","last_modified":1480349196032},{"guid":"firefox@bandoo.com","prefs":[],"schema":1480349193877,"blockID":"i23","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=629634","who":"Users of Bandoo version 5.0 for Firefox 3.6 and later.","why":"This add-on causes a high volume of Firefox crashes.","name":"Bandoo","created":"2011-03-01T23:30:23Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"5.0","minVersion":"5.0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.7a1pre"}]}],"id":"bd487cf4-3f6a-f956-a6e9-842ac8deeac5","last_modified":1480349195915},{"guid":"5nc3QHFgcb@r06Ws9gvNNVRfH.com","prefs":[],"schema":1480349193877,"blockID":"i372","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=875752","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware pretending to be the Flash Player plugin.","name":"Flash Player 11 (malware)","created":"2013-06-18T13:23:40Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dc71fcf5-fae4-5a5f-6455-ca7bbe4202db","last_modified":1480349195887},{"guid":"/^(7tG@zEb\\.net|ru@gfK0J\\.edu)$/","prefs":[],"schema":1480349193877,"blockID":"i854","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=952255","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"youtubeadblocker (malware)","created":"2015-02-09T15:41:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cfe42207-67a9-9b88-f80c-994e6bdd0c55","last_modified":1480349195851},{"guid":"{a7aae4f0-bc2e-a0dd-fb8d-68ce32c9261f}","prefs":[],"schema":1480349193877,"blockID":"i378","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=865090","who":"All Firefox users who have installed this add-on.","why":"This extension is malware that hijacks Facebook accounts for malicious purposes.","name":"Myanmar Extension for Facebook (malware)","created":"2013-06-18T15:58:54Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"30ecd9b9-4023-d9ef-812d-f1a75bb189b0","last_modified":1480349195823},{"guid":"crossriderapp5060@crossrider.com","prefs":[],"schema":1480349193877,"blockID":"i228","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=810016","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently side-installed by other software, and it overrides user preferences and inserts advertisements in web content.","name":"Savings Sidekick","created":"2012-11-29T16:31:13Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a37f76ac-7b77-b5a3-bac8-addaacf34bae","last_modified":1480349195769},{"guid":"/^(saamazon@mybrowserbar\\.com)|(saebay@mybrowserbar\\.com)$/","prefs":[],"schema":1480349193877,"blockID":"i672","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1011337","who":"All Firefox users who have these add-ons installed. Users wishing to continue using these add-ons can enable them in the Add-ons Manager.","why":"These add-ons are being silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Spigot Shopping Assistant","created":"2014-07-22T15:13:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e072a461-ee5a-c83d-8d4e-5686eb585a15","last_modified":1480349195347},{"guid":"{b99c8534-7800-48fa-bd71-519a46cdc7e1}","prefs":[],"schema":1480349193877,"blockID":"i596","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1011325","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed, in violation with our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BrowseMark","created":"2014-06-12T13:19:59Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f411bb0f-7c82-9061-4a80-cabc8ff45beb","last_modified":1480349195319},{"guid":"/^({94d62e35-4b43-494c-bf52-ba5935df36ef}|firefox@advanceelite\\.com|{bb7b7a60-f574-47c2-8a0b-4c56f2da9802})$/","prefs":[],"schema":1480349193877,"blockID":"i856","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1130323","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"AdvanceElite (malware)","created":"2015-02-09T15:51:11Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e3d52650-d3e2-4cef-71f7-e6188f56fe4d","last_modified":1480349195286},{"guid":"{458fb825-2370-4973-bf66-9d7142141847}","prefs":["app.update.auto","app.update.enabled","app.update.interval","app.update.url"],"schema":1480349193877,"blockID":"i1024","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1209588","who":"All users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on hides itself in the Add-ons Manager, interrupts the Firefox update process, and reportedly causes other problems to users, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Web Shield","created":"2015-09-29T09:25:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"32c5baa7-d547-eaab-302d-b873c83bfe2d","last_modified":1480349195258},{"guid":"{f2456568-e603-43db-8838-ffa7c4a685c7}","prefs":[],"schema":1480349193877,"blockID":"i778","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Sup-SW","created":"2014-11-07T13:53:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"93568fa2-0cb7-4e1d-e893-d7261e81547c","last_modified":1480349195215},{"guid":"{77BEC163-D389-42c1-91A4-C758846296A5}","prefs":[],"schema":1480349193877,"blockID":"i566","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=964594","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-on Manager.","why":"This add-on is silently installed into Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"V-Bates","created":"2014-03-05T13:20:54Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"080edbac-25d6-e608-abdd-feb1ce7a9a77","last_modified":1480349195185},{"guid":"helper@vidscrab.com","prefs":[],"schema":1480349193877,"blockID":"i1077","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1231010","who":"All Firefox users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on injects remote scripts and injects unwanted content into web pages.","name":"YouTube Video Downloader (from AddonCrop)","created":"2016-01-14T14:32:53Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"36b2e1e0-5fda-bde3-db55-dfcbe24dfd04","last_modified":1480349195157},{"guid":"jid1-XLjasWL55iEE1Q@jetpack","prefs":[],"schema":1480349193877,"blockID":"i578","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1002037","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that presents itself as \"Flash Player\" but is really injecting unwanted content into Facebook pages.","name":"Flash Player (malware)","created":"2014-04-28T16:25:03Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1e75b2f0-02fc-77a4-ad2f-52a4caff1a71","last_modified":1480349195058},{"guid":"{a3a5c777-f583-4fef-9380-ab4add1bc2a8}","prefs":[],"schema":1480349193877,"blockID":"i142","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=792132","who":"Todos los usuarios de Firefox que instalaron la versi\u00f3n 4.2 del complemento Cuevana Stream.\r\n\r\nAll Firefox users who have installed version 4.2 of the Cuevana Stream add-on.","why":"<strong>Espa\u00f1ol</strong>\r\nUna versi\u00f3n maliciosa del complemento Cuevana Stream (4.2) fue colocada en el sitio Cuevana y distribuida a muchos usuarios del sitio. Esta versi\u00f3n recopila informaci\u00f3n de formularios web y los env\u00eda a una direcci\u00f3n remota con fines maliciosos. Se le recomienda a todos los usuarios que instalaron esta versi\u00f3n que cambien sus contrase\u00f1as inmediatamente, y que se actualicen a la nueva versi\u00f3n segura, que es la 4.3.\r\n\r\n<strong>English</strong>\r\nA malicious version of the Cuevana Stream add-on (4.2) was uploaded to the Cuevana website and distributed to many of its users. This version takes form data and sends it to a remote location with malicious intent. It is recommended that all users who installed this version to update their passwords immediately, and update to the new safe version, version 4.3.\r\n\r\n","name":"Cuevana Stream (malicious version)","created":"2012-09-18T13:37:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"4.2","minVersion":"4.2","targetApplication":[]}],"id":"91e551b9-7e94-60e2-f1bd-52f25844ab16","last_modified":1480349195007},{"guid":"{34712C68-7391-4c47-94F3-8F88D49AD632}","prefs":[],"schema":1480349193877,"blockID":"i922","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1173154","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-09T15:27:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"dd350efb-34ac-2bb5-5afd-eed722dbb916","last_modified":1480349194976},{"guid":"PDVDZDW52397720@XDDWJXW57740856.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i846","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128320","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and attempts to change user settings like the home page and default search, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Ge-Force","created":"2015-02-06T15:03:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c33e950c-c977-ed89-c86a-3be8c4be1967","last_modified":1480349194949},{"guid":"discoverypro@discoverypro.com","prefs":[],"schema":1480349193877,"blockID":"i582","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1004231","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enabled it in the Add-ons Manager.","why":"This add-on is silently installed by the CNET installer for MP3 Rocket and probably other software packages. This is in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Discovery Pro","created":"2014-04-30T16:10:03Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"34eab242-6fbc-a459-a89e-0dc1a0b8355d","last_modified":1480349194878},{"guid":"jid1-bKSXgRwy1UQeRA@jetpack","prefs":[],"schema":1480349193877,"blockID":"i680","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=979856","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into user's systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Trusted Shopper","created":"2014-08-01T16:34:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f701b790-b266-c69d-0fba-f2d189cb0f34","last_modified":1480349194851},{"guid":"bcVX5@nQm9l.org","prefs":[],"schema":1480349193877,"blockID":"i848","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128266","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"boomdeal","created":"2015-02-09T15:21:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f8d6d4e1-b9e6-07f5-2b49-192106a45d82","last_modified":1480349194799},{"guid":"aytac@abc.com","prefs":[],"schema":1480349193877,"blockID":"i504","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947341","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks users' Facebook accounts.","name":"Facebook Haber (malware)","created":"2013-12-06T12:07:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bfaf8298-dd69-165c-e1ed-ad55584abd18","last_modified":1480349194724},{"guid":"Adobe@flash.com","prefs":[],"schema":1480349193877,"blockID":"i136","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=790100","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware posing as a legitimate Adobe product.","name":"Adobe Flash (malware)","created":"2012-09-10T16:09:06Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"47ac744e-3176-5cb6-1d02-b460e0c7ada0","last_modified":1480349194647},{"guid":"{515b2424-5911-40bd-8a2c-bdb20286d8f5}","prefs":[],"schema":1480349193877,"blockID":"i491","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=940753","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted.","name":"Connect DLC","created":"2013-11-29T14:52:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6d658443-b34a-67ad-934e-cbf7cd407460","last_modified":1480349194580},{"guid":"/^({3f3cddf8-f74d-430c-bd19-d2c9147aed3d}|{515b2424-5911-40bd-8a2c-bdb20286d8f5}|{17464f93-137e-4646-a0c6-0dc13faf0113}|{d1b5aad5-d1ae-4b20-88b1-feeaeb4c1ebc}|{aad50c91-b136-49d9-8b30-0e8d3ead63d0})$/","prefs":[],"schema":1480349193877,"blockID":"i516","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947478","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and being distributed under multiple add-on IDs.","name":"Connect DLC","created":"2013-12-20T12:38:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"96f8e157-8b8b-8e2e-76cd-6850599b4370","last_modified":1480349194521},{"guid":"wxtui502n2xce9j@no14","prefs":[],"schema":1480349193877,"blockID":"i1012","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1206157","who":"All users who have this add-on installed.","why":"This is a malicious add-on that takes over Facebook accounts.","name":"Video fix (malware)","created":"2015-09-21T13:04:09Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"246798ac-25fa-f4a4-258c-a71f9f6ae091","last_modified":1480349194463},{"guid":"flashX@adobe.com","prefs":[],"schema":1480349193877,"blockID":"i168","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=807052","who":"All Firefox users who have this add-on installed.","why":"This is an exploit proof-of-concept created for a conference presentation, which will probably be copied and modified for malicious purposes. \r\n","name":"Zombie Browser Pack","created":"2012-10-30T12:07:41Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d7c69812-801c-8d8e-12cb-c5171bdc48a1","last_modified":1480349194428},{"guid":"{4889ddce-7a83-45e6-afc9-1e4f1149fff4}","prefs":[],"schema":1480343836083,"blockID":"i840","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128327","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Cyti Web (malware)","created":"2015-02-06T14:30:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"be600f35-0633-29f3-c571-819e19d85db9","last_modified":1480349193867},{"guid":"{55dce8ba-9dec-4013-937e-adbf9317d990","prefs":[],"schema":1480343836083,"blockID":"i690","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1048647","who":"All Firefox users. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is being silently installed in users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Deal Keeper","created":"2014-08-12T16:23:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"512b0d40-a10a-5ddc-963b-b9c487eb1422","last_modified":1480349193833},{"guid":"/^new@kuot\\.pro|{13ec6687-0b15-4f01-a5a0-7a891c18e4ee}|rebeccahoppkins(ty(tr)?)?@gmail\\.com|{501815af-725e-45be-b0f2-8f36f5617afc}|{9bdb5f1f-b1e1-4a75-be31-bdcaace20a99}|{e9d93e1d-792f-4f95-b738-7adb0e853b7b}|dojadewaskurwa@gmail\\.com$/","prefs":[],"schema":1480343836083,"blockID":"i1414","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1312748","who":"All users who have this add-on installed.","why":"This add-on claims to be a flash plugin and it does some work on youtube, but it also steals your facebook and adfly credentials and sends them to a remote server.","name":"Aktualizacja dodatku Flash (malware)","created":"2016-10-28T18:06:03Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5cebc983-bc88-d5f8-6807-bd1cbfcd82fd","last_modified":1480349193798},{"guid":"{58d2a791-6199-482f-a9aa-9b725ec61362}","prefs":[],"schema":1480343836083,"blockID":"i746","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963787","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Start Page","created":"2014-10-17T16:01:53Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8ebbc7d0-635c-b74a-de9f-16eb5837b36a","last_modified":1480349193730},{"guid":"{94cd2cc3-083f-49ba-a218-4cda4b4829fd}","prefs":[],"schema":1480343836083,"blockID":"i590","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1013678","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' profiles, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Value Apps","created":"2014-06-03T16:12:50Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"556b8d4d-d6c2-199d-9f33-8eccca07e8e7","last_modified":1480349193649},{"guid":"contentarget@maildrop.cc","prefs":[],"schema":1480343836083,"blockID":"i818","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1119971","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks Facebook accounts.","name":"Astro Play (malware)","created":"2015-01-12T09:29:19Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"440e9923-027a-6089-e036-2f78937dc193","last_modified":1480349193622},{"guid":"noOpus@outlook.com","prefs":[],"schema":1480343836083,"blockID":"i816","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1119659","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems without their consent and performs unwanted operations.","name":"Full Screen (malware)","created":"2015-01-09T12:52:32Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b64d7cef-8b6c-2575-16bc-732fca7db377","last_modified":1480349193537},{"guid":"{c95a4e8e-816d-4655-8c79-d736da1adb6d}","prefs":[],"schema":1480343836083,"blockID":"i433","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844945","who":"All Firefox users who have this add-on installed.","why":"This add-on bypasses the external install opt in screen in Firefox, violating the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Hotspot Shield","created":"2013-08-09T11:25:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b3168278-a8ae-4882-7f26-355bc362bed0","last_modified":1480349193510},{"guid":"{9802047e-5a84-4da3-b103-c55995d147d1}","prefs":[],"schema":1480343836083,"blockID":"i722","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Web Finder Pro","created":"2014-10-07T12:58:14Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"50097c29-26b1-bf45-ffe1-83da217eb127","last_modified":1480349193482},{"guid":"/^({bf9194c2-b86d-4ebc-9b53-1c08b6ff779e}|{61a83e16-7198-49c6-8874-3e4e8faeb4f3}|{f0af464e-5167-45cf-9cf0-66b396d1918c}|{5d9968c3-101c-4944-ba71-72d77393322d}|{01e86e69-a2f8-48a0-b068-83869bdba3d0})$/","prefs":[],"schema":1480343836083,"blockID":"i515","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947473","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by using multiple add-on IDs and making unwanted settings changes.","name":"VisualBee Toolbar","created":"2013-12-20T12:26:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"029fa6f9-2351-40b7-5443-9a66e057f199","last_modified":1480349193449},{"guid":"/^({d50bfa5f-291d-48a8-909c-5f1a77b31948}|{d54bc985-6e7b-46cd-ad72-a4a266ad879e}|{d89e5de3-5543-4363-b320-a98cf150f86a}|{f3465017-6f51-4980-84a5-7bee2f961eba}|{fae25f38-ff55-46ea-888f-03b49aaf8812})$/","prefs":[],"schema":1480343836083,"blockID":"i1137","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1251940","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hides itself from view and disables various security features in Firefox.","name":"Watcher (malware)","created":"2016-03-04T17:56:42Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"252e18d0-85bc-7bb3-6197-5f126424c9b3","last_modified":1480349193419},{"guid":"ffxtlbr@claro.com","prefs":[],"schema":1480343836083,"blockID":"i218","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=816762","who":"All Firefox users who have installed this add-on.","why":"The Claro Toolbar is side-installed with other software, unexpectedly changing users' settings and then making it impossible for these settings to be reverted by users.","name":"Claro Toolbar","created":"2012-11-29T16:07:00Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e017a3b2-9b37-b8a0-21b0-bc412ae8a7f4","last_modified":1480349193385},{"guid":"/^(j003-lqgrmgpcekslhg|SupraSavings|j003-dkqonnnthqjnkq|j003-kaggrpmirxjpzh)@jetpack$/","prefs":[],"schema":1480343836083,"blockID":"i692","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1048656","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is being silently installed in users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SupraSavings","created":"2014-08-12T16:27:06Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b0d30256-4581-1489-c241-d2e85b6c38f4","last_modified":1480349193295},{"guid":"helperbar@helperbar.com","prefs":[],"schema":1480343836083,"blockID":"i258","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=817786","who":"All Firefox users who have this add-on installed. This only applies to version 1.0 of Snap.do. Version 1.1 fixed all the issues for which this block was created.","why":"This extension violates a number of our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, particularly on installation and settings handling. It also causes some stability problems in Firefox due to the way the toolbar is handled.\r\n\r\nUsers who wish to keep the add-on enabled can enable it again in the Add-ons Manager.","name":"Snap.do","created":"2013-01-28T13:52:26Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0","minVersion":"0","targetApplication":[]}],"id":"f1ede5b8-7757-5ec5-d8ed-1a01889154aa","last_modified":1480349193254},{"guid":"/^((support2_en@adobe14\\.com)|(XN4Xgjw7n4@yUWgc\\.com)|(C7yFVpIP@WeolS3acxgS\\.com)|(Kbeu4h0z@yNb7QAz7jrYKiiTQ3\\.com)|(aWQzX@a6z4gWdPu8FF\\.com)|(CBSoqAJLYpCbjTP90@JoV0VMywCjsm75Y0toAd\\.com)|(zZ2jWZ1H22Jb5NdELHS@o0jQVWZkY1gx1\\.com))$/","prefs":[],"schema":1480343836083,"blockID":"i326","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=841791","who":"All users who have this add-on installed.","why":"This extension is malware, installed pretending to be the Flash Player plugin.","name":"Flash Player (malware)","created":"2013-03-22T14:49:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3142020b-8af9-1bac-60c5-ce5ad0ff3d42","last_modified":1480349193166},{"guid":"newmoz@facebook.com","prefs":[],"schema":1480343836083,"blockID":"i576","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=997986","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook user accounts and sends spam on the user's behalf.","name":"Facebook Service Pack (malware)","created":"2014-04-22T14:34:42Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d85798d3-9b87-5dd9-ace2-64914b93df77","last_modified":1480349193114},{"guid":"{0F827075-B026-42F3-885D-98981EE7B1AE}","prefs":[],"schema":1480343836083,"blockID":"i334","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=862272","who":"All Firefox users who have this extension installed.","why":"This extension is malicious and is installed under false pretenses, causing problems for many Firefox users. Note that this is not the same <a href=\"https://addons.mozilla.org/firefox/addon/browserprotect/\">BrowserProtect extension</a> that is listed on our add-ons site. That one is safe to use.","name":"Browser Protect / bProtector (malware)","created":"2013-04-16T13:25:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"aad4545f-8f9d-dd53-2aa8-e8945cad6185","last_modified":1480349192987}]} \ No newline at end of file diff --git a/services/settings/dumps/main/search-config.json b/services/settings/dumps/main/search-config.json index 46aaebd6ff28efb0b65b75330d308987e922225f..7fe875537c5a8b86b1b677aa02f205dbba969da7 100644 --- a/services/settings/dumps/main/search-config.json +++ b/services/settings/dumps/main/search-config.json @@ -1 +1 @@ -{"data":[{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-d"},{"name":"q","value":"{searchTerms}"}]},"schema":1582832503175,"appliesTo":[{"default":"yes","included":{"everywhere":true}},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-e"},{"name":"q","value":"{searchTerms}"}]},"included":{"everywhere":true},"application":{"channel":["esr"]},"telemetryId":"google-b-e"},{"default":"no","included":{"locales":{"matches":["ru","tr","be","kk"],"startsWith":["en"]},"regions":["ru","tr","by","kz"],"telemetryId":"google"}},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-e"},{"name":"q","value":"{searchTerms}"}]},"default":"no","included":{"locales":{"matches":["ru","tr","be","kk"],"startsWith":["en"]},"regions":["ru","tr","by","kz"],"telemetryId":"google"},"application":{"channel":["esr"]}},{"default":"no","included":{"locales":{"matches":["zh-CN"]},"regions":["cn"]}},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-e"},{"name":"q","value":"{searchTerms}"}]},"default":"no","included":{"locales":{"matches":["zh-CN"]},"regions":["cn"]},"application":{"channel":["esr"]}},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-1-d"},{"name":"q","value":"{searchTerms}"}]},"included":{"regions":["us"]},"extraParams":[{"name":"channel","pref":"google_channel_us","condition":"pref"}],"telemetryId":"google-b-1-d"},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-1-e"},{"name":"q","value":"{searchTerms}"}]},"included":{"regions":["us"]},"application":{"channel":["esr"]},"extraParams":[{"name":"channel","pref":"google_channel_us","condition":"pref"}],"telemetryId":"google-b-1-e"}],"orderHint":1000,"extraParams":[{"name":"channel","pref":"google_channel_row","condition":"pref"}],"telemetryId":"google-b-d","webExtension":{"id":"google@search.mozilla.org"},"id":"cb8e7210-9f0b-48fa-8708-b9a03df79eea","last_modified":1583937832394},{"params":{"searchUrlGetParams":[{"name":"pc","value":"MOZI"},{"name":"q","value":"{searchTerms}"}]},"schema":1582890763841,"appliesTo":[{"included":{"locales":{"matches":["ach","af","an","ar","ast","az","ca","ca-valencia","cak","da","de","dsb","el","eo","es-CL","es-ES","es-MX","eu","fa","ff","fi","fr","fy-NL","gn","gu-IN","hi-IN","hr","hsb","ia","is","it","ja-JP-macos","ja","ka","kab","km","kn","lij","lo","lt","mk","ms","my","nb-NO","ne-NP","nl","nn-NO","oc","pa-IN","pt-BR","rm","ro","son","sq","sr","sv-SE","th","tl","trs","uk","ur","uz","wo","xh","zh-CN"],"startsWith":["bn","en"]}}}],"extraParams":[{"name":"form","value":"MOZCON","purpose":"contextmenu","condition":"purpose"},{"name":"form","value":"MOZSBR","purpose":"searchbar","condition":"purpose"},{"name":"form","value":"MOZSPG","purpose":"homepage","condition":"purpose"},{"name":"form","value":"MOZLBR","purpose":"keyword","condition":"purpose"},{"name":"form","value":"MOZTSB","purpose":"newtab","condition":"purpose"}],"webExtension":{"id":"bing@search.mozilla.org"},"id":"7ec766f6-639a-4618-91bc-33eb3d4378c6","last_modified":1583937832392},{"params":{"searchUrlGetParams":[{"name":"tn","value":"monline_7_dg"},{"name":"ie","value":"utf-8"},{"name":"wd","value":"{searchTerms}"}],"suggestUrlGetParams":[{"name":"tn","value":"monline_7_dg"},{"name":"ie","value":"utf-8"},{"name":"action","value":"opensearch"},{"name":"wd","value":"{searchTerms}"}]},"schema":1582890764713,"appliesTo":[{"included":{"locales":{"matches":["zh-CN"]}}},{"default":"yes","included":{"locales":{"matches":["zh-CN"]},"regions":["cn"]}}],"telemetryId":"baidu","webExtension":{"id":"baidu@search.mozilla.org"},"id":"52dd490a-89e8-45f2-96b0-f2c72e157526","last_modified":1583937832389},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"mozilla-20"},{"name":"sourceid","value":"Mozilla-search"}]},"schema":1582890765580,"appliesTo":[{"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]}}},{"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]},"regions":["au"]},"telemetryId":"amazon-au","webExtension":{"id":"amazon@search.mozilla.org","locales":["au"]}},{"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]},"regions":["ca"]},"telemetryId":"amazon-ca","webExtension":{"id":"amazon@search.mozilla.org","locales":["ca"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-fr-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]},"regions":["fr"]},"telemetryId":"amazon-france","webExtension":{"id":"amazon@search.mozilla.org","locales":["france"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-uk-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]},"regions":["gb"]},"telemetryId":"amazon-en-GB","webExtension":{"id":"amazon@search.mozilla.org","locales":["en-GB"]}}],"orderHint":500,"telemetryId":"amazondotcom","webExtension":{"id":"amazondotcom@search.mozilla.org"},"id":"071c671c-7c1b-469d-a771-ab16ff6e8beb","last_modified":1583937832387},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"}]},"schema":1582890766440,"appliesTo":[{"included":{"locales":{"matches":["bn","bn-IN","kn","gu-IN","mr","pa-IN","ta","te","ur"]}},"telemetryId":"amazon-in","webExtension":{"locales":["in"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-fr-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["br","ff","fr","son","wo"]}},"telemetryId":"amazon-france","webExtension":{"locales":["france"]}},{"included":{"locales":{"matches":["br","ff","fr","son","wo"]},"regions":["ca"]},"telemetryId":"amazon-ca","webExtension":{"locales":["ca"]}},{"included":{"locales":{"matches":["en-CA"]}},"telemetryId":"amazon-ca","webExtension":{"locales":["ca"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"mozillajapan-fx-22"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["ja-JP-macos","ja"]}},"telemetryId":"amazon-jp","webExtension":{"locales":["jp"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefoxit-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["it","lij"]}},"telemetryId":"amazon-it","webExtension":{"locales":["it"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-de-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["de","dsb","hsb"]}},"telemetryId":"amazon-de","webExtension":{"locales":["de"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-uk-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["cy","da","el","en-GB","eu","ga-IE","gd","gl","hr","nb-NO","nn-NO","pt-PT","sq","sr"]}},"telemetryId":"amazon-en-GB","webExtension":{"locales":["en-GB"]}},{"included":{"locales":{"matches":["cy","da","el","en-GB","eu","ga-IE","gd","gl","hr","nb-NO","nn-NO","pt-PT","sq","sr"]},"regions":["au"]},"telemetryId":"amazon-au","webExtension":{"locales":["au"]}}],"orderHint":500,"webExtension":{"id":"amazon@search.mozilla.org"},"id":"a620b506-c3ae-4332-97bb-190a73868580","last_modified":1583937832384},{"params":{"searchUrlGetParams":[{"name":"keywords","value":"{searchTerms}"},{"name":"ix","value":"sunray"},{"name":"pageletid","value":"headsearch"},{"name":"searchType","value":""},{"name":"Go.x","value":"0"},{"name":"Go.y","value":"0"},{"name":"bestSaleNum","value":"0"}]},"schema":1582890767305,"appliesTo":[{"included":{"locales":{"matches":["zh-CN"]}}}],"orderHint":500,"telemetryId":"amazondotcn","webExtension":{"id":"amazondotcn@search.mozilla.org"},"id":"ccb137f1-7733-464c-bb70-037be4ba2529","last_modified":1583937832381},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.com/sch/{searchTerms}"}]},"schema":1582890768154,"appliesTo":[{"included":{"locales":{"matches":["en-US"]},"regions":["us"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.es/sch/{searchTerms}"}]},"included":{"locales":{"matches":["an","ast","ca","ca-valencia","es-ES","eu","gl"]}},"telemetryId":"ebay-es","webExtension":{"locales":["es"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.fr/sch/{searchTerms}"}]},"included":{"locales":{"matches":["br","fr","wo"]}},"telemetryId":"ebay-fr","webExtension":{"locales":["fr"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.befr.ebay.be/sch/{searchTerms}"}]},"included":{"locales":{"matches":["br","en-US","fr","wo"]},"regions":["be"]},"telemetryId":"ebay-be","webExtension":{"locales":["be"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ca/sch/{searchTerms}"}]},"included":{"locales":{"matches":["br","en-US","fr","wo"]},"regions":["ca"]},"telemetryId":"ebay-ca","webExtension":{"locales":["ca"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ch/sch/{searchTerms}"}]},"included":{"locales":{"matches":["br","en-US","fr","wo"]},"regions":["ch"]},"telemetryId":"ebay-ch","webExtension":{"locales":["ch"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.co.uk/sch/{searchTerms}"}]},"included":{"locales":{"matches":["cy","en-GB","gd"]}},"telemetryId":"ebay-uk","webExtension":{"locales":["uk"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.co.uk/sch/{searchTerms}"}]},"included":{"locales":{"matches":["en-US"]},"regions":["gb"]},"telemetryId":"ebay-uk","webExtension":{"locales":["uk"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.com.au/sch/{searchTerms}"}]},"included":{"locales":{"matches":["cy","en-GB","en-US","gd"]},"regions":["au"]},"telemetryId":"ebay-au","webExtension":{"locales":["au"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ie/sch/{searchTerms}"}]},"included":{"locales":{"matches":["cy","en-GB","en-US","gd"]},"regions":["ie"]},"telemetryId":"ebay-ie","webExtension":{"locales":["ie"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.de/sch/{searchTerms}"}]},"included":{"locales":{"matches":["de","dsb","hsb"]}},"telemetryId":"ebay-de","webExtension":{"locales":["de"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.at/sch/{searchTerms}"}]},"included":{"locales":{"matches":["de","dsb","hsb"]},"regions":["at"]},"telemetryId":"ebay-at","webExtension":{"locales":["at"]}},{"included":{"locales":{"matches":["de","dsb","hsb"]},"regions":["ch"]},"telemetryId":"ebay-ch","webExtension":{"locales":["ch"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ca/sch/{searchTerms}"}]},"included":{"locales":{"matches":["en-CA"]}},"telemetryId":"ebay-ca","webExtension":{"locales":["ca"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.nl/sch/{searchTerms}"}]},"included":{"locales":{"matches":["fy-NL","nl"]}},"telemetryId":"ebay-nl","webExtension":{"locales":["nl"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.nl/sch/{searchTerms}"}]},"included":{"locales":{"matches":["en-US"]},"regions":["nl"]},"telemetryId":"ebay-nl","webExtension":{"locales":["nl"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.befr.ebay.be/sch/{searchTerms}"}]},"included":{"locales":{"matches":["fy-NL","nl"]},"regions":["be"]},"telemetryId":"ebay-be","webExtension":{"locales":["be"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ie/sch/{searchTerms}"}]},"included":{"locales":{"matches":["ga-IE"]}},"telemetryId":"ebay-ie","webExtension":{"locales":["ie"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.it/sch/{searchTerms}"}]},"included":{"locales":{"matches":["it","lij"]}},"telemetryId":"ebay-it","webExtension":{"locales":["it"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ch/sch/{searchTerms}"}]},"included":{"locales":{"matches":["rm"]}},"telemetryId":"ebay-ch","webExtension":{"locales":["ch"]}}],"orderHint":500,"webExtension":{"id":"ebay@search.mozilla.org"},"id":"cbe309e0-f638-4996-9dfc-ea5c19ef16e9","last_modified":1583937832378},{"schema":1582890769208,"appliesTo":[{"included":{"everywhere":true}}],"orderHint":500,"extraParams":[{"name":"t","value":"ffcm","purpose":"contextmenu","condition":"purpose"},{"name":"t","value":"ffab","purpose":"keyword","condition":"purpose"},{"name":"t","value":"ffsb","purpose":"searchbar","condition":"purpose"},{"name":"t","value":"ffhp","purpose":"homepage","condition":"purpose"},{"name":"t","value":"ffnt","purpose":"newtab","condition":"purpose"}],"telemetryId":"ddg","webExtension":{"id":"ddg@search.mozilla.org"},"id":"c0b26c0e-63e6-4235-b2ce-5f16b6a8bf87","last_modified":1583937832375},{"schema":1582890770084,"appliesTo":[{"default":"yes","included":{"locales":{"matches":["ru","tr","be","kk"],"startsWith":["en"]},"regions":["ru","tr","by","kz"]},"telemetryId":"yandex-en","webExtension":{"locales":["en"]}},{"included":{"locales":{"matches":["az"]}},"telemetryId":"yandex-az","webExtension":{"locales":["az"]}},{"included":{"locales":{"matches":["be"]}},"telemetryId":"yandex-by","webExtension":{"locales":["by"]}},{"included":{"locales":{"matches":["kk"]}},"telemetryId":"yandex-kk","webExtension":{"locales":["kk"]}},{"included":{"locales":{"matches":["ru"]}},"telemetryId":"yandex-ru","webExtension":{"locales":["ru"]}},{"included":{"locales":{"matches":["tr"]}},"telemetryId":"yandex-tr","webExtension":{"locales":["tr"]}}],"extraParams":[{"name":"clid","value":"2186618","purpose":"searchbar","condition":"purpose"},{"name":"clid","value":"2186621","purpose":"keyword","condition":"purpose"},{"name":"clid","value":"2186623","purpose":"contextmenu","condition":"purpose"},{"name":"clid","value":"2186617","purpose":"homepage","condition":"purpose"},{"name":"clid","value":"2186620","purpose":"newtab","condition":"purpose"}],"webExtension":{"id":"yandex@search.mozilla.org"},"id":"a0e7f96a-14e0-4d56-9f54-e0c7e49fd306","last_modified":1583937832372},{"schema":1582890770937,"appliesTo":[{"included":{"locales":{"matches":["sv-SE"]}}}],"webExtension":{"id":"allaannonser-sv-SE@search.mozilla.org"},"id":"69a82554-c9b4-4c84-98c7-80f86fa7174a","last_modified":1583937832369},{"schema":1582890771781,"appliesTo":[{"included":{"locales":{"matches":["pl"]}}}],"webExtension":{"id":"allegro-pl@search.mozilla.org"},"id":"d915b6bc-bbae-47a6-8323-1b2990ad0e57","last_modified":1583937832367},{"schema":1582890772625,"appliesTo":[{"included":{"locales":{"matches":["sk"]}}}],"webExtension":{"id":"atlas-sk@search.mozilla.org"},"id":"6cebcf52-2cfa-4da2-ae4d-2c845ebdbc0b","last_modified":1583937832365},{"schema":1582890773480,"appliesTo":[{"included":{"locales":{"matches":["az"]}}}],"webExtension":{"id":"azerdict@search.mozilla.org"},"id":"c1a6845f-015e-4e67-bc64-6e39a843643f","last_modified":1583937832363},{"schema":1582890774347,"appliesTo":[{"included":{"locales":{"matches":["sk"]}}}],"webExtension":{"id":"azet-sk@search.mozilla.org"},"id":"3c632ae9-f758-43b5-9d06-b9c1b6bc7105","last_modified":1583937832361},{"schema":1582890775198,"appliesTo":[{"included":{"locales":{"matches":["gd"]}}}],"webExtension":{"id":"bbc-alba@search.mozilla.org"},"id":"4ab14cdb-35ea-42dc-8500-110eb3088b89","last_modified":1583937832358},{"schema":1582890776067,"appliesTo":[{"included":{"locales":{"matches":["nb-NO","nn-NO"]}}}],"webExtension":{"id":"bok-NO@search.mozilla.org"},"id":"64ce88a6-fd55-48d1-85a9-724c753f5721","last_modified":1583937832356},{"schema":1582890776913,"appliesTo":[{"included":{"locales":{"matches":["fy-NL"]}},"webExtension":{"locales":["fy-NL"]}},{"included":{"locales":{"matches":["nl"]}},"webExtension":{"locales":["nl"]}}],"webExtension":{"id":"bolcom@search.mozilla.org"},"id":"3d0ab163-0808-4be0-b479-0900dcdc8e35","last_modified":1583937832354},{"schema":1582890777775,"appliesTo":[{"included":{"locales":{"matches":["sl"]}}}],"webExtension":{"id":"ceneji@search.mozilla.org"},"id":"d908d622-0387-4d36-8098-1a9e32c0c697","last_modified":1583937832352},{"schema":1582890778608,"appliesTo":[{"included":{"locales":{"matches":["en-GB"]}}}],"webExtension":{"id":"chambers-en-GB@search.mozilla.org"},"id":"270000f0-8527-4f98-aa17-879820209f68","last_modified":1583937832350},{"schema":1582890779439,"appliesTo":[{"included":{"locales":{"matches":["vi"]}}}],"webExtension":{"id":"coccoc@search.mozilla.org"},"id":"4e447f5a-9eb1-436e-8de1-9e4b4b709efb","last_modified":1583937832348},{"schema":1582890780276,"appliesTo":[{"included":{"locales":{"matches":["ko"]}}}],"webExtension":{"id":"daum-kr@search.mozilla.org"},"id":"0cdc44be-173a-4ca8-96e3-43e3000da75d","last_modified":1583937832346},{"schema":1582890781123,"appliesTo":[{"included":{"locales":{"matches":["ca","ca-valencia"]}}}],"webExtension":{"id":"diec2@search.mozilla.org"},"id":"055103b9-1f4a-43d0-9b99-5b8d7209b022","last_modified":1583937832343},{"schema":1582890781968,"appliesTo":[{"included":{"locales":{"matches":["es-AR","es-CL","es-ES"]}}}],"webExtension":{"id":"drae@search.mozilla.org"},"id":"3d27c51f-83d4-43be-af84-4d7a51c5a8e4","last_modified":1583937832341},{"schema":1582890782823,"appliesTo":[{"included":{"locales":{"matches":["de"]}}}],"webExtension":{"id":"ecosia@search.mozilla.org"},"id":"1fc1b257-3e6b-4cfb-a323-64c1429bcf51","last_modified":1583937832339},{"schema":1582890783661,"appliesTo":[{"included":{"locales":{"matches":["et"]}}}],"webExtension":{"id":"eki-ee@search.mozilla.org"},"id":"63b74323-1d14-4989-921f-7cc32bfee072","last_modified":1583937832336},{"schema":1582890784534,"appliesTo":[{"included":{"locales":{"matches":["hr"]}}}],"webExtension":{"id":"eudict@search.mozilla.org"},"id":"5cd4781c-2906-4fe7-9d4b-ea9ddbdc2c3b","last_modified":1583937832334},{"schema":1582890785390,"appliesTo":[{"included":{"locales":{"matches":["gd"]}}}],"webExtension":{"id":"faclair-beag@search.mozilla.org"},"id":"6491a2b8-c487-4798-a817-a0fd08b40ee2","last_modified":1583937832332},{"schema":1582890786256,"appliesTo":[{"included":{"locales":{"matches":["kk"]}}}],"webExtension":{"id":"flip@search.mozilla.org"},"id":"d045762c-52ac-4c16-8ca3-072aecea83da","last_modified":1583937832330},{"schema":1582890787108,"appliesTo":[{"included":{"locales":{"matches":["br"]}}}],"webExtension":{"id":"freelang@search.mozilla.org"},"id":"ed6a0f8c-e496-4d9c-936c-b906892e3d23","last_modified":1583937832327},{"schema":1582890787961,"appliesTo":[{"included":{"locales":{"matches":["nn-NO","nb-NO"]}}}],"webExtension":{"id":"gulesider-NO@search.mozilla.org"},"id":"f458e78b-9128-4027-b344-538f5661c148","last_modified":1583937832325},{"schema":1582890788795,"appliesTo":[{"included":{"locales":{"matches":["cs"]}}}],"webExtension":{"id":"heureka-cz@search.mozilla.org"},"id":"b9a718b5-fc78-40b8-b1c3-2e15d2009f5c","last_modified":1583937832323},{"schema":1582890789635,"appliesTo":[{"included":{"locales":{"matches":["uk"]}}}],"webExtension":{"id":"hotline-ua@search.mozilla.org"},"id":"da2ec2d3-6c5c-4191-b428-351fbea8aeba","last_modified":1583937832321},{"schema":1582890790469,"appliesTo":[{"included":{"locales":{"matches":["kn"]}}}],"webExtension":{"id":"kannadastore@search.mozilla.org"},"id":"ae1cfae5-0516-41c0-99af-fd3d92a77aa8","last_modified":1583937832318},{"schema":1582890791315,"appliesTo":[{"included":{"locales":{"matches":["de","dsb","hsb","rm"]}}}],"webExtension":{"id":"leo_ende_de@search.mozilla.org"},"id":"03d60939-2c92-45b0-874f-11c8e6d0c2b9","last_modified":1583937832316},{"schema":1582890792162,"appliesTo":[{"included":{"locales":{"matches":["hy-AM"]}}}],"webExtension":{"id":"list-am@search.mozilla.org"},"id":"206db966-db1f-492d-9ab0-71b3e12b434e","last_modified":1583937832313},{"schema":1582890793008,"appliesTo":[{"included":{"locales":{"matches":["th"]}}}],"webExtension":{"id":"longdo@search.mozilla.org"},"id":"8b4f2887-0c24-49ce-b467-2ba8cc9a4945","last_modified":1583937832311},{"schema":1582890793853,"appliesTo":[{"included":{"locales":{"matches":["ru"]}}}],"webExtension":{"id":"mailru@search.mozilla.org"},"id":"e0ca4964-e324-44e7-80b6-16a831706d17","last_modified":1583937832309},{"schema":1582890794722,"appliesTo":[{"included":{"locales":{"matches":["cs"]}}}],"webExtension":{"id":"mapy-cz@search.mozilla.org"},"id":"9a404348-0998-42c4-9d87-45ef47672c95","last_modified":1583937832306},{"schema":1582890795553,"appliesTo":[{"included":{"locales":{"matches":["fy-NL"]}},"webExtension":{"locales":["fy-NL"]}},{"included":{"locales":{"matches":["nl"]}},"webExtension":{"locales":["nl"]}}],"webExtension":{"id":"marktplaats@search.mozilla.org"},"id":"7823cbee-e13e-4de6-8cf1-86e9234f06ae","last_modified":1583937832304},{"schema":1582890796393,"appliesTo":[{"included":{"locales":{"matches":["es-AR"]}},"webExtension":{"locales":["ar"]}},{"included":{"locales":{"matches":["es-CL"]}},"webExtension":{"locales":["cl"]}},{"included":{"locales":{"matches":["es-MX"]}},"webExtension":{"locales":["mx"]}}],"webExtension":{"id":"mercadolibre@search.mozilla.org"},"id":"df070348-e771-4bd5-964e-d19d82c1384e","last_modified":1583937832302},{"schema":1582890797236,"appliesTo":[{"included":{"locales":{"matches":["pt-BR"]}}}],"webExtension":{"id":"mercadolivre@search.mozilla.org"},"id":"53bf6974-0e60-4551-994f-2d5176a5d1c6","last_modified":1583937832300},{"schema":1582890798070,"appliesTo":[{"included":{"locales":{"matches":["he"]}}}],"webExtension":{"id":"morfix-dic@search.mozilla.org"},"id":"3d05b67d-ef69-4abf-82ab-c943a7e3eff3","last_modified":1583937832298},{"schema":1582890798901,"appliesTo":[{"included":{"locales":{"matches":["sl"]}}}],"webExtension":{"id":"najdi-si@search.mozilla.org"},"id":"dd8dcdda-7da8-46db-823b-d33fb1da63f8","last_modified":1583937832295},{"schema":1582890799757,"appliesTo":[{"included":{"locales":{"matches":["ko"]}}}],"webExtension":{"id":"naver-kr@search.mozilla.org"},"id":"4135dc8f-f0bf-475b-b39f-74c4256572af","last_modified":1583937832292},{"schema":1582890800610,"appliesTo":[{"included":{"locales":{"matches":["et"]}}}],"webExtension":{"id":"neti-ee@search.mozilla.org"},"id":"2260d56e-d47c-435e-9cb8-9c7c67e8df7c","last_modified":1583937832289},{"schema":1582890801444,"appliesTo":[{"included":{"locales":{"matches":["sl"]}}}],"webExtension":{"id":"odpiralni@search.mozilla.org"},"id":"fa42b23a-30c5-46f3-8997-4a84029b5349","last_modified":1583937832287},{"schema":1582890802297,"appliesTo":[{"included":{"locales":{"matches":["bs"]}}}],"webExtension":{"id":"olx@search.mozilla.org"},"id":"af72d7ef-4255-4362-b328-703aea68ee7e","last_modified":1583937832283},{"schema":1582890803142,"appliesTo":[{"included":{"locales":{"matches":["ja-JP-macos","jp"]}}}],"webExtension":{"id":"oshiete-goo@search.mozilla.org"},"id":"daa695d9-3f38-494b-81f1-1f601bbe5163","last_modified":1583937832279},{"schema":1582890803993,"appliesTo":[{"included":{"locales":{"matches":["et"]}}}],"webExtension":{"id":"osta-ee@search.mozilla.org"},"id":"af16e0da-1bcf-4769-b9bb-e43a94bfac75","last_modified":1583937832276},{"schema":1582890804842,"appliesTo":[{"included":{"locales":{"matches":["ru"]}}}],"webExtension":{"id":"ozonru@search.mozilla.org"},"id":"f62fc00c-2e87-4e95-aa11-0db075cd5741","last_modified":1583937832272},{"schema":1582890805689,"appliesTo":[{"included":{"locales":{"matches":["cy"]}}}],"webExtension":{"id":"palasprint@search.mozilla.org"},"id":"656d9e4e-74d5-4eee-bee3-519b4d9bfd37","last_modified":1583937832269},{"schema":1582890806533,"appliesTo":[{"included":{"locales":{"matches":["bg"]}}}],"webExtension":{"id":"pazaruvaj@search.mozilla.org"},"id":"acc27094-9f0a-49af-868b-8b6ecbbda976","last_modified":1583937832267},{"schema":1582890807390,"appliesTo":[{"included":{"locales":{"matches":["sr"]}}}],"webExtension":{"id":"pogodak@search.mozilla.org"},"id":"3bb87247-c36b-4606-a0d6-92b14eaeba86","last_modified":1583937832264},{"schema":1582890808245,"appliesTo":[{"included":{"locales":{"matches":["pt-PT"]}}}],"webExtension":{"id":"priberam@search.mozilla.org"},"id":"a3f1a5b6-cd8d-41b3-bb2b-de6bb1943a3d","last_modified":1583937832261},{"schema":1582890809085,"appliesTo":[{"included":{"locales":{"matches":["ru"]}}}],"webExtension":{"id":"priceru@search.mozilla.org"},"id":"de771801-5bca-436c-be56-f882897c46f2","last_modified":1583937832259},{"schema":1582890809928,"appliesTo":[{"included":{"locales":{"matches":["sv-SE"]}}}],"webExtension":{"id":"prisjakt-sv-SE@search.mozilla.org"},"id":"8a7de784-efa5-428f-9193-a0d3368b80d4","last_modified":1583937832257},{"schema":1582890810778,"appliesTo":[{"included":{"locales":{"matches":["pl"]}}}],"webExtension":{"id":"pwn-pl@search.mozilla.org"},"id":"2ca17e29-ed08-4218-99f6-0615c8bc5c67","last_modified":1583937832254},{"schema":1582890811653,"appliesTo":[{"included":{"locales":{"matches":["fr"]}}}],"webExtension":{"id":"qwant@search.mozilla.org"},"id":"f59fddbc-580b-4672-9cda-32941ceec729","last_modified":1583937832252},{"schema":1582890812485,"appliesTo":[{"included":{"locales":{"matches":["nb-NO","nn-NO"]}}}],"webExtension":{"id":"qxl-NO@search.mozilla.org"},"id":"e54d56d1-defb-4e34-b85e-9814cb7797c2","last_modified":1583937832249},{"schema":1582890813333,"appliesTo":[{"included":{"locales":{"matches":["ja-JP-macos","jp"]}}}],"webExtension":{"id":"rakuten@search.mozilla.org"},"id":"8551c432-c68d-4934-836e-98513ae4b4a5","last_modified":1583937832247},{"schema":1582890814195,"appliesTo":[{"included":{"locales":{"matches":["zh-TW"]}}}],"webExtension":{"id":"readmoo@search.mozilla.org"},"id":"2d24515e-3e35-42ed-bf17-1388acfe80fa","last_modified":1583937832245},{"schema":1582890815048,"appliesTo":[{"included":{"locales":{"matches":["ltg","lv"]}}}],"webExtension":{"id":"salidzinilv@search.mozilla.org"},"id":"e7dcde21-5b5e-4406-b602-0611130fd3a6","last_modified":1583937832242},{"schema":1582890815902,"appliesTo":[{"included":{"locales":{"matches":["cs"]}}}],"webExtension":{"id":"seznam-cz@search.mozilla.org"},"id":"c50dcc87-0192-4461-bb88-17a55ba181c7","last_modified":1583937832240},{"schema":1582890816739,"appliesTo":[{"included":{"locales":{"matches":["ltg","lv"]}}}],"webExtension":{"id":"sslv@search.mozilla.org"},"id":"74f2f615-8d17-4133-82c1-18d03643c383","last_modified":1583937832237},{"schema":1582890817589,"appliesTo":[{"included":{"locales":{"matches":["ga-IE"]}}}],"webExtension":{"id":"tearma@search.mozilla.org"},"id":"518293ee-4bf0-4514-9b73-c6fb646a8a18","last_modified":1583937832235},{"schema":1582890818451,"appliesTo":[{"included":{"locales":{"matches":["default","en-US","ach","an","bs","ca","ca-valencia","en-CA","ga-IE","gn","hr","ia","ka","kk","km","lo","lt","ms","my","ne-NP","oc","pt-BR","sl","tl","tr","ur","uz","wo"]}}},{"included":{"locales":{"matches":["ja-JP-macos","ja"]}},"webExtension":{"locales":["ja"]}}],"webExtension":{"id":"twitter@search.mozilla.org"},"id":"bbf3e4a8-8ab2-4031-a146-a964d7b6a41b","last_modified":1583937832232},{"schema":1582890819290,"appliesTo":[{"included":{"locales":{"matches":["sv-SE"]}}}],"webExtension":{"id":"tyda-sv-SE@search.mozilla.org"},"id":"32eec495-ce07-4ce5-8d07-4cb32050459d","last_modified":1583937832229},{"schema":1582890820131,"appliesTo":[{"included":{"locales":{"matches":["hu"]}}}],"webExtension":{"id":"vatera@search.mozilla.org"},"id":"d0eab7e7-9084-4a43-b845-568dbe9f07dc","last_modified":1583937832225},{"schema":1582890820983,"appliesTo":[{"included":{"locales":{"matches":["te"]}},"webExtension":{"locales":["te"]}},{"included":{"locales":{"matches":["oc"]}},"webExtension":{"locales":["oc"]}}],"webExtension":{"id":"wiktionary@search.mozilla.org"},"id":"781f42f0-3a5c-4d14-8be2-665eefa65653","last_modified":1583937832222},{"schema":1582890821826,"appliesTo":[{"included":{"locales":{"matches":["pl"]}}}],"webExtension":{"id":"wolnelektury-pl@search.mozilla.org"},"id":"1960ccff-4aab-48cd-9bf5-0eb2adde76f9","last_modified":1583937832218},{"schema":1582890822671,"appliesTo":[{"included":{"locales":{"matches":["ja-JP-macos","ja"]}}}],"webExtension":{"id":"yahoo-jp@search.mozilla.org"},"id":"9e73a342-4e27-4e9f-8a29-be193d59236a","last_modified":1583937832213},{"schema":1582890823520,"appliesTo":[{"included":{"locales":{"matches":["ja-JP-macos","ja"]}}}],"webExtension":{"id":"yahoo-jp-auctions@search.mozilla.org"},"id":"43559b11-05dc-4750-b131-afdbd9d25905","last_modified":1583937832210},{"schema":1582890824418,"appliesTo":[{"included":{"locales":{"matches":["sk"]}}}],"webExtension":{"id":"zoznam-sk@search.mozilla.org"},"id":"e332f9dd-d1c5-4cc9-8534-3fd9938b970c","last_modified":1583937832207},{"schema":1582890825302,"appliesTo":[{"included":{"everywhere":true}},{"included":{"locales":{"matches":["af","an","ar","ast","az","bg","br","bs","cy","da","de","dsb","el","eo","et","eu","fa","fi","fy-NL","ga-IE","gd","gl","gn","he","hr","hsb","hu","ia","id","is","it","ka","kab","kk","km","kn","lij","lo","lt","ltg","lv","mk","mr","ms","my","nl","oc","pl","rm","ro","ru","si","sk","sl","sq","sr","sv-SE","ta","te","th","tl","tr","uk","ur","uz","vi","wo","zh-CN","zh-TW"]}},"webExtension":{"locales":["$USER_LOCALE"]}},{"included":{"locales":{"matches":["be"]}},"webExtension":{"locales":["be","be-tarask"]}},{"included":{"locales":{"matches":["bn","bn-BD","bn-IN"]}},"webExtension":{"locales":["bn"]}},{"included":{"locales":{"matches":["ca","ca-valencia"]}},"webExtension":{"locales":["ca"]}},{"included":{"locales":{"matches":["cak","es-AR","es-CL","es-ES","es-MX","trs"]}},"webExtension":{"locales":["es"]}},{"included":{"locales":{"matches":["cs"]}},"webExtension":{"locales":["cz"]}},{"included":{"locales":{"matches":["ff","fr","son"]}},"webExtension":{"locales":["fr"]}},{"included":{"locales":{"matches":["gu-IN"]}},"webExtension":{"locales":["gu"]}},{"included":{"locales":{"matches":["hi-IN"]}},"webExtension":{"locales":["hi"]}},{"included":{"locales":{"matches":["hy-AM"]}},"webExtension":{"locales":["hy"]}},{"included":{"locales":{"matches":["ja-JP-macos","ja"]}},"webExtension":{"locales":["ja"]}},{"included":{"locales":{"matches":["ko"]}},"webExtension":{"locales":["kr"]}},{"included":{"locales":{"matches":["nb-NO"]}},"webExtension":{"locales":["NO"]}},{"included":{"locales":{"matches":["ne-NP"]}},"webExtension":{"locales":["ne"]}},{"included":{"locales":{"matches":["nn-NO"]}},"webExtension":{"locales":["NN"]}},{"included":{"locales":{"matches":["pa-IN"]}},"webExtension":{"locales":["pa"]}},{"included":{"locales":{"matches":["pt-BR","pt-PT"]}},"webExtension":{"locales":["pt"]}}],"webExtension":{"id":"wikipedia@search.mozilla.org"},"id":"3f3beb1d-e32e-40a4-b6ed-56741803e1d8","last_modified":1583937832203}]} \ No newline at end of file +{"data":[{"schema":1586901316337,"appliesTo":[{"included":{"locales":{"matches":["default","en-US","ach","an","bs","ca","ca-valencia","en-CA","en-GB","es-ES","ga-IE","gn","hr","ia","ka","kk","km","lo","lt","ms","my","ne-NP","oc","pt-BR","sl","tl","tr","ur","uz","wo"]}}},{"included":{"locales":{"matches":["ja-JP-macos","ja"]}},"webExtension":{"locales":["ja"]}}],"webExtension":{"id":"twitter@search.mozilla.org"},"id":"bbf3e4a8-8ab2-4031-a146-a964d7b6a41b","last_modified":1587043474561},{"schema":1586273556552,"appliesTo":[{"included":{"locales":{"matches":["ja-JP-macos","ja"]}}}],"webExtension":{"id":"rakuten@search.mozilla.org"},"id":"8551c432-c68d-4934-836e-98513ae4b4a5","last_modified":1586375636481},{"schema":1586273291150,"appliesTo":[{"included":{"locales":{"matches":["ja-JP-macos","ja"]}}}],"webExtension":{"id":"oshiete-goo@search.mozilla.org"},"id":"daa695d9-3f38-494b-81f1-1f601bbe5163","last_modified":1586375636478},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-d"},{"name":"q","value":"{searchTerms}"}]},"schema":1582832503175,"appliesTo":[{"default":"yes","included":{"everywhere":true}},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-e"},{"name":"q","value":"{searchTerms}"}]},"included":{"everywhere":true},"application":{"channel":["esr"]},"telemetryId":"google-b-e"},{"default":"no","included":{"locales":{"matches":["ru","tr","be","kk"],"startsWith":["en"]},"regions":["ru","tr","by","kz"],"telemetryId":"google"}},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-e"},{"name":"q","value":"{searchTerms}"}]},"default":"no","included":{"locales":{"matches":["ru","tr","be","kk"],"startsWith":["en"]},"regions":["ru","tr","by","kz"],"telemetryId":"google"},"application":{"channel":["esr"]}},{"default":"no","included":{"locales":{"matches":["zh-CN"]},"regions":["cn"]}},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-e"},{"name":"q","value":"{searchTerms}"}]},"default":"no","included":{"locales":{"matches":["zh-CN"]},"regions":["cn"]},"application":{"channel":["esr"]}},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-1-d"},{"name":"q","value":"{searchTerms}"}]},"included":{"regions":["us"]},"extraParams":[{"name":"channel","pref":"google_channel_us","condition":"pref"}],"telemetryId":"google-b-1-d"},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-1-e"},{"name":"q","value":"{searchTerms}"}]},"included":{"regions":["us"]},"application":{"channel":["esr"]},"extraParams":[{"name":"channel","pref":"google_channel_us","condition":"pref"}],"telemetryId":"google-b-1-e"}],"orderHint":1000,"extraParams":[{"name":"channel","pref":"google_channel_row","condition":"pref"}],"telemetryId":"google-b-d","webExtension":{"id":"google@search.mozilla.org"},"id":"cb8e7210-9f0b-48fa-8708-b9a03df79eea","last_modified":1583937832394},{"params":{"searchUrlGetParams":[{"name":"pc","value":"MOZI"},{"name":"q","value":"{searchTerms}"}]},"schema":1582890763841,"appliesTo":[{"included":{"locales":{"matches":["ach","af","an","ar","ast","az","ca","ca-valencia","cak","da","de","dsb","el","eo","es-CL","es-ES","es-MX","eu","fa","ff","fi","fr","fy-NL","gn","gu-IN","hi-IN","hr","hsb","ia","is","it","ja-JP-macos","ja","ka","kab","km","kn","lij","lo","lt","mk","ms","my","nb-NO","ne-NP","nl","nn-NO","oc","pa-IN","pt-BR","rm","ro","son","sq","sr","sv-SE","th","tl","trs","uk","ur","uz","wo","xh","zh-CN"],"startsWith":["bn","en"]}}}],"extraParams":[{"name":"form","value":"MOZCON","purpose":"contextmenu","condition":"purpose"},{"name":"form","value":"MOZSBR","purpose":"searchbar","condition":"purpose"},{"name":"form","value":"MOZSPG","purpose":"homepage","condition":"purpose"},{"name":"form","value":"MOZLBR","purpose":"keyword","condition":"purpose"},{"name":"form","value":"MOZTSB","purpose":"newtab","condition":"purpose"}],"webExtension":{"id":"bing@search.mozilla.org"},"id":"7ec766f6-639a-4618-91bc-33eb3d4378c6","last_modified":1583937832392},{"params":{"searchUrlGetParams":[{"name":"tn","value":"monline_7_dg"},{"name":"ie","value":"utf-8"},{"name":"wd","value":"{searchTerms}"}],"suggestUrlGetParams":[{"name":"tn","value":"monline_7_dg"},{"name":"ie","value":"utf-8"},{"name":"action","value":"opensearch"},{"name":"wd","value":"{searchTerms}"}]},"schema":1582890764713,"appliesTo":[{"included":{"locales":{"matches":["zh-CN"]}}},{"default":"yes","included":{"locales":{"matches":["zh-CN"]},"regions":["cn"]}}],"telemetryId":"baidu","webExtension":{"id":"baidu@search.mozilla.org"},"id":"52dd490a-89e8-45f2-96b0-f2c72e157526","last_modified":1583937832389},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"mozilla-20"},{"name":"sourceid","value":"Mozilla-search"}]},"schema":1582890765580,"appliesTo":[{"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]}}},{"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]},"regions":["au"]},"telemetryId":"amazon-au","webExtension":{"id":"amazon@search.mozilla.org","locales":["au"]}},{"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]},"regions":["ca"]},"telemetryId":"amazon-ca","webExtension":{"id":"amazon@search.mozilla.org","locales":["ca"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-fr-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]},"regions":["fr"]},"telemetryId":"amazon-france","webExtension":{"id":"amazon@search.mozilla.org","locales":["france"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-uk-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]},"regions":["gb"]},"telemetryId":"amazon-en-GB","webExtension":{"id":"amazon@search.mozilla.org","locales":["en-GB"]}}],"orderHint":500,"telemetryId":"amazondotcom","webExtension":{"id":"amazondotcom@search.mozilla.org"},"id":"071c671c-7c1b-469d-a771-ab16ff6e8beb","last_modified":1583937832387},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"}]},"schema":1582890766440,"appliesTo":[{"included":{"locales":{"matches":["bn","bn-IN","kn","gu-IN","mr","pa-IN","ta","te","ur"]}},"telemetryId":"amazon-in","webExtension":{"locales":["in"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-fr-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["br","ff","fr","son","wo"]}},"telemetryId":"amazon-france","webExtension":{"locales":["france"]}},{"included":{"locales":{"matches":["br","ff","fr","son","wo"]},"regions":["ca"]},"telemetryId":"amazon-ca","webExtension":{"locales":["ca"]}},{"included":{"locales":{"matches":["en-CA"]}},"telemetryId":"amazon-ca","webExtension":{"locales":["ca"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"mozillajapan-fx-22"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["ja-JP-macos","ja"]}},"telemetryId":"amazon-jp","webExtension":{"locales":["jp"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefoxit-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["it","lij"]}},"telemetryId":"amazon-it","webExtension":{"locales":["it"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-de-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["de","dsb","hsb"]}},"telemetryId":"amazon-de","webExtension":{"locales":["de"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-uk-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["cy","da","el","en-GB","eu","ga-IE","gd","gl","hr","nb-NO","nn-NO","pt-PT","sq","sr"]}},"telemetryId":"amazon-en-GB","webExtension":{"locales":["en-GB"]}},{"included":{"locales":{"matches":["cy","da","el","en-GB","eu","ga-IE","gd","gl","hr","nb-NO","nn-NO","pt-PT","sq","sr"]},"regions":["au"]},"telemetryId":"amazon-au","webExtension":{"locales":["au"]}}],"orderHint":500,"webExtension":{"id":"amazon@search.mozilla.org"},"id":"a620b506-c3ae-4332-97bb-190a73868580","last_modified":1583937832384},{"params":{"searchUrlGetParams":[{"name":"keywords","value":"{searchTerms}"},{"name":"ix","value":"sunray"},{"name":"pageletid","value":"headsearch"},{"name":"searchType","value":""},{"name":"Go.x","value":"0"},{"name":"Go.y","value":"0"},{"name":"bestSaleNum","value":"0"}]},"schema":1582890767305,"appliesTo":[{"included":{"locales":{"matches":["zh-CN"]}}}],"orderHint":500,"telemetryId":"amazondotcn","webExtension":{"id":"amazondotcn@search.mozilla.org"},"id":"ccb137f1-7733-464c-bb70-037be4ba2529","last_modified":1583937832381},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.com/sch/{searchTerms}"}]},"schema":1582890768154,"appliesTo":[{"included":{"locales":{"matches":["en-US"]},"regions":["us"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.es/sch/{searchTerms}"}]},"included":{"locales":{"matches":["an","ast","ca","ca-valencia","es-ES","eu","gl"]}},"telemetryId":"ebay-es","webExtension":{"locales":["es"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.fr/sch/{searchTerms}"}]},"included":{"locales":{"matches":["br","fr","wo"]}},"telemetryId":"ebay-fr","webExtension":{"locales":["fr"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.befr.ebay.be/sch/{searchTerms}"}]},"included":{"locales":{"matches":["br","en-US","fr","wo"]},"regions":["be"]},"telemetryId":"ebay-be","webExtension":{"locales":["be"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ca/sch/{searchTerms}"}]},"included":{"locales":{"matches":["br","en-US","fr","wo"]},"regions":["ca"]},"telemetryId":"ebay-ca","webExtension":{"locales":["ca"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ch/sch/{searchTerms}"}]},"included":{"locales":{"matches":["br","en-US","fr","wo"]},"regions":["ch"]},"telemetryId":"ebay-ch","webExtension":{"locales":["ch"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.co.uk/sch/{searchTerms}"}]},"included":{"locales":{"matches":["cy","en-GB","gd"]}},"telemetryId":"ebay-uk","webExtension":{"locales":["uk"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.co.uk/sch/{searchTerms}"}]},"included":{"locales":{"matches":["en-US"]},"regions":["gb"]},"telemetryId":"ebay-uk","webExtension":{"locales":["uk"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.com.au/sch/{searchTerms}"}]},"included":{"locales":{"matches":["cy","en-GB","en-US","gd"]},"regions":["au"]},"telemetryId":"ebay-au","webExtension":{"locales":["au"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ie/sch/{searchTerms}"}]},"included":{"locales":{"matches":["cy","en-GB","en-US","gd"]},"regions":["ie"]},"telemetryId":"ebay-ie","webExtension":{"locales":["ie"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.de/sch/{searchTerms}"}]},"included":{"locales":{"matches":["de","dsb","hsb"]}},"telemetryId":"ebay-de","webExtension":{"locales":["de"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.at/sch/{searchTerms}"}]},"included":{"locales":{"matches":["de","dsb","hsb"]},"regions":["at"]},"telemetryId":"ebay-at","webExtension":{"locales":["at"]}},{"included":{"locales":{"matches":["de","dsb","hsb"]},"regions":["ch"]},"telemetryId":"ebay-ch","webExtension":{"locales":["ch"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ca/sch/{searchTerms}"}]},"included":{"locales":{"matches":["en-CA"]}},"telemetryId":"ebay-ca","webExtension":{"locales":["ca"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.nl/sch/{searchTerms}"}]},"included":{"locales":{"matches":["fy-NL","nl"]}},"telemetryId":"ebay-nl","webExtension":{"locales":["nl"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.nl/sch/{searchTerms}"}]},"included":{"locales":{"matches":["en-US"]},"regions":["nl"]},"telemetryId":"ebay-nl","webExtension":{"locales":["nl"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.befr.ebay.be/sch/{searchTerms}"}]},"included":{"locales":{"matches":["fy-NL","nl"]},"regions":["be"]},"telemetryId":"ebay-be","webExtension":{"locales":["be"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ie/sch/{searchTerms}"}]},"included":{"locales":{"matches":["ga-IE"]}},"telemetryId":"ebay-ie","webExtension":{"locales":["ie"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.it/sch/{searchTerms}"}]},"included":{"locales":{"matches":["it","lij"]}},"telemetryId":"ebay-it","webExtension":{"locales":["it"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ch/sch/{searchTerms}"}]},"included":{"locales":{"matches":["rm"]}},"telemetryId":"ebay-ch","webExtension":{"locales":["ch"]}}],"orderHint":500,"webExtension":{"id":"ebay@search.mozilla.org"},"id":"cbe309e0-f638-4996-9dfc-ea5c19ef16e9","last_modified":1583937832378},{"schema":1582890769208,"appliesTo":[{"included":{"everywhere":true}}],"orderHint":500,"extraParams":[{"name":"t","value":"ffcm","purpose":"contextmenu","condition":"purpose"},{"name":"t","value":"ffab","purpose":"keyword","condition":"purpose"},{"name":"t","value":"ffsb","purpose":"searchbar","condition":"purpose"},{"name":"t","value":"ffhp","purpose":"homepage","condition":"purpose"},{"name":"t","value":"ffnt","purpose":"newtab","condition":"purpose"}],"telemetryId":"ddg","webExtension":{"id":"ddg@search.mozilla.org"},"id":"c0b26c0e-63e6-4235-b2ce-5f16b6a8bf87","last_modified":1583937832375},{"schema":1582890770084,"appliesTo":[{"default":"yes","included":{"locales":{"matches":["ru","tr","be","kk"],"startsWith":["en"]},"regions":["ru","tr","by","kz"]},"telemetryId":"yandex-en","webExtension":{"locales":["en"]}},{"included":{"locales":{"matches":["az"]}},"telemetryId":"yandex-az","webExtension":{"locales":["az"]}},{"included":{"locales":{"matches":["be"]}},"telemetryId":"yandex-by","webExtension":{"locales":["by"]}},{"included":{"locales":{"matches":["kk"]}},"telemetryId":"yandex-kk","webExtension":{"locales":["kk"]}},{"included":{"locales":{"matches":["ru"]}},"telemetryId":"yandex-ru","webExtension":{"locales":["ru"]}},{"included":{"locales":{"matches":["tr"]}},"telemetryId":"yandex-tr","webExtension":{"locales":["tr"]}}],"extraParams":[{"name":"clid","value":"2186618","purpose":"searchbar","condition":"purpose"},{"name":"clid","value":"2186621","purpose":"keyword","condition":"purpose"},{"name":"clid","value":"2186623","purpose":"contextmenu","condition":"purpose"},{"name":"clid","value":"2186617","purpose":"homepage","condition":"purpose"},{"name":"clid","value":"2186620","purpose":"newtab","condition":"purpose"}],"webExtension":{"id":"yandex@search.mozilla.org"},"id":"a0e7f96a-14e0-4d56-9f54-e0c7e49fd306","last_modified":1583937832372},{"schema":1582890770937,"appliesTo":[{"included":{"locales":{"matches":["sv-SE"]}}}],"webExtension":{"id":"allaannonser-sv-SE@search.mozilla.org"},"id":"69a82554-c9b4-4c84-98c7-80f86fa7174a","last_modified":1583937832369},{"schema":1582890771781,"appliesTo":[{"included":{"locales":{"matches":["pl"]}}}],"webExtension":{"id":"allegro-pl@search.mozilla.org"},"id":"d915b6bc-bbae-47a6-8323-1b2990ad0e57","last_modified":1583937832367},{"schema":1582890772625,"appliesTo":[{"included":{"locales":{"matches":["sk"]}}}],"webExtension":{"id":"atlas-sk@search.mozilla.org"},"id":"6cebcf52-2cfa-4da2-ae4d-2c845ebdbc0b","last_modified":1583937832365},{"schema":1582890773480,"appliesTo":[{"included":{"locales":{"matches":["az"]}}}],"webExtension":{"id":"azerdict@search.mozilla.org"},"id":"c1a6845f-015e-4e67-bc64-6e39a843643f","last_modified":1583937832363},{"schema":1582890774347,"appliesTo":[{"included":{"locales":{"matches":["sk"]}}}],"webExtension":{"id":"azet-sk@search.mozilla.org"},"id":"3c632ae9-f758-43b5-9d06-b9c1b6bc7105","last_modified":1583937832361},{"schema":1582890775198,"appliesTo":[{"included":{"locales":{"matches":["gd"]}}}],"webExtension":{"id":"bbc-alba@search.mozilla.org"},"id":"4ab14cdb-35ea-42dc-8500-110eb3088b89","last_modified":1583937832358},{"schema":1582890776067,"appliesTo":[{"included":{"locales":{"matches":["nb-NO","nn-NO"]}}}],"webExtension":{"id":"bok-NO@search.mozilla.org"},"id":"64ce88a6-fd55-48d1-85a9-724c753f5721","last_modified":1583937832356},{"schema":1582890776913,"appliesTo":[{"included":{"locales":{"matches":["fy-NL"]}},"webExtension":{"locales":["fy-NL"]}},{"included":{"locales":{"matches":["nl"]}},"webExtension":{"locales":["nl"]}}],"webExtension":{"id":"bolcom@search.mozilla.org"},"id":"3d0ab163-0808-4be0-b479-0900dcdc8e35","last_modified":1583937832354},{"schema":1582890777775,"appliesTo":[{"included":{"locales":{"matches":["sl"]}}}],"webExtension":{"id":"ceneji@search.mozilla.org"},"id":"d908d622-0387-4d36-8098-1a9e32c0c697","last_modified":1583937832352},{"schema":1582890778608,"appliesTo":[{"included":{"locales":{"matches":["en-GB"]}}}],"webExtension":{"id":"chambers-en-GB@search.mozilla.org"},"id":"270000f0-8527-4f98-aa17-879820209f68","last_modified":1583937832350},{"schema":1582890779439,"appliesTo":[{"included":{"locales":{"matches":["vi"]}}}],"webExtension":{"id":"coccoc@search.mozilla.org"},"id":"4e447f5a-9eb1-436e-8de1-9e4b4b709efb","last_modified":1583937832348},{"schema":1582890780276,"appliesTo":[{"included":{"locales":{"matches":["ko"]}}}],"webExtension":{"id":"daum-kr@search.mozilla.org"},"id":"0cdc44be-173a-4ca8-96e3-43e3000da75d","last_modified":1583937832346},{"schema":1582890781123,"appliesTo":[{"included":{"locales":{"matches":["ca","ca-valencia"]}}}],"webExtension":{"id":"diec2@search.mozilla.org"},"id":"055103b9-1f4a-43d0-9b99-5b8d7209b022","last_modified":1583937832343},{"schema":1582890781968,"appliesTo":[{"included":{"locales":{"matches":["es-AR","es-CL","es-ES"]}}}],"webExtension":{"id":"drae@search.mozilla.org"},"id":"3d27c51f-83d4-43be-af84-4d7a51c5a8e4","last_modified":1583937832341},{"schema":1582890782823,"appliesTo":[{"included":{"locales":{"matches":["de"]}}}],"webExtension":{"id":"ecosia@search.mozilla.org"},"id":"1fc1b257-3e6b-4cfb-a323-64c1429bcf51","last_modified":1583937832339},{"schema":1582890783661,"appliesTo":[{"included":{"locales":{"matches":["et"]}}}],"webExtension":{"id":"eki-ee@search.mozilla.org"},"id":"63b74323-1d14-4989-921f-7cc32bfee072","last_modified":1583937832336},{"schema":1582890784534,"appliesTo":[{"included":{"locales":{"matches":["hr"]}}}],"webExtension":{"id":"eudict@search.mozilla.org"},"id":"5cd4781c-2906-4fe7-9d4b-ea9ddbdc2c3b","last_modified":1583937832334},{"schema":1582890785390,"appliesTo":[{"included":{"locales":{"matches":["gd"]}}}],"webExtension":{"id":"faclair-beag@search.mozilla.org"},"id":"6491a2b8-c487-4798-a817-a0fd08b40ee2","last_modified":1583937832332},{"schema":1582890786256,"appliesTo":[{"included":{"locales":{"matches":["kk"]}}}],"webExtension":{"id":"flip@search.mozilla.org"},"id":"d045762c-52ac-4c16-8ca3-072aecea83da","last_modified":1583937832330},{"schema":1582890787108,"appliesTo":[{"included":{"locales":{"matches":["br"]}}}],"webExtension":{"id":"freelang@search.mozilla.org"},"id":"ed6a0f8c-e496-4d9c-936c-b906892e3d23","last_modified":1583937832327},{"schema":1582890787961,"appliesTo":[{"included":{"locales":{"matches":["nn-NO","nb-NO"]}}}],"webExtension":{"id":"gulesider-NO@search.mozilla.org"},"id":"f458e78b-9128-4027-b344-538f5661c148","last_modified":1583937832325},{"schema":1582890788795,"appliesTo":[{"included":{"locales":{"matches":["cs"]}}}],"webExtension":{"id":"heureka-cz@search.mozilla.org"},"id":"b9a718b5-fc78-40b8-b1c3-2e15d2009f5c","last_modified":1583937832323},{"schema":1582890789635,"appliesTo":[{"included":{"locales":{"matches":["uk"]}}}],"webExtension":{"id":"hotline-ua@search.mozilla.org"},"id":"da2ec2d3-6c5c-4191-b428-351fbea8aeba","last_modified":1583937832321},{"schema":1582890790469,"appliesTo":[{"included":{"locales":{"matches":["kn"]}}}],"webExtension":{"id":"kannadastore@search.mozilla.org"},"id":"ae1cfae5-0516-41c0-99af-fd3d92a77aa8","last_modified":1583937832318},{"schema":1582890791315,"appliesTo":[{"included":{"locales":{"matches":["de","dsb","hsb","rm"]}}}],"webExtension":{"id":"leo_ende_de@search.mozilla.org"},"id":"03d60939-2c92-45b0-874f-11c8e6d0c2b9","last_modified":1583937832316},{"schema":1582890792162,"appliesTo":[{"included":{"locales":{"matches":["hy-AM"]}}}],"webExtension":{"id":"list-am@search.mozilla.org"},"id":"206db966-db1f-492d-9ab0-71b3e12b434e","last_modified":1583937832313},{"schema":1582890793008,"appliesTo":[{"included":{"locales":{"matches":["th"]}}}],"webExtension":{"id":"longdo@search.mozilla.org"},"id":"8b4f2887-0c24-49ce-b467-2ba8cc9a4945","last_modified":1583937832311},{"schema":1582890793853,"appliesTo":[{"included":{"locales":{"matches":["ru"]}}}],"webExtension":{"id":"mailru@search.mozilla.org"},"id":"e0ca4964-e324-44e7-80b6-16a831706d17","last_modified":1583937832309},{"schema":1582890794722,"appliesTo":[{"included":{"locales":{"matches":["cs"]}}}],"webExtension":{"id":"mapy-cz@search.mozilla.org"},"id":"9a404348-0998-42c4-9d87-45ef47672c95","last_modified":1583937832306},{"schema":1582890795553,"appliesTo":[{"included":{"locales":{"matches":["fy-NL"]}},"webExtension":{"locales":["fy-NL"]}},{"included":{"locales":{"matches":["nl"]}},"webExtension":{"locales":["nl"]}}],"webExtension":{"id":"marktplaats@search.mozilla.org"},"id":"7823cbee-e13e-4de6-8cf1-86e9234f06ae","last_modified":1583937832304},{"schema":1582890796393,"appliesTo":[{"included":{"locales":{"matches":["es-AR"]}},"webExtension":{"locales":["ar"]}},{"included":{"locales":{"matches":["es-CL"]}},"webExtension":{"locales":["cl"]}},{"included":{"locales":{"matches":["es-MX"]}},"webExtension":{"locales":["mx"]}}],"webExtension":{"id":"mercadolibre@search.mozilla.org"},"id":"df070348-e771-4bd5-964e-d19d82c1384e","last_modified":1583937832302},{"schema":1582890797236,"appliesTo":[{"included":{"locales":{"matches":["pt-BR"]}}}],"webExtension":{"id":"mercadolivre@search.mozilla.org"},"id":"53bf6974-0e60-4551-994f-2d5176a5d1c6","last_modified":1583937832300},{"schema":1582890798070,"appliesTo":[{"included":{"locales":{"matches":["he"]}}}],"webExtension":{"id":"morfix-dic@search.mozilla.org"},"id":"3d05b67d-ef69-4abf-82ab-c943a7e3eff3","last_modified":1583937832298},{"schema":1582890798901,"appliesTo":[{"included":{"locales":{"matches":["sl"]}}}],"webExtension":{"id":"najdi-si@search.mozilla.org"},"id":"dd8dcdda-7da8-46db-823b-d33fb1da63f8","last_modified":1583937832295},{"schema":1582890799757,"appliesTo":[{"included":{"locales":{"matches":["ko"]}}}],"webExtension":{"id":"naver-kr@search.mozilla.org"},"id":"4135dc8f-f0bf-475b-b39f-74c4256572af","last_modified":1583937832292},{"schema":1582890800610,"appliesTo":[{"included":{"locales":{"matches":["et"]}}}],"webExtension":{"id":"neti-ee@search.mozilla.org"},"id":"2260d56e-d47c-435e-9cb8-9c7c67e8df7c","last_modified":1583937832289},{"schema":1582890801444,"appliesTo":[{"included":{"locales":{"matches":["sl"]}}}],"webExtension":{"id":"odpiralni@search.mozilla.org"},"id":"fa42b23a-30c5-46f3-8997-4a84029b5349","last_modified":1583937832287},{"schema":1582890802297,"appliesTo":[{"included":{"locales":{"matches":["bs"]}}}],"webExtension":{"id":"olx@search.mozilla.org"},"id":"af72d7ef-4255-4362-b328-703aea68ee7e","last_modified":1583937832283},{"schema":1582890803993,"appliesTo":[{"included":{"locales":{"matches":["et"]}}}],"webExtension":{"id":"osta-ee@search.mozilla.org"},"id":"af16e0da-1bcf-4769-b9bb-e43a94bfac75","last_modified":1583937832276},{"schema":1582890804842,"appliesTo":[{"included":{"locales":{"matches":["ru"]}}}],"webExtension":{"id":"ozonru@search.mozilla.org"},"id":"f62fc00c-2e87-4e95-aa11-0db075cd5741","last_modified":1583937832272},{"schema":1582890805689,"appliesTo":[{"included":{"locales":{"matches":["cy"]}}}],"webExtension":{"id":"palasprint@search.mozilla.org"},"id":"656d9e4e-74d5-4eee-bee3-519b4d9bfd37","last_modified":1583937832269},{"schema":1582890806533,"appliesTo":[{"included":{"locales":{"matches":["bg"]}}}],"webExtension":{"id":"pazaruvaj@search.mozilla.org"},"id":"acc27094-9f0a-49af-868b-8b6ecbbda976","last_modified":1583937832267},{"schema":1582890807390,"appliesTo":[{"included":{"locales":{"matches":["sr"]}}}],"webExtension":{"id":"pogodak@search.mozilla.org"},"id":"3bb87247-c36b-4606-a0d6-92b14eaeba86","last_modified":1583937832264},{"schema":1582890808245,"appliesTo":[{"included":{"locales":{"matches":["pt-PT"]}}}],"webExtension":{"id":"priberam@search.mozilla.org"},"id":"a3f1a5b6-cd8d-41b3-bb2b-de6bb1943a3d","last_modified":1583937832261},{"schema":1582890809085,"appliesTo":[{"included":{"locales":{"matches":["ru"]}}}],"webExtension":{"id":"priceru@search.mozilla.org"},"id":"de771801-5bca-436c-be56-f882897c46f2","last_modified":1583937832259},{"schema":1582890809928,"appliesTo":[{"included":{"locales":{"matches":["sv-SE"]}}}],"webExtension":{"id":"prisjakt-sv-SE@search.mozilla.org"},"id":"8a7de784-efa5-428f-9193-a0d3368b80d4","last_modified":1583937832257},{"schema":1582890810778,"appliesTo":[{"included":{"locales":{"matches":["pl"]}}}],"webExtension":{"id":"pwn-pl@search.mozilla.org"},"id":"2ca17e29-ed08-4218-99f6-0615c8bc5c67","last_modified":1583937832254},{"schema":1582890811653,"appliesTo":[{"included":{"locales":{"matches":["fr"]}}}],"webExtension":{"id":"qwant@search.mozilla.org"},"id":"f59fddbc-580b-4672-9cda-32941ceec729","last_modified":1583937832252},{"schema":1582890812485,"appliesTo":[{"included":{"locales":{"matches":["nb-NO","nn-NO"]}}}],"webExtension":{"id":"qxl-NO@search.mozilla.org"},"id":"e54d56d1-defb-4e34-b85e-9814cb7797c2","last_modified":1583937832249},{"schema":1582890814195,"appliesTo":[{"included":{"locales":{"matches":["zh-TW"]}}}],"webExtension":{"id":"readmoo@search.mozilla.org"},"id":"2d24515e-3e35-42ed-bf17-1388acfe80fa","last_modified":1583937832245},{"schema":1582890815048,"appliesTo":[{"included":{"locales":{"matches":["ltg","lv"]}}}],"webExtension":{"id":"salidzinilv@search.mozilla.org"},"id":"e7dcde21-5b5e-4406-b602-0611130fd3a6","last_modified":1583937832242},{"schema":1582890815902,"appliesTo":[{"included":{"locales":{"matches":["cs"]}}}],"webExtension":{"id":"seznam-cz@search.mozilla.org"},"id":"c50dcc87-0192-4461-bb88-17a55ba181c7","last_modified":1583937832240},{"schema":1582890816739,"appliesTo":[{"included":{"locales":{"matches":["ltg","lv"]}}}],"webExtension":{"id":"sslv@search.mozilla.org"},"id":"74f2f615-8d17-4133-82c1-18d03643c383","last_modified":1583937832237},{"schema":1582890817589,"appliesTo":[{"included":{"locales":{"matches":["ga-IE"]}}}],"webExtension":{"id":"tearma@search.mozilla.org"},"id":"518293ee-4bf0-4514-9b73-c6fb646a8a18","last_modified":1583937832235},{"schema":1582890819290,"appliesTo":[{"included":{"locales":{"matches":["sv-SE"]}}}],"webExtension":{"id":"tyda-sv-SE@search.mozilla.org"},"id":"32eec495-ce07-4ce5-8d07-4cb32050459d","last_modified":1583937832229},{"schema":1582890820131,"appliesTo":[{"included":{"locales":{"matches":["hu"]}}}],"webExtension":{"id":"vatera@search.mozilla.org"},"id":"d0eab7e7-9084-4a43-b845-568dbe9f07dc","last_modified":1583937832225},{"schema":1582890820983,"appliesTo":[{"included":{"locales":{"matches":["te"]}},"webExtension":{"locales":["te"]}},{"included":{"locales":{"matches":["oc"]}},"webExtension":{"locales":["oc"]}}],"webExtension":{"id":"wiktionary@search.mozilla.org"},"id":"781f42f0-3a5c-4d14-8be2-665eefa65653","last_modified":1583937832222},{"schema":1582890821826,"appliesTo":[{"included":{"locales":{"matches":["pl"]}}}],"webExtension":{"id":"wolnelektury-pl@search.mozilla.org"},"id":"1960ccff-4aab-48cd-9bf5-0eb2adde76f9","last_modified":1583937832218},{"schema":1582890822671,"appliesTo":[{"included":{"locales":{"matches":["ja-JP-macos","ja"]}}}],"webExtension":{"id":"yahoo-jp@search.mozilla.org"},"id":"9e73a342-4e27-4e9f-8a29-be193d59236a","last_modified":1583937832213},{"schema":1582890823520,"appliesTo":[{"included":{"locales":{"matches":["ja-JP-macos","ja"]}}}],"webExtension":{"id":"yahoo-jp-auctions@search.mozilla.org"},"id":"43559b11-05dc-4750-b131-afdbd9d25905","last_modified":1583937832210},{"schema":1582890824418,"appliesTo":[{"included":{"locales":{"matches":["sk"]}}}],"webExtension":{"id":"zoznam-sk@search.mozilla.org"},"id":"e332f9dd-d1c5-4cc9-8534-3fd9938b970c","last_modified":1583937832207},{"schema":1582890825302,"appliesTo":[{"included":{"everywhere":true}},{"included":{"locales":{"matches":["af","an","ar","ast","az","bg","br","bs","cy","da","de","dsb","el","eo","et","eu","fa","fi","fy-NL","ga-IE","gd","gl","gn","he","hr","hsb","hu","ia","id","is","it","ka","kab","kk","km","kn","lij","lo","lt","ltg","lv","mk","mr","ms","my","nl","oc","pl","rm","ro","ru","si","sk","sl","sq","sr","sv-SE","ta","te","th","tl","tr","uk","ur","uz","vi","wo","zh-CN","zh-TW"]}},"webExtension":{"locales":["$USER_LOCALE"]}},{"included":{"locales":{"matches":["be"]}},"webExtension":{"locales":["be","be-tarask"]}},{"included":{"locales":{"matches":["bn","bn-BD","bn-IN"]}},"webExtension":{"locales":["bn"]}},{"included":{"locales":{"matches":["ca","ca-valencia"]}},"webExtension":{"locales":["ca"]}},{"included":{"locales":{"matches":["cak","es-AR","es-CL","es-ES","es-MX","trs"]}},"webExtension":{"locales":["es"]}},{"included":{"locales":{"matches":["cs"]}},"webExtension":{"locales":["cz"]}},{"included":{"locales":{"matches":["ff","fr","son"]}},"webExtension":{"locales":["fr"]}},{"included":{"locales":{"matches":["gu-IN"]}},"webExtension":{"locales":["gu"]}},{"included":{"locales":{"matches":["hi-IN"]}},"webExtension":{"locales":["hi"]}},{"included":{"locales":{"matches":["hy-AM"]}},"webExtension":{"locales":["hy"]}},{"included":{"locales":{"matches":["ja-JP-macos","ja"]}},"webExtension":{"locales":["ja"]}},{"included":{"locales":{"matches":["ko"]}},"webExtension":{"locales":["kr"]}},{"included":{"locales":{"matches":["nb-NO"]}},"webExtension":{"locales":["NO"]}},{"included":{"locales":{"matches":["ne-NP"]}},"webExtension":{"locales":["ne"]}},{"included":{"locales":{"matches":["nn-NO"]}},"webExtension":{"locales":["NN"]}},{"included":{"locales":{"matches":["pa-IN"]}},"webExtension":{"locales":["pa"]}},{"included":{"locales":{"matches":["pt-BR","pt-PT"]}},"webExtension":{"locales":["pt"]}}],"webExtension":{"id":"wikipedia@search.mozilla.org"},"id":"3f3beb1d-e32e-40a4-b6ed-56741803e1d8","last_modified":1583937832203}]} \ No newline at end of file diff --git a/sourcestamp.txt b/sourcestamp.txt index 05d48529c5c0ea9c560590d2b73029ca2a574af4..38dd6c97631f43c0de1ebdc07d41e0b35868671a 100644 --- a/sourcestamp.txt +++ b/sourcestamp.txt @@ -1,3 +1,3 @@ -20200407173003 -https://hg.mozilla.org/releases/comm-beta/rev/73855ae9feac41474c1dc237b13b1cab9fe78fa8 -https://hg.mozilla.org/releases/mozilla-beta/rev/b4ef8571957b03316302e9dd21979a0d2612f648 +20200420212409 +https://hg.mozilla.org/releases/comm-beta/rev/f049099923e4de955115d4150214936f37912021 +https://hg.mozilla.org/releases/mozilla-beta/rev/d64d5ccf2b14498b6de0bb18c4e9e66abae5efce diff --git a/storage/TelemetryVFS.cpp b/storage/TelemetryVFS.cpp index 9d5a9d0f365ece2738beeb2dfcf16c9019511033..ddb2c7e36e271f914c20275ac35b4c42a6234f48 100644 --- a/storage/TelemetryVFS.cpp +++ b/storage/TelemetryVFS.cpp @@ -276,7 +276,9 @@ int xWrite(sqlite3_file* pFile, const void* zBuf, int iAmt, "update its current size..."); sqlite_int64 currentSize; if (xFileSize(pFile, ¤tSize) == SQLITE_OK) { - p->quotaObject->MaybeUpdateSize(currentSize, /* aTruncate */ true); + DebugOnly<bool> res = + p->quotaObject->MaybeUpdateSize(currentSize, /* aTruncate */ true); + MOZ_ASSERT(res); } } return rc; @@ -315,7 +317,9 @@ int xTruncate(sqlite3_file* pFile, sqlite_int64 size) { "xTruncate failed on a quota-controlled file, attempting to " "update its current size..."); if (xFileSize(pFile, &size) == SQLITE_OK) { - p->quotaObject->MaybeUpdateSize(size, /* aTruncate */ true); + DebugOnly<bool> res = + p->quotaObject->MaybeUpdateSize(size, /* aTruncate */ true); + MOZ_ASSERT(res); } } } diff --git a/taskcluster/ci/test/mochitest.yml b/taskcluster/ci/test/mochitest.yml index 9c4ced2103538fa597293b5f8938621dda382af1..381a370682e31ffc27c9af733a6742609d152a4d 100644 --- a/taskcluster/ci/test/mochitest.yml +++ b/taskcluster/ci/test/mochitest.yml @@ -433,6 +433,7 @@ mochitest-webgpu: virtualization: virtual-with-gpu e10s: true loopback-video: true + run-on-projects: ["trunk", "try"] tier: default max-run-time: by-test-platform: diff --git a/taskcluster/docker/firefox-flatpak/org.mozilla.firefox.appdata.xml.in b/taskcluster/docker/firefox-flatpak/org.mozilla.firefox.appdata.xml.in index c4c9c8954682a1c6e1a79cb0e491dcf79ed1f413..9d19f806adb3d63e6f362ab4d87d9226ed79a0e9 100644 --- a/taskcluster/docker/firefox-flatpak/org.mozilla.firefox.appdata.xml.in +++ b/taskcluster/docker/firefox-flatpak/org.mozilla.firefox.appdata.xml.in @@ -7,7 +7,7 @@ <metadata_license>CC0-1.0</metadata_license> <project_license>MPL-2.0</project_license> <description> - <p><strong>The new Firefox</strong></p> + <p>The new Firefox></p> <p>Meet Firefox Quantum. Fast for good.</p> <p>Features:</p> <ul> @@ -15,13 +15,13 @@ <li>Better, faster page loading that uses less computer memory.</li> <li>Gorgeous design and smart features for intelligent browsing.</li> </ul> - <p><strong>Now 2x faster</strong></p> + <p>Now 2x faster></p> <p>Crazy powerful browser engine? Check. Less time waiting around for pages to load? Also, check. Firefox Quantum is twice as fast as Firefox was before.</p> - <p><strong>Smooth browsing</strong></p> + <p>Smooth browsing</p> <p>Whether you’ve opened 10 or 1000, switching between tabs is faster than ever with Firefox’s new, responsive engine.</p> - <p><strong>Seriously Private Browsing</strong></p> + <p>Seriously Private Browsing</p> <p>The most powerful private browsing mode with added tracking protection.</p> <ul> <li><p>Private Browsing</p> @@ -40,7 +40,7 @@ </ul> </li> </ul> - <p><strong>Customization Features</strong></p> + <p>Customization Features</p> <ul> <li><p>Extensions</p> </li> @@ -52,13 +52,13 @@ </ul> </li> </ul> - <p><strong>Sync your devices</strong></p> + <p>Sync your devices</p> <ul> <li>Seamlessly access passwords, bookmarks and more. Plus, use our Send Tabs feature to instantly share open tabs between desktop, mobile and tablet.</li> </ul> - <p><strong>Browse for good</strong></p> + <p>Browse for good</p> <p>Firefox is made by Mozilla, the non-profit champions of a healthy internet. Mozilla also tackles issues like privacy, misinformation and trolling by investing in fellowships, campaigns and new technologies diff --git a/taskcluster/docker/firefox-flatpak/runme.sh b/taskcluster/docker/firefox-flatpak/runme.sh index 64e42ef8468d070c5888e422aa4819ab699ab024..8c5520b476783e8ce10daaa542568d3ec3d2a478 100755 --- a/taskcluster/docker/firefox-flatpak/runme.sh +++ b/taskcluster/docker/firefox-flatpak/runme.sh @@ -1,5 +1,4 @@ #!/bin/bash - set -xe # Future products supporting Flatpaks will set this accordingly @@ -108,11 +107,14 @@ appdir=build/files install -d "${appdir}/lib/" (cd "${appdir}/lib/" && tar jxf "${WORKSPACE}/firefox.tar.bz2") install -D -m644 -t "${appdir}/share/appdata" org.mozilla.firefox.appdata.xml -appstream-compose --prefix="${appdir}" --origin=flatpak --basename=org.mozilla.firefox org.mozilla.firefox install -D -m644 -t "${appdir}/share/applications" org.mozilla.firefox.desktop for size in 16 32 48 64 128; do install -D -m644 "${appdir}/lib/firefox/browser/chrome/icons/default/default${size}.png" "${appdir}/share/icons/hicolor/${size}x${size}/apps/org.mozilla.firefox.png" done + +appstream-compose --prefix="${appdir}" --origin=flatpak --basename=org.mozilla.firefox org.mozilla.firefox +appstream-util mirror-screenshots "${appdir}"/share/app-info/xmls/org.mozilla.firefox.xml.gz "https://dl.flathub.org/repo/screenshots/org.mozilla.firefox-${FLATPAK_BRANCH}" /tmp "build/screenshots/org.mozilla.firefox-${FLATPAK_BRANCH}" + # XXX: we used to `install -D` before which automatically created the components # of target, now we need to manually do this since we're symlinking mkdir -p "${appdir}/lib/firefox/distribution/extensions" @@ -129,9 +131,13 @@ install -D -m644 -t "${appdir}/lib/firefox/browser/defaults/preferences" default install -D -m755 launch-script.sh "${appdir}/bin/firefox" flatpak build-finish build \ - --share=ipc --socket=x11 \ + --share=ipc \ + --socket=wayland \ + --socket=fallback-x11 \ + --require-version=1.0.0 \ --share=network \ --socket=pulseaudio \ + --socket=pcsc \ --persist=.mozilla \ --filesystem=xdg-download:rw \ --device=all \ @@ -141,6 +147,8 @@ flatpak build-finish build \ --talk-name=org.gnome.SessionManager \ --talk-name=org.freedesktop.ScreenSaver \ --talk-name="org.gtk.vfs.*" \ + --talk-name=org.freedesktop.Notifications \ + --talk-name=org.mpris.MediaPlayer2.org.mozilla.firefox \ --command=firefox flatpak build-export --disable-sandbox --no-update-summary --exclude='/share/runtime/langpack/*/*' repo build "$FLATPAK_BRANCH" diff --git a/testing/raptor/raptor/tests/benchmarks/raptor-webaudio.ini b/testing/raptor/raptor/tests/benchmarks/raptor-webaudio.ini index 700e4cc5208a5a500d925217d94179b0611744ff..5305849a57e286de2b20bb12bf8768f8f121fb66 100644 --- a/testing/raptor/raptor/tests/benchmarks/raptor-webaudio.ini +++ b/testing/raptor/raptor/tests/benchmarks/raptor-webaudio.ini @@ -8,7 +8,7 @@ type = benchmark test_url = http://<host>:<port>/webaudio/index.html?raptor page_cycles = 5 -page_timeout = 180000 +page_timeout = 360000 unit = score lower_is_better = true alert_threshold = 2.0 diff --git a/testing/web-platform/tests/custom-elements/custom-element-reaction-queue.html b/testing/web-platform/tests/custom-elements/custom-element-reaction-queue.html index 737dab117d3bd8d296ca6235d04e7664e35740c0..246b15a0af36cffa0b64f1d57e4208538b92bdd7 100644 --- a/testing/web-platform/tests/custom-elements/custom-element-reaction-queue.html +++ b/testing/web-platform/tests/custom-elements/custom-element-reaction-queue.html @@ -50,6 +50,39 @@ test_with_window(function (contentWindow) { assert_connected_log_entry(log[5], element2); }, 'Upgrading a custom element must invoke attributeChangedCallback and connectedCallback before start upgrading another element'); +test_with_window(function (contentWindow) { + const contentDocument = contentWindow.document; + contentDocument.write('<test-element>'); + + const element = contentDocument.querySelector('test-element'); + assert_equals(Object.getPrototypeOf(element), contentWindow.HTMLElement.prototype); + + let log = []; + class TestElement extends contentWindow.HTMLElement { + constructor() { + super(); + this.id = "foo"; + this.setAttribute('id', 'foo'); + this.removeAttribute('id'); + this.style.fontSize = '10px'; + log.push(create_constructor_log(this)); + } + connectedCallback(...args) { + log.push(create_connected_callback_log(this, ...args)); + } + attributeChangedCallback(...args) { + log.push(create_attribute_changed_callback_log(this, ...args)); + } + static get observedAttributes() { return ['id', 'style']; } + } + contentWindow.customElements.define('test-element', TestElement); + assert_equals(Object.getPrototypeOf(element), TestElement.prototype); + + assert_equals(log.length, 2); + assert_constructor_log_entry(log[0], element); + assert_connected_log_entry(log[1], element); +}, 'Upgrading a custom element must not invoke attributeChangedCallback for the attribute that is changed during upgrading'); + test_with_window(function (contentWindow) { const contentDocument = contentWindow.document; contentDocument.write('<test-element id="first-element">'); diff --git a/testing/web-platform/tests/html/editing/editing-0/contenteditable/contenteditable-with-empty-block-ref.html b/testing/web-platform/tests/html/editing/editing-0/contenteditable/contenteditable-with-empty-block-ref.html new file mode 100644 index 0000000000000000000000000000000000000000..fe68571013cc4cb98227fec47bdb0f8cd2e74410 --- /dev/null +++ b/testing/web-platform/tests/html/editing/editing-0/contenteditable/contenteditable-with-empty-block-ref.html @@ -0,0 +1,7 @@ +<!doctype html> +<title>Test reference</title> +<div> + Foo + <div></div> + Bar +</div> diff --git a/testing/web-platform/tests/html/editing/editing-0/contenteditable/contenteditable-with-empty-block.html b/testing/web-platform/tests/html/editing/editing-0/contenteditable/contenteditable-with-empty-block.html new file mode 100644 index 0000000000000000000000000000000000000000..7bcc6110723643f3a26f39420586e5ead549d7eb --- /dev/null +++ b/testing/web-platform/tests/html/editing/editing-0/contenteditable/contenteditable-with-empty-block.html @@ -0,0 +1,11 @@ +<!doctype html> +<title>contenteditable doesn't cause inner empty blocks to grow.</title> +<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io"> +<link rel="author" title="Mozilla" href="https://mozilla.org"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1628770"> +<link rel="match" href="contenteditable-with-empty-block-ref.html"> +<div contenteditable> + Foo + <div></div> + Bar +</div> diff --git a/testing/web-platform/tests/html/semantics/embedded-content/the-img-element/image-loading-lazy-srcset.html b/testing/web-platform/tests/html/semantics/embedded-content/the-img-element/image-loading-lazy-srcset.html new file mode 100644 index 0000000000000000000000000000000000000000..21c11c7233c7b8f845a31b6aa25dda14ca381960 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/embedded-content/the-img-element/image-loading-lazy-srcset.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<head> +<title>loading='lazy' image with srcset</title> +<link rel="help" href="https://html.spec.whatwg.org/multipage/images.html#update-the-image-data"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/images.html#will-lazy-load-image-steps"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<div style="height:1000vh;"></div> +<img srcset="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAAG0lEQVR42mP8z0A%2BYKJA76jmUc2jmkc1U0EzACKcASfOgGoMAAAAAElFTkSuQmCC" loading="lazy"> +<img loading="lazy" srcset="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAAG0lEQVR42mP8z0A%2BYKJA76jmUc2jmkc1U0EzACKcASfOgGoMAAAAAElFTkSuQmCC"> +<script> +promise_test(async t => { + let loaded_images = 0; + const imgs = document.querySelectorAll("img"); + imgs.forEach(img => { + img.addEventListener("load", () => { loaded_images++; }, { once: true }); + }); + + await new Promise(resolve => window.addEventListener("load", resolve)); + + assert_equals(loaded_images, 0, + "lazy-load images with srcset shouldn't be loaded yet"); + + const promises = [ + new Promise(resolve => imgs[0].addEventListener("load", resolve)), + new Promise(resolve => imgs[1].addEventListener("load", resolve)), + ]; + + imgs[1].scrollIntoView(); + await Promise.all(promises); + + imgs.forEach(img => { + assert_true(img.complete, + "Now the lazy-load image with srcset should be loaded"); + }); +}); +</script> diff --git a/testing/web-platform/tests/selection/selection-select-all-move-input-crash.html b/testing/web-platform/tests/selection/selection-select-all-move-input-crash.html new file mode 100644 index 0000000000000000000000000000000000000000..6f692dc5e7d69a30a407f107268c9e012efcd9e3 --- /dev/null +++ b/testing/web-platform/tests/selection/selection-select-all-move-input-crash.html @@ -0,0 +1,10 @@ +<script> + function start() { + document.execCommand('selectAll', false) + document.documentElement.appendChild(document.getElementById('input')) + } +</script> +<body onload="start()"> +<input id="input" autofocus> +<canvas contenteditable="true" hidden></canvas> +</body> diff --git a/third_party/rust/nom/.cargo-checksum.json b/third_party/rust/nom/.cargo-checksum.json index b236aa3bb55cd8200edcc12935c2289cf4e273ac..262350f0269c1cba74f0911af6490db8133039e3 100644 --- a/third_party/rust/nom/.cargo-checksum.json +++ b/third_party/rust/nom/.cargo-checksum.json @@ -1 +1 @@ -{"files":{".travis.yml":"124c5613de02fe2088a7410a7057b0e0ed49dcbc8509704b690de98e83b289e0","CHANGELOG.md":"f4015ae48bb8f7c672c4fdf1ca4bdde5910f1b423ddc12e9fe80395911759d3e","Cargo.lock":"d7985e783bf7275009ab524f13aac37adc7291838a1956e1f092413ff3b8ea04","Cargo.toml":"72afa6607971579c7009dff34b6b334d4893b1a9f1983cd80364c5e318e4ec2b","LICENSE":"4dbda04344456f09a7a588140455413a9ac59b6b26a1ef7cdf9c800c012d87f0","build.rs":"fd66799ca3bd6a83b10f18a62e6ffc3b1ac94074fe65de4e4c1c447bf71d6ebb","src/bits/complete.rs":"8a60ae4cd6aaf32cb232b598b1a3dda7858c619944ba12ebdb01a31c75243293","src/bits/macros.rs":"8d9ba23f237b4fc01e3b2106002d0f6d59930a42f34d80662c61e0057dfb4a5b","src/bits/mod.rs":"4ca0148b4ef2de4e88796da7831eaa5c4fcbc5515a101eae1b0bc4853c80b5e7","src/bits/streaming.rs":"7c587808476edee57caeccca7dccd744bdfdbb13ae1156400fb4961980fa325d","src/branch/macros.rs":"8b885185725c16369d90954fed8450070bcd4bf8ae7de1df1bb46bb378450d71","src/branch/mod.rs":"d0c871ad7b74428ddccef445a10254249c3907528005a00275e8eb6516255f2f","src/bytes/complete.rs":"107f776885161e48a596962925d2b1628f20fd4bbe5b3777bb34ec175b97e280","src/bytes/macros.rs":"914a821761bbf49f04425068b7426bdd60394e8cc30e7c2193160b16e06c266f","src/bytes/mod.rs":"577231e6e6bd51726a877a73292d8f1c626f6b32ebe4a57943acaed8a8a2975d","src/bytes/streaming.rs":"4b2e577e6057fda932d1edc2ebe53c5df71a21417a304b35d5230dd7221411f3","src/character/complete.rs":"bb80656f3405eca79ba93c674cae7cd296733d784928e5c45754ee27963b7325","src/character/macros.rs":"f330ab60d469802b1664dcbbccd4bfe3e1ca87b348e92609ef34e25b4d475983","src/character/mod.rs":"9f520d535a88849726eac8648aa5c8b86193ab2f3a984d63c8371b846cc0b72c","src/character/streaming.rs":"9be7051951e8d0a54e294542baaf115aeb6efb818521f045386cd3a1777ca6a0","src/combinator/macros.rs":"df9ba1157bda21313a9c23826baeefd99f54e92c47d60c8dbb25697fe4d52686","src/combinator/mod.rs":"d1b2073683be1c9c4a06d1d3764ac789027ad7401ec726805d1505c1ad8ab1fd","src/error.rs":"ef7feb06b9689aa2f4b11a367b6f7058df8fd151b673c7482edd6600e55e38da","src/internal.rs":"c4029b0e32d41eb6407e517f3102a41a3a80a6a69df4767008ac5656b28d7ab0","src/lib.rs":"f01cdc23cc17201f978796d2d80fb6bba5a9b81ffb4653286e1e53f904079911","src/methods.rs":"56099c30123e92f9f6bacb16017f29fcdbc6546afbf0f80cf4951d2d8093ba83","src/multi/macros.rs":"01d15ae913921bd1ed0ff579a868ea39a314a866e6b5a365ef6b448a75f9b3a8","src/multi/mod.rs":"342c30e0c601558c867df215f7094bc9e43534a7793f2e8b19c114fe07cfea41","src/number/complete.rs":"560dfb2ffbbfe7fe276389b60eec2d717fec20eab68cc72d10d87ff6e2195352","src/number/macros.rs":"e614ee142658c126902a466f29ef250a77016fa126b8dfd59db0c6657a0ef205","src/number/mod.rs":"e432c317ee839a2f928cd0e8e583acadb165ed84fb649e681688a0fcd84b0a75","src/number/streaming.rs":"4c6fbce64e0d535f69d2c928314e1d0a019480db5a09e4f47a654a2e8fd56e8c","src/regexp.rs":"ac6fc61c2e7b629e6786638b44d63d15139c50f9d6a38acd044e4c2b3a699e08","src/sequence/macros.rs":"0e72871cdb2f1bf804f7f637def117c8e531f78cc7da5a6a0e343f0dbfb04271","src/sequence/mod.rs":"ec34b969462703252c4f00c27a03928c9580da612c71b7100e0902190a633ab9","src/str.rs":"fcae4d6f2f7bc921cafe3d0ce682d0566618cbe5f3b3e4b51ca34d11cb0e3e93","src/traits.rs":"2a84c3aa40f1cf78e0149e344da8b85486f7b6c0ddff8f23689bccce0def2260","src/util.rs":"bcedca3c88ac24f11f73e836efd8fe00014562163cc3d43d0cec9d726a4687c3","src/whitespace.rs":"53bddd9d559dc7793effcb828f9c196a7f098338edb0877940d1246834761308","tests/arithmetic.rs":"c57bc547110e498e7bddc973a94202f22356bc525fed55dac4f03daf16eb54f7","tests/arithmetic_ast.rs":"8fbc4c5d8850fa1cf0a16f97e8718d5427b2657f12ca4a0b3b6c1b47fd9e67d4","tests/blockbuf-arithmetic.rs":"099fdf75da97ae032006d8c82ea2207265c5161a08d1370e1ddddb01e73afaf4","tests/css.rs":"b13466eb6a0831f98ede83ffdd752ba821f7d03db724fd92b5bfbc0b9f804a65","tests/custom_errors.rs":"3d2511f8a8d0eb20d9efc19f29ae4ab34389bdd33214a421989d0c47b540b7fd","tests/escaped.rs":"03ecb10828472e4de2ace05a12cb49997b47a113b6a3b0eea3d56bc2bafd8446","tests/float.rs":"92947cc112a6b865f5e19d80edbf300ddc0d0ca4b4e4543eda15337b5c60eedf","tests/inference.rs":"fe476d1367fce9f0baf82295dc037c79321ededf12b9bcc0c5acdc7cefff4720","tests/ini.rs":"04ebf3ead0008974b3bedc387e889bab5942efd0c9c8563fe47e056a9b90bbab","tests/ini_str.rs":"2831a4ee26b37734dba8862cc2972a3a1433abf4fcab253b6cf4fb43f120301d","tests/issues.rs":"142c8d206089b04cf2fd0cbd90f87421ded435ce300516c029294b056354e00f","tests/json.rs":"25476ec2daca19295f5f99b621eecc859a5db5789ac35be381eaf8703a70bce8","tests/mp4.rs":"d0e61bfc93ff40676ca7e9d7813a5ad7c73b1db874599d8f3ea784115bfcab87","tests/multiline.rs":"6a5321cb53c7f88778fa100499533abfa602bada7a6b1d0fbba7ef77b9c110f5","tests/named_args.rs":"bd8095c3abc6fb806c9181c6025c0111d1e7f3b7269ea89ae122bf3bb8ed7e7d","tests/overflow.rs":"d1d6d8ce9b34ed47b42a5f7250ce711805a397691dc6cad3cc8945ec230da161","tests/reborrow_fold.rs":"9328deafc2143c2a2d1a0be86e2448b644cffcb5f0935c8b24eb469f1f9477c0","tests/test1.rs":"06fc9e52638f16bfc3ef69cd26b927e0cf55706d6f132ab7c0f1072208475853"},"package":"0b471253da97532da4b61552249c521e01e736071f71c1a4f7ebbfbf0a06aad6"} \ No newline at end of file +{"files":{"CHANGELOG.md":"f4015ae48bb8f7c672c4fdf1ca4bdde5910f1b423ddc12e9fe80395911759d3e","Cargo.lock":"d7985e783bf7275009ab524f13aac37adc7291838a1956e1f092413ff3b8ea04","Cargo.toml":"72afa6607971579c7009dff34b6b334d4893b1a9f1983cd80364c5e318e4ec2b","LICENSE":"4dbda04344456f09a7a588140455413a9ac59b6b26a1ef7cdf9c800c012d87f0","build.rs":"fd66799ca3bd6a83b10f18a62e6ffc3b1ac94074fe65de4e4c1c447bf71d6ebb","src/bits/complete.rs":"8a60ae4cd6aaf32cb232b598b1a3dda7858c619944ba12ebdb01a31c75243293","src/bits/macros.rs":"8d9ba23f237b4fc01e3b2106002d0f6d59930a42f34d80662c61e0057dfb4a5b","src/bits/mod.rs":"4ca0148b4ef2de4e88796da7831eaa5c4fcbc5515a101eae1b0bc4853c80b5e7","src/bits/streaming.rs":"7c587808476edee57caeccca7dccd744bdfdbb13ae1156400fb4961980fa325d","src/branch/macros.rs":"8b885185725c16369d90954fed8450070bcd4bf8ae7de1df1bb46bb378450d71","src/branch/mod.rs":"d0c871ad7b74428ddccef445a10254249c3907528005a00275e8eb6516255f2f","src/bytes/complete.rs":"107f776885161e48a596962925d2b1628f20fd4bbe5b3777bb34ec175b97e280","src/bytes/macros.rs":"914a821761bbf49f04425068b7426bdd60394e8cc30e7c2193160b16e06c266f","src/bytes/mod.rs":"577231e6e6bd51726a877a73292d8f1c626f6b32ebe4a57943acaed8a8a2975d","src/bytes/streaming.rs":"4b2e577e6057fda932d1edc2ebe53c5df71a21417a304b35d5230dd7221411f3","src/character/complete.rs":"bb80656f3405eca79ba93c674cae7cd296733d784928e5c45754ee27963b7325","src/character/macros.rs":"f330ab60d469802b1664dcbbccd4bfe3e1ca87b348e92609ef34e25b4d475983","src/character/mod.rs":"9f520d535a88849726eac8648aa5c8b86193ab2f3a984d63c8371b846cc0b72c","src/character/streaming.rs":"9be7051951e8d0a54e294542baaf115aeb6efb818521f045386cd3a1777ca6a0","src/combinator/macros.rs":"df9ba1157bda21313a9c23826baeefd99f54e92c47d60c8dbb25697fe4d52686","src/combinator/mod.rs":"d1b2073683be1c9c4a06d1d3764ac789027ad7401ec726805d1505c1ad8ab1fd","src/error.rs":"ef7feb06b9689aa2f4b11a367b6f7058df8fd151b673c7482edd6600e55e38da","src/internal.rs":"c4029b0e32d41eb6407e517f3102a41a3a80a6a69df4767008ac5656b28d7ab0","src/lib.rs":"f01cdc23cc17201f978796d2d80fb6bba5a9b81ffb4653286e1e53f904079911","src/methods.rs":"56099c30123e92f9f6bacb16017f29fcdbc6546afbf0f80cf4951d2d8093ba83","src/multi/macros.rs":"01d15ae913921bd1ed0ff579a868ea39a314a866e6b5a365ef6b448a75f9b3a8","src/multi/mod.rs":"342c30e0c601558c867df215f7094bc9e43534a7793f2e8b19c114fe07cfea41","src/number/complete.rs":"560dfb2ffbbfe7fe276389b60eec2d717fec20eab68cc72d10d87ff6e2195352","src/number/macros.rs":"e614ee142658c126902a466f29ef250a77016fa126b8dfd59db0c6657a0ef205","src/number/mod.rs":"e432c317ee839a2f928cd0e8e583acadb165ed84fb649e681688a0fcd84b0a75","src/number/streaming.rs":"4c6fbce64e0d535f69d2c928314e1d0a019480db5a09e4f47a654a2e8fd56e8c","src/regexp.rs":"ac6fc61c2e7b629e6786638b44d63d15139c50f9d6a38acd044e4c2b3a699e08","src/sequence/macros.rs":"0e72871cdb2f1bf804f7f637def117c8e531f78cc7da5a6a0e343f0dbfb04271","src/sequence/mod.rs":"ec34b969462703252c4f00c27a03928c9580da612c71b7100e0902190a633ab9","src/str.rs":"fcae4d6f2f7bc921cafe3d0ce682d0566618cbe5f3b3e4b51ca34d11cb0e3e93","src/traits.rs":"2a84c3aa40f1cf78e0149e344da8b85486f7b6c0ddff8f23689bccce0def2260","src/util.rs":"bcedca3c88ac24f11f73e836efd8fe00014562163cc3d43d0cec9d726a4687c3","src/whitespace.rs":"53bddd9d559dc7793effcb828f9c196a7f098338edb0877940d1246834761308","tests/arithmetic.rs":"c57bc547110e498e7bddc973a94202f22356bc525fed55dac4f03daf16eb54f7","tests/arithmetic_ast.rs":"8fbc4c5d8850fa1cf0a16f97e8718d5427b2657f12ca4a0b3b6c1b47fd9e67d4","tests/blockbuf-arithmetic.rs":"099fdf75da97ae032006d8c82ea2207265c5161a08d1370e1ddddb01e73afaf4","tests/css.rs":"b13466eb6a0831f98ede83ffdd752ba821f7d03db724fd92b5bfbc0b9f804a65","tests/custom_errors.rs":"3d2511f8a8d0eb20d9efc19f29ae4ab34389bdd33214a421989d0c47b540b7fd","tests/escaped.rs":"03ecb10828472e4de2ace05a12cb49997b47a113b6a3b0eea3d56bc2bafd8446","tests/float.rs":"92947cc112a6b865f5e19d80edbf300ddc0d0ca4b4e4543eda15337b5c60eedf","tests/inference.rs":"fe476d1367fce9f0baf82295dc037c79321ededf12b9bcc0c5acdc7cefff4720","tests/ini.rs":"04ebf3ead0008974b3bedc387e889bab5942efd0c9c8563fe47e056a9b90bbab","tests/ini_str.rs":"2831a4ee26b37734dba8862cc2972a3a1433abf4fcab253b6cf4fb43f120301d","tests/issues.rs":"142c8d206089b04cf2fd0cbd90f87421ded435ce300516c029294b056354e00f","tests/json.rs":"25476ec2daca19295f5f99b621eecc859a5db5789ac35be381eaf8703a70bce8","tests/mp4.rs":"d0e61bfc93ff40676ca7e9d7813a5ad7c73b1db874599d8f3ea784115bfcab87","tests/multiline.rs":"6a5321cb53c7f88778fa100499533abfa602bada7a6b1d0fbba7ef77b9c110f5","tests/named_args.rs":"bd8095c3abc6fb806c9181c6025c0111d1e7f3b7269ea89ae122bf3bb8ed7e7d","tests/overflow.rs":"d1d6d8ce9b34ed47b42a5f7250ce711805a397691dc6cad3cc8945ec230da161","tests/reborrow_fold.rs":"9328deafc2143c2a2d1a0be86e2448b644cffcb5f0935c8b24eb469f1f9477c0","tests/test1.rs":"06fc9e52638f16bfc3ef69cd26b927e0cf55706d6f132ab7c0f1072208475853"},"package":"0b471253da97532da4b61552249c521e01e736071f71c1a4f7ebbfbf0a06aad6"} \ No newline at end of file diff --git a/third_party/rust/nom/.travis.yml b/third_party/rust/nom/.travis.yml deleted file mode 100644 index e18b14079ddde261abd206ce7004bf2579d919bb..0000000000000000000000000000000000000000 --- a/third_party/rust/nom/.travis.yml +++ /dev/null @@ -1,101 +0,0 @@ -language: rust -# sudo is required to enable kcov to use the personality syscall -sudo: required -dist: trusty -cache: cargo - -rust: - - nightly - - beta - - stable - - 1.31.0 - -env: - matrix: - - FEATURES='--features "regexp regexp_macros"' - -before_script: - - eval git pull --rebase https://github.com/Geal/nom master - - eval git log --pretty=oneline HEAD~5..HEAD - -matrix: - include: - - rust: nightly - env: FEATURES='--no-default-features' - - rust: nightly - env: FEATURES='--no-default-features --features "alloc"' - - rust: stable - env: FEATURES='' - - rust: nightly - env: DOC_FEATURES='--features "std lexical regexp regexp_macros" --no-default-features' - before_script: - - export PATH=$HOME/.cargo/bin:$PATH - script: - - eval cargo doc --verbose $DOC_FEATURES - - rust: nightly - env: FEATURES='' - before_script: - - export PATH=$HOME/.cargo/bin:$PATH - - cargo install cargo-update || echo "cargo-update already installed" - - cargo install cargo-travis || echo "cargo-travis already installed" - - cargo install-update -a - - mkdir -p target/kcov-master - script: - cargo coveralls --verbose --all-features - allow_failures: - - rust: stable - env: FEATURES='' - before_script: - - export PATH=$HOME/.cargo/bin:$PATH - - rustup component add rustfmt-preview - script: - - eval cargo fmt -- --write-mode=diff - -notifications: - webhooks: - urls: - - https://webhooks.gitter.im/e/9c035a194ac4fd4cc061 - on_success: change - on_failure: always - on_start: false - - -addons: - apt: - packages: - - libcurl4-openssl-dev - - libelf-dev - - libdw-dev - - binutils-dev - - cmake - sources: - - kalakris-cmake - -cache: - directories: - - /home/travis/.cargo - -before_cache: - - rm -rf /home/travis/.cargo/registry - -script: - - eval cargo build --verbose $FEATURES - - eval cargo test --verbose $FEATURES - -after_success: | - case "$TRAVIS_RUST_VERSION" in - nightly) - if [ "${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH}" != "master" ]; then - git fetch && - git checkout master && - cargo bench --verbose - fi - - if [ "$FEATURES" == '--features "regexp regexp_macros"' ]; then - cargo bench --verbose - fi - ;; - - *) - ;; - esac diff --git a/thunderbird-l10n/ar/localization/ar/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ar/localization/ar/toolkit/about/aboutAddons.ftl index 2f9cf39d8127ac9db165db2ab970004e6e874893..2cac6f21d73921c9bca94959982c91eef9f3d87b 100644 --- a/thunderbird-l10n/ar/localization/ar/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/ar/localization/ar/toolkit/about/aboutAddons.ftl @@ -146,12 +146,26 @@ extensions-view-available-updates = .name = التحديثات المتاحة .tooltiptext = { extensions-view-available-updates.name } addon-category-extension = الامتدادات +addon-category-extension-title = + .title = الامتدادات addon-category-theme = السِمات +addon-category-theme-title = + .title = السِمات addon-category-plugin = الملحقات +addon-category-plugin-title = + .title = الملحقات addon-category-dictionary = القواميس +addon-category-dictionary-title = + .title = القواميس addon-category-locale = اللغات +addon-category-locale-title = + .title = اللغات addon-category-available-updates = التحديثات المتاحة +addon-category-available-updates-title = + .title = التحديثات المتاحة addon-category-recent-updates = التحديثات الأخيرة +addon-category-recent-updates-title = + .title = التحديثات الأخيرة ## These are global warnings diff --git a/thunderbird-l10n/ar/localization/ar/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ar/localization/ar/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..0cd9bee2a675c09f1d9935402a34e9b5ccd3e4a0 --- /dev/null +++ b/thunderbird-l10n/ar/localization/ar/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,16 @@ +# 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/. + +profiledowngrade-window = + .title = فتحت نسخة أقدم من { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = أنشِئ ملفًا شخصيًا +profiledowngrade-nosync = يمكن باستعمال النسخة الأقدم من { -brand-product-name } أن تعطب العلامات وتأريخ التصفّح المحفوظان في ملف { -brand-product-name } الموجود الآن. إن أردت حماية معلوماتك هذه فأنشِئ ملف شخصي جديد لهذه النسخة من { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] اخرج + *[other] أغلِق + } diff --git a/thunderbird-l10n/ar/manifest.json b/thunderbird-l10n/ar/manifest.json index 807c442f174f39a212a3b7d3389c85b8c3f48e28..03cc351861591b71fa7413caec2bb582e9dff5d3 100644 --- a/thunderbird-l10n/ar/manifest.json +++ b/thunderbird-l10n/ar/manifest.json @@ -1,47 +1,50 @@ { + "name": "العربية Language Pack", "languages": { "ar": { + "version": "20200415054235", "chrome_resources": { - "mozldap": "chrome/ar/locale/ar/mozldap/", - "global-platform": { - "linux": "chrome/ar/locale/ar/global-platform/unix/", - "macosx": "chrome/ar/locale/ar/global-platform/mac/", - "android": "chrome/ar/locale/ar/global-platform/unix/", - "win": "chrome/ar/locale/ar/global-platform/win/" - }, "lightning": "chrome/ar/locale/ar/lightning/", - "autoconfig": "chrome/ar/locale/ar/autoconfig/", - "calendar": "chrome/ar/locale/ar/calendar/", "communicator": "chrome/ar/locale/ar/communicator/", - "chat": "chrome/ar/locale/ar/chat/", + "passwordmgr": "chrome/ar/locale/ar/passwordmgr/", "places": "chrome/ar/locale/ar/places/", + "messenger-region": "chrome/ar/locale/ar/messenger-region/", + "mozapps": "chrome/ar/locale/ar/mozapps/", "messenger-newsblog": "chrome/ar/locale/ar/messenger-newsblog/", - "pluginproblem": "chrome/ar/locale/ar/pluginproblem/", "branding": "chrome/ar/locale/ar/branding/", - "messenger-region": "chrome/ar/locale/ar/messenger-region/", - "global": "chrome/ar/locale/ar/global/", - "necko": "chrome/ar/locale/ar/necko/", - "pipnss": "chrome/ar/locale/ar/pipnss/", - "alerts": "chrome/ar/locale/ar/alerts/", - "devtools-startup": "chrome/ar/locale/ar/devtools/startup/", - "messenger": "chrome/ar/locale/ar/messenger/", - "messenger-smime": "chrome/ar/locale/ar/messenger-smime/", "messenger-mapi": "chrome/ar/locale/ar/messenger-mapi/", - "mozapps": "chrome/ar/locale/ar/mozapps/", + "alerts": "chrome/ar/locale/ar/alerts/", + "devtools": "chrome/ar/locale/ar/devtools/client/", + "global": "chrome/ar/locale/ar/global/", + "mozldap": "chrome/ar/locale/ar/mozldap/", + "autoconfig": "chrome/ar/locale/ar/autoconfig/", + "chat": "chrome/ar/locale/ar/chat/", "devtools-shared": "chrome/ar/locale/ar/devtools/shared/", + "messenger-smime": "chrome/ar/locale/ar/messenger-smime/", + "necko": "chrome/ar/locale/ar/necko/", + "global-platform": { + "linux": "chrome/ar/locale/ar/global-platform/unix/", + "android": "chrome/ar/locale/ar/global-platform/unix/", + "macosx": "chrome/ar/locale/ar/global-platform/mac/", + "win": "chrome/ar/locale/ar/global-platform/win/" + }, "pippki": "chrome/ar/locale/ar/pippki/", - "devtools": "chrome/ar/locale/ar/devtools/client/", - "passwordmgr": "chrome/ar/locale/ar/passwordmgr/" - }, - "version": "20200403073814" + "devtools-startup": "chrome/ar/locale/ar/devtools/startup/", + "pipnss": "chrome/ar/locale/ar/pipnss/", + "pluginproblem": "chrome/ar/locale/ar/pluginproblem/", + "calendar": "chrome/ar/locale/ar/calendar/", + "messenger": "chrome/ar/locale/ar/messenger/" + } } }, - "name": "العربية Language Pack", + "langpack_id": "ar", "sources": { "browser": { "base_path": "browser/" } }, + "author": "arabeyes.org (contributors: Ayman Hourieh, Khaled Hosny, Anas Husseini)", + "version": "76.0buildid20200420212409", "description": "Language pack for Thunderbird for ar", "manifest_version": 2, "applications": { @@ -50,8 +53,5 @@ "strict_min_version": "76.0", "id": "langpack-ar@thunderbird.mozilla.org" } - }, - "author": "arabeyes.org (contributors: Ayman Hourieh, Khaled Hosny, Anas Husseini)", - "langpack_id": "ar", - "version": "76.0buildid20200407173003" + } } diff --git a/thunderbird-l10n/ast/localization/ast/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ast/localization/ast/toolkit/about/aboutAddons.ftl index 82ecf2bcfd33ae48063692ed161e4aab49a02eed..378fa689e87263ddd75fb404aca5839cafcf5475 100644 --- a/thunderbird-l10n/ast/localization/ast/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/ast/localization/ast/toolkit/about/aboutAddons.ftl @@ -135,13 +135,29 @@ extensions-view-available-updates = .name = Anovamientos disponibles .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Aconséyase +addon-category-discover-title = + .title = Aconséyase addon-category-extension = Estensiones +addon-category-extension-title = + .title = Estensiones addon-category-theme = Temes +addon-category-theme-title = + .title = Temes addon-category-plugin = Complementos +addon-category-plugin-title = + .title = Complementos addon-category-dictionary = Diccionarios +addon-category-dictionary-title = + .title = Diccionarios addon-category-locale = Llingües +addon-category-locale-title = + .title = Llingües addon-category-available-updates = Anovamientos disponibles +addon-category-available-updates-title = + .title = Anovamientos disponibles addon-category-recent-updates = Anovamientos recientes +addon-category-recent-updates-title = + .title = Anovamientos recientes ## These are global warnings diff --git a/thunderbird-l10n/ast/localization/ast/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ast/localization/ast/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..6fbe8159b2db12df85a3ecca3b73921192c6e43f --- /dev/null +++ b/thunderbird-l10n/ast/localization/ast/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,3 @@ +# 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/. diff --git a/thunderbird-l10n/ast/manifest.json b/thunderbird-l10n/ast/manifest.json index 62233d3959f829bd50053168989e621804a8593e..400c2137b508997f76df2178eeee21a8ec2f911c 100644 --- a/thunderbird-l10n/ast/manifest.json +++ b/thunderbird-l10n/ast/manifest.json @@ -1,57 +1,57 @@ { - "applications": { - "gecko": { - "strict_min_version": "76.0", - "id": "langpack-ast@thunderbird.mozilla.org", - "strict_max_version": "76.*" + "langpack_id": "ast", + "description": "Language pack for Thunderbird for ast", + "name": "Asturianu Language Pack", + "sources": { + "browser": { + "base_path": "browser/" } }, - "description": "Language pack for Thunderbird for ast", + "version": "76.0buildid20200420212409", "languages": { "ast": { "chrome_resources": { - "devtools-startup": "chrome/ast/locale/ast/devtools/startup/", - "places": "chrome/ast/locale/ast/places/", - "passwordmgr": "chrome/ast/locale/ast/passwordmgr/", + "lightning": "chrome/ast/locale/ast/lightning/", "messenger": "chrome/ast/locale/ast/messenger/", "messenger-smime": "chrome/ast/locale/ast/messenger-smime/", - "global": "chrome/ast/locale/ast/global/", + "necko": "chrome/ast/locale/ast/necko/", + "messenger-newsblog": "chrome/ast/locale/ast/messenger-newsblog/", + "communicator": "chrome/ast/locale/ast/communicator/", + "branding": "chrome/ast/locale/ast/branding/", + "devtools-shared": "chrome/ast/locale/ast/devtools/shared/", "global-platform": { "linux": "chrome/ast/locale/ast/global-platform/unix/", "macosx": "chrome/ast/locale/ast/global-platform/mac/", - "win": "chrome/ast/locale/ast/global-platform/win/", - "android": "chrome/ast/locale/ast/global-platform/unix/" + "android": "chrome/ast/locale/ast/global-platform/unix/", + "win": "chrome/ast/locale/ast/global-platform/win/" }, - "messenger-newsblog": "chrome/ast/locale/ast/messenger-newsblog/", "messenger-region": "chrome/ast/locale/ast/messenger-region/", - "pluginproblem": "chrome/ast/locale/ast/pluginproblem/", - "messenger-mapi": "chrome/ast/locale/ast/messenger-mapi/", + "places": "chrome/ast/locale/ast/places/", + "passwordmgr": "chrome/ast/locale/ast/passwordmgr/", "autoconfig": "chrome/ast/locale/ast/autoconfig/", - "communicator": "chrome/ast/locale/ast/communicator/", - "mozapps": "chrome/ast/locale/ast/mozapps/", - "devtools-shared": "chrome/ast/locale/ast/devtools/shared/", + "pipnss": "chrome/ast/locale/ast/pipnss/", + "messenger-mapi": "chrome/ast/locale/ast/messenger-mapi/", + "mozldap": "chrome/ast/locale/ast/mozldap/", "chat": "chrome/ast/locale/ast/chat/", "pippki": "chrome/ast/locale/ast/pippki/", + "mozapps": "chrome/ast/locale/ast/mozapps/", + "global": "chrome/ast/locale/ast/global/", + "devtools-startup": "chrome/ast/locale/ast/devtools/startup/", + "pluginproblem": "chrome/ast/locale/ast/pluginproblem/", + "devtools": "chrome/ast/locale/ast/devtools/client/", "alerts": "chrome/ast/locale/ast/alerts/", - "necko": "chrome/ast/locale/ast/necko/", - "branding": "chrome/ast/locale/ast/branding/", - "lightning": "chrome/ast/locale/ast/lightning/", - "pipnss": "chrome/ast/locale/ast/pipnss/", - "calendar": "chrome/ast/locale/ast/calendar/", - "mozldap": "chrome/ast/locale/ast/mozldap/", - "devtools": "chrome/ast/locale/ast/devtools/client/" + "calendar": "chrome/ast/locale/ast/calendar/" }, - "version": "20200403073839" + "version": "20200415054300" } }, "manifest_version": 2, "author": "softastur.org (contributors: Softastur)", - "name": "Asturianu Language Pack", - "version": "76.0buildid20200407173003", - "langpack_id": "ast", - "sources": { - "browser": { - "base_path": "browser/" + "applications": { + "gecko": { + "strict_max_version": "76.*", + "strict_min_version": "76.0", + "id": "langpack-ast@thunderbird.mozilla.org" } } } diff --git a/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/debugger.properties b/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/debugger.properties index 39107afc74a577c43600b4021ffb1da78438b80c..5d3f36b2625cdabadbdd543cfbde32673adbba63 100644 --- a/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/debugger.properties +++ b/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/debugger.properties @@ -55,6 +55,41 @@ setDirectoryRoot.accesskey=к removeDirectoryRoot.label=Выдаліць каранёвы каталог removeDirectoryRoot.accesskey=к +# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item +blackBoxAll.label=Чорная скрыня + +# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected group +blackBoxAllInGroup.label=У чорную скрыню файлы гэтай групы + +# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected group +unblackBoxAllInGroup.label=З чорнай скрыні файлы гэтай групы + +# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected group +blackBoxAllOutsideGroup.label=У чорную скрыню файлы па-за гэтай групай + +# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to unblackbox all files outside of the selected group +unblackBoxAllOutsideGroup.label=З чорнай скрыні файлы па-за гэтай групай + +# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected directory +blackBoxAllInDir.label=У чорную скрыню файлы гэтага каталога + +# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected directory +unblackBoxAllInDir.label=З чорнай скрыні файлы гэтага каталога + +# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected directory +blackBoxAllOutsideDir.label=У чорную скрыню файлы па-за гэтым каталогам + +# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the +# context submenu to unblackbox all files outside of the selected directory +unblackBoxAllOutsideDir.label=З чорнай скрыні файлы па-за гэтым каталогам + # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the # context menu to copy the function the user selected copyFunction.label=Капіяваць функцыю @@ -1054,11 +1089,6 @@ whyPaused.mutationBreakpointRemoved=Выдалена: # a JS execution whyPaused.interrupted=Прыпынена на выкананні -# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed -# in a info block explaining how the debugger is currently paused in a -# recording. -whyPaused.replayForcedPause=Прыпынена ў час запісу - # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed # in a info block explaining how the debugger is currently paused while stepping # in or out of the stack @@ -1287,30 +1317,3 @@ serviceWorkerInfo.redundant=залішні # LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a # service worker that is in an unknown state. serviceWorkerInfo.unknown=невядомы - -# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item -blackBoxAll.label=Blackbox -# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the -# context submenu to blackbox all files inside of the selected group -blackBoxAllInGroup.label=Blackbox files in this group -# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the -# context submenu to unblackbox all files inside of the selected group -unblackBoxAllInGroup.label=Unblackbox files in this group -# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the -# context submenu to blackbox all files outside of the selected group -blackBoxAllOutsideGroup.label=Blackbox files outside this group -# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the -# context submenu to unblackbox all files outside of the selected group -unblackBoxAllOutsideGroup.label=Unblackbox files outside this group -# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the -# context submenu to blackbox all files inside of the selected directory -blackBoxAllInDir.label=Blackbox files in this directory -# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the -# context submenu to unblackbox all files inside of the selected directory -unblackBoxAllInDir.label=Unblackbox files in this directory -# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the -# context submenu to blackbox all files outside of the selected directory -blackBoxAllOutsideDir.label=Blackbox files outside this directory -# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the -# context submenu to unblackbox all files outside of the selected directory -unblackBoxAllOutsideDir.label=Unblackbox files outside this directory diff --git a/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/inspector.properties b/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/inspector.properties index a0acb3367f88b957e32729b2c74356f50256a6e8..9331cf84dc5e41a2b828070dbd8b701aa1c65c18 100644 --- a/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/inspector.properties +++ b/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Гэты элемент мае перапаў # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Няма звязаных правілаў +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Утрымлівайце Shift і клікніце, каб перайсці да правіла + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/jsonview.properties b/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/jsonview.properties index ba9ec2d027ec87a29f4a50cf579ea7f88330ce9b..3bd7160d40ad61a159db4a1db02c03a77e399f71 100644 --- a/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/jsonview.properties +++ b/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/jsonview.properties @@ -32,6 +32,8 @@ jsonViewer.Copy=Капіраваць # LOCALIZATION NOTE (jsonViewer.ExpandAll): Label for expanding all nodes jsonViewer.ExpandAll=Разгарнуць усё +jsonViewer.ExpandAllSlow=Разгарнуць усе (павольна) + # LOCALIZATION NOTE (jsonViewer.CollapseAll): Label for collapsing all nodes jsonViewer.CollapseAll=Згарнуць усе @@ -50,5 +52,3 @@ jsonViewer.filterJSON=Фільтр JSON # LOCALIZATION NOTE (jsonViewer.reps.reference): Label used for cycle # references in an array. jsonViewer.reps.reference=Цыклічная спасылка - -jsonViewer.ExpandAllSlow=Expand All (slow) diff --git a/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/netmonitor.properties b/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/netmonitor.properties index aa1ed452bcb4300a58290efe1e589e7e6ec504e1..a049ac97105c9346588120bd2918b10c25462a19 100644 --- a/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/netmonitor.properties +++ b/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/netmonitor.properties @@ -351,6 +351,10 @@ netmonitor.timings.startedAt=Запушчана: %S # %S is time expressed in milliseconds or minutes. netmonitor.timings.downloadedAt=Сцягнута: %S +# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the +# timings pane when thea request has been blocked +netmonitor.timings.noTimings=У гэтым запыце няма памераў часу + # LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed # in the network menu specifying timing interval divisions (in milliseconds). networkMenu.millisecond=%S мс @@ -761,6 +765,14 @@ netmonitor.ws.context.received=Атрыманыя # for the "Received" menu item displayed in the context menu in the websocket toolbar. netmonitor.ws.context.received.accesskey=А +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed +# on the context menu that shows "Control Frames" WebSocket frames. +netmonitor.ws.context.controlFrames=Кіраванне + +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key +# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. +netmonitor.ws.context.controlFrames.accesskey=К + # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed # on the context menu that shows "Copy Message". netmonitor.ws.context.copyFrame=Капіяваць паведамленне @@ -781,11 +793,6 @@ netmonitor.ws.type.sent=Дасланыя # accessible text for the "received" type icon in the websocket table's "data" column. netmonitor.ws.type.received=Атрыманыя -# LOCALIZATION NOTE (netmonitor.ws.time.format): This is the format used for the -# time values in the websocket table's "time" column -# %1$S is the formatted hour-minutes-seconds, %2$S is the milliseconds (zero-padded) -netmonitor.ws.time.format=%1$S.%2$S - # LOCALIZATION NOTE (netmonitor.ws.rawData.header): This is the label displayed # in the messages panel identifying the raw data. netmonitor.ws.rawData.header=Неапрацаваныя дадзеныя (%S) @@ -1526,13 +1533,3 @@ netmonitor.cache.lastModified=Апошняе змяненне # LOCALIZATION NOTE (netmonitor.cache.device): This is the label text for the device # where a cached object was fetched from (e.g. "disk"). netmonitor.cache.device=Прылада - -# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the -# timings pane when thea request has been blocked -netmonitor.timings.noTimings=No timings for this request -# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed -# on the context menu that shows "Control Frames" WebSocket frames. -netmonitor.ws.context.controlFrames=Control -# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key -# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. -netmonitor.ws.context.controlFrames.accesskey=o diff --git a/thunderbird-l10n/be/chrome/be/locale/be/global-platform/mac/accessible.properties b/thunderbird-l10n/be/chrome/be/locale/be/global-platform/mac/accessible.properties index 0ec544f166b59632106eb5019c102007fdf5797a..f561a1499a4944bcba3b088d03269e1f41c78b71 100644 --- a/thunderbird-l10n/be/chrome/be/locale/be/global-platform/mac/accessible.properties +++ b/thunderbird-l10n/be/chrome/be/locale/be/global-platform/mac/accessible.properties @@ -58,8 +58,7 @@ separator = раздзяляльнік tabPanel = стужка картак # The roleDescription for the html:mark element highlight = вылучэнне - # The roleDescription for the details element -details = details +details = падрабязнасці # The roleDescription for the summary element -summary = summary +summary = зводка diff --git a/thunderbird-l10n/be/chrome/be/locale/be/global/css.properties b/thunderbird-l10n/be/chrome/be/locale/be/global/css.properties index 8b06ed983b2cf7e138e4a23ed2ddc83f7b250a9a..2bf7d48332a8b44620a862e2d31288828e15edfc 100644 --- a/thunderbird-l10n/be/chrome/be/locale/be/global/css.properties +++ b/thunderbird-l10n/be/chrome/be/locale/be/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=Табліца стыляў %1$S загружана як CSS не PEUnexpEOF2=Нечаканы канец файла падчас пошуку %1$S. PEParseRuleWSOnly=Дадзены толькі-прагальны радок для разбірання як правіла. + PEDeclDropped=Абвяшчэнне адкінута. PEDeclSkipped=Прапушчана да наступнага абвяшчэння. PEUnknownProperty=Невядомая ўласцівасць '%1$S'. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Толькі адзін repeat(auto-fi PEMoreThanOneGridRepeatAutoFillFitInTrackList=У спісе трэкаў дапускаецца толькі адзін repeat(auto-fill, …) або repeat(auto-fit, …). PEMoreThanOneGridRepeatTrackSize=Унутры repeat(auto-fit/auto-fill, …) дазволены толькі адзін памер трэка. +PEDisallowedImportRule=Правілы @import яшчэ не дзейнічаюць у створаных табліцах стыляў. + TooLargeDashedRadius=Радыус скруглення занадта вялікі для стылю ‘dashed’ (мяжа - 100000 пікселяў). Візуалізую як суцэльны. TooLargeDottedRadius=Радыус скруглення занадта вялікі для стылю ‘dotted’ (мяжа - 100000 пікселяў). Візуалізую як суцэльны. diff --git a/thunderbird-l10n/be/chrome/be/locale/be/global/dom/dom.properties b/thunderbird-l10n/be/chrome/be/locale/be/global/dom/dom.properties index fcba5da9e1b253753ffe97af9572199d7a35badc..3adbceb5bee11f893c201c0abfdd12f98bd47259 100644 --- a/thunderbird-l10n/be/chrome/be/locale/be/global/dom/dom.properties +++ b/thunderbird-l10n/be/chrome/be/locale/be/global/dom/dom.properties @@ -424,6 +424,5 @@ MathML_DeprecatedStyleAttributeWarning=Атрыбуты MathML “background”, MathML_DeprecatedXLinkAttributeWarning=XLink-атрыбуты “href”, “type”, “show” and “actuate” на элементах MathML састарэлі і будуць выдалены ў будучыні. WebShareAPI_Failed=Абагуленне не ўдалося. WebShareAPI_Aborted=Абагуленне было спынена. - # LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL. -UnknownProtocolNavigationPrevented=Prevented navigation to “%1$S” due to an unknown protocol. +UnknownProtocolNavigationPrevented=Пераход да “%1$S” не дазволены з-за нявызначанага пратакола. diff --git a/thunderbird-l10n/be/chrome/be/locale/be/global/security/security.properties b/thunderbird-l10n/be/chrome/be/locale/be/global/security/security.properties index 46669e8a5affa5c52f54a430bbcf5ba4faf27d8d..c9907fa080bf379e5fbdda3312f5be052f8fa7c0 100644 --- a/thunderbird-l10n/be/chrome/be/locale/be/global/security/security.properties +++ b/thunderbird-l10n/be/chrome/be/locale/be/global/security/security.properties @@ -147,13 +147,16 @@ XFODeny = Загрузка забаронена праз X-Frame-Options: “%1$ # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Загрузка забаронена праз X-Frame-Options: “%1$S” з “%2$S”, сайт не дазваляе cross-origin фрэймінг з “%3$S”. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Знойдзены нядзейсны загаловак X-Frame-Options у час чытання “%2$S”: “%1$S” не ёсць дзейснай дырэктываю. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=Загрузка “%2$S” ў кадры адмоўлена дырэктываю “X-Frame-Options“, усталяванай у “%1$S“. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Абнаўляецца не бяспечны запыт “%1$S” для выкарыстання “%2$S”. # LOCALIZATION NOTE: %1$S is the URL of request. -HTTPSOnlyNoUpgrade = Запыт для “%1$S” не быў абноўлены, бо ён мае сцяг NoUpgrade. - -# LOCALIZATION NOTE: %1$S is the URL of request. -HTTPSOnlyNoUpgradeException = Not upgrading insecure request “%1$S” because it is exempt. +HTTPSOnlyNoUpgradeException = Не абнаўляецца не бяспечны запыт “%1$S”, паколькі ён вызвалены. # LOCALIZATION NOTE: %1$S is the URL of the failed request; %2$S is an error-code. -HTTPSOnlyFailedRequest = Upgrading insecure request “%1$S” failed. (%2$S) +HTTPSOnlyFailedRequest = Абнаўленне не бяспечнага запыту “%1$S” не ўдалося. (“%2$S”) diff --git a/thunderbird-l10n/be/chrome/be/locale/be/necko/necko.properties b/thunderbird-l10n/be/chrome/be/locale/be/necko/necko.properties index 8886b4605cdabe2e0f7dce9c35d9dd78cde057a1..7b2d9a1f01fd6d4e5fadc18d0ecf590a25407948 100644 --- a/thunderbird-l10n/be/chrome/be/locale/be/necko/necko.properties +++ b/thunderbird-l10n/be/chrome/be/locale/be/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Доступ да сховішча а # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Доступ да сховішча аўтаматычна дадзены трэкеру “%2$S” на “%1$S”. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Доступ да сховішча аўтаматычна дадзены для асноўнай ізаляцыі “%2$S” на “%1$S”. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Кукі “%1$S” адхілены, таму што яны маюць атрыбут “sameSite=none”, але адсутнічае атрыбут “secure”. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". @@ -67,8 +70,7 @@ CookieLaxForced=Кукі “%1$S” маюць палітыку “sameSite” CookieLaxForcedForBeta=Кукі “%1$S” не маюць належнага значэння атрыбута “sameSite”. Хутка кукі без атрыбута “sameSite” або з недапушчальным яго значэннем будуць трактавацца як “lax”. Гэта азначае, што гэтыя кукі больш не будуць дасылацца ў кантэкстах трэцяга боку. Калі ваша праграма залежыць ад даступнасці кукаў у гэтых кантэкстах, дадайце да іх атрыбут “sameSite=none“. Каб даведацца больш пра атрыбут “sameSite“, прачытайце %2$S # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none" CookieSameSiteValueInvalid=Недапушчальнае значэнне “sameSite“ для кукі “%1$S”. Падтрымліваюцца значэнні: “lax“, “strict“, “none“. - # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookieOversize=Cookie “%1$S” is invalid because its size is too big. Max size is %2$S B. +CookieOversize=Кука “%1$S” нядзейсная, бо яе памер надта вялікі. Максімальны памер %2$S Б. # LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B. +CookiePathOversize=Кука “%1$S” нядзейсная, бо памер яе шляху надта вялікі. Максімальны памер %2$S Б. diff --git a/thunderbird-l10n/be/localization/be/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/be/localization/be/devtools/client/aboutdebugging.ftl index 3ebbffcbd6fc35f4de31e17c3d51fa4f17e9078b..b3fa815f9bb3e9a44156d9f2afe6fb9fed85ac42 100644 --- a/thunderbird-l10n/be/localization/be/devtools/client/aboutdebugging.ftl +++ b/thunderbird-l10n/be/localization/be/devtools/client/aboutdebugging.ftl @@ -186,6 +186,9 @@ about-debugging-browser-version-too-old = Падключаны браўзер м # backward compatible changes broke the debugger in those scenarios (Bug 1528219). # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1") about-debugging-browser-version-too-old-67-debugger = Панэль адладчыка не можа працаваць з падлучаным браўзерам. Калі ласка, выкарыстоўвайце Firefox { $runtimeVersion }, калі вам трэба выкарыстоўваць адладчык з гэтым браўзерам. +# Dedicated message for a backward compatibility issue that occurs when connecting: +# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68. +about-debugging-browser-version-too-old-fennec = Гэта версія Firefox не можа адладзіць Firefox для Android (68). Рэкамендуем усталяваць Firefox для Android Nightly на ваш тэлефон для тэставання. <a>Падрабязней</a> # This string is displayed in the runtime page if the remote browser version is too recent. # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd) diff --git a/thunderbird-l10n/be/localization/be/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/be/localization/be/toolkit/about/aboutAddons.ftl index daa8d3cb7dc8474cf08377bf438aa7faa1aa11ba..35e0530e14e7b062d003f6351d35ee7555aee12a 100644 --- a/thunderbird-l10n/be/localization/be/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/be/localization/be/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Усталяваць дадатак з файла… .accesskey = У help-button = Падтрымка дадаткаў +sidebar-help-button-title = + .title = Падтрымка дадаткаў preferences = { PLATFORM() -> [windows] Налады { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Прылады для ўсіх дадаткаў +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Налады { -brand-short-name } + *[other] Параметры { -brand-short-name } + } show-unsigned-extensions-button = .label = Некаторыя пашырэнні не могуць быць правераны show-all-extensions-button = @@ -170,13 +178,29 @@ extensions-view-available-updates = .name = Даступныя абнаўленні .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Рэкамендацыі +addon-category-discover-title = + .title = Рэкамендацыі addon-category-extension = Пашырэнні +addon-category-extension-title = + .title = Пашырэнні addon-category-theme = Тэмы +addon-category-theme-title = + .title = Тэмы addon-category-plugin = Плагіны +addon-category-plugin-title = + .title = Плагіны addon-category-dictionary = Слоўнікі +addon-category-dictionary-title = + .title = Слоўнікі addon-category-locale = Мовы +addon-category-locale-title = + .title = Мовы addon-category-available-updates = Даступныя абнаўленні +addon-category-available-updates-title = + .title = Даступныя абнаўленні addon-category-recent-updates = Нядаўнія абнаўленні +addon-category-recent-updates-title = + .title = Нядаўнія абнаўленні ## These are global warnings @@ -289,6 +313,7 @@ shortcuts-no-commands = Наступныя пашырэнні не маюць с shortcuts-input = .placeholder = Увядзіце спалучэнне клавіш shortcuts-browserAction = Актываваць пашырэнне +shortcuts-browserAction2 = Актываваць кнопку на паліцы прылад shortcuts-pageAction = Актываваць дзеянні старонкі shortcuts-sidebarAction = Паказаць/схаваць бакавую панэль shortcuts-modifier-mac = Улучыце Ctrl, Alt або ⌘ @@ -315,6 +340,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Паказаць менш go-back-button = .tooltiptext = Вярнуцца +header-back-button = + .title = Вярнуцца ## Recommended add-ons page diff --git a/thunderbird-l10n/be/localization/be/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/be/localization/be/toolkit/about/aboutSupport.ftl index e07f6c71a2cb547083cb177f3584a00ca4b9c04f..791d1a077c061f15827135f4be3be3142151e5bd 100644 --- a/thunderbird-l10n/be/localization/be/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/be/localization/be/toolkit/about/aboutSupport.ftl @@ -295,6 +295,11 @@ sandbox-proc-type-content = змесціва sandbox-proc-type-file = змесціва файла sandbox-proc-type-media-plugin = медыяплагін sandbox-proc-type-data-decoder = дэкодар даных +startup-cache-title = Кэш запуску +startup-cache-disk-cache-path = Шлях да дыскавага кэшу +startup-cache-ignore-disk-cache = Ігнараваць дыскавы кэш +startup-cache-found-disk-cache-on-init = Знойдзены дыскавы кэш пры ініцыялізацыі +startup-cache-wrote-to-disk-cache = Запісаны ў дыскавы кэш launcher-process-status-0 = Уключана launcher-process-status-1 = Адключана з-за збою launcher-process-status-2 = Прымусова адключана @@ -318,6 +323,7 @@ touch-enabled = пальцавы увод ўключаны drag-enabled = захоп стужкі прагорткі ўключаны keyboard-enabled = клавіятура ўключана autoscroll-enabled = аўтапракрутка ўключана +zooming-enabled = уключана плаўнае маштабаванне жэстам ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/be/localization/be/toolkit/about/certviewer.ftl b/thunderbird-l10n/be/localization/be/toolkit/about/certviewer.ftl index ef7f5806d43399db3f840fba334e7eb5340afba1..11c0a0a1c3970f1e90600e6d8891f44223bbdc38 100644 --- a/thunderbird-l10n/be/localization/be/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/be/localization/be/toolkit/about/certviewer.ftl @@ -29,6 +29,8 @@ certificate-viewer-id = ID certificate-viewer-key-exchange-group = Група абмену ключамі certificate-viewer-key-id = Ідэнтыфікатар ключа certificate-viewer-key-size = Памер ключа +# Inc. means Incorporated, e.g GitHub is incorporated in Delaware +certificate-viewer-inc-locality = Месцазнаходжанне certificate-viewer-locality = Месцазнаходжанне certificate-viewer-location = Размяшчэнне certificate-viewer-logid = Ідэнтыфікатар журнала @@ -95,3 +97,16 @@ certificate-viewer-download-pem = PEM (сертыфікат) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (ланцужок) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Гэта пашырэнне пазначана як крытычнае, гэта значыць, што кліенты павінны адхіліць сертыфікат, калі не разумеюць яго. +certificate-viewer-export = Экспарт + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Вашы сертыфікаты +certificate-viewer-tab-people = Асобы +certificate-viewer-tab-servers = Серверы +certificate-viewer-tab-ca = Установы +certificate-viewer-tab-unkonwn = Невядома diff --git a/thunderbird-l10n/be/localization/be/toolkit/global/processTypes.ftl b/thunderbird-l10n/be/localization/be/toolkit/global/processTypes.ftl index 7fb588d8a22099e5eab722cd0196865fa2a0b6e6..4494bb611cde8524c03620823e90a1fd2bb515bb 100644 --- a/thunderbird-l10n/be/localization/be/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/be/localization/be/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Ізаляванае сеціўнае змесців # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Сокет diff --git a/thunderbird-l10n/be/localization/be/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/be/localization/be/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..57a77d7e42c8460a403c6232ff6afdf35587ebbb --- /dev/null +++ b/thunderbird-l10n/be/localization/be/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Вы запусцілі старую версію { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Стварыць новы профіль +profiledowngrade-sync = Выкарыстанне старой версіі { -brand-product-name } можа пашкодзіць закладкі і гісторыю аглядання, ужо захаваныя ў наяўным профілі { -brand-product-name }. Каб абараніць свае звесткі, стварыце новы профіль для гэтай усталёўкі { -brand-short-name }. Вы заўсёды можаце ўвайсці ў { -fxaccount-brand-name }, каб сінхранізаваць паміж профілямі свае закладкі і гісторыю аглядання. +profiledowngrade-nosync = Выкарыстанне старой версіі { -brand-product-name } можа пашкодзіць закладкі і гісторыю аглядання, ужо захаваныя ў наяўным профілі { -brand-product-name }. Каб абараніць свае звесткі, стварыце новы профіль для гэтай усталёўкі { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Выйсці + *[other] Выйсці + } diff --git a/thunderbird-l10n/be/manifest.json b/thunderbird-l10n/be/manifest.json index 4da53193e4a74bbe34e8e9b07e870caefee21e6a..dc6dc315471096395c531a83c52bc1f45e47fa52 100644 --- a/thunderbird-l10n/be/manifest.json +++ b/thunderbird-l10n/be/manifest.json @@ -1,11 +1,4 @@ { - "sources": { - "browser": { - "base_path": "browser/" - } - }, - "version": "76.0buildid20200407173003", - "description": "Language pack for Thunderbird for be", "applications": { "gecko": { "strict_max_version": "76.*", @@ -13,45 +6,52 @@ "strict_min_version": "76.0" } }, - "author": "mozilla.org (contributors: mozilla by)", - "name": "Беларуская Language Pack", "languages": { "be": { + "version": "20200419181427", "chrome_resources": { - "places": "chrome/be/locale/be/places/", - "devtools-startup": "chrome/be/locale/be/devtools/startup/", - "devtools": "chrome/be/locale/be/devtools/client/", + "lightning": "chrome/be/locale/be/lightning/", + "global": "chrome/be/locale/be/global/", "messenger-smime": "chrome/be/locale/be/messenger-smime/", - "messenger": "chrome/be/locale/be/messenger/", - "pippki": "chrome/be/locale/be/pippki/", + "calendar": "chrome/be/locale/be/calendar/", + "passwordmgr": "chrome/be/locale/be/passwordmgr/", + "necko": "chrome/be/locale/be/necko/", + "pluginproblem": "chrome/be/locale/be/pluginproblem/", "pipnss": "chrome/be/locale/be/pipnss/", - "lightning": "chrome/be/locale/be/lightning/", - "messenger-region": "chrome/be/locale/be/messenger-region/", + "mozapps": "chrome/be/locale/be/mozapps/", "chat": "chrome/be/locale/be/chat/", "branding": "chrome/be/locale/be/branding/", - "mozldap": "chrome/be/locale/be/mozldap/", + "messenger-mapi": "chrome/be/locale/be/messenger-mapi/", + "places": "chrome/be/locale/be/places/", + "pippki": "chrome/be/locale/be/pippki/", + "communicator": "chrome/be/locale/be/communicator/", + "devtools-startup": "chrome/be/locale/be/devtools/startup/", "alerts": "chrome/be/locale/be/alerts/", - "devtools-shared": "chrome/be/locale/be/devtools/shared/", - "necko": "chrome/be/locale/be/necko/", - "global": "chrome/be/locale/be/global/", + "devtools": "chrome/be/locale/be/devtools/client/", + "messenger-region": "chrome/be/locale/be/messenger-region/", "global-platform": { - "win": "chrome/be/locale/be/global-platform/win/", - "android": "chrome/be/locale/be/global-platform/unix/", + "macosx": "chrome/be/locale/be/global-platform/mac/", "linux": "chrome/be/locale/be/global-platform/unix/", - "macosx": "chrome/be/locale/be/global-platform/mac/" + "win": "chrome/be/locale/be/global-platform/win/", + "android": "chrome/be/locale/be/global-platform/unix/" }, - "mozapps": "chrome/be/locale/be/mozapps/", - "communicator": "chrome/be/locale/be/communicator/", "autoconfig": "chrome/be/locale/be/autoconfig/", - "messenger-mapi": "chrome/be/locale/be/messenger-mapi/", - "pluginproblem": "chrome/be/locale/be/pluginproblem/", - "calendar": "chrome/be/locale/be/calendar/", - "passwordmgr": "chrome/be/locale/be/passwordmgr/", - "messenger-newsblog": "chrome/be/locale/be/messenger-newsblog/" - }, - "version": "20200403073904" + "messenger-newsblog": "chrome/be/locale/be/messenger-newsblog/", + "mozldap": "chrome/be/locale/be/mozldap/", + "devtools-shared": "chrome/be/locale/be/devtools/shared/", + "messenger": "chrome/be/locale/be/messenger/" + } + } + }, + "sources": { + "browser": { + "base_path": "browser/" } }, + "name": "Беларуская Language Pack", + "description": "Language pack for Thunderbird for be", "manifest_version": 2, - "langpack_id": "be" + "author": "mozilla.org (contributors: mozilla by)", + "langpack_id": "be", + "version": "76.0buildid20200420212409" } diff --git a/thunderbird-l10n/bg/localization/bg/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/bg/localization/bg/toolkit/about/aboutAddons.ftl index b21a449940320a8747c47c932155c2d761cd8a83..329dac9afd010b6e5a64267ecb295992bb35100b 100644 --- a/thunderbird-l10n/bg/localization/bg/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/bg/localization/bg/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Инсталиране на добавка от файл… .accesskey = И help-button = Поддръжка +sidebar-help-button-title = + .title = Поддръжка preferences = { PLATFORM() -> [windows] Настройки на { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Инструменти за всички добавки +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Настройки на { -brand-short-name } + *[other] Настройки на { -brand-short-name } + } show-unsigned-extensions-button = .label = Някои разширения не можаха да бъдат проверени show-all-extensions-button = @@ -163,13 +171,29 @@ extensions-view-available-updates = .name = Налични обновявания .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Препоръки +addon-category-discover-title = + .title = Препоръки addon-category-extension = Разширения +addon-category-extension-title = + .title = Разширения addon-category-theme = Теми +addon-category-theme-title = + .title = Теми addon-category-plugin = Приставки +addon-category-plugin-title = + .title = Приставки addon-category-dictionary = Речници +addon-category-dictionary-title = + .title = Речници addon-category-locale = Езици +addon-category-locale-title = + .title = Езици addon-category-available-updates = Налични обновявания +addon-category-available-updates-title = + .title = Налични обновявания addon-category-recent-updates = Скорошни обновявания +addon-category-recent-updates-title = + .title = Скорошни обновявания ## These are global warnings @@ -301,6 +325,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = По-малко go-back-button = .tooltiptext = Назад +header-back-button = + .title = Назад ## Recommended add-ons page diff --git a/thunderbird-l10n/bg/localization/bg/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/bg/localization/bg/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..c107f2a0130a7798933326e0731a30ec2188527a --- /dev/null +++ b/thunderbird-l10n/bg/localization/bg/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,15 @@ +# 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/. + +profiledowngrade-window = + .title = Отворихте по-стара версия на { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Създаване на профил +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Изход + *[other] Изход + } diff --git a/thunderbird-l10n/bg/manifest.json b/thunderbird-l10n/bg/manifest.json index 137a8a6c0a778b4dfe394dd767f85790192922dd..71916bb49faf17191f5731995ac4a9d67f98754a 100644 --- a/thunderbird-l10n/bg/manifest.json +++ b/thunderbird-l10n/bg/manifest.json @@ -1,53 +1,53 @@ { - "version": "76.0buildid20200407173003", - "langpack_id": "bg", - "manifest_version": 2, - "name": "Български Language Pack", "description": "Language pack for Thunderbird for bg", "languages": { "bg": { - "version": "20200403073916", "chrome_resources": { - "messenger": "chrome/bg/locale/bg/messenger/", - "lightning": "chrome/bg/locale/bg/lightning/", + "devtools-shared": "chrome/bg/locale/bg/devtools/shared/", "devtools": "chrome/bg/locale/bg/devtools/client/", - "calendar": "chrome/bg/locale/bg/calendar/", - "autoconfig": "chrome/bg/locale/bg/autoconfig/", - "messenger-newsblog": "chrome/bg/locale/bg/messenger-newsblog/", - "pipnss": "chrome/bg/locale/bg/pipnss/", - "passwordmgr": "chrome/bg/locale/bg/passwordmgr/", + "messenger": "chrome/bg/locale/bg/messenger/", + "messenger-mapi": "chrome/bg/locale/bg/messenger-mapi/", "alerts": "chrome/bg/locale/bg/alerts/", - "places": "chrome/bg/locale/bg/places/", + "messenger-smime": "chrome/bg/locale/bg/messenger-smime/", + "pipnss": "chrome/bg/locale/bg/pipnss/", + "necko": "chrome/bg/locale/bg/necko/", + "mozldap": "chrome/bg/locale/bg/mozldap/", "devtools-startup": "chrome/bg/locale/bg/devtools/startup/", + "pippki": "chrome/bg/locale/bg/pippki/", + "lightning": "chrome/bg/locale/bg/lightning/", "messenger-region": "chrome/bg/locale/bg/messenger-region/", - "messenger-smime": "chrome/bg/locale/bg/messenger-smime/", "mozapps": "chrome/bg/locale/bg/mozapps/", "branding": "chrome/bg/locale/bg/branding/", "chat": "chrome/bg/locale/bg/chat/", - "global": "chrome/bg/locale/bg/global/", "global-platform": { + "linux": "chrome/bg/locale/bg/global-platform/unix/", "win": "chrome/bg/locale/bg/global-platform/win/", - "android": "chrome/bg/locale/bg/global-platform/unix/", "macosx": "chrome/bg/locale/bg/global-platform/mac/", - "linux": "chrome/bg/locale/bg/global-platform/unix/" + "android": "chrome/bg/locale/bg/global-platform/unix/" }, - "communicator": "chrome/bg/locale/bg/communicator/", "pluginproblem": "chrome/bg/locale/bg/pluginproblem/", - "devtools-shared": "chrome/bg/locale/bg/devtools/shared/", - "pippki": "chrome/bg/locale/bg/pippki/", - "mozldap": "chrome/bg/locale/bg/mozldap/", - "necko": "chrome/bg/locale/bg/necko/", - "messenger-mapi": "chrome/bg/locale/bg/messenger-mapi/" - } + "places": "chrome/bg/locale/bg/places/", + "calendar": "chrome/bg/locale/bg/calendar/", + "autoconfig": "chrome/bg/locale/bg/autoconfig/", + "global": "chrome/bg/locale/bg/global/", + "passwordmgr": "chrome/bg/locale/bg/passwordmgr/", + "messenger-newsblog": "chrome/bg/locale/bg/messenger-newsblog/", + "communicator": "chrome/bg/locale/bg/communicator/" + }, + "version": "20200415054336" } }, + "manifest_version": 2, + "name": "Български Language Pack", + "langpack_id": "bg", "applications": { "gecko": { - "id": "langpack-bg@thunderbird.mozilla.org", + "strict_max_version": "76.*", "strict_min_version": "76.0", - "strict_max_version": "76.*" + "id": "langpack-bg@thunderbird.mozilla.org" } }, + "version": "76.0buildid20200420212409", "sources": { "browser": { "base_path": "browser/" diff --git a/thunderbird-l10n/br/chrome/br/locale/br/global/layout_errors.properties b/thunderbird-l10n/br/chrome/br/locale/br/global/layout_errors.properties index 6faf5042556e9a258017f752345c6ef21e6131a1..57d346c7e0d013f3584fe5671e47d20eb75b7b12 100644 --- a/thunderbird-l10n/br/chrome/br/locale/br/global/layout_errors.properties +++ b/thunderbird-l10n/br/chrome/br/locale/br/global/layout_errors.properties @@ -39,10 +39,20 @@ CompositorAnimationWarningTransformFrameInactive=N'hall ket ar bliverezh bezañ CompositorAnimationWarningOpacityFrameInactive=N'hall ket ar bliverezh bezañ erounezet war ar c'henaozer dre ma n'eo ket bet merket gweredekaet ar framm evit ar bliverezh 'opacity' CompositorAnimationWarningHasRenderingObserver=N'haller ket erounit ar bliverezh war ar c'henaozer dre ma zo evezhieroù deoueziñ gant an elfenn (-moz-element pe dic'hronnañ/masklañ) +## LOCALIZATION NOTE: Do not translate zoom, calc(), "transform", "transform-origin: 0 0" +ZoomPropertyWarning=Ar bajenn-mañ a implij un doare "zoom" divoutin. Klaskit implijout calc() evit an talvoudoù a-bouez pe implijit “transform” gant “transform-origin: 0 0”. + +## LOCALIZATION NOTE(PrincipalWritingModePropagationWarning): +## Do not translate <html>, <body>, CSS, "writing-mode", "direction", "text-orientation", :root, and "The Principal Writing Mode" because they are technical terms. + +## LOCALIZATION NOTE(ScrollAnchoringDisabledInContainer): +## %1$S is an integer value with the total number of adjustments +## %2$S is a floating point value with the average distance adjusted +## %3$S is a floating point value with the total adjusted distance + + CompositorAnimationWarningTransformIsBlockedByImportantRules=Transform animation cannot be run on the compositor because transform-related properties are overridden by !important rules CompositorAnimationWarningHasCurrentColor=Animations of ‘background-color’ cannot be run on the compositor with ‘current-color’ keyframe. -## LOCALIZATION NOTE: Do not translate zoom, calc(), "transform", "transform-origin: 0 0" -ZoomPropertyWarning=This page uses the non standard property “zoom”. Consider using calc() in the relevant property values, or using “transform” along with “transform-origin: 0 0”. ## LOCALIZATION NOTE(PrincipalWritingModePropagationWarning): ## Do not translate <html>, <body>, CSS, "writing-mode", "direction", "text-orientation", :root, and "The Principal Writing Mode" because they are technical terms. PrincipalWritingModePropagationWarning=When rendering the <html> element, the used values of CSS properties “writing-mode”, “direction”, and “text-orientation” on the <html> element are taken from the computed values of the <body> element, not from the <html> element’s own values. Consider setting these properties on the :root CSS pseudo-class. For more information see “The Principal Writing Mode” in https://www.w3.org/TR/css-writing-modes-3/#principal-flow diff --git a/thunderbird-l10n/br/localization/br/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/br/localization/br/toolkit/about/aboutAddons.ftl index 9e9a05105c45f1de6b536cce52001d98ea7008e0..20ff006acfbfd46c13f3d1912b7588eb6534f1bb 100644 --- a/thunderbird-l10n/br/localization/br/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/br/localization/br/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Staliañ askouezhioù diouzh ar restr... .accesskey = i help-button = Skor an askouezhioù +sidebar-help-button-title = + .title = Skor an askouezhioù preferences = { PLATFORM() -> [windows] Dibarzhioù { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Ostilhoù evit an holl askouezhioù +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Dibarzhioù { -brand-short-name } + *[other] Gwellvezioù { -brand-short-name } + } show-unsigned-extensions-button = .label = N'haller ket gwiriekaat lod eus an askouezhioù show-all-extensions-button = @@ -163,13 +171,29 @@ extensions-view-available-updates = .name = Hizivadurioù hegerz .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Erbedadennoù +addon-category-discover-title = + .title = Erbedadennoù addon-category-extension = Askouezhioù +addon-category-extension-title = + .title = Askouezhioù addon-category-theme = Neuzioù +addon-category-theme-title = + .title = Neuzioù addon-category-plugin = Enlugelladoù +addon-category-plugin-title = + .title = Enlugelladoù addon-category-dictionary = Geriadurioù +addon-category-dictionary-title = + .title = Geriadurioù addon-category-locale = Yezhoù +addon-category-locale-title = + .title = Yezhoù addon-category-available-updates = Hizivadurioù hegerz +addon-category-available-updates-title = + .title = Hizivadurioù hegerz addon-category-recent-updates = Hizivadurioù nevesañ +addon-category-recent-updates-title = + .title = Hizivadurioù nevesañ ## These are global warnings @@ -304,6 +328,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Diskouez nebeutoc'h go-back-button = .tooltiptext = Distreiñ +header-back-button = + .title = Distreiñ ## Recommended add-ons page diff --git a/thunderbird-l10n/br/localization/br/toolkit/about/certviewer.ftl b/thunderbird-l10n/br/localization/br/toolkit/about/certviewer.ftl index b7807c06126c93ae665ac1dc69f6f94097f83e43..3ebc57631a20d24f528c977a92c62b94ad157cce 100644 --- a/thunderbird-l10n/br/localization/br/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/br/localization/br/toolkit/about/certviewer.ftl @@ -43,6 +43,7 @@ certificate-viewer-sha-1 = SHA-1 certificate-viewer-sha-256 = SHA-256 certificate-viewer-serial-number = Niverenn steudad certificate-viewer-signature-algorithm = Algoritm sinañ +certificate-viewer-timestamp = Merk amzer certificate-viewer-value = Talvoudegezh certificate-viewer-version = Handelv certificate-viewer-business-category = Rummad business @@ -52,7 +53,12 @@ certificate-viewer-public-key-info = Titouroù an alc'hwez foran certificate-viewer-miscellaneous = A bep seurt certificate-viewer-fingerprints = Roudoù biz certificate-viewer-basic-constraints = Rediennoù diazez +certificate-viewer-key-usages = Implijoù an alc'hwez +certificate-viewer-extended-key-usages = Implijoù astennet an alc'hwez +certificate-viewer-authority-key-id = ID alc'hwez an aotrouniezh +certificate-viewer-authority-info-aia = Titouroù diwar-benn an aotrouniezh (AIA) certificate-viewer-certificate-policies = Politikerezhioù an testeni +certificate-viewer-embedded-scts = SCTs ebarzhet # This message is used as a row header in the Miscellaneous section. # The associated data cell contains links to download the certificate. certificate-viewer-download = Pellgargañ @@ -68,3 +74,15 @@ certificate-viewer-boolean = ## Variables: ## $fileName (String) - The file name to save the PEM data in, derived from the common name from the certificate being displayed. +certificate-viewer-download-pem-chain = PEM (chadenn) + .download = { $fileName }-chain.pem +certificate-viewer-export = Ezporzhiañ + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Ho testenioù +certificate-viewer-tab-people = Tud +certificate-viewer-tab-servers = Servijerioù +certificate-viewer-tab-ca = Aotrouniezhoù +certificate-viewer-tab-unkonwn = Dianav diff --git a/thunderbird-l10n/br/localization/br/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/br/localization/br/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..243861945650c765fad038ca9d70e204f672a24f --- /dev/null +++ b/thunderbird-l10n/br/localization/br/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Lañset ho peus un handelv kozh eus { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Krouiñ un aelad nevez +profiledowngrade-sync = Arverañ un handelv koshoc'h eus { -brand-product-name } a c'hall kontroniñ ho sinedoù hag ho roll istor enrollet en un aelad { -brand-product-name } a zo dioutañ endeo. Evit gwareziñ ho titouroù, krouit un aelad nevez evit ar staliadur-mañ eus { -brand-short-name }. Gallout a rit atav kennaskañ gant ur { -fxaccount-brand-name } evit goubredañ ho sinedoù hag ho roll istor etre aeladoù. +profiledowngrade-nosync = Ober gant un handelv kozh eus { -brand-product-name } a c'hall kontroniñ ar sinedoù hag ar roll istor enrollet e-barzh un aelad { -brand-product-name } a zo anezhañ endeo. Evit gwareziñ ho titouroù, krouit un aelad nevez evit ar staliadur-mañ eus { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Kuitaat + *[other] Kuitaat + } diff --git a/thunderbird-l10n/br/manifest.json b/thunderbird-l10n/br/manifest.json index 27dddef682774a2aae9d25a7aabbaca06f853a68..221336a0d78afbc6b9acfbb9893e5da495fe14da 100644 --- a/thunderbird-l10n/br/manifest.json +++ b/thunderbird-l10n/br/manifest.json @@ -1,57 +1,57 @@ { + "name": "Breton Language Pack", + "applications": { + "gecko": { + "strict_min_version": "76.0", + "id": "langpack-br@thunderbird.mozilla.org", + "strict_max_version": "76.*" + } + }, "description": "Language pack for Thunderbird for br", + "author": "Thunderbird Breton Team (contributors: Alan Monfort, Philippe Basciano-Le Gall, Denis Arnaud, Michel Nédélec)", "sources": { "browser": { "base_path": "browser/" } }, - "langpack_id": "br", "languages": { "br": { - "version": "20200403074016", "chrome_resources": { - "messenger-smime": "chrome/br/locale/br/messenger-smime/", - "branding": "chrome/br/locale/br/branding/", - "communicator": "chrome/br/locale/br/communicator/", - "places": "chrome/br/locale/br/places/", - "alerts": "chrome/br/locale/br/alerts/", - "devtools": "chrome/br/locale/br/devtools/client/", - "devtools-shared": "chrome/br/locale/br/devtools/shared/", - "messenger": "chrome/br/locale/br/messenger/", - "pippki": "chrome/br/locale/br/pippki/", - "mozldap": "chrome/br/locale/br/mozldap/", - "messenger-mapi": "chrome/br/locale/br/messenger-mapi/", - "messenger-newsblog": "chrome/br/locale/br/messenger-newsblog/", - "mozapps": "chrome/br/locale/br/mozapps/", - "devtools-startup": "chrome/br/locale/br/devtools/startup/", - "pluginproblem": "chrome/br/locale/br/pluginproblem/", - "necko": "chrome/br/locale/br/necko/", - "calendar": "chrome/br/locale/br/calendar/", - "global": "chrome/br/locale/br/global/", - "lightning": "chrome/br/locale/br/lightning/", "global-platform": { - "linux": "chrome/br/locale/br/global-platform/unix/", "macosx": "chrome/br/locale/br/global-platform/mac/", "android": "chrome/br/locale/br/global-platform/unix/", + "linux": "chrome/br/locale/br/global-platform/unix/", "win": "chrome/br/locale/br/global-platform/win/" }, - "passwordmgr": "chrome/br/locale/br/passwordmgr/", + "global": "chrome/br/locale/br/global/", + "devtools-shared": "chrome/br/locale/br/devtools/shared/", "chat": "chrome/br/locale/br/chat/", + "messenger-smime": "chrome/br/locale/br/messenger-smime/", + "devtools": "chrome/br/locale/br/devtools/client/", + "pipnss": "chrome/br/locale/br/pipnss/", + "communicator": "chrome/br/locale/br/communicator/", + "messenger-mapi": "chrome/br/locale/br/messenger-mapi/", + "pippki": "chrome/br/locale/br/pippki/", + "messenger": "chrome/br/locale/br/messenger/", "messenger-region": "chrome/br/locale/br/messenger-region/", + "necko": "chrome/br/locale/br/necko/", + "pluginproblem": "chrome/br/locale/br/pluginproblem/", + "lightning": "chrome/br/locale/br/lightning/", + "calendar": "chrome/br/locale/br/calendar/", + "alerts": "chrome/br/locale/br/alerts/", + "messenger-newsblog": "chrome/br/locale/br/messenger-newsblog/", + "mozapps": "chrome/br/locale/br/mozapps/", + "devtools-startup": "chrome/br/locale/br/devtools/startup/", + "passwordmgr": "chrome/br/locale/br/passwordmgr/", "autoconfig": "chrome/br/locale/br/autoconfig/", - "pipnss": "chrome/br/locale/br/pipnss/" - } - } - }, - "applications": { - "gecko": { - "strict_min_version": "76.0", - "id": "langpack-br@thunderbird.mozilla.org", - "strict_max_version": "76.*" + "mozldap": "chrome/br/locale/br/mozldap/", + "places": "chrome/br/locale/br/places/", + "branding": "chrome/br/locale/br/branding/" + }, + "version": "20200416164416" } }, - "version": "76.0buildid20200407173003", - "author": "Thunderbird Breton Team (contributors: Alan Monfort, Philippe Basciano-Le Gall, Denis Arnaud, Michel Nédélec)", - "name": "Breton Language Pack", - "manifest_version": 2 + "manifest_version": 2, + "langpack_id": "br", + "version": "76.0buildid20200420212409" } diff --git a/thunderbird-l10n/ca/chrome/ca/locale/ca/messenger/messengercompose/composeMsgs.properties b/thunderbird-l10n/ca/chrome/ca/locale/ca/messenger/messengercompose/composeMsgs.properties index 4cb0f354fb9dba18e103fe0afb725fdd7f96a759..9a2f4aec9bb15ec529bd4939082f9692077fa070 100644 --- a/thunderbird-l10n/ca/chrome/ca/locale/ca/messenger/messengercompose/composeMsgs.properties +++ b/thunderbird-l10n/ca/chrome/ca/locale/ca/messenger/messengercompose/composeMsgs.properties @@ -327,7 +327,7 @@ learnMore.accesskey=M # LOCALIZATION NOTE (bigFileDescription): Semi-colon list of plural forms. # See: https://developer.mozilla.org/en/Localization_and_Plurals # #1 number of big attached files -bigFileDescription=És un fitxer gran. Podria ser millor que empréssiu el Filelink.;Són fitxers grans. Podria ser millor que empréssiu el Filelink. +bigFileDescription=És un fitxer gran. Podria ser millor utilitzar el Filelink.;Són fitxers grans. Podria ser millor utilitzar el Filelink. bigFileShare.label=Enllaça bigFileShare.accesskey=l bigFileAttach.label=Ignora @@ -350,7 +350,7 @@ cloudFileUploadedTooltip=S'ha pujat a %S cloudFileUploadingNotification=S'està enllaçant el fitxer. Apareixerà en el cos del missatge en acabar.;S'estan enllaçant els fitxers. Apareixeran en el cos del missatge en acabar. cloudFileUploadingCancel.label=Cancel·la cloudFileUploadingCancel.accesskey=C -cloudFilePrivacyNotification=S'ha completat l'enllaçament. Tingueu en compte que les adjuncions enllaçades poden ser accessibles a aquells que poden veure o endevinar els enllaços. +cloudFilePrivacyNotification=S'ha enllaçat correctament. Tingueu en compte que els fitxers adjunts enllaçats poden ser accessibles per tothom qui pugui veure o endevinar els enllaços. ## LOCALIZATION NOTE(smtpEnterPasswordPrompt): Do not translate the ## word %S. Place the word %S where the host name should appear. @@ -446,7 +446,7 @@ cloudAttachmentCountHeader=He enllaçat #1 fitxer al missatge:;He enllaçat #1 f ## LOCALIZATION NOTE(cloudAttachmentListFooter): %1$S is a link, whose text ## contents are the brandFullName of this application. -cloudAttachmentListFooter=El %1$S facilita compartir fitxers grans amb el correu electrònic. +cloudAttachmentListFooter=El %1$S facilita compartir fitxers grans per correu electrònic. ## LOCALIZATION NOTE(cloudAttachmentListItem): A line of text describing a cloud ## attachment to be inserted into the message body. Do not translate the words diff --git a/thunderbird-l10n/ca/localization/ca/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ca/localization/ca/toolkit/about/aboutAddons.ftl index b8615bf8881c0ed1e237f59d5bf26ca762dd8cec..0b0d7820d7884d1dc86ffcfb13daf9f1faa6581a 100644 --- a/thunderbird-l10n/ca/localization/ca/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/ca/localization/ca/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Instal·la un complement des d'un fitxer… .accesskey = I help-button = Assistència per als complements +sidebar-help-button-title = + .title = Assistència per als complements preferences = { PLATFORM() -> [windows] Opcions del { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Eines per a tots els complements +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Opcions del { -brand-short-name } + *[other] Preferències del { -brand-short-name } + } show-unsigned-extensions-button = .label = No s'han pogut verificar algunes extensions show-all-extensions-button = @@ -165,13 +173,29 @@ extensions-view-available-updates = .name = Actualitzacions disponibles .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Recomanacions +addon-category-discover-title = + .title = Recomanacions addon-category-extension = Extensions +addon-category-extension-title = + .title = Extensions addon-category-theme = Temes +addon-category-theme-title = + .title = Temes addon-category-plugin = Connectors +addon-category-plugin-title = + .title = Connectors addon-category-dictionary = Diccionaris +addon-category-dictionary-title = + .title = Diccionaris addon-category-locale = Llengües +addon-category-locale-title = + .title = Llengües addon-category-available-updates = Actualitzacions disponibles +addon-category-available-updates-title = + .title = Actualitzacions disponibles addon-category-recent-updates = Actualitzacions recents +addon-category-recent-updates-title = + .title = Actualitzacions recents ## These are global warnings @@ -309,6 +333,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Mostra'n menys go-back-button = .tooltiptext = Vés enrere +header-back-button = + .title = Vés enrere ## Recommended add-ons page diff --git a/thunderbird-l10n/ca/localization/ca/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ca/localization/ca/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..2c3326661b7c7b89659aca70f26fb325df697f58 --- /dev/null +++ b/thunderbird-l10n/ca/localization/ca/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Heu iniciat una versió antiga del { -brand-product-name }. + .style = width: 490px; +profiledowngrade-window-create = + .label = Crea un perfil nou +profiledowngrade-sync = L'ús d'una versió antiga del { -brand-product-name } pot malmetre les adreces d'interès i l'historial de navegació que ja estiguin desats en un perfil del { -brand-product-name } existent. Per protegir la vostra informació, creeu un perfil nou per a aquesta instal·lació del { -brand-short-name }. Sempre podeu iniciar la sessió amb un { -fxaccount-brand-name } per sincronitzar les adreces d'interès i l'historial de navegació entre perfils. +profiledowngrade-nosync = L'ús d'una versió antiga del { -brand-product-name } pot malmetre les adreces d'interès i l'historial de navegació que ja estiguin desats en un perfil del { -brand-product-name } existent. Per protegir la vostra informació, creeu un perfil nou per a aquesta instal·lació del { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Surt + *[other] Surt + } diff --git a/thunderbird-l10n/ca/manifest.json b/thunderbird-l10n/ca/manifest.json index 10d85f0f1302f7912fd3bc76ed21898144d88cc6..fdfa00309410edca380bf38a763d587631683b40 100644 --- a/thunderbird-l10n/ca/manifest.json +++ b/thunderbird-l10n/ca/manifest.json @@ -1,5 +1,13 @@ { + "sources": { + "browser": { + "base_path": "browser/" + } + }, "name": "Català Language Pack", + "version": "76.0buildid20200420212409", + "langpack_id": "ca", + "description": "Language pack for Thunderbird for ca", "applications": { "gecko": { "strict_min_version": "76.0", @@ -9,49 +17,41 @@ }, "languages": { "ca": { - "version": "20200403074107", "chrome_resources": { - "mozldap": "chrome/ca/locale/ca/mozldap/", - "mozapps": "chrome/ca/locale/ca/mozapps/", - "messenger-smime": "chrome/ca/locale/ca/messenger-smime/", - "communicator": "chrome/ca/locale/ca/communicator/", + "lightning": "chrome/ca/locale/ca/lightning/", + "places": "chrome/ca/locale/ca/places/", "global-platform": { - "linux": "chrome/ca/locale/ca/global-platform/unix/", - "android": "chrome/ca/locale/ca/global-platform/unix/", + "win": "chrome/ca/locale/ca/global-platform/win/", "macosx": "chrome/ca/locale/ca/global-platform/mac/", - "win": "chrome/ca/locale/ca/global-platform/win/" + "android": "chrome/ca/locale/ca/global-platform/unix/", + "linux": "chrome/ca/locale/ca/global-platform/unix/" }, "branding": "chrome/ca/locale/ca/branding/", + "alerts": "chrome/ca/locale/ca/alerts/", "pluginproblem": "chrome/ca/locale/ca/pluginproblem/", + "devtools-shared": "chrome/ca/locale/ca/devtools/shared/", + "devtools-startup": "chrome/ca/locale/ca/devtools/startup/", + "passwordmgr": "chrome/ca/locale/ca/passwordmgr/", "autoconfig": "chrome/ca/locale/ca/autoconfig/", + "messenger-smime": "chrome/ca/locale/ca/messenger-smime/", + "devtools": "chrome/ca/locale/ca/devtools/client/", "global": "chrome/ca/locale/ca/global/", - "messenger-newsblog": "chrome/ca/locale/ca/messenger-newsblog/", - "calendar": "chrome/ca/locale/ca/calendar/", - "necko": "chrome/ca/locale/ca/necko/", - "pipnss": "chrome/ca/locale/ca/pipnss/", - "lightning": "chrome/ca/locale/ca/lightning/", + "pippki": "chrome/ca/locale/ca/pippki/", "messenger": "chrome/ca/locale/ca/messenger/", "messenger-region": "chrome/ca/locale/ca/messenger-region/", - "pippki": "chrome/ca/locale/ca/pippki/", - "messenger-mapi": "chrome/ca/locale/ca/messenger-mapi/", - "devtools-shared": "chrome/ca/locale/ca/devtools/shared/", - "devtools": "chrome/ca/locale/ca/devtools/client/", - "places": "chrome/ca/locale/ca/places/", "chat": "chrome/ca/locale/ca/chat/", - "devtools-startup": "chrome/ca/locale/ca/devtools/startup/", - "alerts": "chrome/ca/locale/ca/alerts/", - "passwordmgr": "chrome/ca/locale/ca/passwordmgr/" - } - } - }, - "description": "Language pack for Thunderbird for ca", - "langpack_id": "ca", - "version": "76.0buildid20200407173003", - "manifest_version": 2, - "sources": { - "browser": { - "base_path": "browser/" + "pipnss": "chrome/ca/locale/ca/pipnss/", + "calendar": "chrome/ca/locale/ca/calendar/", + "necko": "chrome/ca/locale/ca/necko/", + "messenger-newsblog": "chrome/ca/locale/ca/messenger-newsblog/", + "mozapps": "chrome/ca/locale/ca/mozapps/", + "mozldap": "chrome/ca/locale/ca/mozldap/", + "communicator": "chrome/ca/locale/ca/communicator/", + "messenger-mapi": "chrome/ca/locale/ca/messenger-mapi/" + }, + "version": "20200420154436" } }, - "author": "Mozilla.org / Softcatalà (contributors: Softcatalà)" + "author": "Mozilla.org / Softcatalà (contributors: Softcatalà)", + "manifest_version": 2 } diff --git a/thunderbird-l10n/cak/localization/cak/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/cak/localization/cak/toolkit/about/aboutAddons.ftl index e253a4c4efd7e2a3c70f0cb19f7c246c3183cc78..2187749ad8496a6d0272a78985b97abc0baa077e 100644 --- a/thunderbird-l10n/cak/localization/cak/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/cak/localization/cak/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Tiyak ri tz'aqat rik'in ri yakb'äl… .accesskey = T help-button = Kitob'al Tz'aqat +sidebar-help-button-title = + .title = Kitob'al Tz'aqat preferences = { PLATFORM() -> [windows] { -brand-short-name } Taq Cha'oj @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Taq kisamajib'al konojel ri taq tz'aqat +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } Taq Cha'oj + *[other] { -brand-short-name } Taq Ajowab'äl + } show-unsigned-extensions-button = .label = Jujun taq k'amal man tikirel ta yenik'öx show-all-extensions-button = @@ -168,13 +176,29 @@ extensions-view-available-updates = .name = Taq k'exoj e k'o .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Taq chilab'enïk +addon-category-discover-title = + .title = Taq chilab'enïk addon-category-extension = Taq k'amal +addon-category-extension-title = + .title = Taq k'amal addon-category-theme = Taq wachinel +addon-category-theme-title = + .title = Taq wachinel addon-category-plugin = Taq nak'ab'äl +addon-category-plugin-title = + .title = Taq nak'ab'äl addon-category-dictionary = Taq soltzij +addon-category-dictionary-title = + .title = Taq soltzij addon-category-locale = Taq ch'ab'äl +addon-category-locale-title = + .title = Taq ch'ab'äl addon-category-available-updates = Taq k'exoj e k'o +addon-category-available-updates-title = + .title = Taq k'exoj e k'o addon-category-recent-updates = K'ak'a' taq k'exoj +addon-category-recent-updates-title = + .title = K'ak'a' taq k'exoj ## These are global warnings @@ -312,6 +336,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Tik'ut pe Jub'a' go-back-button = .tooltiptext = Titzolin +header-back-button = + .title = Titzolin ## Recommended add-ons page diff --git a/thunderbird-l10n/cak/localization/cak/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/cak/localization/cak/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..b954780e7191ab43f39ad3e3420250a67ace6f85 --- /dev/null +++ b/thunderbird-l10n/cak/localization/cak/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Xatikirisaj jun ojer ruwäch chi { -brand-product-name }. + .style = width: 490px; +profiledowngrade-window-create = + .label = Tinuk' jun K'ak'a' Ruwäch B'i'aj +profiledowngrade-sync = We nawokisaj jun ojer ruwäch { -brand-product-name } nitikïr yerutz'ila' ri taq ayaketal chuqa' ri runatab'al awokem pa k'amaya'l eyakon chik pa ri ruwäch b'i'aj k'o chik richin ri { -brand-product-name }. Richin nachajij ri etamab'äl, k'o ta chi natz'ük jun k'ak'a' ruwäch b'i'aj richin ri ruyakik ri { -brand-short-name }. Jantape' yatikïr yatok rik'in jun { -fxaccount-brand-name } richin ye'axïm ri taq ayaketal chuqa' runatab'al awokem pa k'amaya'l chi kikojol ri taq ruwäch ab'i'. +profiledowngrade-nosync = We nawokisaj jun ojer ruwäch { -brand-product-name } nitikïr yerutz'ila' ri taq ayaketal chuqa' ri runatab'al awokem pa k'amaya'l eyakon chik pa ri ruwäch b'i'aj k'o chik richin ri { -brand-product-name }. Richin nachajij ri etamab'äl, k'o ta chi natz'ük jun k'ak'a' ruwäch b'i'aj richin ri ruyakik ri { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Tel + *[other] Tel + } diff --git a/thunderbird-l10n/cak/manifest.json b/thunderbird-l10n/cak/manifest.json index 32375d294146a54cb657ae282239338e38a737b7..42551fa7db536a5a5de8ff978d9b9dd0ceab758f 100644 --- a/thunderbird-l10n/cak/manifest.json +++ b/thunderbird-l10n/cak/manifest.json @@ -1,12 +1,6 @@ { - "langpack_id": "cak", - "author": "mozilla.org (contributors: Mozilla Kaqéchikel (Responsable: Juan Sián))", - "sources": { - "browser": { - "base_path": "browser/" - } - }, "manifest_version": 2, + "author": "mozilla.org (contributors: Mozilla Kaqéchikel (Responsable: Juan Sián))", "applications": { "gecko": { "strict_min_version": "76.0", @@ -14,44 +8,50 @@ "strict_max_version": "76.*" } }, + "version": "76.0buildid20200420212409", + "description": "Language pack for Thunderbird for cak", + "sources": { + "browser": { + "base_path": "browser/" + } + }, + "name": "Kaqchikel (Guatemala) Language Pack", "languages": { "cak": { - "version": "20200403074121", "chrome_resources": { + "passwordmgr": "chrome/cak/locale/cak/passwordmgr/", + "calendar": "chrome/cak/locale/cak/calendar/", + "chat": "chrome/cak/locale/cak/chat/", + "devtools-startup": "chrome/cak/locale/cak/devtools/startup/", "global-platform": { - "win": "chrome/cak/locale/cak/global-platform/win/", - "linux": "chrome/cak/locale/cak/global-platform/unix/", "macosx": "chrome/cak/locale/cak/global-platform/mac/", - "android": "chrome/cak/locale/cak/global-platform/unix/" + "android": "chrome/cak/locale/cak/global-platform/unix/", + "linux": "chrome/cak/locale/cak/global-platform/unix/", + "win": "chrome/cak/locale/cak/global-platform/win/" }, - "alerts": "chrome/cak/locale/cak/alerts/", - "passwordmgr": "chrome/cak/locale/cak/passwordmgr/", - "branding": "chrome/cak/locale/cak/branding/", - "chat": "chrome/cak/locale/cak/chat/", - "messenger": "chrome/cak/locale/cak/messenger/", + "lightning": "chrome/cak/locale/cak/lightning/", + "communicator": "chrome/cak/locale/cak/communicator/", "places": "chrome/cak/locale/cak/places/", "messenger-smime": "chrome/cak/locale/cak/messenger-smime/", - "global": "chrome/cak/locale/cak/global/", + "alerts": "chrome/cak/locale/cak/alerts/", + "messenger-newsblog": "chrome/cak/locale/cak/messenger-newsblog/", + "messenger": "chrome/cak/locale/cak/messenger/", + "pippki": "chrome/cak/locale/cak/pippki/", + "mozldap": "chrome/cak/locale/cak/mozldap/", + "pluginproblem": "chrome/cak/locale/cak/pluginproblem/", + "devtools-shared": "chrome/cak/locale/cak/devtools/shared/", "mozapps": "chrome/cak/locale/cak/mozapps/", - "calendar": "chrome/cak/locale/cak/calendar/", "autoconfig": "chrome/cak/locale/cak/autoconfig/", + "global": "chrome/cak/locale/cak/global/", "messenger-region": "chrome/cak/locale/cak/messenger-region/", - "devtools-shared": "chrome/cak/locale/cak/devtools/shared/", - "mozldap": "chrome/cak/locale/cak/mozldap/", "necko": "chrome/cak/locale/cak/necko/", - "messenger-mapi": "chrome/cak/locale/cak/messenger-mapi/", - "pipnss": "chrome/cak/locale/cak/pipnss/", - "lightning": "chrome/cak/locale/cak/lightning/", "devtools": "chrome/cak/locale/cak/devtools/client/", - "communicator": "chrome/cak/locale/cak/communicator/", - "pippki": "chrome/cak/locale/cak/pippki/", - "messenger-newsblog": "chrome/cak/locale/cak/messenger-newsblog/", - "pluginproblem": "chrome/cak/locale/cak/pluginproblem/", - "devtools-startup": "chrome/cak/locale/cak/devtools/startup/" - } + "pipnss": "chrome/cak/locale/cak/pipnss/", + "messenger-mapi": "chrome/cak/locale/cak/messenger-mapi/", + "branding": "chrome/cak/locale/cak/branding/" + }, + "version": "20200415054537" } }, - "version": "76.0buildid20200407173003", - "name": "Kaqchikel (Guatemala) Language Pack", - "description": "Language pack for Thunderbird for cak" + "langpack_id": "cak" } diff --git a/thunderbird-l10n/cs/chrome/cs/locale/cs/devtools/client/debugger.properties b/thunderbird-l10n/cs/chrome/cs/locale/cs/devtools/client/debugger.properties index a353cd33c05ca447c8ed24746c987c6fd5ef33e1..dc6d2570c0fae2f6ec4396c3df503bb77001b296 100644 --- a/thunderbird-l10n/cs/chrome/cs/locale/cs/devtools/client/debugger.properties +++ b/thunderbird-l10n/cs/chrome/cs/locale/cs/devtools/client/debugger.properties @@ -54,6 +54,32 @@ setDirectoryRoot.accesskey=r removeDirectoryRoot.label=Odebrat kořenový adresář removeDirectoryRoot.accesskey=d +# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item + +# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected group + +# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected group + +# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected group + +# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to unblackbox all files outside of the selected group + +# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected directory + +# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected directory + +# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected directory + +# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the +# context submenu to unblackbox all files outside of the selected directory + # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the # context menu to copy the function the user selected copyFunction.label=Kopírovat funkci @@ -307,7 +333,7 @@ projectTextSearch.placeholder=Hledání ve všech souborech… # LOCALIZATION NOTE (projectTextSearch.noResults): The center pane Text Search # message when the query did not match any text of all files in a project. -projectTextSearch.noResults=Nebyly nalezeny žádné výsledky +projectTextSearch.noResults=Nenalezeny žádné výsledky # LOCALIZATION NOTE (sources.noSourcesAvailable): Text shown when the debugger # does not have any sources. @@ -537,7 +563,7 @@ editor.searchResults1=%d z #1 výsledku;%d ze #1 výsledků;%d z #1 výsledků # LOCALIZATION NOTE (editor.noResultsFound): Editor Search bar message # for when no results found. -editor.noResultsFound=Nebyly nalezeny žádné výsledky +editor.noResultsFound=Nenalezeny žádné výsledky # LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar # tooltip for traversing to the Next Result @@ -867,7 +893,7 @@ sourceSearch.search2=Přejít do souboru… # LOCALIZATION NOTE (sourceSearch.noResults2): The center pane Source Search # message when the query did not match any of the sources. -sourceSearch.noResults2=Nebyly nalezeny žádné výsledky +sourceSearch.noResults2=Nenalezeny žádné výsledky # LOCALIZATION NOTE (ignoreExceptions): The pause on exceptions button tooltip # when the debugger will not pause on exceptions. @@ -1018,10 +1044,6 @@ whyPaused.mutationBreakpoint=Pozastaveno na mutaci DOMu # in a info block explaining how the debugger is currently paused at # a JS execution -# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed -# in a info block explaining how the debugger is currently paused in a -# recording. - # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed # in a info block explaining how the debugger is currently paused while stepping # in or out of the stack diff --git a/thunderbird-l10n/cs/chrome/cs/locale/cs/global/dom/dom.properties b/thunderbird-l10n/cs/chrome/cs/locale/cs/global/dom/dom.properties index 4dfc55cad7a6e1158d86bb959b3d5233f371d1ba..abad263464798ee281d6fb15e06f092cecc44c53 100644 --- a/thunderbird-l10n/cs/chrome/cs/locale/cs/global/dom/dom.properties +++ b/thunderbird-l10n/cs/chrome/cs/locale/cs/global/dom/dom.properties @@ -45,7 +45,7 @@ FormValidationPatternMismatch=Vyplňte prosím pole v požadovaném formátu. # LOCALIZATION NOTE (FormValidationPatternMismatchWithTitle): %S is the (possibly truncated) title attribute value. FormValidationPatternMismatchWithTitle=Vyplňte prosím pole v požadovaném formátu: %S. # LOCALIZATION NOTE (FormValidationNumberRangeOverflow): %S is a number. -FormValidationNumberRangeOverflow=Zvolte prosím číslo, která není větší než %S. +FormValidationNumberRangeOverflow=Zvolte prosím číslo, které není větší než %S. # LOCALIZATION NOTE (FormValidationDateTimeRangeOverflow): %S is a date or a time. FormValidationDateTimeRangeOverflow=Zvolte prosím datum, které není pozdější než %S. # LOCALIZATION NOTE (FormValidationNumberRangeUnderflow): %S is a number. @@ -56,6 +56,7 @@ FormValidationDateTimeRangeUnderflow=Zvolte prosím čas, který není dřívěj FormValidationStepMismatch=Zvolte prosím platnou hodnotu. Nejbližší platné hodnoty jsou %S a %S. # LOCALIZATION NOTE (FormValidationStepMismatchOneValue): %S can be a number, a date or a time. This is called instead of FormValidationStepMismatch when the second value is the same as the first. FormValidationStepMismatchOneValue=Zvolte prosím platnou hodnotu. Nejbližší platná hodnota je %S. +# LOCALIZATION NOTE (FormValidationTimeReversedRangeUnderflowAndOverflow): %1$S,%2$S are time. FormValidationBadInputNumber=Zadejte prosím platné číslo. EnablePrivilegeWarning=Použití enablePrivilege je zastaralé. Používejte raději kód, který má systémová oprávnění (např. rozšíření). FullscreenDeniedDisabled=Požadavek na režim celé obrazovky byl zamítnut, protože API tohoto režimu není povoleno. @@ -388,7 +389,7 @@ External_AddSearchProviderWarning=AddSearchProvider je zastaralý. # LOCALIZATION NOTE: Do not translate MathML, subscriptshift and superscriptshift. # LOCALIZATION NOTE: Do not translate MathML, background, color, fontfamily, fontsize, fontstyle and fontweight. # LOCALIZATION NOTE: Do not translate MathML and XLink. -# LOCALIZATION NOTE: Do not translate title, text, url as they are the names of JS properties. +# LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL. # LOCALIZATION NOTE (FormValidationTimeReversedRangeUnderflowAndOverflow): %1$S,%2$S are time. FormValidationTimeReversedRangeUnderflowAndOverflow=Please select a value between %1$S and %2$S. diff --git a/thunderbird-l10n/cs/chrome/cs/locale/cs/necko/necko.properties b/thunderbird-l10n/cs/chrome/cs/locale/cs/necko/necko.properties index f45262779d2ea255559a104915e2494759667a19..dea54226ca6e855da2409ff0108e2ab34f354ae6 100644 --- a/thunderbird-l10n/cs/chrome/cs/locale/cs/necko/necko.properties +++ b/thunderbird-l10n/cs/chrome/cs/locale/cs/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Přístup k úložišti „%1$S“ by # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Přístup k úložišti „%1$S“ byl sledovacímu prvku „%2$S“ automaticky povolen. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Přístup k úložišti „%1$S“ byl díky izolaci First-Party „%2$S“ automaticky povolen. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Cookie „%1$S“ byla zablokována, protože obsahuje atribut „sameSite=none“ bez atributu „secure“. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/cs/localization/cs/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/cs/localization/cs/devtools/client/aboutdebugging.ftl index f2fd9ff4c78faebbf18ec69794dfb1b6bd57a94d..7603e3758b638b94aaa08283150e23e87dd575a1 100644 --- a/thunderbird-l10n/cs/localization/cs/devtools/client/aboutdebugging.ftl +++ b/thunderbird-l10n/cs/localization/cs/devtools/client/aboutdebugging.ftl @@ -125,6 +125,10 @@ about-debugging-setup-usb-status-updating = Probíhá aktualizace… # USB section step by step guide about-debugging-setup-usb-step-enable-dev-menu2 = Zapněte nabídku vývojáře na vašem zařízení s Android. # USB section step by step guide +about-debugging-setup-usb-step-enable-debug2 = Povolte ladění přes USB v nabídce pro vývojáře Androidu. +# USB section step by step guide +about-debugging-setup-usb-step-enable-debug-firefox2 = Povolte ladění přes USB ve Firefoxu pro Android. +# USB section step by step guide about-debugging-setup-usb-step-plug-device = Připojte zařízení s Androidem k vašemu počítači. # Text shown in the USB section of the setup page with a link to troubleshoot connection errors. # The link goes to https://developer.mozilla.org/docs/Tools/Remote_Debugging/Debugging_over_USB diff --git a/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutAddons.ftl index 4bf4035f365e69220ea720d2365aa05f1301dd27..3b697cadb09c3e7b5503fbbffdca4b75f31454a8 100644 --- a/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutAddons.ftl @@ -15,7 +15,7 @@ loading-label = list-empty-installed = .value = Žádný doplněk tohoto typu není nainstalován list-empty-available-updates = - .value = Nebyly nalezeny žádné aktualizace + .value = Nenalezeny žádné aktualizace list-empty-recent-updates = .value = Žádný doplněk nebyl aktualizován list-empty-find-updates = @@ -26,6 +26,8 @@ install-addon-from-file = .label = Instalovat doplněk ze souboru… .accesskey = I help-button = Nápověda +sidebar-help-button-title = + .title = Nápověda preferences = { PLATFORM() -> [windows] Možnosti @@ -38,6 +40,17 @@ preferences = } tools-menu = .tooltiptext = Nástroje doplňků +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Možnosti + *[other] Předvolby + } { -brand-short-name.gender -> + [masculine] { -brand-short-name(case: "gen") } + [feminine] { -brand-short-name(case: "gen") } + [neuter] { -brand-short-name(case: "gen") } + *[other] aplikace + } show-unsigned-extensions-button = .label = Některá rozšíření nemohla být ověřena show-all-extensions-button = @@ -181,7 +194,7 @@ legacy-extensions-description = *[other] aplikace { -brand-short-name } }. <label data-l10n-name="legacy-learn-more">Zjistit více o změnách pro doplňky</label> private-browsing-description2 = - Fungování rozšíření pro aplikaci { -brand-short-name } se v anonymním prohlížení mění. Všechna nově nainstalovaná rozšíření, nebudou ve výchozím nastavení v anonymních oknech fungovat, pokud jim to nepovolíte. Rozšíření tak nebudou mít bez vašeho vědomí přístup k tomu, co v anonymním prohlížení děláte. + Fungování rozšíření pro aplikaci { -brand-short-name } se v anonymních oknech mění. Žádné nově nainstalované rozšíření, nebude ve výchozím nastavení v anonymních oknech fungovat, pokud mu to nepovolíte. Rozšíření tak nebudou mít bez vašeho vědomí přístup k tomu, co v anonymních oknech děláte. <label data-l10n-name="private-browsing-learn-more">Jak na nastavení rozšíření</label> extensions-view-discopane = .name = Doporučení @@ -193,13 +206,29 @@ extensions-view-available-updates = .name = Dostupné aktualizace .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Doporučení +addon-category-discover-title = + .title = Doporučení addon-category-extension = Rozšíření +addon-category-extension-title = + .title = Rozšíření addon-category-theme = Motivy vzhledu +addon-category-theme-title = + .title = Motivy vzhledu addon-category-plugin = Zásuvné moduly +addon-category-plugin-title = + .title = Zásuvné moduly addon-category-dictionary = Slovníky +addon-category-dictionary-title = + .title = Slovníky addon-category-locale = Jazyky +addon-category-locale-title = + .title = Jazyky addon-category-available-updates = Dostupné aktualizace +addon-category-available-updates-title = + .title = Dostupné aktualizace addon-category-recent-updates = Aktualizováno +addon-category-recent-updates-title = + .title = Aktualizováno ## These are global warnings @@ -279,7 +308,7 @@ extensions-updates-downloaded = extensions-updates-restart = .label = Restartovat pro dokončení instalace extensions-updates-none-found = - .value = Nebyly nalezeny žádné aktualizace + .value = Nenalezeny žádné aktualizace extensions-updates-manual-updates-found = .label = Zobrazit dostupné aktualizace extensions-updates-update-selected = @@ -287,7 +316,7 @@ extensions-updates-update-selected = .tooltiptext = Nainstaluje vybrané aktualizace addon-updates-updating = Probíhá aktualizace doplňků addon-updates-installed = Doplňky byly aktualizovány. -addon-updates-none-found = Nebyly nalezeny žádné aktualizace +addon-updates-none-found = Nenalezeny žádné aktualizace addon-updates-manual-updates-found = Zobrazit dostupné aktualizace ## Add-on install/debug strings for page options menu @@ -312,6 +341,7 @@ shortcuts-no-commands = Následující rozšíření nemají žádné klávesov shortcuts-input = .placeholder = Zadejte klávesovou zkratku shortcuts-browserAction = Povolit rozšíření +shortcuts-browserAction2 = Přidat tlačítko na lištu shortcuts-pageAction = Povolit akci stránky shortcuts-sidebarAction = Přepnout zobrazení postranního panelu shortcuts-modifier-mac = Zahrnout Ctrl, Alt nebo ⌘ @@ -344,6 +374,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Zobrazit méně go-back-button = .tooltiptext = Zpátky +header-back-button = + .title = Zpátky ## Recommended add-ons page diff --git a/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutPlugins.ftl b/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutPlugins.ftl index 87a7efdc874984d4702e5cd9506a86282344e70f..a3bc6db07b46afee7da1b381897df5d3dcdcc36a 100644 --- a/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutPlugins.ftl +++ b/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutPlugins.ftl @@ -4,7 +4,7 @@ title-label = O zásuvných modulech installed-plugins-label = Nainstalované zásuvné moduly -no-plugins-are-installed-label = Nebyly nalezeny žádné zásuvné moduly +no-plugins-are-installed-label = Nenalezeny žádné zásuvné moduly deprecation-description = Něco chybí? Některé zásuvné moduly už nejsou podporovány. <a data-l10n-name="deprecation-link">Zjistit více.</a> ## The information of plugins diff --git a/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutSupport.ftl index 6e428a666fd0084a66a2b48f50030e38aca43021..bbd65befa50f9b9c857868bb50da13eefd031334 100644 --- a/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutSupport.ftl @@ -303,6 +303,11 @@ sandbox-proc-type-content = obsah sandbox-proc-type-file = obsah souboru sandbox-proc-type-media-plugin = zásuvný modul médií sandbox-proc-type-data-decoder = dekodér dat +startup-cache-title = Mezipaměť spouštění +startup-cache-disk-cache-path = Cesta k mezipaměti na disku +startup-cache-ignore-disk-cache = Ignorovat mezipaměť na disku +startup-cache-found-disk-cache-on-init = Mezipaměť na disku během inicializace nalezena +startup-cache-wrote-to-disk-cache = Zapsáno do mezipaměti na disku launcher-process-status-0 = Povoleno launcher-process-status-1 = Zakázáno kvůli chybě launcher-process-status-2 = Násilně zakázáno @@ -326,6 +331,7 @@ touch-enabled = dotykový vstup povolen drag-enabled = táhnutí posuvníkem povoleno keyboard-enabled = klávesnice povolena autoscroll-enabled = automatické posunování povoleno +zooming-enabled = plynulé gesto pro přiblížení zapnuto ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/cs/localization/cs/toolkit/about/certviewer.ftl b/thunderbird-l10n/cs/localization/cs/toolkit/about/certviewer.ftl index efe1892fa23a2775bbec5dc190fb4c29225ad11e..60fb3800846cff2543c5f01c627cf9ead369657b 100644 --- a/thunderbird-l10n/cs/localization/cs/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/cs/localization/cs/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (certifikát) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (řetězec) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Toto rozšíření bylo označeno jako kritické, což znamená, že klienti musí certifikát odmítnou, pokud mu neporozumí. +certificate-viewer-export = Exportovat + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Osobní +certificate-viewer-tab-people = Lidé +certificate-viewer-tab-servers = Servery +certificate-viewer-tab-ca = Autority +certificate-viewer-tab-unkonwn = Neznámé diff --git a/thunderbird-l10n/cs/localization/cs/toolkit/global/processTypes.ftl b/thunderbird-l10n/cs/localization/cs/toolkit/global/processTypes.ftl index a59987ca61f16dccd2c33a292157109f41c3ff0a..bb29ea784e86e575adbf942e47dd80568aec3616 100644 --- a/thunderbird-l10n/cs/localization/cs/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/cs/localization/cs/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Izolovaný webový obsah # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/cs/localization/cs/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/cs/localization/cs/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..3c06c03a6b823582b239d6e9bc14bb03adfc3ec4 --- /dev/null +++ b/thunderbird-l10n/cs/localization/cs/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,19 @@ +# 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/. + +profiledowngrade-window = + .title = + Spustili jste starší verzi { -brand-product-name.gender -> + [masculine] { -brand-product-name(case: "gen") } + [feminine] { -brand-product-name(case: "gen") } + [neuter] { -brand-product-name(case: "gen") } + *[other] aplikace { -brand-product-name } + } + .style = width: 490px; +profiledowngrade-window-create = + .label = Vytvořit nový profil +profiledowngrade-sync = Spuštěním starší verze { -brand-product-name }u může dojít k poškození záložek a historie prohlížení uložených v jeho stávajícím profilu. Pro ochranu vašich dat si prosím pro tuto instalaci aplikace { -brand-short-name } vytvořte profil nový. Pro synchronizaci dat mezi oběma profily můžete použít { -fxaccount-brand-name }. +profiledowngrade-nosync = Spuštěním starší verze { -brand-product-name }u může dojít k poškození záložek a historie prohlížení uložených v jeho stávajícím profilu. Pro ochranu vašich dat si prosím pro tuto instalaci aplikace { -brand-short-name } vytvořte profil nový. +profiledowngrade-quit = + .label = Ukončit diff --git a/thunderbird-l10n/cs/manifest.json b/thunderbird-l10n/cs/manifest.json index 0d4d61ca863eefb35e5c415d09c0177063048bb7..bb9de9fffdceea93095675c8196b3a4a9f90aef7 100644 --- a/thunderbird-l10n/cs/manifest.json +++ b/thunderbird-l10n/cs/manifest.json @@ -1,57 +1,57 @@ { - "version": "76.0buildid20200407173003", + "version": "76.0buildid20200420212409", + "description": "Language pack for Thunderbird for cs", "applications": { "gecko": { - "id": "langpack-cs@thunderbird.mozilla.org", "strict_max_version": "76.*", - "strict_min_version": "76.0" + "strict_min_version": "76.0", + "id": "langpack-cs@thunderbird.mozilla.org" } }, - "langpack_id": "cs", "sources": { "browser": { "base_path": "browser/" } }, + "manifest_version": 2, + "author": "Mozilla.cz (contributors: Pavel Cvrček, Pavel Franc, Michal Stanke, Michal Vašíček)", + "name": "Czech (CZ) Language Pack", + "langpack_id": "cs", "languages": { "cs": { - "version": "20200403115518", + "version": "20200420081415", "chrome_resources": { - "places": "chrome/cs/locale/cs/places/", - "autoconfig": "chrome/cs/locale/cs/autoconfig/", "pipnss": "chrome/cs/locale/cs/pipnss/", - "chat": "chrome/cs/locale/cs/chat/", - "alerts": "chrome/cs/locale/cs/alerts/", - "branding": "chrome/cs/locale/cs/branding/", - "pippki": "chrome/cs/locale/cs/pippki/", - "devtools-startup": "chrome/cs/locale/cs/devtools/startup/", + "messenger": "chrome/cs/locale/cs/messenger/", "devtools": "chrome/cs/locale/cs/devtools/client/", "necko": "chrome/cs/locale/cs/necko/", - "mozapps": "chrome/cs/locale/cs/mozapps/", + "messenger-mapi": "chrome/cs/locale/cs/messenger-mapi/", + "lightning": "chrome/cs/locale/cs/lightning/", + "global": "chrome/cs/locale/cs/global/", + "alerts": "chrome/cs/locale/cs/alerts/", + "communicator": "chrome/cs/locale/cs/communicator/", "global-platform": { - "linux": "chrome/cs/locale/cs/global-platform/unix/", - "win": "chrome/cs/locale/cs/global-platform/win/", "android": "chrome/cs/locale/cs/global-platform/unix/", - "macosx": "chrome/cs/locale/cs/global-platform/mac/" + "linux": "chrome/cs/locale/cs/global-platform/unix/", + "macosx": "chrome/cs/locale/cs/global-platform/mac/", + "win": "chrome/cs/locale/cs/global-platform/win/" }, - "messenger-newsblog": "chrome/cs/locale/cs/messenger-newsblog/", - "calendar": "chrome/cs/locale/cs/calendar/", - "passwordmgr": "chrome/cs/locale/cs/passwordmgr/", - "messenger": "chrome/cs/locale/cs/messenger/", + "mozapps": "chrome/cs/locale/cs/mozapps/", + "chat": "chrome/cs/locale/cs/chat/", + "places": "chrome/cs/locale/cs/places/", + "branding": "chrome/cs/locale/cs/branding/", + "mozldap": "chrome/cs/locale/cs/mozldap/", + "pluginproblem": "chrome/cs/locale/cs/pluginproblem/", "devtools-shared": "chrome/cs/locale/cs/devtools/shared/", + "passwordmgr": "chrome/cs/locale/cs/passwordmgr/", + "autoconfig": "chrome/cs/locale/cs/autoconfig/", + "pippki": "chrome/cs/locale/cs/pippki/", + "devtools-startup": "chrome/cs/locale/cs/devtools/startup/", + "calendar": "chrome/cs/locale/cs/calendar/", "messenger-region": "chrome/cs/locale/cs/messenger-region/", - "messenger-mapi": "chrome/cs/locale/cs/messenger-mapi/", - "communicator": "chrome/cs/locale/cs/communicator/", - "mozldap": "chrome/cs/locale/cs/mozldap/", - "global": "chrome/cs/locale/cs/global/", - "messenger-smime": "chrome/cs/locale/cs/messenger-smime/", - "lightning": "chrome/cs/locale/cs/lightning/", - "pluginproblem": "chrome/cs/locale/cs/pluginproblem/" + "messenger-newsblog": "chrome/cs/locale/cs/messenger-newsblog/", + "messenger-smime": "chrome/cs/locale/cs/messenger-smime/" } } - }, - "name": "Czech (CZ) Language Pack", - "description": "Language pack for Thunderbird for cs", - "manifest_version": 2, - "author": "Mozilla.cz (contributors: Pavel Cvrček, Pavel Franc, Michal Stanke, Michal Vašíček)" + } } diff --git a/thunderbird-l10n/cy/chrome/cy/locale/cy/devtools/client/inspector.properties b/thunderbird-l10n/cy/chrome/cy/locale/cy/devtools/client/inspector.properties index 8a36aef5a6e71996f67e66241c3dbe759ffa9842..2329bf661f94c556a7a227255fac2abd5c35c100 100644 --- a/thunderbird-l10n/cy/chrome/cy/locale/cy/devtools/client/inspector.properties +++ b/thunderbird-l10n/cy/chrome/cy/locale/cy/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Mae gan yr elfen hon troslifo sgrolio. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Dim rheol gysylltiedig +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Pwyswch Shift a chlicio i symud i reol + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/cy/chrome/cy/locale/cy/global/css.properties b/thunderbird-l10n/cy/chrome/cy/locale/cy/global/css.properties index fac3dd28680d0d0c8aeb3431c22aa62a5e2720ca..a142027e849a86e9bbb84525ca8d3843786d74d9 100644 --- a/thunderbird-l10n/cy/chrome/cy/locale/cy/global/css.properties +++ b/thunderbird-l10n/cy/chrome/cy/locale/cy/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=Cafodd y ddalen steil %1$S ei llwytho fel CSS er nad yw ei fath M PEUnexpEOF2=Diwedd ffeil annisgwyl wrth chwilio am %1$S. PEParseRuleWSOnly=Llinyn bwlch gwyn yn unig i'w ddidoli fel rheol. + PEDeclDropped=Datganiad wedi ei hepgor. PEDeclSkipped=Neidio i'r datganiad nesaf. PEUnknownProperty=Priodwedd anhysbys ‘%1$S’. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Dim ond unrepeat(auto-fill, …) sy'n PEMoreThanOneGridRepeatAutoFillFitInTrackList=Dim ond un repeat(auto-fill, …) neu repeat(auto-fit, …) sy'n cael ei ganiatáu yn y rhestr tracio. PEMoreThanOneGridRepeatTrackSize=Dim ond un maint trac sy'n cael ei ganiatáu o fewn repeat(auto-fit/auto-fill, …). +PEDisallowedImportRule=Nid yw rheolau @import yn ddilys eto mewn taflenni arddull wedi'u hadeiladu. + TooLargeDashedRadius=Mae radiws yr ymyl yn rhy fawr ar gyfer arddull toredig (y terfyn yw 100000px). Rendro fel solet. TooLargeDottedRadius=Mae radiws yr ymyl yn rhy fawr ar gyfer arddull dotiog (y terfyn yw 100000px). Rendro fel solet. diff --git a/thunderbird-l10n/cy/chrome/cy/locale/cy/global/security/security.properties b/thunderbird-l10n/cy/chrome/cy/locale/cy/global/security/security.properties index 9cb8ddb9a8c18d9e3d0bc7a5b7483ff6cdaade66..b58f66a5f2e4e02db376c5f3ee6dce6472dbf0e7 100644 --- a/thunderbird-l10n/cy/chrome/cy/locale/cy/global/security/security.properties +++ b/thunderbird-l10n/cy/chrome/cy/locale/cy/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Gwrthodwyd y llwyth gan X-Frame-Options: “%1$S” o “%2$S”, nid # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Gwrthodwyd y llwyth gan X-Frame-Options: “%1$S” o “%2$S”, nid yw'r wefan yn caniatáu fframio croes ffynhonnell o “%3$S”. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Cafwyd hyd i bennawd annilys X-Frame-Options wrth lwytho “%2$SS”: nid yw “%1$S” yn gyfarwyddeb ddilys. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=Mae llwytho “%2$S” mewn ffrâm yn cael ei wrthod gan gyfarwyddeb “X-Frame-Options” sydd wedi ei osod i “%1$S”. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Uwchraddio cais ansicr %1$S” i ddefnyddio %2$S. diff --git a/thunderbird-l10n/cy/chrome/cy/locale/cy/messenger/messenger.dtd b/thunderbird-l10n/cy/chrome/cy/locale/cy/messenger/messenger.dtd index 320483bd65e9db3ad2d1e8ec52e3364e972a3e42..6d936042894f28d380ed483f37c02676fd757be5 100644 --- a/thunderbird-l10n/cy/chrome/cy/locale/cy/messenger/messenger.dtd +++ b/thunderbird-l10n/cy/chrome/cy/locale/cy/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Chwilio Negeseuon…"> <!ENTITY searchMailCmd.accesskey "N"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Chwilio Eang…"> +<!ENTITY glodaSearchCmd.accesskey "C"> <!ENTITY searchAddressesCmd.label "Chwilio Cyfeiriadau…"> <!ENTITY searchAddressesCmd.accesskey "y"> diff --git a/thunderbird-l10n/cy/chrome/cy/locale/cy/messenger/pgpmime.properties b/thunderbird-l10n/cy/chrome/cy/locale/cy/messenger/pgpmime.properties index 5a968da7f039209f33004296130ddf01aef9a2cc..33cbfb568d22971e8d9fb5399ff451343ba17938 100644 --- a/thunderbird-l10n/cy/chrome/cy/locale/cy/messenger/pgpmime.properties +++ b/thunderbird-l10n/cy/chrome/cy/locale/cy/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=Mae hwn yn neges OpenPGP amgryptiedig.<br>Er mwyn ei ddadgryptio'r e-bost, rhaid gosod <a href="%S">ychwanegyn OpenPGP</a>. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Neges OpenPGP wedi'i hamgryptio yw hon, ond nid oes cefnogaeth ar gyfer dadgryptio OpenPGP ar gael. diff --git a/thunderbird-l10n/cy/chrome/cy/locale/cy/necko/necko.properties b/thunderbird-l10n/cy/chrome/cy/locale/cy/necko/necko.properties index 9a70c1134bd2d24f9dd9b45165ff4dbc7ecdce11..43ec8a645e9b41bd5c0353893f68f183cc67dea6 100644 --- a/thunderbird-l10n/cy/chrome/cy/locale/cy/necko/necko.properties +++ b/thunderbird-l10n/cy/chrome/cy/locale/cy/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Mynediad storio wedi ei roi yn awtoma # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Mynediad storio wedi ei roi i yn awtomatig i draciwr “%2$S” ar “%1$S”. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Mae mynediad storio yn cael ei roi'n awtomatig ar gyfer ynysu Parti Cyntaf “%2$S” ar “%1$S”. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Gwrthodwyd cwci “%1$S” oherwydd bod ganddo'r priodoledd “sameSite=none” ond ei fod yn colli'r priodoledd “secure”. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/cy/localization/cy/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/cy/localization/cy/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..5dda2dfb6022e8a5e222d172e6c9a439ee2911e9 --- /dev/null +++ b/thunderbird-l10n/cy/localization/cy/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Ailgyfeirio URI Calendr +calendar-uri-redirect-description = + Mae'r gweinydd yn ailgyfeirio URI calendr "{ $calendarName }". + Derbyn yr ailgyfeirio a dechrau defnyddio'r URI newydd ar gyfer y calendr hwn? +calendar-uri-redirect-original-uri-label = URI cyfredol: +calendar-uri-redirect-target-uri-label = Ailgyfeirio i URI newydd: diff --git a/thunderbird-l10n/cy/localization/cy/messenger/accountCentral.ftl b/thunderbird-l10n/cy/localization/cy/messenger/accountCentral.ftl index f2893ccfad5b6588985ef87edd134b0b77ef6302..3cf6d4e63d7e45dab298ba2d2397313459751a24 100644 --- a/thunderbird-l10n/cy/localization/cy/messenger/accountCentral.ftl +++ b/thunderbird-l10n/cy/localization/cy/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Croeso i { -brand-full-name } +account-settings = Gosodiadau Cyfrif +# $accounts (Number) - the number of configured accounts setup-title = Dewis Beth i'w Osod about-title = Ynghylch { -brand-full-name } resources-title = Adnoddau @@ -40,3 +42,10 @@ explore-link = Edrych ar y Nodweddion support-link = Cefnogaeth involved-link = Ymunwch â ni! developer-link = Dogfennaeth Datblygwr +read = Darllen negeseuon +compose = Ysgrifennu neges newydd +search = Chwilio drwy'r Negeseuon +filter = Rheoli hidlau negeseuon +nntp-subscription = Rheoli tanysgrifiadau grwpiau newyddion +rss-subscription = Rheoli tanysgrifiadau llif +e2e = Amgryptio Pen-i-Ben diff --git a/thunderbird-l10n/cy/localization/cy/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/cy/localization/cy/toolkit/about/aboutAddons.ftl index 18c5ac61188968a79bfe9378b1f78c0724d800a2..061ab50860d7b1997b56f4a1aee924bc64852352 100644 --- a/thunderbird-l10n/cy/localization/cy/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/cy/localization/cy/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Gosod Ychwanegyn o Ffeil… .accesskey = G help-button = Cefnogaeth Ychwanegion +sidebar-help-button-title = + .title = Cefnogaeth Ychwanegion preferences = { PLATFORM() -> [windows] Dewisiadau { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Offer ar gyfer pob ychwanegyn +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Dewisiadau { -brand-short-name } + *[other] Dewisiadau { -brand-short-name } + } show-unsigned-extensions-button = .label = Nid oedd modd dilysu rhai estyniadau show-all-extensions-button = @@ -165,13 +173,29 @@ extensions-view-available-updates = .name = Diweddariadau ar Gael .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Argymhellion +addon-category-discover-title = + .title = Argymhellion addon-category-extension = Estyniadau +addon-category-extension-title = + .title = Estyniadau addon-category-theme = Themâu +addon-category-theme-title = + .title = Themâu addon-category-plugin = Ategion +addon-category-plugin-title = + .title = Ategion addon-category-dictionary = Geiriaduron +addon-category-dictionary-title = + .title = Geiriaduron addon-category-locale = Iaith +addon-category-locale-title = + .title = Iaith addon-category-available-updates = Diweddariadau ar Gael +addon-category-available-updates-title = + .title = Diweddariadau ar Gael addon-category-recent-updates = Diweddariadau Diweddar +addon-category-recent-updates-title = + .title = Diweddariadau Diweddar ## These are global warnings @@ -284,6 +308,7 @@ shortcuts-no-commands = Nid oes gan yr estyniadau canlynol lwybrau byr: shortcuts-input = .placeholder = Teipiwch llwybr byr shortcuts-browserAction = Cychwyn estyniad +shortcuts-browserAction2 = Cychwyn botwm bar offer shortcuts-pageAction = Cychwyn gweithred tudalen shortcuts-sidebarAction = Toglo'r bar ochr shortcuts-modifier-mac = Cynnwys Ctrl, Alt, neu ⌘ @@ -313,6 +338,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Dangos Llai go-back-button = .tooltiptext = Mynd nôl +header-back-button = + .title = Mynd nôl ## Recommended add-ons page diff --git a/thunderbird-l10n/cy/localization/cy/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/cy/localization/cy/toolkit/about/aboutSupport.ftl index 5e3b82684dc011462c0db84c4eb88150fd04645e..d71eb964fba65b36451f19786bacf7935910bd89 100644 --- a/thunderbird-l10n/cy/localization/cy/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/cy/localization/cy/toolkit/about/aboutSupport.ftl @@ -307,6 +307,11 @@ sandbox-proc-type-content = cynnwys sandbox-proc-type-file = cynnwys ffeil sandbox-proc-type-media-plugin = ategyn cyfrwng sandbox-proc-type-data-decoder = datgodydd data +startup-cache-title = Storfa cychwyn +startup-cache-disk-cache-path = Llwybr Storfa Disg +startup-cache-ignore-disk-cache = Anwybyddu Storfa Disg +startup-cache-found-disk-cache-on-init = Wedi dod o hyd i Storfa Disg ar Init +startup-cache-wrote-to-disk-cache = Ysgrifennwyd at Storfa Disg launcher-process-status-0 = Galluogwyd launcher-process-status-1 = Analluogwyd oherwydd methiant launcher-process-status-2 = Analluogwyd yn orfodol @@ -330,6 +335,7 @@ touch-enabled = mewnbwn cyffwrdd wedi ei alluogi drag-enabled = wedi galluogu llusgo bar sgrolio keyboard-enabled = bysellfwrdd wedi ei anlluogi autoscroll-enabled = galluogwyd awtosgrolio +zooming-enabled = pinsio chwyddo llyfn wedi'i alluogi ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/cy/localization/cy/toolkit/about/certviewer.ftl b/thunderbird-l10n/cy/localization/cy/toolkit/about/certviewer.ftl index 88ab3ed161adceceae223b1917b3c2b440741d7f..6e2cf4dd6d4694c4cdb93a77171cb67fa0034dbe 100644 --- a/thunderbird-l10n/cy/localization/cy/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/cy/localization/cy/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (tystysgrif) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (cadwyn) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Mae'r estyniad hwn wedi'i nodi fel un hanfodol, sy'n golygu bod yn rhaid i gleientiaid wrthod y dystysgrif os nad ydyn nhw'n ei deall. +certificate-viewer-export = Allforio + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Eich Tystysgrifau +certificate-viewer-tab-people = Pobl +certificate-viewer-tab-servers = Gweinyddion +certificate-viewer-tab-ca = Awdurdodau +certificate-viewer-tab-unkonwn = Anhysbys diff --git a/thunderbird-l10n/cy/localization/cy/toolkit/global/processTypes.ftl b/thunderbird-l10n/cy/localization/cy/toolkit/global/processTypes.ftl index 9ac560ade8662558144b4d0fb37ca4549153cd32..4b660f7c2ccd9053ddcffac3212798af0452bf58 100644 --- a/thunderbird-l10n/cy/localization/cy/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/cy/localization/cy/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Cynnwys Gwe Ynysig # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Soced diff --git a/thunderbird-l10n/cy/localization/cy/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/cy/localization/cy/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..f20d647a700e3163240e40c732760918772a4740 --- /dev/null +++ b/thunderbird-l10n/cy/localization/cy/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Rydych chi wedi cychwyn fersiwn hŷn o { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Creu Proffil Newydd +profiledowngrade-sync = Mae defnyddio fersiwn hŷn o { -brand-product-name } yn gallu llygru nodiadau llyfr a hanes pori sydd eisoes wedi'u cadw i broffil { -brand-product-name } presennol. Er mwyn diogelu'ch gwybodaeth, crëwch broffil newydd ar gyfer gosodiad hwn o { -brand-short-name }. Gallwch bob amser mewngofnodi gyda { -fxaccount-brand-name } i gydweddu eich nodau tudalen a'ch hanes pori rhwng proffiliau. +profiledowngrade-nosync = Mae defnyddio fersiwn hŷn o { -brand-product-name } yn gallu llygru nodau tudalen a hanes pori sydd eisoes wedi'u cadw i broffil { -brand-product-name } presennol. Er mwyn diogelu'ch gwybodaeth, crëwch broffil newydd ar gyfer gosod { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Gadael + *[other] Gadael + } diff --git a/thunderbird-l10n/cy/manifest.json b/thunderbird-l10n/cy/manifest.json index 561da3f6eeb5accedb9a8b8d30e6863dd75fe05e..c9c487f094fe0b685e3569578e05ec481bcbd6a0 100644 --- a/thunderbird-l10n/cy/manifest.json +++ b/thunderbird-l10n/cy/manifest.json @@ -1,57 +1,57 @@ { - "description": "Language pack for Thunderbird for cy", - "name": "Cymraeg Language Pack", - "author": "mozilla.org (contributors: Rhoslyn Prys)", + "langpack_id": "cy", + "manifest_version": 2, "sources": { "browser": { "base_path": "browser/" } }, - "langpack_id": "cy", - "manifest_version": 2, - "version": "76.0buildid20200407173003", "applications": { "gecko": { - "id": "langpack-cy@thunderbird.mozilla.org", + "strict_min_version": "76.0", "strict_max_version": "76.*", - "strict_min_version": "76.0" + "id": "langpack-cy@thunderbird.mozilla.org" } }, + "description": "Language pack for Thunderbird for cy", "languages": { "cy": { - "version": "20200403105218", "chrome_resources": { + "alerts": "chrome/cy/locale/cy/alerts/", + "pluginproblem": "chrome/cy/locale/cy/pluginproblem/", "global-platform": { - "android": "chrome/cy/locale/cy/global-platform/unix/", "macosx": "chrome/cy/locale/cy/global-platform/mac/", - "win": "chrome/cy/locale/cy/global-platform/win/", - "linux": "chrome/cy/locale/cy/global-platform/unix/" + "android": "chrome/cy/locale/cy/global-platform/unix/", + "linux": "chrome/cy/locale/cy/global-platform/unix/", + "win": "chrome/cy/locale/cy/global-platform/win/" }, - "mozapps": "chrome/cy/locale/cy/mozapps/", - "pippki": "chrome/cy/locale/cy/pippki/", - "global": "chrome/cy/locale/cy/global/", - "calendar": "chrome/cy/locale/cy/calendar/", - "messenger-newsblog": "chrome/cy/locale/cy/messenger-newsblog/", - "pluginproblem": "chrome/cy/locale/cy/pluginproblem/", "devtools-startup": "chrome/cy/locale/cy/devtools/startup/", - "messenger-smime": "chrome/cy/locale/cy/messenger-smime/", - "passwordmgr": "chrome/cy/locale/cy/passwordmgr/", - "messenger": "chrome/cy/locale/cy/messenger/", - "communicator": "chrome/cy/locale/cy/communicator/", - "mozldap": "chrome/cy/locale/cy/mozldap/", + "lightning": "chrome/cy/locale/cy/lightning/", + "chat": "chrome/cy/locale/cy/chat/", "devtools": "chrome/cy/locale/cy/devtools/client/", - "alerts": "chrome/cy/locale/cy/alerts/", - "devtools-shared": "chrome/cy/locale/cy/devtools/shared/", + "communicator": "chrome/cy/locale/cy/communicator/", + "messenger": "chrome/cy/locale/cy/messenger/", "messenger-region": "chrome/cy/locale/cy/messenger-region/", - "lightning": "chrome/cy/locale/cy/lightning/", - "pipnss": "chrome/cy/locale/cy/pipnss/", - "necko": "chrome/cy/locale/cy/necko/", - "branding": "chrome/cy/locale/cy/branding/", + "devtools-shared": "chrome/cy/locale/cy/devtools/shared/", "autoconfig": "chrome/cy/locale/cy/autoconfig/", + "mozapps": "chrome/cy/locale/cy/mozapps/", + "necko": "chrome/cy/locale/cy/necko/", + "messenger-smime": "chrome/cy/locale/cy/messenger-smime/", + "calendar": "chrome/cy/locale/cy/calendar/", + "messenger-mapi": "chrome/cy/locale/cy/messenger-mapi/", + "messenger-newsblog": "chrome/cy/locale/cy/messenger-newsblog/", + "pipnss": "chrome/cy/locale/cy/pipnss/", + "global": "chrome/cy/locale/cy/global/", + "passwordmgr": "chrome/cy/locale/cy/passwordmgr/", "places": "chrome/cy/locale/cy/places/", - "chat": "chrome/cy/locale/cy/chat/", - "messenger-mapi": "chrome/cy/locale/cy/messenger-mapi/" - } + "branding": "chrome/cy/locale/cy/branding/", + "mozldap": "chrome/cy/locale/cy/mozldap/", + "pippki": "chrome/cy/locale/cy/pippki/" + }, + "version": "20200415081206" } - } + }, + "name": "Cymraeg Language Pack", + "author": "mozilla.org (contributors: Rhoslyn Prys)", + "version": "76.0buildid20200420212409" } diff --git a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/debugger.properties b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/debugger.properties index 10577944bd875e2edc5f424a66f3a894b592eaf9..9c3f9b2e395f1f8f536302f6b01aaa766b6f308d 100644 --- a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/debugger.properties +++ b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/debugger.properties @@ -55,6 +55,41 @@ setDirectoryRoot.accesskey=r removeDirectoryRoot.label=Fjern rod-mappe removeDirectoryRoot.accesskey=m +# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item +blackBoxAll.label=Blackbox + +# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected group +blackBoxAllInGroup.label=Blackbox filer i denne gruppe + +# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected group +unblackBoxAllInGroup.label=Slut blackboxing af filer i denne gruppe + +# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected group +blackBoxAllOutsideGroup.label=Blackbox filer uden for denne gruppe + +# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to unblackbox all files outside of the selected group +unblackBoxAllOutsideGroup.label=Slut blackboxing af filer uden for denne gruppe + +# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected directory +blackBoxAllInDir.label=Blackbox filer i denne mappe + +# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected directory +unblackBoxAllInDir.label=Slut blackboxing af filer i denne mappe + +# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected directory +blackBoxAllOutsideDir.label=Blackbox filer uden for denne mappe + +# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the +# context submenu to unblackbox all files outside of the selected directory +unblackBoxAllOutsideDir.label=Slut blackboxing af filer uden for denne mappe + # LOCALIZATION NOTE (copyFunction): This is the text that appears in the # context menu to copy the function the user selected copyFunction.label=Kopier funktion @@ -1054,11 +1089,6 @@ whyPaused.mutationBreakpointRemoved=Fjernet: # a JS execution whyPaused.interrupted=Sat på pause ved udførelse -# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed -# in a info block explaining how the debugger is currently paused in a -# recording. -whyPaused.replayForcedPause=Sat på pause under optagelse - # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed # in a info block explaining how the debugger is currently paused while stepping # in or out of the stack @@ -1287,30 +1317,3 @@ serviceWorkerInfo.redundant=overflødig # LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a # service worker that is in an unknown state. serviceWorkerInfo.unknown=ukendt - -# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item -blackBoxAll.label=Blackbox -# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the -# context submenu to blackbox all files inside of the selected group -blackBoxAllInGroup.label=Blackbox files in this group -# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the -# context submenu to unblackbox all files inside of the selected group -unblackBoxAllInGroup.label=Unblackbox files in this group -# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the -# context submenu to blackbox all files outside of the selected group -blackBoxAllOutsideGroup.label=Blackbox files outside this group -# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the -# context submenu to unblackbox all files outside of the selected group -unblackBoxAllOutsideGroup.label=Unblackbox files outside this group -# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the -# context submenu to blackbox all files inside of the selected directory -blackBoxAllInDir.label=Blackbox files in this directory -# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the -# context submenu to unblackbox all files inside of the selected directory -unblackBoxAllInDir.label=Unblackbox files in this directory -# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the -# context submenu to blackbox all files outside of the selected directory -blackBoxAllOutsideDir.label=Blackbox files outside this directory -# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the -# context submenu to unblackbox all files outside of the selected directory -unblackBoxAllOutsideDir.label=Unblackbox files outside this directory diff --git a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/inspector.properties b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/inspector.properties index 561157ca56ee95f9f768ca9d4d4c386449473a4f..9dbb093a8bfe8dd31c88724889738bb8e5cb5253 100644 --- a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/inspector.properties +++ b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Dette element har overflow, der kan scrolles. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Ingen tilknyttet regel +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Hold tasten Skift nede og klik for at hoppe til regel + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/jsonview.properties b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/jsonview.properties index 2f08b6f80a90d6077ba6ad323492887dd8f7ac75..07f80258b6bb702ddbd5bf281a775003a1560542 100644 --- a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/jsonview.properties +++ b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/jsonview.properties @@ -32,6 +32,8 @@ jsonViewer.Copy=Kopier # LOCALIZATION NOTE (jsonViewer.ExpandAll): Label for expanding all nodes jsonViewer.ExpandAll=Udvid alle +jsonViewer.ExpandAllSlow=Udvid alle (langsom) + # LOCALIZATION NOTE (jsonViewer.CollapseAll): Label for collapsing all nodes jsonViewer.CollapseAll=Sammenfold alle @@ -50,5 +52,3 @@ jsonViewer.filterJSON=Filtrer JSON # LOCALIZATION NOTE (jsonViewer.reps.reference): Label used for cycle # references in an array. jsonViewer.reps.reference=Bladr i referencer - -jsonViewer.ExpandAllSlow=Expand All (slow) diff --git a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/netmonitor.properties b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/netmonitor.properties index d8247c242db0bcf2fc4045a8f090999d5116638a..ab4096cf69eb49ce336d424acb8a80e476c04290 100644 --- a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/netmonitor.properties +++ b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/netmonitor.properties @@ -350,6 +350,10 @@ netmonitor.timings.startedAt=Startet: %S # when the request actually finished downloading netmonitor.timings.downloadedAt=Hentet: %S +# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the +# timings pane when thea request has been blocked +netmonitor.timings.noTimings=Ingen timings for denne request + # LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed # in the network menu specifying timing interval divisions (in milliseconds). networkMenu.millisecond=%S ms @@ -760,6 +764,14 @@ netmonitor.ws.context.received=Modtagne # for the "Received" menu item displayed in the context menu in the websocket toolbar. netmonitor.ws.context.received.accesskey=M +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed +# on the context menu that shows "Control Frames" WebSocket frames. +netmonitor.ws.context.controlFrames=Kontrol + +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key +# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. +netmonitor.ws.context.controlFrames.accesskey=o + # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed # on the context menu that shows "Copy Message". netmonitor.ws.context.copyFrame=Kopier meddelelse @@ -780,11 +792,6 @@ netmonitor.ws.type.sent=Sendte # accessible text for the "received" type icon in the websocket table's "data" column. netmonitor.ws.type.received=Modtagne -# LOCALIZATION NOTE (netmonitor.ws.time.format): This is the format used for the -# time values in the websocket table's "time" column -# %1$S is the formatted hour-minutes-seconds, %2$S is the milliseconds (zero-padded) -netmonitor.ws.time.format=%1$S,%2$S - # LOCALIZATION NOTE (netmonitor.ws.rawData.header): This is the label displayed # in the messages panel identifying the raw data. netmonitor.ws.rawData.header=Rå data (%S) @@ -1021,6 +1028,14 @@ netmonitor.toolbar.resetColumns=Nulstil kolonner # displayed in the network table header context menu to reset sorting netmonitor.toolbar.resetSorting=Nulstil sortering +# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent): This is the label +# displayed in the network table header context menu to resize a column to fit its content +netmonitor.toolbar.resizeColumnToFitContent=Tilpas kolonnens størrelse til indholdet + +# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent.title): This is the title +# tooltip displayed when draggable resizer in network table headers is hovered +netmonitor.toolbar.resizeColumnToFitContent.title=Dobbeltklik for at tilpasse kolonnen til indholdet + # LOCALIZATION NOTE (netmonitor.toolbar.timings): This is the label # displayed in the network table header context menu for the timing submenu netmonitor.toolbar.timings=Timings @@ -1517,19 +1532,3 @@ netmonitor.cache.lastModified=Sidst ændret # LOCALIZATION NOTE (netmonitor.cache.device): This is the label text for the device # where a cached object was fetched from (e.g. "disk"). netmonitor.cache.device=Enhed - -# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the -# timings pane when thea request has been blocked -netmonitor.timings.noTimings=No timings for this request -# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed -# on the context menu that shows "Control Frames" WebSocket frames. -netmonitor.ws.context.controlFrames=Control -# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key -# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. -netmonitor.ws.context.controlFrames.accesskey=o -# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent): This is the label -# displayed in the network table header context menu to resize a column to fit its content -netmonitor.toolbar.resizeColumnToFitContent=Resize Column To Fit Content -# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent.title): This is the title -# tooltip displayed when draggable resizer in network table headers is hovered -netmonitor.toolbar.resizeColumnToFitContent.title=Double-click to fit column to content diff --git a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/toolbox.properties b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/toolbox.properties index 10751e92fdf5c7e481c2bf06fc865cd455007408..320d3901c8393ac6badd29384415176e022a67c7 100644 --- a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/toolbox.properties +++ b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/toolbox.properties @@ -291,22 +291,6 @@ browserToolbox.statusMessage=Status for Browserværktøjers forbindelse # shown in the web replay timeline marker toolbox.replay.jumpMessage=Hop til besked %1$S -# LOCALIZATION NOTE (toolbox.replay.jumpMessage2): This is the label -# shown in the web replay timeline marker -toolbox.replay.jumpMessage2=Hop til %1$S - -# LOCALIZATION NOTE (toolbox.replay.resume): This is the text that appears in the -# Replay command bar to prompt the user to resume the program. -toolbox.replay.resume=Fortsæt - -# LOCALIZATION NOTE (toolbox.replay.rewind): This is the text that appears in the -# Replay command bar to prompt the user to rewind the program. -toolbox.replay.rewind=Spol tilbage - -# LOCALIZATION NOTE (toolbox.replay.pause): This is the text that appears in the -# Replay command bar to prompt the user to pause the program. -toolbox.replay.pause=Pause - # LOCALIZATION NOTE (toolbox.debugTargetErrorPage.title): This is the title # for the Error view shown by the toolbox when a connection to a debug target # could not be made @@ -322,11 +306,6 @@ toolbox.debugTargetErrorPage.description = Kan ikke oprette forbindelse til dét # This entire text is treated as a link to an MDN page. options.deprecationNotice=Forældet. Læs mere… -# LOCALIZATION NOTE (options.experimentalNotice): This is the text that appears in the -# settings panel for the checkbox that enables Replay. -# This entire text is treated as a link to an MDN page. -options.experimentalNotice=Eksperimentelt. Læs mere… - # LOCALIZATION NOTE (options.enableMultiProcessToolbox): This is the text that appears in the # settings panel for the checkbox that enables the Multiprocess Browser Toolbox. options.enableMultiProcessToolbox=Aktivér værktøj for multiproces-browser (kræver genstart af Browserværktøjer) diff --git a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/webconsole.properties b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/webconsole.properties index 0030306f87d669ef6caf9a9cb8f488e65a41cb08..cc7d6836e74ef24be9ca9b075131d867f34a79fc 100644 --- a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/webconsole.properties +++ b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/webconsole.properties @@ -180,6 +180,12 @@ webconsole.menu.openInNetworkPanel.accesskey=N webconsole.menu.resendNetworkRequest.label= Send request igen webconsole.menu.resendNetworkRequest.accesskey=e +# LOCALIZATION NOTE (webconsole.menu.openNodeInInspector.label) +# Label used for a context-menu item displayed for DOM Node logs. Clicking on it will +# reveal that specific DOM Node in the Inspector. +webconsole.menu.openNodeInInspector.label=Vis i Inspektør +webconsole.menu.openNodeInInspector.accesskey=n + # LOCALIZATION NOTE (webconsole.menu.storeAsGlobalVar.label) # Label used for a context-menu item displayed for object/variable logs. Clicking on it # creates a new global variable pointing to the logged variable. @@ -374,11 +380,6 @@ webconsole.console.settings.menu.item.enablePersistentLogs.label=Vedvarende logn # LOCALIZATION NOTE (webconsole.console.settings.menu.item.enablePersistentLogs.tooltip) webconsole.console.settings.menu.item.enablePersistentLogs.tooltip=Slår du denne indstilling til, vil output'et ikke blive ryddet, hver gang du besøger en ny side -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.label) -webconsole.console.settings.menu.item.eagerEvaluation.label=Ivrig evaluering -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.tooltip) -webconsole.console.settings.menu.item.eagerEvaluation.tooltip=Aktiver dette for at lade inputtet blive ivrigt evalueret, mens du taster det ind. - # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.label) webconsole.console.settings.menu.item.instantEvaluation.label=Øjeblikkelig evaluering # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.tooltip) @@ -575,12 +576,8 @@ webconsole.input.selector.top=Top # expression for. webconsole.input.selector.tooltip=Vælg kontekst for evaluering -# LOCALIZATION NOTE (webconsole.menu.openNodeInInspector.label) -# Label used for a context-menu item displayed for DOM Node logs. Clicking on it will -# reveal that specific DOM Node in the Inspector. -webconsole.menu.openNodeInInspector.label=Reveal in Inspector -webconsole.menu.openNodeInInspector.accesskey=Q # LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultEnabled): do not translate 'sameSite'. -webconsole.group.cookieSameSiteLaxByDefaultEnabled=Some cookies are misusing the “sameSite“ attribute, so it won’t work as expected +webconsole.group.cookieSameSiteLaxByDefaultEnabled=Nogle cookies bruger attributten "sameSite" forkert, så den ikke virker som forventet # LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultDisabled): do not translate 'sameSite'. -webconsole.group.cookieSameSiteLaxByDefaultDisabled=Some cookies are misusing the recommended “sameSite“ attribute +webconsole.group.cookieSameSiteLaxByDefaultDisabled=Nogle cookies bruger den anbefalede attribut "sameSite" forkert + diff --git a/thunderbird-l10n/da/chrome/da/locale/da/global-platform/mac/accessible.properties b/thunderbird-l10n/da/chrome/da/locale/da/global-platform/mac/accessible.properties index 368645ff843be952c94ead12dc12e9f050cb8fb5..97870a056ed90caca580da82e2c6e8d88c12a847 100644 --- a/thunderbird-l10n/da/chrome/da/locale/da/global-platform/mac/accessible.properties +++ b/thunderbird-l10n/da/chrome/da/locale/da/global-platform/mac/accessible.properties @@ -58,8 +58,7 @@ separator = adskiller tabPanel = fanebladslinje # The roleDescription for the html:mark element highlight = fremhæv - # The roleDescription for the details element -details = details +details = detaljer # The roleDescription for the summary element -summary = summary +summary = sammenfatning diff --git a/thunderbird-l10n/da/chrome/da/locale/da/global/css.properties b/thunderbird-l10n/da/chrome/da/locale/da/global/css.properties index faa7cfb41d7fc0d6d9fc9d9626a0bd81a1be080c..95b95cdb34194c3dcaeaf38ce45a6db8c29975f5 100644 --- a/thunderbird-l10n/da/chrome/da/locale/da/global/css.properties +++ b/thunderbird-l10n/da/chrome/da/locale/da/global/css.properties @@ -179,5 +179,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Kun én repeat(auto-fill, …) er till PEMoreThanOneGridRepeatAutoFillFitInTrackList=Kun én repeat(auto-fill, …) eller (auto-fit, …) er tilladt i en track-liste. PEMoreThanOneGridRepeatTrackSize=Kun ét track-størrelse er tilladt inden i en repeat(auto-fit/auto-fill, …). +PEDisallowedImportRule=@import-regler er ikke gyldige endnu i konstruerede stylesheets. + TooLargeDashedRadius=Radius på border er for stor til at kunne bruge 'dashed' (grænsen er 100000px). Bruger i stedet 'solid'. TooLargeDottedRadius=Radius på border er for stor til at kunne bruge 'dotted' (grænsen er 100000px). Bruger i stedet 'solid'. diff --git a/thunderbird-l10n/da/chrome/da/locale/da/global/dom/dom.properties b/thunderbird-l10n/da/chrome/da/locale/da/global/dom/dom.properties index 928f20ea66deab1645e5a769e4f17a2df06b87ec..82352b81f70b31db1588163a9362f50cea3b029d 100644 --- a/thunderbird-l10n/da/chrome/da/locale/da/global/dom/dom.properties +++ b/thunderbird-l10n/da/chrome/da/locale/da/global/dom/dom.properties @@ -423,6 +423,5 @@ MathML_DeprecatedStyleAttributeWarning=MathML-attributterne "background", "color MathML_DeprecatedXLinkAttributeWarning=XLink-attributterne "href", "type", "show" og "actuate" er forældede for MathML-elementer og vil blive fjernet i fremtiden. WebShareAPI_Failed=Deling slog fejl. WebShareAPI_Aborted=Deling blev afbrudt. - # LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL. -UnknownProtocolNavigationPrevented=Prevented navigation to “%1$S” due to an unknown protocol. +UnknownProtocolNavigationPrevented=Forhindrede navigering til "%1$S" på grund af en ukendt protokol. diff --git a/thunderbird-l10n/da/chrome/da/locale/da/global/layout_errors.properties b/thunderbird-l10n/da/chrome/da/locale/da/global/layout_errors.properties index e069ab2966da7b81b1e01a2f1acc4c38bd8051ae..4d1bd35d6eee97bbd12755e9348345bfec536d0e 100644 --- a/thunderbird-l10n/da/chrome/da/locale/da/global/layout_errors.properties +++ b/thunderbird-l10n/da/chrome/da/locale/da/global/layout_errors.properties @@ -54,4 +54,4 @@ PrincipalWritingModePropagationWarning=Når <html>-elementet renderes bliver de ## %3$S is a floating point value with the total adjusted distance ScrollAnchoringDisabledInContainer=Scroll-anchoring blev deaktiveret i en scroll-container på grund af for mange sammenhængende tilpasninger (%1$S) med for lille sammenlagt afstand (%2$S px i gennemsnit, %3$S px totalt). -ForcedLayoutStart=Layout was forced before the page was fully loaded. If stylesheets are not yet loaded this may cause a flash of unstyled content. +ForcedLayoutStart=Layoutet blev gennemtvunget, før siden var helt indlæst. Hvis stylesheetsene ikke er indlæst endnu kan det medføre, at indholdet i et kort øjeblik vises uden styles. diff --git a/thunderbird-l10n/da/chrome/da/locale/da/global/security/security.properties b/thunderbird-l10n/da/chrome/da/locale/da/global/security/security.properties index 0222c84a8e419ff3d8ba5d118a08d832de0ea7b8..7e4a1c1b0346563f4ac4b89801276fb08fae6a8d 100644 --- a/thunderbird-l10n/da/chrome/da/locale/da/global/security/security.properties +++ b/thunderbird-l10n/da/chrome/da/locale/da/global/security/security.properties @@ -143,10 +143,16 @@ XFODeny = Indslæsning nægtet af X-Frame-Options: "%1$S" fra "%2$S", webstedet # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Indlæsning nægtet af X-Frame-Options: %1$S" fra "%2$S", webstedet tillader ikke cross-origin-framing på "%3$S. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = En ugyldigt X-Frame-Options-header blev fundet under indlæsning af "%2$S": "%1$S" er ikke et gyldigt direktiv. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=Indlæsning af "%2$S" i en frame blev nægtet af direktivet “X-Frame-Options“ sat til "%1$S". + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. -HTTPSOnlyUpgradeRequest = Upgrading insecure request “%1$S” to use “%2$S”. +HTTPSOnlyUpgradeRequest = Opgraderer den usikre forespørgsel "%1$S" til at bruge "%2$S". # LOCALIZATION NOTE: %1$S is the URL of request. -HTTPSOnlyNoUpgradeException = Not upgrading insecure request “%1$S” because it is exempt. +HTTPSOnlyNoUpgradeException = Opgraderer ikke den usikre forespørgsel "%1$S", fordi den er undtaget. # LOCALIZATION NOTE: %1$S is the URL of the failed request; %2$S is an error-code. -HTTPSOnlyFailedRequest = Upgrading insecure request “%1$S” failed. (%2$S) +HTTPSOnlyFailedRequest = Opgradering af den usikre forespørgsel "%1$S" slog fejl. (%2$S) diff --git a/thunderbird-l10n/da/chrome/da/locale/da/messenger/accountCreation.dtd b/thunderbird-l10n/da/chrome/da/locale/da/messenger/accountCreation.dtd index 621e66abfdb17878f2d1004049ad67b37af02324..14ad9ac7de91eda80cee794b1dd05cbabb9dd4af 100644 --- a/thunderbird-l10n/da/chrome/da/locale/da/messenger/accountCreation.dtd +++ b/thunderbird-l10n/da/chrome/da/locale/da/messenger/accountCreation.dtd @@ -79,7 +79,7 @@ <!ENTITY half-manual-test.label "Afprøv konfigurationen"> <!ENTITY half-manual-test.accesskey "ø"> <!ENTITY manual-edit.label "Manuel konfiguration"> -<!ENTITY manual-edit.accesskey "M"> +<!ENTITY manual-edit.accesskey "K"> <!ENTITY manual-config.label "Manuel opsætning…"> <!ENTITY manual-config.accesskey "M"> <!ENTITY open-provisioner.label "Få en ny mailadresse…"> diff --git a/thunderbird-l10n/da/chrome/da/locale/da/messenger/imapMsgs.properties b/thunderbird-l10n/da/chrome/da/locale/da/messenger/imapMsgs.properties index ca756b7826e35f4dabfda3d5a2fbd19539bb18e4..066b95390833e29955d8cce371543f7306dc28ad 100644 --- a/thunderbird-l10n/da/chrome/da/locale/da/messenger/imapMsgs.properties +++ b/thunderbird-l10n/da/chrome/da/locale/da/messenger/imapMsgs.properties @@ -201,12 +201,20 @@ imapServerDroppedConnection=Kan ikke tilslutte til IMAP-server. Du har måske ov forbindelser til serveren. Hvis det er tilfældet, kan du bruge dialogen Avancerede \ IMAP-server-indstillinger til at reducere antallet af cachede forbindelser. +# This will occur when a folder that has never been imap selected or opened +# (left-clicked) is first right-clicked to access quota properties. imapQuotaStatusFolderNotOpen=Kvote-information er ikke tilgængelig, fordi mappen ikke er åben. +# The imap capability response reports that QUOTA is not supported. imapQuotaStatusNotSupported=Serveren understøtter ikke kvoter. imapQuotaStatusNoQuota=Der er ingen kvote for, hvor meget der må gemmes i denne mappe. +# The getqutaroot command succeeded but reported no quota information. + +# Folder properties were requested by the user (right-click) before the getquotaroot +# command was sent. + # Out of memory imapOutOfMemory=Programmet er løbet tør for hukommelse. @@ -257,7 +265,7 @@ imapFolderCommandFailed=Handlingen for mappen '%2$S' mislykkedes. Mailserveren f # LOCALIZATION NOTE (imapServerAlert): # Place the word %1$S in your translation where the name of the account should appear. # Place the word %2$S in your translation where the alert from the server should appear. -imapServerAlert=Advarsel for kontoen %1$S: %2$S +imapServerAlert=Advarsel fra kontoen %1$S: %2$S # The getqutaroot command succeeded but reported no quota information. imapQuotaStatusNoQuota2=This folder reports no quota information. diff --git a/thunderbird-l10n/da/chrome/da/locale/da/necko/necko.properties b/thunderbird-l10n/da/chrome/da/locale/da/necko/necko.properties index b90aaebf9cf4d366b3aa35c8ec25582235febfc9..110df786c037503460d2ab362583fa82bd0faee2 100644 --- a/thunderbird-l10n/da/chrome/da/locale/da/necko/necko.properties +++ b/thunderbird-l10n/da/chrome/da/locale/da/necko/necko.properties @@ -55,6 +55,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Adgang til lager blev automatisk tild # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Adgang til lager blev automatisk tildelt for sporings-mekanismen "%2$S" på "%1$S". +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Adgang til lager blev automatisk tildelt første-parts isolationen "%2$S" på "%1$S". + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Cookien "%1$S" blev afvist, fordi den har attributten "sameSite=none" men mangler attributten "secure". # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". @@ -65,8 +68,7 @@ CookieLaxForced=Cookien "%1$S" har "sameSite"-policy sat til "lax", fordi den ma CookieLaxForcedForBeta=Cookien "%1$S" har ikke den korrekte "sameSite" attribut-værdi. Cookies uden attributten "sameSite" eller med en ugyldig værdi vil snart blive behandlet som "lax". Dette betyder, at cookien ikke længere vil blive sendt i tredjeparts-kontekster. Hvis din applikation er afhængig af, at denne cookie er tilgængelig i sådanne kontekster, skal du tilføje attributten "sameSite=none" til cookien. Læs %2$S for at lære mere om attributten "sameSite". # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none" CookieSameSiteValueInvalid=Ugyldig "sameSite"-værdi for cookien "%1$S". De understøttede værdier er: "lax", "strict" og "none". - # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookieOversize=Cookie “%1$S” is invalid because its size is too big. Max size is %2$S B. +CookieOversize=Cookie "%1$S" er ugyldig, fordi den fylder for meget. Den største tilladte størrelse er %2$S B. # LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B. +CookiePathOversize=Cookien "%1$S" er ugyldig, fordi dens sti-størrelse er for stor. Den største tilladte størrelse er %2$S B. diff --git a/thunderbird-l10n/da/localization/da/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/da/localization/da/devtools/client/aboutdebugging.ftl index 5c1776aaa3e13ade01539a6fe2cad635ace14671..a614a3cd314a1ba97a3162b234bb5051c35369ae 100644 --- a/thunderbird-l10n/da/localization/da/devtools/client/aboutdebugging.ftl +++ b/thunderbird-l10n/da/localization/da/devtools/client/aboutdebugging.ftl @@ -231,6 +231,10 @@ about-debugging-browser-version-too-old = Den forbundne browser har en gammel ve # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1") about-debugging-browser-version-too-old-67-debugger = Debugger-panelet virker muligvis ikke med den forbundne browser. Anvend Firefox { $runtimeVersion }, hvis du skal bruge debuggeren med denne browser. +# Dedicated message for a backward compatibility issue that occurs when connecting: +# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68. +about-debugging-browser-version-too-old-fennec = Denne version af Firefox kan ikke bruges til at debugge Firefox til Android (68). Vi anbefaler, at du installerer Firefox Nightly til Android for at kunne teste. < a>Læs mere</a> + # This string is displayed in the runtime page if the remote browser version is too recent. # "Troubleshooting" link points to https://developer.mozilla.org/en-US/docs/Tools/WebIDE/Troubleshooting # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd) diff --git a/thunderbird-l10n/da/localization/da/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/da/localization/da/toolkit/about/aboutAddons.ftl index 0a733aa07d06ee954f4a689a32fc54780d979aee..fe15339f6aba5ca605ade02aab279b210539b688 100644 --- a/thunderbird-l10n/da/localization/da/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/da/localization/da/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Installer tilføjelse fra fil… .accesskey = I help-button = Hjælp til tilføjelser +sidebar-help-button-title = + .title = Hjælp til tilføjelser preferences = { PLATFORM() -> [windows] Indstillinger for { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Indstillinger for alle tilføjelser +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Indstillinger for { -brand-short-name } + *[other] Indstillinger for { -brand-short-name } + } show-unsigned-extensions-button = .label = Nogle udvidelser kunne ikke bekræftes show-all-extensions-button = @@ -177,13 +185,29 @@ extensions-view-available-updates = .name = Tilgængelige opdateringer .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Anbefalinger +addon-category-discover-title = + .title = Anbefalinger addon-category-extension = Udvidelser +addon-category-extension-title = + .title = Udvidelser addon-category-theme = Temaer +addon-category-theme-title = + .title = Temaer addon-category-plugin = Plugins +addon-category-plugin-title = + .title = Plugins addon-category-dictionary = Ordbøger +addon-category-dictionary-title = + .title = Ordbøger addon-category-locale = Sprog +addon-category-locale-title = + .title = Sprog addon-category-available-updates = Tilgængelige opdateringer +addon-category-available-updates-title = + .title = Tilgængelige opdateringer addon-category-recent-updates = Seneste opdateringer +addon-category-recent-updates-title = + .title = Seneste opdateringer ## These are global warnings @@ -296,6 +320,7 @@ shortcuts-no-commands = Følgende udvidelser han ingen genveje: shortcuts-input = .placeholder = Indtast en genvej. shortcuts-browserAction = Aktiver udvidelse +shortcuts-browserAction2 = Aktiver knap på værktøjslinjen shortcuts-pageAction = Aktiver sidehandling shortcuts-sidebarAction = Vis/skjul sidepanelet shortcuts-modifier-mac = Inkluder Ctrl, Alt eller ⌘ @@ -320,6 +345,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Vis færre go-back-button = .tooltiptext = Gå tilbage +header-back-button = + .title = Gå tilbage ## Recommended add-ons page diff --git a/thunderbird-l10n/da/localization/da/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/da/localization/da/toolkit/about/aboutSupport.ftl index bc3d556a107530d509d1fc07066ed43fe56cdf21..28d898f50fa3dd089ce5c7acae859808fb6231fd 100644 --- a/thunderbird-l10n/da/localization/da/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/da/localization/da/toolkit/about/aboutSupport.ftl @@ -291,6 +291,13 @@ sandbox-proc-type-content = indhold sandbox-proc-type-file = fil-indhold sandbox-proc-type-media-plugin = medie-plugin sandbox-proc-type-data-decoder = data-decoder + +startup-cache-title = Opstarts-cache +startup-cache-disk-cache-path = Sti til disk-cache +startup-cache-ignore-disk-cache = Ignorer disk-cache +startup-cache-found-disk-cache-on-init = Fandt disk-cache på Init +startup-cache-wrote-to-disk-cache = Skrev til disk-cache + launcher-process-status-0 = Aktiveret launcher-process-status-1 = Deaktiveret på grund af en fejl launcher-process-status-2 = Deaktiveret @@ -315,6 +322,8 @@ drag-enabled = træk i rullebjælke keyboard-enabled = tastatur autoscroll-enabled = autoscroll +zooming-enabled = smooth pinch-zoom + ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/da/localization/da/toolkit/about/certviewer.ftl b/thunderbird-l10n/da/localization/da/toolkit/about/certviewer.ftl index e03a12dd598d4cfb8761798d19f467294712fd3c..b1a0226b4390ad8de0ac944b915325f1f4932a54 100644 --- a/thunderbird-l10n/da/localization/da/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/da/localization/da/toolkit/about/certviewer.ftl @@ -29,6 +29,8 @@ certificate-viewer-id = ID certificate-viewer-key-exchange-group = Nøgleudvekslingsgruppe certificate-viewer-key-id = Nøgle-ID certificate-viewer-key-size = Nøgle-størrelse +# Inc. means Incorporated, e.g GitHub is incorporated in Delaware +certificate-viewer-inc-locality = Virksomhedens placering certificate-viewer-locality = Lokalitet certificate-viewer-location = Placering certificate-viewer-logid = Log-ID @@ -94,3 +96,17 @@ certificate-viewer-download-pem = PEM (cert) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (kæde) .download = { $fileName }-chain.pem + +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Denne udvidelse er blevet markeret som kritisk, hvilket betyder at klienter skal afvise certifikatet, hvis de ikke forstår det. +certificate-viewer-export = Eksporter + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Dine certifikater +certificate-viewer-tab-people = Personer +certificate-viewer-tab-servers = Servere +certificate-viewer-tab-ca = Autoriteter +certificate-viewer-tab-unkonwn = Ukendt diff --git a/thunderbird-l10n/da/localization/da/toolkit/global/processTypes.ftl b/thunderbird-l10n/da/localization/da/toolkit/global/processTypes.ftl index 9f8df38d04076c5fbe8d4299e654d678fcd3a98b..de19553684c691c4e103d465d7599857a79d56ab 100644 --- a/thunderbird-l10n/da/localization/da/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/da/localization/da/toolkit/global/processTypes.ftl @@ -32,3 +32,6 @@ process-type-webisolated = Isoleret web-indhold # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU + +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/da/localization/da/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/da/localization/da/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..be0cf601686e71247495a3c6b6895a3ddf5c3bc9 --- /dev/null +++ b/thunderbird-l10n/da/localization/da/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Du har startet en gammel version af { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Opret en ny profil +profiledowngrade-sync = Du risikerer at få ødelagt dine data, såsom browsing-historik og bogmærker, hvis du bruger en gammel version af { -brand-product-name } sammen med en nyere profil. Opret i stedet en ny profil for denne installation af { -brand-short-name } for at beskytte dine data. Du kan logge ind med en { -fxaccount-brand-name } for at synkronisere dine bogmærker og din browsing-historik mellem forskellige profiler. +profiledowngrade-nosync = Du risikerer at få ødelagt dine data, såsom browsing-historik og bogmærker, hvis du bruger en gammel version af { -brand-product-name } sammen med en nyere profil. Opret i stedet en ny profil for denne installation af { -brand-short-name } for at beskytte dine data. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Afslut + *[other] Afslut + } diff --git a/thunderbird-l10n/da/manifest.json b/thunderbird-l10n/da/manifest.json index b57ee16de1bb3da87b1202c59d81b35d4b333e3e..487d34bddca76d92552a1e56da4440039e3f15f7 100644 --- a/thunderbird-l10n/da/manifest.json +++ b/thunderbird-l10n/da/manifest.json @@ -4,54 +4,54 @@ "base_path": "browser/" } }, - "langpack_id": "da", - "description": "Language pack for Thunderbird for da", "applications": { "gecko": { + "strict_max_version": "76.*", "strict_min_version": "76.0", - "id": "langpack-da@thunderbird.mozilla.org", - "strict_max_version": "76.*" + "id": "langpack-da@thunderbird.mozilla.org" } }, "manifest_version": 2, + "author": "mozilla.org (contributors: Kim Ludvigsen, Jørgen Rasmussen, Mikkel Herold)", "languages": { "da": { - "version": "20200403074226", + "version": "20200419193739", "chrome_resources": { - "devtools-startup": "chrome/da/locale/da/devtools/startup/", - "pippki": "chrome/da/locale/da/pippki/", + "necko": "chrome/da/locale/da/necko/", + "branding": "chrome/da/locale/da/branding/", "communicator": "chrome/da/locale/da/communicator/", - "messenger-region": "chrome/da/locale/da/messenger-region/", - "global": "chrome/da/locale/da/global/", - "pluginproblem": "chrome/da/locale/da/pluginproblem/", - "messenger": "chrome/da/locale/da/messenger/", + "autoconfig": "chrome/da/locale/da/autoconfig/", + "messenger-smime": "chrome/da/locale/da/messenger-smime/", + "mozldap": "chrome/da/locale/da/mozldap/", "messenger-mapi": "chrome/da/locale/da/messenger-mapi/", + "messenger": "chrome/da/locale/da/messenger/", + "messenger-newsblog": "chrome/da/locale/da/messenger-newsblog/", + "passwordmgr": "chrome/da/locale/da/passwordmgr/", + "pipnss": "chrome/da/locale/da/pipnss/", "calendar": "chrome/da/locale/da/calendar/", - "alerts": "chrome/da/locale/da/alerts/", - "branding": "chrome/da/locale/da/branding/", - "mozapps": "chrome/da/locale/da/mozapps/", + "devtools-shared": "chrome/da/locale/da/devtools/shared/", "devtools": "chrome/da/locale/da/devtools/client/", - "messenger-newsblog": "chrome/da/locale/da/messenger-newsblog/", + "global": "chrome/da/locale/da/global/", "places": "chrome/da/locale/da/places/", - "passwordmgr": "chrome/da/locale/da/passwordmgr/", + "pippki": "chrome/da/locale/da/pippki/", + "lightning": "chrome/da/locale/da/lightning/", + "pluginproblem": "chrome/da/locale/da/pluginproblem/", + "alerts": "chrome/da/locale/da/alerts/", + "devtools-startup": "chrome/da/locale/da/devtools/startup/", + "mozapps": "chrome/da/locale/da/mozapps/", "global-platform": { - "macosx": "chrome/da/locale/da/global-platform/mac/", "linux": "chrome/da/locale/da/global-platform/unix/", "android": "chrome/da/locale/da/global-platform/unix/", - "win": "chrome/da/locale/da/global-platform/win/" + "win": "chrome/da/locale/da/global-platform/win/", + "macosx": "chrome/da/locale/da/global-platform/mac/" }, - "pipnss": "chrome/da/locale/da/pipnss/", - "autoconfig": "chrome/da/locale/da/autoconfig/", - "chat": "chrome/da/locale/da/chat/", - "devtools-shared": "chrome/da/locale/da/devtools/shared/", - "messenger-smime": "chrome/da/locale/da/messenger-smime/", - "mozldap": "chrome/da/locale/da/mozldap/", - "necko": "chrome/da/locale/da/necko/", - "lightning": "chrome/da/locale/da/lightning/" + "messenger-region": "chrome/da/locale/da/messenger-region/", + "chat": "chrome/da/locale/da/chat/" } } }, - "author": "mozilla.org (contributors: Kim Ludvigsen, Jørgen Rasmussen, Mikkel Herold)", - "version": "76.0buildid20200407173003", + "description": "Language pack for Thunderbird for da", + "version": "76.0buildid20200420212409", + "langpack_id": "da", "name": "Dansk (da) Language Pack" } diff --git a/thunderbird-l10n/de/localization/de/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/de/localization/de/toolkit/about/aboutAddons.ftl index ac07e88d15f1bacf07ab5c7f1fe5b71ed58f6ba7..fb5b5bd93e25d34ba2b7df5cad5150aa3e43901b 100644 --- a/thunderbird-l10n/de/localization/de/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/de/localization/de/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Add-on aus Datei installieren… .accesskey = A help-button = Hilfe für Add-ons +sidebar-help-button-title = + .title = Hilfe für Add-ons preferences = { PLATFORM() -> [windows] { -brand-short-name } - Einstellungen @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Tools für alle Add-ons +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } - Einstellungen + *[other] { -brand-short-name } - Einstellungen + } show-unsigned-extensions-button = .label = Einige Erweiterungen konnten nicht verifiziert werden. show-all-extensions-button = @@ -172,13 +180,29 @@ extensions-view-available-updates = .name = Verfügbare Updates .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Empfehlungen +addon-category-discover-title = + .title = Empfehlungen addon-category-extension = Erweiterungen +addon-category-extension-title = + .title = Erweiterungen addon-category-theme = Themes +addon-category-theme-title = + .title = Themes addon-category-plugin = Plugins +addon-category-plugin-title = + .title = Plugins addon-category-dictionary = Wörterbücher +addon-category-dictionary-title = + .title = Wörterbücher addon-category-locale = Sprachen +addon-category-locale-title = + .title = Sprachen addon-category-available-updates = Verfügbare Updates +addon-category-available-updates-title = + .title = Verfügbare Updates addon-category-recent-updates = Zuletzt durchgeführte Updates +addon-category-recent-updates-title = + .title = Zuletzt durchgeführte Updates ## These are global warnings @@ -315,6 +339,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Weniger anzeigen go-back-button = .tooltiptext = Zurück +header-back-button = + .title = Zurück ## Recommended add-ons page diff --git a/thunderbird-l10n/de/localization/de/toolkit/about/certviewer.ftl b/thunderbird-l10n/de/localization/de/toolkit/about/certviewer.ftl index d3926bb8ffffabcef0068191037d7ec97b9e0c8d..944262d4df55ae777139118156dca1c8b3cbe766 100644 --- a/thunderbird-l10n/de/localization/de/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/de/localization/de/toolkit/about/certviewer.ftl @@ -95,3 +95,12 @@ certificate-viewer-download-pem = PEM (Zertifikat) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (Zertifikatskette) .download = { $fileName }-zertifikatskette.pem +certificate-viewer-export = Exportieren + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-people = Personen +certificate-viewer-tab-servers = Server +certificate-viewer-tab-ca = Zertifizierungsstellen +certificate-viewer-tab-unkonwn = Unbekannt diff --git a/thunderbird-l10n/de/localization/de/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/de/localization/de/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..665c9a6f6fc6a619a1679dae1e97af7f38d7de10 --- /dev/null +++ b/thunderbird-l10n/de/localization/de/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Ältere Version von { -brand-product-name } gestartet + .style = width: 490px; +profiledowngrade-window-create = + .label = Neues Profil erstellen +profiledowngrade-sync = Das Verwenden einer älteren als der zuletzt verwendeten { -brand-product-name }-Version kann Lesezeichen und Chronik eines bestehenden { -brand-product-name }-Profils beschädigen. Schützen Sie diese Informationen, indem Sie ein neues Profil für diese Installation von { -brand-short-name } erstellen. Sie können sich jederzeit mit einem { -fxaccount-brand-name } anmelden, um Lesezeichen und Chronik zwischen Profilen zu synchronisieren. +profiledowngrade-nosync = Das Verwenden einer älteren als der zuletzt verwendeten { -brand-product-name }-Version kann Lesezeichen und Chronik eines bestehenden { -brand-product-name }-Profils beschädigen. Schützen Sie diese Informationen, indem Sie ein neues Profil für diese Installation von { -brand-short-name } erstellen. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Schließen + *[other] Beenden + } diff --git a/thunderbird-l10n/de/manifest.json b/thunderbird-l10n/de/manifest.json index 88687b8551f2b445027be05a1823f1af586f7dbb..c5271576631f9a0290163f93eaa8f7950ba730fb 100644 --- a/thunderbird-l10n/de/manifest.json +++ b/thunderbird-l10n/de/manifest.json @@ -1,57 +1,57 @@ { + "version": "76.0buildid20200420212409", + "langpack_id": "de", + "applications": { + "gecko": { + "id": "langpack-de@thunderbird.mozilla.org", + "strict_min_version": "76.0", + "strict_max_version": "76.*" + } + }, + "manifest_version": 2, + "name": "Deutsch (DE) Language Pack", "sources": { "browser": { "base_path": "browser/" } }, - "manifest_version": 2, + "description": "Language pack for Thunderbird for de", + "author": "thunderbird-mail.de (contributors: Sebastian Hengst, Alexander Ihrig, Robert Kaiser, Abdulkadir Topal)", "languages": { "de": { - "version": "20200403074241", + "version": "20200415175432", "chrome_resources": { - "branding": "chrome/de/locale/de/branding/", - "autoconfig": "chrome/de/locale/de/autoconfig/", "messenger-region": "chrome/de/locale/de/messenger-region/", - "chat": "chrome/de/locale/de/chat/", - "pluginproblem": "chrome/de/locale/de/pluginproblem/", - "pippki": "chrome/de/locale/de/pippki/", - "mozldap": "chrome/de/locale/de/mozldap/", - "necko": "chrome/de/locale/de/necko/", - "messenger-smime": "chrome/de/locale/de/messenger-smime/", - "alerts": "chrome/de/locale/de/alerts/", - "communicator": "chrome/de/locale/de/communicator/", - "lightning": "chrome/de/locale/de/lightning/", "devtools-shared": "chrome/de/locale/de/devtools/shared/", - "calendar": "chrome/de/locale/de/calendar/", - "global": "chrome/de/locale/de/global/", - "places": "chrome/de/locale/de/places/", - "pipnss": "chrome/de/locale/de/pipnss/", "global-platform": { "macosx": "chrome/de/locale/de/global-platform/mac/", - "win": "chrome/de/locale/de/global-platform/win/", + "android": "chrome/de/locale/de/global-platform/unix/", "linux": "chrome/de/locale/de/global-platform/unix/", - "android": "chrome/de/locale/de/global-platform/unix/" + "win": "chrome/de/locale/de/global-platform/win/" }, + "autoconfig": "chrome/de/locale/de/autoconfig/", + "places": "chrome/de/locale/de/places/", + "lightning": "chrome/de/locale/de/lightning/", + "global": "chrome/de/locale/de/global/", + "alerts": "chrome/de/locale/de/alerts/", + "messenger": "chrome/de/locale/de/messenger/", + "chat": "chrome/de/locale/de/chat/", + "branding": "chrome/de/locale/de/branding/", "messenger-mapi": "chrome/de/locale/de/messenger-mapi/", - "passwordmgr": "chrome/de/locale/de/passwordmgr/", - "devtools-startup": "chrome/de/locale/de/devtools/startup/", + "pippki": "chrome/de/locale/de/pippki/", "mozapps": "chrome/de/locale/de/mozapps/", - "messenger": "chrome/de/locale/de/messenger/", + "devtools-startup": "chrome/de/locale/de/devtools/startup/", "devtools": "chrome/de/locale/de/devtools/client/", - "messenger-newsblog": "chrome/de/locale/de/messenger-newsblog/" + "pluginproblem": "chrome/de/locale/de/pluginproblem/", + "passwordmgr": "chrome/de/locale/de/passwordmgr/", + "necko": "chrome/de/locale/de/necko/", + "messenger-newsblog": "chrome/de/locale/de/messenger-newsblog/", + "pipnss": "chrome/de/locale/de/pipnss/", + "communicator": "chrome/de/locale/de/communicator/", + "messenger-smime": "chrome/de/locale/de/messenger-smime/", + "mozldap": "chrome/de/locale/de/mozldap/", + "calendar": "chrome/de/locale/de/calendar/" } } - }, - "description": "Language pack for Thunderbird for de", - "langpack_id": "de", - "name": "Deutsch (DE) Language Pack", - "version": "76.0buildid20200407173003", - "author": "thunderbird-mail.de (contributors: Sebastian Hengst, Alexander Ihrig, Robert Kaiser, Abdulkadir Topal)", - "applications": { - "gecko": { - "strict_max_version": "76.*", - "strict_min_version": "76.0", - "id": "langpack-de@thunderbird.mozilla.org" - } } } diff --git a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/devtools/client/inspector.properties b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/devtools/client/inspector.properties index e8b1706f2a1a4a3f1c22a7461f66eef3d8fdad6b..78ad943a33e6b16946f26201aa6612fc49fb41a2 100644 --- a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/devtools/client/inspector.properties +++ b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Toś ten element ma kulajobny woběžk. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Žedno pśisłušne pšawidło +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Źaržćo Umsch tłocony a klikniśo, aby k pšawidłoju skócył + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/global/css.properties b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/global/css.properties index 7b53f39dc220af71c92156a0795d85fe18a7a6af..594d0ca38bd57c73e4904f8f65fa1d984b23d7ed 100644 --- a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/global/css.properties +++ b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/global/css.properties @@ -180,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Jano jaden repeat(auto-fill, …) jo w PEMoreThanOneGridRepeatAutoFillFitInTrackList=Jano jaden repeat(auto-fill, …) abo repeat(auto-fit, …) jo w slědowańskej lisćinje dowólony. PEMoreThanOneGridRepeatTrackSize=Jano jadna slědowańska wjelikosć jo w repeat(auto-fit/auto-fill, …) dowólona. +PEDisallowedImportRule=Pšawidła @import hyšći njejsu płaśiwe w napóranych stilowych pśedłogach. + TooLargeDashedRadius=Ramikowy radius jo pśewjeliki za ‘smužkowany’ stil (limit jo 100000px). TooLargeDottedRadius=Ramikowy radius jo pśewjeliki za ‘dypkaty’ stil (limit jo 100000px). diff --git a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/global/security/security.properties b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/global/security/security.properties index 3b91b3322de716b2388f0f1e63a049c978809fa1..58990e323400d178b0eb4fa497d93c49e496f41b 100644 --- a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/global/security/security.properties +++ b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Zacytanje jo se wótpokazało pśez X-Frame-Options: “%1$S” z “% # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Zacytanje jo se wótpokazało pśez X-Frame-Options: “%1$S” z “%2$S”, sedło rozdźělne žrědła we wobłuku z “%3$S”njedowólujo. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Njepłaśiwa głowa X-Frame-Options jo se namakała pśi cytanju “%2$S”: “%1$S” njejo płaśiwa direktiwa. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=Zacytanje “%2$S” we wobłuku jo se wótpokazało pśez direktiwu X-Frame-Options“, kótaraž jo stajona na “%1$S“. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Njewěste napšašowanje “%1$S” se aktualizěrujo, aby “%2$S” wužywało diff --git a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/messenger/messenger.dtd b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/messenger/messenger.dtd index 7609116097927f1801068dadd53f4894a8caf0a4..450edb4a19639712d9d92f7c89c0ba70bd3ff115 100644 --- a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/messenger/messenger.dtd +++ b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Powěsći pśepytaś…"> <!ENTITY searchMailCmd.accesskey "P"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Globalne pytanje…"> +<!ENTITY glodaSearchCmd.accesskey "G"> <!ENTITY searchAddressesCmd.label "Adrese pśepytaś…"> <!ENTITY searchAddressesCmd.accesskey "A"> diff --git a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/messenger/pgpmime.properties b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/messenger/pgpmime.properties index f8c4ed115acf672d4b5c14cce5ae953a5979e5b2..ce19839f6814ad5f52860108f575a0eb185d0625 100644 --- a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/messenger/pgpmime.properties +++ b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=To jo skoděrowana OpenPGP-powěsć.<br>Aby toś tu e-mailku dešifrěrował, musyśo <a href="%S">dodank OpenPGP</a> instalěrowaś. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=To jo skoděrowana OpenPGP-powěsć, ale pódpěra za OpenPGP-dekoděrowanje njejo dispoziciji. diff --git a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/necko/necko.properties b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/necko/necko.properties index 04d636126c00861ce8e35865f1e9b08882ca5331..f09d384da7c9daba9524aac748d564e5bf90a014 100644 --- a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/necko/necko.properties +++ b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Pśistup k składowakoju jo se awtoma # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Pśistup k składowakoju jo se awtomatiski pśizwólił pśeslědowakoju “%2$S” na “%1$S”. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Pśistup na składowak jo se awtomatiski pśizwólił za izolěrowanje prědnego póbitowarja “%2$S” na “%1$S”. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Cookie “%1$S” jo se wótpokazał, dokulaž ma atribut “sameSite=none”, ale njama atribut “secure” . # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/dsb/localization/dsb/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/dsb/localization/dsb/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..56abfb56d8a96aa0ccbc8d11c1688550c12449b8 --- /dev/null +++ b/thunderbird-l10n/dsb/localization/dsb/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = URI-dalejpósrědnjenje kalendarja +calendar-uri-redirect-description = + Serwer URI za kalendaŕ „{ $calendarName }“ dalej pósrědnja. + Dalejpósrědnjenje akceptěrowaś a nowy URI za toś ten kalendaŕ wužywaś? +calendar-uri-redirect-original-uri-label = Aktualny URI: +calendar-uri-redirect-target-uri-label = K nowemu URI dalej pósrědniś: diff --git a/thunderbird-l10n/dsb/localization/dsb/messenger/accountCentral.ftl b/thunderbird-l10n/dsb/localization/dsb/messenger/accountCentral.ftl index 1ef47f530f35eb07605f2287ba3eab18125aa00f..8ac5785b173411c80c93534e9f74d98298e93dd3 100644 --- a/thunderbird-l10n/dsb/localization/dsb/messenger/accountCentral.ftl +++ b/thunderbird-l10n/dsb/localization/dsb/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Witajśo k { -brand-full-name } +account-settings = Kontowe nastajenja +# $accounts (Number) - the number of configured accounts setup-title = Wubjeŕśo, což ma se konfigurěrowaś about-title = Wó { -brand-full-name } resources-title = Resurse @@ -40,3 +42,10 @@ explore-link = Funkcije wuslěźiś support-link = Pomoc involved-link = Cyńśo sobu developer-link = Wuwijarska dokumentacija +read = Powěsći cytaś +compose = Nowu powěsć pisaś +search = Powěsći pytaś +filter = Powěsćowe filtry zastojaś +nntp-subscription = Abonementy diskusijnych kupkow zastojaś +rss-subscription = Kanalowe abonomenty zastojaś +e2e = Koděrowanje wót kóńca do kóńca diff --git a/thunderbird-l10n/dsb/localization/dsb/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/dsb/localization/dsb/toolkit/about/aboutAddons.ftl index 912636f353ee1076308ba31da8d33188dbac6ca2..f21dde03657168f7df53a88fa912a098c38098d1 100644 --- a/thunderbird-l10n/dsb/localization/dsb/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/dsb/localization/dsb/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Dodank z dataje instalěrowaś… .accesskey = D help-button = Pomoc za dodanki +sidebar-help-button-title = + .title = Pomoc za dodanki preferences = { PLATFORM() -> [windows] Nastajenja { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Rědy za wšykne dodanki +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Nastajenja { -brand-short-name } + *[other] Nastajenja { -brand-short-name } + } show-unsigned-extensions-button = .label = Někotare rozšyrjenja njejsu dali se wobkšuśiś show-all-extensions-button = @@ -167,13 +175,29 @@ extensions-view-available-updates = .name = Aktualizacije .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Dopórucenja +addon-category-discover-title = + .title = Dopórucenja addon-category-extension = Rozšyrjenja +addon-category-extension-title = + .title = Rozšyrjenja addon-category-theme = Drastwy +addon-category-theme-title = + .title = Drastwy addon-category-plugin = Tykace +addon-category-plugin-title = + .title = Tykace addon-category-dictionary = Słowniki +addon-category-dictionary-title = + .title = Słowniki addon-category-locale = Rěcy +addon-category-locale-title = + .title = Rěcy addon-category-available-updates = Aktualizacije +addon-category-available-updates-title = + .title = Aktualizacije addon-category-recent-updates = Nowe aktualizacije +addon-category-recent-updates-title = + .title = Nowe aktualizacije ## These are global warnings @@ -286,6 +310,7 @@ shortcuts-no-commands = Slědujuce rozšyrjenja njamaju tastowe skrotconki: shortcuts-input = .placeholder = Zapódajśo tastowu skrotconku shortcuts-browserAction = Rozšyrjenje aktiwěrowaś +shortcuts-browserAction2 = Tłocašk symboloweje rědki aktiwěrowaś shortcuts-pageAction = Akciju boka aktiwěrowaś shortcuts-sidebarAction = Bocnicu pśešaltowaś shortcuts-modifier-mac = Strg, Alt abo ⌘ zapśimjeś @@ -313,6 +338,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Mjenjej pokazaś go-back-button = .tooltiptext = Slědk +header-back-button = + .title = Slědk ## Recommended add-ons page diff --git a/thunderbird-l10n/dsb/localization/dsb/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/dsb/localization/dsb/toolkit/about/aboutSupport.ftl index 77a85bcd5a482bd9132ee529d41825f3c792e29f..1661f9c8b022f807a9b03a92e2549fceb9d1494e 100644 --- a/thunderbird-l10n/dsb/localization/dsb/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/dsb/localization/dsb/toolkit/about/aboutSupport.ftl @@ -297,6 +297,11 @@ sandbox-proc-type-content = wopśimjeśe sandbox-proc-type-file = datajowe wopśimjeśe sandbox-proc-type-media-plugin = medijowy tykac sandbox-proc-type-data-decoder = dekoděrowak datow +startup-cache-title = Startowy pufrowak +startup-cache-disk-cache-path = Sćažka platowego pufrowaka +startup-cache-ignore-disk-cache = Platowy pufrowak ignorěrowaś +startup-cache-found-disk-cache-on-init = Platowy pufrowak jo se namakał pśi inicializěrowanju +startup-cache-wrote-to-disk-cache = Jo se napisało do platowego pufrowaka launcher-process-status-0 = Zmóžnjony launcher-process-status-1 = Zmólki dla znjemóžnjony launcher-process-status-2 = Z nuzkanim znjemóžnjony @@ -320,6 +325,7 @@ touch-enabled = zapódaśe pśez dotyknjenje zmóžnjone drag-enabled = śěgnjenje suwańskeje rědki zmóžnjone keyboard-enabled = tastatura zmóžnjona autoscroll-enabled = awtomatiske kulanje zmóžnjone +zooming-enabled = pózlažke šćipate skalěrowanje zmóžnjone ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/dsb/localization/dsb/toolkit/about/certviewer.ftl b/thunderbird-l10n/dsb/localization/dsb/toolkit/about/certviewer.ftl index 4934e95fad8eeccf591c6cae31ada8f15677705b..f962fb0b570e5aa849658900607def026468b28f 100644 --- a/thunderbird-l10n/dsb/localization/dsb/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/dsb/localization/dsb/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (certifikat) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (rjeśazk) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Toś to rozšyrjenje jo se markěrowało ako kritiske, to groni, až klienty muse certifikat wótpokazaś, jolic jen njerozměju. +certificate-viewer-export = Eksportěrowaś + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Waše certifikaty +certificate-viewer-tab-people = Luźe +certificate-viewer-tab-servers = Serwery +certificate-viewer-tab-ca = Awtority +certificate-viewer-tab-unkonwn = Njeznaty diff --git a/thunderbird-l10n/dsb/localization/dsb/toolkit/global/processTypes.ftl b/thunderbird-l10n/dsb/localization/dsb/toolkit/global/processTypes.ftl index 7585d0c0cd3ccf923d7ec156e3502fc64b49c8d0..e50988e69ffa29ed728858499f8c9816ccdf06f6 100644 --- a/thunderbird-l10n/dsb/localization/dsb/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/dsb/localization/dsb/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Izolěrowane webwopśimjeśe # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Soket diff --git a/thunderbird-l10n/dsb/localization/dsb/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/dsb/localization/dsb/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..1669337c768b851f37e3ab743f61371395c2c6c5 --- /dev/null +++ b/thunderbird-l10n/dsb/localization/dsb/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Sćo startował staršu wersiju { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Nowy profil załožyś +profiledowngrade-sync = Wužywanje staršeje wersije { -brand-product-name } móžo cytańske znamjenja a pśeglědowańsku historiju wobškóźiś, kótarež su se južo składli w eksistěrujucem profilu { -brand-product-name }. Aby swóje informacije šćitał, załožćo nowy profil za toś tu instalaciju { -brand-short-name }. Móžośo se pśecej z { -fxaccount-brand-name } pśizjawis, áby swóje cytańske znamjenja a pśeglědowańsku historiju mjazy profilami synchronizěrował. +profiledowngrade-nosync = Wužywanje staršeje wersije { -brand-product-name } móžo cytańske znamjenja a pśeglědowańsku historiju wobškóźiś, kótarež su se južo składli w eksistěrujucem profilu { -brand-product-name }. Aby swóje informacije šćitał, załožćo nowy profil za toś tu instalaciju { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Skóńcyś + *[other] Skóńcyś + } diff --git a/thunderbird-l10n/dsb/manifest.json b/thunderbird-l10n/dsb/manifest.json index 0357b759d5009332097412943455f38d9d62707d..6a6242b2b896a6cee34e46fc99502b18cb8de5ea 100644 --- a/thunderbird-l10n/dsb/manifest.json +++ b/thunderbird-l10n/dsb/manifest.json @@ -6,52 +6,52 @@ "id": "langpack-dsb@thunderbird.mozilla.org" } }, - "author": "Michael Wolf (contributors: Michael Wolf)", - "version": "76.0buildid20200407173003", - "langpack_id": "dsb", "description": "Language pack for Thunderbird for dsb", - "name": "Dolnoserbšćina Language Pack", + "version": "76.0buildid20200420212409", "manifest_version": 2, + "langpack_id": "dsb", "languages": { "dsb": { - "version": "20200403145359", "chrome_resources": { - "messenger-mapi": "chrome/dsb/locale/dsb/messenger-mapi/", - "pipnss": "chrome/dsb/locale/dsb/pipnss/", + "pippki": "chrome/dsb/locale/dsb/pippki/", "mozldap": "chrome/dsb/locale/dsb/mozldap/", - "alerts": "chrome/dsb/locale/dsb/alerts/", - "messenger-smime": "chrome/dsb/locale/dsb/messenger-smime/", - "devtools-shared": "chrome/dsb/locale/dsb/devtools/shared/", - "mozapps": "chrome/dsb/locale/dsb/mozapps/", - "messenger-region": "chrome/dsb/locale/dsb/messenger-region/", - "branding": "chrome/dsb/locale/dsb/branding/", - "autoconfig": "chrome/dsb/locale/dsb/autoconfig/", - "chat": "chrome/dsb/locale/dsb/chat/", "global-platform": { - "macosx": "chrome/dsb/locale/dsb/global-platform/mac/", + "win": "chrome/dsb/locale/dsb/global-platform/win/", "android": "chrome/dsb/locale/dsb/global-platform/unix/", - "linux": "chrome/dsb/locale/dsb/global-platform/unix/", - "win": "chrome/dsb/locale/dsb/global-platform/win/" + "macosx": "chrome/dsb/locale/dsb/global-platform/mac/", + "linux": "chrome/dsb/locale/dsb/global-platform/unix/" }, - "global": "chrome/dsb/locale/dsb/global/", - "communicator": "chrome/dsb/locale/dsb/communicator/", - "messenger-newsblog": "chrome/dsb/locale/dsb/messenger-newsblog/", - "passwordmgr": "chrome/dsb/locale/dsb/passwordmgr/", + "messenger-smime": "chrome/dsb/locale/dsb/messenger-smime/", + "necko": "chrome/dsb/locale/dsb/necko/", + "chat": "chrome/dsb/locale/dsb/chat/", + "devtools-startup": "chrome/dsb/locale/dsb/devtools/startup/", + "pipnss": "chrome/dsb/locale/dsb/pipnss/", + "mozapps": "chrome/dsb/locale/dsb/mozapps/", "places": "chrome/dsb/locale/dsb/places/", + "devtools-shared": "chrome/dsb/locale/dsb/devtools/shared/", + "communicator": "chrome/dsb/locale/dsb/communicator/", + "branding": "chrome/dsb/locale/dsb/branding/", + "alerts": "chrome/dsb/locale/dsb/alerts/", + "calendar": "chrome/dsb/locale/dsb/calendar/", "devtools": "chrome/dsb/locale/dsb/devtools/client/", - "pippki": "chrome/dsb/locale/dsb/pippki/", + "global": "chrome/dsb/locale/dsb/global/", "messenger": "chrome/dsb/locale/dsb/messenger/", - "necko": "chrome/dsb/locale/dsb/necko/", + "messenger-region": "chrome/dsb/locale/dsb/messenger-region/", + "messenger-mapi": "chrome/dsb/locale/dsb/messenger-mapi/", "pluginproblem": "chrome/dsb/locale/dsb/pluginproblem/", - "calendar": "chrome/dsb/locale/dsb/calendar/", "lightning": "chrome/dsb/locale/dsb/lightning/", - "devtools-startup": "chrome/dsb/locale/dsb/devtools/startup/" - } + "autoconfig": "chrome/dsb/locale/dsb/autoconfig/", + "messenger-newsblog": "chrome/dsb/locale/dsb/messenger-newsblog/", + "passwordmgr": "chrome/dsb/locale/dsb/passwordmgr/" + }, + "version": "20200418134448" } }, + "author": "Michael Wolf (contributors: Michael Wolf)", "sources": { "browser": { "base_path": "browser/" } - } + }, + "name": "Dolnoserbšćina Language Pack" } diff --git a/thunderbird-l10n/el/chrome/el/locale/el/devtools/client/font-inspector.properties b/thunderbird-l10n/el/chrome/el/locale/el/devtools/client/font-inspector.properties index 2b7b0377b5754c6e395659e1c6a82970883d02c9..1e44f6b3e6442188573bbca3053430f61180524c 100644 --- a/thunderbird-l10n/el/chrome/el/locale/el/devtools/client/font-inspector.properties +++ b/thunderbird-l10n/el/chrome/el/locale/el/devtools/client/font-inspector.properties @@ -7,7 +7,7 @@ # LOCALIZATION NOTE (fontinspector.system) This label indicates that the font is a local # system font. -fontinspector.system=του συστήματος +fontinspector.system=σύστημα # LOCALIZATION NOTE (fontinspector.noFontsUsedOnCurrentElement): This label is shown when # no fonts were used on the selected element. diff --git a/thunderbird-l10n/el/localization/el/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/el/localization/el/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..57620f367ce6cfc02728dff9b5935df88ec07edf --- /dev/null +++ b/thunderbird-l10n/el/localization/el/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,5 @@ +# 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/. + +calendar-uri-redirect-original-uri-label = Τρέχον URI: diff --git a/thunderbird-l10n/el/localization/el/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/el/localization/el/toolkit/about/aboutAddons.ftl index 01207b58ffdfd738657cd81669220f02d0e0c4f0..10750b711c0aa6a2ca23a1dc166fd3d8102a518b 100644 --- a/thunderbird-l10n/el/localization/el/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/el/localization/el/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Εγκατάσταση πρόσθετου από αρχείο… .accesskey = γ help-button = Υποστήριξη προσθέτων +sidebar-help-button-title = + .title = Υποστήριξη προσθέτων preferences = { PLATFORM() -> [windows] Επιλογές { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Εργαλεία για όλα τα πρόσθετα +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Επιλογές { -brand-short-name } + *[other] Προτιμήσεις { -brand-short-name } + } show-unsigned-extensions-button = .label = Δεν ήταν δυνατή η επαλήθευση ορισμένων πρόσθετων show-all-extensions-button = @@ -172,13 +180,29 @@ extensions-view-available-updates = .name = Διαθέσιμες ενημερώσεις .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Προτάσεις +addon-category-discover-title = + .title = Προτάσεις addon-category-extension = Επεκτάσεις +addon-category-extension-title = + .title = Επεκτάσεις addon-category-theme = Θέματα +addon-category-theme-title = + .title = Θέματα addon-category-plugin = Αρθρώματα +addon-category-plugin-title = + .title = Αρθρώματα addon-category-dictionary = Λεξικά +addon-category-dictionary-title = + .title = Λεξικά addon-category-locale = Γλώσσες +addon-category-locale-title = + .title = Γλώσσες addon-category-available-updates = Διαθέσιμες ενημερώσεις +addon-category-available-updates-title = + .title = Διαθέσιμες ενημερώσεις addon-category-recent-updates = Πρόσφατες ενημερώσεις +addon-category-recent-updates-title = + .title = Πρόσφατες ενημερώσεις ## These are global warnings @@ -316,6 +340,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Εμφάνιση λιγότερων go-back-button = .tooltiptext = Επιστροφή +header-back-button = + .title = Επιστροφή ## Recommended add-ons page diff --git a/thunderbird-l10n/el/localization/el/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/el/localization/el/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..020c1336f4efaea17610ebd2897d95470e52554c --- /dev/null +++ b/thunderbird-l10n/el/localization/el/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Έχετε εκκινήσει μια παλαιότερη έκδοση του { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Δημιουργία νέου προφίλ +profiledowngrade-sync = Η χρήση μιας παλαιότερης έκδοσης του { -brand-product-name } μπορεί να καταστρέψει τους σελιδοδείκτες και το ιστορικό περιήγησης που έχουν ήδη αποθηκευτεί σε ένα υπάρχον προφίλ του { -brand-product-name }. Για να προστατέψετε τις πληροφορίες σας, δημιουργήστε ένα νέο προφίλ για αυτή την εγκατάσταση του { -brand-short-name }. Μπορείτε πάντα να συνδεθείτε με ένα { -fxaccount-brand-name } για να συγχρονίσετε τους σελιδοδείκτες και το ιστορικό περιήγησης μεταξύ των προφίλ. +profiledowngrade-nosync = Η χρήση μιας παλαιότερης έκδοσης του { -brand-product-name } μπορεί να καταστρέψει τους σελιδοδείκτες και το ιστορικό περιήγησης που έχουν ήδη αποθηκευτεί σε ένα υπάρχον προφίλ του { -brand-product-name }. Για να προστατέψετε τις πληροφορίες σας, δημιουργήστε ένα νέο προφίλ για αυτή την εγκατάσταση του { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Έξοδος + *[other] Έξοδος + } diff --git a/thunderbird-l10n/el/manifest.json b/thunderbird-l10n/el/manifest.json index 8166e3c916d9ad36898c09b4717e39ce65b7b39c..f9c3a5ce65d3ef2d75712119d4c8cd3c1000bc18 100644 --- a/thunderbird-l10n/el/manifest.json +++ b/thunderbird-l10n/el/manifest.json @@ -1,48 +1,39 @@ { - "version": "76.0buildid20200407173003", - "langpack_id": "el", - "applications": { - "gecko": { - "strict_min_version": "76.0", - "id": "langpack-el@thunderbird.mozilla.org", - "strict_max_version": "76.*" - } - }, "languages": { "el": { - "version": "20200403074312", "chrome_resources": { + "global": "chrome/el/locale/el/global/", + "pipnss": "chrome/el/locale/el/pipnss/", + "autoconfig": "chrome/el/locale/el/autoconfig/", + "lightning": "chrome/el/locale/el/lightning/", + "messenger-newsblog": "chrome/el/locale/el/messenger-newsblog/", + "mozldap": "chrome/el/locale/el/mozldap/", + "messenger-region": "chrome/el/locale/el/messenger-region/", + "pippki": "chrome/el/locale/el/pippki/", "devtools-startup": "chrome/el/locale/el/devtools/startup/", - "messenger": "chrome/el/locale/el/messenger/", + "pluginproblem": "chrome/el/locale/el/pluginproblem/", + "calendar": "chrome/el/locale/el/calendar/", + "messenger-mapi": "chrome/el/locale/el/messenger-mapi/", "global-platform": { - "android": "chrome/el/locale/el/global-platform/unix/", "macosx": "chrome/el/locale/el/global-platform/mac/", + "linux": "chrome/el/locale/el/global-platform/unix/", "win": "chrome/el/locale/el/global-platform/win/", - "linux": "chrome/el/locale/el/global-platform/unix/" + "android": "chrome/el/locale/el/global-platform/unix/" }, - "necko": "chrome/el/locale/el/necko/", - "global": "chrome/el/locale/el/global/", - "alerts": "chrome/el/locale/el/alerts/", - "devtools": "chrome/el/locale/el/devtools/client/", - "pipnss": "chrome/el/locale/el/pipnss/", "branding": "chrome/el/locale/el/branding/", + "messenger": "chrome/el/locale/el/messenger/", "devtools-shared": "chrome/el/locale/el/devtools/shared/", - "lightning": "chrome/el/locale/el/lightning/", - "communicator": "chrome/el/locale/el/communicator/", - "calendar": "chrome/el/locale/el/calendar/", + "alerts": "chrome/el/locale/el/alerts/", + "devtools": "chrome/el/locale/el/devtools/client/", + "places": "chrome/el/locale/el/places/", "chat": "chrome/el/locale/el/chat/", + "communicator": "chrome/el/locale/el/communicator/", + "passwordmgr": "chrome/el/locale/el/passwordmgr/", "mozapps": "chrome/el/locale/el/mozapps/", "messenger-smime": "chrome/el/locale/el/messenger-smime/", - "messenger-mapi": "chrome/el/locale/el/messenger-mapi/", - "autoconfig": "chrome/el/locale/el/autoconfig/", - "pluginproblem": "chrome/el/locale/el/pluginproblem/", - "places": "chrome/el/locale/el/places/", - "messenger-region": "chrome/el/locale/el/messenger-region/", - "mozldap": "chrome/el/locale/el/mozldap/", - "passwordmgr": "chrome/el/locale/el/passwordmgr/", - "pippki": "chrome/el/locale/el/pippki/", - "messenger-newsblog": "chrome/el/locale/el/messenger-newsblog/" - } + "necko": "chrome/el/locale/el/necko/" + }, + "version": "20200418131504" } }, "sources": { @@ -50,8 +41,17 @@ "base_path": "browser/" } }, - "manifest_version": 2, - "name": "Ελληνικά Language Pack", + "version": "76.0buildid20200420212409", + "description": "Language pack for Thunderbird for el", "author": "Kostas Papadimas (contributors: Λούρδας Βασίλης, Jim Spentzos)", - "description": "Language pack for Thunderbird for el" + "manifest_version": 2, + "applications": { + "gecko": { + "strict_max_version": "76.*", + "strict_min_version": "76.0", + "id": "langpack-el@thunderbird.mozilla.org" + } + }, + "langpack_id": "el", + "name": "Ελληνικά Language Pack" } diff --git a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/devtools/client/inspector.properties b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/devtools/client/inspector.properties index b183240e2d14fce15108abf9a03edb6b69d679e2..552497a263a9a340eca5309d39895ab398d50d0f 100644 --- a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/devtools/client/inspector.properties +++ b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=This element has scrollable overflow. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=No associated rule +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Hold Shift and click to jump to rule + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/global/css.properties b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/global/css.properties index ed91969c16b487af46bb3fed31e50ec5d052e662..d60483345f00482ffd5ec1f16b64110d6de78206 100644 --- a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/global/css.properties +++ b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=The stylesheet %1$S was loaded as CSS even though its MIME type, PEUnexpEOF2=Unexpected end of file while searching for %1$S. PEParseRuleWSOnly=Whitespace-only string given to be parsed as rule. + PEDeclDropped=Declaration dropped. PEDeclSkipped=Skipped to next declaration. PEUnknownProperty=Unknown property '%1$S'. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Only one repeat(auto-fill, …) is all PEMoreThanOneGridRepeatAutoFillFitInTrackList=Only one repeat(auto-fill, …) or repeat(auto-fit, …) is allowed in a track list. PEMoreThanOneGridRepeatTrackSize=Only one track size is allowed inside repeat(auto-fit/auto-fill, …). +PEDisallowedImportRule=@import rules are not yet valid in constructed stylesheets. + TooLargeDashedRadius=Border radius is too large for ‘dashed’ style (the limit is 100000px). Rendering as solid. TooLargeDottedRadius=Border radius is too large for ‘dotted’ style (the limit is 100000px). Rendering as solid. diff --git a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/global/security/security.properties b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/global/security/security.properties index d50ec46bbe6b59f2695583c142957a6a13a82a0b..de6cee71fba17756e146d5ba42d93ebb5b589318 100644 --- a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/global/security/security.properties +++ b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Load denied by X-Frame-Options: “%1$S” from “%2$S”, site does # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Load denied by X-Frame-Options: “%1$S” from “%2$S”, site does not permit cross-origin framing from “%3$S”. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Invalid X-Frame-Options header was found when loading “%2$S”: “%1$S” is not a valid directive. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=The loading of “%2$S” in a frame is denied by “X-Frame-Options“ directive set to “%1$S“. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Upgrading insecure request “%1$S” to use “%2$S”. diff --git a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/messenger/messenger.dtd b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/messenger/messenger.dtd index c60fb80436e2cdd85cd21251be486aa60d564f57..54f24d1a29c777363a2b8de018866524b6ff8812 100644 --- a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/messenger/messenger.dtd +++ b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Search Messages…"> <!ENTITY searchMailCmd.accesskey "M"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Global Search…"> +<!ENTITY glodaSearchCmd.accesskey "G"> <!ENTITY searchAddressesCmd.label "Search Addresses…"> <!ENTITY searchAddressesCmd.accesskey "S"> diff --git a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/messenger/pgpmime.properties b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/messenger/pgpmime.properties index b22a6311e877eccc61407530bfbf705b5db371e7..0492480e3381c22f0ca53ef6dd32a6a0f438acc5 100644 --- a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/messenger/pgpmime.properties +++ b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=This is an encrypted OpenPGP message.<br>In order to decrypt this mail, you need to install an <a href="%S">OpenPGP add-on</a>. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=This is an encrypted OpenPGP message, but support for OpenPGP decryption is not available. diff --git a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/necko/necko.properties b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/necko/necko.properties index 7ac9f2ff1d29005f0866280522e057e7fdacdece..52d93a43353763ea100244d27d5ce9054c0d8f49 100644 --- a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/necko/necko.properties +++ b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Storage access automatically granted # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Storage access automatically granted for tracker “%2$S” on “%1$S”. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Storage access automatically granted for First-Party isolation “%2$S” on “%1$S”. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Cookie “%1$S” rejected because it has the “sameSite=none” attribute but is missing the “secure” attribute. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/en-GB/localization/en-GB/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/en-GB/localization/en-GB/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..9601c538a43243393730a0d596ca12d51efc2099 --- /dev/null +++ b/thunderbird-l10n/en-GB/localization/en-GB/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Calendar URI Redirect +calendar-uri-redirect-description = + The server is redirecting the URI for the calendar "{ $calendarName }". + Accept the redirect and start using the new URI for this calendar? +calendar-uri-redirect-original-uri-label = Current URI: +calendar-uri-redirect-target-uri-label = Redirecting to new URI: diff --git a/thunderbird-l10n/en-GB/localization/en-GB/messenger/accountCentral.ftl b/thunderbird-l10n/en-GB/localization/en-GB/messenger/accountCentral.ftl index bcb98a92316cda382d1aff27749672bfc99ac0f5..471973f9e400b0f1c6295ec39cc535ddf3317af5 100644 --- a/thunderbird-l10n/en-GB/localization/en-GB/messenger/accountCentral.ftl +++ b/thunderbird-l10n/en-GB/localization/en-GB/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Welcome to { -brand-full-name } +account-settings = Account Settings +# $accounts (Number) - the number of configured accounts setup-title = Choose What to Set Up about-title = About { -brand-full-name } resources-title = Resources @@ -40,3 +42,10 @@ explore-link = Explore Features support-link = Support involved-link = Get Involved developer-link = Developer Documentation +read = Read messages +compose = Write a new message +search = Search messages +filter = Manage message filters +nntp-subscription = Manage newsgroup subscriptions +rss-subscription = Manage feed subscriptions +e2e = End-to-end Encryption diff --git a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/aboutAddons.ftl index 688cec74b3a58249eaa9e91ac9f2c7166dfa340a..641df768e9bf9424ce2f98026ade18e7366a5d11 100644 --- a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Install Add-on From File… .accesskey = I help-button = Add-ons Support +sidebar-help-button-title = + .title = Add-ons Support preferences = { PLATFORM() -> [windows] { -brand-short-name } Options @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Tools for all add-ons +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } Options + *[other] { -brand-short-name } Preferences + } show-unsigned-extensions-button = .label = Some extensions could not be verified show-all-extensions-button = @@ -173,13 +181,29 @@ extensions-view-available-updates = .name = Available Updates .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Recommendations +addon-category-discover-title = + .title = Recommendations addon-category-extension = Extensions +addon-category-extension-title = + .title = Extensions addon-category-theme = Themes +addon-category-theme-title = + .title = Themes addon-category-plugin = Plugins +addon-category-plugin-title = + .title = Plugins addon-category-dictionary = Dictionaries +addon-category-dictionary-title = + .title = Dictionaries addon-category-locale = Languages +addon-category-locale-title = + .title = Languages addon-category-available-updates = Available Updates +addon-category-available-updates-title = + .title = Available Updates addon-category-recent-updates = Recent Updates +addon-category-recent-updates-title = + .title = Recent Updates ## These are global warnings @@ -292,6 +316,7 @@ shortcuts-no-commands = The following extensions do not have shortcuts: shortcuts-input = .placeholder = Type a shortcut shortcuts-browserAction = Activate extension +shortcuts-browserAction2 = Activate toolbar button shortcuts-pageAction = Activate page action shortcuts-sidebarAction = Toggle the sidebar shortcuts-modifier-mac = Include Ctrl, Alt, or ⌘ @@ -316,6 +341,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Show Less go-back-button = .tooltiptext = Go back +header-back-button = + .title = Go back ## Recommended add-ons page diff --git a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/aboutSupport.ftl index 7c8d194f9517fb3e4432119e660bf229dfbf1f9d..5a275aa090b6550a847fd790aa57531113f56a69 100644 --- a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/aboutSupport.ftl @@ -290,6 +290,11 @@ sandbox-proc-type-content = content sandbox-proc-type-file = file content sandbox-proc-type-media-plugin = media plugin sandbox-proc-type-data-decoder = data decoder +startup-cache-title = Startup Cache +startup-cache-disk-cache-path = Disk Cache Path +startup-cache-ignore-disk-cache = Ignore Disk Cache +startup-cache-found-disk-cache-on-init = Found Disk Cache on Init +startup-cache-wrote-to-disk-cache = Wrote to Disk Cache launcher-process-status-0 = Enabled launcher-process-status-1 = Disabled due to failure launcher-process-status-2 = Disabled forcibly @@ -313,6 +318,7 @@ touch-enabled = touch input enabled drag-enabled = scrollbar drag enabled keyboard-enabled = keyboard enabled autoscroll-enabled = autoscroll enabled +zooming-enabled = smooth pinch-zoom enabled ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/certviewer.ftl b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/certviewer.ftl index 13b54f7e4337d817cc4dd12e562988f9ff830453..ce7add86bb68f70e4b3972ec207d5ed2fff4abb2 100644 --- a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (chain) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = This extension has been marked as critical, meaning that clients must reject the certificate if they do not understand it. +certificate-viewer-export = Export + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Your Certificates +certificate-viewer-tab-people = People +certificate-viewer-tab-servers = Servers +certificate-viewer-tab-ca = Authorities +certificate-viewer-tab-unkonwn = Unknown diff --git a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/global/processTypes.ftl b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/global/processTypes.ftl index 8c5a8eca29ab6ceab4597524cc4f0507a3c9a8b5..ce99a568118389e9fcdfd1d9e2ec89e2ee02ee44 100644 --- a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Isolated Web Content # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..c6258301ba871839639688dd3c537050be7de3d0 --- /dev/null +++ b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = You’ve launched an older version of { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Create New Profile +profiledowngrade-sync = Using an older version of { -brand-product-name } can corrupt bookmarks and browsing history already saved to an existing { -brand-product-name } profile. To protect your information, create a new profile for this installation of { -brand-short-name }. You can always sign in with a { -fxaccount-brand-name } to synchronise your bookmarks and browsing history between profiles. +profiledowngrade-nosync = Using an older version of { -brand-product-name } can corrupt bookmarks and browsing history already saved to an existing { -brand-product-name } profile. To protect your information, create a new profile for this installation of { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Exit + *[other] Quit + } diff --git a/thunderbird-l10n/en-GB/manifest.json b/thunderbird-l10n/en-GB/manifest.json index 9abc3b91dfc2624056181ec4da59d64406a90d48..330270a6126c847ea732f40b1be2146dbf5f65cc 100644 --- a/thunderbird-l10n/en-GB/manifest.json +++ b/thunderbird-l10n/en-GB/manifest.json @@ -1,57 +1,57 @@ { - "version": "76.0buildid20200407173003", - "author": "Mark Tyndall (contributors: Ian Neal)", - "manifest_version": 2, + "version": "76.0buildid20200420212409", + "applications": { + "gecko": { + "id": "langpack-en-GB@thunderbird.mozilla.org", + "strict_max_version": "76.*", + "strict_min_version": "76.0" + } + }, "sources": { "browser": { "base_path": "browser/" } }, - "langpack_id": "en-GB", "name": "English (GB) Language Pack", + "author": "Mark Tyndall (contributors: Ian Neal)", + "langpack_id": "en-GB", + "description": "Language pack for Thunderbird for en-GB", "languages": { "en-GB": { - "version": "20200405142407", + "version": "20200416111440", "chrome_resources": { - "messenger-mapi": "chrome/en-GB/locale/en-GB/messenger-mapi/", - "mozapps": "chrome/en-GB/locale/en-GB/mozapps/", - "devtools-shared": "chrome/en-GB/locale/en-GB/devtools/shared/", - "autoconfig": "chrome/en-GB/locale/en-GB/autoconfig/", - "branding": "chrome/en-GB/locale/en-GB/branding/", - "messenger-region": "chrome/en-GB/locale/en-GB/messenger-region/", - "global": "chrome/en-GB/locale/en-GB/global/", - "communicator": "chrome/en-GB/locale/en-GB/communicator/", - "passwordmgr": "chrome/en-GB/locale/en-GB/passwordmgr/", - "chat": "chrome/en-GB/locale/en-GB/chat/", - "calendar": "chrome/en-GB/locale/en-GB/calendar/", - "messenger-smime": "chrome/en-GB/locale/en-GB/messenger-smime/", - "mozldap": "chrome/en-GB/locale/en-GB/mozldap/", + "places": "chrome/en-GB/locale/en-GB/places/", "global-platform": { - "android": "chrome/en-GB/locale/en-GB/global-platform/unix/", - "macosx": "chrome/en-GB/locale/en-GB/global-platform/mac/", "linux": "chrome/en-GB/locale/en-GB/global-platform/unix/", - "win": "chrome/en-GB/locale/en-GB/global-platform/win/" + "macosx": "chrome/en-GB/locale/en-GB/global-platform/mac/", + "win": "chrome/en-GB/locale/en-GB/global-platform/win/", + "android": "chrome/en-GB/locale/en-GB/global-platform/unix/" }, - "places": "chrome/en-GB/locale/en-GB/places/", - "necko": "chrome/en-GB/locale/en-GB/necko/", - "messenger": "chrome/en-GB/locale/en-GB/messenger/", - "lightning": "chrome/en-GB/locale/en-GB/lightning/", - "pippki": "chrome/en-GB/locale/en-GB/pippki/", - "devtools-startup": "chrome/en-GB/locale/en-GB/devtools/startup/", - "devtools": "chrome/en-GB/locale/en-GB/devtools/client/", "alerts": "chrome/en-GB/locale/en-GB/alerts/", + "global": "chrome/en-GB/locale/en-GB/global/", "pluginproblem": "chrome/en-GB/locale/en-GB/pluginproblem/", + "messenger-mapi": "chrome/en-GB/locale/en-GB/messenger-mapi/", + "messenger-smime": "chrome/en-GB/locale/en-GB/messenger-smime/", + "pipnss": "chrome/en-GB/locale/en-GB/pipnss/", + "chat": "chrome/en-GB/locale/en-GB/chat/", + "communicator": "chrome/en-GB/locale/en-GB/communicator/", + "calendar": "chrome/en-GB/locale/en-GB/calendar/", + "pippki": "chrome/en-GB/locale/en-GB/pippki/", + "messenger-region": "chrome/en-GB/locale/en-GB/messenger-region/", + "mozapps": "chrome/en-GB/locale/en-GB/mozapps/", + "passwordmgr": "chrome/en-GB/locale/en-GB/passwordmgr/", + "devtools": "chrome/en-GB/locale/en-GB/devtools/client/", + "branding": "chrome/en-GB/locale/en-GB/branding/", + "devtools-startup": "chrome/en-GB/locale/en-GB/devtools/startup/", + "mozldap": "chrome/en-GB/locale/en-GB/mozldap/", "messenger-newsblog": "chrome/en-GB/locale/en-GB/messenger-newsblog/", - "pipnss": "chrome/en-GB/locale/en-GB/pipnss/" + "devtools-shared": "chrome/en-GB/locale/en-GB/devtools/shared/", + "necko": "chrome/en-GB/locale/en-GB/necko/", + "autoconfig": "chrome/en-GB/locale/en-GB/autoconfig/", + "lightning": "chrome/en-GB/locale/en-GB/lightning/", + "messenger": "chrome/en-GB/locale/en-GB/messenger/" } } }, - "description": "Language pack for Thunderbird for en-GB", - "applications": { - "gecko": { - "strict_max_version": "76.*", - "id": "langpack-en-GB@thunderbird.mozilla.org", - "strict_min_version": "76.0" - } - } + "manifest_version": 2 } diff --git a/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/devtools/client/inspector.properties b/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/devtools/client/inspector.properties index a8968576a7a0e0c36b5e30ceec7af10f0072667f..373ee12a98ad6369e69f78460dbe50997c92a3ce 100644 --- a/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/devtools/client/inspector.properties +++ b/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Este elemento tiene desborde desplazable. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Ninguna regla asociada +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Presione Shift y haz clic para ir a la regla + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/css.properties b/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/css.properties index ac46fed11281478f5ebaa512229165a23f17e710..5e505d82f82fa912edc3d71d7797153246145419 100644 --- a/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/css.properties +++ b/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=La hoja de estilo %1$S fue cargada como CSS aunque su tipo MIME, PEUnexpEOF2=Fin de archivo inesperado buscando %1$S. PEParseRuleWSOnly=Cadena conteniendo solamente espacios entregada para utilizarse como regla. + PEDeclDropped=Declaración ignorada. PEDeclSkipped=Salteando a la próxima declaración. PEUnknownProperty=Propiedad desconocida '%1$S'. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Solamente un repeat(auto-fill, ...) se PEMoreThanOneGridRepeatAutoFillFitInTrackList=Solamente un repeat(auto-fill, ...) o repeat(auto-fit, ...) se permite en track list. PEMoreThanOneGridRepeatTrackSize=Solamente un track size se permite dentro de repeat(auto-fit/auto-fill, ...). +PEDisallowedImportRule=Las reglas de @import todavía no son válidas en las hojas de estilo construidas. + TooLargeDashedRadius=El radio de borde es demasiado grande para el estilo ‘dashed’ (el límite es 100000 px). Dibujando como sólido. TooLargeDottedRadius=El radio de borde es demasiado grande para el estilo ‘dotted’ (el límite es 100000 px). Dibujando como sólido. diff --git a/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/security/security.properties b/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/security/security.properties index 85372357ac9ddfc722a5c659dce2257d0b4a3464..0a5b16214edb99531c7c925ebedfed4011928da7 100644 --- a/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/security/security.properties +++ b/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Carga denegada por X-Frame-Options: “%1$S” de “%2$S”, el sitio # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Carga denegada por X-Frame-Options: “%1$S” de “%2$S”, el sitio no permite ningún encuadre. Se intentó cargar en “%3$S”. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Cabecera X-Frame-Options inválida encontrada al cargar “%2$S”: “%1$S” no es una directiva válida. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=La carga de “%2$S” en un marco es denegada por la directiva “X-Frame-Options“ establecida en “%1$S“. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Actualizando pedido inseguro '%1$S' para usar '%2$S' diff --git a/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/necko/necko.properties b/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/necko/necko.properties index d70c509dcdd3349b66db0d05a1a052333d919f85..e7834e40842cb354c9f23776de234a3769662756 100644 --- a/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/necko/necko.properties +++ b/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=El acceso al almacenamiento concedido # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=El acceso al almacenamiento concedido automáticamente el rastreador "%2$S" en "%1$S". +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Acceso al almacenamiento concedido automáticamente para la aislación de primera fuente “%2$S” en “%1$S”. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Cookie "%1$S" rechazada porque tiene el atributo "sameSite = ninguno" pero le falta el atributo "seguro". # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/es-AR/localization/es-AR/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/es-AR/localization/es-AR/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..382a1d88ab6cc2f4998143da185f3e436b2cfa79 --- /dev/null +++ b/thunderbird-l10n/es-AR/localization/es-AR/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Redirección de URI de calendario +calendar-uri-redirect-description = + El servidor está redirigiendo el URI para el calendario "{ $calendarName }". + ¿Acepta la redirección y comienza a usar el nuevo URI para este calendario? +calendar-uri-redirect-original-uri-label = URI actual: +calendar-uri-redirect-target-uri-label = Redireccionando a un nuevo URI: diff --git a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/aboutAddons.ftl index 43633516e02c3aec1d766792082dfec7eeb1652a..3889533e94c772eff5d7c118d034d21c8b4fd9e4 100644 --- a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Instalar complemento desde archivo… .accesskey = I help-button = Ayuda sobre complementos +sidebar-help-button-title = + .title = Ayuda sobre complementos preferences = { PLATFORM() -> [windows] Opciones de { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Herramientas para todos los complementos +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Opciones de { -brand-short-name } + *[other] Preferencias de { -brand-short-name } + } show-unsigned-extensions-button = .label = Algunos complementos no pudieron ser verificados show-all-extensions-button = @@ -170,13 +178,29 @@ extensions-view-available-updates = .name = Actualizaciones disponibles .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Recomendaciones +addon-category-discover-title = + .title = Recomendaciones addon-category-extension = Extensiones +addon-category-extension-title = + .title = Extensiones addon-category-theme = Temas +addon-category-theme-title = + .title = Temas addon-category-plugin = Plugins +addon-category-plugin-title = + .title = Plugins addon-category-dictionary = Diccionarios +addon-category-dictionary-title = + .title = Diccionarios addon-category-locale = Idiomas +addon-category-locale-title = + .title = Idiomas addon-category-available-updates = Actualizaciones disponibles +addon-category-available-updates-title = + .title = Actualizaciones disponibles addon-category-recent-updates = Actualizaciones recientes +addon-category-recent-updates-title = + .title = Actualizaciones recientes ## These are global warnings @@ -289,6 +313,7 @@ shortcuts-no-commands = Los siguientes complementos no tienen atajos de teclado: shortcuts-input = .placeholder = Escriba un atajo shortcuts-browserAction = Activar el complemento +shortcuts-browserAction2 = Activar botón de barra de herramientas shortcuts-pageAction = Activar Acción de la página shortcuts-sidebarAction = Alternar la barra lateral shortcuts-modifier-mac = Incluir Ctrl, Alt o ⌘ @@ -314,6 +339,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Mostrar menos go-back-button = .tooltiptext = Retroceder +header-back-button = + .title = Retroceder ## Recommended add-ons page diff --git a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/aboutSupport.ftl index 4a0f66c3ce8510dcfe45468c222e6b3e039831c6..86d8dadfd8f9463ebc99ce3855331bea62256346 100644 --- a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/aboutSupport.ftl @@ -290,6 +290,11 @@ sandbox-proc-type-content = contenido sandbox-proc-type-file = contenido de archivo sandbox-proc-type-media-plugin = plugin de medios sandbox-proc-type-data-decoder = decodificador de datos +startup-cache-title = Caché de inicio +startup-cache-disk-cache-path = Ruta de caché de disco +startup-cache-ignore-disk-cache = Ignorar caché de disco +startup-cache-found-disk-cache-on-init = Se encontró caché de disco en Init +startup-cache-wrote-to-disk-cache = Escribió en caché de disco launcher-process-status-0 = Habilitado launcher-process-status-1 = Deshabilitado por fallo launcher-process-status-2 = Deshabilitado por la fuerza @@ -313,6 +318,7 @@ touch-enabled = táctil habilitado drag-enabled = arrastre de barra de desplazamiento habilitado keyboard-enabled = teclado habilitado autoscroll-enabled = desplazamiento automático habilitado +zooming-enabled = zoom de pellizco suave habilitado ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/certviewer.ftl b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/certviewer.ftl index df8459908169f3182adfd7d4cfdc5585ea8fcfe7..f1aed98083139269205e1f45f62987e121c39354 100644 --- a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (cadena) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Esta extensión fue marcada como crítica, lo que significa que los clientes deben rechazar el certificado si no lo entienden. +certificate-viewer-export = Exportar + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Tus certificados +certificate-viewer-tab-people = Personas +certificate-viewer-tab-servers = Servidores +certificate-viewer-tab-ca = Autoridades +certificate-viewer-tab-unkonwn = Desconocido diff --git a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/global/processTypes.ftl b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/global/processTypes.ftl index 2b4b7cee6cc3ee9e252b6eaef303d96f0f8c1925..9bcc1415f93fab69362a4a6e322e4d98dbc937c3 100644 --- a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Contenido web aislado # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..509a084e458db650c6da6a1a0fbe3fbf1ad9d6ce --- /dev/null +++ b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Se ha iniciado una versión vieja de { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Crear un nuevo perfil +profiledowngrade-sync = Usar una versión vieja de { -brand-product-name } puede corromper los marcadores y el historial de navegación ya guardados en el perfil existente de { -brand-product-name }. Para proteger la información, debería crear un perfil nuevo para esta instalación de { -brand-short-name }. Siempre se puede ingresar con una { -fxaccount-brand-name } para sincronizar los marcadores y el historial de navegación entre perfiles. +profiledowngrade-nosync = Usar una versión vieja de { -brand-product-name } puede corromper los marcadores y el historial de navegación ya guardados en el perfil existente de { -brand-product-name }. Para proteger la información, debería crear un perfil nuevo para esta instalación de { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Salir + *[other] Salir + } diff --git a/thunderbird-l10n/es-AR/manifest.json b/thunderbird-l10n/es-AR/manifest.json index 2b09fbb1b5e0a45c1515706eb3deb7e69f69daca..1e99da8cfabfcb9d8d4d0a1ce913e6f83a7e2961 100644 --- a/thunderbird-l10n/es-AR/manifest.json +++ b/thunderbird-l10n/es-AR/manifest.json @@ -1,57 +1,57 @@ { - "manifest_version": 2, - "langpack_id": "es-AR", "sources": { "browser": { "base_path": "browser/" } }, + "manifest_version": 2, + "author": "mozilla.org (contributors: Marcelo Poli)", + "version": "76.0buildid20200420212409", + "description": "Language pack for Thunderbird for es-AR", "name": "Español (AR) Language Pack", "languages": { "es-AR": { "chrome_resources": { - "chat": "chrome/es-AR/locale/es-AR/chat/", + "devtools": "chrome/es-AR/locale/es-AR/devtools/client/", + "autoconfig": "chrome/es-AR/locale/es-AR/autoconfig/", + "messenger": "chrome/es-AR/locale/es-AR/messenger/", + "pluginproblem": "chrome/es-AR/locale/es-AR/pluginproblem/", + "messenger-region": "chrome/es-AR/locale/es-AR/messenger-region/", "devtools-startup": "chrome/es-AR/locale/es-AR/devtools/startup/", + "passwordmgr": "chrome/es-AR/locale/es-AR/passwordmgr/", "places": "chrome/es-AR/locale/es-AR/places/", "lightning": "chrome/es-AR/locale/es-AR/lightning/", - "branding": "chrome/es-AR/locale/es-AR/branding/", - "messenger-smime": "chrome/es-AR/locale/es-AR/messenger-smime/", + "messenger-mapi": "chrome/es-AR/locale/es-AR/messenger-mapi/", "global": "chrome/es-AR/locale/es-AR/global/", - "alerts": "chrome/es-AR/locale/es-AR/alerts/", + "mozldap": "chrome/es-AR/locale/es-AR/mozldap/", "pippki": "chrome/es-AR/locale/es-AR/pippki/", - "mozapps": "chrome/es-AR/locale/es-AR/mozapps/", - "devtools": "chrome/es-AR/locale/es-AR/devtools/client/", - "pipnss": "chrome/es-AR/locale/es-AR/pipnss/", - "pluginproblem": "chrome/es-AR/locale/es-AR/pluginproblem/", - "necko": "chrome/es-AR/locale/es-AR/necko/", - "communicator": "chrome/es-AR/locale/es-AR/communicator/", - "devtools-shared": "chrome/es-AR/locale/es-AR/devtools/shared/", - "passwordmgr": "chrome/es-AR/locale/es-AR/passwordmgr/", "global-platform": { - "android": "chrome/es-AR/locale/es-AR/global-platform/unix/", - "macosx": "chrome/es-AR/locale/es-AR/global-platform/mac/", + "linux": "chrome/es-AR/locale/es-AR/global-platform/unix/", "win": "chrome/es-AR/locale/es-AR/global-platform/win/", - "linux": "chrome/es-AR/locale/es-AR/global-platform/unix/" + "macosx": "chrome/es-AR/locale/es-AR/global-platform/mac/", + "android": "chrome/es-AR/locale/es-AR/global-platform/unix/" }, - "autoconfig": "chrome/es-AR/locale/es-AR/autoconfig/", - "messenger-newsblog": "chrome/es-AR/locale/es-AR/messenger-newsblog/", - "mozldap": "chrome/es-AR/locale/es-AR/mozldap/", - "messenger": "chrome/es-AR/locale/es-AR/messenger/", - "messenger-mapi": "chrome/es-AR/locale/es-AR/messenger-mapi/", - "messenger-region": "chrome/es-AR/locale/es-AR/messenger-region/", - "calendar": "chrome/es-AR/locale/es-AR/calendar/" + "communicator": "chrome/es-AR/locale/es-AR/communicator/", + "calendar": "chrome/es-AR/locale/es-AR/calendar/", + "devtools-shared": "chrome/es-AR/locale/es-AR/devtools/shared/", + "alerts": "chrome/es-AR/locale/es-AR/alerts/", + "messenger-smime": "chrome/es-AR/locale/es-AR/messenger-smime/", + "mozapps": "chrome/es-AR/locale/es-AR/mozapps/", + "branding": "chrome/es-AR/locale/es-AR/branding/", + "chat": "chrome/es-AR/locale/es-AR/chat/", + "necko": "chrome/es-AR/locale/es-AR/necko/", + "pipnss": "chrome/es-AR/locale/es-AR/pipnss/", + "messenger-newsblog": "chrome/es-AR/locale/es-AR/messenger-newsblog/" }, - "version": "20200404233502" + "version": "20200418082423" } }, - "description": "Language pack for Thunderbird for es-AR", + "langpack_id": "es-AR", "applications": { "gecko": { "id": "langpack-es-AR@thunderbird.mozilla.org", - "strict_max_version": "76.*", - "strict_min_version": "76.0" + "strict_min_version": "76.0", + "strict_max_version": "76.*" } - }, - "author": "mozilla.org (contributors: Marcelo Poli)", - "version": "76.0buildid20200407173003" + } } diff --git a/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/devtools/client/inspector.properties b/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/devtools/client/inspector.properties index 6e778dfa34e5714c29ac0fb6a7efcc5477b1bf1d..51e173a838b7c543968353ff12002850a99d6187 100644 --- a/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/devtools/client/inspector.properties +++ b/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Este elemento tiene desbordamiento desplazabl # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Ninguna regla asociada +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Presione Shift y haga clic para ir a la regla + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/global/css.properties b/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/global/css.properties index 4cc8b7dc355fa88f712d6c3180385a06eac0e486..9672ab1b2b5965d0e34115cfaaa193dfa3574c27 100644 --- a/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/global/css.properties +++ b/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=La hoja de estilos %1$S se ha cargado como CSS a pesar de que su PEUnexpEOF2=Fin de archivo inesperado mientras se buscaba %1$S. PEParseRuleWSOnly=Se ha pasado una cadena de espacios en blanco como regla. + PEDeclDropped=Declaración rechazada. PEDeclSkipped=Ignorado hasta la siguiente declaración. PEUnknownProperty=Propiedad desconocida '%1$S'. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Solo se permite un repeat(auto-fill, PEMoreThanOneGridRepeatAutoFillFitInTrackList=Solo se permite un repeat(auto-fill, …) o repeat(auto-fit, …) en una lista de pistas. PEMoreThanOneGridRepeatTrackSize=Solo se permite un tamaño de pista dentro de repeat(auto-fit/auto-fill, …). +PEDisallowedImportRule=Las reglas @import todavía no son válidas en hojas de estilo construidas. + TooLargeDashedRadius=El radio del borde es demasiado grande para el estilo 'dashed' o a rayas (el límite es 100000px). Dibujando en estilo sólido o continuo. TooLargeDottedRadius=El radio del borde es demasiado grande para el estilo 'dotted' o punteado (el límite es 100000px). Dibujando en estilo sólido o continuo. diff --git a/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/global/security/security.properties b/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/global/security/security.properties index 19ff72791b444f41b57ec36600b9bd04c8c58e2d..21f0c833ba5bfcc5c31d8ac5c98293d9fa6abcda 100644 --- a/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/global/security/security.properties +++ b/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Carga denegada por X-Frame-Options: “%1$S” de “%2$S”, el sitio # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Carga denegada por X-Frame-Options: “%1$S” de “%2$S”, el sitio no permite ningún marco de origen cruzado de “%3$S”. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Se ha encontrado una cabecera X-Frame-Options no válida al cargar “%2$S”: “%1$S” no es una directiva válida. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=La carga de “%2$S” en un marco ha sido denegada por la directiva “X-Frame-Options“ establecida en “%1$S“. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Actualizando solicitud insegura “%1$S” para usar “%2$S”. diff --git a/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/necko/necko.properties b/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/necko/necko.properties index c84553c37d90ab7bb6527c9e859b87e579602dda..301d9ec0e3e13296ef0359a3fac4d2d27b348aff 100644 --- a/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/necko/necko.properties +++ b/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Concedido automáticamente el acceso # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Concedido automáticamente el acceso al almacenamiento para el rastreador “%2$S” en “%1$S”. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Acceso al almacenamiento concedido automáticamente para el aislamiento First-Party “%2$S” en “%1$S”. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Cookie “%1$S” rechazada porque tiene el atributo “sameSite=none” pero le falta el atributo “secure”. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/aboutAddons.ftl index 1a7b7c5598af4b90d6bfce36077d312c0a75e3a9..30858357d184181b472e2f8add167bac78668639 100644 --- a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Instalar complemento desde archivo… .accesskey = I help-button = Soporte para complementos +sidebar-help-button-title = + .title = Soporte para complementos preferences = { PLATFORM() -> [windows] Opciones de { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Herramientas para todos los complementos +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Opciones de { -brand-short-name } + *[other] Preferencias de { -brand-short-name } + } show-unsigned-extensions-button = .label = Algunas extensiones no han podido ser verificadas show-all-extensions-button = @@ -168,13 +176,29 @@ extensions-view-available-updates = .name = Actualizaciones disponibles .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Recomendaciones +addon-category-discover-title = + .title = Recomendaciones addon-category-extension = Extensiones +addon-category-extension-title = + .title = Extensiones addon-category-theme = Temas +addon-category-theme-title = + .title = Temas addon-category-plugin = Plugins +addon-category-plugin-title = + .title = Plugins addon-category-dictionary = Diccionarios +addon-category-dictionary-title = + .title = Diccionarios addon-category-locale = Idiomas +addon-category-locale-title = + .title = Idiomas addon-category-available-updates = Actualizaciones disponibles +addon-category-available-updates-title = + .title = Actualizaciones disponibles addon-category-recent-updates = Actualizaciones recientes +addon-category-recent-updates-title = + .title = Actualizaciones recientes ## These are global warnings @@ -287,6 +311,7 @@ shortcuts-no-commands = Las siguientes extensiones no tienen atajos: shortcuts-input = .placeholder = Escriba un atajo shortcuts-browserAction = Activar extensión +shortcuts-browserAction2 = Activar botón de la barra de herramientas shortcuts-pageAction = Activar acción de página shortcuts-sidebarAction = Alternar la barra lateral shortcuts-modifier-mac = Incluir Ctrl, Alt o ⌘ @@ -312,6 +337,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Mostrar menos go-back-button = .tooltiptext = Retroceder +header-back-button = + .title = Retroceder ## Recommended add-ons page diff --git a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/aboutSupport.ftl index 2baee6071a165ebb6630e7cbaf0f806740adca14..7c7768b71ed888ac2f4cbad85f7f1a14a1ff6f3f 100644 --- a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/aboutSupport.ftl @@ -287,6 +287,11 @@ sandbox-proc-type-content = contenido sandbox-proc-type-file = contenido del archivo sandbox-proc-type-media-plugin = plugin de medios sandbox-proc-type-data-decoder = decodificador de datos +startup-cache-title = Caché de inicio +startup-cache-disk-cache-path = Ruta de caché de disco +startup-cache-ignore-disk-cache = Ignorar caché de disco +startup-cache-found-disk-cache-on-init = Caché de disco encontrada durante la inicialización +startup-cache-wrote-to-disk-cache = Se escribió a la caché de disco launcher-process-status-0 = Activado launcher-process-status-1 = Desactivado por fallo launcher-process-status-2 = Desactivado forzosamente @@ -310,6 +315,7 @@ touch-enabled = entrada táctil activada drag-enabled = arrastre de la barra de desplazamiento activado keyboard-enabled = teclado habilitado autoscroll-enabled = desplazamiento automático activado +zooming-enabled = zoom de pellizco suave activado ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/certviewer.ftl b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/certviewer.ftl index 88d549110a6a772b97ea7fd631ec12f270efa6bd..3ca07152fb55159faf779f19b782a4cd0370f2c9 100644 --- a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (cadena) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Esta extensión ha sido marcada como crítica, lo que significa que los clientes deben rechazar el certificado si no lo entienden. +certificate-viewer-export = Exportar + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Sus certificados +certificate-viewer-tab-people = Personas +certificate-viewer-tab-servers = Servidores +certificate-viewer-tab-ca = Autoridades +certificate-viewer-tab-unkonwn = Desconocido diff --git a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/global/processTypes.ftl b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/global/processTypes.ftl index 60a4d59075d3bfbe75dc2abf86ff581e3778da4f..5c3b21783328fee6ed4a4f2e5859df0423ce1c1e 100644 --- a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Contenido web aislado # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..d28ad8dedb87718ba1287f2187351c4a44ca90f9 --- /dev/null +++ b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Ha ejecutado una versión antigua de { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Crear nuevo perfil +profiledowngrade-sync = Usar una versión antigua de { -brand-product-name } puede corromper los marcadores y el historial de navegación ya guardados en un perfil de { -brand-product-name } existente. Para proteger su información, cree un nuevo perfil para esta instalación de { -brand-short-name }. Siempre puede conectarse a una { -fxaccount-brand-name } para sincronizar sus marcadores e historial de navegación entre perfiles. +profiledowngrade-nosync = Usar una versión antigua de { -brand-product-name } puede corromper los marcadores y el historial de navegación ya guardados en un perfil de { -brand-product-name } existente. Para proteger su información, cree un nuevo perfil para esta instalación de { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Salir + *[other] Salir + } diff --git a/thunderbird-l10n/es-ES/manifest.json b/thunderbird-l10n/es-ES/manifest.json index d52d4104d7e6fa93b5d85ae125c02de5ea365603..f513b16a9b968388f6c2bffe7ba638765b156106 100644 --- a/thunderbird-l10n/es-ES/manifest.json +++ b/thunderbird-l10n/es-ES/manifest.json @@ -1,57 +1,57 @@ { - "langpack_id": "es-ES", "sources": { "browser": { "base_path": "browser/" } }, + "version": "76.0buildid20200420212409", "manifest_version": 2, + "author": "mozilla.org", + "description": "Language pack for Thunderbird for es-ES", + "name": "Español (España) Language Pack", "applications": { "gecko": { + "strict_min_version": "76.0", "id": "langpack-es-ES@thunderbird.mozilla.org", - "strict_max_version": "76.*", - "strict_min_version": "76.0" + "strict_max_version": "76.*" } }, - "name": "Español (España) Language Pack", - "author": "mozilla.org", - "description": "Language pack for Thunderbird for es-ES", "languages": { "es-ES": { "chrome_resources": { - "devtools": "chrome/es-ES/locale/es-ES/devtools/client/", - "autoconfig": "chrome/es-ES/locale/es-ES/autoconfig/", - "places": "chrome/es-ES/locale/es-ES/places/", - "messenger-region": "chrome/es-ES/locale/es-ES/messenger-region/", - "communicator": "chrome/es-ES/locale/es-ES/communicator/", - "global": "chrome/es-ES/locale/es-ES/global/", - "calendar": "chrome/es-ES/locale/es-ES/calendar/", "mozldap": "chrome/es-ES/locale/es-ES/mozldap/", - "messenger-mapi": "chrome/es-ES/locale/es-ES/messenger-mapi/", - "alerts": "chrome/es-ES/locale/es-ES/alerts/", - "pipnss": "chrome/es-ES/locale/es-ES/pipnss/", - "mozapps": "chrome/es-ES/locale/es-ES/mozapps/", - "devtools-shared": "chrome/es-ES/locale/es-ES/devtools/shared/", + "communicator": "chrome/es-ES/locale/es-ES/communicator/", "pluginproblem": "chrome/es-ES/locale/es-ES/pluginproblem/", - "messenger-newsblog": "chrome/es-ES/locale/es-ES/messenger-newsblog/", - "passwordmgr": "chrome/es-ES/locale/es-ES/passwordmgr/", - "necko": "chrome/es-ES/locale/es-ES/necko/", - "pippki": "chrome/es-ES/locale/es-ES/pippki/", - "chat": "chrome/es-ES/locale/es-ES/chat/", + "branding": "chrome/es-ES/locale/es-ES/branding/", + "messenger-smime": "chrome/es-ES/locale/es-ES/messenger-smime/", + "alerts": "chrome/es-ES/locale/es-ES/alerts/", "messenger": "chrome/es-ES/locale/es-ES/messenger/", + "devtools": "chrome/es-ES/locale/es-ES/devtools/client/", + "devtools-startup": "chrome/es-ES/locale/es-ES/devtools/startup/", + "mozapps": "chrome/es-ES/locale/es-ES/mozapps/", + "messenger-mapi": "chrome/es-ES/locale/es-ES/messenger-mapi/", + "autoconfig": "chrome/es-ES/locale/es-ES/autoconfig/", "global-platform": { - "linux": "chrome/es-ES/locale/es-ES/global-platform/unix/", "win": "chrome/es-ES/locale/es-ES/global-platform/win/", + "linux": "chrome/es-ES/locale/es-ES/global-platform/unix/", "android": "chrome/es-ES/locale/es-ES/global-platform/unix/", "macosx": "chrome/es-ES/locale/es-ES/global-platform/mac/" }, + "pipnss": "chrome/es-ES/locale/es-ES/pipnss/", + "messenger-newsblog": "chrome/es-ES/locale/es-ES/messenger-newsblog/", + "places": "chrome/es-ES/locale/es-ES/places/", + "necko": "chrome/es-ES/locale/es-ES/necko/", + "devtools-shared": "chrome/es-ES/locale/es-ES/devtools/shared/", + "passwordmgr": "chrome/es-ES/locale/es-ES/passwordmgr/", "lightning": "chrome/es-ES/locale/es-ES/lightning/", - "messenger-smime": "chrome/es-ES/locale/es-ES/messenger-smime/", - "devtools-startup": "chrome/es-ES/locale/es-ES/devtools/startup/", - "branding": "chrome/es-ES/locale/es-ES/branding/" + "chat": "chrome/es-ES/locale/es-ES/chat/", + "calendar": "chrome/es-ES/locale/es-ES/calendar/", + "global": "chrome/es-ES/locale/es-ES/global/", + "messenger-region": "chrome/es-ES/locale/es-ES/messenger-region/", + "pippki": "chrome/es-ES/locale/es-ES/pippki/" }, - "version": "20200405151330" + "version": "20200419163537" } }, - "version": "76.0buildid20200407173003" + "langpack_id": "es-ES" } diff --git a/thunderbird-l10n/et/localization/et/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/et/localization/et/toolkit/about/aboutAddons.ftl index 24a2d5a6f648991cb8766d960bbf8abc5e79de9b..0d79960b4cd9cfbbf6752cad6b068012d0aee9cc 100644 --- a/thunderbird-l10n/et/localization/et/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/et/localization/et/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Paigalda lisa failist… .accesskey = P help-button = Lisade kasutajatugi +sidebar-help-button-title = + .title = Lisade kasutajatugi preferences = { PLATFORM() -> [windows] { -brand-short-name }i sätted @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Tööriistad kõigile lisadele +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name }i sätted + *[other] { -brand-short-name }i eelistused + } show-unsigned-extensions-button = .label = Mõnda laiendust polnud võimalik verifitseerida show-all-extensions-button = @@ -168,13 +176,29 @@ extensions-view-available-updates = .name = Saadaolevad uuendused .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Soovitused +addon-category-discover-title = + .title = Soovitused addon-category-extension = Laiendused +addon-category-extension-title = + .title = Laiendused addon-category-theme = Teemad +addon-category-theme-title = + .title = Teemad addon-category-plugin = Pluginad +addon-category-plugin-title = + .title = Pluginad addon-category-dictionary = Sõnaraamatud +addon-category-dictionary-title = + .title = Sõnaraamatud addon-category-locale = Keeled +addon-category-locale-title = + .title = Keeled addon-category-available-updates = Saadaolevad uuendused +addon-category-available-updates-title = + .title = Saadaolevad uuendused addon-category-recent-updates = Hiljutised uuendused +addon-category-recent-updates-title = + .title = Hiljutised uuendused ## These are global warnings @@ -312,6 +336,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Näita vähem go-back-button = .tooltiptext = Mine tagasi +header-back-button = + .title = Mine tagasi ## Recommended add-ons page diff --git a/thunderbird-l10n/et/localization/et/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/et/localization/et/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..df980adf0d3d40d7193bbfe081ea7a7aae2067d8 --- /dev/null +++ b/thunderbird-l10n/et/localization/et/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Käivitatud on { -brand-product-name }i vanem versioon + .style = width: 490px; +profiledowngrade-window-create = + .label = Loo uus profiil +profiledowngrade-sync = Vanema { -brand-product-name }i versiooni kasutamine võib rikkuda järjehoidjad ning veebilehitsemise ajaloo, mis on olemasolevasse profiili juba salvestatud. Oma andmete kaitsmiseks soovitame luua selle { -brand-short-name }i paigalduse jaoks uue profiili. Sa võid alati sisse logida { -fxaccount-brand-name }ga ja erinevate profiilide vahel oma järjehoidjad ja veebilehitsemise ajaloo sünkroniseerida. +profiledowngrade-nosync = Vanema { -brand-product-name }i versiooni kasutamine võib rikkuda järjehoidjad ning veebilehitsemise ajaloo, mis on olemasolevasse profiili juba salvestatud. Oma andmete kaitsmiseks soovitame luua selle { -brand-short-name }i paigalduse jaoks uue profiili. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Välju + *[other] Välju + } diff --git a/thunderbird-l10n/et/manifest.json b/thunderbird-l10n/et/manifest.json index 6aac495347b3a191cb6c163c55bea227336d24a4..4dc4a68195de10049af9b7af49691820a852dabc 100644 --- a/thunderbird-l10n/et/manifest.json +++ b/thunderbird-l10n/et/manifest.json @@ -1,5 +1,17 @@ { + "manifest_version": 2, + "name": "Estonian Language Pack", "author": "mozilla.org (contributors: Sander Lepik, Marek Laane, Ain Vagula)", + "version": "76.0buildid20200420212409", + "applications": { + "gecko": { + "id": "langpack-et@thunderbird.mozilla.org", + "strict_max_version": "76.*", + "strict_min_version": "76.0" + } + }, + "description": "Language pack for Thunderbird for et", + "langpack_id": "et", "sources": { "browser": { "base_path": "browser/" @@ -7,51 +19,39 @@ }, "languages": { "et": { - "version": "20200403074527", + "version": "20200415054913", "chrome_resources": { "messenger-region": "chrome/et/locale/et/messenger-region/", - "global": "chrome/et/locale/et/global/", - "alerts": "chrome/et/locale/et/alerts/", - "devtools-shared": "chrome/et/locale/et/devtools/shared/", - "autoconfig": "chrome/et/locale/et/autoconfig/", + "devtools-startup": "chrome/et/locale/et/devtools/startup/", + "communicator": "chrome/et/locale/et/communicator/", + "branding": "chrome/et/locale/et/branding/", + "pippki": "chrome/et/locale/et/pippki/", "pluginproblem": "chrome/et/locale/et/pluginproblem/", + "devtools": "chrome/et/locale/et/devtools/client/", + "passwordmgr": "chrome/et/locale/et/passwordmgr/", + "alerts": "chrome/et/locale/et/alerts/", + "mozldap": "chrome/et/locale/et/mozldap/", + "messenger-mapi": "chrome/et/locale/et/messenger-mapi/", "global-platform": { "macosx": "chrome/et/locale/et/global-platform/mac/", "win": "chrome/et/locale/et/global-platform/win/", - "android": "chrome/et/locale/et/global-platform/unix/", - "linux": "chrome/et/locale/et/global-platform/unix/" + "linux": "chrome/et/locale/et/global-platform/unix/", + "android": "chrome/et/locale/et/global-platform/unix/" }, - "messenger-mapi": "chrome/et/locale/et/messenger-mapi/", - "branding": "chrome/et/locale/et/branding/", - "passwordmgr": "chrome/et/locale/et/passwordmgr/", - "pippki": "chrome/et/locale/et/pippki/", - "devtools": "chrome/et/locale/et/devtools/client/", - "communicator": "chrome/et/locale/et/communicator/", + "lightning": "chrome/et/locale/et/lightning/", + "calendar": "chrome/et/locale/et/calendar/", "necko": "chrome/et/locale/et/necko/", + "mozapps": "chrome/et/locale/et/mozapps/", + "devtools-shared": "chrome/et/locale/et/devtools/shared/", "places": "chrome/et/locale/et/places/", - "devtools-startup": "chrome/et/locale/et/devtools/startup/", + "autoconfig": "chrome/et/locale/et/autoconfig/", + "global": "chrome/et/locale/et/global/", + "messenger": "chrome/et/locale/et/messenger/", + "messenger-smime": "chrome/et/locale/et/messenger-smime/", "pipnss": "chrome/et/locale/et/pipnss/", - "calendar": "chrome/et/locale/et/calendar/", - "mozldap": "chrome/et/locale/et/mozldap/", "messenger-newsblog": "chrome/et/locale/et/messenger-newsblog/", - "messenger-smime": "chrome/et/locale/et/messenger-smime/", - "lightning": "chrome/et/locale/et/lightning/", - "mozapps": "chrome/et/locale/et/mozapps/", - "messenger": "chrome/et/locale/et/messenger/", "chat": "chrome/et/locale/et/chat/" } } - }, - "name": "Estonian Language Pack", - "description": "Language pack for Thunderbird for et", - "version": "76.0buildid20200407173003", - "langpack_id": "et", - "manifest_version": 2, - "applications": { - "gecko": { - "strict_min_version": "76.0", - "id": "langpack-et@thunderbird.mozilla.org", - "strict_max_version": "76.*" - } } } diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/devtools/client/inspector.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/devtools/client/inspector.properties index 7e036c37d16191801fce1b04c2701eef4b99ee97..251987902566026227081ecedd8b44e341ed4eb1 100644 --- a/thunderbird-l10n/eu/chrome/eu/locale/eu/devtools/client/inspector.properties +++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Elementu honek korritu daitekeen gainezkatzea # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Erlazionatutako erregelarik ez +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Mantendu Shift sakatuta eta egin klik araura saltatzeko + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/global/css.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/global/css.properties index 33994804efc9071ad7651c08e8ead8ba1ae7196b..d27f045f8cd25c962558300e0232278042a4a5d2 100644 --- a/thunderbird-l10n/eu/chrome/eu/locale/eu/global/css.properties +++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=%1$S estilo-orria CSS gisa kargatu da bere MIME mota, "%2$S", "te PEUnexpEOF2=Espero ez zen fitxategi amaiera %1$S bilatzean. PEParseRuleWSOnly=Emandako zuriune bakarreko katea arau bezala analizatuko da. + PEDeclDropped=Deklarazioa albo batera utzita. PEDeclSkipped=Hurrengo deklaraziora salto egin da. PEUnknownProperty='%1$S' propietate ezezaguna. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Azpi-saretaren izen-zerrendan repeat(a PEMoreThanOneGridRepeatAutoFillFitInTrackList=Track-zerrendan repeat(auto-fill, …) edo repeat(auto-fit, …) bakarra onartzen da. PEMoreThanOneGridRepeatTrackSize=Track-tamaina bakarra onartzen da repeat(auto-fit/auto-fill, …) barnean. +PEDisallowedImportRule=@import arauak ez dira oraindik baliozkoak eraikitako estilo orrietan + TooLargeDashedRadius=Ertzaren erradioa handiegia da 'dashed' estilorako (muga 100000px da). Solido gisa errendatzen. TooLargeDottedRadius=Ertzaren erradioa handiegia da 'dotted' estilorako (muga 100000px da). Solido gisa errendatzen. diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/global/security/security.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/global/security/security.properties index 6bfba4a13a9e6705af94ae49bdf1a2790104e2de..e99ab2f64731dcec84fe2a203350e3c6ec9ae631 100644 --- a/thunderbird-l10n/eu/chrome/eu/locale/eu/global/security/security.properties +++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Kargatzea ukatu du "%2$S" helbideko X-Frame-Options:"%1$S" balioak, gu # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Kargatzea ukatu du "%2$S" helbideko X-Frame-Options:"%1$S" balioak, guneak ez baitu jatorri gurutzatuko markorik baimentzen "%3$S" dokumentutik. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = X-Frame-Options goiburu baliogabea aurkitu da "%2$S" kargatzean: "%1$S" ez da baliozko direktiba. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny="X-Frame-Options" direktibaren "%1$S" balioak "%2$S" markoa kargatzea eragozten du. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Segurua ez den "%1$S" eskaera "%2$S" erabiltzeko bertsio-berritzen. diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/addons.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/addons.properties index ad4bc07b2ee427b6f49eb7354d686878361ce844..f0f58fe82a82c54d678617e14a34edd36e223916 100644 --- a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/addons.properties +++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/addons.properties @@ -126,6 +126,8 @@ addonInstallErrorBlocklisted=Ezin izan da %S instalatu egonkortasun- eta segurta # Note, this string will be used as raw markup. Avoid characters like <, >, & webextPerms.header=Gehitu %S? +# %S is brandShortName +webextPerms.experimentWarning=Asmo txarreko gehigarriek zure informazio pertsonala lapurtu edo zure ordenagailua arriskuan jar dezakete. Instalatu gehigarri hau iturburu fidagarrikoa bada soilik. webextPerms.unsignedWarning=Kontuz: gehigarri hau egiaztatu gabe dago. Asmo txarreko gehigarriek zure informazio pertsonala lapurtu edo zure ordenagailua arriskuan jar dezakete. Instalatu gehigarri hau iturburu fidagarrikoa bada soilik. # LOCALIZATION NOTE (webextPerms.listIntro) @@ -194,6 +196,9 @@ webextPerms.description.devtools=Garatzaile-tresnak hedatu eta irekitako fitxeta webextPerms.description.dns=IP helbide eta ostalari-izenetarako sarbidea webextPerms.description.downloads=Fitxategiak deskargatzea eta nabigatzailearen deskarga-historia irakurri eta aldatzea webextPerms.description.downloads.open=Zure ordenagailura deskargatutako fitxategiak irekitzea +# LOCALIZATION NOTE (webextPerms.description.experiment) +# %S will be replaced with the name of the application +webextPerms.description.experiment=Osoa eduki, mugarik gabeko sarrera %S-(e)ra eta zure ordenagailura webextPerms.description.find=Irekitako fitxa guztietako testua irakurtzea webextPerms.description.geolocation=Zure kokapena atzitzea webextPerms.description.history=Nabigatze-historia atzitzea @@ -258,9 +263,3 @@ webext.remove.confirmation.title=Kendu %S # %2$S is brandShorterName webext.remove.confirmation.message=Kendu %1$S %2$S(e)tik? webext.remove.confirmation.button=Kendu - -# %S is brandShortName -webextPerms.experimentWarning=Malicious add-ons can steal your private information or compromise your computer. Only install this add-on if you trust the source. -# LOCALIZATION NOTE (webextPerms.description.experiment) -# %S will be replaced with the name of the application -webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/customizeToolbar.dtd b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/customizeToolbar.dtd index f570af972b40bb574c80e8f9b26b6489b216263d..18a6ea2c8dd99b1ff05f958b91218bda60d53bb5 100644 --- a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/customizeToolbar.dtd +++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/customizeToolbar.dtd @@ -15,8 +15,7 @@ <!ENTITY addNewToolbar.label "Gehitu tresna-barra berria"> <!ENTITY showTitlebar.label "Erakutsi titulu-barra"> <!ENTITY extraDragSpace.label "Gehitu arrastatu zuriunea"> +<!ENTITY showTitlebar2.label "Titulu-barra"> +<!ENTITY extraDragSpace2.label "Arrastatu zuriunea"> <!ENTITY saveChanges.label "Eginda"> <!ENTITY undoChanges.label "Desegin aldaketak"> - -<!ENTITY showTitlebar2.label "Title Bar"> -<!ENTITY extraDragSpace2.label "Drag Space"> diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/imapMsgs.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/imapMsgs.properties index 61f94b22976c0bcc0ae45bc077544ccb6e5149e1..071d3f0bddf2c54c910d529b1d0ba2da22c2fce0 100644 --- a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/imapMsgs.properties +++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/imapMsgs.properties @@ -199,12 +199,22 @@ imapSubscribePrompt=%1$S berri-taldera harpidetu nahi duzu? imapServerDroppedConnection=Ezin da zure IMAP zerbitzarira konektatu. Agian zerbitzariak onartzen duen gehieneko konexio kopurua gainditu duzu. Hala bada, erabili IMAP zerbitzariaren ezarpen aurreratuen elkarrizketa katxeatutako konexio kopurua murrizteko. +# This will occur when a folder that has never been imap selected or opened +# (left-clicked) is first right-clicked to access quota properties. imapQuotaStatusFolderNotOpen=Kuota-informazioa ezin da eskuratu karpeta ireki gabe dagoelako. +# The imap capability response reports that QUOTA is not supported. imapQuotaStatusNotSupported=Zerbitzari honek ez du kuotaren euskarririk. imapQuotaStatusNoQuota=Karpeta honetan ez dago kuotaren mugarik. +# The getqutaroot command succeeded but reported no quota information. +imapQuotaStatusNoQuota2=Karpeta honek ez du kuota informaziorik ematen. + +# Folder properties were requested by the user (right-click) before the getquotaroot +# command was sent. +imapQuotaStatusInProgress=Kuota informazioa ez dago eskuragarri. + # Out of memory imapOutOfMemory=Aplikazioak ez dauka memoria librerik. @@ -256,9 +266,3 @@ imapFolderCommandFailed='%2$S' karpetaren gaineko uneko uneko eragiketak huts eg # Place the word %1$S in your translation where the name of the account should appear. # Place the word %2$S in your translation where the alert from the server should appear. imapServerAlert=%1$S kontuaren abisua: %2$S - -# The getqutaroot command succeeded but reported no quota information. -imapQuotaStatusNoQuota2=This folder reports no quota information. -# Folder properties were requested by the user (right-click) before the getquotaroot -# command was sent. -imapQuotaStatusInProgress=Quota information not yet available. diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/messenger.dtd b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/messenger.dtd index 63d2288069501ad6e057335b296919848c403975..ac0f1d8ecb2bf1847db68f3d92cad7155201aa97 100644 --- a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/messenger.dtd +++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/messenger.dtd @@ -289,8 +289,10 @@ <!ENTITY searchMailCmd.label "Bilatu mezuak…"> <!ENTITY searchMailCmd.accesskey "B"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Bilaketa globala…"> +<!ENTITY glodaSearchCmd.accesskey "G"> <!ENTITY searchAddressesCmd.label "Bilatu helbideak…"> -<!ENTITY searchAddressesCmd.accesskey "B"> +<!ENTITY searchAddressesCmd.accesskey "h"> <!-- Go Menu --> <!ENTITY goMenu.label "Joan"> diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/messenger.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/messenger.properties index 147c75ca91b73651658311e937499f22c5d0f083..e603c8cbf0ef6d8e900da25e5d29187cc899a19c 100644 --- a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/messenger.properties +++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/messenger.properties @@ -318,6 +318,7 @@ irakurtzeko. Hau egiteko, aukeratu lineaz kanpo fitxategia menuan eta aukeratu\ # accountCentral mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xul + # LOCALIZATION NOTE(acctCentralTitleFormat): %1$S is brand, %2$S is account type, %3$S is account name acctCentralTitleFormat=%1$S %2$S - %3$S mailAcctType=Posta @@ -465,11 +466,15 @@ macBiffNotification_separator=,\u0020 # For the Quota tab in the mail folder properties dialog quotaUsedFree=%S KB / %S KB erabilita + +# For the Quota tab in the mail folder properties dialog quotaPercentUsed=%%%S beteta # for quota in main window (commandglue.js) percent=%%%S quotaTooltip=IMAP kuota: %S KB / %S KB erabilita. Egin klik xehetasunak jasotzeko. +quotaTooltip2=IMAP kuota: %Stik %S erabilita. Egin klik xehetasunak jasotzeko. + # for message views confirmViewDeleteTitle=Berretsi confirmViewDeleteMessage=Ziur zaude bista hau ezabatu nahi duzula? @@ -805,5 +810,3 @@ errorConsoleTitle = Errore-kontsola # This is used by screen readers to label the "back" button in various browser # popup panels, including the sliding subviews of the appmenu. panel.back = Atzera - -quotaTooltip2=IMAP quota: %S used of %S total. Click for details. diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/pgpmime.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/pgpmime.properties index 3dc06b96beb80f2930181ee6aca9c27e8f144f9d..b077303dd27162789add78f1d02b1106e39857b5 100644 --- a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/pgpmime.properties +++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=Zifratutako OpenPGP mezu bat da hau.<br>Mezu hau deszifratzeko, <a href="%S">OpenPGP gehigarri bat</a> instalatu behar duzu. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Hau zifratutako OpenPGP mezua da, baina OpenPGP deszifratzeko euskarria ez dago erabilgarri. diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/preferences/general.dtd b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/preferences/general.dtd index c74034225ea5cedf3d82aec7f1f607bf678bdde7..2abd1b9c4ea09afb0bf0bc0bb857a1a833690b87 100644 --- a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/preferences/general.dtd +++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/preferences/general.dtd @@ -43,5 +43,5 @@ <!ENTITY removeSearchEngine.label "Kendu"> <!ENTITY removeSearchEngine.accesskey "K"> -<!ENTITY minimizeToTray.label "When &brandShortName; is minimized, move it to the tray"> -<!ENTITY minimizeToTray.accesskey "m"> +<!ENTITY minimizeToTray.label "&brandShortName; txikitzen denean, mugitu erretilura"> +<!ENTITY minimizeToTray.accesskey "t"> diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/necko/necko.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/necko/necko.properties index e22c6e6fe295edee2a5ddf4bf5ef39523cf22099..cc32f46ac317ec5b42d7fdb0181f67553174f2e9 100644 --- a/thunderbird-l10n/eu/chrome/eu/locale/eu/necko/necko.properties +++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Biltegiratzea atzitzea automatikoki b # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Biltegiratzea atzitzea automatikoki baimendu da "%2$S" jarraipen-elementuarentzat "%1$S" helbidean. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Biltegiratzearen sarbidea automatikoki baimendu da lehenengo mailako isolamenduko “%2$S”(r)ako “%1$S” helbidean. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure="%1$S" cookiea baztertu egin da "sameSite=none" atributua izanagatik ere "secure" atributua falta duelako. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/pipnss/nsserrors.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/pipnss/nsserrors.properties index e1458aa0f4b08ff20bee44883baec4e1ab3be9fc..c397ad1d2cfb130ff14d2796392eec2833659c28 100644 --- a/thunderbird-l10n/eu/chrome/eu/locale/eu/pipnss/nsserrors.properties +++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/pipnss/nsserrors.properties @@ -172,8 +172,8 @@ SEC_ERROR_EXPIRED_ISSUER_CERTIFICATE=Ziurtagiri jaukitzailearen ziurtagiria irau SEC_ERROR_CRL_EXPIRED=Ziurtagiri jaulkitzailearen CRLa iraungita dago. Egunera ezazu edo egiaztatu zure sistemaren data eta ordua. SEC_ERROR_CRL_BAD_SIGNATURE=Ziurtagiri jaulkitzailearen CRL-ak sinadura baliogabe bat du. SEC_ERROR_CRL_INVALID=CRL berriak formatu baliogabea du. -SEC_ERROR_EXTENSION_VALUE_INVALID=Ziurtagiri hedapena balioa baliogabea da. -SEC_ERROR_EXTENSION_NOT_FOUND=Ziurtagiri hedapena ez da aurkitu. +SEC_ERROR_EXTENSION_VALUE_INVALID=Ziurtagiri-hedapenaren balioa baliogabea da. +SEC_ERROR_EXTENSION_NOT_FOUND=Ez da ziurtagiri-hedapena aurkitu. SEC_ERROR_CA_CERT_INVALID=Jaulkitzaile ziurtagiria baliogabea da. SEC_ERROR_PATH_LEN_CONSTRAINT_INVALID=Ziurtagiri kokapen luzera murriztapena baliogabea da. SEC_ERROR_CERT_USAGES_INVALID=Ziurtagiri erabilera balioa baliogabea da. @@ -308,7 +308,7 @@ SEC_ERROR_LIBPKIX_INTERNAL=Libpkix barne-errorea gertatu da ziurtagiriaren balid SEC_ERROR_PKCS11_GENERAL_ERROR=PKCS #11 modulu batek CKR_GENERAL_ERROR itzuli du, errore berreskuraezina gertatu dela adieraziz. SEC_ERROR_PKCS11_FUNCTION_FAILED=PKCS #11 modulu batek CKR_FUNCTION_FAILED itzuli du, eskatutako funtzio bat ezin dela burutu adieraziz. Eragiketa berdina berriro saiatuz ondo burutu liteke. SEC_ERROR_PKCS11_DEVICE_ERROR=PKCS #11 modulu batek CKR_DEVICE_ERROR itzuli du, token-arekin edo slot-arekin arazo bat gertatu dela adieraziz. -SEC_ERROR_BAD_INFO_ACCESS_METHOD=Informazioa atzitzeko metodo ezezaguna ziurtagiriaren luzapenean. +SEC_ERROR_BAD_INFO_ACCESS_METHOD=Informazioa atzitzeko metodo ezezaguna ziurtagiri-hedapenean. SEC_ERROR_CRL_IMPORT_FAILED=Errorea CRL bat inportatzen saiatzean. SEC_ERROR_EXPIRED_PASSWORD=Pasahitza iraungi da. SEC_ERROR_LOCKED_PASSWORD=Pasahitza blokeatuta dago. diff --git a/thunderbird-l10n/eu/localization/eu/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/eu/localization/eu/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..c19b3b662f7b3857c9ab4d8283fcb227b7d8ffee --- /dev/null +++ b/thunderbird-l10n/eu/localization/eu/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Egutegi URI berbideraketa +calendar-uri-redirect-description = + Zerbitzaria "{ $calendarName }" egutegiaren URI berbideraketa egiten dabil. + Onartu berbideraketa eta hasi erabiltzen URI berria egutegi honentzat? +calendar-uri-redirect-original-uri-label = Uneko URIa: +calendar-uri-redirect-target-uri-label = URI berrira berbideratzen: diff --git a/thunderbird-l10n/eu/localization/eu/messenger/accountCentral.ftl b/thunderbird-l10n/eu/localization/eu/messenger/accountCentral.ftl index 3005631f6cdcdfc0c96da1f23b9bec60586a9d8f..c3a891fea754160a97f3c502521607a4d2640dd2 100644 --- a/thunderbird-l10n/eu/localization/eu/messenger/accountCentral.ftl +++ b/thunderbird-l10n/eu/localization/eu/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Ongi etorri { -brand-full-name }(e)ra +account-settings = Kontu-ezarpenak +# $accounts (Number) - the number of configured accounts setup-title = Aukeratu zer konfiguratu about-title = { -brand-full-name }(r)i buruz resources-title = Baliabideak @@ -22,8 +24,28 @@ filelink-label = Filelink filelink-description = { -brand-short-name } filelink hodeiko kontua konfiguratzen uzten dizu eranskin handiak modu errazean bidaltzeko. addressbook-label = Helbide-liburua .aria-label = Sortu Helbide-liburu berria +addressbook-description = { -brand-short-name } zure kontaktu guztiak helbide liburuan antolatzen dizkizu. Urrutiko helbide liburu batera ere konekta zintezke zure kontaktu guztiak sinkronizatuta mantentzeko. +feeds-label = Jarioak + .aria-label = Jarioetara konektatu +feeds-description = { -brand-short-name } RSS/Atom jarioetara konektatzen zaitu berriak eta inguru guztiko eguneratzeak jasotzeko. +newsgroups-label = Berri-taldeak + .aria-label = Berri-taldeetara konektatu +newsgroups-description = { -brand-short-name } nahi duzun berri-taldeetara konektatzen zaitu. +import-title = Inportatu beste programa batetik… +import-paragraph = { -brand-short-name } posta-mezuak, helbide-liburu sarrerak, jario harpidetzak, ezarpenak edota iragazkiak inportatzen dizu beste posta programa batetik eta ohiko helbide-liburu formatuetatik. +import-label = Inportatu + .aria-label = Inportatu datuak beste programa batzuetatik +about-paragraph = Thunderbird da kode irekiko posta eta egutegi bezero plataforma-anitz bakarra, dohakoa negoziorako nahiz erabilera pertsonalerako. Seguru mantendu eta are hobe bilaka dadin nahi dugu. Dohaintzak garatzaileak kontratatzea ahalbidetzen digu, azpiegiturak ordaindu eta hobetzen jarraitu. +about-paragraph-2 = <b>Thunderbird zu bezalako erabiltzaileek babestua dago! Thunderbird gogoko baduzu pentsa ezazu dohaintza bat egitean.</b>Thunderbird eskuragarri mantenduko dela ziurtatzea nahi izanez gero about-donation = egin dohaintza explore-link = Eginbideak esploratu support-link = Laguntza involved-link = Parte hartu developer-link = Garatzaileentzako dokumentazioa +read = Irakurri mezuak +compose = Idatzi mezu berria +search = Bilatu mezuak +filter = Kudeatu mezu-iragazkiak +nntp-subscription = Kudeatu berri-taldeetako harpidetzak +rss-subscription = Kudeatu jario harpidetzak +e2e = Muturretik muturrerako enkriptatzea diff --git a/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutAddons.ftl index 14b7397b7f18f62fe7ab72629f0674a02528026c..a62b9c3cfd5556ef43fa2f41f0897629716c95fa 100644 --- a/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Instalatu gehigarria fitxategitik… .accesskey = I help-button = Gehigarrien laguntza +sidebar-help-button-title = + .title = Gehigarrien laguntza preferences = { PLATFORM() -> [windows] { -brand-short-name } aukerak @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Tresnak gehigarri guztientzat +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } aukerak + *[other] { -brand-short-name } hobespenak + } show-unsigned-extensions-button = .label = Zenbait gehigarri ezin izan dira egiaztatu show-all-extensions-button = @@ -163,13 +171,29 @@ extensions-view-available-updates = .name = Eguneraketak eskura .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Gomendioak +addon-category-discover-title = + .title = Gomendioak addon-category-extension = Hedapenak +addon-category-extension-title = + .title = Hedapenak addon-category-theme = Itxurak +addon-category-theme-title = + .title = Itxurak addon-category-plugin = Pluginak +addon-category-plugin-title = + .title = Pluginak addon-category-dictionary = Hiztegiak +addon-category-dictionary-title = + .title = Hiztegiak addon-category-locale = Hizkuntzak +addon-category-locale-title = + .title = Hizkuntzak addon-category-available-updates = Eguneraketak eskura +addon-category-available-updates-title = + .title = Eguneraketak eskura addon-category-recent-updates = Azken eguneraketak +addon-category-recent-updates-title = + .title = Azken eguneraketak ## These are global warnings @@ -282,6 +306,7 @@ shortcuts-no-commands = Ondorengo hedapenek ez dute lasterbiderik: shortcuts-input = .placeholder = Idatzi lasterbidea shortcuts-browserAction = Gaitu hedapena +shortcuts-browserAction2 = Aktibatu tresna-barrako botoia shortcuts-pageAction = Gaitu orri-ekintza shortcuts-sidebarAction = Txandakatu alboko barra shortcuts-modifier-mac = Kontuan hartu Ktrl, Alt edo ⌘ @@ -307,6 +332,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Erakutsi gutxiago go-back-button = .tooltiptext = Joan atzera +header-back-button = + .title = Joan atzera ## Recommended add-ons page diff --git a/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutSupport.ftl index 225fb7ae36df2d53229017c9f992389e7af183f7..3ce51aeb47c90d17a1b7a7638d245a5a3b7f8a63 100644 --- a/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutSupport.ftl @@ -287,6 +287,11 @@ sandbox-proc-type-content = edukia sandbox-proc-type-file = fitxategiaren edukia sandbox-proc-type-media-plugin = multimedia plugina sandbox-proc-type-data-decoder = datu-deskodetzailea +startup-cache-title = Abioko cachea +startup-cache-disk-cache-path = Diskoko cachearen bide-izena +startup-cache-ignore-disk-cache = Ezikusi diskoko cachea +startup-cache-found-disk-cache-on-init = Diskoko cachea aurkitu da abioan +startup-cache-wrote-to-disk-cache = Diskoko cachera idatzita launcher-process-status-0 = Gaituta launcher-process-status-1 = Desgaituta hutsegitea dela-eta launcher-process-status-2 = Behartuta desgaituta @@ -310,6 +315,7 @@ touch-enabled = ukipen bidezko sarrera gaituta drag-enabled = korritze-barra arrastatzea gaituta keyboard-enabled = teklatua gaituta autoscroll-enabled = autoscroll gaituta +zooming-enabled = Atximur-zoom leuna gaituta ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/eu/localization/eu/toolkit/about/certviewer.ftl b/thunderbird-l10n/eu/localization/eu/toolkit/about/certviewer.ftl index ddfb0a624b200f7f0d1229a7b878001e2abe45f8..2ea8585ce90f07cf7bd4c1dc4d837fbbb322afe1 100644 --- a/thunderbird-l10n/eu/localization/eu/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/eu/localization/eu/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (ziurtagiria) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (katea) .download = { $fileName }-katea.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Hedapen hau kritiko gisa markatu da, hau da, bezeroek ziurtagiria ulertzen ez badute, baztertu egin behar dute. +certificate-viewer-export = Esportatu + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Zure ziurtagiriak +certificate-viewer-tab-people = Norbanakoak +certificate-viewer-tab-servers = Zerbitzariak +certificate-viewer-tab-ca = Autoritateak +certificate-viewer-tab-unkonwn = Ezezaguna diff --git a/thunderbird-l10n/eu/localization/eu/toolkit/global/processTypes.ftl b/thunderbird-l10n/eu/localization/eu/toolkit/global/processTypes.ftl index c34a3a90cd6d2d75c06b85c0f1c2667c64a78247..4cf0d62af98eacc67940f010c0a4cd1c293ec11f 100644 --- a/thunderbird-l10n/eu/localization/eu/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/eu/localization/eu/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Isolatutako web edukia # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socketa diff --git a/thunderbird-l10n/eu/localization/eu/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/eu/localization/eu/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..7b538622c61959fb4e0c589e3be63825b644d7c6 --- /dev/null +++ b/thunderbird-l10n/eu/localization/eu/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = { -brand-product-name }en bertsio zahar bat abiarazi duzu + .style = width: 490px; +profiledowngrade-window-create = + .label = Sortu profil berria +profiledowngrade-sync = { -brand-product-name }en bertsio zahar bat erabiliz gero, dagoeneko { -brand-product-name } profil batean gordetako laster-markak eta nabigazio-historia honda litezke. Zure informazioa babesteko, sortu profil berri bat { -brand-short-name }(r)en instalazio honetarako. Zure laster-markak eta nabigazio-historia profilen artean sinkronizatzeko, { -fxaccount-brand-name }(r)ekin saioa has dezakezu. +profiledowngrade-nosync = { -brand-product-name }en bertsio zahar bat erabiliz gero, dagoeneko { -brand-product-name } profil batean gordetako laster-markak eta nabigazio-historia honda litezke. Zure informazioa babesteko, sortu profil berri bat { -brand-short-name }(r)en instalazio honetarako. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Irten + *[other] Irten + } diff --git a/thunderbird-l10n/eu/manifest.json b/thunderbird-l10n/eu/manifest.json index bf3cf61205368ca82db84517d2aa6947f6941f34..3825f130f079445e466806200e45848167368afa 100644 --- a/thunderbird-l10n/eu/manifest.json +++ b/thunderbird-l10n/eu/manifest.json @@ -1,57 +1,57 @@ { - "author": "librezale.org (contributors: Librezale.eus)", - "applications": { - "gecko": { - "id": "langpack-eu@thunderbird.mozilla.org", - "strict_min_version": "76.0", - "strict_max_version": "76.*" - } - }, - "version": "76.0buildid20200407173003", - "sources": { - "browser": { - "base_path": "browser/" - } - }, "name": "Basque Language Pack", + "description": "Language pack for Thunderbird for eu", "languages": { "eu": { "chrome_resources": { - "necko": "chrome/eu/locale/eu/necko/", - "global": "chrome/eu/locale/eu/global/", - "communicator": "chrome/eu/locale/eu/communicator/", + "chat": "chrome/eu/locale/eu/chat/", "places": "chrome/eu/locale/eu/places/", - "mozapps": "chrome/eu/locale/eu/mozapps/", - "messenger-newsblog": "chrome/eu/locale/eu/messenger-newsblog/", - "devtools-shared": "chrome/eu/locale/eu/devtools/shared/", - "messenger-smime": "chrome/eu/locale/eu/messenger-smime/", + "alerts": "chrome/eu/locale/eu/alerts/", + "global": "chrome/eu/locale/eu/global/", + "global-platform": { + "win": "chrome/eu/locale/eu/global-platform/win/", + "android": "chrome/eu/locale/eu/global-platform/unix/", + "linux": "chrome/eu/locale/eu/global-platform/unix/", + "macosx": "chrome/eu/locale/eu/global-platform/mac/" + }, + "mozldap": "chrome/eu/locale/eu/mozldap/", + "autoconfig": "chrome/eu/locale/eu/autoconfig/", + "messenger-mapi": "chrome/eu/locale/eu/messenger-mapi/", + "necko": "chrome/eu/locale/eu/necko/", "lightning": "chrome/eu/locale/eu/lightning/", - "pipnss": "chrome/eu/locale/eu/pipnss/", + "calendar": "chrome/eu/locale/eu/calendar/", + "devtools-shared": "chrome/eu/locale/eu/devtools/shared/", + "communicator": "chrome/eu/locale/eu/communicator/", "messenger": "chrome/eu/locale/eu/messenger/", "pluginproblem": "chrome/eu/locale/eu/pluginproblem/", + "branding": "chrome/eu/locale/eu/branding/", "pippki": "chrome/eu/locale/eu/pippki/", - "calendar": "chrome/eu/locale/eu/calendar/", + "messenger-smime": "chrome/eu/locale/eu/messenger-smime/", + "passwordmgr": "chrome/eu/locale/eu/passwordmgr/", "devtools-startup": "chrome/eu/locale/eu/devtools/startup/", "devtools": "chrome/eu/locale/eu/devtools/client/", - "passwordmgr": "chrome/eu/locale/eu/passwordmgr/", - "mozldap": "chrome/eu/locale/eu/mozldap/", - "global-platform": { - "linux": "chrome/eu/locale/eu/global-platform/unix/", - "macosx": "chrome/eu/locale/eu/global-platform/mac/", - "android": "chrome/eu/locale/eu/global-platform/unix/", - "win": "chrome/eu/locale/eu/global-platform/win/" - }, - "messenger-mapi": "chrome/eu/locale/eu/messenger-mapi/", - "alerts": "chrome/eu/locale/eu/alerts/", - "chat": "chrome/eu/locale/eu/chat/", - "autoconfig": "chrome/eu/locale/eu/autoconfig/", - "branding": "chrome/eu/locale/eu/branding/", - "messenger-region": "chrome/eu/locale/eu/messenger-region/" + "pipnss": "chrome/eu/locale/eu/pipnss/", + "messenger-region": "chrome/eu/locale/eu/messenger-region/", + "mozapps": "chrome/eu/locale/eu/mozapps/", + "messenger-newsblog": "chrome/eu/locale/eu/messenger-newsblog/" }, - "version": "20200403092412" + "version": "20200420093436" + } + }, + "author": "librezale.org (contributors: Librezale.eus)", + "version": "76.0buildid20200420212409", + "applications": { + "gecko": { + "strict_max_version": "76.*", + "strict_min_version": "76.0", + "id": "langpack-eu@thunderbird.mozilla.org" } }, "manifest_version": 2, - "langpack_id": "eu", - "description": "Language pack for Thunderbird for eu" + "sources": { + "browser": { + "base_path": "browser/" + } + }, + "langpack_id": "eu" } diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/devtools/client/inspector.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/devtools/client/inspector.properties index 70eeba051861feefe41fd90f4cb65ad5590c86e9..078774570858fefab633532d1813acffa1d8d3a8 100644 --- a/thunderbird-l10n/fi/chrome/fi/locale/fi/devtools/client/inspector.properties +++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=This element has scrollable overflow. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=No associated rule +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Hold Shift and click to jump to rule + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/global-platform/mac/accessible.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/global-platform/mac/accessible.properties index 0ba49ff19b9220f60a12c4bb87c4928826f5e5f3..f1d7417321abdfe39447afba908e03b654cb12bf 100644 --- a/thunderbird-l10n/fi/chrome/fi/locale/fi/global-platform/mac/accessible.properties +++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/global-platform/mac/accessible.properties @@ -58,8 +58,7 @@ separator = erotin tabPanel = välilehtipaneeli # The roleDescription for the html:mark element highlight = korostus - # The roleDescription for the details element -details = details +details = lisätiedot # The roleDescription for the summary element -summary = summary +summary = yhteenveto diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/global/css.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/global/css.properties index d0f43c58f628b55d7bcf65dba5c72e21e9e76338..0371d57df1078a4a626d456b380e7da306dd2691 100644 --- a/thunderbird-l10n/fi/chrome/fi/locale/fi/global/css.properties +++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=The stylesheet %1$S was loaded as CSS even though its MIME type, PEUnexpEOF2=Unexpected end of file while searching for %1$S. PEParseRuleWSOnly=Whitespace-only string given to be parsed as rule. + PEDeclDropped=Declaration dropped. PEDeclSkipped=Skipped to next declaration. PEUnknownProperty=Unknown property '%1$S'. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Only one repeat(auto-fill, …) is all PEMoreThanOneGridRepeatAutoFillFitInTrackList=Only one repeat(auto-fill, …) or repeat(auto-fit, …) is allowed in a track list. PEMoreThanOneGridRepeatTrackSize=Only one track size is allowed inside repeat(auto-fit/auto-fill, …). +PEDisallowedImportRule=@import rules are not yet valid in constructed stylesheets. + TooLargeDashedRadius=Border radius is too large for ‘dashed’ style (the limit is 100000px). Rendering as solid. TooLargeDottedRadius=Border radius is too large for ‘dotted’ style (the limit is 100000px). Rendering as solid. diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/global/dom/dom.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/global/dom/dom.properties index a7f7e93a17eea6471633b1ecdcbe85212663062a..6b4b9ea79088d9a3bf68a4b6a39dcb29f6ea7369 100644 --- a/thunderbird-l10n/fi/chrome/fi/locale/fi/global/dom/dom.properties +++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/global/dom/dom.properties @@ -424,6 +424,5 @@ MathML_DeprecatedStyleAttributeWarning=MathML attributes “background”, “co MathML_DeprecatedXLinkAttributeWarning=XLink attributes “href”, “type”, “show” and “actuate” are deprecated on MathML elements and will be removed at a future date. WebShareAPI_Failed=Jakamisoperaatio on epäonnistunut. WebShareAPI_Aborted=Jakamisoperaatio keskeytettiin. - # LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL. -UnknownProtocolNavigationPrevented=Prevented navigation to “%1$S” due to an unknown protocol. +UnknownProtocolNavigationPrevented=Estettiin siirtyminen osoitteeseen “%1$S” tuntemattoman protokollan takia. diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/global/layout_errors.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/global/layout_errors.properties index 3619fb2d0d744f3982d347963fd43409a827d932..99a7c60afbadc19459915962d14308a5a44a6a46 100644 --- a/thunderbird-l10n/fi/chrome/fi/locale/fi/global/layout_errors.properties +++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/global/layout_errors.properties @@ -39,7 +39,6 @@ CompositorAnimationWarningTransformFrameInactive=Animation cannot be run on the CompositorAnimationWarningTransformIsBlockedByImportantRules=Transform animation cannot be run on the compositor because transform-related properties are overridden by !important rules CompositorAnimationWarningOpacityFrameInactive=Animation cannot be run on the compositor because the frame was not marked active for ‘opacity’ animation CompositorAnimationWarningHasRenderingObserver=Animation cannot be run on the compositor because the element has rendering observers (-moz-element or SVG clipping/masking) - CompositorAnimationWarningHasCurrentColor=Animations of ‘background-color’ cannot be run on the compositor with ‘current-color’ keyframe. ## LOCALIZATION NOTE: Do not translate zoom, calc(), "transform", "transform-origin: 0 0" diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/global/security/security.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/global/security/security.properties index ba8cdd3338aa92ebd219ca1e9930fe3410b4c26d..21d667d95ac9cccf8f40073736a6dd7f8780cd16 100644 --- a/thunderbird-l10n/fi/chrome/fi/locale/fi/global/security/security.properties +++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Load denied by X-Frame-Options: “%1$S” from “%2$S”, site does # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Load denied by X-Frame-Options: “%1$S” from “%2$S”, site does not permit cross-origin framing from “%3$S”. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Invalid X-Frame-Options header was found when loading “%2$S”: “%1$S” is not a valid directive. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=The loading of “%2$S” in a frame is denied by “X-Frame-Options“ directive set to “%1$S“. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Päivitetään suojaamaton pyyntö “%1$S” käyttämään skeemaa “%2$S”. diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/addons.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/addons.properties index a862b4d6373a4242ccb6931674875dc8e0d10c7d..a5b77c56e22d022a22d3ea45152ccb5b96f8abf4 100644 --- a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/addons.properties +++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/addons.properties @@ -126,6 +126,8 @@ addonInstallErrorBlocklisted=Lisäosaa %S ei voitu asentaa, koska sen on raporto # Note, this string will be used as raw markup. Avoid characters like <, >, & webextPerms.header=Lisätäänkö %S? +# %S is brandShortName +webextPerms.experimentWarning=Haitalliset lisäosat voivat varastaa yksityisiä tietojasi tai vaarantaa tietokoneesi. Asenna tämä lisäosa vain, jos luotat lähteeseen. webextPerms.unsignedWarning=Varoitus: Tämä lisäosa on varmentamaton. Haitalliset lisäosat voivat varastaa yksityisiä tietoja tai vaarantaa tietokoneesi turvallisuuden. Asenna tämä lisäosa vain, jos luotat lähteeseen. # LOCALIZATION NOTE (webextPerms.listIntro) @@ -194,6 +196,9 @@ webextPerms.description.devtools=Laajenna kehitystyökaluja käyttämään avoim webextPerms.description.dns=Käytä IP-osoite- ja palvelinnimitietoja webextPerms.description.downloads=Lataa tiedostoja sekä lue ja muokkaa selaimen lataushistoriaa webextPerms.description.downloads.open=Avaa tietokoneellesi ladattuja tiedostoja +# LOCALIZATION NOTE (webextPerms.description.experiment) +# %S will be replaced with the name of the application +webextPerms.description.experiment=Hanki täydellinen ja rajoittamattoman pääy %Siin ja tietokoneellesi webextPerms.description.find=Lue kaikkien avointen välilehtien tekstiä webextPerms.description.geolocation=Käytä sijaintiasi webextPerms.description.history=Käytä selaushistoriaa @@ -258,9 +263,3 @@ webext.remove.confirmation.title=Poista %S # %2$S is brandShorterName webext.remove.confirmation.message=Poistetaanko %1$S %2$Sistä? webext.remove.confirmation.button=Poista - -# %S is brandShortName -webextPerms.experimentWarning=Malicious add-ons can steal your private information or compromise your computer. Only install this add-on if you trust the source. -# LOCALIZATION NOTE (webextPerms.description.experiment) -# %S will be replaced with the name of the application -webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/customizeToolbar.dtd b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/customizeToolbar.dtd index 41f7cf68a3e2eb6c4b3026ec4c65d362779906ae..0aa5c7ab89a0cdaaf0d21c6bdf1186d55e052b75 100644 --- a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/customizeToolbar.dtd +++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/customizeToolbar.dtd @@ -16,7 +16,6 @@ <!ENTITY showTitlebar.label "Näytä otsikkopalkki"> <!ENTITY extraDragSpace.label "Lisää tyhjää tilaa vetämistä varten"> <!ENTITY showTitlebar2.label "Otsikkopalkki"> +<!ENTITY extraDragSpace2.label "Lisää tyhjää tilaa"> <!ENTITY saveChanges.label "Valmis"> <!ENTITY undoChanges.label "Peruuta muutokset"> - -<!ENTITY extraDragSpace2.label "Drag Space"> diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/imapMsgs.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/imapMsgs.properties index b1dbdd580096dfbbbeda1f3997a6f6b5a235574a..0fb95291769ee6b813e9e0b4725beb92afb55d0e 100644 --- a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/imapMsgs.properties +++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/imapMsgs.properties @@ -201,12 +201,22 @@ imapServerDroppedConnection=IMAP-palvelimeen ei saatu yhteyttä. Olet saattanut palvelimelle. Tällaisessa tapauksessa vähennä välimuistissa olevien yhteyksien määrää \ IMAP-palvelimen Lisäasetukset-ikkunasta. +# This will occur when a folder that has never been imap selected or opened +# (left-clicked) is first right-clicked to access quota properties. imapQuotaStatusFolderNotOpen=Kiintiötietoa ei ole saatavilla, koska kansio ei ole auki. +# The imap capability response reports that QUOTA is not supported. imapQuotaStatusNotSupported=Tämä palvelin ei tue kiintiöitä. imapQuotaStatusNoQuota=Tällä kansiolla ei ole tilakiintiötä. +# The getqutaroot command succeeded but reported no quota information. +imapQuotaStatusNoQuota2=Tällä kansiolla ei ole kiintiötietoja. + +# Folder properties were requested by the user (right-click) before the getquotaroot +# command was sent. +imapQuotaStatusInProgress=Kiintiötietoja ei ole vielä saatavilla. + # Out of memory imapOutOfMemory=Sovellukselle ei ole tarpeeksi muistia. @@ -258,9 +268,3 @@ imapFolderCommandFailed=Operaatio kansiolle "%2$S" ei onnistunut. Tilin %1$S pos # Place the word %1$S in your translation where the name of the account should appear. # Place the word %2$S in your translation where the alert from the server should appear. imapServerAlert=Hälytys tilille %1$S: %2$S - -# The getqutaroot command succeeded but reported no quota information. -imapQuotaStatusNoQuota2=This folder reports no quota information. -# Folder properties were requested by the user (right-click) before the getquotaroot -# command was sent. -imapQuotaStatusInProgress=Quota information not yet available. diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/messenger.dtd b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/messenger.dtd index dbc62b7f7ebd3755f8f2bc2fd45a62095839fbb1..abd959ca4f3fa09c1a341f46ccce31d4e503a515 100644 --- a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/messenger.dtd +++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Etsi viesteistä…"> <!ENTITY searchMailCmd.accesskey "v"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Globaali haku…"> +<!ENTITY glodaSearchCmd.accesskey "G"> <!ENTITY searchAddressesCmd.label "Etsi osoitekirjasta…"> <!ENTITY searchAddressesCmd.accesskey "o"> diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/messenger.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/messenger.properties index 3917cae9a23e8dd528206bd1467d62dd6ef8600a..e025e641c04685ee89a5fed206b5e103fb1dff2f 100644 --- a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/messenger.properties +++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/messenger.properties @@ -317,6 +317,7 @@ levytilan käyttöasetukset, jotta suurikokoisia viestejä ei ladata. # accountCentral mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xul + # LOCALIZATION NOTE(acctCentralTitleFormat): %1$S is brand, %2$S is account type, %3$S is account name acctCentralTitleFormat=%1$S %2$S - %3$S mailAcctType=Sähköposti @@ -464,11 +465,15 @@ macBiffNotification_separator=,\u0020 # For the Quota tab in the mail folder properties dialog quotaUsedFree=%S / %S kt käytössä + +# For the Quota tab in the mail folder properties dialog quotaPercentUsed=%S %% täynnä # for quota in main window (commandglue.js) percent=%S %% quotaTooltip=IMAP-kiintiö: %S kt käytetty %S kt:sta. Lue tiedot napsauttamalla. +quotaTooltip2=IMAP-kiintiö: %S/%S käytetty. Lue lisätietoja napsauttamalla. + # for message views confirmViewDeleteTitle=Vahvista confirmViewDeleteMessage=Poistetaanko tämä näkymä? @@ -804,5 +809,3 @@ errorConsoleTitle = Virhekonsoli # This is used by screen readers to label the "back" button in various browser # popup panels, including the sliding subviews of the appmenu. panel.back = Takaisin - -quotaTooltip2=IMAP quota: %S used of %S total. Click for details. diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/pgpmime.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/pgpmime.properties index c8cb91d50d734dce11d21e0af7cba1be17075ea0..5d7c04e2c76d3f6cab30d43c6b24905401ccaf68 100644 --- a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/pgpmime.properties +++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=Tämä on salakirjoitettu OpenPGP-viesti.<br>Jotta voit purkaa ja lukea viestin, asenna <a href="%S">OpenPGP-lisäosa</a>. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Tämä on salattu OpenPGP-viesti, mutta tukea OpenPGP-salauksen purkamiselle ei ole saatavana. diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/preferences/general.dtd b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/preferences/general.dtd index 484c6daa35a7377cdd171630c1672da33e54539c..125fc06b10d14f4bd7c1f42936a22dab91218f44 100644 --- a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/preferences/general.dtd +++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/preferences/general.dtd @@ -43,5 +43,5 @@ <!ENTITY removeSearchEngine.label "Poista"> <!ENTITY removeSearchEngine.accesskey "p"> -<!ENTITY minimizeToTray.label "When &brandShortName; is minimized, move it to the tray"> -<!ENTITY minimizeToTray.accesskey "m"> +<!ENTITY minimizeToTray.label "Kun &brandShortName; on pienennetty, piilota se"> +<!ENTITY minimizeToTray.accesskey "p"> diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/necko/necko.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/necko/necko.properties index be2492c9cf841e0150565c5f7192441d518775ea..39f24918179f255bdaa770a6e9236f12058177d6 100644 --- a/thunderbird-l10n/fi/chrome/fi/locale/fi/necko/necko.properties +++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Tallennustilan käyttöoikeus myönne # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Tallennustilan käyttöoikeus myönnettiin automaattisesti seuraimelle ”%2$S” osoitteesta ”%1$S”. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Storage access automatically granted for First-Party isolation “%2$S” on “%1$S”. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Cookie “%1$S” rejected because it has the “sameSite=none” attribute but is missing the “secure” attribute. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/fi/localization/fi/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/fi/localization/fi/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..6721c8bb7d445dae61dd77cbdfcc85cd556bfa23 --- /dev/null +++ b/thunderbird-l10n/fi/localization/fi/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,8 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Kalenterin URI-uudelleenohjaus +calendar-uri-redirect-original-uri-label = Nykyinen URI: +calendar-uri-redirect-target-uri-label = Uudelleenohjattu uusi URI: diff --git a/thunderbird-l10n/fi/localization/fi/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/fi/localization/fi/devtools/client/aboutdebugging.ftl index 3192b1bfde5599c6087c705dbf2c7a7d1f6465bf..b1291bf3acdc125389429ad960df5e9171b14d5a 100644 --- a/thunderbird-l10n/fi/localization/fi/devtools/client/aboutdebugging.ftl +++ b/thunderbird-l10n/fi/localization/fi/devtools/client/aboutdebugging.ftl @@ -186,6 +186,9 @@ about-debugging-browser-version-too-old = The connected browser has an old versi # backward compatible changes broke the debugger in those scenarios (Bug 1528219). # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1") about-debugging-browser-version-too-old-67-debugger = The Debugger panel may not work with the connected browser. Please use Firefox { $runtimeVersion } if you need to use the Debugger with this browser. +# Dedicated message for a backward compatibility issue that occurs when connecting: +# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68. +about-debugging-browser-version-too-old-fennec = This version of Firefox cannot debug Firefox for Android (68). We recommend installing Firefox for Android Nightly on your phone for testing. <a>More details</a> # This string is displayed in the runtime page if the remote browser version is too recent. # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd) diff --git a/thunderbird-l10n/fi/localization/fi/messenger/accountCentral.ftl b/thunderbird-l10n/fi/localization/fi/messenger/accountCentral.ftl index c5a8e4e34046dc260bc9d8b17b03bda24e59c8e4..e7a98705f2c66451684e1938cc571ccc62d4eca8 100644 --- a/thunderbird-l10n/fi/localization/fi/messenger/accountCentral.ftl +++ b/thunderbird-l10n/fi/localization/fi/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Tervetuloa { -brand-full-name }iin +account-settings = Tilin asetukset +# $accounts (Number) - the number of configured accounts setup-title = Valitse mitä asennetaan about-title = Tietoja { -brand-full-name }ista resources-title = Resurssit @@ -40,3 +42,10 @@ explore-link = Tutustu ominaisuuksiin support-link = Tuki involved-link = Tule mukaan developer-link = Kehittäjien dokumentaatio +read = Lue viestejä +compose = Kirjoita uusi viesti +search = Hae viestejä +filter = Hallitse viestisuodattimia +nntp-subscription = Hallitse keskusteluryhmien tilauksia +rss-subscription = Hallitse syötetilauksia +e2e = Päästä päähän -salaus diff --git a/thunderbird-l10n/fi/localization/fi/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/fi/localization/fi/toolkit/about/aboutAddons.ftl index b896bb86357035b93e6c279d549b90e11d9a2e53..bdbc031639733bddb2d4f54fa60b9227b6018a66 100644 --- a/thunderbird-l10n/fi/localization/fi/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/fi/localization/fi/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Asenna lisäosa tiedostosta… .accesskey = A help-button = Lisäosien tuki +sidebar-help-button-title = + .title = Lisäosien tuki preferences = { PLATFORM() -> [windows] { -brand-short-name }-asetukset @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Työkaluja kaikille lisäosille +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name }-asetukset + *[other] { -brand-short-name }-asetukset + } show-unsigned-extensions-button = .label = Joitain laajennuksia ei voitu varmentaa show-all-extensions-button = @@ -168,13 +176,29 @@ extensions-view-available-updates = .name = Päivitykset .tooltiptext = Saatavilla olevat päivitykset addon-category-discover = Suositukset +addon-category-discover-title = + .title = Suositukset addon-category-extension = Laajennukset +addon-category-extension-title = + .title = Laajennukset addon-category-theme = Teemat +addon-category-theme-title = + .title = Teemat addon-category-plugin = Liitännäiset +addon-category-plugin-title = + .title = Liitännäiset addon-category-dictionary = Oikoluvut +addon-category-dictionary-title = + .title = Oikoluvut addon-category-locale = Kielet +addon-category-locale-title = + .title = Kielet addon-category-available-updates = Päivitykset +addon-category-available-updates-title = + .title = Päivitykset addon-category-recent-updates = Tuoreet päivitykset +addon-category-recent-updates-title = + .title = Tuoreet päivitykset ## These are global warnings @@ -287,6 +311,7 @@ shortcuts-no-commands = Seuraavilla laajennuksilla ei ole pikanäppäimiä: shortcuts-input = .placeholder = Kirjoita näppäinyhdistelmä shortcuts-browserAction = Aktivoi laajennus +shortcuts-browserAction2 = Aktivoi työkalupalkin painike shortcuts-pageAction = Aktivoi sivutoiminto shortcuts-sidebarAction = Näytä/piilota sivupaneeli shortcuts-modifier-mac = Paina Ctrl-, Alt- tai ⌘-näppäintä @@ -312,6 +337,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Näytä vähemmän go-back-button = .tooltiptext = Takaisin +header-back-button = + .title = Takaisin ## Recommended add-ons page diff --git a/thunderbird-l10n/fi/localization/fi/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/fi/localization/fi/toolkit/about/aboutSupport.ftl index 95e7a8e173a6b5a0db2f5416270665a219abd8fe..2cef092e9dfcb8612adc455342ceb5db13070542 100644 --- a/thunderbird-l10n/fi/localization/fi/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/fi/localization/fi/toolkit/about/aboutSupport.ftl @@ -286,6 +286,11 @@ sandbox-proc-type-content = sisältö sandbox-proc-type-file = tiedostojen sisältö sandbox-proc-type-media-plugin = medialiitännäinen sandbox-proc-type-data-decoder = datan purkaja +startup-cache-title = Käynnistyksen välimuisti +startup-cache-disk-cache-path = Levyvälimuistin polku +startup-cache-ignore-disk-cache = Ohita levyvälimuisti +startup-cache-found-disk-cache-on-init = Levyvälimuisti löytyi alustuksessa +startup-cache-wrote-to-disk-cache = Kirjoitettiin levyvälimuistiin launcher-process-status-0 = Käytössä launcher-process-status-1 = Ei käytössä johtuen viasta launcher-process-status-2 = Poistettu käytöstä pakottaen @@ -309,6 +314,7 @@ touch-enabled = kosketusliittymä käytössä drag-enabled = vierityspalkin vastus käytössä keyboard-enabled = näppäimistö käytössä autoscroll-enabled = automaattivieritys käytössä +zooming-enabled = portaaton nipistyszoomaus käytössä ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/fi/localization/fi/toolkit/about/certviewer.ftl b/thunderbird-l10n/fi/localization/fi/toolkit/about/certviewer.ftl index 3263402974233ead8883817bddd6ae211a2b8d99..63d676db1b5bece14f76657f0a61352fc15d8159 100644 --- a/thunderbird-l10n/fi/localization/fi/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/fi/localization/fi/toolkit/about/certviewer.ftl @@ -29,6 +29,8 @@ certificate-viewer-id = Tunniste certificate-viewer-key-exchange-group = Avainvaihtoryhmä certificate-viewer-key-id = Avaimen tunniste certificate-viewer-key-size = Avaimen koko +# Inc. means Incorporated, e.g GitHub is incorporated in Delaware +certificate-viewer-inc-locality = Perustuspaikka certificate-viewer-locality = Sijainti certificate-viewer-location = Sijainti certificate-viewer-logid = Lokin tunnus @@ -95,3 +97,16 @@ certificate-viewer-download-pem = PEM (varmenne) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (varmenneketju) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Tämä laajennus on merkitty kriittiseksi; se tarkoittaa, että asiakasohjelmien on hylättävä varmenne, jos ne eivät ymmärrä sitä. +certificate-viewer-export = Vie + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Omat varmenteet +certificate-viewer-tab-people = Ihmiset +certificate-viewer-tab-servers = Palvelimet +certificate-viewer-tab-ca = Varmentajat +certificate-viewer-tab-unkonwn = Tuntematon diff --git a/thunderbird-l10n/fi/localization/fi/toolkit/global/processTypes.ftl b/thunderbird-l10n/fi/localization/fi/toolkit/global/processTypes.ftl index 932dba60edb05421fe58ac9ae3d3ba15e83283fe..ce07cdd24740b934e8924d9536273d5f69f55466 100644 --- a/thunderbird-l10n/fi/localization/fi/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/fi/localization/fi/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Eristetty verkkosisältö # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Pistoke diff --git a/thunderbird-l10n/fi/localization/fi/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/fi/localization/fi/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..e753a3a8ae6ef820a3bac5d6b9cf4290776af2af --- /dev/null +++ b/thunderbird-l10n/fi/localization/fi/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Olet käynnistänyt vanhan { -brand-product-name }-version + .style = width: 490px; +profiledowngrade-window-create = + .label = Luo uusi profiili +profiledowngrade-sync = Vanhan { -brand-product-name }-version käyttäminen voi vioittaa nykyiseen { -brand-product-name }-profiiliin tallennetut kirjanmerkit ja selaushistorian. Suojellaksesi tietojasi, luo uusi profiili tätä { -brand-short-name }-asennusta varten. Voit aina kirjautua sisään { -fxaccount-brand-name }llä ja synkronoida kirjanmerkit sekä selaushistorian profiilien välillä. +profiledowngrade-nosync = Vanhan { -brand-product-name }-version käyttäminen voi vioittaa nykyiseen { -brand-product-name }-profiiliin tallennetut kirjanmerkit ja selaushistorian. Suojellaksesi tietojasi, luo uusi profiili tätä { -brand-short-name }-asennusta varten. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Sulje + *[other] Sulje + } diff --git a/thunderbird-l10n/fi/manifest.json b/thunderbird-l10n/fi/manifest.json index 77a16954e5eb92af521f4d25a54166a5f86720b1..9fc4fe9124bdb32b3e55d22f7cbdab1ef531f879 100644 --- a/thunderbird-l10n/fi/manifest.json +++ b/thunderbird-l10n/fi/manifest.json @@ -1,57 +1,57 @@ { "author": "mozilla org suomennosprojekti: (contributors: Lasse Liehu, Jarmo Juslin, Ville Pohjanheimo)", - "manifest_version": 2, - "name": "Finnish Language Pack", "sources": { "browser": { "base_path": "browser/" } }, - "version": "76.0buildid20200407173003", - "applications": { - "gecko": { - "strict_max_version": "76.*", - "strict_min_version": "76.0", - "id": "langpack-fi@thunderbird.mozilla.org" - } - }, "languages": { "fi": { "chrome_resources": { - "necko": "chrome/fi/locale/fi/necko/", - "messenger-smime": "chrome/fi/locale/fi/messenger-smime/", + "alerts": "chrome/fi/locale/fi/alerts/", + "devtools-shared": "chrome/fi/locale/fi/devtools/shared/", + "messenger-region": "chrome/fi/locale/fi/messenger-region/", + "messenger-mapi": "chrome/fi/locale/fi/messenger-mapi/", + "lightning": "chrome/fi/locale/fi/lightning/", + "messenger": "chrome/fi/locale/fi/messenger/", "global-platform": { - "linux": "chrome/fi/locale/fi/global-platform/unix/", - "macosx": "chrome/fi/locale/fi/global-platform/mac/", "android": "chrome/fi/locale/fi/global-platform/unix/", - "win": "chrome/fi/locale/fi/global-platform/win/" + "win": "chrome/fi/locale/fi/global-platform/win/", + "macosx": "chrome/fi/locale/fi/global-platform/mac/", + "linux": "chrome/fi/locale/fi/global-platform/unix/" }, - "lightning": "chrome/fi/locale/fi/lightning/", - "messenger-newsblog": "chrome/fi/locale/fi/messenger-newsblog/", - "messenger-region": "chrome/fi/locale/fi/messenger-region/", - "global": "chrome/fi/locale/fi/global/", + "autoconfig": "chrome/fi/locale/fi/autoconfig/", "passwordmgr": "chrome/fi/locale/fi/passwordmgr/", - "alerts": "chrome/fi/locale/fi/alerts/", "communicator": "chrome/fi/locale/fi/communicator/", - "mozldap": "chrome/fi/locale/fi/mozldap/", - "devtools": "chrome/fi/locale/fi/devtools/client/", - "mozapps": "chrome/fi/locale/fi/mozapps/", - "branding": "chrome/fi/locale/fi/branding/", - "messenger": "chrome/fi/locale/fi/messenger/", - "messenger-mapi": "chrome/fi/locale/fi/messenger-mapi/", "pipnss": "chrome/fi/locale/fi/pipnss/", - "pippki": "chrome/fi/locale/fi/pippki/", - "calendar": "chrome/fi/locale/fi/calendar/", - "autoconfig": "chrome/fi/locale/fi/autoconfig/", + "chat": "chrome/fi/locale/fi/chat/", + "messenger-smime": "chrome/fi/locale/fi/messenger-smime/", + "messenger-newsblog": "chrome/fi/locale/fi/messenger-newsblog/", + "devtools": "chrome/fi/locale/fi/devtools/client/", "pluginproblem": "chrome/fi/locale/fi/pluginproblem/", + "pippki": "chrome/fi/locale/fi/pippki/", + "necko": "chrome/fi/locale/fi/necko/", + "global": "chrome/fi/locale/fi/global/", "places": "chrome/fi/locale/fi/places/", - "devtools-shared": "chrome/fi/locale/fi/devtools/shared/", - "chat": "chrome/fi/locale/fi/chat/", + "branding": "chrome/fi/locale/fi/branding/", + "calendar": "chrome/fi/locale/fi/calendar/", + "mozldap": "chrome/fi/locale/fi/mozldap/", + "mozapps": "chrome/fi/locale/fi/mozapps/", "devtools-startup": "chrome/fi/locale/fi/devtools/startup/" }, - "version": "20200406181545" + "version": "20200420131456" } }, + "manifest_version": 2, + "version": "76.0buildid20200420212409", "langpack_id": "fi", - "description": "Language pack for Thunderbird for fi" + "applications": { + "gecko": { + "strict_max_version": "76.*", + "id": "langpack-fi@thunderbird.mozilla.org", + "strict_min_version": "76.0" + } + }, + "description": "Language pack for Thunderbird for fi", + "name": "Finnish Language Pack" } diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/calendar/preferences/general.dtd b/thunderbird-l10n/fr/chrome/fr/locale/fr/calendar/preferences/general.dtd index 467a8a4f561d7d6883af1f343be1ee93c6945792..aeb4a14935fd4fa5f767d7a2f36dc89881c66f1b 100644 --- a/thunderbird-l10n/fr/chrome/fr/locale/fr/calendar/preferences/general.dtd +++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/calendar/preferences/general.dtd @@ -16,7 +16,7 @@ <!ENTITY pref.timezones.caption "Fuseau horaire"> <!ENTITY pref.timezones.label "Choisissez la ville la plus proche dans votre fuseau horaire :"> -<!ENTITY pref.timezones.accesskey "C"> +<!ENTITY pref.timezones.accesskey "u"> <!ENTITY pref.defaults.label "Valeurs par défaut pour les nouveaux éléments"> <!ENTITY pref.events.label "Évènements"> diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/debugger.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/debugger.properties index 5b61cb42a5b5dd8da364a3eb7197dd6d55caabea..c3be72f0f486d36b1e9375342425d8222661073c 100644 --- a/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/debugger.properties +++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/debugger.properties @@ -55,6 +55,41 @@ setDirectoryRoot.accesskey=r removeDirectoryRoot.label=Supprimer le répertoire racine removeDirectoryRoot.accesskey=p +# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item +blackBoxAll.label=Boîte noire + +# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected group +blackBoxAllInGroup.label=Placer les fichiers de ce groupe dans une boîte noire + +# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected group +unblackBoxAllInGroup.label=Débloquer les fichiers dans ce groupe + +# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected group +blackBoxAllOutsideGroup.label=Placer les fichiers hors de ce groupe dans une boîte noire + +# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to unblackbox all files outside of the selected group +unblackBoxAllOutsideGroup.label=Débloquer les fichiers hors de ce groupe + +# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected directory +blackBoxAllInDir.label=Placer les fichiers de ce répertoire dans une boîte noire + +# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected directory +unblackBoxAllInDir.label=Débloquer les fichiers de ce répertoire + +# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected directory +blackBoxAllOutsideDir.label=Placer les fichiers hors de ce répertoire dans une boîte noire + +# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the +# context submenu to unblackbox all files outside of the selected directory +unblackBoxAllOutsideDir.label=Débloquer les fichiers hors de ce répertoire + # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the # context menu to copy the function the user selected copyFunction.label=Copier la fonction @@ -1054,11 +1089,6 @@ whyPaused.mutationBreakpointRemoved=Supprimé : # a JS execution whyPaused.interrupted=Mis en pause durant l’exécution -# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed -# in a info block explaining how the debugger is currently paused in a -# recording. -whyPaused.replayForcedPause=Mis en pause durant l’enregistrement - # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed # in a info block explaining how the debugger is currently paused while stepping # in or out of the stack @@ -1287,30 +1317,3 @@ serviceWorkerInfo.redundant=redondant # LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a # service worker that is in an unknown state. serviceWorkerInfo.unknown=inconnu - -# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item -blackBoxAll.label=Blackbox -# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the -# context submenu to blackbox all files inside of the selected group -blackBoxAllInGroup.label=Blackbox files in this group -# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the -# context submenu to unblackbox all files inside of the selected group -unblackBoxAllInGroup.label=Unblackbox files in this group -# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the -# context submenu to blackbox all files outside of the selected group -blackBoxAllOutsideGroup.label=Blackbox files outside this group -# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the -# context submenu to unblackbox all files outside of the selected group -unblackBoxAllOutsideGroup.label=Unblackbox files outside this group -# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the -# context submenu to blackbox all files inside of the selected directory -blackBoxAllInDir.label=Blackbox files in this directory -# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the -# context submenu to unblackbox all files inside of the selected directory -unblackBoxAllInDir.label=Unblackbox files in this directory -# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the -# context submenu to blackbox all files outside of the selected directory -blackBoxAllOutsideDir.label=Blackbox files outside this directory -# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the -# context submenu to unblackbox all files outside of the selected directory -unblackBoxAllOutsideDir.label=Unblackbox files outside this directory diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/inspector.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/inspector.properties index 7fe2f8bd4b9453b9e2be5ce145e3be5d512ed57e..5fcac4e0b40f1ef49e0200e5ac70b75f484088ac 100644 --- a/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/inspector.properties +++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Il est possible de faire défiler la partie q # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Pas de règle associée +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Maintenez la touche Maj enfoncée et cliquez pour aller à la règle + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/netmonitor.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/netmonitor.properties index 0282853716f98829eb9d78e1651fd402d41aec4b..03b2ee323f06ec8a1636b6cd2876cf7ebe3e6aec 100644 --- a/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/netmonitor.properties +++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/netmonitor.properties @@ -765,6 +765,14 @@ netmonitor.ws.context.received=Reçus # for the "Received" menu item displayed in the context menu in the websocket toolbar. netmonitor.ws.context.received.accesskey=R +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed +# on the context menu that shows "Control Frames" WebSocket frames. +netmonitor.ws.context.controlFrames=Contrôle + +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key +# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. +netmonitor.ws.context.controlFrames.accesskey=o + # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed # on the context menu that shows "Copy Message". netmonitor.ws.context.copyFrame=Copier le message @@ -1525,10 +1533,3 @@ netmonitor.cache.lastModified=Dernière modification # LOCALIZATION NOTE (netmonitor.cache.device): This is the label text for the device # where a cached object was fetched from (e.g. "disk"). netmonitor.cache.device=Appareil - -# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed -# on the context menu that shows "Control Frames" WebSocket frames. -netmonitor.ws.context.controlFrames=Control -# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key -# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. -netmonitor.ws.context.controlFrames.accesskey=o diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/global/css.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/global/css.properties index 75cb6f1a0139eeadf7347735040f6518ddc2aae5..b559f99accf346a862503e8f9a241a62158c7136 100644 --- a/thunderbird-l10n/fr/chrome/fr/locale/fr/global/css.properties +++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=La feuille de style %1$S a été chargée comme CSS même si son PEUnexpEOF2=Fin de fichier inattendue durant la recherche de %1$S. PEParseRuleWSOnly=Chaîne composée uniquement d’espaces fournie comme règle. + PEDeclDropped=Déclaration abandonnée. PEDeclSkipped=Passage à la déclaration suivante. PEUnknownProperty=Propriété « %1$S » inconnue. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Un seul repeat(auto-fill, …) est aut PEMoreThanOneGridRepeatAutoFillFitInTrackList=Un seul repeat(auto-fill, …) ou repeat(auto-fit, …) est autorisé dans une liste d’éléments « track ». PEMoreThanOneGridRepeatTrackSize=Une seule dimension d’élément « track » est autorisée dans repeat(auto-fit/auto-fill, …). +PEDisallowedImportRule=Les règles @import ne sont pas encore valides dans les feuilles de style construites. + TooLargeDashedRadius=La valeur de border radius est trop importante pour le style « dashed » (la limite est 100000 px). Le rendu sera effectué avec le style « solid ». TooLargeDottedRadius=La valeur de border radius est trop importante pour le style « dotted » (la limite est 100000 px). Le rendu sera effectué avec le style « solid ». diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/global/security/security.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/global/security/security.properties index 4b293702979ffcc3374153054963d083c213048b..ec648aca01885d90350e8ba920a0f8dd361b9cd4 100644 --- a/thunderbird-l10n/fr/chrome/fr/locale/fr/global/security/security.properties +++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Chargement refusé par X-Frame-Options : « %1$S » à l’adresse # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Chargement refusé par X-Frame-Options : « %1$S » à l’adresse « %2$S », le site ne permet pas l’utilisation de cadres multiorigines depuis « %3$S ». +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Un en-tête X-Frame-Options non valide a été trouvé lors du chargement de « %2$S » : « %1$S » n’est pas une directive valide. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=Le chargement de « %2$S » dans un cadre est refusé par la directive « X-Frame-Options » définie à « %1$S ». + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = La requête non sécurisée « %1$S » va maintenant utiliser « %2$S ». diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/addons.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/addons.properties index 18ce6a273dd2191eb80ce19c34ce70ce9bf31e1e..da517deb6bb32fe716a5f0cb3b5f1cf2dde5a624 100644 --- a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/addons.properties +++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/addons.properties @@ -126,6 +126,8 @@ addonInstallErrorBlocklisted=%S n’a pas pu être installé car il présente un # Note, this string will be used as raw markup. Avoid characters like <, >, & webextPerms.header=Installer %S ? +# %S is brandShortName +webextPerms.experimentWarning=Les modules malveillants peuvent dérober vos données personnelles ou compromettre votre ordinateur. Installez ce module uniquement si vous avez confiance en la source. webextPerms.unsignedWarning=Attention : ce module n’a pas été vérifié. Les modules malveillants peuvent dérober vos données personnelles ou compromettre votre ordinateur. Installez ce module uniquement si vous avez confiance en la source. # LOCALIZATION NOTE (webextPerms.listIntro) @@ -194,6 +196,9 @@ webextPerms.description.devtools=Ouvrir les outils de développement afin d’ac webextPerms.description.dns=Accéder à l’adresse IP et au nom d’hôte webextPerms.description.downloads=Télécharger des fichiers, et consulter et modifier l’historique des téléchargements du navigateur webextPerms.description.downloads.open=Ouvrir les fichiers téléchargés sur votre ordinateur +# LOCALIZATION NOTE (webextPerms.description.experiment) +# %S will be replaced with the name of the application +webextPerms.description.experiment=Avoir un accès complet et illimité à %S et à votre ordinateur webextPerms.description.find=Lire le texte de tous les onglets ouverts webextPerms.description.geolocation=Accéder à votre localisation webextPerms.description.history=Accéder à l’historique de navigation @@ -258,9 +263,3 @@ webext.remove.confirmation.title=Supprimer %S # %2$S is brandShorterName webext.remove.confirmation.message=Supprimer %1$S de %2$S ? webext.remove.confirmation.button=Supprimer - -# %S is brandShortName -webextPerms.experimentWarning=Malicious add-ons can steal your private information or compromise your computer. Only install this add-on if you trust the source. -# LOCALIZATION NOTE (webextPerms.description.experiment) -# %S will be replaced with the name of the application -webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/customizeToolbar.dtd b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/customizeToolbar.dtd index aa15e10a01c4b3c356955e95aad2e1fb1a506b8c..f0aa9effd50354a532221c0055d17ecf2ef19d7f 100644 --- a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/customizeToolbar.dtd +++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/customizeToolbar.dtd @@ -15,8 +15,7 @@ <!ENTITY addNewToolbar.label "Nouvelle barre"> <!ENTITY showTitlebar.label "Afficher la barre de titre"> <!ENTITY extraDragSpace.label "Espace pour saisir la fenêtre"> +<!ENTITY showTitlebar2.label "Barre de titre"> +<!ENTITY extraDragSpace2.label "Espace pour saisir la fenêtre"> <!ENTITY saveChanges.label "Terminé"> <!ENTITY undoChanges.label "Annuler les changements"> - -<!ENTITY showTitlebar2.label "Title Bar"> -<!ENTITY extraDragSpace2.label "Drag Space"> diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/imapMsgs.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/imapMsgs.properties index 0131680ee31ca4db268a53878c97a1da85d7db49..fa3b70a7a48876c3de60e88b6cbf00fb2676319c 100644 --- a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/imapMsgs.properties +++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/imapMsgs.properties @@ -199,12 +199,22 @@ imapSubscribePrompt=Voulez-vous vous abonner à %1$S ? imapServerDroppedConnection=Impossible de se connecter au serveur IMAP. Vous avez peut-être dépassé le nombre maximal de connexions au serveur. Si c’est le cas, utilisez les paramètres avancés de serveur IMAP pour diminuer le nombre de connexions conservées en mémoire cache. +# This will occur when a folder that has never been imap selected or opened +# (left-clicked) is first right-clicked to access quota properties. imapQuotaStatusFolderNotOpen=Les informations de quota ne sont pas disponibles car le dossier n’est pas ouvert. +# The imap capability response reports that QUOTA is not supported. imapQuotaStatusNotSupported=Ce serveur ne prend pas en charge les quotas. imapQuotaStatusNoQuota=Il n’y a aucun quota de stockage sur ce dossier. +# The getqutaroot command succeeded but reported no quota information. +imapQuotaStatusNoQuota2=Aucune information sur les quotas n’est fournie pour ce dossier. + +# Folder properties were requested by the user (right-click) before the getquotaroot +# command was sent. +imapQuotaStatusInProgress=Les informations sur les quotas ne sont pas encore disponibles. + # Out of memory imapOutOfMemory=Mémoire saturée. @@ -256,9 +266,3 @@ imapFolderCommandFailed=L’opération courante « %2$S » n’a pas abouti. L # Place the word %1$S in your translation where the name of the account should appear. # Place the word %2$S in your translation where the alert from the server should appear. imapServerAlert=Alerte pour le compte %1$S : %2$S - -# The getqutaroot command succeeded but reported no quota information. -imapQuotaStatusNoQuota2=This folder reports no quota information. -# Folder properties were requested by the user (right-click) before the getquotaroot -# command was sent. -imapQuotaStatusInProgress=Quota information not yet available. diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/messenger.dtd b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/messenger.dtd index 4399db2e42f7194a9a2b1daaa652e991016e98ee..cf75d6904ce57200d86bd318bb4ad31d37365f37 100644 --- a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/messenger.dtd +++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Rechercher dans le courrier"> <!ENTITY searchMailCmd.accesskey "c"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Recherche globale…"> +<!ENTITY glodaSearchCmd.accesskey "R"> <!ENTITY searchAddressesCmd.label "Rechercher dans les adresses…"> <!ENTITY searchAddressesCmd.accesskey "a"> diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/messenger.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/messenger.properties index 30a54dbb7296b93d6bf218d788568a356a55ab6b..a816fb856f5441fe33ab10a56fc32c52d040fed2 100644 --- a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/messenger.properties +++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/messenger.properties @@ -317,6 +317,7 @@ ajuster le paramètre d’espace disque pour éviter le téléchargement de mess # accountCentral mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xul + # LOCALIZATION NOTE(acctCentralTitleFormat): %1$S is brand, %2$S is account type, %3$S is account name acctCentralTitleFormat=%1$S %2$S - %3$S mailAcctType=Courrier @@ -464,11 +465,15 @@ macBiffNotification_separator=,\u0020 # For the Quota tab in the mail folder properties dialog quotaUsedFree=%S sur %S Ko utilisés + +# For the Quota tab in the mail folder properties dialog quotaPercentUsed=%S%% utilisés # for quota in main window (commandglue.js) percent=%S%% quotaTooltip=Quota IMAP : %S Ko utilisés sur %S Ko alloués. Cliquer pour plus de détails. +quotaTooltip2=Quota IMAP : %S utilisés sur %S alloués. Cliquer pour plus de détails. + # for message views confirmViewDeleteTitle=Confirmation confirmViewDeleteMessage=Voulez-vous vraiment supprimer cette vue ? @@ -804,5 +809,3 @@ errorConsoleTitle = Console d’erreurs # This is used by screen readers to label the "back" button in various browser # popup panels, including the sliding subviews of the appmenu. panel.back = Retour - -quotaTooltip2=IMAP quota: %S used of %S total. Click for details. diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/pgpmime.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/pgpmime.properties index a7be2fb2439a4514d9e1a2ca369d8730fe3fe33e..539cfb12dd6ea2499883031472b82452454ffa12 100644 --- a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/pgpmime.properties +++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=Ceci est un message OpenPGP chiffré.<br>Afin de pouvoir déchiffrer ce courrier, vous devez installer un <a href="%S">module complémentaire OpenPGP</a>. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Ceci est un message OpenPGP chiffré, mais la prise en charge du déchiffrement OpenPGP n’est pas disponible. diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/preferences/general.dtd b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/preferences/general.dtd index 4d7b70f662dc50d8483bb58dab120afa3b2353de..bd9db35d05aa3d68e2aef2691cf3f4142f99a4aa 100644 --- a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/preferences/general.dtd +++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/preferences/general.dtd @@ -43,5 +43,5 @@ <!ENTITY removeSearchEngine.label "Supprimer"> <!ENTITY removeSearchEngine.accesskey "S"> -<!ENTITY minimizeToTray.label "When &brandShortName; is minimized, move it to the tray"> -<!ENTITY minimizeToTray.accesskey "m"> +<!ENTITY minimizeToTray.label "Quand &brandShortName; est réduit, le déplacer dans la barre de notification"> +<!ENTITY minimizeToTray.accesskey "r"> diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/necko/necko.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/necko/necko.properties index 1514a9230c69b55224ab1b7cbede8bec1bafd797..6f4da2e0a336279bb06fce0480f9d3a738cfadf5 100644 --- a/thunderbird-l10n/fr/chrome/fr/locale/fr/necko/necko.properties +++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Accès au stockage automatiquement ac # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Accès au stockage automatiquement accordé pour le traqueur « %2$S » sur le site « %1$S ». +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Accès au stockage automatiquement accordé pour l’isolation First-Party « %2$S » sur le site « %1$S ». + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Le cookie « %1$S » a été rejeté car il possède l’attribut « sameSite=none » mais pas l’attribut « secure ». # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". @@ -70,6 +73,4 @@ CookieSameSiteValueInvalid=Valeur « sameSite » non valide pour le cookie « # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. CookieOversize=Le cookie « %1$S » n’est pas valide car sa taille est trop grande. La taille maximale est de %2$S octets. # LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. - -# LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B. +CookiePathOversize=Le cookie « %1$S » n’est pas valide car la taille de son chemin est trop grande. La taille maximale est de %2$S octets. diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/pippki/pippki.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/pippki/pippki.properties index e141b5d1d073c67fa378f13e944561f7bd34c1cc..d01243aac0c6f0f04bdc4958f90faa09aafc733e 100644 --- a/thunderbird-l10n/fr/chrome/fr/locale/fr/pippki/pippki.properties +++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/pippki/pippki.properties @@ -2,56 +2,15 @@ # 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/. -# LOCALIZATION NOTE(certWithSerial): Used for semi-uniquely representing a cert. -# %1$S is the serial number of the cert in AA:BB:CC hex format. -certWithSerial=Certificat avec numéro de série : %1$S - # Download Cert dialog # LOCALIZATION NOTE(newCAMessage1): # %S is a string representative of the certificate being downloaded/imported. newCAMessage1=Voulez-vous faire confiance à « %S » pour les actions suivantes ? unnamedCA=Autorité de certification (pas de nom) -# For editing cert trust -editTrustCA=Le certificat « %S » représente une autorité de certification. - -# For Deleting Certificates -deleteSslCertConfirm3=Voulez-vous vraiment supprimer ces exceptions de serveurs ? -deleteSslCertImpact3=Si vous supprimez une exception de serveur, vous restaurez les vérifications de sécurité usuelles pour ce serveur et demandez qu’il utilise un certificat valide. -deleteSslCertTitle3=Suppression des exceptions de certificats de serveur - -deleteUserCertConfirm=Voulez-vous vraiment supprimer ces certificats ? -deleteUserCertImpact=Si vous supprimez un de vos certificats, vous ne pourrez plus l’utiliser pour vous identifier vous-même. -deleteUserCertTitle=Suppression de certificats - -deleteCaCertConfirm2=Vous avez demandé de supprimer ces certificats d’AC. S’il s’agit de certificats intégrés, aucune confiance ne leur sera plus accordée, ce qui a le même effet. Voulez-vous vraiment supprimer ces certificats ou ne plus leur faire confiance ? -deleteCaCertImpactX2=Si vous supprimez une autorité de certification (AC) ou cessez de lui faire confiance, l’application ne fera plus confiance à aucun certificat fourni par cette autorité. -deleteCaCertTitle2=Supprimer ou ne plus faire confiance à des certificats d’AC - -deleteEmailCertConfirm=Voulez-vous vraiment supprimer les certificats de courrier de ces personnes ? -deleteEmailCertImpactDesc=Si vous supprimez le certificat de courrier d’une personne, vous ne pourrez plus envoyer de courrier chiffré à la personne qui lui est associée. -deleteEmailCertTitle=Suppression de certificats de courrier - -deleteOrphanCertConfirm=Voulez-vous vraiment supprimer ces certificats ? -deleteOrphanCertTitle=Suppression de certificats - # PKCS#12 file dialogs -chooseP12RestoreFileDialog2=Fichier de certificat à importer -chooseP12BackupFileDialog=Nom de fichier à sauvegarder -file_browse_PKCS12_spec=Fichiers PKCS12 getPKCS12FilePasswordMessage=Veuillez saisir le mot de passe portable de sécurité protégeant ce certificat de sécurité et la clé privée : -# Cert verification -certVerified=Ce certificat a été vérifié pour les utilisations suivantes : -certNotVerified_CertRevoked=Impossible de vérifier ce certificat car il a été révoqué. -certNotVerified_CertExpired=Impossible de vérifier ce certificat car il a expiré. -certNotVerified_CertNotTrusted=Impossible de vérifier ce certificat car il n’est pas digne de confiance. -certNotVerified_IssuerNotTrusted=Impossible de vérifier ce certificat car son émetteur n’est pas digne de confiance. -certNotVerified_IssuerUnknown=Impossible de vérifier ce certificat car l’émetteur est inconnu. -certNotVerified_CAInvalid=Impossible de vérifier ce certificat car le certificat d’AC n’est pas valide. -certNotVerified_AlgorithmDisabled=Impossible de vérifier ce certificat car il a été signé à l’aide d’un algorithme de signature qui a été désactivé car cet algorithme n’est pas sécurisé. -certNotVerified_Unknown=Impossible de vérifier ce certificat pour une raison inconnue. - # Client auth clientAuthRemember=Se souvenir de cette décision # LOCALIZATION NOTE(clientAuthNickAndSerial): Represents a single cert when the @@ -111,12 +70,6 @@ pageInfo_MixedContent2=Certaines parties de la page que vous visionnez n’ont p pageInfo_WeakCipher=La connexion vers ce site possède un niveau de chiffrement trop bas et n’est pas privée. N’importe qui est en mesure d’afficher vos informations ou de modifier le comportement du site web. pageInfo_CertificateTransparency_Compliant=Ce site web respecte la politique de transparence du certificat. -# Cert Viewer -# LOCALIZATION NOTE(certViewerTitle): Title used for the Certificate Viewer. -# %1$S is a string representative of the certificate being viewed. -certViewerTitle=Détails du certificat : « %1$S » -notPresent=<Ne fait pas partie du certificat> - # Token Manager password_not_set=(non défini) failed_pw_change=Impossible de modifier le mot de passe. @@ -126,67 +79,8 @@ pw_erased_ok=ATTENTION ! Vous avez effacé votre mot de passe principal. pw_not_wanted=Attention ! Vous avez décidé de ne pas utiliser de mot de passe principal. pw_empty_warning=Vos mots de passe enregistrés pour les formulaires web et le courrier ainsi que vos clés privées ne seront pas protégés. pw_change2empty_in_fips_mode=Vous êtes actuellement en mode FIPS. Ce mode nécessite un mot de passe principal non vide. -login_failed=Échec de connexion -loadPK11ModuleFilePickerTitle=Sélectionner un pilote de périphérique PKCS#11 à charger -devinfo_modname=Module -devinfo_modpath=Chemin -devinfo_label=Étiquette -devinfo_manID=Fabricant -devinfo_serialnum=Numéro de série -devinfo_hwversion=Version HW -devinfo_fwversion=Version FW -devinfo_status=Statut -devinfo_desc=Description -devinfo_stat_disabled=Désactivé -devinfo_stat_notpresent=Absent -devinfo_stat_uninitialized=Non initialisé -devinfo_stat_notloggedin=Non connecté -devinfo_stat_loggedin=Connecté -devinfo_stat_ready=Prêt enable_fips=Activer FIPS disable_fips=Désactiver FIPS -fips_nonempty_password_required=Le mode FIPS exige que vous ayez défini un mot de passe principal pour chaque périphérique de sécurité. Veuillez définir le mot de passe principal avant d’activer le mode FIPS. -unable_to_toggle_fips=Impossible de modifier le mode FIPS pour le périphérique de sécurité. Nous vous recommandons de quitter et de redémarrer cette application. resetPasswordConfirmationTitle=Effacer le mot de passe principal -resetPasswordConfirmationMessage=Votre mot de passe a été effacé - -# Import certificate(s) file dialog -importEmailCertPrompt=Sélectionner un fichier contenant un certificat de courrier à importer -importCACertsPrompt=Sélectionner un fichier contenant un (ou des) certificat(s) d’AC à importer -file_browse_Certificate_spec=Fichiers de certificat - -# Cert export -SaveCertAs=Enregistrer le certificat dans un fichier -CertFormatBase64=Certificat X.509 (PEM) -CertFormatBase64Chain=Certificat X.509 avec chaîne (PEM) -CertFormatDER=Certificat X.509 (DER) -CertFormatPKCS7=Certificat X.509 (PKCS#7) -CertFormatPKCS7Chain=Certificat X.509 avec chaîne (PKCS#7) -writeFileFailure=Erreur de fichier -writeFileFailed=Impossible d’écrire dans le fichier %S :\n%S. -writeFileAccessDenied=Accès refusé -writeFileIsLocked=Le fichier est verrouillé -writeFileNoDeviceSpace=Pas d’espace disque disponible -writeFileUnknownError=Erreur inconnue - -# Add Security Exception dialog -addExceptionBrandedWarning2=Vous êtes en train de passer outre la façon dont %S identifie ce site. -addExceptionInvalidHeader=Ce site essaie de s’identifier lui-même avec des informations invalides. -addExceptionDomainMismatchShort=Mauvais site -addExceptionDomainMismatchLong2=Le certificat appartient à un site différent, ce qui pourrait indiquer que quelqu’un tente d’usurper l’identité de ce site. -addExceptionExpiredShort=Informations obsolètes -addExceptionExpiredLong2=Le certificat n’est pas valide actuellement. Il a pu être volé ou perdu et peut être utilisé par quelqu’un pour usurper l’identité de ce site. -addExceptionUnverifiedOrBadSignatureShort=Identité inconnue -addExceptionUnverifiedOrBadSignatureLong2=Le certificat n’est pas sûr car il est impossible de vérifier qu’il ait été délivré par une autorité de confiance utilisant une signature sécurisée. -addExceptionValidShort=Certificat valide -addExceptionValidLong=Ce site fournit une identification valide et certifiée. Il n’est pas nécessaire d’ajouter une exception. -addExceptionCheckingShort=Vérification des informations -addExceptionCheckingLong2=Tentative d’identification de ce site… -addExceptionNoCertShort=Pas d’informations disponibles -addExceptionNoCertLong2=Impossible d’obtenir l’état d’identification de ce site. - -# Load Module Dialog -loadModuleHelp_emptyModuleName=Le nom du module ne peut pas être vide. -# LOCALIZATION NOTE(loadModuleHelp_rootCertsModuleName): Do not translate 'Root Certs' -loadModuleHelp_rootCertsModuleName=« Root Certs » est réservé et ne peut pas être utilisé comme nom de module. +resetPasswordConfirmationMessage=Votre mot de passe à été réinitialisé. diff --git a/thunderbird-l10n/fr/localization/fr/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/fr/localization/fr/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..62a084009a153b25a8efe2b959eca0ccdfe897a0 --- /dev/null +++ b/thunderbird-l10n/fr/localization/fr/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Redirection de l’adresse d’un agenda +calendar-uri-redirect-description = + Le serveur redirige l’adresse (URI) de l’agenda « { $calendarName } ». + Accepter la redirection et commencer à utiliser la nouvelle adresse de cet agenda ? +calendar-uri-redirect-original-uri-label = Adresse actuelle : +calendar-uri-redirect-target-uri-label = Redirection vers : diff --git a/thunderbird-l10n/fr/localization/fr/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/fr/localization/fr/devtools/client/aboutdebugging.ftl index f9567bfa55ad702b567ec9717832a7be3fe852c7..5fee397c352245bb043deca653eec104f974db0f 100644 --- a/thunderbird-l10n/fr/localization/fr/devtools/client/aboutdebugging.ftl +++ b/thunderbird-l10n/fr/localization/fr/devtools/client/aboutdebugging.ftl @@ -186,6 +186,9 @@ about-debugging-browser-version-too-old = Le navigateur connecté dispose d’un # backward compatible changes broke the debugger in those scenarios (Bug 1528219). # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1") about-debugging-browser-version-too-old-67-debugger = Le panneau du débogueur risque de ne pas fonctionner avec le navigateur connecté. Veuillez utiliser Firefox { $runtimeVersion } si vous avez besoin d’utiliser le débogueur avec ce navigateur. +# Dedicated message for a backward compatibility issue that occurs when connecting: +# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68. +about-debugging-browser-version-too-old-fennec = Cette version de Firefox ne peut pas déboguer Firefox pour Android (68). Nous vous recommandons d’installer Firefox pour Android Nightly sur votre téléphone pour les tests. <a>Plus de détails</a> # This string is displayed in the runtime page if the remote browser version is too recent. # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd) diff --git a/thunderbird-l10n/fr/localization/fr/messenger/accountCentral.ftl b/thunderbird-l10n/fr/localization/fr/messenger/accountCentral.ftl index f241c3be8ab9a7b4e7cb26f655aed89cac7c714c..66f7cc73f936353309a1d4aec147bc26b8fe7f64 100644 --- a/thunderbird-l10n/fr/localization/fr/messenger/accountCentral.ftl +++ b/thunderbird-l10n/fr/localization/fr/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Bienvenue dans { -brand-full-name } +account-settings = Paramètres du compte +# $accounts (Number) - the number of configured accounts setup-title = Choisir l’élément à configurer about-title = À propos de { -brand-full-name } resources-title = Ressources @@ -40,3 +42,10 @@ explore-link = Découvrir les fonctionnalités support-link = Assistance involved-link = Contribuer developer-link = Documentation pour les développeurs +read = Lire les messages +compose = Écrire un nouveau message +search = Rechercher dans les messages +filter = Gérer les filtres des messages +nntp-subscription = Gérer les abonnements aux groupes de discussion +rss-subscription = Gérer les abonnements aux flux +e2e = Chiffrement de bout en bout diff --git a/thunderbird-l10n/fr/localization/fr/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/fr/localization/fr/toolkit/about/aboutAddons.ftl index fb78ac90551a92966bbf19e387e629dec97e5e18..984f904749ba380b6a0a730658f807f4e80db932 100644 --- a/thunderbird-l10n/fr/localization/fr/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/fr/localization/fr/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Installer un module depuis un fichier… .accesskey = I help-button = Assistance des modules +sidebar-help-button-title = + .title = Assistance des modules preferences = { PLATFORM() -> [windows] Options de { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Outils pour tous les modules +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Options de { -brand-short-name } + *[other] Préférences de { -brand-short-name } + } show-unsigned-extensions-button = .label = Certaines extensions n’ont pas pu être vérifiées show-all-extensions-button = @@ -170,13 +178,29 @@ extensions-view-available-updates = .name = À mettre à jour .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Recommandations +addon-category-discover-title = + .title = Recommandations addon-category-extension = Extensions +addon-category-extension-title = + .title = Extensions addon-category-theme = Thèmes +addon-category-theme-title = + .title = Thèmes addon-category-plugin = Plugins +addon-category-plugin-title = + .title = Plugins addon-category-dictionary = Dictionnaires +addon-category-dictionary-title = + .title = Dictionnaires addon-category-locale = Langues +addon-category-locale-title = + .title = Langues addon-category-available-updates = À mettre à jour +addon-category-available-updates-title = + .title = À mettre à jour addon-category-recent-updates = Mis à jour +addon-category-recent-updates-title = + .title = Mis à jour ## These are global warnings @@ -289,6 +313,7 @@ shortcuts-no-commands = Les extensions suivantes ne disposent pas de raccourcis shortcuts-input = .placeholder = Saisissez un raccourci shortcuts-browserAction = Activer l’extension +shortcuts-browserAction2 = Activer le bouton de la barre d’outils shortcuts-pageAction = Activer l’action de la page shortcuts-sidebarAction = Afficher/Masquer le panneau latéral shortcuts-modifier-mac = Inclure Ctrl, Alt ou ⌘ @@ -314,6 +339,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = En montrer moins go-back-button = .tooltiptext = Retour +header-back-button = + .title = Retour ## Recommended add-ons page diff --git a/thunderbird-l10n/fr/localization/fr/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/fr/localization/fr/toolkit/about/aboutSupport.ftl index 1efbc1e9bc280a16bc47b421690b0eadecc3684a..f2381785979294c981924d18b669714014e48114 100644 --- a/thunderbird-l10n/fr/localization/fr/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/fr/localization/fr/toolkit/about/aboutSupport.ftl @@ -290,6 +290,11 @@ sandbox-proc-type-content = contenu sandbox-proc-type-file = contenu du fichier sandbox-proc-type-media-plugin = plugin multimédia sandbox-proc-type-data-decoder = décodeur de données +startup-cache-title = Cache de démarrage +startup-cache-disk-cache-path = Chemin du cache disque +startup-cache-ignore-disk-cache = Ignorer le cache disque +startup-cache-found-disk-cache-on-init = Cache disque trouvé à l’initialisation +startup-cache-wrote-to-disk-cache = Écriture dans le cache disque launcher-process-status-0 = Activé launcher-process-status-1 = Désactivé en raison d’une défaillance launcher-process-status-2 = Désactivé de force @@ -313,6 +318,7 @@ touch-enabled = entrée tactile activée drag-enabled = faire glisser les barres de défilement keyboard-enabled = clavier activé autoscroll-enabled = défilement automatique activé +zooming-enabled = zoom fluide par pincement activé ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/fr/localization/fr/toolkit/about/certviewer.ftl b/thunderbird-l10n/fr/localization/fr/toolkit/about/certviewer.ftl index e78d21dddd74995e958b8243b511076884c5557c..c1465017f6a196c9641b7d3da5fd4d19a9c909a6 100644 --- a/thunderbird-l10n/fr/localization/fr/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/fr/localization/fr/toolkit/about/certviewer.ftl @@ -29,6 +29,8 @@ certificate-viewer-id = ID certificate-viewer-key-exchange-group = Groupe d’échange de clés certificate-viewer-key-id = ID de clé certificate-viewer-key-size = Taille de la clé +# Inc. means Incorporated, e.g GitHub is incorporated in Delaware +certificate-viewer-inc-locality = Siège social certificate-viewer-locality = Localité certificate-viewer-location = Emplacement certificate-viewer-logid = ID de journal @@ -95,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (chain) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Cette extension a été marquée comme critique, ce qui signifie que les clients doivent rejeter le certificat s’ils ne le comprennent pas. +certificate-viewer-export = Exporter + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Vos certificats +certificate-viewer-tab-people = Personnes +certificate-viewer-tab-servers = Serveurs +certificate-viewer-tab-ca = Autorités +certificate-viewer-tab-unkonwn = Inconnu diff --git a/thunderbird-l10n/fr/localization/fr/toolkit/global/processTypes.ftl b/thunderbird-l10n/fr/localization/fr/toolkit/global/processTypes.ftl index ba0034174281dc9a2a3725175b24d28ccdd213bc..3ce54635d122d37ccccf02f5829a45bb87e80100 100644 --- a/thunderbird-l10n/fr/localization/fr/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/fr/localization/fr/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Contenu web isolé # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/fr/localization/fr/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/fr/localization/fr/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..d7119f083d1a0cb7045dbb90c0b89acf7a78b960 --- /dev/null +++ b/thunderbird-l10n/fr/localization/fr/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Vous avez lancé une ancienne version de { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Créer un nouveau profil +profiledowngrade-sync = L’utilisation d’une ancienne version de { -brand-product-name } peut corrompre les marque-pages et l’historique de navigation déjà enregistrés dans un profil { -brand-product-name } existant. Pour protéger vos informations, créez un nouveau profil pour cette installation de { -brand-short-name }. Vous pouvez toujours vous connecter avec un { -fxaccount-brand-name } pour synchroniser vos marque-pages et votre historique de navigation entre les profils. +profiledowngrade-nosync = L’utilisation d’une ancienne version de { -brand-product-name } peut corrompre les marque-pages et l’historique de navigation déjà enregistrés dans un profil { -brand-product-name } existant. Pour protéger vos informations, créez un nouveau profil pour cette installation de { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Quitter + *[other] Quitter + } diff --git a/thunderbird-l10n/fr/manifest.json b/thunderbird-l10n/fr/manifest.json index 443e127f873d82389016fe2e9bb5fae80cec533f..7a72908823796dc0e4421744b145ddf1ad94a745 100644 --- a/thunderbird-l10n/fr/manifest.json +++ b/thunderbird-l10n/fr/manifest.json @@ -1,57 +1,57 @@ { - "description": "Language pack for Thunderbird for fr", - "name": "Français Language Pack", "manifest_version": 2, - "applications": { - "gecko": { - "strict_min_version": "76.0", - "id": "langpack-fr@thunderbird.mozilla.org", - "strict_max_version": "76.*" - } - }, - "author": "mozfr.org (contributors: Frédéric Chateaux, Théo Chevalier, Cédric Corazza, Philippe Dessante, Benoît Leseul, Jean-Bernard Marcon)", "sources": { "browser": { "base_path": "browser/" } }, + "langpack_id": "fr", + "name": "Français Language Pack", + "applications": { + "gecko": { + "strict_max_version": "76.*", + "strict_min_version": "76.0", + "id": "langpack-fr@thunderbird.mozilla.org" + } + }, + "description": "Language pack for Thunderbird for fr", "languages": { "fr": { "chrome_resources": { + "mozldap": "chrome/fr/locale/fr/mozldap/", + "autoconfig": "chrome/fr/locale/fr/autoconfig/", + "alerts": "chrome/fr/locale/fr/alerts/", + "necko": "chrome/fr/locale/fr/necko/", + "chat": "chrome/fr/locale/fr/chat/", "pippki": "chrome/fr/locale/fr/pippki/", + "global": "chrome/fr/locale/fr/global/", "places": "chrome/fr/locale/fr/places/", - "branding": "chrome/fr/locale/fr/branding/", - "messenger-smime": "chrome/fr/locale/fr/messenger-smime/", - "chat": "chrome/fr/locale/fr/chat/", - "devtools-shared": "chrome/fr/locale/fr/devtools/shared/", "pipnss": "chrome/fr/locale/fr/pipnss/", - "global": "chrome/fr/locale/fr/global/", - "pluginproblem": "chrome/fr/locale/fr/pluginproblem/", - "necko": "chrome/fr/locale/fr/necko/", - "messenger-newsblog": "chrome/fr/locale/fr/messenger-newsblog/", + "communicator": "chrome/fr/locale/fr/communicator/", + "messenger-smime": "chrome/fr/locale/fr/messenger-smime/", + "mozapps": "chrome/fr/locale/fr/mozapps/", "calendar": "chrome/fr/locale/fr/calendar/", - "messenger-region": "chrome/fr/locale/fr/messenger-region/", "lightning": "chrome/fr/locale/fr/lightning/", + "messenger": "chrome/fr/locale/fr/messenger/", + "messenger-mapi": "chrome/fr/locale/fr/messenger-mapi/", + "devtools-shared": "chrome/fr/locale/fr/devtools/shared/", "devtools-startup": "chrome/fr/locale/fr/devtools/startup/", - "alerts": "chrome/fr/locale/fr/alerts/", - "autoconfig": "chrome/fr/locale/fr/autoconfig/", + "messenger-region": "chrome/fr/locale/fr/messenger-region/", + "passwordmgr": "chrome/fr/locale/fr/passwordmgr/", + "devtools": "chrome/fr/locale/fr/devtools/client/", "global-platform": { - "linux": "chrome/fr/locale/fr/global-platform/unix/", "win": "chrome/fr/locale/fr/global-platform/win/", + "linux": "chrome/fr/locale/fr/global-platform/unix/", "android": "chrome/fr/locale/fr/global-platform/unix/", "macosx": "chrome/fr/locale/fr/global-platform/mac/" }, - "mozapps": "chrome/fr/locale/fr/mozapps/", - "messenger": "chrome/fr/locale/fr/messenger/", - "communicator": "chrome/fr/locale/fr/communicator/", - "mozldap": "chrome/fr/locale/fr/mozldap/", - "passwordmgr": "chrome/fr/locale/fr/passwordmgr/", - "devtools": "chrome/fr/locale/fr/devtools/client/", - "messenger-mapi": "chrome/fr/locale/fr/messenger-mapi/" + "branding": "chrome/fr/locale/fr/branding/", + "messenger-newsblog": "chrome/fr/locale/fr/messenger-newsblog/", + "pluginproblem": "chrome/fr/locale/fr/pluginproblem/" }, - "version": "20200403074633" + "version": "20200418212307" } }, - "langpack_id": "fr", - "version": "76.0buildid20200407173003" + "version": "76.0buildid20200420212409", + "author": "mozfr.org (contributors: Frédéric Chateaux, Théo Chevalier, Cédric Corazza, Philippe Dessante, Benoît Leseul, Jean-Bernard Marcon)" } diff --git a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/devtools/client/inspector.properties b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/devtools/client/inspector.properties index 35ff36616cec484b594abffe174f5d9a0e10fd1a..c67246c39831492815215df9c8267e0cda2bb64d 100644 --- a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/devtools/client/inspector.properties +++ b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Dit elemint hat skowbere oerrin. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Gjin keppele rigel +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Hâld Shift yndrukt en klik om nei de rigel te springen + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/global/css.properties b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/global/css.properties index 01303cfdd750e2301f54399ffeb35a324f3ccd15..7f5d1ba441a9cb6ec436f7dc056b732c8c3077c2 100644 --- a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/global/css.properties +++ b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=It stylblêd %1$S wurde download as CSS, alhoewol syn MIME-type, PEUnexpEOF2=Unferwacht einde fan bestân tiidens sykjen nei %1$S. PEParseRuleWSOnly=String mei inkeld witromte joun om te parsen as rige. + PEDeclDropped=Deklaraasje negearre. PEDeclSkipped=Nei folgjende deklaraasje ljeppe. PEUnknownProperty=Unbekende eigenskip ’%1$S’. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Der is mar ien repeat(auto-fill, …) PEMoreThanOneGridRepeatAutoFillFitInTrackList=Der is mar ien repeat(auto-fill, …) of repeat(auto-fit, …) yn in track list tastien. PEMoreThanOneGridRepeatTrackSize=Der is mar ien track size binnen repeat(auto-fit/auto-fill, …) tastien. +PEDisallowedImportRule=@import-rigels binne noch net jildich yn konstruearre stylblêden. + TooLargeDashedRadius=Border-straal is te grut foar ‘dashed’ styl (de limyt is 100000px). Wurdt renderd as solid. TooLargeDottedRadius=Border-straal is te grut foar ‘dotted’ styl (de limyt is 100000px). Wurdt renderd as solid. diff --git a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/global/security/security.properties b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/global/security/security.properties index 24dd4f9b2ce9f719fbf242b679a58e07e6bb82a6..25f43723a5dd8a7d0cb0d48f06b393d6f62f5da0 100644 --- a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/global/security/security.properties +++ b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Laden troch X-Frame-Options wegere: ‘%1$S’ fan ‘%2$S’, website # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Laden troch X-Frame-Options wegere: ‘%1$S’ fan ‘%2$S’, website stiet cross-origin-framing fan ‘%3$S’ net ta. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Der is in ûnjildige X-Frame-Options-koptekst fûn by it laden fan ‘%2$S’: ‘%1$S’ is gjin jildige rjochtline. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=It laden yn in frame fan ‘%2$S’ is wegere troch de rjochtline ‘X-Frame-Options’, dy't ynsteld is op ‘%1$S’. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Unfeilige oanfraach ‘%1$S’ wurdt fernijd foar gebrûk fan ‘%2$S’ diff --git a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/messenger/messenger.dtd b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/messenger/messenger.dtd index fff26cc26a2878d5c8a954a4e53fe4a90b787f7e..8616734981da21ddccb6c6809c92988e0b03391b 100644 --- a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/messenger/messenger.dtd +++ b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Berjochten sykje…"> <!ENTITY searchMailCmd.accesskey "B"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Globaal sykje…"> +<!ENTITY glodaSearchCmd.accesskey "G"> <!ENTITY searchAddressesCmd.label "Adressen sykje…"> <!ENTITY searchAddressesCmd.accesskey "A"> diff --git a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/messenger/pgpmime.properties b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/messenger/pgpmime.properties index e8101c45f61fb1ce82971c387e0668dbcb23b36c..40bb272db287548c8a9c06da0e14e16fef79d15e 100644 --- a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/messenger/pgpmime.properties +++ b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/messenger/pgpmime.properties @@ -9,3 +9,6 @@ # LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=Dit is in fersifere OpenPGP-berjocht.<br>Om dizze e-mail te ûntsiferjen, moatte jo in <a href="%S">OpenPGP add-on</a> ynstallearje. + +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Dit is in fersifere OpenPGP-berjocht, mar stipe foar OpenPGP-ûntsifering is net beskikber. diff --git a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/necko/necko.properties b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/necko/necko.properties index c8db8c83f5e5a3bb010fe57c70c775c390ad473b..59cd97b176156205172834145bcbdc6e8987d0ab 100644 --- a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/necko/necko.properties +++ b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Tagong ta ûnthâld automatysk ferlie # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Tagong ta ûnthâld automatysk ferliend foar tracker ‘%2$S’ op ‘%1$S’. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Tagong ta ûnthâld automatysk ferliend foar isolaasje fan streekrjochte cookie ‘%2$S’ op ‘%1$S’. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Cookie ‘%1$S’ is ôfwezen omdat it it attribút ‘sameSite=none’ befettet, mar it attribút ‘secure’ ûntbrekt. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/fy-NL/localization/fy-NL/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/fy-NL/localization/fy-NL/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..e2a58ac213bd74f27d370968a69db107e0810ac7 --- /dev/null +++ b/thunderbird-l10n/fy-NL/localization/fy-NL/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Omlieding aginda-URI +calendar-uri-redirect-description = + De server liedt de URI foar de aginda ‘{ $calendarName }’ om. + Dizze omlieding akseptearje en de nije URI foar dizze aginda brûke? +calendar-uri-redirect-original-uri-label = Aktuele URI: +calendar-uri-redirect-target-uri-label = Omliede nei nije URI: diff --git a/thunderbird-l10n/fy-NL/localization/fy-NL/messenger/accountCentral.ftl b/thunderbird-l10n/fy-NL/localization/fy-NL/messenger/accountCentral.ftl index d5055d3012fbd17ea78f864189dc036693adb52d..177fbee33ff8d2a672455e0e6e8c76eee698643b 100644 --- a/thunderbird-l10n/fy-NL/localization/fy-NL/messenger/accountCentral.ftl +++ b/thunderbird-l10n/fy-NL/localization/fy-NL/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Wolkom by { -brand-full-name } +account-settings = Accountynstellingen +# $accounts (Number) - the number of configured accounts setup-title = Kies wat jo ynstelle wolle about-title = Oer { -brand-full-name } resources-title = Boarnen @@ -40,3 +42,10 @@ explore-link = Funksjes ferkenne support-link = Stipe involved-link = Meiwurkje developer-link = Dokumintaasje foar ûntwikkelers +read = Berjochten lêze +compose = Nij berjocht opstelle +search = Berjochten sykje +filter = Berjochtefilters beheare +nntp-subscription = Nijsgroepabonneminten beheare +rss-subscription = Feedabonneminten beheare +e2e = End-to-end-fersifering diff --git a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/aboutAddons.ftl index 62c462924a462ff668cd7b1fe8770f74237883df..363e2d6ae384abb10a33444ad17d71acbc0ee286 100644 --- a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Ynstallearje add-on út bestân… .accesskey = Y help-button = Add-on-stipe +sidebar-help-button-title = + .title = Add-on-stipe preferences = { PLATFORM() -> [windows] { -brand-short-name }-opsjes @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Ark foar alle add-ons +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name }-opsjes + *[other] { -brand-short-name }-foarkarren + } show-unsigned-extensions-button = .label = Guon útwreidingen koene net ferifiearre wurde show-all-extensions-button = @@ -173,13 +181,29 @@ extensions-view-available-updates = .name = Beskikbere fernijingen .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Oanrekommandaasjes +addon-category-discover-title = + .title = Oanrekommandaasjes addon-category-extension = Utwreidingen +addon-category-extension-title = + .title = Utwreidingen addon-category-theme = Tema's +addon-category-theme-title = + .title = Tema's addon-category-plugin = Ynstekkers +addon-category-plugin-title = + .title = Ynstekkers addon-category-dictionary = Wurdboeken +addon-category-dictionary-title = + .title = Wurdboeken addon-category-locale = Talen +addon-category-locale-title = + .title = Talen addon-category-available-updates = Beskikbere fernijingen +addon-category-available-updates-title = + .title = Beskikbere fernijingen addon-category-recent-updates = Resinte fernijingen +addon-category-recent-updates-title = + .title = Resinte fernijingen ## These are global warnings @@ -292,6 +316,7 @@ shortcuts-no-commands = De folgjende útwreidingen hawwe gjin fluchtoetsen: shortcuts-input = .placeholder = Typ in fluchtoets shortcuts-browserAction = Utwreiding aktivearje +shortcuts-browserAction2 = Arkbalkeknop aktivearje shortcuts-pageAction = Side-aksje aktivearje shortcuts-sidebarAction = De sydbalke yn-/útskeakelje shortcuts-modifier-mac = Druk ek op Ctrl, Alt of ⌘ @@ -316,6 +341,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Minder toane go-back-button = .tooltiptext = Tebekgean +header-back-button = + .title = Tebekgean ## Recommended add-ons page diff --git a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/aboutSupport.ftl index 8815c1b0f1cc41e741948a10d3642064872e539b..724074a9c429919f78a13e850b3b16dffbb669a2 100644 --- a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/aboutSupport.ftl @@ -290,6 +290,11 @@ sandbox-proc-type-content = ynhâld sandbox-proc-type-file = bestânsynhâld sandbox-proc-type-media-plugin = mediaynstekker sandbox-proc-type-data-decoder = gegevensdecoder +startup-cache-title = Opstartbuffer +startup-cache-disk-cache-path = Paad nei skiifbuffer +startup-cache-ignore-disk-cache = Skiifbuffer negearje +startup-cache-found-disk-cache-on-init = Skiifbuffer by Init fûn +startup-cache-wrote-to-disk-cache = Nei skiifbuffer skreaun launcher-process-status-0 = Ynskeakele launcher-process-status-1 = Utskeakele fanwegen flater launcher-process-status-2 = Forsearre útskeakele @@ -313,6 +318,7 @@ touch-enabled = oanraakynfier ynskeakele drag-enabled = sleep fia skowbalke ynskeakele keyboard-enabled = toetseboerd ynskeakele autoscroll-enabled = automatysk skowe ynskeakele +zooming-enabled = soepele knyp-zoom ynskeakele ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/certviewer.ftl b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/certviewer.ftl index ed1f1bda265e6aa2b65d5ae251b017ac5b2b8f10..e58b79c26f6ab34af234de22ec1aa246190212f1 100644 --- a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (sert) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (keten) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Dizze útwreiding is as krityk markearre, wat betsjut dat clients it sertifikaat wegerje moatten as se it net begripe. +certificate-viewer-export = Eksportearje + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Jo sertifikaten +certificate-viewer-tab-people = Minsken +certificate-viewer-tab-servers = Servers +certificate-viewer-tab-ca = Organisaasjes +certificate-viewer-tab-unkonwn = Unbekend diff --git a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/global/processTypes.ftl b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/global/processTypes.ftl index 84dd8781480cc379f805d2609b5b4d655a0bd01c..c3c12abd7da5abe542ae92b3ef5559ef1aaa4a80 100644 --- a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Isolearre webynhâld # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..a528d9ccdb5472a033d6499e1976abc47d8799fd --- /dev/null +++ b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Jo hawwe in âldere ferzje fan { -brand-product-name } start + .style = width: 490px; +profiledowngrade-window-create = + .label = Nij profyl oanmeitsje +profiledowngrade-sync = It gebrûk fan in âldere ferzje fan { -brand-product-name } kin blêdwizers en navigaasjeskiednis dy't al yn in besteand { -brand-product-name }-profyl bewarre is skansearje. Meitsje in nij profyl oan foar dizze ynstallaasje fan { -brand-short-name } om jo ynformaasje te beskermjen. Jo kinne jo altyd oanmelde mei in { -fxaccount-brand-name } om jo blêdwizers en navigaasjeskiednis tusken profilen te syngronisearjen. +profiledowngrade-nosync = It gebrûk fan in âldere ferzje fan { -brand-product-name } kin blêdwizers en navigaasjeskiednis dy't al yn in besteand { -brand-product-name }-profyl bewarre is skansearje. Meitsje in nij profyl oan foar dizze ynstallaasje fan { -brand-short-name } om jo ynformaasje te beskermjen. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Ofslute + *[other] Ofslute + } diff --git a/thunderbird-l10n/fy-NL/manifest.json b/thunderbird-l10n/fy-NL/manifest.json index 56281468a9f6232ccefcd55f4e03c51c68ed8d69..5b88c36744c61cf16d33852143a36ad845389803 100644 --- a/thunderbird-l10n/fy-NL/manifest.json +++ b/thunderbird-l10n/fy-NL/manifest.json @@ -1,57 +1,57 @@ { - "sources": { - "browser": { - "base_path": "browser/" - } - }, - "applications": { - "gecko": { - "strict_max_version": "76.*", - "id": "langpack-fy-NL@thunderbird.mozilla.org", - "strict_min_version": "76.0" - } - }, "languages": { "fy-NL": { + "version": "20200416071509", "chrome_resources": { + "messenger-region": "chrome/fy-NL/locale/fy-NL/messenger-region/", + "messenger-smime": "chrome/fy-NL/locale/fy-NL/messenger-smime/", + "alerts": "chrome/fy-NL/locale/fy-NL/alerts/", + "devtools-shared": "chrome/fy-NL/locale/fy-NL/devtools/shared/", + "branding": "chrome/fy-NL/locale/fy-NL/branding/", "pluginproblem": "chrome/fy-NL/locale/fy-NL/pluginproblem/", - "messenger-newsblog": "chrome/fy-NL/locale/fy-NL/messenger-newsblog/", - "autoconfig": "chrome/fy-NL/locale/fy-NL/autoconfig/", + "pippki": "chrome/fy-NL/locale/fy-NL/pippki/", + "global": "chrome/fy-NL/locale/fy-NL/global/", "mozldap": "chrome/fy-NL/locale/fy-NL/mozldap/", - "messenger": "chrome/fy-NL/locale/fy-NL/messenger/", - "global-platform": { - "linux": "chrome/fy-NL/locale/fy-NL/global-platform/unix/", - "android": "chrome/fy-NL/locale/fy-NL/global-platform/unix/", - "win": "chrome/fy-NL/locale/fy-NL/global-platform/win/", - "macosx": "chrome/fy-NL/locale/fy-NL/global-platform/mac/" - }, - "places": "chrome/fy-NL/locale/fy-NL/places/", - "passwordmgr": "chrome/fy-NL/locale/fy-NL/passwordmgr/", - "devtools-shared": "chrome/fy-NL/locale/fy-NL/devtools/shared/", "communicator": "chrome/fy-NL/locale/fy-NL/communicator/", - "devtools": "chrome/fy-NL/locale/fy-NL/devtools/client/", - "pipnss": "chrome/fy-NL/locale/fy-NL/pipnss/", "mozapps": "chrome/fy-NL/locale/fy-NL/mozapps/", - "branding": "chrome/fy-NL/locale/fy-NL/branding/", + "pipnss": "chrome/fy-NL/locale/fy-NL/pipnss/", + "devtools": "chrome/fy-NL/locale/fy-NL/devtools/client/", "chat": "chrome/fy-NL/locale/fy-NL/chat/", - "pippki": "chrome/fy-NL/locale/fy-NL/pippki/", - "messenger-region": "chrome/fy-NL/locale/fy-NL/messenger-region/", - "calendar": "chrome/fy-NL/locale/fy-NL/calendar/", - "messenger-smime": "chrome/fy-NL/locale/fy-NL/messenger-smime/", - "alerts": "chrome/fy-NL/locale/fy-NL/alerts/", - "necko": "chrome/fy-NL/locale/fy-NL/necko/", - "messenger-mapi": "chrome/fy-NL/locale/fy-NL/messenger-mapi/", - "devtools-startup": "chrome/fy-NL/locale/fy-NL/devtools/startup/", "lightning": "chrome/fy-NL/locale/fy-NL/lightning/", - "global": "chrome/fy-NL/locale/fy-NL/global/" - }, - "version": "20200405084446" + "passwordmgr": "chrome/fy-NL/locale/fy-NL/passwordmgr/", + "devtools-startup": "chrome/fy-NL/locale/fy-NL/devtools/startup/", + "places": "chrome/fy-NL/locale/fy-NL/places/", + "messenger-mapi": "chrome/fy-NL/locale/fy-NL/messenger-mapi/", + "necko": "chrome/fy-NL/locale/fy-NL/necko/", + "messenger-newsblog": "chrome/fy-NL/locale/fy-NL/messenger-newsblog/", + "calendar": "chrome/fy-NL/locale/fy-NL/calendar/", + "messenger": "chrome/fy-NL/locale/fy-NL/messenger/", + "global-platform": { + "android": "chrome/fy-NL/locale/fy-NL/global-platform/unix/", + "linux": "chrome/fy-NL/locale/fy-NL/global-platform/unix/", + "macosx": "chrome/fy-NL/locale/fy-NL/global-platform/mac/", + "win": "chrome/fy-NL/locale/fy-NL/global-platform/win/" + }, + "autoconfig": "chrome/fy-NL/locale/fy-NL/autoconfig/" + } + } + }, + "applications": { + "gecko": { + "strict_max_version": "76.*", + "id": "langpack-fy-NL@thunderbird.mozilla.org", + "strict_min_version": "76.0" } }, - "langpack_id": "fy-NL", "manifest_version": 2, - "author": "mozilla.org (contributors: Wim Benes, Hindrik Sijens)", + "langpack_id": "fy-NL", + "version": "76.0buildid20200420212409", "name": "Frysk (fy) Language Pack", - "version": "76.0buildid20200407173003", - "description": "Language pack for Thunderbird for fy-NL" + "author": "mozilla.org (contributors: Wim Benes, Hindrik Sijens)", + "description": "Language pack for Thunderbird for fy-NL", + "sources": { + "browser": { + "base_path": "browser/" + } + } } diff --git a/thunderbird-l10n/ga-IE/localization/ga-IE/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ga-IE/localization/ga-IE/toolkit/about/aboutAddons.ftl index 365a486d44d81216966bd3d1eeeee68efa49ca2b..52205c7ab875084626d26d33da862f09453cd174 100644 --- a/thunderbird-l10n/ga-IE/localization/ga-IE/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/ga-IE/localization/ga-IE/toolkit/about/aboutAddons.ftl @@ -129,11 +129,23 @@ extensions-view-available-updates = .name = Nuashonruithe Ar Fáil .tooltiptext = { extensions-view-available-updates.name } addon-category-extension = Eisínteachtaí +addon-category-extension-title = + .title = Eisínteachtaí addon-category-plugin = Forlíontáin +addon-category-plugin-title = + .title = Forlíontáin addon-category-dictionary = Foclóirí +addon-category-dictionary-title = + .title = Foclóirí addon-category-locale = Teangacha +addon-category-locale-title = + .title = Teangacha addon-category-available-updates = Nuashonruithe Ar Fáil +addon-category-available-updates-title = + .title = Nuashonruithe Ar Fáil addon-category-recent-updates = Nuashonruithe Le Déanaí +addon-category-recent-updates-title = + .title = Nuashonruithe Le Déanaí ## These are global warnings diff --git a/thunderbird-l10n/ga-IE/localization/ga-IE/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ga-IE/localization/ga-IE/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..6fbe8159b2db12df85a3ecca3b73921192c6e43f --- /dev/null +++ b/thunderbird-l10n/ga-IE/localization/ga-IE/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,3 @@ +# 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/. diff --git a/thunderbird-l10n/ga-IE/manifest.json b/thunderbird-l10n/ga-IE/manifest.json index 83a8bb2f5ac6206a8f5e4c016a9c242584280ed1..4f7c24b56092f77e9208933cfae53f248aed7646 100644 --- a/thunderbird-l10n/ga-IE/manifest.json +++ b/thunderbird-l10n/ga-IE/manifest.json @@ -1,57 +1,57 @@ { + "applications": { + "gecko": { + "strict_min_version": "76.0", + "strict_max_version": "76.*", + "id": "langpack-ga-IE@thunderbird.mozilla.org" + } + }, + "author": "mozilla.org (contributors: Séamus Ó Ciardhuáin, Kevin Scannell, Brian King)", + "description": "Language pack for Thunderbird for ga-IE", "sources": { "browser": { "base_path": "browser/" } }, - "name": "Béarla (SAM) Language Pack", - "manifest_version": 2, - "author": "mozilla.org (contributors: Séamus Ó Ciardhuáin, Kevin Scannell, Brian King)", "languages": { "ga-IE": { + "version": "20200415055106", "chrome_resources": { - "lightning": "chrome/ga-IE/locale/ga-IE/lightning/", - "messenger-smime": "chrome/ga-IE/locale/ga-IE/messenger-smime/", + "devtools-shared": "chrome/ga-IE/locale/ga-IE/devtools/shared/", "passwordmgr": "chrome/ga-IE/locale/ga-IE/passwordmgr/", - "pippki": "chrome/ga-IE/locale/ga-IE/pippki/", - "places": "chrome/ga-IE/locale/ga-IE/places/", - "branding": "chrome/ga-IE/locale/ga-IE/branding/", - "devtools": "chrome/ga-IE/locale/ga-IE/devtools/client/", + "calendar": "chrome/ga-IE/locale/ga-IE/calendar/", + "messenger-region": "chrome/ga-IE/locale/ga-IE/messenger-region/", + "chat": "chrome/ga-IE/locale/ga-IE/chat/", + "lightning": "chrome/ga-IE/locale/ga-IE/lightning/", + "autoconfig": "chrome/ga-IE/locale/ga-IE/autoconfig/", + "necko": "chrome/ga-IE/locale/ga-IE/necko/", + "messenger": "chrome/ga-IE/locale/ga-IE/messenger/", + "messenger-mapi": "chrome/ga-IE/locale/ga-IE/messenger-mapi/", "global-platform": { + "macosx": "chrome/ga-IE/locale/ga-IE/global-platform/mac/", "win": "chrome/ga-IE/locale/ga-IE/global-platform/win/", "android": "chrome/ga-IE/locale/ga-IE/global-platform/unix/", - "linux": "chrome/ga-IE/locale/ga-IE/global-platform/unix/", - "macosx": "chrome/ga-IE/locale/ga-IE/global-platform/mac/" + "linux": "chrome/ga-IE/locale/ga-IE/global-platform/unix/" }, - "necko": "chrome/ga-IE/locale/ga-IE/necko/", - "global": "chrome/ga-IE/locale/ga-IE/global/", + "alerts": "chrome/ga-IE/locale/ga-IE/alerts/", + "places": "chrome/ga-IE/locale/ga-IE/places/", + "pippki": "chrome/ga-IE/locale/ga-IE/pippki/", + "devtools": "chrome/ga-IE/locale/ga-IE/devtools/client/", "messenger-newsblog": "chrome/ga-IE/locale/ga-IE/messenger-newsblog/", - "messenger": "chrome/ga-IE/locale/ga-IE/messenger/", - "communicator": "chrome/ga-IE/locale/ga-IE/communicator/", "pluginproblem": "chrome/ga-IE/locale/ga-IE/pluginproblem/", - "chat": "chrome/ga-IE/locale/ga-IE/chat/", - "autoconfig": "chrome/ga-IE/locale/ga-IE/autoconfig/", - "mozldap": "chrome/ga-IE/locale/ga-IE/mozldap/", - "mozapps": "chrome/ga-IE/locale/ga-IE/mozapps/", - "devtools-shared": "chrome/ga-IE/locale/ga-IE/devtools/shared/", - "alerts": "chrome/ga-IE/locale/ga-IE/alerts/", - "messenger-mapi": "chrome/ga-IE/locale/ga-IE/messenger-mapi/", + "communicator": "chrome/ga-IE/locale/ga-IE/communicator/", "pipnss": "chrome/ga-IE/locale/ga-IE/pipnss/", - "calendar": "chrome/ga-IE/locale/ga-IE/calendar/", + "global": "chrome/ga-IE/locale/ga-IE/global/", "devtools-startup": "chrome/ga-IE/locale/ga-IE/devtools/startup/", - "messenger-region": "chrome/ga-IE/locale/ga-IE/messenger-region/" - }, - "version": "20200403074723" + "messenger-smime": "chrome/ga-IE/locale/ga-IE/messenger-smime/", + "mozldap": "chrome/ga-IE/locale/ga-IE/mozldap/", + "mozapps": "chrome/ga-IE/locale/ga-IE/mozapps/", + "branding": "chrome/ga-IE/locale/ga-IE/branding/" + } } }, - "version": "76.0buildid20200407173003", - "description": "Language pack for Thunderbird for ga-IE", "langpack_id": "ga-IE", - "applications": { - "gecko": { - "strict_max_version": "76.*", - "strict_min_version": "76.0", - "id": "langpack-ga-IE@thunderbird.mozilla.org" - } - } + "version": "76.0buildid20200420212409", + "name": "Béarla (SAM) Language Pack", + "manifest_version": 2 } diff --git a/thunderbird-l10n/gd/localization/gd/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/gd/localization/gd/toolkit/about/aboutAddons.ftl index 97f424810e71b72ebd686ecd274d1a874fd87ef8..d244df1edb6ad45c5a9567049eb0e37ea9090bea 100644 --- a/thunderbird-l10n/gd/localization/gd/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/gd/localization/gd/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Stàlaich tuilleadan o fhaidhle… .accesskey = i help-button = Taic nan tuilleadan +sidebar-help-button-title = + .title = Taic nan tuilleadan preferences = { PLATFORM() -> [windows] Roghainnean { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Innealan airson a h-uile tuilleadan +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Roghainnean { -brand-short-name } + *[other] Roghainnean { -brand-short-name } + } show-unsigned-extensions-button = .label = Bha leudachain ann nach b’ urrainn dhuinn dearbhadh show-all-extensions-button = @@ -160,12 +168,26 @@ extensions-view-available-updates = .name = Ùrachaidhean a tha ri am faighinn .tooltiptext = { extensions-view-available-updates.name } addon-category-extension = Leudachain +addon-category-extension-title = + .title = Leudachain addon-category-theme = Ùrlaran +addon-category-theme-title = + .title = Ùrlaran addon-category-plugin = Plugain +addon-category-plugin-title = + .title = Plugain addon-category-dictionary = Faclairean +addon-category-dictionary-title = + .title = Faclairean addon-category-locale = Cànain +addon-category-locale-title = + .title = Cànain addon-category-available-updates = Ùrachaidhean a tha ri am faighinn +addon-category-available-updates-title = + .title = Ùrachaidhean a tha ri am faighinn addon-category-recent-updates = Ùrachaidhean a rinn thu o chionn goirid +addon-category-recent-updates-title = + .title = Ùrachaidhean a rinn thu o chionn goirid ## These are global warnings @@ -299,6 +321,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Seall nas lugha go-back-button = .tooltiptext = Air ais +header-back-button = + .title = Air ais ## Recommended add-ons page diff --git a/thunderbird-l10n/gd/localization/gd/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/gd/localization/gd/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..dc41cc4505004bbe9b07ed86a8e9486893a7b3e7 --- /dev/null +++ b/thunderbird-l10n/gd/localization/gd/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Chuir thu gu dol seann-tionndadh de { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Cruthaich pròifil ùr +profiledowngrade-sync = Ma chleachdas tu seann-tionndadh de { -brand-product-name }, faodaidh gun truaill sin na comharran-lìn agus eachdraidh a’ bhrabhsaidh a chaidh a shàbhaladh ann am pròifil { -brand-product-name } làithreach. Gus am fiosrachadh agad a dhìon, cruthaich pròifil ùr airson an stàladh seo de { -brand-short-name }. ’S urrainn dhut clàradh a-steach le { -fxaccount-brand-name } gus na comharran-lìn agus eachdraidh a’ bhrabhsaidh agad a shioncronachadh eadar pròifilean. +profiledowngrade-nosync = Ma chleachdas tu seann-tionndadh de { -brand-product-name }, faodaidh gun truaill sin na comharran-lìn agus eachdraidh a’ bhrabhsaidh a chaidh a shàbhaladh ann am pròifil { -brand-product-name } làithreach. Gus am fiosrachadh agad a dhìon, cruthaich pròifil ùr airson an stàladh seo de { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Fàg an-seo + *[other] Fàg an-seo + } diff --git a/thunderbird-l10n/gd/manifest.json b/thunderbird-l10n/gd/manifest.json index f5bc006930faf825f15a6ca7ade6329308792ef8..d128eb46e113c070660c6314034d5540d4987bf4 100644 --- a/thunderbird-l10n/gd/manifest.json +++ b/thunderbird-l10n/gd/manifest.json @@ -1,57 +1,57 @@ { - "author": "Sgioba Ionadaileadh Mozilla na Gàidhlig (contributors: Michael 'Akerbeltz' Bauer, Kevin Scannell)", - "manifest_version": 2, "applications": { "gecko": { - "strict_min_version": "76.0", "strict_max_version": "76.*", + "strict_min_version": "76.0", "id": "langpack-gd@thunderbird.mozilla.org" } }, - "version": "76.0buildid20200407173003", + "manifest_version": 2, + "langpack_id": "gd", + "name": "Gàidhlig Language Pack", + "author": "Sgioba Ionadaileadh Mozilla na Gàidhlig (contributors: Michael 'Akerbeltz' Bauer, Kevin Scannell)", "languages": { "gd": { - "version": "20200403074735", "chrome_resources": { - "pipnss": "chrome/gd/locale/gd/pipnss/", - "autoconfig": "chrome/gd/locale/gd/autoconfig/", - "messenger-region": "chrome/gd/locale/gd/messenger-region/", - "pippki": "chrome/gd/locale/gd/pippki/", - "mozldap": "chrome/gd/locale/gd/mozldap/", - "messenger": "chrome/gd/locale/gd/messenger/", - "communicator": "chrome/gd/locale/gd/communicator/", - "global": "chrome/gd/locale/gd/global/", - "messenger-smime": "chrome/gd/locale/gd/messenger-smime/", "pluginproblem": "chrome/gd/locale/gd/pluginproblem/", - "lightning": "chrome/gd/locale/gd/lightning/", + "alerts": "chrome/gd/locale/gd/alerts/", + "calendar": "chrome/gd/locale/gd/calendar/", + "messenger-newsblog": "chrome/gd/locale/gd/messenger-newsblog/", + "devtools-shared": "chrome/gd/locale/gd/devtools/shared/", + "chat": "chrome/gd/locale/gd/chat/", + "devtools-startup": "chrome/gd/locale/gd/devtools/startup/", + "places": "chrome/gd/locale/gd/places/", + "messenger-region": "chrome/gd/locale/gd/messenger-region/", + "devtools": "chrome/gd/locale/gd/devtools/client/", "global-platform": { - "linux": "chrome/gd/locale/gd/global-platform/unix/", + "macosx": "chrome/gd/locale/gd/global-platform/mac/", "android": "chrome/gd/locale/gd/global-platform/unix/", - "win": "chrome/gd/locale/gd/global-platform/win/", - "macosx": "chrome/gd/locale/gd/global-platform/mac/" + "linux": "chrome/gd/locale/gd/global-platform/unix/", + "win": "chrome/gd/locale/gd/global-platform/win/" }, - "branding": "chrome/gd/locale/gd/branding/", - "messenger-mapi": "chrome/gd/locale/gd/messenger-mapi/", + "global": "chrome/gd/locale/gd/global/", + "communicator": "chrome/gd/locale/gd/communicator/", + "pippki": "chrome/gd/locale/gd/pippki/", + "autoconfig": "chrome/gd/locale/gd/autoconfig/", + "messenger-smime": "chrome/gd/locale/gd/messenger-smime/", + "lightning": "chrome/gd/locale/gd/lightning/", + "mozldap": "chrome/gd/locale/gd/mozldap/", + "messenger": "chrome/gd/locale/gd/messenger/", "necko": "chrome/gd/locale/gd/necko/", "mozapps": "chrome/gd/locale/gd/mozapps/", - "alerts": "chrome/gd/locale/gd/alerts/", - "devtools": "chrome/gd/locale/gd/devtools/client/", - "places": "chrome/gd/locale/gd/places/", - "chat": "chrome/gd/locale/gd/chat/", - "devtools-startup": "chrome/gd/locale/gd/devtools/startup/", - "calendar": "chrome/gd/locale/gd/calendar/", - "messenger-newsblog": "chrome/gd/locale/gd/messenger-newsblog/", "passwordmgr": "chrome/gd/locale/gd/passwordmgr/", - "devtools-shared": "chrome/gd/locale/gd/devtools/shared/" - } + "messenger-mapi": "chrome/gd/locale/gd/messenger-mapi/", + "pipnss": "chrome/gd/locale/gd/pipnss/", + "branding": "chrome/gd/locale/gd/branding/" + }, + "version": "20200415055119" } }, - "langpack_id": "gd", - "name": "Gàidhlig Language Pack", "sources": { "browser": { "base_path": "browser/" } }, + "version": "76.0buildid20200420212409", "description": "Language pack for Thunderbird for gd" } diff --git a/thunderbird-l10n/gl/localization/gl/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/gl/localization/gl/toolkit/about/aboutAddons.ftl index 2c0161cf9754af01fd5d9212c4900707d35853a6..67645de4a3251d1df1402acf00aa78a5007f5b1b 100644 --- a/thunderbird-l10n/gl/localization/gl/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/gl/localization/gl/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Instalar complemento desde o ficheiro… .accesskey = I help-button = Asistencia dos módulos +sidebar-help-button-title = + .title = Asistencia dos módulos preferences = { PLATFORM() -> [windows] Opcións de { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Ferramentas para todos os complementos +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Opcións de { -brand-short-name } + *[other] Preferencias de { -brand-short-name } + } show-unsigned-extensions-button = .label = Non foi posíbel comprobar algunhas extensións show-all-extensions-button = @@ -138,12 +146,26 @@ extensions-view-available-updates = .name = Actualizacións dispoñíbeis .tooltiptext = { extensions-view-available-updates.name } addon-category-extension = Extensións +addon-category-extension-title = + .title = Extensións addon-category-theme = Temas +addon-category-theme-title = + .title = Temas addon-category-plugin = Engadidos +addon-category-plugin-title = + .title = Engadidos addon-category-dictionary = Dicionarios +addon-category-dictionary-title = + .title = Dicionarios addon-category-locale = Idiomas +addon-category-locale-title = + .title = Idiomas addon-category-available-updates = Actualizacións dispoñíbeis +addon-category-available-updates-title = + .title = Actualizacións dispoñíbeis addon-category-recent-updates = Actualizacións recentes +addon-category-recent-updates-title = + .title = Actualizacións recentes ## These are global warnings diff --git a/thunderbird-l10n/gl/localization/gl/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/gl/localization/gl/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..6fbe8159b2db12df85a3ecca3b73921192c6e43f --- /dev/null +++ b/thunderbird-l10n/gl/localization/gl/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,3 @@ +# 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/. diff --git a/thunderbird-l10n/gl/manifest.json b/thunderbird-l10n/gl/manifest.json index 9632ad981a924f0b7d674d9be067e4a4f99a6119..2341b9863fe6a79b4d8c8a5a4a66af3e88c58c29 100644 --- a/thunderbird-l10n/gl/manifest.json +++ b/thunderbird-l10n/gl/manifest.json @@ -1,57 +1,57 @@ { + "manifest_version": 2, + "name": "Galego (España) Language Pack", + "version": "76.0buildid20200420212409", + "applications": { + "gecko": { + "strict_max_version": "76.*", + "strict_min_version": "76.0", + "id": "langpack-gl@thunderbird.mozilla.org" + } + }, + "author": "mozilla.org (contributors: Grupo de tradución ao galego dos aplicativos de Mozilla (http://galician.mozdev.org/))", + "sources": { + "browser": { + "base_path": "browser/" + } + }, + "description": "Language pack for Thunderbird for gl", + "langpack_id": "gl", "languages": { "gl": { - "version": "20200403074747", "chrome_resources": { - "autoconfig": "chrome/gl/locale/gl/autoconfig/", "devtools-startup": "chrome/gl/locale/gl/devtools/startup/", - "necko": "chrome/gl/locale/gl/necko/", - "messenger-region": "chrome/gl/locale/gl/messenger-region/", - "messenger-smime": "chrome/gl/locale/gl/messenger-smime/", + "branding": "chrome/gl/locale/gl/branding/", + "devtools-shared": "chrome/gl/locale/gl/devtools/shared/", + "chat": "chrome/gl/locale/gl/chat/", + "messenger-newsblog": "chrome/gl/locale/gl/messenger-newsblog/", "global": "chrome/gl/locale/gl/global/", - "pipnss": "chrome/gl/locale/gl/pipnss/", + "devtools": "chrome/gl/locale/gl/devtools/client/", + "autoconfig": "chrome/gl/locale/gl/autoconfig/", + "lightning": "chrome/gl/locale/gl/lightning/", + "mozapps": "chrome/gl/locale/gl/mozapps/", "messenger-mapi": "chrome/gl/locale/gl/messenger-mapi/", + "alerts": "chrome/gl/locale/gl/alerts/", + "messenger": "chrome/gl/locale/gl/messenger/", "global-platform": { - "android": "chrome/gl/locale/gl/global-platform/unix/", - "win": "chrome/gl/locale/gl/global-platform/win/", "macosx": "chrome/gl/locale/gl/global-platform/mac/", - "linux": "chrome/gl/locale/gl/global-platform/unix/" + "win": "chrome/gl/locale/gl/global-platform/win/", + "linux": "chrome/gl/locale/gl/global-platform/unix/", + "android": "chrome/gl/locale/gl/global-platform/unix/" }, - "calendar": "chrome/gl/locale/gl/calendar/", - "passwordmgr": "chrome/gl/locale/gl/passwordmgr/", - "chat": "chrome/gl/locale/gl/chat/", - "pluginproblem": "chrome/gl/locale/gl/pluginproblem/", - "messenger": "chrome/gl/locale/gl/messenger/", - "mozapps": "chrome/gl/locale/gl/mozapps/", + "messenger-region": "chrome/gl/locale/gl/messenger-region/", "communicator": "chrome/gl/locale/gl/communicator/", - "devtools": "chrome/gl/locale/gl/devtools/client/", - "branding": "chrome/gl/locale/gl/branding/", - "pippki": "chrome/gl/locale/gl/pippki/", - "devtools-shared": "chrome/gl/locale/gl/devtools/shared/", + "messenger-smime": "chrome/gl/locale/gl/messenger-smime/", + "pluginproblem": "chrome/gl/locale/gl/pluginproblem/", "mozldap": "chrome/gl/locale/gl/mozldap/", + "passwordmgr": "chrome/gl/locale/gl/passwordmgr/", "places": "chrome/gl/locale/gl/places/", - "lightning": "chrome/gl/locale/gl/lightning/", - "messenger-newsblog": "chrome/gl/locale/gl/messenger-newsblog/", - "alerts": "chrome/gl/locale/gl/alerts/" - } - } - }, - "version": "76.0buildid20200407173003", - "applications": { - "gecko": { - "id": "langpack-gl@thunderbird.mozilla.org", - "strict_max_version": "76.*", - "strict_min_version": "76.0" - } - }, - "manifest_version": 2, - "langpack_id": "gl", - "description": "Language pack for Thunderbird for gl", - "author": "mozilla.org (contributors: Grupo de tradución ao galego dos aplicativos de Mozilla (http://galician.mozdev.org/))", - "name": "Galego (España) Language Pack", - "sources": { - "browser": { - "base_path": "browser/" + "pipnss": "chrome/gl/locale/gl/pipnss/", + "calendar": "chrome/gl/locale/gl/calendar/", + "necko": "chrome/gl/locale/gl/necko/", + "pippki": "chrome/gl/locale/gl/pippki/" + }, + "version": "20200415055132" } } } diff --git a/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/debugger.properties b/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/debugger.properties index 476ee46e615297f9ed6775e12f4690b0e1709ca2..30664cffefec8924cb4e1b4e02e6859ec6e3b994 100644 --- a/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/debugger.properties +++ b/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/debugger.properties @@ -94,6 +94,7 @@ copyStackTrace.accesskey=ע # LOCALIZATION NOTE (expandBreakpoints): This is the tooltip for the button # that expands the Breakpoints panes in the debugger UI. +expandBreakpoints=הרחבת החלונית של נקודות העצירה # LOCALIZATION NOTE (evaluateInConsole.label): Editor right-click menu item # to execute selected text in browser console. @@ -1310,9 +1311,6 @@ unblackBoxAllOutsideDir.label=Unblackbox files outside this directory # LOCALIZATION NOTE (expandSources): This is the tooltip for the button # that expands the Sources and Outlines panes in the debugger UI. expandSources=Expand Sources and Outline panes -# LOCALIZATION NOTE (expandBreakpoints): This is the tooltip for the button -# that expands the Breakpoints panes in the debugger UI. -expandBreakpoints=Expand Breakpoints pane # LOCALIZATION NOTE (eventListenersHeader1): The text to display in the events # header. eventListenersHeader1=Event Listener Breakpoints diff --git a/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/jsonview.properties b/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/jsonview.properties index ae01ee666cb34f20ae3e076fbf477b649983facc..004594773c9733df0d265a60bcba3dfebb84d8da 100644 --- a/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/jsonview.properties +++ b/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/jsonview.properties @@ -32,6 +32,8 @@ jsonViewer.Copy=העתקה # LOCALIZATION NOTE (jsonViewer.ExpandAll): Label for expanding all nodes jsonViewer.ExpandAll=הרחבת הכל +jsonViewer.ExpandAllSlow=הרחבת הכל (איטי) + # LOCALIZATION NOTE (jsonViewer.CollapseAll): Label for collapsing all nodes jsonViewer.CollapseAll=צמצום הכל @@ -50,5 +52,3 @@ jsonViewer.filterJSON=סינון JSON # LOCALIZATION NOTE (jsonViewer.reps.reference): Label used for cycle # references in an array. jsonViewer.reps.reference=הפניה מעגלית - -jsonViewer.ExpandAllSlow=Expand All (slow) diff --git a/thunderbird-l10n/he/chrome/he/locale/he/global/commonDialogs.properties b/thunderbird-l10n/he/chrome/he/locale/he/global/commonDialogs.properties index 9faff1753848cfe895dd65882c608ba42002bcb2..6672c3dc6ec7d573ce8edd8a01a498107ac70b81 100644 --- a/thunderbird-l10n/he/chrome/he/locale/he/global/commonDialogs.properties +++ b/thunderbird-l10n/he/chrome/he/locale/he/global/commonDialogs.properties @@ -30,7 +30,7 @@ ScriptDialogPreventTitle=העדפות דו־שיח האישור # bug 244273). %1 should be integrated into the translated sentences as # little as possible. %2 is the url of the site being accessed. EnterLoginForRealm3=השרת %2$S מבקש את שם המשתמש והססמה שלך. מהאתר נמסר: “%1$S” -EnterLoginForProxy3=השרת המתווך %2$S מבקש שם משתמש וססמה. מסר האתר: “%1$S” +EnterLoginForProxy3=השרת המתווך %2$S מבקש שם משתמש וססמה. מהאתר נמסר: “%1$S” EnterUserPasswordFor2=%1$S מבקש את שם המשתמש והססמה שלך. EnterUserPasswordForCrossOrigin2=השרת %1$S מבקש את שם המשתמש והססמה שלך. זהירות: הססמה לא תשלח אל האתר הנוכחי! EnterPasswordFor=הכנס שם משתמש וססמה עבור %1$S ב־%2$S diff --git a/thunderbird-l10n/he/chrome/he/locale/he/necko/necko.properties b/thunderbird-l10n/he/chrome/he/locale/he/necko/necko.properties index 812993dfcc4218d7e4ab44da6e0f45ea6f893bf3..98ff65b0342f3fa655d3c0959ecb3ce791b109fa 100644 --- a/thunderbird-l10n/he/chrome/he/locale/he/necko/necko.properties +++ b/thunderbird-l10n/he/chrome/he/locale/he/necko/necko.properties @@ -42,13 +42,24 @@ AutomaticAuth=אתה עומד להתחבר אל האתר "%1$S" עם שם המש TrackerUriBlocked=המשאב ב־„%1$S” נחסם כי הופעלה חסימת תוכן. UnsafeUriBlocked=המשאב „%1$S“ נחסם על־ידי גלישה בטוחה. +CookieBlockedByPermission=בקשת גישה לעוגייה או אחסון ב־”%1$S” נחסמה עקב הרשאות עוגייה מותאמות אישית. # LOCALIZATION NOTE (CookieAllowedForOriginOnTrackerByStorageAccessAPI): %3$S, %2$S and %1$S are URLs. + # LOCALIZATION NOTE (CookieAllowedForTrackerByStorageAccessAPI): %2$S and %1$S are URLs. # LOCALIZATION NOTE (CookieAllowedForOriginOnTrackerByHeuristic): %3$S, %2$S and %1$S are URLs. # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. -CookieBlockedByPermission=Request to access cookies or storage on “%1$S” was blocked because of custom cookie permission. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. + +# LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". +# LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". +# LOCALIZATION NOTE(CookieLaxForced): %1$S is the cookie name. Do not localize "sameSite", "lax" and "sameSite=lax". +# LOCALIZATION NOTE(CookieLaxForcedForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "lax" and "sameSite=lax", "sameSite=none". +# LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none" +# LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. +# LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. + CookieBlockedTracker=Request to access cookie or storage on “%1$S” was blocked because it came from a tracker and content blocking is enabled. CookieBlockedAll=Request to access cookie or storage on “%1$S” was blocked because we are blocking all storage access requests. CookieBlockedForeign=Request to access cookie or storage on “%1$S” was blocked because we are blocking all third-party storage access requests and content blocking is enabled. diff --git a/thunderbird-l10n/he/localization/he/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/he/localization/he/toolkit/about/aboutAddons.ftl index 9b4455d67172d3e44b1cbfe5277247353668a54e..c90281d1942e82f76a3f395f9f0f0c537c704480 100644 --- a/thunderbird-l10n/he/localization/he/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/he/localization/he/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = התקנת תוספת מקובץ… .accesskey = ה help-button = תמיכה בתוספות +sidebar-help-button-title = + .title = תמיכה בתוספות preferences = { PLATFORM() -> [windows] אפשרויות של { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = כלים עבור כל התוספות +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] אפשרויות של { -brand-short-name } + *[other] העדפות של { -brand-short-name } + } show-unsigned-extensions-button = .label = אין אפשרות לאמת חלק מההרחבות show-all-extensions-button = @@ -167,13 +175,29 @@ extensions-view-available-updates = .name = עדכונים זמינים .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = המלצות +addon-category-discover-title = + .title = המלצות addon-category-extension = הרחבות +addon-category-extension-title = + .title = הרחבות addon-category-theme = ערכות נושא +addon-category-theme-title = + .title = ערכות נושא addon-category-plugin = תוספים חיצוניים +addon-category-plugin-title = + .title = תוספים חיצוניים addon-category-dictionary = מילונים +addon-category-dictionary-title = + .title = מילונים addon-category-locale = שפות +addon-category-locale-title = + .title = שפות addon-category-available-updates = עדכונים זמינים +addon-category-available-updates-title = + .title = עדכונים זמינים addon-category-recent-updates = עדכונים אחרונים +addon-category-recent-updates-title = + .title = עדכונים אחרונים ## These are global warnings @@ -286,6 +310,7 @@ shortcuts-no-commands = להרחבות הבאות אין קיצורי דרך: shortcuts-input = .placeholder = נא להקליד קיצור דרך shortcuts-browserAction = הפעלת הרחבה +shortcuts-browserAction2 = הפעלת הכפתור בסרגל הכלים shortcuts-pageAction = הפעלת פעולת דף shortcuts-sidebarAction = הצגה/הסתרה של סרגל הצד shortcuts-modifier-mac = יש לכלול Ctrl, Alt או ⌘ @@ -311,6 +336,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = הצגת פחות go-back-button = .tooltiptext = חזרה אחורה +header-back-button = + .title = חזרה אחורה ## Recommended add-ons page diff --git a/thunderbird-l10n/he/localization/he/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/he/localization/he/toolkit/about/aboutSupport.ftl index 8ada5c5c8359117731e89b6571b37a66463de4c3..5e03fd622840087f224d11eb0916e0f139a82bba 100644 --- a/thunderbird-l10n/he/localization/he/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/he/localization/he/toolkit/about/aboutSupport.ftl @@ -147,6 +147,7 @@ intl-regional-prefs = העדפות אזוריות ## ## See also https://firefox-source-docs.mozilla.org/remote/ +remote-debugging-title = ניפוי שגיאות מרחוק (פרוטוקול Chromium) remote-debugging-url = כתובת ## diff --git a/thunderbird-l10n/he/localization/he/toolkit/about/certviewer.ftl b/thunderbird-l10n/he/localization/he/toolkit/about/certviewer.ftl index 4d6be1399ee980020828ea5149e2198723cb8a92..3a7241d551d00bc4911a81acea2fd59217a2d757 100644 --- a/thunderbird-l10n/he/localization/he/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/he/localization/he/toolkit/about/certviewer.ftl @@ -51,6 +51,8 @@ certificate-viewer-business-category = קטגוריית עסקים certificate-viewer-public-key-info = מידע מפתח ציבורי certificate-viewer-miscellaneous = שונות certificate-viewer-fingerprints = טביעות אצבע +certificate-viewer-certificate-policies = מדיניות של אישור +certificate-viewer-crl-endpoints = נקודות קצה של CRL # This message is used as a row header in the Miscellaneous section. # The associated data cell contains links to download the certificate. certificate-viewer-download = הורדה @@ -66,3 +68,16 @@ certificate-viewer-boolean = ## Variables: ## $fileName (String) - The file name to save the PEM data in, derived from the common name from the certificate being displayed. +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = הרחבה זו סומנה כקריטית, כלומר לקוחות חייבים לדחות את האישור אם הם לא מבינים אותו. +certificate-viewer-export = ייצוא + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = האישורים שלך +certificate-viewer-tab-people = אנשים +certificate-viewer-tab-servers = שרתים +certificate-viewer-tab-ca = רשויות +certificate-viewer-tab-unkonwn = לא ידוע diff --git a/thunderbird-l10n/he/localization/he/toolkit/global/processTypes.ftl b/thunderbird-l10n/he/localization/he/toolkit/global/processTypes.ftl index 9de30ffe721224697b3c0d73419387bbd9f29f4c..4134d7fb62b1f5023761a2c64dda252580e75bb3 100644 --- a/thunderbird-l10n/he/localization/he/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/he/localization/he/toolkit/global/processTypes.ftl @@ -12,3 +12,5 @@ process-type-weblargeallocation = הקצאה גדולה # process used to communicate with the GPU for # graphics acceleration process-type-gpu = מעבד גרפי +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/he/localization/he/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/he/localization/he/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..dc6cf9d1d5f559f48512af85ec175f7c4f70aa90 --- /dev/null +++ b/thunderbird-l10n/he/localization/he/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = הפעלת גרסה ישנה של { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = יצירת פרופיל חדש +profiledowngrade-sync = שימוש בגרסה ישנה של { -brand-product-name } עלול לפגוע בסימניות ובהיסטוריית הגלישה שכבר שמורים בפרופיל קיים ב־{ -brand-product-name }. כדי להגן על המידע שלך, יש ליצור פרופיל חדש עבור התקנה זו של { -brand-short-name }. תמיד ניתן להיכנס באמצעות { -fxaccount-brand-name } כדי לסנכרן את הסימניות והיסטוריית הגלישה שלך בין פרופילים. +profiledowngrade-nosync = שימוש בגרסה ישנה של { -brand-product-name } עלול לפגוע בסימניות ובהיסטוריית הגלישה שכבר שמורים בפרופיל קיים ב־{ -brand-product-name }. כדי להגן על המידע שלך, יש ליצור פרופיל חדש עבור התקנה זו של { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] יציאה + *[other] יציאה + } diff --git a/thunderbird-l10n/he/manifest.json b/thunderbird-l10n/he/manifest.json index 65cb72e7d82a39b0c02095be1426651f3d8d4998..4347e6f996a8d3f1bbe644e23964392775f3df4b 100644 --- a/thunderbird-l10n/he/manifest.json +++ b/thunderbird-l10n/he/manifest.json @@ -1,6 +1,5 @@ { "langpack_id": "he", - "description": "Language pack for Thunderbird for he", "applications": { "gecko": { "id": "langpack-he@thunderbird.mozilla.org", @@ -8,50 +7,51 @@ "strict_min_version": "76.0" } }, - "sources": { - "browser": { - "base_path": "browser/" - } - }, - "version": "76.0buildid20200407173003", + "version": "76.0buildid20200420212409", + "author": "mozilla.org (contributors: Reuven Gonen, Tsahi Asher, Tomer Cohen)", + "manifest_version": 2, "name": "Hebrew (IL) Language Pack", "languages": { "he": { - "version": "20200403152317", "chrome_resources": { - "global-platform": { - "win": "chrome/he/locale/he/global-platform/win/", - "android": "chrome/he/locale/he/global-platform/unix/", - "linux": "chrome/he/locale/he/global-platform/unix/", - "macosx": "chrome/he/locale/he/global-platform/mac/" - }, - "autoconfig": "chrome/he/locale/he/autoconfig/", - "alerts": "chrome/he/locale/he/alerts/", - "pippki": "chrome/he/locale/he/pippki/", + "global": "chrome/he/locale/he/global/", + "mozapps": "chrome/he/locale/he/mozapps/", + "lightning": "chrome/he/locale/he/lightning/", + "mozldap": "chrome/he/locale/he/mozldap/", "chat": "chrome/he/locale/he/chat/", - "messenger-newsblog": "chrome/he/locale/he/messenger-newsblog/", - "messenger-region": "chrome/he/locale/he/messenger-region/", - "calendar": "chrome/he/locale/he/calendar/", - "pluginproblem": "chrome/he/locale/he/pluginproblem/", - "places": "chrome/he/locale/he/places/", "devtools-startup": "chrome/he/locale/he/devtools/startup/", - "messenger-mapi": "chrome/he/locale/he/messenger-mapi/", - "messenger": "chrome/he/locale/he/messenger/", - "messenger-smime": "chrome/he/locale/he/messenger-smime/", - "mozldap": "chrome/he/locale/he/mozldap/", - "global": "chrome/he/locale/he/global/", - "devtools-shared": "chrome/he/locale/he/devtools/shared/", + "pippki": "chrome/he/locale/he/pippki/", + "branding": "chrome/he/locale/he/branding/", + "necko": "chrome/he/locale/he/necko/", "devtools": "chrome/he/locale/he/devtools/client/", - "lightning": "chrome/he/locale/he/lightning/", + "autoconfig": "chrome/he/locale/he/autoconfig/", "pipnss": "chrome/he/locale/he/pipnss/", + "messenger-region": "chrome/he/locale/he/messenger-region/", + "alerts": "chrome/he/locale/he/alerts/", + "devtools-shared": "chrome/he/locale/he/devtools/shared/", + "messenger-smime": "chrome/he/locale/he/messenger-smime/", + "messenger-mapi": "chrome/he/locale/he/messenger-mapi/", "communicator": "chrome/he/locale/he/communicator/", + "messenger": "chrome/he/locale/he/messenger/", "passwordmgr": "chrome/he/locale/he/passwordmgr/", - "necko": "chrome/he/locale/he/necko/", - "branding": "chrome/he/locale/he/branding/", - "mozapps": "chrome/he/locale/he/mozapps/" - } + "places": "chrome/he/locale/he/places/", + "calendar": "chrome/he/locale/he/calendar/", + "global-platform": { + "linux": "chrome/he/locale/he/global-platform/unix/", + "win": "chrome/he/locale/he/global-platform/win/", + "android": "chrome/he/locale/he/global-platform/unix/", + "macosx": "chrome/he/locale/he/global-platform/mac/" + }, + "messenger-newsblog": "chrome/he/locale/he/messenger-newsblog/", + "pluginproblem": "chrome/he/locale/he/pluginproblem/" + }, + "version": "20200420084421" } }, - "manifest_version": 2, - "author": "mozilla.org (contributors: Reuven Gonen, Tsahi Asher, Tomer Cohen)" + "description": "Language pack for Thunderbird for he", + "sources": { + "browser": { + "base_path": "browser/" + } + } } diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/aboutdebugging.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/aboutdebugging.properties index 735ad3de21d71e795ed61aff9c416510376f5c0d..bfc09f835491ef332e9ed6e036d83e4f1b2c3e8a 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/aboutdebugging.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/aboutdebugging.properties @@ -184,7 +184,7 @@ nothing = Još ništa. # This string is displayed in about:debugging#workers if the current configuration of the # browser is incompatible with service workers. More details at # https://developer.mozilla.org/en-US/docs/Tools/about%3Adebugging#Service_workers_not_compatible -configurationIsNotCompatible.label = Konfiguracija vašeg preglednika nije kompatibilna s radnim procesima usluge. +configurationIsNotCompatible.label = Konfiguracija tvog preglednika nije kompatibilna s radnim procesima usluge. # LOCALIZATION NOTE (configurationIsNotCompatible.learnMore): # This string is displayed as a link next to configurationIsNotCompatible.label and leads diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/inspector.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/inspector.properties index 68acd701196e9a6cac8f31f99076c40be40e96bf..94784995825d6ca7c6c3c239cd4d8f3193bd4c32 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/inspector.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/inspector.properties @@ -103,7 +103,7 @@ markupView.event.tooltiptext=Prepoznavanje događaja # LOCALIZATION NOTE (markupView.custom.tooltiptext) # Used in a tooltip that appears when the user hovers over 'custom' badge in # the markup view. Only displayed on custom elements with a shadow root attached. -markupView.custom.tooltiptext=Pokažite definiciju prilagođenih elemenata +markupView.custom.tooltiptext=Pokaži definiciju prilagođenih elemenata # LOCALIZATION NOTE (markupView.newAttribute.label) # This is used to speak the New Attribute button when editing a tag diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/webconsole.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/webconsole.properties index f906df9891a06dcdb4f5c4e347a9e77f9407d46a..8b5628557d435f1e21caed4fc6fb71f37feadc69 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/webconsole.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/webconsole.properties @@ -119,7 +119,7 @@ cdFunctionInvalidArgument=cd() na dani prozor nije izvediv. Neispravan argument. # LOCALIZATION NOTE (selfxss.msg): the text that is displayed when # a new user of the developer tools pastes code into the console # %1 is the text of selfxss.okstring -selfxss.msg=Upozorenje prijevare: budite oprezni kada ljepite stvari za koje niste sigurni. Takve radnje mogu omogućiti napadačima krađu vašeg identiteta ili preuzimanje kontrole nad vašim računalom. Da biste omogućili ljepljenje, upišite ispod '%S' (nema potrebe za pritiskom na tipku enter). +selfxss.msg=Upozorenje prevare: pazi prilikom umetanja stvari koje ne razumiješ. Takve radnje mogu omogućiti napadačima ukrasti tvoj identitet ili preuzeti kontrolu nad tvojim računalom. Da omogućavanje ljepljenja, dolje upiši '%S' (ne moraš protisnuti tipku enter). # LOCALIZATION NOTE (selfxss.okstring): the string to be typed # in by a new user of the developer tools when they receive the sefxss.msg prompt. diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/webide.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/webide.properties index 969e1160b5a4cdc55303e4eafe65e73a79ecc711..5e73c9790d6f14e54aefe3b178ecd317fc99b3af 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/webide.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/webide.properties @@ -46,7 +46,7 @@ error_appProjectsLoadFailed=Učitavanje popisa projekata nije uspjelo. Ovo se mo error_folderCreationFailed=Stvaranje direktorija projekta u odabranom direktoriju nije moguće. # Variable: runtime app build ID (looks like this %Y%M%D format) and firefox build ID (same format) -error_runtimeVersionTooRecent=Spojeni runtime ima noviji datum izrade (%1$S) u odnosu na vaš Firefox (%2$S). Ovo je nepodržano podešenje koje može uzrokovati probleme sa DevTools alatom. Molimo vas da nadogradite Firefox. +error_runtimeVersionTooRecent=Spojeni runtime ima noviji datum izrade (%1$S) u odnosu na tvoj Firefox (%2$S). Ovo je nepodržana postava, koja može prouzročiti probleme s DevTools alatom. Nadogradi Firefox. # Variable: runtime app version (looks like this 52.a3) and firefox version (same format) diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/shared/debugger.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/shared/debugger.properties index 66f40ac6d5b32f4181b31a297592af044078b143..0baf80c6c2b96ff2b438322105d297dc84218e7c 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/shared/debugger.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/shared/debugger.properties @@ -16,7 +16,7 @@ remoteIncomingPromptTitle=Dolazna veza # LOCALIZATION NOTE (remoteIncomingPromptHeader): Header displayed on the # dialog that prompts the user to allow the incoming connection. -remoteIncomingPromptHeader=Uočen je dolazni zahtjev za dopuštanje udaljenog otklanjanja problema s vezom. Udaljeni klijent može preuzeti potpunu kontrolu nad vašim web preglednikom! +remoteIncomingPromptHeader=Uočen je dolazni zahtjev za dopuštanje udaljenog otklanjanja problema s vezom. Udaljeni klijent može preuzeti potpunu kontrolu nad tvojim preglednikom! # LOCALIZATION NOTE (remoteIncomingPromptClientEndpoint): Part of the prompt # dialog for the user to choose whether an incoming connection should be # allowed. diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/appPicker.dtd b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/appPicker.dtd index 874a0b8da960ab37ad231279018a58daf025aaee..7c6a5347ad362d3e904fe5c661458c4ebbfe2f1a 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/appPicker.dtd +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/appPicker.dtd @@ -3,5 +3,5 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <!ENTITY NoAppFound.label "Nije pronađen program za ovaj tip datoteke."> -<!ENTITY BrowseButton.label "Pretraži…"> +<!ENTITY BrowseButton.label "Pregledaj …"> <!ENTITY SendMsg.label "Pošalji ovu stavku za:"> diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/appstrings.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/appstrings.properties index 4128e7a8d3235c73d293ff8d82be855d9e888f5f..e5183ee394510ea98ed19ee9014e5092aa0ec72c 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/appstrings.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/appstrings.properties @@ -29,16 +29,16 @@ externalProtocolPrompt=Vanjska aplikacija mora biti pokrenuta za upravljanje %1$ externalProtocolUnknown=<Nepoznato> externalProtocolChkMsg=Zapamti moj izbor za sve poveznice ove vrste. externalProtocolLaunchBtn=Pokreni aplikaciju -malwareBlocked=Stranica na %S je prijavljena kao zloćudna stranica i blokirana je na temelju vaših sigurnosnih osobitosti. -harmfulBlocked=Web stranica %S je prijavljena kao potencijalno zlonamjerna stranica i blokirana je na temelju vaših sigurnosnih postavki. -unwantedBlocked=Stranica na %S je prijavljena zbog posluživanja nepoželjnog softvera, te je blokirana na temelju vaših sigurnosnih postavki. -deceptiveBlocked=Web stranica %S je prijavljena kao obmanjujuća stranica i blokirana je na temelju vaših sigurnosnih postavki. -cspBlocked=Ova stranica ima sigurnosnu politiku sadržaja koja sprječava njeno učitavanje na ovaj način. -xfoBlocked=Ova stranica ima X-Frame-Options pravilo koje sprječava da se stranica otvori u ovom kontekstu. +malwareBlocked=Stranica na %S je prijavljena kao zloćudna stranica i blokirana je na osnovi tvojih sigurnosnih osobitosti. +harmfulBlocked=Web stranica %S je prijavljena kao potencijalno zlonamjerna stranica i blokirana je na osnovi tvojih sigurnosnih postavki. +unwantedBlocked=Stranica na %S je prijavljena zbog posluživanja nepoželjnog softvera, te je blokirana na osnovi tvojih sigurnosnih postavki. +deceptiveBlocked=Web stranica %S je prijavljena kao obmanjujuća stranica i blokirana je na osnovi tvojih sigurnosnih postavki. +cspBlocked=Ova stranica ima sigurnosnu politiku sadržaja koja sprečava njeno učitavanje na ovaj način. +xfoBlocked=Ova stranica ima X-Frame-Options pravilo koje sprečava da se stranica otvori u ovom kontekstu. corruptedContentErrorv2=Stranica %S je doživjela povredu mrežnog protokola koja ne može biti ispravljena. remoteXUL=Ova stranica koristi nepodržanu tehnologiju, koja standardno više nije dostupna. -sslv3Used=Sigurnost vaših podataka na %S ne može biti zajamčena jer koristi SSLv3, pokvaren sigurnosni protokol. +sslv3Used=Sigurnost tvojih podataka na %S ne može biti zajamčena, jer koristi SSLv3, pokvaren sigurnosni protokol. weakCryptoUsed=Vlasnik %S je pogrešno podesio svoju stranicu. Da bismo spriječili krađu informacija, veza s ovom stranicom nije uspostavljena. inadequateSecurityError=Web stranica je pokušala pregovarati nedovoljnu razinu sigurnosti. -blockedByPolicy=Vaša organizacija je blokirala pristup ovoj web stranici. +blockedByPolicy=Tvoja organizacija je blokirala pristup ovoj web stranici. networkProtocolError=Firefox je doživio povredu mrežnog protokola koja ne može biti ispravljena. diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/autocomplete.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/autocomplete.properties index ff2b08b5e1c3771a728f13a0532237fae9ee81af..87b094bcfd17d21dd3fb54c831304f806e7824c7 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/autocomplete.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/autocomplete.properties @@ -7,11 +7,11 @@ # because the provider can also end with "Search" (e.g.: MSN Search). searchWithEngine = Traži pomoću %S -searchInPrivateWindowWithEngine = Pretražuj sa %S u Privatnom pretraživanju +searchInPrivateWindowWithEngine = Pretraži s %S u privatnom prozoru # LOCALIZATION NOTE (searchInPrivateWindow): Used when the private browsing # engine is the same as the default engine. -searchInPrivateWindow = Pretražuj u Privatnom pretraživanju +searchInPrivateWindow = Pretraži u privatnom prozoru # LOCALIZATION NOTE (switchToTab2): This is the same as the older switchToTab # string that it's replacing, except it uses title case, so "Switch" and "Tab" diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/browser.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/browser.properties index 5f369e52df4fc26762fc9582b4b22853b863cdd4..d3e3d046713fac58d4fe2161bbab506ea9d8faca 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/browser.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/browser.properties @@ -3,8 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. browsewithcaret.checkMsg=Ne prikazuj više ovaj dijalog. -browsewithcaret.checkWindowTitle=Pokazivačko pretraživanje -browsewithcaret.checkLabel=Pritiskom na F7, uključujete ili isključujete Pokazivačko pretraživanje. To znači da će se na stranici pojaviti kursor koji vam omogućava označavanje teksta tipkovnicom. Želite li uključiti Pokazivačko pretraživanje? +browsewithcaret.checkWindowTitle=Pokazivačko pregledavanje +browsewithcaret.checkLabel=Pritiskom na F7, uključuje ili isključuje se pokazivačko pregledavanje. To znači da će se na stranici pojaviti kursor koji omogućuje označavanje teksta tipkovnicom. Želiš li uključiti pokazivačko pregledavanje? browsewithcaret.checkButtonLabel=Da plainText.wordWrap=Omotaj duge linije diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/dom/dom.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/dom/dom.properties index ba3ec8a66c97e7ff3bc1fcec8a056e6e8165381a..e72924d080883dbaafc7d08205d62e87d855949c 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/dom/dom.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/dom/dom.properties @@ -20,7 +20,7 @@ DontAskAgain=&Ne pitaj me ponovo JSURLLoadBlockedWarning=Pokušaj učitavanja javascripta: URL jednog poslužitelja\nkoji u prozoru prikazuje sadržaj jednog drugog poslužitelja\nblokiran je od sigurnosnog upravljača. WindowCloseBlockedWarning=Skripte ne mogu zatvarati prozore koji nisu bili otvoreni skriptom. OnBeforeUnloadTitle=Jeste li sigurni? -OnBeforeUnloadMessage=Ova stranica traži potvrdu vašeg odlaska - podaci koje ste unijeli možda neće biti spremljeni. +OnBeforeUnloadMessage=Ova stranica traži potvrdu, da je želiš napustiti – uneseni podaci možda neće biti spremljeni. OnBeforeUnloadStayButton=Ostani na stranici OnBeforeUnloadLeaveButton=Napusti stranicu UnexpectedCanvasVariantStyle=canvas: pokušaj postavljanja strokeStyle ili fillStyle na vrijednost koja nije izraz, CanvasGradient ili CanvasPattern je ignoriran. @@ -127,7 +127,7 @@ MediaLoadDecodeError=Multimedija izvor %S nije moguće dekodirati. # LOCALIZATION NOTE: %S is a comma-separated list of codecs (e.g. 'video/mp4, video/webm') MediaWMFNeeded=Za prikaz %S video formata, moraš instalirati dodatni Microsoft softver. Pogledaj https://support.mozilla.org/kb/fix-video-audio-problems-firefox-windows # LOCALIZATION NOTE: %S is a comma-separated list of codecs (e.g. 'video/mp4, video/webm') -MediaPlatformDecoderNotFound=Video na ovoj stranici ne može biti reproduciran. Vaš sustav možda nema potrebne video kodeke za: %S +MediaPlatformDecoderNotFound=Video na ovoj stranici se ne može reproducirati. Tvoj sustav možda nema potrebne video kodeke za: %S MediaUnsupportedLibavcodec=Videozapis se na ovoj stranici ne može pokrenuti. Tvoj sustav sadrži nepodržanu verziju za libavcodec # LOCALIZATION NOTE: %1$S is the URL of the media resource, %2$S is technical information (in English) MediaDecodeError=Medijski resurs %1$S nije moguće dekodirati, greška: %2$S @@ -359,6 +359,7 @@ MathML_DeprecatedStyleAttributeWarning=MathML atributi „background”, „colo MathML_DeprecatedXLinkAttributeWarning=XLink atributi “href”, “type”, “show” i “actuate” su zastarjeli za MathML elemente i uklonit će se u budućnosti. WebShareAPI_Failed=Operacija dijeljenja nije uspjela. WebShareAPI_Aborted=Operacija dijeljenja je prekinuta. +# LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL. # LOCALIZATION NOTE: %S is the name of the header in question ForbiddenHeaderWarning=Attempt to set a forbidden header was denied: %S diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/extensions.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/extensions.properties index f13b672c23e95377bf6ccda1516233f9643f8cba..acb40fad31325351179982b5e48b58e61cffc99c 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/extensions.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/extensions.properties @@ -23,7 +23,7 @@ csp.error.illegal-host-wildcard = %2$S: izvori zamjenskih znakova u ‘%1$S’ d uninstall.confirmation.title = Ukloni %S #LOCALIZATION NOTE (uninstall.confirmation.message) %S is the name of the extension which is about to be uninstalled. -uninstall.confirmation.message = Dodatak je “%S” zatražio svoje uklanjanje. Što želite učiniti? +uninstall.confirmation.message = Dodatak „%S” je zatražio da ga se ukloni. Što želiš učiniti? uninstall.confirmation.button-0.label = Ukloni uninstall.confirmation.button-1.label = Zadrži dodatak diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/layout/HtmlForm.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/layout/HtmlForm.properties index d18bb2179794e43f286117f72c3548d8ca125f3a..9dc5ed723a83cdb25e9584c7c5a7310cbc8c30e0 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/layout/HtmlForm.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/layout/HtmlForm.properties @@ -4,7 +4,7 @@ Reset=Poništi Submit=Predaj upit -Browse=Pretraži... +Browse=Pregledaj … FileUpload=Slanje datoteke DirectoryUpload=Odabir mape za prijenos na poslužitelj DirectoryPickerOkButtonLabel=Prijenos diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/netError.dtd b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/netError.dtd index 434511ffd7ad0a86cd2f9a10353b5612b706b34c..26a2fe9d1d6b40b33d6fd4830611c301c8ed9cc2 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/netError.dtd +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/netError.dtd @@ -11,10 +11,10 @@ <!ENTITY connectionFailure.longDesc "<p>Iako je ime stranice ispravno, preglednik nije u stanju uspostaviti vezu.</p><ul><li>Možda je stranica privremeno nedostupna? Pokušaj ponovo kasnije.</li><li>Možeš li pregledati druge stranice? Provjeri mrežne postavke računala.</li><li>Je li tvoje računalo ili mreža zaštićena vatrozidom ili proxyem? Neispravne postavke mogu onemogućiti pregledavanje interneta.</li></ul>"> <!ENTITY deniedPortAccess.title "Ulaz zabranjen zbog sigurnosih razloga"> -<!ENTITY deniedPortAccess.longDesc "<p>Zatražena adresa ima definiran ulaz (npr. <q>mozilla.org:80</q> za ulaz 80 na mozilla.org) koji se inače koristi za <em>druge</em> radnje, a ne pretraživanje. Pretraživač je prekinuo zahtjev za vaše zaštite i sigurnosti.</p>"> +<!ENTITY deniedPortAccess.longDesc "<p>Zatražena adresa ima definiran ulaz (npr. <q>mozilla.org:80</q> za ulaz 80 na mozilla.org) koji se inače koristi za <em>druge</em> radnje, a ne pretraživanje. Pretraživač je prekinuo zahtjev za tvoje zaštite i sigurnosti.</p>"> <!ENTITY dnsNotFound.title "Adresa nije pronađena"> -<!ENTITY dnsNotFound.longDesc "<p>Preglednik nije pronašao poslužitelja za danu adresu.</p><ul><li>Jeste li napravili grešku prilikom upisa adrese? (npr. <q><strong>ww</strong>.mozilla.org</q> umjesto <q><strong>www</strong>mozilla.org</q>)</li><li>Jeste li sigurni da ova domena postoji? Možda joj je istekla registracija.</li><li>Ne možete pregledati i druge stranice? Provjerite mrežne postavke i postavke DNS poslužitelja.</li><li>Je li vaše računalo zaštićeno vatrozidom ili proxyem? Neispravne postavke mogu onemoućiti pretraživanje.</li></ul>"> +<!ENTITY dnsNotFound.longDesc "<p>Preglednik nije pronašao poslužitelja za navedenu adresu.</p><ul><li>Je li adresa krivo upisana? (npr. <q><strong>ww</strong>.mozilla.org</q> umjesto <q><strong>www</strong>mozilla.org</q>)</li><li>Je li ova domena stvarno postoji? Možda joj je istekla registracija.</li><li>Ne možeš pregledati druge stranice? Provjeri mrežne postavke i postavke DNS poslužitelja.</li><li>Je li tvoje računalo zaštićeno vatrozidom ili proxyem? Neispravne postavke mogu onemogućiti pregledavanje.</li></ul>"> <!ENTITY fileNotFound.title "Datoteka nije pronađena"> <!ENTITY fileNotFound.longDesc "<ul><li>Možda je uklonjena, premještena ili joj je ime promijenjeno?</li><li>Postoji li pravopisna ili nekakva tipografska greška?</li><li>Imate li dovoljna prava za pristup traženoj datoteci?</li></ul>"> @@ -59,7 +59,7 @@ <!ENTITY proxyResolveFailure.longDesc "<p>Preglednik je postavljen da koristi proxy poslužitelj, ali ga nije moguće naći.</p><ul><li>Jesu li proxy postavke ispravne? Provjeri postavke i pokušaj ponovo.</li><li>Je li računalo povezano na aktivnu mrežu?</li><li>Ako još uvijek imaš problema, obrati se administratoru mreže ili pružatelju internet usluge.</li></ul>"> <!ENTITY redirectLoop.title "Petlja preusmjeravanja"> -<!ENTITY redirectLoop.longDesc "<p>Preglednik je odustao od dohvaćanja zatražene stranice. Stranica preusmjerava zahtjev na takav način da on nikada ne može biti ispunjen.</p><ul><li>Jeste li onemogućili ili blokirali kolačiće za ovu stranicu?</li><li><em>OPASKA</em>: Ako prihvaćanje kolačića stranice ne riješi problem, vrlo je vjerojatno problem s konfiguracijom poslužitelja, a ne vašeg računala.</li></ul>"> +<!ENTITY redirectLoop.longDesc "<p>Preglednik je odustao od dohvaćanja zatražene stranice. Stranica preusmjerava zahtjev na takav način, da on nikada ne može biti ispunjen.</p><ul><li>Jesu li kolačići za ovu stranicu deaktivirani ili blokirani?</li><li><em>OPASKA</em>: Ako prihvaćanje kolačića stranice ne riješi problem, vrlo vjerojatno se radi o probleu s konfiguracijom poslužitelja, a ne tvog računala.</li></ul>"> <!ENTITY unknownSocketType.title "Neispravan odgovor"> <!ENTITY unknownSocketType.longDesc "<p>Stranica je na mreži zahtjev odgovorila na neočekivani način, te stoga pretraživač ne može nastaviti.</p>"> @@ -74,7 +74,7 @@ </ul>"> <!ENTITY securityOverride.linkText "Ili možete dodati iznimku…"> -<!ENTITY securityOverride.warningContent "<p>Ne biste trebali dodavati iznimke ako koristite vezu prema Internetu kojoj ne vjerujete u potpunosti ili ako niste ranije viđali upozorenje za ovaj poslužitelj.</p> <p>Ako ipak želite dodati iznimku za ovu stranicu, to možete učiniti u naprednim postavkama enkripcije.</p>"> +<!ENTITY securityOverride.warningContent "<p>Nemoj dodavati iznimke ako koristiš internetsku vezu kojoj ne vjeruješ u potpunosti ili ako nisi ranije viđao/la upozorenje za ovaj poslužitelj.</p> <p>Ako ipak želiš dodati iznimku za ovu stranicu, to možeš učiniti u naprednim postavkama šifriranja.</p>"> <!ENTITY cspBlocked.title "Blokirala sigurnosna politika sadržaja"> <!ENTITY cspBlocked.longDesc "<p>Preglednik je zaustavio učitavanje ove stranice na ovaj način jer stranica ima sigurnosnu politiku sadržaja koja to zabranjuje.</p>"> @@ -88,7 +88,7 @@ <!ENTITY remoteXUL.title "Udaljeni XUL"> <!ENTITY remoteXUL.longDesc "<p><ul><li>Obavijestite vlasnike web stranice o ovom problemu.</li></ul></p>"> -<!ENTITY inadequateSecurityError.title "Vaša veza nije sigurna"> +<!ENTITY inadequateSecurityError.title "Tvoja veza nije sigurna"> <!-- LOCALIZATION NOTE (inadequateSecurityError.longDesc) - Do not translate "NS_ERROR_NET_INADEQUATE_SECURITY". --> <!ENTITY inadequateSecurityError.longDesc "<p><span class='hostname'></span> koristi sigurnosne tehnologije koje su zastarjele i podložne napadima. Napadač može jednostavno otkriti informacije za koje ste smatrali da su sigurne. Administrator web stranice će trebati popraviti poslužitelj prije nego možete posjetiti stranicu.</p><p>Kod greške: NS_ERROR_NET_INADEQUATE_SECURITY</p>"> diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/search/search.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/search/search.properties index 64ab516476384c17a11ae6aaf366d0b04f67e963..4054bbf1ecaf3f5148e3452ab5d120fdaf7b0dd1 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/search/search.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/search/search.properties @@ -4,7 +4,7 @@ addEngineConfirmTitle=Dodaj tražilicu addEngineConfirmation=Dodati "%S" na popis dostupnih tražilica u traci traženja?\n\nOd: %S -addEngineAsCurrentText=Učini ovo tren&utnim pretraživačem +addEngineAsCurrentText=Postavi kao tren&utačnu tražilicu addEngineAddButtonLabel=U redu error_loading_engine_title=Greška preuzimanja @@ -15,6 +15,4 @@ error_duplicate_engine_msg=%S ne može instalirati dodatak za traženje s "%S" j error_invalid_engine_title=Greška instaliranja error_invalid_format_title=Neispravan format # LOCALIZATION NOTE (error_invalid_engine_msg2): %1$S = brandShortName, %2$S = location (url) -error_invalid_engine_msg2=%1$S nije mogao instalirati pretraživač iz: %2$S - -suggestion_label=Prijedlozi +error_invalid_engine_msg2=%1$S nije mogao instalirati tražilicu iz: %2$S diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/messenger/messenger.dtd b/thunderbird-l10n/hr/chrome/hr/locale/hr/messenger/messenger.dtd index 0ecb4082cfbc00af18d6baff97dbd0c270db5d8a..edcab5658439f7cff0935a7be032cf8213701422 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/messenger/messenger.dtd +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Pretraži poruke…"> <!ENTITY searchMailCmd.accesskey "e"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Globalno pretraživanje…"> +<!ENTITY glodaSearchCmd.accesskey "G"> <!ENTITY searchAddressesCmd.label "Pretraži adrese…"> <!ENTITY searchAddressesCmd.accesskey "s"> diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/messenger/pgpmime.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/messenger/pgpmime.properties index 4d954a569a911f517684bde50d502023ae092c74..783ae828b403443928f37d0d8f587bc8fef84ba4 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/messenger/pgpmime.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=Ovo je kodirana OpenPGP poruka.<br>Kako biste dekodirali ovu poruku, trebate instalirati <a href="%S">OpenPGP dodatak</a>. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Ovo je kriptirana OpenPGP poruka, ali podrška za OpenPGP dekriptiranje nije dostupna. diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/downloads/unknownContentType.dtd b/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/downloads/unknownContentType.dtd index daaa4a3c95b22f09c2b3e0059fca0d3a0da448c3..f12fc8398df4cc88fe82901403e5964add7b7c41 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/downloads/unknownContentType.dtd +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/downloads/unknownContentType.dtd @@ -20,7 +20,7 @@ <!ENTITY chooseHandlerMac.label "Odaberi..."> <!ENTITY chooseHandlerMac.accesskey "O"> -<!ENTITY chooseHandler.label "Pretraži..."> +<!ENTITY chooseHandler.label "Pregledaj …"> <!ENTITY chooseHandler.accesskey "P"> <!ENTITY unknownPromptText.label "Želite li spremiti ovu datoteku?"> diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/extensions/extensions.dtd b/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/extensions/extensions.dtd index b4bbad3f7a274cffdd531188d7f97e611b69b59c..35a6c44e95f9223b9297126ec79ff5bdf613e3c9 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/extensions/extensions.dtd +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/extensions/extensions.dtd @@ -67,7 +67,7 @@ <!ENTITY addon.createdBy.label "Od "> -<!ENTITY settings.path.button.label "Pretraži…"> +<!ENTITY settings.path.button.label "Pregledaj …"> <!-- addon actions --> <!ENTITY setting.learnmore "Saznaj više …"> diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/profile/profileSelection.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/profile/profileSelection.properties index f4670450aaf3797f081d7d31b8223db4095c1e27..0150eeaef31cb7f6134636c5c35e30722e50f670 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/profile/profileSelection.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/profile/profileSelection.properties @@ -43,7 +43,7 @@ profileExists=Profil s ovim imenom već postoji. Odaberi jedno drugo ime. profileExistsTitle=Profil već postoji profileFinishText=Da biste stvoriti ovaj profil, kliknite na Završi. profileFinishTextMac=Da biste stvoriti ovaj profil, kliknite na Gotovo. -profileMissing=Vaš %S profil nije moguće učitati. Možda nedostaje ili je nedostupan. +profileMissing=Tvoj %S profil nije moguće učitati. Možda nedostaje ili je nedostupan. profileMissingTitle=Nedostajući profil profileDeletionFailed=Profil se nije mogao izbrisati jer je možda u uporabi. profileDeletionFailedTitle=Brisanje neuspješno @@ -55,7 +55,7 @@ resetBackupDirectory=Stari %S podaci flushFailTitle=Izmjene nisu spremljene # LOCALIZATION NOTE (conflictMessage): %1$S is brandProductName, %2$S is brandShortName. conflictMessage=Druga %1$S kopija je napravila izmjene u profilu. Morate ponovo pokrenuti %2$S prije nego li napravite nove izmjene. -flushFailMessage=Neočekivana greška je spriječila spremanje vaših izmjena. +flushFailMessage=Neočekivana greška je spriječila spremanje tvojih promjena. # LOCALIZATION NOTE (flushFailRestartButton): $S is brandShortName. flushFailRestartButton=Ponovo pokreni %S flushFailExitButton=Izlaz diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/necko/necko.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/necko/necko.properties index e58b5eb49f9106125002d79bacb706731aa7c452..7166829d925a6058490728e3b7b1f28ab00efaad 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/necko/necko.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/necko/necko.properties @@ -64,7 +64,7 @@ CookieRejectedNonRequiresSecureForBeta=Kolačić “%1$S” će uskoro biti odbi # LOCALIZATION NOTE(CookieLaxForced): %1$S is the cookie name. Do not localize "sameSite", "lax" and "sameSite=lax". CookieLaxForced=Kolačić “%1$S” ima “sameSite” pravilo postavljeno na “lax”, jer nedostaje “sameSite” atribut i “sameSite=lax” je standardna vrijednost za ovaj atribut. # LOCALIZATION NOTE(CookieLaxForcedForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "lax" and "sameSite=lax", "sameSite=none". -CookieLaxForcedForBeta=Kolačić “%1$S” nema ispravnu “sameSite” vrijednost atributa. Uskoro kolačići bez “sameSite” atributa ili s neispravnom vrijednošću će biti smatrani kao “lax”. Ovo znači da se kolačići više neće slati kao kolačić treće strane. Ukoliko vaša aplikacija ovisi o dostupnosti ovog kolačića u tom smislu, dodajte mu “sameSite=none“ atribut. Kako biste saznali više o “sameSite“ atributu pročitajte %2$S +CookieLaxForcedForBeta=Kolačić “%1$S” nema ispravnu “sameSite” vrijednost atributa. Uskoro će se kolačići bez “sameSite” atributa ili s neispravnom vrijednošću smatrani kao “lax”. To znači, da se kolačići više neće slati kao kolačić treće strane. Ukoliko tvoja aplikacija ovisi o dostupnosti ovog kolačića u tom smislu, dodaj mu “sameSite=none“ atribut. Saznaj više o “sameSite“ atributu na %2$S # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none" CookieSameSiteValueInvalid=Neispravna “sameSite“ vrijednost za kolačić “%1$S”. Podržane vrijednosti su: “lax“, “strict“, “none“. # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/passwordmgr/passwordmgr.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/passwordmgr/passwordmgr.properties index e9132aa12af7a2d283310b054a87d126aeb1d18f..30b1b549f7a02a0718c3497e90fc5b130a965b3e 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/passwordmgr/passwordmgr.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/passwordmgr/passwordmgr.properties @@ -46,7 +46,7 @@ updatePasswordMsgNoUser = Želite li ažurirati spremljenu lozinku? userSelectText2 = Odaberi prijavu koju želiš aktualizirati: removeLoginPrompt=Jeste li sigurni da želite ukloniti ovu prijavu? removeLoginTitle=Ukloni prijavu -loginsDescriptionAll2=Prijave za sljedeće stranice su spremljene na vašem računalu +loginsDescriptionAll2=Prijave za sljedeće stranice su spremljene na tvom računalu # LOCALIZATION NOTE (useASecurelyGeneratedPassword): # Shown in the autocomplete popup to allow filling a generated password into a password field. diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/pipnss/nsserrors.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/pipnss/nsserrors.properties index 5e0f337645e854f21dc31a64af5a74f295223e23..4ff38dd6c5c8167c74d76a0c28961c3fd4039b28 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/pipnss/nsserrors.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/pipnss/nsserrors.properties @@ -17,9 +17,9 @@ SSL_ERROR_POST_WARNING=Nepoznata šifra SSL greške. SSL_ERROR_SSL2_DISABLED=Čvor podržava samo SSL verziju 2, koja je lokalno deaktivirana. SSL_ERROR_BAD_MAC_READ=SSL je primio zapis s netočnom porukom ovjere koda. SSL_ERROR_BAD_MAC_ALERT=SSL čvor obavještava o netočnoj poruci ovjere koda. -SSL_ERROR_BAD_CERT_ALERT=SSL čvor ne može ovjeriti vaš certifikat. -SSL_ERROR_REVOKED_CERT_ALERT=SSL čvor je odbio vaš certifikat kao poništeni. -SSL_ERROR_EXPIRED_CERT_ALERT=SSL čvor je odbio vaš certifikat kao istekli. +SSL_ERROR_BAD_CERT_ALERT=SSL čvor ne može provjeriti tvoj certifikat. +SSL_ERROR_REVOKED_CERT_ALERT=SSL čvor je odbio tvoj certifikat kao poništeni. +SSL_ERROR_EXPIRED_CERT_ALERT=SSL čvor je odbio tvoj certifikat kao istekli. SSL_ERROR_SSL_DISABLED=Spajanje nije moguće: SSL je onemogućen. SSL_ERROR_FORTEZZA_PQG=Spajanje nije moguće: SSL čvor je druga FORTEZZA domena. SSL_ERROR_UNKNOWN_CIPHER_SUITE=Zatražen je nepoznati SSL šifrator. @@ -66,7 +66,7 @@ SSL_ERROR_ILLEGAL_PARAMETER_ALERT=SSL čvor je odbio poruku rukovanja zbog nepri SSL_ERROR_UNSUPPORTED_CERT_ALERT=SSL čvor ne podržava vrstu certifikata koju je primio. SSL_ERROR_CERTIFICATE_UNKNOWN_ALERT=SSL čvor je naišao na nepoznat problem s primljenim certifikatom. SSL_ERROR_GENERATE_RANDOM_FAILURE=SSL je doživio kvar svojeg generatora slučajnog broja. -SSL_ERROR_SIGN_HASHES_FAILURE=Digitalno potpisivanje podataka potrebnih za ovjeru vašeg certifikata nije moguće. +SSL_ERROR_SIGN_HASHES_FAILURE=Digitalno potpisivanje podataka potrebnih za provjeru tvog certifikata nije moguće. SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE=SSL nije mogao izvući javni ključ iz certifikata čvora. SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE=Nepoznati problem pri obradi rukovanja razmjene poslužiteljskog SSL ključa. SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE=Nepoznati problem pri obradi rukovanja razmjene klijentskog SSL ključa. @@ -93,7 +93,7 @@ SSL_ERROR_NO_TRUSTED_SSL_CLIENT_CA=Ne vjeruje se nijednom certifikacijskom tijel SSL_ERROR_SESSION_NOT_FOUND=Klijentov ID SSL prijave nije pronađen u privremenoj memoriji prijava poslužitelja. SSL_ERROR_DECRYPTION_FAILED_ALERT=Čvor nije mogao dešifrirati primljeni SSL zapis. SSL_ERROR_RECORD_OVERFLOW_ALERT=Čvor je primio SSL zapis koji je veći od dopuštenog. -SSL_ERROR_UNKNOWN_CA_ALERT=Čvor ne prepoznaje i ne vjeruje vašem izdavaču certifikata. +SSL_ERROR_UNKNOWN_CA_ALERT=Čvor ne prepoznaje i ne vjeruje tvom izdavaču certifikata. SSL_ERROR_ACCESS_DENIED_ALERT=Čvor je primio valjani certifikat, ali pristup je odbijen. SSL_ERROR_DECODE_ERROR_ALERT=Čvor nije mogao dešifrirati SSL poruku rukovanja. SSL_ERROR_DECRYPT_ERROR_ALERT=Čvor javlja neuspjeh ovjere potpisa ili razmjene ključa. @@ -105,7 +105,7 @@ SSL_ERROR_USER_CANCELED_ALERT=Korisnik čvora je otkazao rukovanje. SSL_ERROR_NO_RENEGOTIATION_ALERT=Čvor ne dozvoljava ponovno pregovaranje sigurnosnih parametara SSL-a. SSL_ERROR_SERVER_CACHE_NOT_CONFIGURED=Privremena memorija SSL poslužitelja nije podešena i nije onemogućena za ovaj priključak. SSL_ERROR_UNSUPPORTED_EXTENSION_ALERT=SSL čvor ne podržava traženo TLS pozdravno proširenje. -SSL_ERROR_CERTIFICATE_UNOBTAINABLE_ALERT=SSL čvor nije mogao dobiti vaš certifikat iz ponuđenog URL-a. +SSL_ERROR_CERTIFICATE_UNOBTAINABLE_ALERT=SSL čvor nije mogao dobiti tvoj certifikat iz ponuđenog URL-a. SSL_ERROR_UNRECOGNIZED_NAME_ALERT=SSL čvor nema nijedan certifikat za traženi DNS naziv. SSL_ERROR_BAD_CERT_STATUS_RESPONSE_ALERT=SSL čvor nije mogao dobiti OCSP odgovor za svoj certifikat. SSL_ERROR_BAD_CERT_HASH_VALUE_ALERT=SSL čvor je prijavio lošu jedinstvenu vrijednost certifikata. @@ -160,7 +160,7 @@ SEC_ERROR_BAD_DATABASE=sigurnosna biblioteka: loša baza podataka. SEC_ERROR_NO_MEMORY=sigurnosna biblioteka: greška pri alokaciji memorije. SEC_ERROR_UNTRUSTED_ISSUER=Izdavača certifikata čvora je korisnik označio kao nepouzdanog. SEC_ERROR_UNTRUSTED_CERT=Certifikata čvora je korisnik označio kao nepouzdani. -SEC_ERROR_DUPLICATE_CERT=Certifikat već postoji u vašoj bazi podataka. +SEC_ERROR_DUPLICATE_CERT=Certifikat već postoji u tvojoj bazi podataka. SEC_ERROR_DUPLICATE_CERT_NAME=Preuzeto ime certifikata podudara se s jednim drugim, koji se već nalazi u tvojoj bazi podataka. SEC_ERROR_ADDING_CERT=Greška pri dodavanju certifikata u bazu podataka. SEC_ERROR_FILING_KEY=Greška pri ponovnom upisivanju ključa za ovaj certifikat. @@ -184,11 +184,11 @@ SEC_ERROR_OLD_CRL=Novi CRL nije kasniji od trenutačnog. SEC_ERROR_NO_EMAIL_CERT=Nije šifrirano ili potpisano: još nemate certifikat e-pošte. SEC_ERROR_NO_RECIPIENT_CERTS_QUERY=Nije šifrirano: nemaš certifikate za svakog primatelja. SEC_ERROR_NOT_A_RECIPIENT=Dešifriranje nije moguće: vi niste primatelj ili odgovarajući certifikat i privatni ključ nisu pronađeni. -SEC_ERROR_PKCS7_KEYALG_MISMATCH=Dešifriranje nije moguće: algoritam šifriranja ključa ne odgovara vašem certifikatu. +SEC_ERROR_PKCS7_KEYALG_MISMATCH=Dešifriranje nije moguće: algoritam šifriranja ključa ne odgovara tvom certifikatu. SEC_ERROR_PKCS7_BAD_SIGNATURE=Ovjera potpisa nije uspjela: nije pronađen nijedan potpisnik, pronađeno je previše potpisnika ili su pronađeni netočni i oštećeni podaci. SEC_ERROR_UNSUPPORTED_KEYALG=Nepodržani ili nepoznati algoritam ključa. SEC_ERROR_DECRYPTION_DISALLOWED=Dešifriranje nije moguće: šifrirano korištenjem nedopuštenog algoritma ili veličine ključa. -XP_SEC_FORTEZZA_BAD_CARD=Fortezza kartica nije ispravno inicijalizirana. Uklonite ju i vratite vašem izdavaču. +XP_SEC_FORTEZZA_BAD_CARD=Fortezza kartica nije ispravno inicijalizirana. Ukloni je i vrati je tvom izdavaču. XP_SEC_FORTEZZA_NO_CARD=Nijedna fortezza kartica nije pronađena XP_SEC_FORTEZZA_NONE_SELECTED=Nijedna fortezza kartica nije odabrana XP_SEC_FORTEZZA_MORE_INFO=Odaberi identitet za daljnje informacije diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/pipnss/pipnss.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/pipnss/pipnss.properties index 8c6a60c1cbc45f807725682709b9930226aef511..1e6ad61467086b601ec3ad0d4c83010ab627302d 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/pipnss/pipnss.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/pipnss/pipnss.properties @@ -307,7 +307,7 @@ CertNoEmailAddress=(bez adrese e-pošte) CaCertExists=Ovaj certifikat je već instaliran kao certifikacijsko tijelo. NotACACert=Ovo nije certifikat certifikacijskog tijela, stoga se ne može uvesti u popis certifikacijskih tijela. UserCertIgnoredNoPrivateKey=Ovaj osobni certifikat ne može biti instaliran jer ne posjedujete odgovarajući privatni ključ koji je stvoren kad je certifikat zatražen. -UserCertImported=Vaš osobni certifikat je instaliran. Trebali biste spremiti sigurnosnu kopiju ovog certifikata. +UserCertImported=Tvoj osobni certifikat je instaliran. Trebao/la bi spremiti sigurnosnu kopiju ovog certifikata. CertOrgUnknown=(Nepoznat) CertNotStored=(Nije spremljeno) CertExceptionPermanent=Stalni diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/pippki/pippki.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/pippki/pippki.properties index 84409d54771e4c7c614b94e989e6247384efe699..7503258b0a0e29332255bd54c83217ac94b187b3 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/pippki/pippki.properties +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/pippki/pippki.properties @@ -67,7 +67,7 @@ pageInfo_Privacy_Encrypted1=Stranica koju gledaš šifrirana je prije slanja put pageInfo_Privacy_Encrypted2=Kriptiranje neovlaštenim osobama otežava pregledavanje informacija koje putuju između računala. Stoga je mala vjerojatnost da je netko pročitao ovu stranicu dok je putovala mrežom. pageInfo_MixedContent=Djelomično šifrirana veza pageInfo_MixedContent2=Dijelovi stranice koju gledaš nisu šifrirani prije slanja putem interneta. -pageInfo_WeakCipher=Veza s ovom stranicom koristi slabu enkripciju, te nije privatna. Ostali ljudi mogu vidjeti vaše informacije ili modificirati ponašanje web stranice. +pageInfo_WeakCipher=Veza s ovom stranicom koristi slabo šifriranje, te nije privatna. Ostali ljudi mogu vidjeti tvoje podatke ili promijeniti ponašanje web stranice. pageInfo_CertificateTransparency_Compliant=Ova web stranica je u skladu s politikom transparentnosti certifikata. # Token Manager diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/pluginproblem/pluginproblem.dtd b/thunderbird-l10n/hr/chrome/hr/locale/hr/pluginproblem/pluginproblem.dtd index 575ff549db8a3770293c588f8bd6a6147eb8681c..a8964f2b2031623e4c3c64a34d6126c648a20c4c 100644 --- a/thunderbird-l10n/hr/chrome/hr/locale/hr/pluginproblem/pluginproblem.dtd +++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/pluginproblem/pluginproblem.dtd @@ -6,7 +6,7 @@ <!ENTITY tapToPlayPlugin "Pritisnite ovdje za aktivaciju priključka."> <!ENTITY clickToActivatePlugin "Aktiviraj priključak."> <!ENTITY checkForUpdates "Provjeri za dopune…"> -<!ENTITY blockedPlugin.label "Ovaj je priključak blokiran radi vaše sigurnosti."> +<!ENTITY blockedPlugin.label "Ovaj je priključak blokiran za tvoju sigurnost."> <!ENTITY hidePluginBtn.label "Sakrij priključak"> <!ENTITY managePlugins "Upravljaj priključcima …"> diff --git a/thunderbird-l10n/hr/localization/hr/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/hr/localization/hr/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..32989e05a8f49186a65ced2a0a17cb7fe8704ccf --- /dev/null +++ b/thunderbird-l10n/hr/localization/hr/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Preusmjeravanje URI kalendara +calendar-uri-redirect-description = + Poslužitelj preusmjerava URI za kalendar "{ $calendarName }". + Prihvati preusmjeravanje i koristi novi URI za kalendar? +calendar-uri-redirect-original-uri-label = Trenutni URI: +calendar-uri-redirect-target-uri-label = Preusmjeravanje na novi URI: diff --git a/thunderbird-l10n/hr/localization/hr/messenger/accountCentral.ftl b/thunderbird-l10n/hr/localization/hr/messenger/accountCentral.ftl index e876cf726c9dc62d589c5151f590df648c90888b..9e15bed088a4edd987bbb9d4c250a8b1f3474f06 100644 --- a/thunderbird-l10n/hr/localization/hr/messenger/accountCentral.ftl +++ b/thunderbird-l10n/hr/localization/hr/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Dobro došli u { -brand-full-name } +account-settings = Postavke računa +# $accounts (Number) - the number of configured accounts setup-title = Odaberi što želiš postaviti about-title = O { -brand-full-name }u resources-title = Resursi @@ -40,3 +42,10 @@ explore-link = Istraži funkcije support-link = Podrška involved-link = Uključi se developer-link = Dokumentacija programera +read = Pročitane poruke +compose = Piši novu poruku +search = Pretraži poruke +filter = Upravljanje filterima za poruke +nntp-subscription = Upravljanje pretplatama na interesne grupe +rss-subscription = Upravljanje pretplatama na kanale +e2e = Potpuno šifriranje od pošiljatelja do primatelja diff --git a/thunderbird-l10n/hr/localization/hr/security/certificates/certManager.ftl b/thunderbird-l10n/hr/localization/hr/security/certificates/certManager.ftl index 874e19b03df38fbefe9c4748ed65fcf45b5fb8f8..5113267330e73d1530a51055b453447faa9d0a1b 100644 --- a/thunderbird-l10n/hr/localization/hr/security/certificates/certManager.ftl +++ b/thunderbird-l10n/hr/localization/hr/security/certificates/certManager.ftl @@ -154,8 +154,8 @@ delete-user-cert-confirm = Jeste li sigurni da želite obrisati ove certifikate? delete-user-cert-impact = Ako obrišete jedan od vlastitih certifikata, više ga nećete moći koristiti za identifikaciju. delete-ssl-cert-title = .title = Obriši iznimku certifikata poslužitelja -delete-ssl-cert-confirm = Jeste li sigurni da želite ukloniti ove iznimke poslužitelja? -delete-ssl-cert-impact = Ako obrišete iznimku poslužitelja, obnavljate uobičajene sigurnosne provjere za te poslužitelje i uvjete o ispravnim certifikatima. +delete-ssl-cert-confirm = Zaista želiš ukloniti ove iznimke poslužitelja? +delete-ssl-cert-impact = Ako izbrišeš iznimku poslužitelja, obnavljaš uobičajene sigurnosne provjere za te poslužitelje i uvjetuješ upotrebu ispravnih certifikata. delete-ca-cert-title = .title = Brisanje ili poništavanje povjerenja CA certifikata delete-ca-cert-confirm = Zatražio/la si brisanje ovih CA certifikata. Za ugrađene certifikate uklonit će se sva povjerenja, što ima isti efekt. Zaista želiš obrisati certifikate ili poništiti povjerenje? diff --git a/thunderbird-l10n/hr/localization/hr/security/certificates/deviceManager.ftl b/thunderbird-l10n/hr/localization/hr/security/certificates/deviceManager.ftl index af0f736a0b0bd85d74599161e28531c18534d9de..9934f8acdc5802257d3f36bce92abed7e0aa0b9e 100644 --- a/thunderbird-l10n/hr/localization/hr/security/certificates/deviceManager.ftl +++ b/thunderbird-l10n/hr/localization/hr/security/certificates/deviceManager.ftl @@ -50,7 +50,7 @@ load-device-filename = .value = Naziv datoteke modula .accesskey = d load-device-browse = - .label = Pretraži... + .label = Pregledaj … .accesskey = P ## Token Manager diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutAddons.ftl index 1a4d502fb495605ef319be95e383ccc9594af376..281ad6b25912b8f23bb91c0dc0e17d45af4b0b4f 100644 --- a/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Instaliraj dodatak iz datoteke… .accesskey = I help-button = Podrška za dodatke +sidebar-help-button-title = + .title = Podrška za dodatke preferences = { PLATFORM() -> [windows] { -brand-short-name } Mogućnosti @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Alati za sve dodatke +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } Mogućnosti + *[other] { -brand-short-name } Postavke + } show-unsigned-extensions-button = .label = Neka proširenja nisu mogla biti verificirana show-all-extensions-button = @@ -106,7 +114,7 @@ detail-private-disallowed-description2 = Ovaj dodatak se ne pokreće tijekom pri # Some special add-ons are privileged, run in private windows automatically, and this permission can't be revoked detail-private-required-label = Zahtjeva pristup u privatnim prozorima detail-private-required-description = Ovaj dodatak ima pristup tvojoj aktivnosti dok si u privatnom pretraživanju. <label data-l10n-name="detail-private-browsing-learn-more">Saznaj više</label> -detail-private-required-description2 = Ovo proširenje ima pristup vašim internetskim aktivnostima tijekom privatnog pregledavanja. <a data-l10n-name="learn-more">Saznaj više</a> +detail-private-required-description2 = Ovo proširenje ima pristup tvojim internetskim aktivnostima tijekom privatnog pregledavanja. <a data-l10n-name="learn-more">Saznaj više</a> detail-private-browsing-on = .label = Dozvoli .tooltiptext = Omogući u privatnom pretraživanju @@ -166,13 +174,29 @@ extensions-view-available-updates = .name = Dostupne dopune .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Preporuke +addon-category-discover-title = + .title = Preporuke addon-category-extension = Dodaci +addon-category-extension-title = + .title = Dodaci addon-category-theme = Motivi +addon-category-theme-title = + .title = Motivi addon-category-plugin = Priključci +addon-category-plugin-title = + .title = Priključci addon-category-dictionary = Rječnici +addon-category-dictionary-title = + .title = Rječnici addon-category-locale = Jezici +addon-category-locale-title = + .title = Jezici addon-category-available-updates = Dostupne dopune +addon-category-available-updates-title = + .title = Dostupne dopune addon-category-recent-updates = Nedavne dopune +addon-category-recent-updates-title = + .title = Nedavne dopune ## These are global warnings @@ -246,7 +270,7 @@ addon-updates-reset-updates-to-manual = Postavi ručno ažuriranje za sve dodatk extensions-updates-updating = .value = Ažuriranje dodataka extensions-updates-installed = - .value = Vaši su dodaci ažurirani. + .value = Tvoji su dodaci aktualizirani. extensions-updates-downloaded = .value = Dopune za tvoje dodatke su preuzete. extensions-updates-restart = @@ -259,7 +283,7 @@ extensions-updates-update-selected = .label = Instaliraj dopune .tooltiptext = Instaliraj dostupne dopune s ovog popisa addon-updates-updating = Ažuriranje dodataka -addon-updates-installed = Vaši su dodaci ažurirani. +addon-updates-installed = Tvoji su dodaci aktualizirani. addon-updates-none-found = Nema dopuna addon-updates-manual-updates-found = Prikaži dostupne dopune @@ -311,6 +335,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Prikaži manje go-back-button = .tooltiptext = Idi natrag +header-back-button = + .title = Idi natrag ## Recommended add-ons page diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutRights.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutRights.ftl index ec66af4ebff202144ef364e0d0a67e902ac26c88..401277f2ecfd1fac9a10139ab902c7e8130f2506 100644 --- a/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutRights.ftl +++ b/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutRights.ftl @@ -2,7 +2,7 @@ # 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/. -rights-title = O vašim pravima +rights-title = O tvojim pravima rights-intro = { -brand-full-name } je slobodan program otvorenog koda, koju je izradila zajednica od tisuću osoba iz cijelog svijeta. Neke podatke trebaš znati: rights-intro-point-1 = { -brand-short-name } je dostupan pod uvjetima <a data-l10n-name="mozilla-public-license-link">Mozilline javne licence</a>. To znači da možeš koristiti, kopirati i distribuirati { -brand-short-name } drugima. Također smiješ mijenjati izvorni kod { -brand-short-name } kako god želiš. Mozillina javna licenca daje ti pravo distribuirati promijenjene verzije. rights-intro-point-2 = Nisu vam odobrena nikakva prava na zaštitni znak ili licenciranje zaštitnih znakova Mozilla fundacije ili bilo kojih drugih strana, uključujući, ali ne i ograničeno na, ime Firefox ili logo. Dodatne informacije o zaštitnim znacima možete naći <a data-l10n-name="mozilla-trademarks-link">ovdje</a>. diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutSupport.ftl index f90223515d58e32d0066d352aaf03e871771de46..0a4af97701431472dcab75cef4437b6707f222a0 100644 --- a/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutSupport.ftl @@ -74,7 +74,7 @@ modified-key-prefs-title = Važne izmijenjene postavke modified-prefs-name = Naziv modified-prefs-value = Vrijednost user-js-title = user.js osobitosti -user-js-description = Vaš profil sadrži <a data-l10n-name="user-js-link">user.js datoteku</a>, koja uključuje osobitosti koje nije stvorio { -brand-short-name }. +user-js-description = Tvoj profil sadrži <a data-l10n-name="user-js-link">user.js datoteku</a>, koja uključuje osobitosti koje nije stvorio { -brand-short-name }. locked-key-prefs-title = Važne zaključane postavke locked-prefs-name = Naziv locked-prefs-value = Vrijednost @@ -211,7 +211,7 @@ text-copied = Tekst kopiran u međuspremnik ## The verb "blocked" here refers to a graphics feature such as "Direct2D" or "OpenGL layers". blocked-driver = Blokirano zbog verzije upravljačkog programa grafičke kartice. -blocked-gfx-card = Blokirano za vašu grafičku karticu zbog neriješenih problema s upravljačkim programom. +blocked-gfx-card = Blokirano za tvoju grafičku karticu zbog neriješenih problema s upravljačkim programom. blocked-os-version = Blokirano za verziju tvog operacijskog sustava. blocked-mismatched-version = Blokiran zbog nepodudaranja verzije upravljačkog programa tvoje grafičke kartice između registra i DLL-a. # Variables diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/about/certviewer.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/about/certviewer.ftl index bc8603da098ceb190d0dc22c96e5d6a63bfba300..e08ca62dd4cd5a93005311f72dc2b5e7859186b2 100644 --- a/thunderbird-l10n/hr/localization/hr/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/hr/localization/hr/toolkit/about/certviewer.ftl @@ -39,7 +39,7 @@ certificate-viewer-modulus = Modul certificate-viewer-name = Naziv certificate-viewer-not-after = Ne nakon certificate-viewer-not-before = Ne prije -certificate-viewer-organization = Tvrtka +certificate-viewer-organization = Organizacija certificate-viewer-organizational-unit = Poslovna jedinica certificate-viewer-policy = Pravila certificate-viewer-protocol = Protokol diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/global/createProfileWizard.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/global/createProfileWizard.ftl index 698bcb6caeba88ff14ca79628fef1e95d4828759..f21e619226fa585af4753fcbc9c6187d96ee58bd 100644 --- a/thunderbird-l10n/hr/localization/hr/toolkit/global/createProfileWizard.ftl +++ b/thunderbird-l10n/hr/localization/hr/toolkit/global/createProfileWizard.ftl @@ -13,13 +13,13 @@ create-profile-first-page-header = [macos] Uvod *[other] Dobrodošli u { create-profile-window.title } } -profile-creation-explanation-1 = { -brand-short-name } sprema informacije o vašim postavkama i osobitostima u vaš osobni profil. +profile-creation-explanation-1 = { -brand-short-name } sprema informacije o tvojim postavkama i osobitostima u tvoj osobni profil. profile-creation-explanation-2 = Ako ovu kopiju { -brand-short-name }a dijelite s ostalima, možete koristiti profile kako biste informacije svakog korisnika držali odvojenima. Da biste to uradili, svaki korisnik bi trebao stvoriti svoj vlastiti profil. profile-creation-explanation-3 = Ako si jedini korisnik ove verzije { -brand-short-name }a, moraš imati barem jedan profil. Ako želiš, možeš stvoriti više profila za spremanje različitih postavki i osobitosti. Na primjer, možeš imati odvojene profile za poslovnu i osobnu upotrebu. profile-creation-explanation-4 = { PLATFORM() -> - [macos] Za početak stvaranja vašeg profila, kliknite na Nastavi. - *[other] Za početak stvaranja vašeg profila, kliknite na Dalje. + [macos] Za početak stvaranja tvog profila, klikni na Nastavi. + *[other] Za početak stvaranja tvog profila, klikni na Dalje. } ## Second wizard page @@ -34,7 +34,7 @@ profile-prompt = Upiši ime novog profila: .accesskey = e profile-default-name = .value = Standardni korisnik -profile-directory-explanation = Vaše korisničke postavke, osobitosti i ostali korisnički podaciti biti će spremljeni u: +profile-directory-explanation = Tvoje korisničke postavke, osobitosti i ostali korisnički podaci bit će spremljeni u: create-profile-choose-folder = .label = Odaberi mapu... .accesskey = m diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..81a85ceff1f33adbed88ed1a1d51603fc7134264 --- /dev/null +++ b/thunderbird-l10n/hr/localization/hr/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Pokrenuo/la si stariju verziju { -brand-product-name }a + .style = width: 490px; +profiledowngrade-window-create = + .label = Stvori novi profil +profiledowngrade-sync = Korištenje starije verzije { -brand-product-name }a može oštetiti zabilješke i povijest pretraživanja koje su već spremljene u postojeći { -brand-product-name } profil. Za zaštitu tvojih podataka, stvori novi profil za ovu { -brand-short-name } instalaciju. Uvijek se možeš prijaviti u svoj { -fxaccount-brand-name } i sinkronizirati svoje zabilješke i povijest pretraživanja između profila. +profiledowngrade-nosync = Korištenje starije verzije { -brand-product-name }a može oštetiti zabilješke i povijest pretraživanja koje su već spremljene u postojeći { -brand-product-name } profil. Za zaštitu tvojih podataka, stvori novi profil za ovu { -brand-short-name } instalaciju. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Izlaz + *[other] Izlaz + } diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/global/profileSelection.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/global/profileSelection.ftl index 33bea480cfac9cab80b73f187454a533b1e13d8b..c01028d5a6d9bef82a1062d7b6b85afe514c7da1 100644 --- a/thunderbird-l10n/hr/localization/hr/toolkit/global/profileSelection.ftl +++ b/thunderbird-l10n/hr/localization/hr/toolkit/global/profileSelection.ftl @@ -20,7 +20,7 @@ profile-selection-delete-button = ## Messages used in the profile manager -profile-manager-description = { -brand-short-name } sprema informacije o vašim postavkama, osobitostima i ostale korisničke stavke u vaš korisnički profil. +profile-manager-description = { -brand-short-name } sprema informacije o tvojim postavkama, osobitostima i ostale korisničke stavke u tvoj korisnički profil. profile-manager-work-offline = .label = Izvanmrežni rad .accesskey = I diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/passwordmgr/passwordManagerList.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/passwordmgr/passwordManagerList.ftl index 888de3f9ccc00692adf41ff1795129f295a081b2..8781be7ca3ba5baafd9939204d5e6d81b2c955b9 100644 --- a/thunderbird-l10n/hr/localization/hr/toolkit/passwordmgr/passwordManagerList.ftl +++ b/thunderbird-l10n/hr/localization/hr/toolkit/passwordmgr/passwordManagerList.ftl @@ -60,8 +60,8 @@ show-passwords = hide-passwords = .label = Sakrij lozinke .accesskey = P -logins-description-all = Prijave za sljedeće stranice su spremljene na vašem računalu -logins-description-filtered = Sljedeće prijave odgovaraju vašoj pretrazi: +logins-description-all = Prijave za sljedeće stranice su spremljene na tvom računalu +logins-description-filtered = Sljedeće prijave odgovaraju tvojoj pretrazi: remove-all = .label = Ukloni sve .accesskey = e diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/preferences/preferences.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/preferences/preferences.ftl index 73c84e2c9f90da683dd0fc08137f8996b60632d7..3d41b84c70250757fd43b4fa6c09eda9fc325999 100644 --- a/thunderbird-l10n/hr/localization/hr/toolkit/preferences/preferences.ftl +++ b/thunderbird-l10n/hr/localization/hr/toolkit/preferences/preferences.ftl @@ -7,7 +7,7 @@ password-not-set = failed-pw-change = Nije moguće promijeniti glavnu lozinku. incorrect-pw = Trenutačna glavna lozinka nije točno upisana. Pokušaj ponovo. pw-change-ok = Glavna lozinka je uspješno promijenjena. -pw-empty-warning = Vaše web i lozinke e-pošte, podaci formulara i privatni ključevi neće biti zaštićeni. +pw-empty-warning = Tvoje spremljene internetske lozinke i lozinke e-pošte, podaci formulara i privatni ključevi neće biti zaštićeni. pw-erased-ok = Tvoja glavna lozinka je obrisana. { pw-empty-warning } pw-not-wanted = Upozorenje! Odabrano je da se ne koristi glavna lozinka. { pw-empty-warning } pw-change2empty-in-fips-mode = Trenutačno si u FIPS modu. FIPS ne dopušta praznu glavnu lozinku. diff --git a/thunderbird-l10n/hr/manifest.json b/thunderbird-l10n/hr/manifest.json index 1b4f4144a158df7ae0cd97c754d0c81aad1b6624..70bc08010e0b3d909ad5510c011ece678abea9a5 100644 --- a/thunderbird-l10n/hr/manifest.json +++ b/thunderbird-l10n/hr/manifest.json @@ -1,57 +1,57 @@ { - "version": "76.0buildid20200407173003", + "langpack_id": "hr", + "sources": { + "browser": { + "base_path": "browser/" + } + }, + "author": "mozilla.org (contributors: Mihovil Stanić, Saša Teković)", + "manifest_version": 2, + "version": "76.0buildid20200420212409", + "description": "Language pack for Thunderbird for hr", "applications": { "gecko": { - "id": "langpack-hr@thunderbird.mozilla.org", "strict_min_version": "76.0", + "id": "langpack-hr@thunderbird.mozilla.org", "strict_max_version": "76.*" } }, - "sources": { - "browser": { - "base_path": "browser/" - } - }, "languages": { "hr": { + "version": "20200416101533", "chrome_resources": { - "communicator": "chrome/hr/locale/hr/communicator/", - "devtools-startup": "chrome/hr/locale/hr/devtools/startup/", - "alerts": "chrome/hr/locale/hr/alerts/", + "branding": "chrome/hr/locale/hr/branding/", + "passwordmgr": "chrome/hr/locale/hr/passwordmgr/", + "autoconfig": "chrome/hr/locale/hr/autoconfig/", "places": "chrome/hr/locale/hr/places/", + "chat": "chrome/hr/locale/hr/chat/", + "mozapps": "chrome/hr/locale/hr/mozapps/", + "messenger-region": "chrome/hr/locale/hr/messenger-region/", + "messenger-smime": "chrome/hr/locale/hr/messenger-smime/", + "global": "chrome/hr/locale/hr/global/", + "devtools-shared": "chrome/hr/locale/hr/devtools/shared/", "necko": "chrome/hr/locale/hr/necko/", - "pluginproblem": "chrome/hr/locale/hr/pluginproblem/", - "pippki": "chrome/hr/locale/hr/pippki/", - "lightning": "chrome/hr/locale/hr/lightning/", - "autoconfig": "chrome/hr/locale/hr/autoconfig/", - "messenger-mapi": "chrome/hr/locale/hr/messenger-mapi/", + "messenger": "chrome/hr/locale/hr/messenger/", + "pipnss": "chrome/hr/locale/hr/pipnss/", + "alerts": "chrome/hr/locale/hr/alerts/", "calendar": "chrome/hr/locale/hr/calendar/", - "chat": "chrome/hr/locale/hr/chat/", + "lightning": "chrome/hr/locale/hr/lightning/", + "pippki": "chrome/hr/locale/hr/pippki/", "mozldap": "chrome/hr/locale/hr/mozldap/", + "communicator": "chrome/hr/locale/hr/communicator/", + "devtools": "chrome/hr/locale/hr/devtools/client/", + "messenger-newsblog": "chrome/hr/locale/hr/messenger-newsblog/", + "messenger-mapi": "chrome/hr/locale/hr/messenger-mapi/", + "pluginproblem": "chrome/hr/locale/hr/pluginproblem/", "global-platform": { - "macosx": "chrome/hr/locale/hr/global-platform/mac/", - "linux": "chrome/hr/locale/hr/global-platform/unix/", "android": "chrome/hr/locale/hr/global-platform/unix/", - "win": "chrome/hr/locale/hr/global-platform/win/" + "win": "chrome/hr/locale/hr/global-platform/win/", + "macosx": "chrome/hr/locale/hr/global-platform/mac/", + "linux": "chrome/hr/locale/hr/global-platform/unix/" }, - "messenger-newsblog": "chrome/hr/locale/hr/messenger-newsblog/", - "global": "chrome/hr/locale/hr/global/", - "branding": "chrome/hr/locale/hr/branding/", - "devtools": "chrome/hr/locale/hr/devtools/client/", - "messenger": "chrome/hr/locale/hr/messenger/", - "mozapps": "chrome/hr/locale/hr/mozapps/", - "passwordmgr": "chrome/hr/locale/hr/passwordmgr/", - "messenger-region": "chrome/hr/locale/hr/messenger-region/", - "devtools-shared": "chrome/hr/locale/hr/devtools/shared/", - "pipnss": "chrome/hr/locale/hr/pipnss/", - "messenger-smime": "chrome/hr/locale/hr/messenger-smime/" - }, - "version": "20200404082246" + "devtools-startup": "chrome/hr/locale/hr/devtools/startup/" + } } }, - "description": "Language pack for Thunderbird for hr", - "author": "mozilla.org (contributors: Mihovil Stanić, Saša Teković)", - "langpack_id": "hr", - "name": "Hrvatski (HR) Language Pack", - "manifest_version": 2 + "name": "Hrvatski (HR) Language Pack" } diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/calendar/calendar.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/calendar/calendar.properties index 044864c546fb2bddbb9125061daf73b57b294540..16c0bb5b44fc262047db7819c06e03f1a1df2b2f 100644 --- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/calendar/calendar.properties +++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/calendar/calendar.properties @@ -282,7 +282,6 @@ filterIcs=iCalendar (%1$S) filterXml=XML-dokument (%1$S) filterHtml=Webstrona (%1$S) filterOutlookCsv=Outlook, hódnoty dźělene přez komu (%1$S) -filterWav=Awdioformat WAVE (%1$S) # Remote calendar errors genericErrorTitle=Zmylk je wustupił @@ -331,7 +330,7 @@ caldavRequestStatusCodeString404=Resursa njeje so namakała. caldavRequestStatusCodeString409=Resursowy konflikt. caldavRequestStatusCodeString412=Předpokład spjelnjeny njeje. caldavRequestStatusCodeString500=Nutřkowny serwerowy zmylk. -caldavRequestStatusCodeString502=Gateway ze zmylkami (proksy-konfiguracija?). +caldavRequestStatusCodeString502=Gateway ze zmylkami (proksykonfiguracija?). caldavRequestStatusCodeString503=Nutřkowny serwerowy zmylk (nachwilny wupad serwera?). caldavRedirectTitle=Městno za protyku %1$S aktualizować? caldavRedirectText=Naprašowanja za %1$S so do noweho městna dale sposrědkuja. Chceće městno do slědowaceje hódnoty změnić? @@ -662,7 +661,7 @@ daysIntervalInMonth.monthFormat=nominative # %2$S will be replaced with the day-index of the start date possibly followed by an ordinal symbol # %3$S will be replaced with name of the month of the end date # %4$S will be replaced with the day-index of the end date possibly followed by an ordinal symbol -# %5$S will be replaced with the commmon year of both dates +# %5$S will be replaced with the common year of both dates # The presence of the ordinal symbol in the day-indexes depends on the string # dayOrdinalSymbol in dateFormat.properties daysIntervalBetweenMonths=%2$S %1$S – %4$S %3$S %5$S @@ -792,13 +791,13 @@ modifyConflictPromptButton2=Tute změny zaćisnyć # in the tooltip and the visible name for an attendee in the event summary dialog - don't add # leading or trailing whitespaces here # %1$S - a single delegatee or a comma separated list of delegatees -# delegation is different from simple invitation forwarding - in case of delegation the orignal +# delegation is different from simple invitation forwarding - in case of delegation the original # invited attendee gets replaced dialog.attendee.append.delegatedFrom=(wot %1$S delegowany) # LOCALIZATION_NOTE(dialog.attendee.append.delegatedTo): this is appended behind an attendee name # in the tooltip for an attendee in the event summary dialog - don't add leading or trailing # whitespaces here -# delegation is different from simple invitation forwarding - in case of delegation the orignal +# delegation is different from simple invitation forwarding - in case of delegation the original # invited attendee gets replaced dialog.attendee.append.delegatedTo=(na %1$S delegowany) diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/devtools/client/inspector.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/devtools/client/inspector.properties index 503d1ebd87d380b765a2938d804acccf46abf015..e81db6f5194237577e22bd62b9e27c6604222801 100644 --- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/devtools/client/inspector.properties +++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Tutón element ma kulomny přeběžk. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Žane přisłušne prawidło +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Dźeržće Umsch stłóčeny a klikńće, zo byšće k prawidłu skočił + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/appstrings.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/appstrings.properties index 82c4d3b128b31c47c320baf6f15ee7174f83c82c..b8d94d8690637ac8f46d64e773384ebca29489ff 100644 --- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/appstrings.properties +++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/appstrings.properties @@ -19,8 +19,8 @@ notCached=Tutón dokument hižo k dispoziciji njesteji. netOffline=Tutón dokument njeda so zwobraznić, mjeztym zo sće offline. Zo byšće online šoł, wotstrońće hóčku z Offline dźěłać w meniju Dataja. isprinting=Dokument njeda so změnić, mjeztym zo ćišćeće abo sće w ćišćerskim přehledźe. deniedPortAccess=Přistup k podatemu portowemu čisłu je so z wěstotnych přičinow znjemóžnił. -proxyResolveFailure=Proksy-serwer, kotryž sće konfigurował, njeda so namakać. Prošu přepruwujće swoje proksy-nastajenja a spytajće hišće raz. -proxyConnectFailure=Při pospyće so z proksy-serwerom, kotryž sće konfigurował, do zwiska stajić, bu zwisk wotpokazany. Prošu přepruwujće proksy-nastajenja a spytajće hišće raz. +proxyResolveFailure=Proksyserwer, kotryž sće konfigurował, njeda so namakać. Prošu přepruwujće swoje proksynastajenja a spytajće hišće raz. +proxyConnectFailure=Při pospyće so z proksyserwerom, kotryž sće konfigurował, do zwiska stajić, bu zwisk wotpokazany. Prošu přepruwujće proksynastajenja a spytajće hišće raz. contentEncodingError=Strona, kotruž pospytujeće sej wobhladać, njeda so pokazać, dokelž njepłaćiwu abo njepodpěrowanu formu zhusćenja wužiwa. unsafeContentType=Strona, kotruž chceće sej wobhladać, njeda so pokazać, dokelž je w datajowym typje wobsahowana, kotryž njeda so wěsće wočinić. Prošu stajće so z wobsedźerjemi websydła do zwiska, zo byšće jich wo tutym problemje informował. externalProtocolTitle=Naprašowanje eksterneho protokola diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/css.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/css.properties index 91362970ece8ada7edc5d9c6f7a58760c5543dde..07595829db2e123f45147ae6998fc4f52198335b 100644 --- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/css.properties +++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=Stilowa předłoha %1$S so wužiwa jako CSS, hačrunjež jeje MIM PEUnexpEOF2=Njewočakowany kónc dataje při pytanju za %1$S. PEParseRuleWSOnly=Znamješkowy rjećazk jenož z mjezeru podaty, zo by so jako prawidło analyzował. + PEDeclDropped=Deklaracija wuwostajena. PEDeclSkipped=K přichodnej deklaraciji skočene. PEUnknownProperty=Njeznata kajkosć '%1$S'. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Jenož jedyn repeat(auto-fill, …) je PEMoreThanOneGridRepeatAutoFillFitInTrackList=Jenož jedyn repeat(auto-fill, …) abo repeat(auto-fit, …) je w slědowanskej lisćinje dowoleny. PEMoreThanOneGridRepeatTrackSize=Jenož jedna slědowanska wulkosć je znutřka repeat(auto-fit/auto-fill, …) dowolena. +PEDisallowedImportRule=Prawidła @import hišće w spłodźenych stilowych předłohach płaćiwe njejsu. + TooLargeDashedRadius=Ramikowy radius je přewulki za ‘smužkowaty’ stil (limit je 100000px). TooLargeDottedRadius=Ramikowy radius je přewulki za ‘dypkowaty’ stil (limit je 100000px). diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/netError.dtd b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/netError.dtd index 7d7e50875fae669f52a3fee063252f27e0095e5b..ccd724119a9f3b83cf6e21532e6192b276451551 100644 --- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/netError.dtd +++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/netError.dtd @@ -52,11 +52,11 @@ <!ENTITY unknownProtocolFound.title "Njeznaty protokol"> <!ENTITY unknownProtocolFound.longDesc "<p>Adresa podawa protokol (na př. <q>wxyz://</q>), kotryž wobhladowak njepřipóznawa, tak zo wobhladowak njemóže prawje ze sydłom zwjazać.</p><ul><li>Pospytujeće na multimedia abo druhe njetekstowe słužby přistup měć? Přepruwujće sydło za wosebitymi potrěbnosćemi.</li><li>Někotre protokole trjebaja programy třećich abo tykače, prjedy hač wobhladowak móže je připóznać.</li></ul>"> -<!ENTITY proxyConnectFailure.title "Proksy serwera je zwisk wotpokazał"> -<!ENTITY proxyConnectFailure.longDesc "<p>Wobhladowak je so konfigurował, zo by so proksyjowy serwer wužiwa, ale proksy zwisk wotpokaza.</p><ul><li>Je konfiguracija proksy wobhladowaka korektna? Přepruwujće nastajenja a spytajće hišće raz.</li><li>Dowola słužba proksy zwiski z tuteje syće?</li><li>Maće hišće ćeže? Skonsultujće swojeho syćoweho administratora abo internetneho poskićowarja za podpěru.</li></ul>"> +<!ENTITY proxyConnectFailure.title "Proksyserwer je zwisk wotpokazał"> +<!ENTITY proxyConnectFailure.longDesc "<p>Wobhladowak je so konfigurował, zo by so proksyserwer wužiwa, ale proksy zwisk wotpokaza.</p><ul><li>Je konfiguracija proksy wobhladowaka korektna? Přepruwujće nastajenja a spytajće hišće raz.</li><li>Dowola słužba proksy zwiski z tuteje syće?</li><li>Maće hišće ćeže? Skonsultujće swojeho syćoweho administratora abo internetneho poskićowarja za podpěru.</li></ul>"> -<!ENTITY proxyResolveFailure.title "Proksyjowy serwer njenamakany"> -<!ENTITY proxyResolveFailure.longDesc "<p>Wobhladowak je so konfigurował, zo by so proksyjowy serwer wužiwa, ale proksy njeda so namakać.</p><ul><li>Je konfiguracija proksyja wobhladowaka korektna? Přepruwujće nastajenja a spytajće hišće raz.</li><li>Je ličak z aktiwnej syću zwjazany?</li><li>Maće hišće ćeže? Stajće so ze swojim syćowym administratorom abo internetnym poskićowarjom za podpěru do zwiska.</li></ul>"> +<!ENTITY proxyResolveFailure.title "Proksyserwer njenamakany"> +<!ENTITY proxyResolveFailure.longDesc "<p>Wobhladowak je so konfigurował, zo by so proksyserwer wužiwa, ale proksy njeda so namakać.</p><ul><li>Je konfiguracija proksyja wobhladowaka korektna? Přepruwujće nastajenja a spytajće hišće raz.</li><li>Je ličak z aktiwnej syću zwjazany?</li><li>Maće hišće ćeže? Stajće so ze swojim syćowym administratorom abo internetnym poskićowarjom za podpěru do zwiska.</li></ul>"> <!ENTITY redirectLoop.title "Sekla dalesposrědkowanja"> <!ENTITY redirectLoop.longDesc "<p>Wobhladowak přesta požadany objekt wotwołować. Sydło sposrědkuje naprašowanje na wašnje, kotrež so njekónči.</p><ul><li>Sće placki znjemóžnił abo zablokował, kotrež su trěbne za tute sysdło?</li><li><em>KEDŹBU</em>: Jeli akceptowanje plackow tutoho sydła problem njerozrisa, je to najskerje problem konfiguracije serwera a nic wašeho ličaka.</li></ul>"> diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/security/security.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/security/security.properties index a93de432fbe55fd95d026f10ee6861b45ace00ae..89d8fd7e9884fb24486c95c2f867cc4625a54d03 100644 --- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/security/security.properties +++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Začitanje je so přez X-Frame-Options wotpokazało: “%1$S” z “% # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Začitanje je so přez X-Frame-Options wotpokazało: “%1$S” z “%2$S”, sydło rozdźělne žórła we wobłuku z “%3$S”njedowoluje. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Njepłaćiwa hłowa X-Frame-Options je so při čitanju “%2$S” namakała: “%1$S” płaćiwa direktiwa njeje. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=Začitanje “%2$S” we wobłuku je so přez direktiwu X-Frame-Options“ wotpokazało, kotraž je na “%1$S“ stajena. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Njewěste naprašowanje “%1$S” so aktualizuje, zo by “%2$S” wužiwało. diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/addons.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/addons.properties index 1b2225374126ae8d4c3220be5b7fb2bacf9995b0..f6ab27d10240792d6fe5b4e7ee1e213f62cadcf3 100644 --- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/addons.properties +++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/addons.properties @@ -211,7 +211,7 @@ webextPerms.description.nativeMessaging=Wuměńće powěsće z druhimi programam webextPerms.description.notifications=Zdźělenki na was pokazać webextPerms.description.pkcs11=Kryptografiske awtentifikowanske słužby wobstarać webextPerms.description.privacy=Nastajenja priwatnosće čitać a změnić -webextPerms.description.proxy=Proksy-nastajenja wobhladowaka kontrolować +webextPerms.description.proxy=Proksynastajenja wobhladowaka kontrolować webextPerms.description.sessions=Mějće přistup na njedawno začinjene rajtarki webextPerms.description.tabs=Mějće přistup na rajtarki wobhladowaka webextPerms.description.tabHide=Rajtarki wobhladowaka schować a pokazać diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/am-im.dtd b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/am-im.dtd index f358a03b62b8778e2144758284acd94cdc499453..c0a02d055e7fd2e58e4c3d1de477013d81ee8b67 100644 --- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/am-im.dtd +++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/am-im.dtd @@ -11,6 +11,6 @@ <!ENTITY account.alias "Alias:"> <!ENTITY account.newMailNotification "Wo nowej e-mejlu informować"> <!ENTITY account.autojoin "Awtomatisce zastupjene kanale:"> -<!ENTITY account.proxySettings.caption "Proksy-nastajenja:"> +<!ENTITY account.proxySettings.caption "Proksynastajenja:"> <!ENTITY account.proxySettings.change.label "Změnić…"> <!ENTITY account.proxySettings.change.accessKey "Z"> diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/imAccountWizard.dtd b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/imAccountWizard.dtd index d97d74853305755181784e4d1a768e8d166f0d7b..2591c5ee02c49fd682cd0a2797d09be861eafcf7 100644 --- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/imAccountWizard.dtd +++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/imAccountWizard.dtd @@ -23,7 +23,7 @@ <!ENTITY accountAliasGroupbox.caption "Lokalny alias"> <!ENTITY accountAliasField.label "Alias:"> <!ENTITY accountAliasInfo.label "To zwobrazni so we wašich konwersacijach jenož potom, hdyž komunikujeće, zdalone kontakty njebudu to widźeć."> -<!ENTITY accountProxySettings.caption "Proksy-nastajenja"> +<!ENTITY accountProxySettings.caption "Proksynastajenja"> <!ENTITY accountProxySettings.change.label "Změnić…"> <!ENTITY accountProxySettings.change.accessKey "Z"> diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/importMsgs.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/importMsgs.properties index 7b0abc2ef5d4fc168525b7c9d48f13360e8ee939..fbe33f93c7f68dffe3480b36c322e669cf424a0e 100644 --- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/importMsgs.properties +++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/importMsgs.properties @@ -2,7 +2,7 @@ # 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/. -# The following are used by the import code to display status/error +# The following are used by the import code to display status/error # and informational messages # Success message when no address books are found to import @@ -10,7 +10,7 @@ ## @loc None 2000=Žane adresniki za importowanje njenamakane. -# Error: Address book import not intialized +# Error: Address book import not initialized ## @name IMPORT_ERROR_AB_NOTINITIALIZED ## @loc None 2001=Njeje móžno, adresniki importować: Zmylk inicializowanja. @@ -31,7 +31,7 @@ ## @loc None 2004=Žane póstowe kašćiki za importowanje namakane -# Error: Mailbox import not intialized +# Error: Mailbox import not initialized ## @name IMPORT_ERROR_MB_NOTINITIALIZED ## @loc None 2005=Njeje móžno, póstowe kašćiki importować, inicializowanski zmylk @@ -44,7 +44,7 @@ # Error: Unable to create the proxy object for importing mailboxes ## @name IMPORT_ERROR_MB_NOPROXY ## @loc None -2007=Njeje móžno, póstowe kašćiki importować, objekt proksy za cilowe póstowe kašćiki njeda so wutworić +2007=Njeje móžno, póstowe kašćiki importować, proksyobjekt za cilowe póstowe kašćiki njeda so wutworić # Error: Error creating destination mailboxes ## @name IMPORT_ERROR_MB_FINDCHILD diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/messenger.dtd b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/messenger.dtd index 7d8f1532d3536afe55a1c32ae104bae950a9f831..a51578d07feb13f16990aae503bf9da1beec890c 100644 --- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/messenger.dtd +++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Powěsće pytać…"> <!ENTITY searchMailCmd.accesskey "o"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Globalne pytanje…"> +<!ENTITY glodaSearchCmd.accesskey "G"> <!ENTITY searchAddressesCmd.label "Adresy pytać…"> <!ENTITY searchAddressesCmd.accesskey "A"> diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/netError.dtd b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/netError.dtd index de9af009ea616d0967a3f3bd9c8b517127af98ed..f973cd157a4506228003be22edde735295decbc8 100644 --- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/netError.dtd +++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/netError.dtd @@ -55,11 +55,11 @@ <!ENTITY unknownProtocolFound.title "Adresa njebu zrozumjena"> <!ENTITY unknownProtocolFound.longDesc "<ul> <li>Je móžno, zo dyrbiće druhu softwaru instalować, zo byšće tutu adresu wočinił.</li> </ul>"> -<!ENTITY proxyConnectFailure.title "Proksy-serwer zwiski wotpokazuje"> -<!ENTITY proxyConnectFailure.longDesc "<ul> <li>Přepruwujće proksy-nastajenja, zo byšće zawěsćił, zo su korektne.</li> <li>Stajće so ze swojim syćowym administratorom do zwiska, zo byšće zawěsćił, za proksy-serwer dźěła.</li> </ul>"> +<!ENTITY proxyConnectFailure.title "Proksyserwer zwiski wotpokazuje"> +<!ENTITY proxyConnectFailure.longDesc "<ul> <li>Přepruwujće proksynastajenja, zo byšće zawěsćił, zo su korektne.</li> <li>Stajće so ze swojim syćowym administratorom do zwiska, zo byšće zawěsćił, za proksyserwer dźěła.</li> </ul>"> -<!ENTITY proxyResolveFailure.title "Proksy-serwer njeda so namakać"> -<!ENTITY proxyResolveFailure.longDesc "<ul> <li>Přepruwujće proksy-nastajenja, zo byšće zawěsćił, zo su korektne.</li> <li>Přepruwujće hač waš ličak ma fungowacy syćowy zwisk.</li> <li>Jeli waš ličak abo waša syć so přez wohnjowu murju abo proksy škita, zawěsćće, zo &brandShortName; smě z webom zwjazać.</li> </ul>"> +<!ENTITY proxyResolveFailure.title "Proksyserwer njeda so namakać"> +<!ENTITY proxyResolveFailure.longDesc "<ul> <li>Přepruwujće proksynastajenja, zo byšće zawěsćił, zo su korektne.</li> <li>Přepruwujće hač waš ličak ma fungowacy syćowy zwisk.</li> <li>Jeli waš ličak abo waša syć so přez wohnjowu murju abo proksy škita, zawěsćće, zo &brandShortName; smě z webom zwjazać.</li> </ul>"> <!ENTITY redirectLoop.title "Strona so porjadnje dale njesposrědkuje"> <!ENTITY redirectLoop.longDesc "<ul> <li>Tutón problem so druhdy zawinuje, hdyž so placki znjemóžnjeja abo wotpokazuja.</li> </ul>"> diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/pgpmime.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/pgpmime.properties index 997d5016d428c967b69f31c0e3ea2dc052cdcedb..df76968edeead29ed21dbf39706f947345a871b2 100644 --- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/pgpmime.properties +++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=To je zaklučowana OpenPGP-powěsć.<br>Zo byšće tutu e-mejlku dešifrował, dyrbiće <a href="%S">přidatk OpenPGP</a> instalować. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=To je zaklučowana OpenPGP-powěsć, ale podpěra za OpenPGP-dekodowanje dispoziciji njeje. diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/preferences/connection.dtd b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/preferences/connection.dtd index f1cba3b704ff1d807b02c286e2d5f43f5780d636..30a2c007494cd83801002abd9e11af09c978ae64 100644 --- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/preferences/connection.dtd +++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/preferences/connection.dtd @@ -9,13 +9,13 @@ <!ENTITY proxyTitle.label "Proksy za přistup k internetej konfigurować"> <!ENTITY noProxyTypeRadio.label "Žadyn proksy"> <!ENTITY noProxyTypeRadio.accesskey "a"> -<!ENTITY systemTypeRadio.label "Systemowe proksy-nastajenja wužiwać"> +<!ENTITY systemTypeRadio.label "Systemowe proksynastajenja wužiwać"> <!ENTITY systemTypeRadio.accesskey "S"> <!ENTITY WPADTypeRadio.label "Nastajenja proksy za tutu syć awtomatisce wotkryć"> <!ENTITY WPADTypeRadio.accesskey "w"> -<!ENTITY manualTypeRadio.label "Manuelna konfiguracija proksy:"> +<!ENTITY manualTypeRadio.label "Manuelna proksykonfiguracija:"> <!ENTITY manualTypeRadio.accesskey "M"> -<!ENTITY autoTypeRadio.label "URL awtomatiskeje konfiguracije proksy:"> +<!ENTITY autoTypeRadio.label "URL awtomatiskeje proksykonfiguracije:"> <!ENTITY autoTypeRadio.accesskey "L"> <!ENTITY reload.label "Znowa začitać"> <!ENTITY reload.accesskey "Z"> @@ -40,12 +40,12 @@ <!ENTITY noproxy.label "Žadyn proksy za:"> <!ENTITY noproxy.accesskey "d"> <!ENTITY noproxyExplain.label "Přikład: .mozilla.org, .net.nz, 192.168.1.0/24"> +<!ENTITY shareproxy.label "Tutón proksyserwer za wšě protokole wužiwać"> +<!ENTITY shareproxy.accesskey "u"> <!-- LOCALIZATION NOTE (noproxyLocalhostDesc.label): Do not translate localhost, 127.0.0.1 and ::1. --> <!ENTITY noproxyLocalhostDesc.label "Zwiski z localhost, 127.0.0.1 a ::1 ženje přez proksy njeńdu."> -<!ENTITY shareproxy.label "Tutón proksy-serwer za wšě protokole wužiwać"> -<!ENTITY shareproxy.accesskey "u"> <!ENTITY proxyHttpSharing.label "Tež tutón proksy za HTTPS wužiwać"> <!ENTITY proxyHttpSharing.accesskey "k"> <!ENTITY autologinproxy.label "Za awtentifikaciju so njeprašeć, jeli hesło je składowane"> diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/mozapps/update/updates.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/mozapps/update/updates.properties index 4da54b4d77259614413451496aab7ea564291bb8..365ef9d537869e8dc077f1998ca5c9a919cd10bc 100644 --- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/mozapps/update/updates.properties +++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/mozapps/update/updates.properties @@ -23,6 +23,7 @@ okButton=W porjadku okButton.accesskey=W askLaterButton=Pozdźišo so prašeć askLaterButton.accesskey=P + noThanksButton=Ně, dźakuju so noThanksButton.accesskey=N updateButton_minor=%S aktualizować @@ -70,10 +71,10 @@ check_error-2152398864=Syć je offline (online hić) check_error-2152398867=Port njedowoleny check_error-2152398868=Žane daty přijate (prošu spytajće hišće raz) check_error-2152398878=Aktualizowanski serwer njenamakany (skontrolujće swój internetny zwisk) -check_error-2152398890=Proksy-serwer njenamakany (skontrolujće swój internetny zwisk) +check_error-2152398890=Proksyserwer njenamakany (skontrolujće swój internetny zwisk) # NS_ERROR_DOCUMENT_NOT_CACHED check_error-2152398918=Syć je (online hić) check_error-2152398919=Přenjesenje datow je so přetorhnyło (prošu spytajće hišće raz) -check_error-2152398920=Zwisk z proksy-serwerom wotpokazany +check_error-2152398920=Zwisk z proksyserwerom wotpokazany check_error-2153390069=Serwerowy certifikat je spadnjeny (prošu stajće swój systemowy časnik na prawy datum a prawy čas, jeli stej wopak) check_error-verification_failed=Integrita aktualizacije njeda so přepruwować diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/necko/necko.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/necko/necko.properties index 4eff02637c0e879b9478ab37df588f01ece40b0e..6d0577e5022b483bdceb7432b9a7ef6c873d5707 100644 --- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/necko/necko.properties +++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Přistup na składowak je so “%3$S # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Přistup na składowak je so awtomatisce přesćěhowakej “%2$S” na “%1$S” přizwolił. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Přistup na składowak je so awtomatisce za izolowanje prěnjeho poskićowarja “%2$S” na “%1$S” přizwolił. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Plack “%1$S” je so wotpokazał, dokelž ma atribut “sameSite=none”, ale nima atribut “secure” . # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/hsb/localization/hsb/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/hsb/localization/hsb/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..d33c440d1c30a7d3c84cf3c3552b3b5fa93f830e --- /dev/null +++ b/thunderbird-l10n/hsb/localization/hsb/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = URI-dalesposrědkowanje protyki +calendar-uri-redirect-description = + Serwer URI za protyku „{ $calendarName }“ dale posrědkuje. + Dalesposrědkowanje akceptować a nowy URI za tutu protyku wužiwać? +calendar-uri-redirect-original-uri-label = Aktualny URI: +calendar-uri-redirect-target-uri-label = K nowemu URI dale posrědkować: diff --git a/thunderbird-l10n/hsb/localization/hsb/messenger/accountCentral.ftl b/thunderbird-l10n/hsb/localization/hsb/messenger/accountCentral.ftl index 751f0a0cf6b179c06f481500a4a45934125a46a2..9e967c83714bd9ec0448351af90977c1a8228a7b 100644 --- a/thunderbird-l10n/hsb/localization/hsb/messenger/accountCentral.ftl +++ b/thunderbird-l10n/hsb/localization/hsb/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Witajće k { -brand-full-name } +account-settings = Kontowe nastajenja +# $accounts (Number) - the number of configured accounts setup-title = Wubjerće, štož ma so konfigurować about-title = Wo { -brand-full-name } resources-title = Resursy @@ -40,3 +42,10 @@ explore-link = Funkcije wuslědźić support-link = Podpěra involved-link = Čińće sobu developer-link = Wuwiwarska dokumentacija +read = Powěsće čitać +compose = Nowu powěsć pisać +search = Powěsće pytać +filter = Powěsćowe filtry zrjadować +nntp-subscription = Abonementy diskusijnych skupinow zrjadować +rss-subscription = Kanalowe abonementy rjadować +e2e = Zaklučowanje wot kónca do kónca diff --git a/thunderbird-l10n/hsb/localization/hsb/messenger/policies/policies-descriptions.ftl b/thunderbird-l10n/hsb/localization/hsb/messenger/policies/policies-descriptions.ftl index 0c2c425699e3c7e38456aad4e214b387e7a82845..69e803e8238ad4ca1b272caa921751cb2f8a1f74 100644 --- a/thunderbird-l10n/hsb/localization/hsb/messenger/policies/policies-descriptions.ftl +++ b/thunderbird-l10n/hsb/localization/hsb/messenger/policies/policies-descriptions.ftl @@ -54,7 +54,7 @@ policy-OverrideFirstRunPage = Stronu přepisać, kotraž so při prěnim starće policy-OverridePostUpdatePage = Stronu „Nowe funkcije a změny“ po aktualizaciji přepisać. Stajće tute prawidło na prózdne, jeli chceće tutu stronu znjemóžnić. policy-Preferences = Nastajće a zawrějće hódnotu za podsadźbu nastajenjow. policy-PromptForDownloadLocation = Prašeć so, hdźež maja so dataja při sćehnjenju składować. -policy-Proxy = Nastajenja proksy konfigurować. +policy-Proxy = Proksynastajenja konfigurować. policy-RequestedLocales = Podajće lisćinu požadanych rěčow za nałoženje w preferowanym porjedźe. policy-SanitizeOnShutdown2 = Nawigaciske daty při kónčenju zhašeć. policy-SearchEngines = Nastajenja pytawow konfigurować. Tute prawidło je jenož za wersiju Extended Support Release (ESR) k dispoziciji. diff --git a/thunderbird-l10n/hsb/localization/hsb/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/hsb/localization/hsb/toolkit/about/aboutAddons.ftl index d88800c62bbee6231855d34796770df0628c36d3..96abfb3006d1017595d68c00343719da3d73fc24 100644 --- a/thunderbird-l10n/hsb/localization/hsb/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/hsb/localization/hsb/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Přidatk z dataje instalować… .accesskey = P help-button = Pomoc za přidatki +sidebar-help-button-title = + .title = Pomoc za přidatki preferences = { PLATFORM() -> [windows] Nastajenja { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Nastroje za wšě přidatki +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Nastajenja { -brand-short-name } + *[other] Nastajenja { -brand-short-name } + } show-unsigned-extensions-button = .label = Někotre rozšěrjenja njedachu so wobkrućić show-all-extensions-button = @@ -167,13 +175,29 @@ extensions-view-available-updates = .name = Aktualizacije .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Doporučenja +addon-category-discover-title = + .title = Doporučenja addon-category-extension = Rozšěrjenja +addon-category-extension-title = + .title = Rozšěrjenja addon-category-theme = Drasty +addon-category-theme-title = + .title = Drasty addon-category-plugin = Tykače +addon-category-plugin-title = + .title = Tykače addon-category-dictionary = Słowniki +addon-category-dictionary-title = + .title = Słowniki addon-category-locale = Rěče +addon-category-locale-title = + .title = Rěče addon-category-available-updates = Aktualizacije +addon-category-available-updates-title = + .title = Aktualizacije addon-category-recent-updates = Nowe aktualizacije +addon-category-recent-updates-title = + .title = Nowe aktualizacije ## These are global warnings @@ -286,6 +310,7 @@ shortcuts-no-commands = Slědowace rozšěrjenja tastowe skrótšenki nimaja: shortcuts-input = .placeholder = Zapodajće tastowu skrótšenku shortcuts-browserAction = Rozšěrjenje aktiwizować +shortcuts-browserAction2 = Tłóčatko symboloweje lajsty aktiwizować shortcuts-pageAction = Akciju strony aktiwizować shortcuts-sidebarAction = Bóčnicu přepinać shortcuts-modifier-mac = Strg, Alt abo ⌘ zapřijeć @@ -313,6 +338,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Mjenje pokazać go-back-button = .tooltiptext = Wróćo hić +header-back-button = + .title = Wróćo hić ## Recommended add-ons page diff --git a/thunderbird-l10n/hsb/localization/hsb/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/hsb/localization/hsb/toolkit/about/aboutSupport.ftl index db59e076fea317e1baf6829e4a2f63540559d515..a2ab3e356478483aed1e9157cd8d860795c71b0d 100644 --- a/thunderbird-l10n/hsb/localization/hsb/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/hsb/localization/hsb/toolkit/about/aboutSupport.ftl @@ -297,6 +297,11 @@ sandbox-proc-type-content = wobsah sandbox-proc-type-file = datajowy wobsah sandbox-proc-type-media-plugin = medijowy tykač sandbox-proc-type-data-decoder = dekodowak datow +startup-cache-title = Startowy pufrowak +startup-cache-disk-cache-path = Šćežka tačeloweho pufrowaka +startup-cache-ignore-disk-cache = Tačelowy pufrowak ignorować +startup-cache-found-disk-cache-on-init = Tačelowy pufrowak je so namakał při inicializowanju +startup-cache-wrote-to-disk-cache = Je so do tačeloweho pufrowaka napisało launcher-process-status-0 = Zmóžnjeny launcher-process-status-1 = Zmylka dla znjemóžnjeny launcher-process-status-2 = Namócnje znjemóžnjeny @@ -320,6 +325,7 @@ touch-enabled = zapodaće přez podótknjenje zmóžnjene drag-enabled = ćahanje suwanskeje lajsty zmóžnjene keyboard-enabled = tastatura zmóžnjena autoscroll-enabled = awtomatiske kulenje zmóžnjene +zooming-enabled = łahodne šćipate skalowanje zmóžnjene ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/hsb/localization/hsb/toolkit/about/certviewer.ftl b/thunderbird-l10n/hsb/localization/hsb/toolkit/about/certviewer.ftl index ec7d7582376d950942aca42ef3ef7790ddcf4b89..0947571b8bb4401695261163141511edf3737fe6 100644 --- a/thunderbird-l10n/hsb/localization/hsb/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/hsb/localization/hsb/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (certifikat) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (rjećazk) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Tute rozšěrjenje je so jako kritiske markěrowało, to rěka, zo klienty dyrbja certifikat wotpokazać, jeli jón njerozumja. +certificate-viewer-export = Eksportować + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Waše certifikaty +certificate-viewer-tab-people = Ludźo +certificate-viewer-tab-servers = Serwery +certificate-viewer-tab-ca = Awtority +certificate-viewer-tab-unkonwn = Njeznaty diff --git a/thunderbird-l10n/hsb/localization/hsb/toolkit/global/processTypes.ftl b/thunderbird-l10n/hsb/localization/hsb/toolkit/global/processTypes.ftl index 8ce9f05ea5392023c036c9a2d395de95981600ec..8830cdbbfac14a303f77242c8ca0f6a3ab7180f9 100644 --- a/thunderbird-l10n/hsb/localization/hsb/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/hsb/localization/hsb/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Izolowany webwobsah # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Soket diff --git a/thunderbird-l10n/hsb/localization/hsb/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/hsb/localization/hsb/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..ba819f1705fab11fb8e84aab7f6ff359cf15b53c --- /dev/null +++ b/thunderbird-l10n/hsb/localization/hsb/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Sće staršu wersiju { -brand-product-name } startował + .style = width: 490px; +profiledowngrade-window-create = + .label = Nowy profil załožić +profiledowngrade-sync = Wužiwanje staršeje wersije { -brand-product-name } móže zapołožki a přehladowansku historiju wobškodźić, kotrež su so hižo w eksistowacym profilu { -brand-product-name } składowali. Zo byšće swoje informacije škitał, załožće nowy profil za tutu instalaciju { -brand-short-name }. Móžeće so přeco z { -fxaccount-brand-name } přizjewić, zo byšće swoje zapołožki a přehladowansku historiju mjez profilemi synchronizował. +profiledowngrade-nosync = Wužiwanje staršeje wersije { -brand-product-name } móže zapołožki a přehladowansku historiju wobškodźić, kotrež su so hižo w eksistowacym profilu { -brand-product-name } składowali. Zo byšće swoje informacije škitał, załožće nowy profil za tutu instalaciju { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Skónčić + *[other] Skónčić + } diff --git a/thunderbird-l10n/hsb/manifest.json b/thunderbird-l10n/hsb/manifest.json index e26268d848fbaac7674bd7cf9600b3982873843c..c0e49ce2ddf2b938478f031c6afc2f53fddc832c 100644 --- a/thunderbird-l10n/hsb/manifest.json +++ b/thunderbird-l10n/hsb/manifest.json @@ -1,57 +1,57 @@ { + "langpack_id": "hsb", + "manifest_version": 2, + "description": "Language pack for Thunderbird for hsb", + "sources": { + "browser": { + "base_path": "browser/" + } + }, + "version": "76.0buildid20200420212409", "name": "Hornjoserbšćina Language Pack", "languages": { "hsb": { - "version": "20200403145404", "chrome_resources": { - "messenger": "chrome/hsb/locale/hsb/messenger/", - "messenger-newsblog": "chrome/hsb/locale/hsb/messenger-newsblog/", - "alerts": "chrome/hsb/locale/hsb/alerts/", - "pipnss": "chrome/hsb/locale/hsb/pipnss/", - "global-platform": { - "macosx": "chrome/hsb/locale/hsb/global-platform/mac/", - "android": "chrome/hsb/locale/hsb/global-platform/unix/", - "win": "chrome/hsb/locale/hsb/global-platform/win/", - "linux": "chrome/hsb/locale/hsb/global-platform/unix/" - }, "pluginproblem": "chrome/hsb/locale/hsb/pluginproblem/", - "chat": "chrome/hsb/locale/hsb/chat/", + "passwordmgr": "chrome/hsb/locale/hsb/passwordmgr/", + "mozapps": "chrome/hsb/locale/hsb/mozapps/", "necko": "chrome/hsb/locale/hsb/necko/", - "messenger-smime": "chrome/hsb/locale/hsb/messenger-smime/", "places": "chrome/hsb/locale/hsb/places/", - "passwordmgr": "chrome/hsb/locale/hsb/passwordmgr/", + "messenger": "chrome/hsb/locale/hsb/messenger/", + "global": "chrome/hsb/locale/hsb/global/", "messenger-mapi": "chrome/hsb/locale/hsb/messenger-mapi/", - "autoconfig": "chrome/hsb/locale/hsb/autoconfig/", + "lightning": "chrome/hsb/locale/hsb/lightning/", + "pippki": "chrome/hsb/locale/hsb/pippki/", + "messenger-smime": "chrome/hsb/locale/hsb/messenger-smime/", + "branding": "chrome/hsb/locale/hsb/branding/", + "calendar": "chrome/hsb/locale/hsb/calendar/", + "messenger-region": "chrome/hsb/locale/hsb/messenger-region/", "devtools-startup": "chrome/hsb/locale/hsb/devtools/startup/", "devtools": "chrome/hsb/locale/hsb/devtools/client/", + "messenger-newsblog": "chrome/hsb/locale/hsb/messenger-newsblog/", + "pipnss": "chrome/hsb/locale/hsb/pipnss/", "communicator": "chrome/hsb/locale/hsb/communicator/", "devtools-shared": "chrome/hsb/locale/hsb/devtools/shared/", - "pippki": "chrome/hsb/locale/hsb/pippki/", - "branding": "chrome/hsb/locale/hsb/branding/", - "messenger-region": "chrome/hsb/locale/hsb/messenger-region/", - "mozapps": "chrome/hsb/locale/hsb/mozapps/", - "mozldap": "chrome/hsb/locale/hsb/mozldap/", - "global": "chrome/hsb/locale/hsb/global/", - "calendar": "chrome/hsb/locale/hsb/calendar/", - "lightning": "chrome/hsb/locale/hsb/lightning/" - } - } - }, - "manifest_version": 2, - "version": "76.0buildid20200407173003", - "sources": { - "browser": { - "base_path": "browser/" + "alerts": "chrome/hsb/locale/hsb/alerts/", + "global-platform": { + "win": "chrome/hsb/locale/hsb/global-platform/win/", + "linux": "chrome/hsb/locale/hsb/global-platform/unix/", + "macosx": "chrome/hsb/locale/hsb/global-platform/mac/", + "android": "chrome/hsb/locale/hsb/global-platform/unix/" + }, + "chat": "chrome/hsb/locale/hsb/chat/", + "autoconfig": "chrome/hsb/locale/hsb/autoconfig/", + "mozldap": "chrome/hsb/locale/hsb/mozldap/" + }, + "version": "20200419205356" } }, + "author": "Michael Wolf (contributors: Michael Wolf)", "applications": { "gecko": { "strict_min_version": "76.0", "strict_max_version": "76.*", "id": "langpack-hsb@thunderbird.mozilla.org" } - }, - "langpack_id": "hsb", - "description": "Language pack for Thunderbird for hsb", - "author": "Michael Wolf (contributors: Michael Wolf)" + } } diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/debugger.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/debugger.properties index 9cd7e9474c26db6e3116b6fe38bebb59295f6dfb..a21d99a7774309d6e4e55e8f2286356c03633a51 100644 --- a/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/debugger.properties +++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/debugger.properties @@ -55,6 +55,41 @@ setDirectoryRoot.accesskey=r removeDirectoryRoot.label=Könyvtár gyökér eltávolítása removeDirectoryRoot.accesskey=e +# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item +blackBoxAll.label=Fekete doboz + +# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected group +blackBoxAllInGroup.label=Fájlok fekete doboznak tekintése ebben a csoportban + +# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected group +unblackBoxAllInGroup.label=Fájlok fekete doboznak tekintésének visszavonása ebben a csoportban + +# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected group +blackBoxAllOutsideGroup.label=Fájlok fekete doboznak tekintése a csoporton kívül + +# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to unblackbox all files outside of the selected group +unblackBoxAllOutsideGroup.label=Fájlok fekete doboznak tekintésének visszavonása a csoporton kívül + +# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected directory +blackBoxAllInDir.label=Fájlok fekete doboznak tekintése ebben a könyvtárban + +# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected directory +unblackBoxAllInDir.label=Fájlok fekete doboznak tekintésének visszavonása ebben a könyvtárban + +# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected directory +blackBoxAllOutsideDir.label=Fájlok fekete doboznak tekintése a könyvtárban kívül + +# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the +# context submenu to unblackbox all files outside of the selected directory +unblackBoxAllOutsideDir.label=Fájlok fekete doboznak tekintésének visszavonása a könyvtárban kívül + # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the # context menu to copy the function the user selected copyFunction.label=Függvény másolása @@ -1054,11 +1089,6 @@ whyPaused.mutationBreakpointRemoved=Eltávolítva: # a JS execution whyPaused.interrupted=Várakoztatás végrehajtáskor -# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed -# in a info block explaining how the debugger is currently paused in a -# recording. -whyPaused.replayForcedPause=Várakoztatás felvételkor - # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed # in a info block explaining how the debugger is currently paused while stepping # in or out of the stack @@ -1287,30 +1317,3 @@ serviceWorkerInfo.redundant=felesleges # LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a # service worker that is in an unknown state. serviceWorkerInfo.unknown=ismeretlen - -# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item -blackBoxAll.label=Blackbox -# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the -# context submenu to blackbox all files inside of the selected group -blackBoxAllInGroup.label=Blackbox files in this group -# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the -# context submenu to unblackbox all files inside of the selected group -unblackBoxAllInGroup.label=Unblackbox files in this group -# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the -# context submenu to blackbox all files outside of the selected group -blackBoxAllOutsideGroup.label=Blackbox files outside this group -# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the -# context submenu to unblackbox all files outside of the selected group -unblackBoxAllOutsideGroup.label=Unblackbox files outside this group -# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the -# context submenu to blackbox all files inside of the selected directory -blackBoxAllInDir.label=Blackbox files in this directory -# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the -# context submenu to unblackbox all files inside of the selected directory -unblackBoxAllInDir.label=Unblackbox files in this directory -# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the -# context submenu to blackbox all files outside of the selected directory -blackBoxAllOutsideDir.label=Blackbox files outside this directory -# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the -# context submenu to unblackbox all files outside of the selected directory -unblackBoxAllOutsideDir.label=Unblackbox files outside this directory diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/inspector.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/inspector.properties index 8d2c471e9a635dd34207ff00da7141426fbdfbf9..e2594d7a5016dc5da0ab45b90606003ade3c6d00 100644 --- a/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/inspector.properties +++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Az elem túlcsordulása görgethető. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Nincs kapcsolódó szabály +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Tartsa lenyomva a Shift billentyűt, és kattintson a szabályra ugráshoz + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/jsonview.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/jsonview.properties index 0f2ce76fbcc4f2dd0734601bfdf2f1800cb520f8..02dc68edb77d80668b624f763c17d0264d50d674 100644 --- a/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/jsonview.properties +++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/jsonview.properties @@ -32,6 +32,8 @@ jsonViewer.Copy=Másolás # LOCALIZATION NOTE (jsonViewer.ExpandAll): Label for expanding all nodes jsonViewer.ExpandAll=Összes kinyitása +jsonViewer.ExpandAllSlow=Összes kibontása (lassú) + # LOCALIZATION NOTE (jsonViewer.CollapseAll): Label for collapsing all nodes jsonViewer.CollapseAll=Összes összecsukása @@ -50,5 +52,3 @@ jsonViewer.filterJSON=JSON szűrése # LOCALIZATION NOTE (jsonViewer.reps.reference): Label used for cycle # references in an array. jsonViewer.reps.reference=Ciklushivatkozás - -jsonViewer.ExpandAllSlow=Expand All (slow) diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/netmonitor.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/netmonitor.properties index 7303c3b42fe79687dfe85324bbfce5c4fce48c1c..8d32c3b8126b13672c3f31a606d74a91509feee4 100644 --- a/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/netmonitor.properties +++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/netmonitor.properties @@ -351,6 +351,10 @@ netmonitor.timings.startedAt=Elindítva: %S # %S is time expressed in milliseconds or minutes. netmonitor.timings.downloadedAt=Letöltve: %S +# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the +# timings pane when thea request has been blocked +netmonitor.timings.noTimings=Nincsenek időzítések a kéréshez + # LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed # in the network menu specifying timing interval divisions (in milliseconds). networkMenu.millisecond=%S ms @@ -761,6 +765,14 @@ netmonitor.ws.context.received=Fogadott # for the "Received" menu item displayed in the context menu in the websocket toolbar. netmonitor.ws.context.received.accesskey=F +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed +# on the context menu that shows "Control Frames" WebSocket frames. +netmonitor.ws.context.controlFrames=Vezérlés + +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key +# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. +netmonitor.ws.context.controlFrames.accesskey=e + # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed # on the context menu that shows "Copy Message". netmonitor.ws.context.copyFrame=Üzenet másolása @@ -781,11 +793,6 @@ netmonitor.ws.type.sent=Küldött # accessible text for the "received" type icon in the websocket table's "data" column. netmonitor.ws.type.received=Fogadott -# LOCALIZATION NOTE (netmonitor.ws.time.format): This is the format used for the -# time values in the websocket table's "time" column -# %1$S is the formatted hour-minutes-seconds, %2$S is the milliseconds (zero-padded) -netmonitor.ws.time.format=%1$S,%2$S - # LOCALIZATION NOTE (netmonitor.ws.rawData.header): This is the label displayed # in the messages panel identifying the raw data. netmonitor.ws.rawData.header=Nyers adatok (%S) @@ -1526,13 +1533,3 @@ netmonitor.cache.lastModified=Utoljára módosítva # LOCALIZATION NOTE (netmonitor.cache.device): This is the label text for the device # where a cached object was fetched from (e.g. "disk"). netmonitor.cache.device=Eszköz - -# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the -# timings pane when thea request has been blocked -netmonitor.timings.noTimings=No timings for this request -# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed -# on the context menu that shows "Control Frames" WebSocket frames. -netmonitor.ws.context.controlFrames=Control -# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key -# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. -netmonitor.ws.context.controlFrames.accesskey=o diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/global-platform/mac/accessible.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/global-platform/mac/accessible.properties index 329e2b0e3a31767c913e05860edb4f9e41f908fe..dad7333dad979f39a05ca5a9df43ca2929d0f6b8 100644 --- a/thunderbird-l10n/hu/chrome/hu/locale/hu/global-platform/mac/accessible.properties +++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/global-platform/mac/accessible.properties @@ -58,8 +58,7 @@ separator = elválasztó tabPanel = lappanel # The roleDescription for the html:mark element highlight = kiemelés - # The roleDescription for the details element -details = details +details = részletek # The roleDescription for the summary element -summary = summary +summary = összefoglalás diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/global/css.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/global/css.properties index b91b7bf7433784a950a9ba397eb5ba32c9258d4b..d238958d53787c70da39f6d73506132062be4e9f 100644 --- a/thunderbird-l10n/hu/chrome/hu/locale/hu/global/css.properties +++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=A(z) %1$S stíluslap betöltődött CSS-ként annak ellenére, ho PEUnexpEOF2=%1$S keresése közben váratlanul vége lett a fájlnak. PEParseRuleWSOnly=Csak üres helyet tartalmazó karakterláncot kellett volna szabályként értelmezni. + PEDeclDropped=A deklaráció el lett dobva. PEDeclSkipped=Ugrás a következő deklarációra. PEUnknownProperty=Ismeretlen tulajdonság: „%1$S”. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Csak egy repeat(auto-fill, …) enged PEMoreThanOneGridRepeatAutoFillFitInTrackList=Csak egy repeat(auto-fill, …) vagy repeat(auto-fit, …) engedélyezett a sávlistában. PEMoreThanOneGridRepeatTrackSize=Csak egy sávméret engedélyezett a repeat(auto-fit/auto-fill, …) belsejében. +PEDisallowedImportRule=Az @import szabályok nem érvényesek a létrehozott stíluslapokban. + TooLargeDashedRadius=A szegélysugár túl nagy a "dashed" stílushoz (a korlát 100000px). Megjelenítés tömörként. TooLargeDottedRadius=A szegélysugár túl nagy a "dotted" stílushoz (a korlát 100000px). Megjelenítés tömörként. diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/global/dom/dom.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/global/dom/dom.properties index 825d65b25b7920bfe84c8b785a0caee45df160bd..6bcebbc1c8c7dfa4ff423675c107b46f42a64e04 100644 --- a/thunderbird-l10n/hu/chrome/hu/locale/hu/global/dom/dom.properties +++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/global/dom/dom.properties @@ -424,6 +424,5 @@ MathML_DeprecatedStyleAttributeWarning=A „background”, „color”, „fontf MathML_DeprecatedXLinkAttributeWarning=A „href”, „type”, „show” és „actuate” XLink attribútumok elavultak a MathML elemeken, és a jövőben eltávolításra fognak kerülni. WebShareAPI_Failed=A megosztási művelet nem sikerült. WebShareAPI_Aborted=A megosztási műveletet megszakították. - # LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL. -UnknownProtocolNavigationPrevented=Prevented navigation to “%1$S” due to an unknown protocol. +UnknownProtocolNavigationPrevented=Az ismeretlen protokoll miatt meg lett akadályozva a navigáció: „%1$S”. diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/global/security/security.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/global/security/security.properties index f8ecb8c13f0dfce0246bbcf41c1f22ed6c39849d..7999302e7bf5f1faa00c0c88a88399198f6e05fb 100644 --- a/thunderbird-l10n/hu/chrome/hu/locale/hu/global/security/security.properties +++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/global/security/security.properties @@ -147,13 +147,16 @@ XFODeny = Az X-Frame-Options megakadályozta a betöltést: „%1$S” innen: # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Az X-Frame-Options megakadályozta a betöltést: „%1$S” innen: „%2$S”, az oldal nem engedélyezi a nem azonos eredetű beágyazást innen: „%3$S”. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Érvénytelen X-Frame-Options fejléc található a(z) „%2$S” betöltésekor: a(z) „%1$S” nem érvényes direktíva. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=A(z) „%2$S” keretben megnyitása blokkolva a(z) „X-Frame-Options” direktíva „%1$S” értéke miatt. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = A nem biztonságos „%1$S” kérés frissítése „%2$S” használatára. # LOCALIZATION NOTE: %1$S is the URL of request. -HTTPSOnlyNoUpgrade = A „%1$S” kérés nem lett frissítve, mert NoUpgrade jelző van rajta. - -# LOCALIZATION NOTE: %1$S is the URL of request. -HTTPSOnlyNoUpgradeException = Not upgrading insecure request “%1$S” because it is exempt. +HTTPSOnlyNoUpgradeException = A nem biztonságos „%1$S” kérés nem lesz frissítve, mert kivételt képez. # LOCALIZATION NOTE: %1$S is the URL of the failed request; %2$S is an error-code. -HTTPSOnlyFailedRequest = Upgrading insecure request “%1$S” failed. (%2$S) +HTTPSOnlyFailedRequest = A nem biztonságos „%1$S” kérés frissítése sikertelen. (%2$S) diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/messenger/messenger.dtd b/thunderbird-l10n/hu/chrome/hu/locale/hu/messenger/messenger.dtd index d7bc7aaf8b8bd01509f9e71b02051cfe6512176f..aa61a75bb1e868738702d385ec2a3f570288782f 100644 --- a/thunderbird-l10n/hu/chrome/hu/locale/hu/messenger/messenger.dtd +++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Üzenetek keresése…"> <!ENTITY searchMailCmd.accesskey "e"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Globális keresés…"> +<!ENTITY glodaSearchCmd.accesskey "G"> <!ENTITY searchAddressesCmd.label "Címek keresése…"> <!ENTITY searchAddressesCmd.accesskey "C"> diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/messenger/pgpmime.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/messenger/pgpmime.properties index 61f8fb5bed31a6f5a3fb4476de7d87b3288e878a..338d1618c1a4cd7039a799336a913690121f3909 100644 --- a/thunderbird-l10n/hu/chrome/hu/locale/hu/messenger/pgpmime.properties +++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=Ez egy titkosított OpenPGP üzenet.<br>A levél visszafejtéséhez telepítenie kell egy <a href="%S">OpenPGP kiegészítőt</a>. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Ez egy OpenPGP-vel titkosított üzenet, de az OpenPGP visszafejtés támogatása nem érhető el. diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/necko/necko.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/necko/necko.properties index 0579a56cc8cfb501e93eb505bddb555f19f7038e..3cabfde0dcf7b243036306aafef97566c38261f7 100644 --- a/thunderbird-l10n/hu/chrome/hu/locale/hu/necko/necko.properties +++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Tároló-hozzáférés automatikusan # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Tároló-hozzáférés automatikusan megadva a(z) „%2$S” követőnek itt: „%1$S”. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Tároló-hozzáférés automatikusan megadva a(z) „%2$S” első féltől származó elkülönítésnek itt: „%1$S”. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=A(z) „%1$S” süti elutasításra került, mert a „sameSite=none” attribútum meg lett adva, de hiányzik a „secure” attribútum. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". @@ -67,8 +70,7 @@ CookieLaxForced=A(z) „%1$S” süti „sameSite” irányelve „lax” érté CookieLaxForcedForBeta=A(z) „%1$S” süti nem rendelkezik megfelelő „sameSite” attribútumértékkel. Hamarosan a „sameSite” attribútum nélküli, vagy érvénytelen értékkel rendelkező sütik „lax” értékűként lesznek kezelve. Ez azt jelenti, hogy a sütik többé nem lesznek elküldve harmadik feles környezetben. Ha az alkalmazás arra támaszkodik, hogy ilyen esetekben is elérhető a süti, akkor adja meg a „sameSite=none” attribútumot. Hogy többet tudjon meg a „sameSite” attribútumról, olvassa el a(z) %2$S oldalt. # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none" CookieSameSiteValueInvalid=Érvénytelen „sameSite” érték a(z) „%1$S” sütihez. A támogatott értékek: „lax”, „strict”, „none”. - # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookieOversize=Cookie “%1$S” is invalid because its size is too big. Max size is %2$S B. +CookieOversize=A(z) „%1$S” süti érvénytelen, mert túl nagy. A legnagyobb méret %2$S B. # LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B. +CookiePathOversize=A(z) „%1$S” süti érvénytelen, mert az útvonal túl nagy. A legnagyobb méret %2$S B. diff --git a/thunderbird-l10n/hu/localization/hu/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/hu/localization/hu/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..066dde0e3be39441164d2f6b0f1eaa91ee172e31 --- /dev/null +++ b/thunderbird-l10n/hu/localization/hu/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Naptár URI átirányítás +calendar-uri-redirect-description = + A kiszolgáló átirányítja a(z) „{ $calendarName }” naptár URI-ját. + Elfogadja az átirányítást, és elkezdi használni a naptár új URI-ját? +calendar-uri-redirect-original-uri-label = Jelenlegi URI: +calendar-uri-redirect-target-uri-label = Átirányítás új URI-ra: diff --git a/thunderbird-l10n/hu/localization/hu/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/hu/localization/hu/devtools/client/aboutdebugging.ftl index 6afc13683fc6bd729df4f08c0a32f851e33db2eb..dbbcd9bae4a87c186e876a41227b234667c898fc 100644 --- a/thunderbird-l10n/hu/localization/hu/devtools/client/aboutdebugging.ftl +++ b/thunderbird-l10n/hu/localization/hu/devtools/client/aboutdebugging.ftl @@ -186,6 +186,9 @@ about-debugging-browser-version-too-old = A csatlakoztatott böngésző régi ve # backward compatible changes broke the debugger in those scenarios (Bug 1528219). # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1") about-debugging-browser-version-too-old-67-debugger = A Hibakereső panel lehet hogy nem fog működni a csatlakoztatott böngészővel. Használja a Firefox { $runtimeVersion } verziót, ha ezzel a böngészővel akarja használni a Hibakeresőt. +# Dedicated message for a backward compatibility issue that occurs when connecting: +# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68. +about-debugging-browser-version-too-old-fennec = A Firefox ezen verziója nem tud hibát keresni a Firefox for Androidban (68). Javasoljuk, hogy a teszteléshez telepítse a Firefox for Android Nightlyt a telefonján. # This string is displayed in the runtime page if the remote browser version is too recent. # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd) diff --git a/thunderbird-l10n/hu/localization/hu/messenger/accountCentral.ftl b/thunderbird-l10n/hu/localization/hu/messenger/accountCentral.ftl index ba4f8237cb97c774756c0ac17be5ef3293e2463d..e4b70b9733d03c098af166d31ebef7eb68f6c024 100644 --- a/thunderbird-l10n/hu/localization/hu/messenger/accountCentral.ftl +++ b/thunderbird-l10n/hu/localization/hu/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Üdvözli a { -brand-full-name } +account-settings = Postafiók beállításai +# $accounts (Number) - the number of configured accounts setup-title = Válassza ki, mit szeretne beállítani about-title = A { -brand-full-name } névjegye resources-title = Erőforrások @@ -40,3 +42,10 @@ explore-link = Funkciók felfedezése support-link = Támogatás involved-link = Csatlakozzon developer-link = Fejlesztői dokumentáció +read = Üzenetek olvasása +compose = Új üzenet írása +search = Üzenetek keresése +filter = Üzenetszűrők kezelése +nntp-subscription = Hírcsoport-feliratkozások kezelése +rss-subscription = Hírcsatorna-feliratkozások kezelése +e2e = Végpontok közötti titkosítás diff --git a/thunderbird-l10n/hu/localization/hu/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/hu/localization/hu/toolkit/about/aboutAddons.ftl index 62f4c080eb9ff27f180760c75d333c9481cdbd2c..9c7eb6a5501a8d23c064b5015cb372e777759293 100644 --- a/thunderbird-l10n/hu/localization/hu/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/hu/localization/hu/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Kiegészítő telepítése fájlból… .accesskey = f help-button = Kiegészítő támogatás +sidebar-help-button-title = + .title = Kiegészítő támogatás preferences = { PLATFORM() -> [windows] { -brand-short-name } beállítások @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Eszközök minden kiegészítőhöz +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } beállítások + *[other] { -brand-short-name } beállítások + } show-unsigned-extensions-button = .label = Néhány kiegészítő nem ellenőrizhető show-all-extensions-button = @@ -168,13 +176,29 @@ extensions-view-available-updates = .name = Elérhető frissítések .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Javaslatok +addon-category-discover-title = + .title = Javaslatok addon-category-extension = Kiegészítők +addon-category-extension-title = + .title = Kiegészítők addon-category-theme = Témák +addon-category-theme-title = + .title = Témák addon-category-plugin = Bővítmények +addon-category-plugin-title = + .title = Bővítmények addon-category-dictionary = Szótárak +addon-category-dictionary-title = + .title = Szótárak addon-category-locale = Nyelvek +addon-category-locale-title = + .title = Nyelvek addon-category-available-updates = Elérhető frissítések +addon-category-available-updates-title = + .title = Elérhető frissítések addon-category-recent-updates = Legutóbbi frissítések +addon-category-recent-updates-title = + .title = Legutóbbi frissítések ## These are global warnings @@ -287,6 +311,7 @@ shortcuts-no-commands = A következő kiegészítők nem rendelkeznek gyorsbille shortcuts-input = .placeholder = Írjon be egy gyorsbillentyűt shortcuts-browserAction = Kiegészítő aktiválása +shortcuts-browserAction2 = Eszköztárgomb aktiválása shortcuts-pageAction = Lapművelet aktiválása shortcuts-sidebarAction = Oldalsáv be/ki shortcuts-modifier-mac = Ctrl, Alt vagy ⌘ gombot tartalmaz @@ -312,6 +337,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Kevesebb megjelenítése go-back-button = .tooltiptext = Ugrás vissza +header-back-button = + .title = Ugrás vissza ## Recommended add-ons page diff --git a/thunderbird-l10n/hu/localization/hu/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/hu/localization/hu/toolkit/about/aboutSupport.ftl index 9ec85f56ddafccc890750f959c67774421d77263..21890144a0561e2c4815d4820af0f9bc39bd7831 100644 --- a/thunderbird-l10n/hu/localization/hu/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/hu/localization/hu/toolkit/about/aboutSupport.ftl @@ -287,6 +287,11 @@ sandbox-proc-type-content = tartalom sandbox-proc-type-file = fájltartalom sandbox-proc-type-media-plugin = médiabővítmény sandbox-proc-type-data-decoder = adatdekódoló +startup-cache-title = Indítási gyorsítótár +startup-cache-disk-cache-path = Lemezgyorsítótár elérési útja +startup-cache-ignore-disk-cache = Lemezgyorsítótár figyelmen kívül hagyása +startup-cache-found-disk-cache-on-init = Lemezgyorsítótár megtalálva indításkor +startup-cache-wrote-to-disk-cache = Lemezgyorsítótárba írva launcher-process-status-0 = Engedélyezve launcher-process-status-1 = Hiba miatt letiltva launcher-process-status-2 = Kényszerítve letiltva @@ -310,6 +315,7 @@ touch-enabled = érintőbemenet engedélyezve drag-enabled = gördítősáv húzása engedélyezve keyboard-enabled = billentyűzet engedélyezve autoscroll-enabled = automatikus görgetés engedélyezve +zooming-enabled = sima csípéssel történő nagyítás engedélyezve ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/hu/localization/hu/toolkit/about/certviewer.ftl b/thunderbird-l10n/hu/localization/hu/toolkit/about/certviewer.ftl index 7cfb2363fbfb1fa753a5a25e980ee4a349d08ea5..2a42e9f2c7566a4535f2fb0e716d8af1af513a49 100644 --- a/thunderbird-l10n/hu/localization/hu/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/hu/localization/hu/toolkit/about/certviewer.ftl @@ -29,6 +29,8 @@ certificate-viewer-id = Azonosító certificate-viewer-key-exchange-group = Kulcscsere csoport certificate-viewer-key-id = Kulcsazonosító certificate-viewer-key-size = Kulcsméret +# Inc. means Incorporated, e.g GitHub is incorporated in Delaware +certificate-viewer-inc-locality = Bejegyzés helyszíne certificate-viewer-locality = Helység certificate-viewer-location = Hely certificate-viewer-logid = Naplóazonosító @@ -95,3 +97,16 @@ certificate-viewer-download-pem = PEM (tanúsítvány) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (lánc) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Ez a kiegészítő kritikusként lett megjelölve, ami azt jelenti, hogy a klienseknek el kell utasítaniuk a tanúsítványt, ha nem értik azt. +certificate-viewer-export = Exportálás + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Saját tanúsítványok +certificate-viewer-tab-people = Emberek +certificate-viewer-tab-servers = Kiszolgálók +certificate-viewer-tab-ca = Hitelesítésszolgáltatók +certificate-viewer-tab-unkonwn = Ismeretlen diff --git a/thunderbird-l10n/hu/localization/hu/toolkit/global/processTypes.ftl b/thunderbird-l10n/hu/localization/hu/toolkit/global/processTypes.ftl index dfd90b82c685765e9365453b3ad07100ba10bed5..aa9601d7c41768d43a4a9c9f7ec39d42942ed0c0 100644 --- a/thunderbird-l10n/hu/localization/hu/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/hu/localization/hu/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Elkülönített webtartalom # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Foglalat diff --git a/thunderbird-l10n/hu/localization/hu/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/hu/localization/hu/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..d126e42ddbeb835b93601490a13fd0e8874f7c75 --- /dev/null +++ b/thunderbird-l10n/hu/localization/hu/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = A { -brand-product-name } egy régebbi verzióját indította el + .style = width: 490px; +profiledowngrade-window-create = + .label = Új profil létrehozása +profiledowngrade-sync = A { -brand-product-name } régebbi verziójának használata megrongálhatja a létező { -brand-product-name } profilba mentett könyvjelzőket és a böngészési előzményeket. Az információi védelme érdekében hozzon létre egy új profil a { -brand-short-name } ezen telepítéséhez. Bármikor bejelentkezhet a { -fxaccount-brand-name }jába, hogy szinkronizálja a könyvjelzőit és böngészési előzményeit a profiljai között. +profiledowngrade-nosync = A { -brand-product-name } régebbi verziójának használata megrongálhatja a létező { -brand-product-name } profilba mentett könyvjelzőket és a böngészési előzményeket. Az információi védelme érdekében hozzon létre egy új profil a { -brand-short-name } ezen telepítéséhez. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Kilépés + *[other] Kilépés + } diff --git a/thunderbird-l10n/hu/manifest.json b/thunderbird-l10n/hu/manifest.json index d9c7fd46710b5360f7733f8d3cf965dcdfe5e26a..2e605b1983dd03d3e7567175338adc44015822f6 100644 --- a/thunderbird-l10n/hu/manifest.json +++ b/thunderbird-l10n/hu/manifest.json @@ -1,57 +1,57 @@ { + "manifest_version": 2, + "name": "Magyar (HU) Language Pack", + "version": "76.0buildid20200420212409", + "langpack_id": "hu", "sources": { "browser": { "base_path": "browser/" } }, - "langpack_id": "hu", - "version": "76.0buildid20200407173003", "description": "Language pack for Thunderbird for hu", - "manifest_version": 2, - "applications": { - "gecko": { - "id": "langpack-hu@thunderbird.mozilla.org", - "strict_min_version": "76.0", - "strict_max_version": "76.*" - } - }, - "author": "FSF.hu (contributors: Tímár András)", - "name": "Magyar (HU) Language Pack", "languages": { "hu": { - "version": "20200404102428", + "version": "20200420091805", "chrome_resources": { + "chat": "chrome/hu/locale/hu/chat/", + "devtools-shared": "chrome/hu/locale/hu/devtools/shared/", + "messenger-region": "chrome/hu/locale/hu/messenger-region/", + "messenger-mapi": "chrome/hu/locale/hu/messenger-mapi/", + "global": "chrome/hu/locale/hu/global/", "autoconfig": "chrome/hu/locale/hu/autoconfig/", - "devtools-startup": "chrome/hu/locale/hu/devtools/startup/", - "calendar": "chrome/hu/locale/hu/calendar/", - "devtools": "chrome/hu/locale/hu/devtools/client/", - "pipnss": "chrome/hu/locale/hu/pipnss/", "global-platform": { "android": "chrome/hu/locale/hu/global-platform/unix/", - "linux": "chrome/hu/locale/hu/global-platform/unix/", "macosx": "chrome/hu/locale/hu/global-platform/mac/", - "win": "chrome/hu/locale/hu/global-platform/win/" + "win": "chrome/hu/locale/hu/global-platform/win/", + "linux": "chrome/hu/locale/hu/global-platform/unix/" }, - "global": "chrome/hu/locale/hu/global/", - "messenger": "chrome/hu/locale/hu/messenger/", - "passwordmgr": "chrome/hu/locale/hu/passwordmgr/", "pluginproblem": "chrome/hu/locale/hu/pluginproblem/", - "places": "chrome/hu/locale/hu/places/", - "communicator": "chrome/hu/locale/hu/communicator/", - "branding": "chrome/hu/locale/hu/branding/", "messenger-newsblog": "chrome/hu/locale/hu/messenger-newsblog/", - "mozapps": "chrome/hu/locale/hu/mozapps/", - "messenger-mapi": "chrome/hu/locale/hu/messenger-mapi/", + "alerts": "chrome/hu/locale/hu/alerts/", "messenger-smime": "chrome/hu/locale/hu/messenger-smime/", - "messenger-region": "chrome/hu/locale/hu/messenger-region/", - "lightning": "chrome/hu/locale/hu/lightning/", - "devtools-shared": "chrome/hu/locale/hu/devtools/shared/", "mozldap": "chrome/hu/locale/hu/mozldap/", - "chat": "chrome/hu/locale/hu/chat/", - "alerts": "chrome/hu/locale/hu/alerts/", + "lightning": "chrome/hu/locale/hu/lightning/", + "passwordmgr": "chrome/hu/locale/hu/passwordmgr/", + "places": "chrome/hu/locale/hu/places/", + "messenger": "chrome/hu/locale/hu/messenger/", + "devtools-startup": "chrome/hu/locale/hu/devtools/startup/", + "communicator": "chrome/hu/locale/hu/communicator/", + "necko": "chrome/hu/locale/hu/necko/", + "calendar": "chrome/hu/locale/hu/calendar/", "pippki": "chrome/hu/locale/hu/pippki/", - "necko": "chrome/hu/locale/hu/necko/" + "devtools": "chrome/hu/locale/hu/devtools/client/", + "branding": "chrome/hu/locale/hu/branding/", + "pipnss": "chrome/hu/locale/hu/pipnss/", + "mozapps": "chrome/hu/locale/hu/mozapps/" } } + }, + "author": "FSF.hu (contributors: Tímár András)", + "applications": { + "gecko": { + "strict_max_version": "76.*", + "strict_min_version": "76.0", + "id": "langpack-hu@thunderbird.mozilla.org" + } } } diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/debugger.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/debugger.properties index 35eed121d0944ca6153eb42e5b92680a26241d2d..c7b7f5858494ed7d92fcadb21ec47fa1846ca1e6 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/debugger.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/debugger.properties @@ -55,6 +55,32 @@ setDirectoryRoot.accesskey=r removeDirectoryRoot.label=Հեռացնել գրացուցակի արմատը removeDirectoryRoot.accesskey=d +# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item + +# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected group + +# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected group + +# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected group + +# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to unblackbox all files outside of the selected group + +# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected directory + +# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected directory + +# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected directory + +# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the +# context submenu to unblackbox all files outside of the selected directory + # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the # context menu to copy the function the user selected copyFunction.label=Պատճենել գործառույթը @@ -67,7 +93,7 @@ copyStackTrace.accesskey=c # LOCALIZATION NOTE (expandSources): This is the tooltip for the button # that expands the Sources and Outlines panes in the debugger UI. -expandSources=Ընդարձակել ղբյուրնրը և եզրագծի փեղկերը +expandSources=Ընդարձակել աղբյուրնրը և եզրագծի փեղկերը # LOCALIZATION NOTE (expandBreakpoints): This is the tooltip for the button # that expands the Breakpoints panes in the debugger UI. @@ -146,11 +172,11 @@ mainThread=Գլխավոր շղթա # LOCALIZATION NOTE (noWorkersText): The text to display in the workers list # when there are no workers. -noWorkersText=Այս էջը աշխատողներ չունի: \u0020 +noWorkersText=Այս էջը աշխատողներ չունի։ # LOCALIZATION NOTE (noSourcesText): The text to display in the sources list # when there are no sources. -noSourcesText=\u0020 Այս էջը աղբյուրներ չունի: \u0020 +noSourcesText=Այս էջը աղբյուրներ չունի։ # LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab # when there are no events. @@ -945,7 +971,7 @@ emptyVariablesText=Ցուցադրման համար փոփոխականներ չկ # LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables # pane as a header for each variable scope (e.g. "Global scope, "With scope", # etc.). -scopeLabel=%S գործողության շրջանակ \u0020 +scopeLabel=%S գործողության շրջանակ # LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch # expressions scope. This text is displayed in the variables pane as a header for @@ -1054,11 +1080,6 @@ whyPaused.mutationBreakpointRemoved=Հեռացված․ # a JS execution whyPaused.interrupted=Դադարեցվել է կատարման ժամանակ -# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed -# in a info block explaining how the debugger is currently paused in a -# recording. -whyPaused.replayForcedPause=Դադարեցվել է փայնագրությունում - # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed # in a info block explaining how the debugger is currently paused while stepping # in or out of the stack @@ -1071,12 +1092,12 @@ whyPaused.pauseOnDOMEvents=Դադարեցված է իրադարձության ո # LOCALIZATION NOTE (whyPaused.breakpointConditionThrown): The text that is displayed # in an info block when evaluating a conditional breakpoint throws an error -whyPaused.breakpointConditionThrown=Սխալ՝ պայմանական ընդհատակետում +whyPaused.breakpointConditionThrown=Սխալ՝ պայմանական խզակետում # LOCALIZATION NOTE (whyPaused.xhr): The text that is displayed # in a info block explaining how the debugger is currently paused on an # xml http request -whyPaused.xhr=Դադարեցված XMLHttpRequest-ում +whyPaused.xhr=Դադարեցվել է XMLHttpRequest-ում # LOCALIZATION NOTE (whyPaused.XHR): The text that is displayed # in a info block explaining how the debugger is currently paused on an @@ -1138,7 +1159,7 @@ shortcuts.toggleCondPanel.breakpoint=Փոփոխել պայմանական խզա # LOCALIZATION NOTE (shortcuts.toggleCondPanel.logPoint): text describing # keyboard shortcut action for toggling conditional panel for log points -shortcuts.toggleCondPanel.logPoint=Խմբագրել գրանցամատյանի կետը +shortcuts.toggleCondPanel.logPoint=Խմբագրել մուտքային կետը # LOCALIZATION NOTE (shortcuts.pauseOrResume): text describing # keyboard shortcut action for pause of resume diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/font-inspector.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/font-inspector.properties index 0a5bcd6336019db653468a39f63e2dff4bc45636..2b5f13369c62ce8469c100f997339d98ca50a3fe 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/font-inspector.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/font-inspector.properties @@ -66,4 +66,4 @@ fontinspector.fontsUsedLabel=Օգտագործված տառատեսակներ # LOCALIZATION NOTE (fontinspector.previewTextPlaceholder): Placeholder for the input # where the user can type text to get a preview of it using a font. -fontinspector.previewTextPlaceholder=Նախադիտման գրույթի տառատեսակի +fontinspector.previewTextPlaceholder=Նախադիտման գրույթի տառատեսակ diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/inspector.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/inspector.properties index 80461e968aa92004ce2b9c115a99582229349e08..6b565b74571c87aefa794f7b2543c1e583332235 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/inspector.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/inspector.properties @@ -322,7 +322,7 @@ inspectorPseudoClassSubmenu.label=Փոխել կեղծ֊դասը # LOCALIZATION NOTE (inspectorBreakpointSubmenu.label): This is the label # shown in the inspector contextual-menu for the sub-menu of the DOM breakpoints. -inspectorBreakpointSubmenu.label=Կոտրել երբ… +inspectorBreakpointSubmenu.label=Կոտրել … # LOCALIZATION NOTE (inspectorSubtreeModification.label): This is the label shown # in the inspector contextual-menu for the item that lets users add a DOM breakpoint @@ -534,7 +534,7 @@ inspector.printSimulation.tooltip = Էջի համար մեդիա մոդելավ # LOCALIZATION NOTE (inspector.colorSchemeSimulation.tooltip): # This is the tooltip of the color scheme simulation button in the Rule View # toolbar that toggles color scheme simulation. -inspector.colorSchemeSimulation.tooltip=Այս էջի համար փոխանջատել գունավորման նմնակումը +inspector.colorSchemeSimulation.tooltip=Այս էջի համար փոխանջատել գունավորման նմանակումը # LOCALIZATION NOTE (markupView.scrollableBadge.label): This is the text displayed inside a # badge, in the inspector, next to nodes that are scrollable in the page. @@ -548,6 +548,9 @@ markupView.scrollableBadge.tooltip=Այս տարրն ունի պտտվող ար # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Ոչ մի հարակից կանոն +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/layout.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/layout.properties index 57e6b765b643938d12cef8158dffd00a4de77df7..bf5f428dd8cc221bb0859f2258eb4f73d2017efe 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/layout.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/layout.properties @@ -89,7 +89,7 @@ flexbox.itemSizing.notSetToShrink=Նյութը չպետք է նեղացնել։ # LOCALIZATION NOTE (flexbox.togglesFlexboxHighlighter2): The tooltip text for the Flexbox # toggle button. -flexbox.togglesFlexboxHighlighter2=Փոխարկել Flexbox-ի գունանաշիչները +flexbox.togglesFlexboxHighlighter2=Փոխարկել Flexbox-ի գունանշիչները # LOCALIZATION NOTE (layout.cannotShowGridOutline, layout.cannotSHowGridOutline.title): # In the case where the grid outline cannot be effectively displayed. diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/memory.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/memory.properties index 09082dd308258f5885c04190557aaf10d5aeb324..9bf6014ee4a71e45762e990446c6b60deaa324f4 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/memory.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/memory.properties @@ -46,7 +46,7 @@ checkbox.recordAllocationStacks=Խմբավորել ըստ՝ # LOCALIZATION NOTE (checkbox.recordAllocationStacks.tooltip): The tooltip for # the label describing the boolean checkbox whether or not to record call # stacks. -checkbox.recordAllocationStacks.tooltip=Միացրեք զանգի ձայնագրությունը այն ժամանակ, երբ առարկան հատկացվել է։ Հետագա նկարահանումները կկարողանան խմբագրել և պիտակավորել առարկաները զանգի պաստառներով, բայց միայն այն տարբերակներով, որոնք ստեղծվել են այս տարբերակն անցնելուց հետո։ Զանգի փորագրերը ձայնագրելու գործընթացն ունի գերակատարում։ +checkbox.recordAllocationStacks.tooltip=Միացրեք զանգի ձայնագրությունը այն ժամանակ, երբ առարկան հատկացվել է։ Հետագայ նկարահանումները կկարողանան խմբագրել և պիտակաւորել առարկաները զանգի պաստառներով, բայց միայն այն տարբերակներով, որոնք ստեղծուել են այս տարբերակն անցնելուց յետոյ։ Զանգի փորագրերը ձայնագրելու գործընթացն ունի գերակատարում։ # LOCALIZATION NOTE (toolbar.displayBy): The label describing the select menu # options of the display options. diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/netmonitor.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/netmonitor.properties index 4aaa3b9f4d7c732bb8635d7f1a29a390bb656a61..253ab0318b14ac78261633171335857d9dbbcfd5 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/netmonitor.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/netmonitor.properties @@ -351,6 +351,9 @@ netmonitor.timings.startedAt=Ներածական․ %S # %S is time expressed in milliseconds or minutes. netmonitor.timings.downloadedAt=Ներբեռնված․ %S +# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the +# timings pane when thea request has been blocked + # LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed # in the network menu specifying timing interval divisions (in milliseconds). networkMenu.millisecond=%Sմվ @@ -638,6 +641,7 @@ netmonitor.toolbar.cause=Պատճառ # LOCALIZATION NOTE (netmonitor.toolbar.initiator): This is the label displayed # in the network table toolbar, above the "initiator" column. +netmonitor.toolbar.initiator=Սկզբնավորիչ # LOCALIZATION NOTE (netmonitor.toolbar.type): This is the label displayed # in the network table toolbar, above the "type" column. @@ -760,6 +764,12 @@ netmonitor.ws.context.received=Ստացված # for the "Received" menu item displayed in the context menu in the websocket toolbar. netmonitor.ws.context.received.accesskey=R +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed +# on the context menu that shows "Control Frames" WebSocket frames. + +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key +# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. + # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed # on the context menu that shows "Copy Message". netmonitor.ws.context.copyFrame=Պատճենել նամակը @@ -780,11 +790,6 @@ netmonitor.ws.type.sent=Ուղարկված # accessible text for the "received" type icon in the websocket table's "data" column. netmonitor.ws.type.received=Ստացված -# LOCALIZATION NOTE (netmonitor.ws.time.format): This is the format used for the -# time values in the websocket table's "time" column -# %1$S is the formatted hour-minutes-seconds, %2$S is the milliseconds (zero-padded) -netmonitor.ws.time.format=%1$S.%2$S - # LOCALIZATION NOTE (netmonitor.ws.rawData.header): This is the label displayed # in the messages panel identifying the raw data. netmonitor.ws.rawData.header=Հում տվյալներ (%S) @@ -1021,6 +1026,14 @@ netmonitor.toolbar.resetColumns=Վերականգնել սյուները # displayed in the network table header context menu to reset sorting netmonitor.toolbar.resetSorting=Վերատեղադրել տեսակավորումը +# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent): This is the label +# displayed in the network table header context menu to resize a column to fit its content +netmonitor.toolbar.resizeColumnToFitContent=Չափափոխել սյունակը բովանդակությանը համապատասխանելու համար + +# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent.title): This is the title +# tooltip displayed when draggable resizer in network table headers is hovered +netmonitor.toolbar.resizeColumnToFitContent.title=Կրկնակի սեղմեք`սյունը բովանդակությանը համապատասխանելու համար + # LOCALIZATION NOTE (netmonitor.toolbar.timings): This is the label # displayed in the network table header context menu for the timing submenu netmonitor.toolbar.timings=Ժամանակներ @@ -1521,18 +1534,9 @@ netmonitor.cache.device=Սարք # LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the # timings pane when thea request has been blocked netmonitor.timings.noTimings=No timings for this request -# LOCALIZATION NOTE (netmonitor.toolbar.initiator): This is the label displayed -# in the network table toolbar, above the "initiator" column. -netmonitor.toolbar.initiator=Initiator # LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed # on the context menu that shows "Control Frames" WebSocket frames. netmonitor.ws.context.controlFrames=Control # LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key # for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. netmonitor.ws.context.controlFrames.accesskey=o -# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent): This is the label -# displayed in the network table header context menu to resize a column to fit its content -netmonitor.toolbar.resizeColumnToFitContent=Resize Column To Fit Content -# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent.title): This is the title -# tooltip displayed when draggable resizer in network table headers is hovered -netmonitor.toolbar.resizeColumnToFitContent.title=Double-click to fit column to content diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/performance.dtd b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/performance.dtd index a46963ad97086f20b1e21a0b78f33b866564ee60..c5a0bb585cfe84b136c4157383281c6e735d538f 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/performance.dtd +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/performance.dtd @@ -42,7 +42,7 @@ <!ENTITY performanceUI.toolbar.memory-calltree "Բաշխումներ"> <!ENTITY performanceUI.toolbar.allocations.tooltiptext "Ցուցադրումներ, որտեղ ձայնագրության ընթացքում հիշողություն է հատկացվել։"> <!ENTITY performanceUI.toolbar.js-flamegraph "Այրել JS աղյուսակը"> -<!ENTITY performanceUI.toolbar.js-flamegraph.tooltiptext "Ցույց է տալիս JavaScript֊ի կանչի զանգը ձայնագրության ընթացքում։"> +<!ENTITY performanceUI.toolbar.js-flamegraph.tooltiptext "Ցոյց է տալիս JavaScript֊ի կանչի զանգը ձայնագրութեան ընթացքում։"> <!ENTITY performanceUI.toolbar.memory-flamegraph "Հատկացումների հրային աղյուսակ"> <!-- LOCALIZATION NOTE (performanceUI.table.*): These strings are displayed diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global-platform/mac/accessible.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global-platform/mac/accessible.properties index 38e107885e8690258e7ca3a128695bddd291cac8..5a5a610f7b451abda84664457bdd8abc98d362f6 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global-platform/mac/accessible.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global-platform/mac/accessible.properties @@ -30,7 +30,7 @@ searchTextField = որոնել տեքստի դաշտում # The Role Description for WAI-ARIA Landmarks application = հավելված search = փնտրել -banner = բաններ +banner = ազդերիզ navigation = ուղղորդումը complementary = լրացուցիչ content = բովանդակությունը @@ -58,6 +58,8 @@ separator = բաժանիչ tabPanel = ներդիրի վահանակ # The roleDescription for the html:mark element highlight = գունանշել +# The roleDescription for the details element +# The roleDescription for the summary element # The roleDescription for the details element details = details diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout/htmlparser.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout/htmlparser.properties index c8f981e83f4885b74cc938f673b5dc2fd40fd412..12d4cb7c9d6a2a2762c225b9289d82b75aceb01f 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout/htmlparser.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout/htmlparser.properties @@ -83,6 +83,7 @@ errNoSpaceBetweenPublicAndSystemIds=Փաստաթղթի տեսակի հանրայ errNoSpaceBetweenDoctypePublicKeywordAndQuote=Փաստաթղթի տեսակի “PUBLIC” հիմնաբառի և չակերտի միջև բացատ չկա: \u0020 # Tree builder errors +errDeepTree=Փաստաթղթի ծառը չափազանց խորն է։ Ծառը կկնճռոտվի 513 տարր խորության վրա։ errStrayStartTag2=Թափառող սկզբնական պիտակ“%1$S”:\u0020 errStrayEndTag=Թափառող ավարտական պիտակ “%1$S”:\u0020 errUnclosedElements=\u0020 Ավարտական պիտակ “%1$S”-ը տեղի էր ունեցել, բայց կային և բաց տարրեր: \u0020 @@ -129,6 +130,3 @@ errNoCheckUnclosedElementsOnStack=Շեղջում չփակված տարրեր:\u0 errEndTagDidNotMatchCurrentOpenElement=Վերջնական պիտակ “%1$S”-ը չի համապատասխանում ընթացիկ բաց տարր (“%2$S”)-ի անվան հետ:\u0020 errEndTagViolatesNestingRules=Վերջնական պիտակ “%1$S”-ը խախտում է ներդրված կանոնները:\u0020 errEndWithUnclosedElements=Ավարտական պիտակ “%1$S”-ը տեղի էր ունեցել, բայց կային և չփակված տարրեր: \u0020 - -# Tree builder errors -errDeepTree=The document tree is too deep. The tree will be flattened to be 513 elements deep. diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout/xmlparser.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout/xmlparser.properties index 9f3ee81183f12f302622f5b843f7bc7c1e7e0761..a2a0c1e847c170eecaecfd59f5c563cac6e283d4 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout/xmlparser.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout/xmlparser.properties @@ -4,38 +4,38 @@ # Map Expat error codes to error strings 1 = հիշողությունը չի բավարարում -2 = գրագրության սխալանք +2 = շարահյուսական սխալ է 3 = Ոչ մի տարր չգտնվեց 4 = լավ չէ ձևավորված 5 = Չեզրափակված նշադրում -6 = Չեզրափակված նշադրում +6 = մասնակի բնույթ 7 = անհամապատասխան շաղկապ 8 = կրկնվող հատկանիշ -9 = փաստաթուղթ հոդին հաջորդող թափոն -10 = անհայտ պարամետրբովանդակության մեջբերում +9 = փաստաթղթի տարրին հաջորդող թափոն +10 = անհայտ պարամետր բովանդակության մեջբերում 11 = չսահմանված բովանդակություն 12 = ինքն իրեն հիշատակող բովանդակության մեջբերում 13 = անհամատեղ բովանդակություն -14 = Անվաներ տառանիշի համարի հիշատակում +14 = Անվավեր տառանիշի համարի հիշատակում 15 = Երկուական բովանդակության հիշատակում 16 = հատկանիշում արտաքին բովանդակության հիշատակում 17 = XML մշակման հրահանգ, որն արտաքին բովանդակության սկզբում չէ 18 = անհայտ կոդավորում 19 = XML-հռչակագրում նշված կոդավորումը անստույգ է 20 = չփակված CDATA բաժին -21 = Սխալանք արտաքին բովանդակության մեջբերումն մշակելիս -22 = Փաստաթուղթն ինքնամփոփ չէ +21 = Սխալ արտաքին բովանդակության մեջբերումն մշակելիս +22 = փաստաթուղթը ինքնուրույն չէ 23 = վերլուծչի անսպասելի վիճակ 24 = պարամետր բովանդակությունում հռչակված բովանդակություն 27 = նախանիշը կապված չէ որևէ անվանատիրույթի հետ -28 = չպետք է անդեկլարացնել պռեֆիքսը +28 = չպետք է բացահայտել նախանիշը 29 = անավարտ նշարկում ցուցիչի գրառում 30 = XML հայտարարումը լավ չէ ձևավորված -31 = նախանիշը չպիտի կապված լինի որևէ պաշարված անվանատիրույթի URI-ի հետ +31 = տեքստի հռչակագիրը լավ ձևավորված չէ 32 = անթույլատրելի գրանշաններ հանրային id-ում 38 = Պահպանված նախածանցը (xml) չպետք է լինի չհայտարարված կամ պարտավորվում է մեկ այլ անվանատարածքի անուն -39 = Ռեզերվացված (xmlns) պրեֆիքսը չի կարող լինել հայտարարված կամ ոչ հայտարարված -40 = պրեֆիքսը չի կարող կապված լինել որևէ ռեզերվացված անունների դաշտի հետ +39 = Պահպանված (xmlns) նախանիշը չի կարող լինել հայտարարված կամ ոչ հայտարարված +40 = նախանիշը չի կարող կապված լինել որևէ պահպանված անունների դաշտի հետ # %1$S is replaced by the Expat error string, may be followed by Expected (see below) # %2$S is replaced by URL @@ -45,4 +45,4 @@ XMLParsingError = XML վերլուծության սխալմունք՝ %1$S\nՏե # %S is replaced by a tag name. # This gets appended to the error string if the error is mismatched tag. -Expected = : Սպասվում էր` </%S>: +Expected = ։ Սպասվում է`</%S>։ diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout_errors.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout_errors.properties index b063a521796fd0f6cff1f2d871a9f7ba478f73eb..180b45ed48396cb662e469cd0c9f9b471c2df199 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout_errors.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout_errors.properties @@ -39,11 +39,11 @@ CompositorAnimationWarningTransformFrameInactive=Շարժապատկերումը CompositorAnimationWarningTransformIsBlockedByImportantRules=Փոխակերպիչի շարժապատկերը չի կարող գործադրվել գրաշարի վրա, որովհետև փոխակերպիչի հետ կապված հատկությունները գերադասվում են կարևոր կանոններով CompositorAnimationWarningOpacityFrameInactive=Շարժապատկերը չի կարող գործադրվել գրաշարի վրա, որովհետև շրջանակը գործուն չի նշվել «անթափանցիկ» շարժապատկերի համար CompositorAnimationWarningHasRenderingObserver=Շարժապատկերում չի կարող գործադրվել գրաշարի վրա, քանի որ տարրն ունի դիտորդներ (-moz-element or SVG clipping/masking) +CompositorAnimationWarningHasCurrentColor=«Ֆոնային գույնի» անիմացիաները չեն կարող վազել կոմպոզիտորի վրա `« ներկայիս գույն »առանցքային շրջանակով: ## LOCALIZATION NOTE: Do not translate zoom, calc(), "transform", "transform-origin: 0 0" ZoomPropertyWarning=Ոչ ստանդարտ “zoom” գույքը օգտագործվում է այս էջում: Փորձեք օգտագործել calc () արժեքը համապատասխան գույքային արժեքներում կամ օգտագործել “transform” և “transform-origin 00” : - ## LOCALIZATION NOTE(PrincipalWritingModePropagationWarning): ## Do not translate <html>, <body>, CSS, "writing-mode", "direction", "text-orientation", :root, and "The Principal Writing Mode" because they are technical terms. PrincipalWritingModePropagationWarning=<html> բաղադրիչը ներկայացնելիս, CSS-ի հատկությունների օգտագործված արժեքները “writing-mode”, “direction” և “text-orientation” <html> բաղադրիչում վերցված են <body> բաղադրիչի հաշվարկված արժեքներից, ոչ թե <html> բաղադրիչի սեփական արժեքներից։ Դիտարկեք այս հատկությունների կարգավորումը :root CSS pseudo-class-ում կարգավորումը։Հավելյալ տեղեկության համար՝ “The Principal Writing Mode” https://www.w3.org/TR/css-writing-modes-3/#principal-flow-ում @@ -54,5 +54,4 @@ PrincipalWritingModePropagationWarning=<html> բաղադրիչը ներկայա ## %3$S is a floating point value with the total adjusted distance ScrollAnchoringDisabledInContainer=Ոլորման հաստատումը անջատվել է ոլորման պարունակում` չափազանց շատ հաջորդական կարգավորումների պատճառով (%1$S) չափազանց փոքր ընդհանուր տարածություն (%2$S px միջին, %3$S px ընդհանուր)։ -CompositorAnimationWarningHasCurrentColor=Animations of ‘background-color’ cannot be run on the compositor with ‘current-color’ keyframe. -ForcedLayoutStart=Layout was forced before the page was fully loaded. If stylesheets are not yet loaded this may cause a flash of unstyled content. +ForcedLayoutStart=Դասավորությունը հարկադրված էր, նախքան էջն ամբողջությամբ բեռնված լինի։ Եթե ոճային թերթերը դեռ բեռնված չեն, դա կարող է հանգեցնել չստուգված բովանդակության փայլ։ diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/mathml/mathml.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/mathml/mathml.properties index 2a0cdd36390eb2354d0c50c66d2f4031cdac9b2b..c582a16a12d98f14dac1ee39fbed10e2bd6f1198 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/mathml/mathml.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/mathml/mathml.properties @@ -2,16 +2,16 @@ # 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/. -InvalidChild=Անվավեր նշարկում. <%1$S> չի թույլատրվում որպես <%2$S>-ի հետևորդ: \u0020 -ChildCountIncorrect=Անվավեր նշարկում: <%1$S/> պիտակի համար հետնորդների սխալ քանակ: \u0020 -DuplicateMprescripts=Անվավեր նշարկում. մեկից ավելի <mprescripts/> <mmultiscripts/> -ում: +InvalidChild=Անվավեր նշարկում ՝ <%1$S> չի թույլատրվում որպես <%2$S>-ի ժառանգ։ +ChildCountIncorrect=Անվավեր նշարկում ՝ <%1$S/> պիտակի համար հետնորդների սխալ քանակ։ +DuplicateMprescripts=Անվավեր նշարկում ՝ մեկից ավելի <mprescripts/> <mmultiscripts/>-ում։ # LOCALIZATION NOTE: The first child of <mmultiscript/> is the base, that is the element to which scripts are attached. -NoBase=Անվավեր նշարկում:<mmultiscripts/>-ում սպասվում էր ճիշտ մեկ Base (Հենակետ) տարր: Ոչ մի հատ չհայտնաբերվեց: -SubSupMismatch=Անվավեր նշարկում:<mmultiscripts/>-ում subscript/superscript ոչ ամբողջական զույգ: \u0020 +NoBase=Անվավեր նշարկում ՝ <mmultiscripts/>-ում սպասվում էր ճիշտ մեկ Base (Հենակետ) տարր: Ոչ մի հատ չհայտնաբերվեց: +SubSupMismatch=Անվավեր նշարկում ՝ <mmultiscripts/>-ում subscript/superscript ոչ ամբողջական զույգ։ # LOCALIZATION NOTE: When localizing the single quotes ('), follow the conventions in css.properties for your target locale. -AttributeParsingError=<%3$S/>ում '%2$S' հատկանիշի համար '%1$S' արժեքի սխալ վերլուծում: Հատկանիշը մերժվել է: \u0020 -AttributeParsingErrorNoTag='%2$S' հատկանիշի համար '%1$S' արժեքի սխալ պարզաբանում: Հատկանիշը մերժվել է: \u0020 -LengthParsingError=MathML հատկանիշի '%1$S' արժեքի սխալ վերլուծում: Հատկանիշը մերժված է: \u0020 -DeprecatedSupersededBy='%1$S'-ը հնացել է MathML 3-ում,փոխարինվել է '%2$S'-ով: \u0020 +AttributeParsingError=<%3$S/>ում '%2$S' հատկանիշի համար '%1$S' արժեքի սխալ վերլուծում։ Հատկանիշը մերժվել է։ +AttributeParsingErrorNoTag='%2$S' հատկանիշի համար '%1$S' արժեքի սխալ պարզաբանում։ Հատկանիշը մերժվել է։ +LengthParsingError=MathML հատկանիշի '%1$S' արժեքի սխալ վերլուծում։ Հատկանիշը մերժված է։ +DeprecatedSupersededBy='%1$S'-ը հնացել է MathML 3-ում,փոխարինվել է '%2$S'-ով։ UnitlessValuesAreDeprecated=Անհամաչափ արժեքները հնացել են MathML 3-ում: diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/nsWebBrowserPersist.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/nsWebBrowserPersist.properties index 88db10741ca2bd6f8a13cd94b52ea78119bd038e..689ea4f1cdf6bb54ff54a9a2673a266069ab8b14 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/nsWebBrowserPersist.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/nsWebBrowserPersist.properties @@ -2,16 +2,16 @@ # 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/. -readError=Անհնար էր %S-ը պահել, քանզի աղբյուր-ֆայլն անհնար է կարդալ:\n\nՓորձեք ավելի ուշ կամ կապնվեք սպասարկիչի կառավարչի հետ: -writeError=Անհայտ սխալմունքի պատճառով %S-ն անհնար էր պահպանել:\n\nՑավում եմ: Փորձեք մեկ այլ տեղ պահել: -launchError=Անհայտ սխալի պատճառով անհնար էր %S-ը բացել:\n\nՑավում եմ: Փորձեք սկավառակի վրա պահել այնուհետև բացել: -diskFull=%Sը պահպանելու համար սկավառակի վրա բավարար տեղ չկա:\n\nՏեղ ստեղծելու համար հեռացրեք անպետք ֆայլերը եվ կրկին փորձեք, կամ փորձեք այլ տեղ պահել: -readOnly=%S-ն անհնար էր պահպանել, քանզի սկավառակը, պանակը կամ ֆայլը գրելու դեմ պաշտպանված են:\n\nՀեռացրեք պաշտպանությունը և կրկին փորձեք, կամ էլ փորձեք այլ տեղ պահել: +readError=Անհնար էր %S-ը պահել, քանզի աղբյուր-ֆայլն անհնար է կարդալ։\n\nՓորձեք ավելի ուշ կամ կապնվեք սպասարկիչի կառավարչի հետ։ +writeError=Անհայտ սխալմունքի պատճառով %S-ն անհնար էր պահպանել։\n\nՑավում եմ։ Փորձեք մեկ այլ տեղ պահել։ +launchError=Անհայտ սխալի պատճառով անհնար էր %S-ը բացել։\n\nՑավում եմ։ Փորձեք սկավառակի վրա պահել այնուհետև բացել։ +diskFull=%S֊ը պահպանելու համար սկավառակի վրա բավարար տեղ չկա։\n\nՏեղ ստեղծելու համար հեռացրեք անպետք նիշքերը և կրկին փորձեք, կամ փորձեք այլ տեղ պահել։ +readOnly=%S-ն անհնար էր պահպանել, քանզի սկավառակը, պանակը կամ նիշքը գրելու դեմ պաշտպանված են։\n\nՀեռացրեք պաշտպանությունը և կրկին փորձեք, կամ էլ փորձեք այլ տեղ պահել։ accessError=Անհնար է պահպանել %S-ը, քանի որ Դուք չեք կարող փոփոխել այդ թղթապանակի պարունակությունը:\n\nՓոփոխեք թղթապանակի հատկանիշները և փորձեք կրկին կամ էլ փորձեք այլ տեղ պահել: -SDAccessErrorCardReadOnly=Ֆայլը հնարավոր չէ բեռնել, քանի որ SD քարտը օգտագործվում է: -SDAccessErrorCardMissing=Ֆայլը հնարավոր չէ բեռնել, քանի որ SD քարտը բացակայում է: +SDAccessErrorCardReadOnly=Նիշքը հնարավոր չէ բեռնել, քանի որ SD քարտը օգտագործվում է։ +SDAccessErrorCardMissing=Նիշքը հնարավոր չէ բեռնել, քանի որ SD քարտը բացակայում է։ helperAppNotFound=Անհնար էր %S-ը բացել, քանզի համապատասխան օգնող ծրագիրը առկա չէ: Փոխեք համապատասխանությունն ու կրկին փորձեք: -noMemory=Գործողությունն ավարտեկու համար բավարար հիշողություն չկա:\n\nՓակեք որոշ ծրագրեր և կրկին փորձեք: +noMemory=Գործողությունն ավարտելու համար բավարար հիշողություն չկա։\n\nՓակեք որոշ ծրագրեր և կրկին փորձեք։ title=%S-ի ներբեռնում fileAlreadyExistsError=%S-ն անհնար էր պահպանել, քանզի մի ֆայլ արդեն իսկ առկա է նույն անվամբ ինչպես «_files» պանակը:\n\nՓորձեք մեկ այլ տեղ պահել: -fileNameTooLongError=%S-ն անհնար էր պահպանել, քանզի ֆայլի անունը շատ երկար էր:\n\nՓորձեք ավելի կարճ անվամբ պահել: +fileNameTooLongError=%S-ն անհնար էր պահպանել, քանզի ֆայլի անունը շատ երկար էր։\n\nՓորձեք ավելի կարճ անվամբ պահել։ diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/printing.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/printing.properties index 22159c5a546f5a427ee813442a2037c0b26394e6..42a1b2ffa71d1c14cae27ee0985477c6051158fe 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/printing.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/printing.properties @@ -4,7 +4,7 @@ # Page number formatting ## @page_number The current page number -#LOCALIZATION NOTE (pageofpages): Do not translate %ld in the following line. +#LOCALIZATION NOTE (pagenumber): Do not translate %ld in the following line. # Place the word %ld where the page number and number of pages should be # The first %ld will receive the the page number pagenumber=%1$d @@ -18,11 +18,12 @@ pagenumber=%1$d # the second %ld will receive the total number of pages pageofpages=%2$d-ը %1$d-ից -noprinter=Որևէ տպիչ առկա չէ: -PrintToFile=Տպել ֆայլում +noprinter=Որևէ տպիչ առկա չէ։ + +PrintToFile=Տպել նիշքում noPrintFilename.title=Ֆայլի անունն առկա չէ -noPrintFilename.alert=Դուք ընտրել եք "Տպել ֆայլում" և ֆայլի անունը դատարկ է: -fileConfirm.exists=%S- ն արդեն իսկ առկա է\nՑանկանու՞մ եք այն փոխարինել: +noPrintFilename.alert=Դուք ընտրել եք "Տպել նիշքում" և նիշքի անունը դատարկ է։ +fileConfirm.exists=%S- ն արդեն իսկ առկա է\nՑանկանու՞մ եք այն փոխարինել։ print_error_dialog_title=Տպիչի սխալ printpreview_error_dialog_title=Տպելու նախադիտման սխալ @@ -41,20 +42,20 @@ printpreview_error_dialog_title=Տպելու նախադիտման սխալ # printing, and PERR_FAILURE_PP will be used under the same conditions # when print previewing. # -PERR_FAILURE=Սխալ է տեղի ունեցել տպելիս: +PERR_FAILURE=Սխալ է տեղի ունեցել տպելիս։ -PERR_ABORT=Տպելը դադարեցվեց կամ չեղարկվեց: -PERR_NOT_AVAILABLE=Տպիչի որոշ գործառույթներ հասանելի չեն: -PERR_NOT_IMPLEMENTED=Տպելու որոշ գործառույթներ դեռ իրագործված չեն: -PERR_OUT_OF_MEMORY=Հիշողությունը քիչ է: -PERR_UNEXPECTED=Սխալ՝ նախադիտման ժամանակ: +PERR_ABORT=Տպելը դադարեցվեց կամ չեղարկվեց։ +PERR_NOT_AVAILABLE=Տպիչի որոշ գործառույթներ հասանելի չեն։ +PERR_NOT_IMPLEMENTED=Տպելու որոշ գործառույթներ դեռ իրագործված չեն։ +PERR_OUT_OF_MEMORY=Տպելու համար չկա բավարար ազատ հիշողություն: +PERR_UNEXPECTED=Տպելիս անսպասելի խնդիր է առաջացել։ -PERR_GFX_PRINTER_NO_PRINTER_AVAILABLE=Որևէ տպիչ առկա չէ: -PERR_GFX_PRINTER_NO_PRINTER_AVAILABLE_PP=Տպիչներ չկան, հնարավոր չէ նախադիտել: -PERR_GFX_PRINTER_NAME_NOT_FOUND=Ընտրված տպիչը չի գտնվել: -PERR_GFX_PRINTER_COULD_NOT_OPEN_FILE=ՀՆարավոր չեղավ բացել արտածվող ֆայլը՝ այն տպելու համար: +PERR_GFX_PRINTER_NO_PRINTER_AVAILABLE=Որևէ տպիչ առկա չէ։ +PERR_GFX_PRINTER_NO_PRINTER_AVAILABLE_PP=Տպիչներ չկան, հնարավոր չէ նախադիտել։ +PERR_GFX_PRINTER_NAME_NOT_FOUND=Ընտրված տպիչը չի գտնվել։ +PERR_GFX_PRINTER_COULD_NOT_OPEN_FILE=Հնարավոր չեղավ բացել արտածվող ֆայլը՝ այն տպելու համար։ PERR_GFX_PRINTER_STARTDOC=Տպելը ձախողվեց՝ դեռ չսկսված: -PERR_GFX_PRINTER_ENDDOC=Տպելը ձախողվեց տպելու ընթացքում: -PERR_GFX_PRINTER_STARTPAGE=Տպելը ձախողվեց՝ նոր էջ բացելիս: -PERR_GFX_PRINTER_DOC_IS_BUSY=Այս փաստաթուղթը դեռ չի բացվել, ուստի հնարավոր չէ այն տպել: -PERR_GFX_PRINTER_DOC_IS_BUSY_PP=Այս փաստաթուղթը դեռ չի բացվել, ուստի հնարավոր չէ դրա նախադիտումը: +PERR_GFX_PRINTER_ENDDOC=Տպելը ձախողվեց տպելու ընթացքում։ +PERR_GFX_PRINTER_STARTPAGE=Տպելը ձախողվեց՝ նոր էջ բացելիս։ +PERR_GFX_PRINTER_DOC_IS_BUSY=Այս փաստաթուղթը դեռ հնարավոր չէ տպել, քանի որ այն դեռ բեռնվում է։ +PERR_GFX_PRINTER_DOC_IS_BUSY_PP=Այս փաստաթուղթը դեռ չի բացվել, ուստի հնարավոր չէ դրա նախադիտումը։ diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/caps.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/caps.properties index 6bbfed68602cf337ba805aaa43afa4afe2102516..239925b9a8ef5389d2011953944103dbf9cdd824 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/caps.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/caps.properties @@ -1,16 +1,16 @@ # 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/. -CheckLoadURIError = Անվտանգության բացառում: %S-ի պարունակությունը իրավասու չէ բեռնավորել հղում %S-ում: -CheckSameOriginError = Անվտանգության բացառում: %Sի պարունակությունն իրավասու չէ %Sից տվյալներ բեռնավորել: -ExternalDataError = Անվտանգության սխալ. %S-ի բովանդակությունը փորձում է բեռնել %S-ը, բայց չի կարող բեռնել արտաքին տվյալ, երբ օգտագործվում է որպես պատկեր:\u0020 +CheckLoadURIError = Անվտանգության բացառում։ %S-ի պարունակությունը իրավասու չէ բեռնավորել հղում %S-ում։ +CheckSameOriginError = Անվտանգության բացառում: %Sի պարունակությունն իրավասու չէ %Sից տվյալներ բեռնավորել։ +ExternalDataError = Անվտանգության սխալ. %S-ի բովանդակությունը փորձում է բեռնել %S-ը, բայց չի կարող բեռնել արտաքին տվյալ, երբ օգտագործվում է որպես պատկեր։ # LOCALIZATION NOTE (GetPropertyDeniedOrigins): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. # %3$S is the property of that object that access was denied for. # %4$S is the origin of the object access was denied to. -GetPropertyDeniedOrigins = <%1$S>-ին թույլտրված չէ <%4$S>-ից վերցնել %2$S.%3$S տվյալներ: +GetPropertyDeniedOrigins = <%1$S>-ին թույլտրված չէ <%4$S>-ից վերցնել %2$S.%3$S տվյալներ։ # LOCALIZATION NOTE (GetPropertyDeniedOriginsSubjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. @@ -18,7 +18,7 @@ GetPropertyDeniedOrigins = <%1$S>-ին թույլտրված չէ <%4$S>-ից վ # %4$S is the origin of the object access was denied to. # %5$S is the value of document.domain for the script which was denied access; # don't translate "document.domain". -GetPropertyDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի թույլտվություն %2$S.%3$S -ի <%4$S> (document.domain չի նշանակվել) կարգավորումները ստանալու: +GetPropertyDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի թույլտվություն %2$S.%3$S -ի <%4$S> (document.domain չի նշանակվել) կարգավորումները ստանալու։ # LOCALIZATION NOTE (GetPropertyDeniedOriginsObjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. @@ -26,7 +26,7 @@ GetPropertyDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չո # %4$S is the origin of the object access was denied to. # %5$S is the value of document.domain for the object being accessed; # don't translate "document.domain". -GetPropertyDeniedOriginsObjectDomain = <%1$S>-ը չունի արտոնություն <%4$S> (document.domain=<%5$S>)-ի %2$S.%3$S հատկանիշը վերցնելու (document.domain դեռ տեղադրված չէ): +GetPropertyDeniedOriginsObjectDomain = <%1$S>-ը չունի արտոնություն <%4$S> (document.domain=<%5$S>)-ի %2$S.%3$S հատկանիշը վերցնելու (document.domain դեռ տեղադրված չէ)։ # LOCALIZATION NOTE (GetPropertyDeniedOriginsSubjectDomainObjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. @@ -36,14 +36,14 @@ GetPropertyDeniedOriginsObjectDomain = <%1$S>-ը չունի արտոնությո # don't translate "document.domain" # %6$S is the value of document.domain for the object being accessed; # don't translate "document.domain". -GetPropertyDeniedOriginsSubjectDomainObjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի <%4$S> (document.domain=<%6$S>)-ի %2$S.%3$S հատկանիշը վերցնելու արտոնություն: +GetPropertyDeniedOriginsSubjectDomainObjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի <%4$S> (document.domain=<%6$S>)-ի %2$S.%3$S հատկանիշը վերցնելու արտոնություն։ # LOCALIZATION NOTE (SetPropertyDeniedOrigins): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. # %3$S is the property of that object that access was denied for. # %4$S is the origin of the object access was denied to. -SetPropertyDeniedOrigins = <%1$S>-ին արգելված է <%4$S>-ի վրա դնել %2$S.%3$S կարգավորումներ: +SetPropertyDeniedOrigins = <%1$S>-ին արգելված է <%4$S>-ի վրա դնել %2$S.%3$S կարգավորումներ։ # LOCALIZATION NOTE (SetPropertyDeniedOriginsSubjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. @@ -51,7 +51,7 @@ SetPropertyDeniedOrigins = <%1$S>-ին արգելված է <%4$S>-ի վրա դն # %4$S is the origin of the object access was denied to. # %5$S is the value of document.domain for the script which was denied access; # don't translate "document.domain". -SetPropertyDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի <%4$S>-ի (document.domain has not been set) %2$S.%3$S հատկանիշը փոփոխելու արտոնություն: +SetPropertyDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի <%4$S>-ի (document.domain has not been set) %2$S.%3$S հատկանիշը փոփոխելու արտոնություն։ # LOCALIZATION NOTE (SetPropertyDeniedOriginsObjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. @@ -59,7 +59,7 @@ SetPropertyDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չո # %4$S is the origin of the object access was denied to. # %5$S is the value of document.domain for the object being accessed; # don't translate "document.domain". -SetPropertyDeniedOriginsObjectDomain = <%1$S>-ը (document.domain has not been set) չունի արտոնություն <%4$S> (document.domain=<%5$S>)-ում %2$S.%3$S նախընտրանք դնելու: +SetPropertyDeniedOriginsObjectDomain = <%1$S>-ը (document.domain has not been set) չունի արտոնություն <%4$S> (document.domain=<%5$S>)-ում %2$S.%3$S նախընտրանք դնելու։ # LOCALIZATION NOTE (SetPropertyDeniedOriginsSubjectDomainObjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. @@ -69,14 +69,14 @@ SetPropertyDeniedOriginsObjectDomain = <%1$S>-ը (document.domain has not been s # don't translate "document.domain" # %6$S is the value of document.domain for the object being accessed; # don't translate "document.domain". -SetPropertyDeniedOriginsSubjectDomainObjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի թույլտվություն <%4$S>-ում (document.domain=<%6$S>) %2$S.%3$S կարգավորումներ կատարելու: +SetPropertyDeniedOriginsSubjectDomainObjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի թույլտվություն <%4$S>-ում (document.domain=<%6$S>) %2$S.%3$S կարգավորումներ կատարելու։ # LOCALIZATION NOTE (CallMethodDeniedOrigins): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. # %3$S is the method of that object that access was denied for. # %4$S is the origin of the object access was denied to. -CallMethodDeniedOrigins = <%1$S>-ը չունի թույլտվություն օգտագործել %2$S.%3$S մեթոդ <%4$S>-ում: +CallMethodDeniedOrigins = <%1$S>-ը չունի թույլտվություն օգտագործել %2$S.%3$S մեթոդ <%4$S>-ում։ # LOCALIZATION NOTE (CallMethodDeniedOriginsSubjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. @@ -84,7 +84,7 @@ CallMethodDeniedOrigins = <%1$S>-ը չունի թույլտվություն օգ # %4$S is the origin of the object access was denied to. # %5$S is the value of document.domain for the script which was denied access; # don't translate "document.domain". -CallMethodDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի <%4$S> -ի նկատմամբ %2$S.%3$S մեթոդ կիրառելու արտոնություն (document.domain-ը դեռ տեղադրված չէ): +CallMethodDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի <%4$S> -ի նկատմամբ %2$S.%3$S մեթոդ կիրառելու արտոնություն (document.domain-ը դեռ տեղադրված չէ)։ # LOCALIZATION NOTE (CallMethodDeniedOriginsObjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. @@ -92,7 +92,7 @@ CallMethodDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չու # %4$S is the origin of the object access was denied to. # %5$S is the value of document.domain for the object being accessed; # don't translate "document.domain". -CallMethodDeniedOriginsObjectDomain = <%1$S>-ը (document.domain has not been set) չունի արտոնություն <%4$S> (document.domain=<%5$S>) -ի նկատմամբ %2$S.%3$S մեթոդ կիրառելու: +CallMethodDeniedOriginsObjectDomain = <%1$S>-ը (document.domain has not been set) չունի արտոնություն <%4$S> (document.domain=<%5$S>) -ի նկատմամբ %2$S.%3$S մեթոդ կիրառելու։ # LOCALIZATION NOTE (CallMethodDeniedOriginsSubjectDomainObjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. @@ -102,11 +102,12 @@ CallMethodDeniedOriginsObjectDomain = <%1$S>-ը (document.domain has not been se # don't translate "document.domain" # %6$S is the value of document.domain for the object being accessed; # don't translate "document.domain". -CallMethodDeniedOriginsSubjectDomainObjectDomain = <%1$S> (document.domain=<%5$S>) -ը չունի թույլտվություն <%4$S> (document.domain=<%6$S>) -ի նկատմամբ %2$S.%3$S մեթոդ կանչելու: +CallMethodDeniedOriginsSubjectDomainObjectDomain = <%1$S> (document.domain=<%5$S>) -ը չունի թույլտվություն <%4$S> (document.domain=<%6$S>) -ի նկատմամբ %2$S.%3$S մեթոդ կանչելու։ -GetPropertyDeniedOriginsOnlySubject = <%S>-ը չունի %S.%S-ից կարգավորումներ վերցնելու թույլտվություն: +GetPropertyDeniedOriginsOnlySubject = <%S>-ը չունի %S.%S-ից կարգավորումներ վերցնելու թույլտվություն։ SetPropertyDeniedOriginsOnlySubject = <%S>-ը չունի իրավունք կատարելու %S.%S կարգավորումներ CallMethodDeniedOriginsOnlySubject = <%S>-ը չունի %S.%S մեթոդ օգտագործելու իրավունք + CreateWrapperDenied = %S դասի Օբյեկտի համար շապիկի ստեղծումը մերժվեց CreateWrapperDeniedForOrigin = Թույլտվությունը մերժվում է <%2$S> համար ստեղծելով փաթեթ %1$S դասի օբյեկտի համար -ProtocolFlagError = Զգուշացում՝ Արձանագրության ղեկավարը '%S' համար չի գովազդում անվտանգության կանոնակարգ: Չնայած այս պահին թույլատրվում է բեռնել նման հաղորդակարգեր, սակայն խորհուրդ չի տրվում: Խնդում ենք նայել փաստաթղթերը nsIProtocolHandler.idl-ում: +ProtocolFlagError = Զգուշացում՝ Արձանագրության ղեկավարը '%S' համար չի գովազդում անվտանգության կանոնակարգ։ Չնայած այս պահին թույլատրվում է բեռնել նման հաղորդակարգեր, սակայն խորհուրդ չի տրվում։ Խնդում ենք նայել փաստաթղթերը nsIProtocolHandler.idl-ում։ diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/csp.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/csp.properties index 2325d7a5fe7dd7aafd2a325608dad3a59766fc0c..02e44b5e766cfcb0959f76b1f0490434a807a770 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/csp.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/csp.properties @@ -9,23 +9,23 @@ CSPViolation = Էջի կարգավորումները արգելափակել են # LOCALIZATION NOTE (CSPViolationWithURI): # %1$S is the directive that has been violated. # %2$S is the URI of the resource which violated the directive. -CSPViolationWithURI = Էջի կարգավորումները արգելափակել են ռեսուրսի բեռնումը %2$S ("%1$S"): +CSPViolationWithURI = Էջի կարգավորումները արգելափակել են ռեսուրսի բեռնումը %2$S («%1$S»)։ # LOCALIZATION NOTE (CSPROViolation): # %1$S is the reason why the resource has not been loaded. -CSPROViolation = Խախտում է տեղի ունեցել միայն զեկույցի CSP դրույթում (“%1$S”): Վարքը թույլատրելի էր և CSP զեկույցը ուղարկվել է: +CSPROViolation = Խախտում է տեղի ունեցել միայն զեկույցի CSP դրույթում («%1$S»)։ Վարքը թույլատրելի էր և CSP զեկույցը ուղարկվել է։ # LOCALIZATION NOTE (CSPROViolationWithURI): # %1$S is the directive that has been violated. # %2$S is the URI of the resource which violated the directive. -CSPROViolationWithURI = Էջի կարգավորումները դիտարկում են ռեսուրսի բեռնում %2$S (“%1$S”)-ում: CSP զեկույցը ուղարկվել է: +CSPROViolationWithURI = Էջի կարգավորումները դիտարկում են ռեսուրսի բեռնում %2$S («%1$S»)-ում։ CSP զեկույցը ուղարկվել է։ # LOCALIZATION NOTE (triedToSendReport): # %1$S is the URI we attempted to send a report to. -triedToSendReport = Անվավեր URI-ին զեկույց ուղարկելու փորձ."%1$S" +triedToSendReport = Անվավեր URI-ին զեկույց ուղարկելու փորձ.«%1$S» # LOCALIZATION NOTE (couldNotParseReportURI): # %1$S is the report URI that could not be parsed -couldNotParseReportURI = Անհնար է վերլուծել URI զեկույցը.%1$S +couldNotParseReportURI = Անհնար է վերլուծել URI զեկույցը. %1$S # LOCALIZATION NOTE (couldNotProcessUnknownDirective): # %1$S is the unknown directive -couldNotProcessUnknownDirective = \u0020'%1$S' անհայտ հրահանգը անհնար է մշակել +couldNotProcessUnknownDirective = '%1$S' անհայտ հրահանգը անհնար է մշակել # LOCALIZATION NOTE (ignoringUnknownOption): # %1$S is the option that could not be understood ignoringUnknownOption = %1$S անհայտ ընտրանքի անտեսում @@ -34,37 +34,37 @@ ignoringUnknownOption = %1$S անհայտ ընտրանքի անտեսում ignoringDuplicateSrc = Կրկնվող աղբյուրի անտեսում %1$S # LOCALIZATION NOTE (ignoringSrcFromMetaCSP): # %1$S defines the ignored src -ignoringSrcFromMetaCSP = ‘%1$S’ աղբյուրի անտեսում (չի աջակցվում, երբ առաքված է մետա տարի միջոցով): +ignoringSrcFromMetaCSP = ‘%1$S’ աղբյուրի անտեսում (չի աջակցվում, երբ առաքված է մետա տարի միջոցով)։ # LOCALIZATION NOTE (ignoringSrcWithinScriptStyleSrc): # %1$S is the ignored src # script-src and style-src are directive names and should not be localized -ignoringSrcWithinScriptStyleSrc = “%1$S”-ի անտեսում, երբ հատկորոշված են script-src style-src:nonce-source կամ hash-source +ignoringSrcWithinScriptStyleSrc = «%1$S»-ի անտեսում, երբ հատկորոշված են script-src style-src:nonce-source կամ hash-source # LOCALIZATION NOTE (ignoringSrcForStrictDynamic): # %1$S is the ignored src # script-src, as well as 'strict-dynamic' should not be localized -ignoringSrcForStrictDynamic = Անտեսել “%1$S” հետևյալ script-src: ‘strict-dynamic’-ը հատկորոշվեց +ignoringSrcForStrictDynamic = Անտեսել «%1$S» հետևյալ script-src: ‘strict-dynamic’-ը հատկորոշվեց # LOCALIZATION NOTE (ignoringStrictDynamic): # %1$S is the ignored src -ignoringStrictDynamic = Անտեսել “%1$S”-ի աղբյուրը (Միայն աջակցված հետևյալ script-src)։ +ignoringStrictDynamic = Անտեսել «%1$S»-ի աղբյուրը (Միայն աջակցված հետևյալ script-src)։ # LOCALIZATION NOTE (strictDynamicButNoHashOrNonce): # %1$S is the csp directive that contains 'strict-dynamic' # 'strict-dynamic' should not be localized -strictDynamicButNoHashOrNonce = Բանալի բառը ‘strict-dynamic’ հետևյալ “%1$S” ոչ վավեր nonce-ի հետ կամ hash-ը կարող է բեռնումից արգելափակել բոլոր գրվածքները +strictDynamicButNoHashOrNonce = Բանալի բառը ‘strict-dynamic’ հետևյալ «%1$S» ոչ վավեր nonce-ի հետ կամ hash-ը կարող է բեռնումից արգելափակել բոլոր գրվածքները # LOCALIZATION NOTE (reportURInotHttpsOrHttp2): # %1$S is the ETLD of the report URI that is not HTTP or HTTPS -reportURInotHttpsOrHttp2 = Զեկույցի URI (%1$S)-ին պետք է լինի HTTP կամ HTTPS URI: +reportURInotHttpsOrHttp2 = Զեկույցի URI (%1$S)-ին պետք է լինի HTTP կամ HTTPS URI։ # LOCALIZATION NOTE (reportURInotInReportOnlyHeader): # %1$S is the ETLD of the page with the policy -reportURInotInReportOnlyHeader = Այս կասքը (%1$S) ունի Report-Only քաղաքականություն առանց URI զեկույցի։ CSP-ը չի արգելափակի և չի կարող զեկուցել այս քաղաքականության խախտումները։ +reportURInotInReportOnlyHeader = Այս կայքը (%1$S) ունի Report-Only քաղաքականություն առանց URI զեկույցի։ CSP-ը չի արգելափակի և չի կարող զեկուցել այս քաղաքականության խախտումները։ # LOCALIZATION NOTE (failedToParseUnrecognizedSource): # %1$S is the CSP Source that could not be parsed -failedToParseUnrecognizedSource = Հնարավոր չեղավ վերլուծել չճանաչված %1$S աղբյուրը\u0020 +failedToParseUnrecognizedSource = Հնարավոր չեղավ վերլուծել չճանաչված %1$S աղբյուրը։ # LOCALIZATION NOTE (inlineScriptBlocked): # inline script refers to JavaScript code that is embedded into the HTML document. inlineScriptBlocked = Ներգծված գրվածքի կատարումը արգելափակված է # LOCALIZATION NOTE (inlineStyleBlocked): # inline style refers to CSS code that is embedded into the HTML document. -inlineStyleBlocked = Ներգծված ոճի թերթի կիառումը արգելափակված է +inlineStyleBlocked = Ներգծված ոճի թերթի կիրառումը արգելափակված է # LOCALIZATION NOTE (scriptFromStringBlocked): # eval is a name and should not be localized. scriptFromStringBlocked = JavaScript-ի կանչը տողից արգելափակված է @@ -72,36 +72,34 @@ scriptFromStringBlocked = JavaScript-ի կանչը տողից արգելափակ # %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. upgradeInsecureRequest = ‘%1$S’ ոչ անվտանգ հարցման արդիացում ‘%2$S’-ի # LOCALIZATION NOTE (ignoreSrcForDirective): -ignoreSrcForDirective = Անտեսեք srcs-ը ‘%1$S’ հրահանգի համար: +ignoreSrcForDirective = Անտեսեք srcs-ը ‘%1$S’ հրահանգի համար։ # LOCALIZATION NOTE (hostNameMightBeKeyword): # %1$S is the hostname in question and %2$S is the keyword hostNameMightBeKeyword = %1$S-ը ներկայացնում է որպես խնամորդի անուն, այլ ոչ թե բանալի բառ։ Եթե դուք ցանկանում եք, որ սա լինի բանալի բառ, օգտագործեք ‘%2$S’ (տեղավորված մեկ չակերտում)։ # LOCALIZATION NOTE (notSupportingDirective): # directive is not supported (e.g. 'reflected-xss') -notSupportingDirective = ‘%1$S’ հրահանգը չի ապահովվում: Հրահանգը և արժեքները անտեսվելու են: +notSupportingDirective = ‘%1$S’ հրահանգը չի ապահովվում։ Հրահանգը և արժեքները անտեսվելու են։ # LOCALIZATION NOTE (blockAllMixedContent): # %1$S is the URL of the blocked resource load. -blockAllMixedContent = ‘%1$S’ ոչ անվտանգ հարցման արգելափակում: +blockAllMixedContent = ‘%1$S’ ոչ անվտանգ հարցման արգելափակում։ # LOCALIZATION NOTE (ignoringDirectiveWithNoValues): # %1$S is the name of a CSP directive that requires additional values ignoringDirectiveWithNoValues = ‘%1$S’-ի անտեսում, քանի որ այն չի պարունակում որևէ ցուցիչ: # LOCALIZATION NOTE (ignoringReportOnlyDirective): # %1$S is the directive that is ignored in report-only mode. -ignoringReportOnlyDirective = Անտեսեք ավազատուփի հրահանգը ‘%1$S’ միակ զեկույցի քաղաքականության մեջ: +ignoringReportOnlyDirective = Անտեսեք ավազատուփի հրահանգը ‘%1$S’ միակ զեկույցի քաղաքականության մեջ։ # LOCALIZATION NOTE (deprecatedReferrerDirective): # %1$S is the value of the deprecated Referrer Directive. -deprecatedReferrerDirective = Referrer ‘%1$S’ հրահանգը արժեզրկվում է: Փոխարենը օգտագործեք Referrer- ի քաղաքականության վերնագիրը: +deprecatedReferrerDirective = Referrer ‘%1$S’ հրահանգը արժեզրկվում է։ Փոխարենը օգտագործեք Referrer- ի քաղաքականության վերնագիրը։ # LOCALIZATION NOTE (IgnoringSrcBecauseOfDirective): # %1$S is the name of the src that is ignored. # %2$S is the name of the directive that causes the src to be ignored. -IgnoringSrcBecauseOfDirective=Անտեսեք ‘%1$S’ - ը ‘%2$S’ հրահանգի պատճառով: - +IgnoringSrcBecauseOfDirective=Անտեսեք ‘%1$S’ - ը ‘%2$S’ հրահանգի պատճառով։ # LOCALIZATION NOTE (IgnoringSourceWithinDirective): # %1$S is the ignored src # %2$S is the directive which supports src -IgnoringSourceWithinDirective = Անտեսեք “%1$S” աղբյուրը (Not supported within ‘%2$S’): - +IgnoringSourceWithinDirective = Անտեսեք “%1$S” աղբյուրը (Not supported within ‘%2$S’)։ # CSP Errors: # LOCALIZATION NOTE (couldntParseInvalidSource): @@ -115,10 +113,10 @@ couldntParseInvalidHost = Չհաջողվեց վերլուծել անվավեր % couldntParseScheme = %1$S-ում չհաջողվեց վերլուծել սխեման # LOCALIZATION NOTE (couldntParsePort): # %1$S is the string source -couldntParsePort = \u0020 Չհաջողվեց վերլուծել միացքը %1$S-ում \u0020 +couldntParsePort = Չհաջողվեց վերլուծել միացքը %1$S-ում # LOCALIZATION NOTE (duplicateDirective): # %1$S is the name of the duplicate directive -duplicateDirective = Հայտնաբերվել է կրկնօրինակվող %1$S հրահանգներ:Բացի առաջինից բոլոր նմուշները կմերժվեն: +duplicateDirective = Հայտնաբերվել է կրկնօրինակվող %1$S հրահանգներ։ Բացի առաջինից բոլոր նմուշները կմերժվեն։ # LOCALIZATION NOTE (deprecatedChildSrcDirective): # %1$S is the value of the deprecated directive. # Do not localize: worker-src, frame-src diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/security.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/security.properties index 86f763dc246c9fbaf1f5000425ae90b4cf2e0896..42fc7c11dfc3ae2726000316b4b1be3e21326a05 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/security.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/security.properties @@ -21,10 +21,12 @@ CORSNotSupportingCredentials=Cross-Origin հարցումը արգելափակվ CORSMethodNotFound=Cross-Origin հարցումը արգելափակված է. միևնույն Origin Policy-ին չի թույլատրում հեռակա ռեսուրսի ընթերցում %1$S-ում: (Պատճառը՝ չի կարողացել գտնել մեթոդ CORS-ի ‘Access-Control-Allow-Methods’ էջագլխում): CORSMissingAllowCredentials=Cross-Origin հարցումը արգելափակված է. միևնույն Origin Policy-ին չի թույլատրում հեռակա ռեսուրսի ընթերցում %1$S-ում: (Պատճառը՝ ակնկալվել է ‘true’ CORS-ի ‘Access-Control-Allow-Credentials’-ում): CORSPreflightDidNotSucceed=Cross-Origin հարցումը արգելափակված է. միևնույն Origin Policy-ին չի թույլատրում հեռակա ռեսուրսի ընթերցում %1$S-ում: (Պատճառը՝ CORS-ի preflight ալիքը հաջող չէր): +CORSPreflightDidNotSucceed2=Խաչաձև ծագման հարցում արգելափակված է. Նույն ծագման քաղաքականությունը թույլ է տալիս կարդալ հեռավոր ռեսուրսը %1$S֊ով։ (Պատճառը. CORS- ի նախնական թռիչքային պատասխանը չհաջողվեց)։ CORSInvalidAllowMethod=Cross-Origin հարցումը արգելափակված է. միևնույն Origin Policy-ին չի թույլատրում հեռակա ռեսուրսի ընթերցում %1$S-ում: (Պատճառը՝ ‘%2$S’ անվավեր թոքեն CORS-ի ‘Access-Control-Allow-Methods’ էջագլխում): CORSInvalidAllowHeader=Cross-Origin հարցումը արգելափակված է. միևնույն Origin Policy-ին չի թույլատրում հեռակա ռեսուրսի ընթերցում %1$S-ում: (Պատճառը՝ ‘%2$S’ անվավեր թոքեն CORS-ի ‘Access-Control-Allow-Headers’ էջագլխում): CORSMissingAllowHeaderFromPreflight=Cross-Origin հարցումը արգելափակված է. միևնույն Origin Policy-ին չի թույլատրում հեռակա ռեսուրսի ընթերցում %1$S-ում: (Պատճառը՝ ‘%2$S’ բացակայող թոքեն CORS-ի ‘Access-Control-Allow-Headers’ էջագլխում): +CORSMissingAllowHeaderFromPreflight2=Խաչաձև ծագման հարցում արգելափակված է. Նույն ծագման քաղաքականությունը թույլ է տալիս կարդալ հեռավոր ռեսուրսը %1$S֊ով։ (Պատճառը. Վերնագիր «%2$S»֊ը չի թույլատրվում ըստ վերնագրի «Մուտքի հսկողություն-թույլատրել-վերնագրերը» CORS-ի նախնական թռիչքային պատասխանից)։ # LOCALIZATION NOTE: Do not translate "Strict-Transport-Security", "HSTS", "max-age" or "includeSubDomains" STSUnknownError=Խիստ փոխանցման֊անվտանգություն․Անհայտ սխալ է տեղի ունեցել կայքի կողմից նշված վերնագրի մշակման ժամանակ։ @@ -132,7 +134,6 @@ FeaturePolicyInvalidEmptyAllowValue= Յուրահատկությանքաղաքա # TODO: would be nice to add a link to the Feature-Policy MDN documentation here. See bug 1449501 FeaturePolicyInvalidAllowValue=Կորպորատիվ քաղաքականություն: Բաց թողեք արգելված արժեքը “%S” - # LOCALIZATION NOTE: "%1$S" is the limitation length (bytes) of referrer URI, "%2$S" is the origin of the referrer URI. ReferrerLengthOverLimitation=Հղում կատարող HTTP վերնագիր: Վերնագրի երկարությունը գերազանցում է “%1$S” բայթերի սահմանը. Ուղղորդեք վերնագրողի ծագման ծագումը. “%2$S” # LOCALIZATION NOTE: "%1$S" is the limitation length (bytes) of referrer URI, "%2$S" is the origin of the referrer URI. @@ -146,12 +147,16 @@ XFODeny = Բեռնումը X-Frame-Options:-ի կողմից մերժված է # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Բեռնումը մերժված է X-Frame-Options:-ի կողմից“%1$S” “%2$S”-ից, կայքը չի թույլատրում cross-origin framing %3$S%3$S”-ից: -CORSPreflightDidNotSucceed2=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: CORS preflight response did not succeed). -CORSMissingAllowHeaderFromPreflight2=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: header ‘%2$S’ is not allowed according to header ‘Access-Control-Allow-Headers’ from CORS preflight response). +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = «%2$S» բեռնում տեղադրելու ժամանակ հայտնաբերվեց անվավեր X- շրջանակի ընտրանքների վերնագիր. «%1$S»-ը վավեր հրահանգ չէ։ +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=Շրջանակներում «%2$S»-ի բեռնումը մերժվում է «X-Frame-Options» հրահանգով, որը սահմանվում է «%1$S»։ + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. -HTTPSOnlyUpgradeRequest = Upgrading insecure request “%1$S” to use “%2$S”. +HTTPSOnlyUpgradeRequest = «%1$S» ոչ անվտանգ հարցման արդիացում «%2$S»-ի։ # LOCALIZATION NOTE: %1$S is the URL of request. -HTTPSOnlyNoUpgradeException = Not upgrading insecure request “%1$S” because it is exempt. +HTTPSOnlyNoUpgradeException = Անվտանգության խնդրանքը «%1$S» չի թարմացնում, քանի որ այն ազատված է։ # LOCALIZATION NOTE: %1$S is the URL of the failed request; %2$S is an error-code. -HTTPSOnlyFailedRequest = Upgrading insecure request “%1$S” failed. (%2$S) +HTTPSOnlyFailedRequest = «%1$S» անապահով հարցման արդիականացումը ձախողվեց։ (%2$S) diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/svg/svg.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/svg/svg.properties index 544d23fa7f9ee17300d370a6dcaa123244ab1f68..65c8b92193325a8ad1c0d7cbd88cc66cb0eca6a4 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/svg/svg.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/svg/svg.properties @@ -2,4 +2,4 @@ # 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/. -AttributeParseWarning=%1$S-ի անալիզի ժամանակ անկանխատեսելի %2$S անժեք: +AttributeParseWarning=%1$S-ի անալիզի ժամանակ անկանխատեսելի %2$S արժեք։ diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/xml/prettyprint.dtd b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/xml/prettyprint.dtd index fe43a6fef538d166bd02cd3560398aa11fc95e9c..9c7b0733d783bb7fd1aa11f9522941795dc1b03f 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/xml/prettyprint.dtd +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/xml/prettyprint.dtd @@ -2,4 +2,4 @@ - 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/. --> -<!ENTITY xml.nostylesheet "Այս XML ֆայլը չունի իր հետ կապված որևէ ոճական տեղեկություն: Փաստաթղթի ծառը բերված է ստորև:"> +<!ENTITY xml.nostylesheet "Այս XML նիշքը չունի իր հետ կապված որևէ ոճական տեղեկություն։ Փաստաթղթի ծառը բերված է ստորև։"> diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/xslt/xslt.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/xslt/xslt.properties index 5af433426e99ae650e1b4a55bd54fe9ecb38aa74..77cadf0229f140ddb743d247f06b7ae798b02579 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/xslt/xslt.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/xslt/xslt.properties @@ -2,38 +2,38 @@ # 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/. -1 = XSLT ձևաթերթի վերլուծությանը խափանվեց: -2 = XPath արտահայտության վերլուծությունը խափանվեց: +1 = XSLT ձևաթերթի վերլուծութիւնը խափանվեց։ +2 = XPath արտահայտության վերլուծությունը խափանվեց։ 3 = -4 = XSLT-փոխակերպումը խափանվեց: -5 = Անվավեր XSLT/XPath-գործառույթ: -6 = XSLT ձևաթերթը (հավանաբար) պարունակում է ինքնականչ: +4 = XSLT-փոխակերպումը խափանվեց։ +5 = Անվավեր XSLT/XPath-գործառույթ։ +6 = XSLT ձևաթերթը (հավանաբար) պարունակում է ինքնականչ։ 7 = XSLT 1.0ի համար հատկանիշի արժեքն անվավեր է: -8 = XPathարտահատությունը պիտի վերադարձներ հանգուցախումբ: -9 = XSLT փոխակերպումն ընդհատվեց <xsl:message>ի միջոցով: -10 = XSLT-ձևաթերթի բեռնավորման ընթացքում ցանցային սխալմունք պատահեց: -11 = XSLT ձևաթերթը չունի XML-MIME տեսակ: +8 = XPath արտահայտությունը պիտի վերադարձներ NodeSet։ +9 = XSLT փոխակերպումն ընդհատվեց <xsl:message>ի միջոցով։ +10 = XSLT-ձևաթերթի բեռնավորման ընթացքում ցանցային սխալմունք պատահեց։ +11 = XSLT ձևաթերթը չունի XML տեսակ: 12 = XSLT-ձևաթերթն ուղղակիորեն թե անուղղակիորեն ներմուծում կամ ներգրավում է ինքն իրեն: -13 = XPath-գործառույթը կոչվել է սխալ քանակի մուտքային տվյալներով: -14 = Անհայտ XPath-ընդլանված գործառույթ է կոչվել: -15 = XPath-վերլուծության սխալմունք՝. ')' սպասվում էր՝. -16 = XPath-վերլուծության սխալմունք՝. անվավեր առանցք՝. -17 = XPath-վերլուծության սխալմունք՝. Սպասվում էր ավանում կամ հանգուցատիպի ստուգում՝. -18 = XPath-վերլուծության սխալմունք՝. ']' սպասվում էր՝. -19 = XPath-վերլուծության սխալմունք՝. անվավեր փոփոխականի անվանում՝. -20 = XPath-վերլուծության սխալմունք՝. արտահայտության անսպասելի ավարտ՝. -21 = XPath-վերլուծության սխալմունք՝. սպասվում էր օպերատոր՝. -22 = նք՝. չփակված տառաշար՝. -23 = XPath-վերլուծության սխալմունք՝. ':'ն անսպասելի էր՝. -24 = XPath-վերլուծության սխալմունք՝. '!'-անսպասելի էր բացառումը not() է: +13 = XPath-գործառույթը կոչվել է սխալ քանակի մուտքային տվյալներով։ +14 = Անհայտ XPath-ընդլայնված գործառույթ է կոչվել։ +15 = XPath-վերլուծության սխալմունք. ')' սպասվում էր. +16 = XPath-վերլուծության սխալմունք․ անվավեր առանցք․ +17 = XPath-վերլուծության սխալմունք. Սպասվում էր ավանում կամ հանգուցատիպի ստուգում․ +18 = XPath-վերլուծության սխալմունք. ']' սպասվում էր. +19 = XPath-վերլուծության սխալմունք. անվավեր փոփոխականի անվանում. +20 = XPath-վերլուծության սխալմունք. արտահայտության անսպասելի ավարտ. +21 = XPath-վերլուծության սխալմունք. սպասվում էր օպերատոր. +22 = XPath֊վերլուծության սխալմունք. չփակված տառաշար. +23 = XPath-վերլուծության սխալմունք. ':'֊ն անսպասելի էր. +24 = XPath-վերլուծության սխալմունք. '!'-ն անսպասելի էր բացառումը not() է․ 25 = XPath-վերլուծության սխալմունք՝. անվավեր տառանիշ հանդիպեց՝. -26 = XPath-վերլուծության սխալմունք՝. սպասվում էր երկուական օպերատոր՝. -27 = XSLT ձևաթերթի բեռնավորումը արգելվեց անվտանգության պատճառներով՝. -28 = Սխալ արտահայտության հաշվում: -29 = Անկայուն ձևավոր փակագիծ: -30 = Սխալ QName-ով տարրի ստեղծում -31 = Փոփոխական կապը կանխազգուշացնում է միևնույն ձևաչափի մեջ փոփոխական կապի վերաբերյալ: -32 = Բանալու կանչի գործառույթը չի աջակցվում: +26 = XPath-վերլուծության սխալմունք. սպասվում էր երկուական օպերատոր. +27 = XSLT ձևաթերթի բեռնավորումը արգելվեց անվտանգության պատճառներով. +28 = Սխալ արտահայտության հաշվում։ +29 = Անկայուն ձևավոր փակագիծ։ +30 = Սխալ QName-ով տարրի ստեղծում։ +31 = Փոփոխական կապը կանխազգուշացնում է միևնույն ձևաչափի մեջ փոփոխական կապի վերաբերյալ։ +32 = Բանալու կանչի գործառույթը չի աջակցվում։ -LoadingError = Սխալմունք ձևաթերթի բեռնավորման ընթացքում: %S -TransformError = Սխալմունք XSLT փոխակերպման ընթացքում՝. %S +LoadingError = Սխալմունք ձևաթերթի բեռնավորման ընթացքում․ %S +TransformError = Սխալմունք XSLT փոխակերպման ընթացքում. %S diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/necko/necko.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/necko/necko.properties index 11242cd8857b57eb1bda8f00ec8b24c5e293b28c..71219328f4f6dca087b4dd7d8de54b74fc695278 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/necko/necko.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/necko/necko.properties @@ -11,19 +11,19 @@ 3=Որոնում %1$S… 4=Կապակցված է %1$S-ի հետ… 5=%1$S -ին Ուղարկվում է հարցում... -6=Տվյալների փոխանցում %1$S -ից ... -7=Կապակցում %1$S-ին... +6=Տվյալների փոխանցում %1$S -ից… +7=Կապակցում %1$S-ին… 8=Կարդացվել է %1$S 9=Գրվել է %1$S -10=Սպասում է %1$S-ի պատասխանին... -11=Գտնվել է՝ %1$S-ը... -12=TLS ձեռքսեղման կատարում %1$S-ի հետ... +10=Սպասում է %1$S-ի պատասխանին… +11=Գտնվել է՝ %1$S-ը… +12=TLS ձեռքսեղման կատարում %1$S-ի հետ… 13=TLS ձեռքսեղմումը ավարտվել է %1$S-ի հետ… 27=FTP-տռանզակցիայի սկիզբ... 28=FTP տռանզակցիան ավարտվեց -RepostFormData=Տեղի ունեցավ վերահասցեավորում: Ցանկանու՞մ էք մուտքագրած ձեր տվյալները վերահասցեավորել դեպի նոր հասցե: +RepostFormData=Տեղի ունեցավ վերահասցեավորում։ Ցանկանու՞մ էք մուտքագրած Ձեր տվյալները վերահասցեավորել դեպի նոր հասցե։ # Directory listing strings DirTitle=%1$S -ի ինդեքս @@ -34,18 +34,18 @@ DirColSize=Չափը DirColMTime=Վերջին փոփոխությունը DirFileLabel=ֆայլ` -PhishingAuth=Դուք պատրաստվում էք այցելել %1$S կայքը: Այս կայքը կարող է ձեզ խաբել, ձևանալով որպես այլ կայք. Եղեք չափազանց զգույշ: +PhishingAuth=Դուք պատրաստվում էք այցելել %1$S կայքը։ Այս կայքը կարող է Ձեզ խաբել, ձևանալով որպես այլ կայք. Եղեք չափազանց զգույշ։ PhishingAuthAccept=Ես դա հասկանում եմ և կլինեմ շատ զգույշ -SuperfluousAuth=Դուք պատրաստվում եք "%1$S" կայքում գրանցվել "%2$S" անվամբ, սակայն կայքը չի պահանջում նույնականացում: Սա կարող է ձեզ խաբելու փորձ լինել:\n\nԱրդյո՞ք "%1$S"-ը այն կայքն է, որը ցանկանում եք այցելել: -AutomaticAuth=Դուք պատրաստվում էք մուտք գործել «%1$S» կայք «%2$S» մականվամբ: +SuperfluousAuth=Դուք պատրաստվում եք «%1$S» կայքում գրանցվել «%2$S» անվամբ, սակայն կայքը չի պահանջում նույնականացում։ Սա կարող է Ձեզ խաբելու փորձ լինել։\n\nԱրդյո՞ք «%1$S»-ը այն կայքն է, որը ցանկանում եք այցելել։ +AutomaticAuth=Դուք պատրաստվում էք մուտք գործել «%1$S» կայք «%2$S» անունով: TrackerUriBlocked=“%1$S” աշխատամիջոցը արգելափակվել է, որովհետև բովանդակության արգելփակումը թույլատրված է։ UnsafeUriBlocked=Ռեսուրսը “%1$S”-ում արգելափակվել է Գաղտնի դիտարկման կողմից: CookieBlockedByPermission=“%1$S”-ում նշոցիկների կամ հիշողության հասանելիության դիմումը արգելափակվել է, հարմարեցված նշոցիկի արտոնության պատճառով։ -CookieBlockedTracker=“%1$S”-ում նշոցիկների կամ հիշողության հասանելիության դիմումը արգելափակվել է, որովհետև այն եկել է հետևումից և բովանդակության արգելափակումը թույլատրվել է։ -CookieBlockedAll=“%1$S”-ում նշոցիկների կամ հիշողության հասանելիության դիմումը արգելափակվել է, որովհետև մենք արգելափակում ենք հիշողության հասանելիության բոլոր դիմումները։ -CookieBlockedForeign=“%1$S”-ում նշոցիկների կամ հիշողության հասանելիության դիմումը արգելափակվել է, որովհետև մենք արգելափակում ենք բոլոր երրորդ֊կողմի հիշողության հասանելիության դիմումները և բովանդակության արգելափակումը թույլատրվել է։ +CookieBlockedTracker=«%1$S»-ում նշոցիկների կամ հիշողության հասանելիության դիմումը արգելափակվել է, որովհետև այն եկել է հետևումից և բովանդակության արգելափակումը թույլատրվել է։ +CookieBlockedAll=«%1$S»-ում նշոցիկների կամ հիշողության հասանելիության դիմումը արգելափակվել է, որովհետև մենք արգելափակում ենք հիշողության հասանելիության բոլոր դիմումները։ +CookieBlockedForeign=«%1$S»-ում նշոցիկների կամ հիշողության հասանելիության դիմումը արգելափակվել է, որովհետև մենք արգելափակում ենք բոլոր երրորդ֊կողմի հիշողության հասանելիության դիմումները և բովանդակության արգելափակումը թույլատրվել է։ # LOCALIZATION NOTE (CookieAllowedForOriginOnTrackerByStorageAccessAPI): %3$S, %2$S and %1$S are URLs. CookieAllowedForOriginOnTrackerByStorageAccessAPI=“%3$S”-ի համար տրվել է հիշողության մատչելիություն, “%2$S”-ը “%1$S”-ում բացվել է հետևման կողմից։ @@ -57,17 +57,19 @@ CookieAllowedForOriginOnTrackerByHeuristic=“%2$S”֊ի կողմից բացվ # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=“%2$S” որոնիչի համար ավտոմատ կերպով տրամադրվում է պահեստային մուտք՝ “%1$S”։ +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". -CookieRejectedNonRequiresSecure=Cookie “%1$S” rejected because it has the “sameSite=none” attribute but is missing the “secure” attribute. +CookieRejectedNonRequiresSecure=Նշոցիկ «%1$S»-ը մերժվեց, քանի որ այն ունի «sameSite=ոչ» ատրիբուտը, բայց բացակայում է «անվտանգ» հատկանիշը։ # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". -CookieRejectedNonRequiresSecureForBeta=Cookie “%1$S” will be soon rejected because it has the “sameSite” attribute set to “none” or an invalid value, without the “secure” attribute. To know more about the “sameSite“ attribute, read %2$S +CookieRejectedNonRequiresSecureForBeta=Նշոցիկ «%1$S»֊ը շուտով մերժվում է, քանի որ այն ունի «sameSite» հատկանիշը, որը սահմանվում է «ոչ մեկի» կամ անվավեր արժեքի, առանց «ապահով» հատկանիշի։ «SameSite» ատրիբուտի մասին ավելին իմանալու համար կարդացեք %2$S # LOCALIZATION NOTE(CookieLaxForced): %1$S is the cookie name. Do not localize "sameSite", "lax" and "sameSite=lax". -CookieLaxForced=Cookie “%1$S” has “sameSite” policy set to “lax” because it is missing a “sameSite” attribute, and “sameSite=lax” is the default value for this attribute. +CookieLaxForced=Նշոցիկ «%1$S»֊ը ունի «SameSite» կանոնակարգը, որը սահմանվել է «մեղմ», քանի որ այն բացակայում է «sameSite» հատկանիշին, և «sameSite=մեղմ»֊ը այս հատկանիշի լռելյայն արժեքն է։ # LOCALIZATION NOTE(CookieLaxForcedForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "lax" and "sameSite=lax", "sameSite=none". -CookieLaxForcedForBeta=Cookie “%1$S” does not have a proper “sameSite” attribute value. Soon, cookies without the “sameSite” attribute or with an invalid value will be treated as “lax”. This means that the cookie will no longer be sent in third-party contexts. If your application depends on this cookie being available in such contexts, please add the “sameSite=none“ attribute to it. To know more about the “sameSite“ attribute, read %2$S +CookieLaxForcedForBeta=Նշոցիկ «%1$S»֊ը չունի համապատասխան «sameSite» հատկանիշի արժեք։ Շուտով, նշոցիկերը, առանց «sameSite» հատկանիշի կամ անվավեր արժեքի, կդառնան «մեղմ»։ Սա նշանակում է, որ նշոցիկն այլևս չի ուղարկվի երրորդ կողմի ենթատեքստերում։ Եթե Ձեր դիմումը կախված է այն բանից, որ այս նշոցիկն առկա է նման համագրույթերում, խնդրում ենք դրան ավելացրեք «sameSite=ոչ» ատրիբուտը։ «SameSite» ատրիբուտի մասին ավելին իմանալու համար կարդացեք %2$S # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none" -CookieSameSiteValueInvalid=Invalid “sameSite“ value for cookie “%1$S”. The supported values are: “lax“, “strict“, “none“. +CookieSameSiteValueInvalid=«%1$S» նշոցիկի համար անվավեր «sameSite» արժեք։ Աջակցված արժեքներն են. «Մեղմ», «խիստ», «ոչ»։ # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookieOversize=Cookie “%1$S” is invalid because its size is too big. Max size is %2$S B. +CookieOversize=Նշոցիկ «%1$S» անվավեր է, քանի որ դրա չափը չափազանց մեծ է։ Առավելագույն չափը %2$S B է։ # LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B. +CookiePathOversize=Նշոցիկ «%1$S»֊ը անվավեր է, քանի որ դրա ուղու չափը չափազանց մեծ է։ Առավելագույն չափը %2$S B է։ diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/pipnss/pipnss.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/pipnss/pipnss.properties index 483500deef84e052caf73f41d0418c664f082d53..f0cc118ac6ef188a63baa422b905d03c894677ed 100644 --- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/pipnss/pipnss.properties +++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/pipnss/pipnss.properties @@ -3,9 +3,9 @@ # 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/. -CertPassPrompt=%S-ի համար նշեք հիմնական գաղտնաբառը: +CertPassPrompt=%S-ի համար նշեք հիմնական գաղտնաբառը։ -CertPassPromptDefault=Մուտքագրեք Հիմնական գաղտնաբառը +CertPassPromptDefault=Մուտքագրեք հիմնական գաղտնաբառը։ # The following strings have special requirements: they must fit in a 32 or 64 # bytes buffer after being encoded to UTF-8. @@ -27,7 +27,7 @@ RootCertModuleName=Արմատների Ներդրված Բաղադրիչ # LOCALIZATION NOTE (ManufacturerID): string limit is 32 bytes after conversion # to UTF-8. # length_limit = 32 bytes -ManufacturerID=Mozilla.am +ManufacturerID=Mozilla.org # LOCALIZATION NOTE (LibraryDescription): string limit is 32 bytes after # conversion to UTF-8. # length_limit = 32 bytes @@ -47,7 +47,7 @@ SlotDescription=PSM Internal Cryptographic Services # LOCALIZATION NOTE (PrivateSlotDescription): string limit is 64 bytes after # conversion to UTF-8. # length_limit = 64 bytes -PrivateSlotDescription=ԱԱԿ (PSM) Անձնական Բանալիներ +PrivateSlotDescription=PSM Անձնական Բանալիներ # LOCALIZATION NOTE (Fips140TokenDescription): string limit is 32 bytes after # conversion to UTF-8. # length_limit = 32 bytes @@ -76,7 +76,7 @@ CertDumpSHA384WithRSA=PKCS #1 SHA-384՝ RSA գաղտնագրմամբ CertDumpSHA512WithRSA=PKCS #1 SHA-512՝ RSA գաղտնագրմամբ CertDumpDefOID=Առարկայի Նույնացուցիչը (%S) CertDumpIssuer=Թողարկող -CertDumpSubject=Առարկան +CertDumpSubject=Առարկա CertDumpAVACountry=C CertDumpAVAState=ST CertDumpAVALocality=L @@ -91,9 +91,9 @@ CertDumpSurname=Ազգանուն CertDumpGivenName=Անուն CertDumpValidity=Վավեր է CertDumpNotBefore=Ոչ Նախքան -CertDumpNotAfter=Ոչ ուշ քան -CertDumpSPKI=Առարկայի Հասարակային Բանալու Տվյալները -CertDumpSPKIAlg=Առարկայի Հասարակային Բանալու Քայլաշարը +CertDumpNotAfter=Ոչ Հետո +CertDumpSPKI=Առարկայի Հանրային Բանալու Տվյալները +CertDumpSPKIAlg=Առարկայի Հանրային Բանալու Քայլաշարը CertDumpAlgID=Քայլաշարի Նույնացուցիչ CertDumpParams=Քայլաշարի Պարամետրերը CertDumpRSAEncr=PKCS #1 RSA գաղտնագրմամբ diff --git a/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/aboutdebugging.ftl index fde0b303f4c20c06f1cf09d08df2d6345992d14f..79bb62dce9df6521150674ecbe34745e51641880 100644 --- a/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/aboutdebugging.ftl +++ b/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/aboutdebugging.ftl @@ -85,7 +85,7 @@ about-debugging-setup-intro = Կարգավորեք կապի եղանակը, որ # Explanatory text in the Setup page about what the 'This Firefox' page is for about-debugging-setup-this-firefox = Օգտագործել <a>{ about-debugging-this-firefox-runtime-name }</a> ներդիրները վրիպազերծելու, ընդլայնումներ և ծառայության աշխատողներին { -brand-shorter-name }-ի այս տարբերակի համար։ # Explanatory text in the Setup page about what the 'This Firefox' page is for -about-debugging-setup-this-firefox2 = Օգտագործել <a>{ about-debugging-this-firefox-runtime-name }</a> վրիպազերծելու ընդլաայնոմները և ծառայության աշխատողներին { -brand-shorter-name }-ի այս տարբերակի համար։ +about-debugging-setup-this-firefox2 = Օգտագործել <a>{ about-debugging-this-firefox-runtime-name }</a> վրիպազերծելու ընդլայնումները և ծառայության աշխատողներին { -brand-shorter-name }-ի այս տարբերակի համար։ # Title of the heading Connect section of the Setup page. about-debugging-setup-connect-heading = Միացրեք սարք # USB section of the Setup page diff --git a/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/toolbox-options.ftl b/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/toolbox-options.ftl index 75b36d5a02271701339776f700927d8ef9e3483b..56fd7e022f2e55ae17fa6da4b627831265f6c502 100644 --- a/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/toolbox-options.ftl +++ b/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/toolbox-options.ftl @@ -47,6 +47,8 @@ options-stylesheet-autocompletion-label = CSS-ի ինքնալրացում ## Screenshot section +# The heading +options-screenshot-label = Էկրանի հանույթի պահվածք ## Editor section @@ -61,6 +63,8 @@ options-sourceeditor-keybinding-default-label = Լռելյայն # The heading options-context-advanced-settings = Լրացուցիչ կարգավորումներ +# The label for the checkbox that toggles the HTTP cache on or off +options-disable-http-cache-label = Անջատել HTTP պահոցը (երբ գործիքատուփը բաց է) # The label for checkbox that toggles JavaScript on or off options-disable-javascript-label = Անջատել JavaScript-ը * options-disable-javascript-tooltip = diff --git a/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/about/aboutAddons.ftl index 44e250febb71e42750347e18e19f2e3c3f34de71..00276dec20e27e7afcb7e05d30d4d1c7a153a98f 100644 --- a/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Տեղակայեք հավելումը Ֆայլից... .accesskey = Տ help-button = Լրացուցիչ աջակցություն +sidebar-help-button-title = + .title = Լրացուցիչ աջակցություն preferences = { PLATFORM() -> [windows] { -brand-short-name } Ընտրանքներ @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Գործիքներ բոլոր հավելումների համար +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } Ընտրանքներ + *[other] { -brand-short-name } Նախընտրություններ + } show-unsigned-extensions-button = .label = Որոշ ընդլայնումներ չեն կարող ստուգվել: show-all-extensions-button = @@ -168,13 +176,29 @@ extensions-view-available-updates = .name = Առկա Թարմացումներ .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Խորհուրդներ +addon-category-discover-title = + .title = Խորհուրդներ addon-category-extension = Ընդլայնումներ +addon-category-extension-title = + .title = Ընդլայնումներ addon-category-theme = Ոճեր +addon-category-theme-title = + .title = Ոճեր addon-category-plugin = Բաղադրիչներ +addon-category-plugin-title = + .title = Բաղադրիչներ addon-category-dictionary = Բառարաններ +addon-category-dictionary-title = + .title = Բառարաններ addon-category-locale = Լեզուներ +addon-category-locale-title = + .title = Լեզուներ addon-category-available-updates = Առկա Թարմացումներ +addon-category-available-updates-title = + .title = Առկա Թարմացումներ addon-category-recent-updates = Վերջին Թարմացումները +addon-category-recent-updates-title = + .title = Վերջին Թարմացումները ## These are global warnings @@ -312,6 +336,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Ավելի քիչ go-back-button = .tooltiptext = Գնալ ետ +header-back-button = + .title = Գնալ ետ ## Recommended add-ons page diff --git a/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..a695cbd756750869e389a550ffadf91f9bf26d5e --- /dev/null +++ b/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Դուք օգտագործում եք { -brand-product-name }֊ի հին տարբերակը + .style = width: 490px; +profiledowngrade-window-create = + .label = Ստեղծել նոր հաշիվ +profiledowngrade-sync = { -brand-product-name }-ի հին տարբերակի օգտագործումը կարող է վնասել գոյություն ունեցող { -brand-product-name }-ի հաշվում արդեն պահպանված էջանիշերը և զննարկման պատմությունը։ Ձեր տեղեկությունը պաշտպանելու համար, ստեղծեք նոր հաշիվ { -brand-short-name }-ի այս տեղակայման համար։ Դուք կարող եք միշտ մուտք գործել { -fxaccount-brand-name }-ի հետ Ձեր էջանիշերը և զննարկման պատմությունը հաշիվների միջև համաժամեցնելու համար։ +profiledowngrade-nosync = { -brand-product-name }֊ի ավելի հին տարաբերակի օգտագործումը կարող է վնասել էջանիշները և դիտման պատմությունը, որոնք արդեն պահված են Ձեր առկա { -brand-product-name }֊ի հատկագրում։ Ձեր տեղեկատվությունը պաշտպանելու համար ստեղծեք նոր տեղադրություն այս տեղադրման համար { -brand-short-name } +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Ելք + *[other] Փակել + } diff --git a/thunderbird-l10n/hy-AM/manifest.json b/thunderbird-l10n/hy-AM/manifest.json index d9c3626f4e9046f3fb2cd72659c5411dadb33fd2..4c8a3f3ebebd7f9bd678063514f55254a8d249b8 100644 --- a/thunderbird-l10n/hy-AM/manifest.json +++ b/thunderbird-l10n/hy-AM/manifest.json @@ -1,57 +1,57 @@ { - "langpack_id": "hy-AM", - "applications": { - "gecko": { - "id": "langpack-hy-AM@thunderbird.mozilla.org", - "strict_min_version": "76.0", - "strict_max_version": "76.*" - } - }, - "manifest_version": 2, - "author": "haysoft.org (contributors: Hrant Ohanyan)", - "version": "76.0buildid20200407173003", - "description": "Language pack for Thunderbird for hy-AM", - "name": "Armenian (AM) Language Pack", "languages": { "hy-AM": { + "version": "20200419104323", "chrome_resources": { - "places": "chrome/hy-AM/locale/hy-AM/places/", - "devtools": "chrome/hy-AM/locale/hy-AM/devtools/client/", - "messenger-smime": "chrome/hy-AM/locale/hy-AM/messenger-smime/", + "branding": "chrome/hy-AM/locale/hy-AM/branding/", + "devtools-shared": "chrome/hy-AM/locale/hy-AM/devtools/shared/", + "devtools-startup": "chrome/hy-AM/locale/hy-AM/devtools/startup/", + "pippki": "chrome/hy-AM/locale/hy-AM/pippki/", + "communicator": "chrome/hy-AM/locale/hy-AM/communicator/", "mozapps": "chrome/hy-AM/locale/hy-AM/mozapps/", - "messenger-newsblog": "chrome/hy-AM/locale/hy-AM/messenger-newsblog/", + "alerts": "chrome/hy-AM/locale/hy-AM/alerts/", + "places": "chrome/hy-AM/locale/hy-AM/places/", + "messenger-mapi": "chrome/hy-AM/locale/hy-AM/messenger-mapi/", + "messenger-region": "chrome/hy-AM/locale/hy-AM/messenger-region/", "autoconfig": "chrome/hy-AM/locale/hy-AM/autoconfig/", - "communicator": "chrome/hy-AM/locale/hy-AM/communicator/", - "global-platform": { - "macosx": "chrome/hy-AM/locale/hy-AM/global-platform/mac/", - "android": "chrome/hy-AM/locale/hy-AM/global-platform/unix/", - "win": "chrome/hy-AM/locale/hy-AM/global-platform/win/", - "linux": "chrome/hy-AM/locale/hy-AM/global-platform/unix/" - }, + "mozldap": "chrome/hy-AM/locale/hy-AM/mozldap/", + "chat": "chrome/hy-AM/locale/hy-AM/chat/", + "messenger-newsblog": "chrome/hy-AM/locale/hy-AM/messenger-newsblog/", + "devtools": "chrome/hy-AM/locale/hy-AM/devtools/client/", "lightning": "chrome/hy-AM/locale/hy-AM/lightning/", - "alerts": "chrome/hy-AM/locale/hy-AM/alerts/", "necko": "chrome/hy-AM/locale/hy-AM/necko/", - "passwordmgr": "chrome/hy-AM/locale/hy-AM/passwordmgr/", + "calendar": "chrome/hy-AM/locale/hy-AM/calendar/", "pipnss": "chrome/hy-AM/locale/hy-AM/pipnss/", - "mozldap": "chrome/hy-AM/locale/hy-AM/mozldap/", - "messenger": "chrome/hy-AM/locale/hy-AM/messenger/", - "pippki": "chrome/hy-AM/locale/hy-AM/pippki/", + "messenger-smime": "chrome/hy-AM/locale/hy-AM/messenger-smime/", "pluginproblem": "chrome/hy-AM/locale/hy-AM/pluginproblem/", - "messenger-mapi": "chrome/hy-AM/locale/hy-AM/messenger-mapi/", - "calendar": "chrome/hy-AM/locale/hy-AM/calendar/", - "devtools-shared": "chrome/hy-AM/locale/hy-AM/devtools/shared/", "global": "chrome/hy-AM/locale/hy-AM/global/", - "chat": "chrome/hy-AM/locale/hy-AM/chat/", - "branding": "chrome/hy-AM/locale/hy-AM/branding/", - "messenger-region": "chrome/hy-AM/locale/hy-AM/messenger-region/", - "devtools-startup": "chrome/hy-AM/locale/hy-AM/devtools/startup/" - }, - "version": "20200403075007" + "messenger": "chrome/hy-AM/locale/hy-AM/messenger/", + "passwordmgr": "chrome/hy-AM/locale/hy-AM/passwordmgr/", + "global-platform": { + "linux": "chrome/hy-AM/locale/hy-AM/global-platform/unix/", + "win": "chrome/hy-AM/locale/hy-AM/global-platform/win/", + "android": "chrome/hy-AM/locale/hy-AM/global-platform/unix/", + "macosx": "chrome/hy-AM/locale/hy-AM/global-platform/mac/" + } + } } }, + "author": "haysoft.org (contributors: Hrant Ohanyan)", + "name": "Armenian (AM) Language Pack", "sources": { "browser": { "base_path": "browser/" } - } + }, + "version": "76.0buildid20200420212409", + "applications": { + "gecko": { + "strict_min_version": "76.0", + "id": "langpack-hy-AM@thunderbird.mozilla.org", + "strict_max_version": "76.*" + } + }, + "langpack_id": "hy-AM", + "description": "Language pack for Thunderbird for hy-AM", + "manifest_version": 2 } diff --git a/thunderbird-l10n/id/chrome/id/locale/id/calendar/calendarCreation.dtd b/thunderbird-l10n/id/chrome/id/locale/id/calendar/calendarCreation.dtd index ca65b8629b482cd3eb3d250aa7c25ed1ddf82cfc..5868d964f6f762c4734f7649d851d329d4ca06ff 100644 --- a/thunderbird-l10n/id/chrome/id/locale/id/calendar/calendarCreation.dtd +++ b/thunderbird-l10n/id/chrome/id/locale/id/calendar/calendarCreation.dtd @@ -40,7 +40,7 @@ <!ENTITY calendartype.label "Jenis Kalender:"> <!ENTITY location.label "Lokasi:"> -<!ENTITY location.placeholder "URL atau nama hos dari peladen kalender"> +<!ENTITY location.placeholder "URL atau nama host dari server kalender"> <!ENTITY network.loading.description "Mohon tunggu sembari menemukan kalender."> <!ENTITY network.notfound.description "Kalender tidak ditemukan di lokasi ini. Mohon periksa pengaturan Anda."> diff --git a/thunderbird-l10n/id/chrome/id/locale/id/chat/irc.properties b/thunderbird-l10n/id/chrome/id/locale/id/chat/irc.properties index d8c44cf4a1e1cb1c04fd744eda3cfbc66d9b0036..98d0af222709145818ea9195f05bae23001fe8b9 100644 --- a/thunderbird-l10n/id/chrome/id/locale/id/chat/irc.properties +++ b/thunderbird-l10n/id/chrome/id/locale/id/chat/irc.properties @@ -175,7 +175,7 @@ error.sendMessageFailed=Terjadi kesalahan ketika mengirim pesan terakhir Anda. H error.channelForward=Mungkin anda tidak dapat bergabung %1$S, dan secara otomatis diarahkan ke %2$S. # %S is the mode that the user tried to set but was not recognized # by the server as a valid mode. -error.unknownMode='%S' bukan mode pengguna sah di peladen ini. +error.unknownMode='%S' bukan mode pengguna valid di server ini. # LOCALIZATION NOTE (tooltip.*): # These are the descriptions given in a tooltip with information received diff --git a/thunderbird-l10n/id/chrome/id/locale/id/chat/matrix.properties b/thunderbird-l10n/id/chrome/id/locale/id/chat/matrix.properties index 5fdf580ff213da61b16e0df4fdd585d8c79b4a63..71e9c7e4621845f4e7d1fdf316e65ed3ceb71c75 100644 --- a/thunderbird-l10n/id/chrome/id/locale/id/chat/matrix.properties +++ b/thunderbird-l10n/id/chrome/id/locale/id/chat/matrix.properties @@ -5,7 +5,7 @@ # LOCALIZATION NOTE (options.*): # These are the protocol specific options shown in the account manager and # account wizard windows. -options.connectServer=Peladen +options.connectServer=Server # LOCALIZATION NOTE (chatRoomField.*): # These are the name of fields displayed in the 'Join Chat' dialog @@ -14,6 +14,12 @@ options.connectServer=Peladen # character of the string should be used as the access key for this # field. +# LOCALIZATION NOTE (tooltip.*): +# These are the descriptions given in a tooltip with information received +# from the "User" object. +# The human readable name of the user. +# %S is the timespan elapsed since the last activity. + options.connectPort=Port # LOCALIZATION NOTE (chatRoomField.*): # These are the name of fields displayed in the 'Join Chat' dialog diff --git a/thunderbird-l10n/id/chrome/id/locale/id/chat/xmpp.properties b/thunderbird-l10n/id/chrome/id/locale/id/chat/xmpp.properties index e0c1f26ba069b578e811b0bc3bf80ebcb6a1d60e..3dc23c0a9de9e3b2bbeca727a515e30c8063ab50 100644 --- a/thunderbird-l10n/id/chrome/id/locale/id/chat/xmpp.properties +++ b/thunderbird-l10n/id/chrome/id/locale/id/chat/xmpp.properties @@ -34,7 +34,7 @@ connection.error.authenticationFailure=Kegagalan autentikasi connection.error.notAuthorized=Tidak diizinkan (Sandinya sudah benar?) connection.error.failedToGetAResource=Gagal mengambil sumber daya connection.error.failedResourceNotValid=Sumber tidak valid. -connection.error.XMPPNotSupported=Peladen ini tidak mendukung XMPP +connection.error.XMPPNotSupported=Server ini tidak mendukung XMPP # LOCALIZATION NOTE (conversation.error.notDelivered): # This is displayed in a conversation as an error message when a message @@ -90,7 +90,6 @@ tooltip.userName=Nama pengguna tooltip.title=Judul tooltip.organization=Organisasi tooltip.country=Negara - tooltip.telephone=Nomor telepon # LOCALIZATION NOTE (chatRoomField.*): diff --git a/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/accessibility.properties b/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/accessibility.properties index 154dd94b2fb5cb4d73344f1a61305ac6995b0626..45d3e17895cdaab8920ba6d35d8621a8ac2a0755 100644 --- a/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/accessibility.properties +++ b/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/accessibility.properties @@ -100,7 +100,7 @@ accessibility.description.general.p2=Fitur aksesibilitas mungkin mempengaruhi ki # LOCALIZATION NOTE (accessibility.description.oldVersion): A title text used # when accessibility service description is provided when a client is connected # to an older version of accessibility actor. -accessibility.description.oldVersion=Anda tersambung dengan peladen debugger yang sudah usang. Untuk menggunakan panel Aksesibilitas, sambungkan dengan peladen debugger versi terbaru. +accessibility.description.oldVersion=Anda tersambung dengan server debugger yang sudah usang. Untuk menggunakan panel Aksesibilitas, sambungkan dengan server debugger versi terbaru. # LOCALIZATION NOTE (accessibility.tree.menu.printToJSON): A title text used when a # context menu item for printing an accessible tree to JSON is rendered after triggering a diff --git a/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/jsonview.properties b/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/jsonview.properties index 57cf44d05c5dc3d8d45490630ab44f7de9f3a881..8664d7712fddc7ac83f196985503d5e3fc9b9965 100644 --- a/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/jsonview.properties +++ b/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/jsonview.properties @@ -32,6 +32,8 @@ jsonViewer.Copy=Salin # LOCALIZATION NOTE (jsonViewer.ExpandAll): Label for expanding all nodes jsonViewer.ExpandAll=Bentangkan Semua +jsonViewer.ExpandAllSlow=Bentangkan Semua (lambat) + # LOCALIZATION NOTE (jsonViewer.CollapseAll): Label for collapsing all nodes jsonViewer.CollapseAll=Ciutkan Semua @@ -50,5 +52,3 @@ jsonViewer.filterJSON=Filter JSON # LOCALIZATION NOTE (jsonViewer.reps.reference): Label used for cycle # references in an array. jsonViewer.reps.reference=Referensi Siklus - -jsonViewer.ExpandAllSlow=Expand All (slow) diff --git a/thunderbird-l10n/id/chrome/id/locale/id/global-platform/mac/accessible.properties b/thunderbird-l10n/id/chrome/id/locale/id/global-platform/mac/accessible.properties index 06d13b1d1cbbe80423c1ca746f9c94610e90d5be..a72ba7f2f4d0dc798390bd8473f94f26be41d085 100644 --- a/thunderbird-l10n/id/chrome/id/locale/id/global-platform/mac/accessible.properties +++ b/thunderbird-l10n/id/chrome/id/locale/id/global-platform/mac/accessible.properties @@ -58,8 +58,7 @@ separator = pemisah tabPanel = panel tab # The roleDescription for the html:mark element highlight = sorot - # The roleDescription for the details element -details = details +details = detail # The roleDescription for the summary element -summary = summary +summary = ringkasan diff --git a/thunderbird-l10n/id/chrome/id/locale/id/lightning/lightning.dtd b/thunderbird-l10n/id/chrome/id/locale/id/lightning/lightning.dtd index a3f2d5c75581e8de24307def56732e6fd653a082..f49769026df1983b1019ea639bb114e55483e372 100644 --- a/thunderbird-l10n/id/chrome/id/locale/id/lightning/lightning.dtd +++ b/thunderbird-l10n/id/chrome/id/locale/id/lightning/lightning.dtd @@ -23,6 +23,8 @@ <!ENTITY lightning.menupopup.open.accesskey "B"> <!ENTITY lightning.menupopup.open.message.label "Simpanan Pesan…"> <!ENTITY lightning.menupopup.open.message.accesskey "S"> + +<!-- Open menu popup in File menu --> <!ENTITY lightning.menupopup.open.calendar.label "Berkas Kalender…"> <!ENTITY lightning.menupopup.open.calendar.accesskey "k"> @@ -46,7 +48,7 @@ lightning.calendarproperties.forceEmailScheduling.tooltiptext2) - tooltiptext1 is used in the calendar wizard when setting a new caldav calendar - tooltiptext2 is used in the calendar properties dialog for caldav calendars --> -<!ENTITY lightning.calendarproperties.forceEmailScheduling.tooltiptext1 "Untuk saat ini, Anda hanya dapat mengaktifkan ini setelah mengatur kalender dalam dialog propertinya jika peladen kalender menangani penjadwalan."> +<!ENTITY lightning.calendarproperties.forceEmailScheduling.tooltiptext1 "Untuk saat ini, Anda hanya dapat mengaktifkan ini setelah mengatur kalender dalam dialog propertinya jika server kalender menangani penjadwalan."> <!-- iMIP Bar (meeting support) --> <!ENTITY lightning.imipbar.btnAccept.label "Terima"> diff --git a/thunderbird-l10n/id/chrome/id/locale/id/messenger/am-advanced.dtd b/thunderbird-l10n/id/chrome/id/locale/id/messenger/am-advanced.dtd index 4e1585afb803195f811bb9513384a285ba1ef378..bc032eed00d7ae3b2bbf8cfc25c938be14614e36 100644 --- a/thunderbird-l10n/id/chrome/id/locale/id/messenger/am-advanced.dtd +++ b/thunderbird-l10n/id/chrome/id/locale/id/messenger/am-advanced.dtd @@ -4,6 +4,8 @@ <!-- extracted from am-advanced.xul --> +<!-- extracted from am-advanced.xhtml --> + <!-- LOCALIZATION NOTE (smtpServer.label): do not translate "SMTP" in below line --> <!ENTITY smtpServer.label "Pengaturan Server Pengirim (SMTP)"> @@ -18,7 +20,7 @@ <!ENTITY smtpListSetDefault.label "Setel Baku"> <!ENTITY smtpListSetDefault.accesskey "d"> -<!ENTITY serverDetails.label "Detail peladen yang dipilih:"> +<!ENTITY serverDetails.label "Detail server yang dipilih:"> <!ENTITY serverDescription.label "Keterangan: "> <!ENTITY serverName.label "Nama Server: "> <!ENTITY serverPort.label "Port: "> diff --git a/thunderbird-l10n/id/chrome/id/locale/id/messenger/am-main.dtd b/thunderbird-l10n/id/chrome/id/locale/id/messenger/am-main.dtd index f6d5e69722af5404feb1643a2bd01f9ba42286b9..6dde58b4f5f21adcd99e131e20c61b53c3e1a2f5 100644 --- a/thunderbird-l10n/id/chrome/id/locale/id/messenger/am-main.dtd +++ b/thunderbird-l10n/id/chrome/id/locale/id/messenger/am-main.dtd @@ -4,6 +4,8 @@ <!-- extracted from am-main.xul --> +<!-- extracted from am-main.xhtml --> + <!ENTITY accountTitle.label "Pengaturan Akun"> <!ENTITY accountName.label "Nama Akun:"> <!ENTITY accountName.accesskey "N"> @@ -41,6 +43,6 @@ <!ENTITY smtpName.accesskey "P"> <!ENTITY smtpDefaultServer.label "Gunakan Server Default"> -<!ENTITY smtpServerEdit.label "Sunting peladen SMTP…"> +<!ENTITY smtpServerEdit.label "Sunting server SMTP…"> <!ENTITY smtpServerEdit.accesskey "P"> diff --git a/thunderbird-l10n/id/chrome/id/locale/id/messenger/imapMsgs.properties b/thunderbird-l10n/id/chrome/id/locale/id/messenger/imapMsgs.properties index ebcfd0a9d6c81d83df2946cf6c21f628a7ab29e0..57adb36e8eedf1bb543a6d55125ecdc2e1b7242d 100644 --- a/thunderbird-l10n/id/chrome/id/locale/id/messenger/imapMsgs.properties +++ b/thunderbird-l10n/id/chrome/id/locale/id/messenger/imapMsgs.properties @@ -124,8 +124,11 @@ imapDone= imapEnterPasswordPromptTitle=Sandi Server Email Dibutuhkan +# LOCALIZATION NOTE (imapEnterPasswordPromptTitleWithUsername): Do not translate the +# word %1$S. Place the word %1$S where the user name should appear. + imapUnknownHostError=Gagal tersambung ke server %S. -imapOAuth2Error=Kegagalan autentikasi saat menyambung ke peladen %S. +imapOAuth2Error=Kegagalan autentikasi saat menyambung ke server %S. imapNetTimeoutError=Sambungan ke server %S kehabisan waktu. @@ -162,7 +165,7 @@ imapAclDeleteRight=Hapus Pesan imapAclAdministerRight=Kelola Folder -imapServerDoesntSupportAcl=Peladen tidak mendukung folder bersama. +imapServerDoesntSupportAcl=Server tidak mendukung folder bersama. imapAclExpungeRight=Hapus @@ -171,9 +174,17 @@ imapAclExpungeRight=Hapus imapSubscribePrompt=Anda ingin berlangganan %1$S? +# This will occur when a folder that has never been imap selected or opened +# (left-clicked) is first right-clicked to access quota properties. + +# The imap capability response reports that QUOTA is not supported. +imapQuotaStatusNotSupported=Server ini tidak mendukung kuota. + -imapQuotaStatusNotSupported=Peladen ini tidak mendukung kuota. +# The getqutaroot command succeeded but reported no quota information. +# Folder properties were requested by the user (right-click) before the getquotaroot +# command was sent. # Out of memory imapOutOfMemory=Aplikasi kehabisan memori. diff --git a/thunderbird-l10n/id/chrome/id/locale/id/messenger/messenger.properties b/thunderbird-l10n/id/chrome/id/locale/id/messenger/messenger.properties index 3f6a506b004d020d891a82b71b04edde1f9dbe69..83f5cca8d62e17d0d2534738dd072232db706dd9 100644 --- a/thunderbird-l10n/id/chrome/id/locale/id/messenger/messenger.properties +++ b/thunderbird-l10n/id/chrome/id/locale/id/messenger/messenger.properties @@ -289,6 +289,7 @@ mailnews.search_date_leading_zeros=true # accountCentral mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xul + # LOCALIZATION NOTE(acctCentralTitleFormat): %1$S is brand, %2$S is account type, %3$S is account name acctCentralTitleFormat=%1$S %2$S - %3$S mailAcctType=Email @@ -379,7 +380,7 @@ connectionRefusedError=Tidak dapat tersambung ke server %S; sambungan ditolak. # LOCALIZATION NOTE(netTimeoutError): %S is the server name netTimeoutError=Sambungan ke server %S kehabisan waktu. # LOCALIZATION NOTE(netResetError): %S is the server name -netResetError=Sambungan ke peladen %S telah diset ulang. +netResetError=Sambungan ke server %S telah diset ulang. # LOCALIZATION NOTE(netInterruptError): %S is the server name recipientSearchCriteria=Subjek atau Penerima mengandung: @@ -416,11 +417,14 @@ macBiffNotification_separator=,\u0020 # For the Quota tab in the mail folder properties dialog quotaUsedFree=%S dari %S KB dipakai + +# For the Quota tab in the mail folder properties dialog quotaPercentUsed=%S%% penuh # for quota in main window (commandglue.js) percent=%S%% quotaTooltip=Kuota IMAP: digunakan %S KB dari total %S KB. Klik untuk detail. + # for message views confirmViewDeleteTitle=Konfirmasi confirmViewDeleteMessage=Yakin akan menghapus tampilan berikut? @@ -619,7 +623,7 @@ mailServerLoginFailedTitle=Log Masuk Gagal mailServerLoginFailedTitleWithAccount=Gagal masuk ke akun "%S" # LOCALIZATION NOTE (mailServerLoginFailed2): # %1$S is the host name of the server, %2$S is the user name. -mailServerLoginFailed2=Gagal masuk ke peladen %1$S dengan nama pengguna %2$S. +mailServerLoginFailed2=Gagal masuk ke server %1$S dengan nama pengguna %2$S. mailServerLoginFailedRetryButton=&Coba Lagi mailServerLoginFailedEnterNewPasswordButton=&Masukkan Sandi Baru diff --git a/thunderbird-l10n/id/localization/id/security/certificates/certManager.ftl b/thunderbird-l10n/id/localization/id/security/certificates/certManager.ftl index 4755cf11ef611164d5284ce12c9d61ba2d98445e..b06decb28f86c2c21cce4cdfe30a6b0633a2390b 100644 --- a/thunderbird-l10n/id/localization/id/security/certificates/certManager.ftl +++ b/thunderbird-l10n/id/localization/id/security/certificates/certManager.ftl @@ -14,7 +14,7 @@ certmgr-tab-ca = .label = Otoritas certmgr-mine = Anda memiliki sertifikat dari organisasi berikut ini yang mengenali Anda certmgr-people = Anda memiliki sertifikat di berkas yang mengenali orang ini -certmgr-servers = Anda memiliki sertifikat pada berkas yang bisa mengidentifikasi peladen berikut +certmgr-servers = Anda memiliki sertifikat pada berkas yang bisa mengidentifikasi server berikut certmgr-ca = Anda memiliki sertifikat pada berkas yang mengidentifikasi otoritas sertifikat ini certmgr-detail-general-tab-title = .label = Umum @@ -24,14 +24,6 @@ certmgr-detail-pretty-print-tab-title = .accesskey = D certmgr-pending-label = .value = Sedang memverifikasi sertifikat… -certmgr-subject-info-label = - .value = Diterbitkan untuk -certmgr-issuer-info-label = - .value = Diterbitkan Oleh -certmgr-period-of-validity-label = - .value = Periode Kevalidan -certmgr-fingerprints-label = - .value = Sidik Jari certmgr-subject-label = Diterbitkan untuk certmgr-issuer-label = Diterbitkan Oleh certmgr-period-of-validity = Periode Kevalidan @@ -40,18 +32,6 @@ certmgr-cert-detail = .title = Detail Sertifikat .buttonlabelaccept = Tutup .buttonaccesskeyaccept = T -certmgr-cert-detail-cn = - .value = Nama Umum (Common Name-CN) -certmgr-cert-detail-o = - .value = Organisasi (O) -certmgr-cert-detail-ou = - .value = Unit Organisasi (Organizational Unit-OU) -certmgr-cert-detail-serialnumber = - .value = Nomor Seri -certmgr-cert-detail-sha256-fingerprint = - .value = Sidik jari SHA-256 -certmgr-cert-detail-sha1-fingerprint = - .value = Sidik jari SHA1 certmgr-cert-detail-commonname = Common Name (CN) certmgr-cert-detail-org = Organisasi (O) certmgr-cert-detail-orgunit = Unit Organisasi (OU) @@ -80,13 +60,9 @@ certmgr-token-name = certmgr-begins-on = Mulai Sejak certmgr-begins-label = .label = Mulai Sejak -certmgr-begins-value = - .value = { certmgr-begins-label.label } certmgr-expires-on = Kedaluwarsa Pada certmgr-expires-label = .label = Kedaluwarsa Pada -certmgr-expires-value = - .value = { certmgr-expires-label.label } certmgr-email = .label = Alamat Surel certmgr-serial = diff --git a/thunderbird-l10n/id/localization/id/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/id/localization/id/toolkit/about/aboutAddons.ftl index b83c9249e8b076b412fd9c47c820e75d6bd8343a..1442788c1cae683b320d27643a4efba94b490688 100644 --- a/thunderbird-l10n/id/localization/id/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/id/localization/id/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Pasang Pengaya dari Berkas… .accesskey = B help-button = Dukungan Pengaya +sidebar-help-button-title = + .title = Dukungan Pengaya preferences = { PLATFORM() -> [windows] Opsi { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Alat untuk semua pengaya +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Opsi { -brand-short-name } + *[other] Preferensi { -brand-short-name } + } show-unsigned-extensions-button = .label = Beberapa ekstensi tidak dapat diverifikasi show-all-extensions-button = @@ -168,13 +176,29 @@ extensions-view-available-updates = .name = Versi Baru yang Tersedia .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Rekomendasi +addon-category-discover-title = + .title = Rekomendasi addon-category-extension = Ekstensi +addon-category-extension-title = + .title = Ekstensi addon-category-theme = Tema +addon-category-theme-title = + .title = Tema addon-category-plugin = Plugin +addon-category-plugin-title = + .title = Plugin addon-category-dictionary = Kamus +addon-category-dictionary-title = + .title = Kamus addon-category-locale = Bahasa +addon-category-locale-title = + .title = Bahasa addon-category-available-updates = Versi Baru yang Tersedia +addon-category-available-updates-title = + .title = Versi Baru yang Tersedia addon-category-recent-updates = Versi Baru +addon-category-recent-updates-title = + .title = Versi Baru ## These are global warnings @@ -311,6 +335,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Lebih Sedikit go-back-button = .tooltiptext = Mundur +header-back-button = + .title = Mundur ## Recommended add-ons page diff --git a/thunderbird-l10n/id/localization/id/toolkit/global/processTypes.ftl b/thunderbird-l10n/id/localization/id/toolkit/global/processTypes.ftl index 03b6b3040b76df92a384c47a82c11ce1a939cc42..a661b9dcd42cfd134490b8199cff3e2e3dc2c8ba 100644 --- a/thunderbird-l10n/id/localization/id/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/id/localization/id/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Konten Web Terisolasi # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Soket diff --git a/thunderbird-l10n/id/localization/id/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/id/localization/id/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..d4d420eb9be9a89df3b9e3c89b6c05be802f9b88 --- /dev/null +++ b/thunderbird-l10n/id/localization/id/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Anda telah meluncurkan versi { -brand-product-name } yang lebih lama + .style = width: 490px +profiledowngrade-window-create = + .label = Buat Profil Baru +profiledowngrade-sync = Menggunakan versi { -brand-product-name } yang lebih lama dapat merusak markah dan riwayat penjelajahan yang telah disimpan ke profil { -brand-product-name } yang ada. Untuk melindungi informasi Anda, buat profil baru untuk pemasangan { -brand-short-name } ini. Anda selalu dapat masuk dengan { -fxaccount-brand-name } untuk menyinkronkan markah dan riwayat penjelajahan di antara profil. +profiledowngrade-nosync = Menggunakan versi { -brand-product-name } yang lebih lama dapat merusak markah dan riwayat penjelajahan yang telah disimpan ke profil { -brand-product-name } yang ada. Untuk melindungi informasi Anda, buat profil baru untuk pemasangan { -brand-short-name } ini. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Keluar + *[other] Keluar + } diff --git a/thunderbird-l10n/id/manifest.json b/thunderbird-l10n/id/manifest.json index 16a8bbf80bc25db919f981b5595704b468697e74..7f671cd80b82cb87a08e769cf8befa306dc27ea0 100644 --- a/thunderbird-l10n/id/manifest.json +++ b/thunderbird-l10n/id/manifest.json @@ -1,57 +1,57 @@ { - "description": "Language pack for Thunderbird for id", - "manifest_version": 2, - "name": "Bahasa Indonesia (ID) Language Pack", - "author": "id-Mozilla - Komunitas Mozilla Indonesia (contributors: Dody Suria Wijaya, Milda Irhamni, Romi Hardiyanto)", - "sources": { - "browser": { - "base_path": "browser/" - } - }, "applications": { "gecko": { - "strict_max_version": "76.*", "id": "langpack-id@thunderbird.mozilla.org", + "strict_max_version": "76.*", "strict_min_version": "76.0" } }, - "version": "76.0buildid20200407173003", - "langpack_id": "id", + "description": "Language pack for Thunderbird for id", + "manifest_version": 2, + "author": "id-Mozilla - Komunitas Mozilla Indonesia (contributors: Dody Suria Wijaya, Milda Irhamni, Romi Hardiyanto)", + "version": "76.0buildid20200420212409", "languages": { "id": { - "version": "20200403075045", "chrome_resources": { - "messenger-newsblog": "chrome/id/locale/id/messenger-newsblog/", - "messenger-region": "chrome/id/locale/id/messenger-region/", - "pipnss": "chrome/id/locale/id/pipnss/", - "autoconfig": "chrome/id/locale/id/autoconfig/", - "pluginproblem": "chrome/id/locale/id/pluginproblem/", - "lightning": "chrome/id/locale/id/lightning/", - "messenger-smime": "chrome/id/locale/id/messenger-smime/", - "global-platform": { - "linux": "chrome/id/locale/id/global-platform/unix/", - "win": "chrome/id/locale/id/global-platform/win/", - "android": "chrome/id/locale/id/global-platform/unix/", - "macosx": "chrome/id/locale/id/global-platform/mac/" - }, - "devtools": "chrome/id/locale/id/devtools/client/", - "mozapps": "chrome/id/locale/id/mozapps/", - "alerts": "chrome/id/locale/id/alerts/", "messenger": "chrome/id/locale/id/messenger/", "places": "chrome/id/locale/id/places/", - "communicator": "chrome/id/locale/id/communicator/", + "global": "chrome/id/locale/id/global/", "messenger-mapi": "chrome/id/locale/id/messenger-mapi/", - "chat": "chrome/id/locale/id/chat/", - "mozldap": "chrome/id/locale/id/mozldap/", - "calendar": "chrome/id/locale/id/calendar/", - "branding": "chrome/id/locale/id/branding/", - "devtools-shared": "chrome/id/locale/id/devtools/shared/", + "messenger-region": "chrome/id/locale/id/messenger-region/", + "devtools": "chrome/id/locale/id/devtools/client/", + "messenger-newsblog": "chrome/id/locale/id/messenger-newsblog/", "devtools-startup": "chrome/id/locale/id/devtools/startup/", + "devtools-shared": "chrome/id/locale/id/devtools/shared/", "necko": "chrome/id/locale/id/necko/", + "mozapps": "chrome/id/locale/id/mozapps/", + "autoconfig": "chrome/id/locale/id/autoconfig/", + "calendar": "chrome/id/locale/id/calendar/", + "communicator": "chrome/id/locale/id/communicator/", "passwordmgr": "chrome/id/locale/id/passwordmgr/", + "branding": "chrome/id/locale/id/branding/", + "alerts": "chrome/id/locale/id/alerts/", + "messenger-smime": "chrome/id/locale/id/messenger-smime/", + "lightning": "chrome/id/locale/id/lightning/", + "chat": "chrome/id/locale/id/chat/", + "global-platform": { + "win": "chrome/id/locale/id/global-platform/win/", + "linux": "chrome/id/locale/id/global-platform/unix/", + "macosx": "chrome/id/locale/id/global-platform/mac/", + "android": "chrome/id/locale/id/global-platform/unix/" + }, + "pipnss": "chrome/id/locale/id/pipnss/", "pippki": "chrome/id/locale/id/pippki/", - "global": "chrome/id/locale/id/global/" - } + "mozldap": "chrome/id/locale/id/mozldap/", + "pluginproblem": "chrome/id/locale/id/pluginproblem/" + }, + "version": "20200415055410" } - } + }, + "name": "Bahasa Indonesia (ID) Language Pack", + "sources": { + "browser": { + "base_path": "browser/" + } + }, + "langpack_id": "id" } diff --git a/thunderbird-l10n/is/chrome/is/locale/is/devtools/client/debugger.properties b/thunderbird-l10n/is/chrome/is/locale/is/devtools/client/debugger.properties index 6e6a0e9a9fcee83421cb519e2a8aa13f4e6d04d5..8029efb45ffcfc3ca2cfef15d83eb335335387e4 100644 --- a/thunderbird-l10n/is/chrome/is/locale/is/devtools/client/debugger.properties +++ b/thunderbird-l10n/is/chrome/is/locale/is/devtools/client/debugger.properties @@ -24,6 +24,9 @@ copyToClipboard.accesskey=C # LOCALIZATION NOTE (copySource.label): This is the text that appears in the # context menu to copy the selected source of file open. copySource=Copy + +# LOCALIZATION NOTE (copySource.label): This is the text that appears in the +# context menu to copy the selected source of file open. copySource.label=Afrita frumtexta copySource.accesskey=y @@ -50,6 +53,32 @@ setDirectoryRoot.accesskey=r removeDirectoryRoot.label=Remove directory root removeDirectoryRoot.accesskey=d +# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item + +# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected group + +# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected group + +# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected group + +# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to unblackbox all files outside of the selected group + +# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected directory + +# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected directory + +# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected directory + +# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the +# context submenu to unblackbox all files outside of the selected directory + # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the # context menu to copy the function the user selected copyFunction.label=Copy Function @@ -100,6 +129,7 @@ skipPausingTooltip.label=Óvirkja rofstaði # LOCALIZATION NOTE (undoSkipPausingTooltip.label): The tooltip text for enabling all # breakpoints and pausing triggers +undoSkipPausingTooltip.label=Virkja rofstaði # LOCALIZATION NOTE (pauseButtonItem): The label that is displayed for the dropdown pause # list item when the debugger is in a running state. @@ -151,9 +181,6 @@ noEventListenersText=No event listeners to display # header. eventListenersHeader=Event Listeners -# LOCALIZATION NOTE (eventListenersHeader1): The text to display in the events -# header. - # LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab # when there are no stack frames. noStackFramesText=No stack frames to display @@ -208,6 +235,30 @@ otherEvents=Other # source. blackboxCheckboxTooltip2=Toggle blackboxing +# LOCALIZATION NOTE (eventListenersHeader1): The text to display in the events +# header. + +# LOCALIZATION NOTE (noDomMutationBreakpoints): The text to +# display in the DOM Mutation Breakpoints pane when there are no events. +# %S will be replaced by an active link using inspectorTool as text + +# LOCALIZATION NOTE (inspectorTool): The text to describe the the Inspector tool + +# LOCALIZATION NOTE (eventListenersHeader1.placeholder): The placeholder text in +# the event search input bar + +# LOCALIZATION NOTE (domMutationHeader): The text to display in the +# DOM Mutation Breakpoints header + +# LOCALIZATION NOTE (domMutationTypes.attribute): The text to display in the +# DOM Mutation Breakpoints panel for an attribute change + +# LOCALIZATION NOTE (domMutationTypes.removal): The text to display in the +# DOM Mutation Breakpoints panel for a DOM node removal + +# LOCALIZATION NOTE (domMutationTypes.subtree): The text to display in the +# DOM Mutation Breakpoints panel for a DOM subtree change + # LOCALIZATION NOTE (sources.search.key2): Key shortcut to open the search for # searching all the source files the debugger has seen. # Do not localize "CmdOrCtrl+P", or change the format of the string. These are @@ -318,22 +369,6 @@ sourceSearch.search.againPrev.key2=CmdOrCtrl+Shift+G # the number of matches for autocomplete sourceSearch.resultsSummary1=%d results -# LOCALIZATION NOTE (sourceSearch.search.again.key3): Key shortcut to highlight -# the next occurrence of the last search triggered from a source search -# Do not localize "Cmd+G", or change the format of the string. These are -# key identifiers, not messages displayed to the user. -sourceSearch.search.again.key3=Cmd+G - -# LOCALIZATION NOTE (sourceSearch.search.againPrev.key3): Key shortcut to highlight -# the previous occurrence of the last search triggered from a source search -# Do not localize "Cmd+Shift+G", or change the format of the string. These are -# key identifiers, not messages displayed to the user. -sourceSearch.search.againPrev.key3=Cmd+Shift+G - -# LOCALIZATION NOTE (sourceSearch.resultsSummary2): Semi-colon list of plural forms. -# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals -# Shows a summary of the number of matches for autocomplete - # LOCALIZATION NOTE (noMatchingStringsText): The text to display in the # global search results when there are no matching strings after filtering. noMatchingStringsText=No matches found @@ -377,6 +412,22 @@ searchPanelGoToLine=Go to line (%S) # filter panel popup for the variables search operation. searchPanelVariable=Filter variables (%S) +# LOCALIZATION NOTE (sourceSearch.search.again.key3): Key shortcut to highlight +# the next occurrence of the last search triggered from a source search +# Do not localize "Cmd+G", or change the format of the string. These are +# key identifiers, not messages displayed to the user. +sourceSearch.search.again.key3=Cmd+G + +# LOCALIZATION NOTE (sourceSearch.search.againPrev.key3): Key shortcut to highlight +# the previous occurrence of the last search triggered from a source search +# Do not localize "Cmd+Shift+G", or change the format of the string. These are +# key identifiers, not messages displayed to the user. +sourceSearch.search.againPrev.key3=Cmd+Shift+G + +# LOCALIZATION NOTE (sourceSearch.resultsSummary2): Semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# Shows a summary of the number of matches for autocomplete + # LOCALIZATION NOTE (breakpointHeadingMenuItem.*): The text for all the elements # that are displayed in the breakpoint headings menu item popup. breakpointHeadingsMenuItem.enableInSource.label=Virkja rofstaði @@ -389,6 +440,9 @@ breakpointHeadingsMenuItem.removeInSource.accesskey=R # LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that # are displayed in the breakpoints menu item popup. breakpointMenuItem.setConditional=Configure conditional breakpoint + +# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that +# are displayed in the breakpoints menu item popup. breakpointMenuItem.enableSelf2.label=Enable breakpointMenuItem.enableSelf2.accesskey=E breakpointMenuItem.disableSelf2.label=Disable @@ -498,13 +552,13 @@ components.header=Íhlutir # for the summarizing the selected search result. e.g. 5 of 10 results. editor.searchResults=%d of %d results +# LOCALIZATION NOTE (editor.singleResult): Copy shown when there is one result. +editor.singleResult=1 result + # LOCALIZATION NOTE (editor.searchResults1): Semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # Editor Search bar message to summarize the selected search result. e.g. 5 of 10 results. -# LOCALIZATION NOTE (editor.singleResult): Copy shown when there is one result. -editor.singleResult=1 result - # LOCALIZATION NOTE (editor.noResultsFound): Editor Search bar message # for when no results found. editor.noResultsFound=Engar niðurstöður fundust @@ -595,6 +649,16 @@ editor.jumpToMappedLocation1.accesskey=m downloadFile.label=Hlaða niður skrá downloadFile.accesskey=d +# LOCALIZATION NOTE (inlinePreview.show.label): Context menu item +# for showing the inline preview blocks + +# LOCALIZATION NOTE (inlinePreview.hide.label): Context menu item +# for hiding the inline preview block + +# LOCALIZATION NOTE (preview.noProperties): Label shown in the preview +# popup when there are no properties to show. +preview.noProperties=Engir eiginleikar + # LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the # context menu to disable framework grouping. framework.disableGrouping=Disable Framework Grouping @@ -633,6 +697,20 @@ xhrBreakpoints.label=Bæta við XHR rofstað # LOCALIZATION NOTE (pauseOnAnyXHR): The pause on any XHR checkbox description # when the debugger will pause on any XHR requests. +# LOCALIZATION NOTE (watchpoints.submenu): This is the text for the watchpoints sub-menu. + +# LOCALIZATION NOTE (watchpoints.getWatchpoint): This is the text that appears in the +# watchpoints sub-menu to add a "get" watchpoint on an object property. + +# LOCALIZATION NOTE (watchpoints.setWatchpoint): This is the text that appears in the +# watchpoints submenu to add a "set" watchpoint on an object property. + +# LOCALIZATION NOTE (watchpoints.removeWatchpoint): This is the text that appears in the +# context menu to delete a watchpoint on an object property. + +# LOCALIZATION NOTE (watchpoints.removeWatchpointTooltip): This is the text that appears in the +# tooltip to delete a watchpoint on an object property. + # LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item # for closing the selected tab below the mouse. sourceTabs.closeTab=Close tab @@ -674,6 +752,14 @@ sourceFooter.blackbox.accesskey=b sourceFooter.unblackbox=Unblackbox Source sourceFooter.unblackbox.accesskey=b +# LOCALIZATION NOTE (blackboxContextItem.blackbox): Text associated +# with the blackbox context menu item +blackboxContextItem.blackbox.accesskey=B + +# LOCALIZATION NOTE (blackboxContextItem.unblackbox): Text associated +# with the unblackbox context menu item +blackboxContextItem.unblackbox.accesskey=U + # LOCALIZATION NOTE (sourceFooter.mappedSource): Text associated # with a mapped source. %S is replaced by the source map origin. sourceFooter.mappedSource=(From %S) @@ -714,10 +800,17 @@ scopes.notPaused=Not Paused # LOCALIZATION NOTE (scopes.mapping.label): Scopes right sidebar pane # tooltip for checkbox and label +# LOCALIZATION NOTE (eventlisteners.log.label): Event listeners tooltip for +# checkbox and label + +# LOCALIZATION NOTE (eventlisteners.log): Checkbox label for logging events +eventlisteners.log=Skrá + # LOCALIZATION NOTE (scopes.helpTooltip.label): Scopes right sidebar pane # icon tooltip for link to MDN # LOCALIZATION NOTE (scopes.map.label): Checkbox label to map scopes +scopes.map.label=Varpa # LOCALIZATION NOTE (scopes.block): Refers to a block of code in # the scopes pane when the debugger is paused. @@ -851,70 +944,6 @@ watchExpressionsScopeLabel=Watch expressions # the global scope. globalScopeLabel=Global -# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is -# shown before the stack trace in an error. -variablesViewErrorStacktrace=Stack trace: - -# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed -# when you have an object preview that does not show all of the elements. At the end of the list -# you see "N more..." in the web console output. -# This is a semi-colon list of plural forms. -# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals -# #1 number of remaining items in the object -# example: 3 more… -variablesViewMoreObjects=#1 more…;#1 more… - -# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed -# in the variables list on an item with an editable name. -variablesEditableNameTooltip=Double click to edit - -# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed -# in the variables list on an item with an editable value. -variablesEditableValueTooltip=Click to change value - -# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed -# in the variables list on an item which can be removed. -variablesCloseButtonTooltip=Click to remove - -# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed -# in the variables list on a getter or setter which can be edited. -variablesEditButtonTooltip=Click to set value - -# LOCALIZATION NOTE (variablesDomNodeValueTooltip): The text that is displayed -# in a tooltip on the "open in inspector" button in the the variables list for a -# DOMNode item. -variablesDomNodeValueTooltip=Click to select the node in the inspector - -# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed -# in the variables list on certain variables or properties as tooltips. -# Explanations of what these represent can be found at the following links: -# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty -# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible -# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen -# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed -# It's probably best to keep these in English. -configurableTooltip=configurable -enumerableTooltip=enumerable -writableTooltip=writable -frozenTooltip=frozen -sealedTooltip=sealed -extensibleTooltip=extensible -overriddenTooltip=overridden -WebIDLTooltip=WebIDL - -# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed -# in the variables list as a separator between the name and value. -variablesSeparatorLabel=: - -# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed -# in the watch expressions list as a separator between the code and evaluation. -watchExpressionsSeparatorLabel2=\u0020→ - -# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed -# in the functions search panel as a separator between function's inferred name -# and its real name (if available). -functionSearchSeparatorLabel=← - # LOCALIZATION NOTE(gotoLineModal.placeholder): The placeholder # text displayed when the user searches for specific lines in a file gotoLineModal.placeholder=Go to line… @@ -933,6 +962,7 @@ gotoLineModal.key2=CmdOrCtrl+; # go to line modal # Do not localize "Ctrl+G", or change the format of the string. These are # key identifiers, not messages displayed to the user. +gotoLineModal.key3=Ctrl + G # LOCALIZATION NOTE(symbolSearch.search.functionsPlaceholder): The placeholder # text displayed when the user searches for functions in a file @@ -973,12 +1003,6 @@ symbolSearch.searchModifier.wholeWord=Whole word # resumed first. resumptionOrderPanelTitle=There are one or more paused debuggers. Please resume the most-recently paused debugger first at: %S -variablesViewOptimizedOut=(optimized away) -variablesViewUninitialized=(uninitialized) -variablesViewMissingArgs=(unavailable) - -anonymousSourcesLabel=Anonymous Sources - experimental=This is an experimental feature # LOCALIZATION NOTE (whyPaused.debuggerStatement): The text that is displayed @@ -1002,6 +1026,17 @@ whyPaused.exception=Paused on exception # in a info block explaining how the debugger is currently paused on a # DOM mutation breakpoint +# LOCALIZATION NOTE (whyPaused.mutationBreakpointAdded): The text that +# is displayed to describe an added node which triggers a subtree modification +whyPaused.mutationBreakpointAdded=Bætt við: + +# LOCALIZATION NOTE (whyPaused.mutationBreakpointRemoved): The text that +# is displayed to describe a removed node which triggers a subtree modification + +# LOCALIZATION NOTE (whyPaused.interrupted): The text that is displayed +# in a info block explaining how the debugger is currently paused at +# a JS execution + # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed # in a info block explaining how the debugger is currently paused while stepping # in or out of the stack @@ -1021,11 +1056,23 @@ whyPaused.breakpointConditionThrown=Error with conditional breakpoint # xml http request whyPaused.xhr=Paused on XMLHttpRequest +# LOCALIZATION NOTE (whyPaused.XHR): The text that is displayed +# in a info block explaining how the debugger is currently paused on an +# xml http request + # LOCALIZATION NOTE (whyPaused.promiseRejection): The text that is displayed # in a info block explaining how the debugger is currently paused on a # promise rejection whyPaused.promiseRejection=Paused on promise rejection +# LOCALIZATION NOTE (whyPaused.getWatchpoint): The text that is displayed +# in a info block explaining how the debugger is currently paused at a +# watchpoint on an object property + +# LOCALIZATION NOTE (whyPaused.setWatchpoint): The text that is displayed +# in an info block explaining how the debugger is currently paused at a +# watchpoint on an object property + # LOCALIZATION NOTE (whyPaused.assert): The text that is displayed # in a info block explaining how the debugger is currently paused on an # assert @@ -1050,6 +1097,10 @@ ctrl=Ctrl # anonymous. anonymousFunction=<anonymous> +# LOCALIZATION NOTE (stacktrace.asyncStack): this string is used to +# indicate that a given stack frame has an async parent. +# %S is the "Async Cause" of the frame. + # LOCALIZATION NOTE (shortcuts.toggleBreakpoint): text describing # keyboard shortcut action for toggling breakpoint shortcuts.toggleBreakpoint=Toggle Breakpoint @@ -1116,6 +1167,91 @@ shortcuts.functionSearch=Function Search # keyboard shortcut button text shortcuts.buttonName=Flýtilyklar +# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed +# in the variables list as a separator between the name and value. +variablesSeparatorLabel=: + +# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed +# in the watch expressions list as a separator between the code and evaluation. +watchExpressionsSeparatorLabel2=\u0020→ + +# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed +# in the functions search panel as a separator between function's inferred name +# and its real name (if available). +functionSearchSeparatorLabel=← + +variablesViewOptimizedOut=(optimized away) +variablesViewUninitialized=(uninitialized) +variablesViewMissingArgs=(unavailable) + +anonymousSourcesLabel=Anonymous Sources + +# LOCALIZATION NOTE (variablesDomNodeValueTooltip): The text that is displayed +# in a tooltip on the "open in inspector" button in the the variables list for a +# DOMNode item. +variablesDomNodeValueTooltip=Click to select the node in the inspector + +# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed +# in the variables list on a getter or setter which can be edited. +variablesEditButtonTooltip=Click to set value + +# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is +# shown before the stack trace in an error. +variablesViewErrorStacktrace=Stack trace: + +# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed +# when you have an object preview that does not show all of the elements. At the end of the list +# you see "N more..." in the web console output. +# This is a semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# #1 number of remaining items in the object +# example: 3 more… +variablesViewMoreObjects=#1 more…;#1 more… + +# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed +# in the variables list on an item with an editable name. +variablesEditableNameTooltip=Double click to edit + +# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed +# in the variables list on an item with an editable value. +variablesEditableValueTooltip=Click to change value + +# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed +# in the variables list on an item which can be removed. +variablesCloseButtonTooltip=Click to remove + +# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed +# in the variables list on certain variables or properties as tooltips. +# Explanations of what these represent can be found at the following links: +# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty +# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible +# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen +# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed +# It's probably best to keep these in English. +configurableTooltip=configurable +enumerableTooltip=enumerable +writableTooltip=writable +frozenTooltip=frozen +sealedTooltip=sealed +extensibleTooltip=extensible +overriddenTooltip=overridden +WebIDLTooltip=WebIDL + +# LOCALIZATION NOTE (serviceWorkerInfo.parsed): State displayed for a service +# worker that has been parsed. +# LOCALIZATION NOTE (serviceWorkerInfo.installing): State displayed for a +# service worker that is being installed. +# LOCALIZATION NOTE (serviceWorkerInfo.installed): State displayed for a +# service worker that has finished being installed. +# LOCALIZATION NOTE (serviceWorkerInfo.activating): State displayed for a +# service worker that is being activated. +# LOCALIZATION NOTE (serviceWorkerInfo.activated): State displayed for a +# service worker that has finished being activated. +# LOCALIZATION NOTE (serviceWorkerInfo.redundant): State displayed for a +# service worker that is redundant. +# LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a +# service worker that is in an unknown state. + # LOCALIZATION NOTE (collapseSources): This is the tooltip for the button # that collapses the Sources and Outlines panes in the debugger UI. collapseSources=Collapse Sources and Outline panes @@ -1154,9 +1290,6 @@ expandSources=Expand Sources and Outline panes # LOCALIZATION NOTE (expandBreakpoints): This is the tooltip for the button # that expands the Breakpoints panes in the debugger UI. expandBreakpoints=Expand Breakpoints pane -# LOCALIZATION NOTE (undoSkipPausingTooltip.label): The tooltip text for enabling all -# breakpoints and pausing triggers -undoSkipPausingTooltip.label=Activate breakpoints # LOCALIZATION NOTE (pauseOnCaughtExceptionsItem): The pause on exceptions checkbox description # when the debugger should pause on caught exceptions pauseOnCaughtExceptionsItem=Pause on caught exceptions @@ -1206,9 +1339,6 @@ inlinePreview.show.label=Show inline preview # LOCALIZATION NOTE (inlinePreview.hide.label): Context menu item # for hiding the inline preview block inlinePreview.hide.label=Hide inline preview -# LOCALIZATION NOTE (preview.noProperties): Label shown in the preview -# popup when there are no properties to show. -preview.noProperties=No properties # LOCALIZATION NOTE (xhrBreakpoints.item.label): message displayed when reaching a breakpoint for XHR requests. %S is replaced by the path provided as condition for the breakpoint. xhrBreakpoints.item.label=URL contains “%S” # LOCALIZATION NOTE (pauseOnAnyXHR): The pause on any XHR checkbox description @@ -1231,11 +1361,9 @@ watchpoints.removeWatchpointTooltip=Remove watchpoint # LOCALIZATION NOTE (blackboxContextItem.blackbox): Text associated # with the blackbox context menu item blackboxContextItem.blackbox=Blackbox source -blackboxContextItem.blackbox.accesskey=B # LOCALIZATION NOTE (blackboxContextItem.unblackbox): Text associated # with the unblackbox context menu item blackboxContextItem.unblackbox=Unblackbox source -blackboxContextItem.unblackbox.accesskey=U # LOCALIZATION NOTE (sourceFooter.currentCursorPosition): Text associated # with the current cursor line and column sourceFooter.currentCursorPosition=(%1$S, %2$S) @@ -1248,13 +1376,9 @@ scopes.mapping.label=Map original variable names # LOCALIZATION NOTE (eventlisteners.log.label): Event listeners tooltip for # checkbox and label eventlisteners.log.label=Log events to the console -# LOCALIZATION NOTE (eventlisteners.log): Checkbox label for logging events -eventlisteners.log=Log # LOCALIZATION NOTE (scopes.helpTooltip.label): Scopes right sidebar pane # icon tooltip for link to MDN scopes.helpTooltip.label=Learn more about map scopes -# LOCALIZATION NOTE (scopes.map.label): Checkbox label to map scopes -scopes.map.label=Map # LOCALIZATION NOTE (welcome.search2): The center pane welcome panel's # search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on # a mac we use the unicode character. @@ -1263,11 +1387,6 @@ welcome.search2=%S Go to file # search prompt. e.g. cmd+f to search for files. On windows, it's ctrl+shift+f, on # a mac we use the unicode character. welcome.findInFiles2=%S Find in files -# LOCALIZATION NOTE(gotoLineModal.key3): The shortcut for opening the -# go to line modal -# Do not localize "Ctrl+G", or change the format of the string. These are -# key identifiers, not messages displayed to the user. -gotoLineModal.key3=Ctrl+G # LOCALIZATION NOTE (whyPaused.eventBreakpoint): The text that is displayed # in a info block explaining how the debugger is currently paused on an event # breakpoint. @@ -1276,9 +1395,6 @@ whyPaused.eventBreakpoint=Paused on event breakpoint # in a info block explaining how the debugger is currently paused on a # DOM mutation breakpoint whyPaused.mutationBreakpoint=Paused on DOM mutation -# LOCALIZATION NOTE (whyPaused.mutationBreakpointAdded): The text that -# is displayed to describe an added node which triggers a subtree modification -whyPaused.mutationBreakpointAdded=Added: # LOCALIZATION NOTE (whyPaused.mutationBreakpointRemoved): The text that # is displayed to describe a removed node which triggers a subtree modification whyPaused.mutationBreakpointRemoved=Removed: diff --git a/thunderbird-l10n/is/localization/is/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/is/localization/is/toolkit/about/aboutAddons.ftl index b5f5466a1e5fdc642342c827c8d05f4e171cafc4..df3b1fbabc86a69abcade2bcfd99fd6d7a29d236 100644 --- a/thunderbird-l10n/is/localization/is/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/is/localization/is/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Setja inn viðbót frá skrá… .accesskey = i help-button = Viðbótastuðningur +sidebar-help-button-title = + .title = Viðbótastuðningur preferences = { PLATFORM() -> [windows] { -brand-short-name } Valmynd @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Verkfæri fyrir allar viðbætur +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } Valmynd + *[other] { -brand-short-name } Valkostir + } show-unsigned-extensions-button = .label = Ekki tókst að staðfesta sumar viðbætur show-all-extensions-button = @@ -146,12 +154,26 @@ extensions-view-available-updates = .name = Fáanlegar uppfærslur .tooltiptext = { extensions-view-available-updates.name } addon-category-extension = Viðbætur +addon-category-extension-title = + .title = Viðbætur addon-category-theme = Þema +addon-category-theme-title = + .title = Þema addon-category-plugin = Tengiforrit +addon-category-plugin-title = + .title = Tengiforrit addon-category-dictionary = Orðabækur +addon-category-dictionary-title = + .title = Orðabækur addon-category-locale = Tungumál +addon-category-locale-title = + .title = Tungumál addon-category-available-updates = Fáanlegar uppfærslur +addon-category-available-updates-title = + .title = Fáanlegar uppfærslur addon-category-recent-updates = Nýlegar uppfærslur +addon-category-recent-updates-title = + .title = Nýlegar uppfærslur ## These are global warnings @@ -271,6 +293,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Sýna minna go-back-button = .tooltiptext = Til baka +header-back-button = + .title = Til baka ## Recommended add-ons page diff --git a/thunderbird-l10n/is/localization/is/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/is/localization/is/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..c0a6e7cc0cf1304bed30664a569938bae629050f --- /dev/null +++ b/thunderbird-l10n/is/localization/is/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,10 @@ +# 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/. + +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Loka + *[other] Hætta + } diff --git a/thunderbird-l10n/is/localization/is/toolkit/intl/languageNames.ftl b/thunderbird-l10n/is/localization/is/toolkit/intl/languageNames.ftl index 86a402cb883c40d9e94673b1716fb056a727d3fc..e08eee1bebb1e3b928349a92edbd53a07ac101ff 100644 --- a/thunderbird-l10n/is/localization/is/toolkit/intl/languageNames.ftl +++ b/thunderbird-l10n/is/localization/is/toolkit/intl/languageNames.ftl @@ -188,6 +188,7 @@ language-name-tlh = Klingónska language-name-tn = Tsvana language-name-to = Tonga language-name-tr = Tyrkneska +language-name-trs = Triqui language-name-ts = Tonganska language-name-tt = Tatarska language-name-tw = Tví diff --git a/thunderbird-l10n/is/localization/is/toolkit/printing/printPreview.ftl b/thunderbird-l10n/is/localization/is/toolkit/printing/printPreview.ftl index 7c5a30c2acb8bcceb05689dacbd5c2f5fa8cf7a4..0f9efd5c5148eb51fc8816e1a850d6ba2b97c987 100644 --- a/thunderbird-l10n/is/localization/is/toolkit/printing/printPreview.ftl +++ b/thunderbird-l10n/is/localization/is/toolkit/printing/printPreview.ftl @@ -12,7 +12,7 @@ printpreview-simplify-page-checkbox-enabled = .tooltiptext = Breyta útliti til að auðveldara sé að lesa printpreview-close = .label = Loka - .accesskey = o + .accesskey = L printpreview-portrait = .label = Skammsnið .accesskey = S @@ -25,14 +25,15 @@ printpreview-scale = printpreview-shrink-to-fit = .label = Minnka svo passi á síðu printpreview-custom = - .label = Sérsniðið… + .label = Sérsnið… printpreview-print = .label = Prenta… .accesskey = P printpreview-of = .value = af printpreview-custom-prompt = - .value = Skali… + .value = Sérsniðinn skali… +printpreview-custom-scale-prompt-title = Sérsniðinn skali printpreview-page-setup = .label = Uppsetning síðu… .accesskey = U diff --git a/thunderbird-l10n/is/manifest.json b/thunderbird-l10n/is/manifest.json index d4150f92b82fc4c5e4773001b682ea246fb4bde3..41638723bd1b3c718bc7cfcf333bec91baa5413e 100644 --- a/thunderbird-l10n/is/manifest.json +++ b/thunderbird-l10n/is/manifest.json @@ -1,57 +1,57 @@ { - "applications": { - "gecko": { - "strict_min_version": "76.0", - "id": "langpack-is@thunderbird.mozilla.org", - "strict_max_version": "76.*" - } - }, + "description": "Language pack for Thunderbird for is", "author": "mozilla.org", - "version": "76.0buildid20200407173003", - "manifest_version": 2, - "langpack_id": "is", + "name": "Icelandic (IS) Language Pack", "sources": { "browser": { "base_path": "browser/" } }, + "langpack_id": "is", + "version": "76.0buildid20200420212409", + "applications": { + "gecko": { + "id": "langpack-is@thunderbird.mozilla.org", + "strict_min_version": "76.0", + "strict_max_version": "76.*" + } + }, "languages": { "is": { - "version": "20200403075109", + "version": "20200420122433", "chrome_resources": { - "branding": "chrome/is/locale/is/branding/", - "devtools": "chrome/is/locale/is/devtools/client/", - "messenger-newsblog": "chrome/is/locale/is/messenger-newsblog/", - "messenger-smime": "chrome/is/locale/is/messenger-smime/", - "messenger-region": "chrome/is/locale/is/messenger-region/", - "messenger": "chrome/is/locale/is/messenger/", - "passwordmgr": "chrome/is/locale/is/passwordmgr/", - "devtools-startup": "chrome/is/locale/is/devtools/startup/", - "necko": "chrome/is/locale/is/necko/", - "pippki": "chrome/is/locale/is/pippki/", - "mozapps": "chrome/is/locale/is/mozapps/", - "messenger-mapi": "chrome/is/locale/is/messenger-mapi/", "communicator": "chrome/is/locale/is/communicator/", - "mozldap": "chrome/is/locale/is/mozldap/", + "pluginproblem": "chrome/is/locale/is/pluginproblem/", + "calendar": "chrome/is/locale/is/calendar/", + "chat": "chrome/is/locale/is/chat/", + "autoconfig": "chrome/is/locale/is/autoconfig/", + "pipnss": "chrome/is/locale/is/pipnss/", + "devtools-shared": "chrome/is/locale/is/devtools/shared/", + "messenger": "chrome/is/locale/is/messenger/", + "alerts": "chrome/is/locale/is/alerts/", "global-platform": { "linux": "chrome/is/locale/is/global-platform/unix/", - "win": "chrome/is/locale/is/global-platform/win/", + "android": "chrome/is/locale/is/global-platform/unix/", "macosx": "chrome/is/locale/is/global-platform/mac/", - "android": "chrome/is/locale/is/global-platform/unix/" + "win": "chrome/is/locale/is/global-platform/win/" }, - "devtools-shared": "chrome/is/locale/is/devtools/shared/", - "lightning": "chrome/is/locale/is/lightning/", + "passwordmgr": "chrome/is/locale/is/passwordmgr/", + "messenger-smime": "chrome/is/locale/is/messenger-smime/", + "branding": "chrome/is/locale/is/branding/", + "messenger-mapi": "chrome/is/locale/is/messenger-mapi/", + "mozapps": "chrome/is/locale/is/mozapps/", "places": "chrome/is/locale/is/places/", - "calendar": "chrome/is/locale/is/calendar/", - "pipnss": "chrome/is/locale/is/pipnss/", - "chat": "chrome/is/locale/is/chat/", - "pluginproblem": "chrome/is/locale/is/pluginproblem/", - "alerts": "chrome/is/locale/is/alerts/", - "autoconfig": "chrome/is/locale/is/autoconfig/", - "global": "chrome/is/locale/is/global/" + "mozldap": "chrome/is/locale/is/mozldap/", + "global": "chrome/is/locale/is/global/", + "devtools": "chrome/is/locale/is/devtools/client/", + "messenger-region": "chrome/is/locale/is/messenger-region/", + "lightning": "chrome/is/locale/is/lightning/", + "messenger-newsblog": "chrome/is/locale/is/messenger-newsblog/", + "devtools-startup": "chrome/is/locale/is/devtools/startup/", + "pippki": "chrome/is/locale/is/pippki/", + "necko": "chrome/is/locale/is/necko/" } } }, - "name": "Icelandic (IS) Language Pack", - "description": "Language pack for Thunderbird for is" + "manifest_version": 2 } diff --git a/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/debugger.properties b/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/debugger.properties index 90b4b70ce54d73085720b66764c4aa1ee1aa7a31..8e785ac9c1c874e58a1c0ab8aef1d7d296bfc407 100644 --- a/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/debugger.properties +++ b/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/debugger.properties @@ -255,6 +255,7 @@ pauseOnAnyXHR = Sospendi su qualunque XHR watchpoints.submenu = Sospendi su… watchpoints.getWatchpoint = Lettura proprietà watchpoints.setWatchpoint = Impostazione proprietà +watchpoints.getOrSetWatchpoint = Imposta o leggi proprietà watchpoints.removeWatchpoint = Rimuovi watchpoint watchpoints.removeWatchpointTooltip = Rimuovi watchpoint sourceTabs.closeTab = Chiudi scheda diff --git a/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/layout.properties b/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/layout.properties index 0fd39a10d92f838c6eb5783f3bb8a82a93b608a1..2650e510f5599f7a3b1c01a27c4799d8202064bf 100644 --- a/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/layout.properties +++ b/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/layout.properties @@ -22,9 +22,9 @@ flexbox.itemSizing.finalSizeSectionHeader = Dimensione finale flexbox.itemSizing.itemContentSize = Dimensione contenuto flexbox.itemSizing.clampedToMax = L’elemento è stato bloccato alla sua dimensione massima. flexbox.itemSizing.clampedToMin = L’elemento è stato bloccato alla sua dimensione minima. -flexbox.itemSizing.setToGrow = L’elemento è impostato per allagarsi. +flexbox.itemSizing.setToGrow = L’elemento è impostato per allargarsi. flexbox.itemSizing.setToShrink = L’elemento è impostato per restringersi. -flexbox.itemSizing.notSetToGrow = L’elemento non è impostato per allagarsi. +flexbox.itemSizing.notSetToGrow = L’elemento non è impostato per allargarsi. flexbox.itemSizing.notSetToShrink = L’elemento non è impostato per restringersi. flexbox.togglesFlexboxHighlighter2 = Attiva/disattiva evidenziatore flexbox layout.gridDisplaySettings = Impostazioni visualizzazione griglia diff --git a/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/netmonitor.properties b/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/netmonitor.properties index c02a77d28107788f2d6eef6991dc288aad25b11a..40133213793ca131227bcf65eb16d250d6935d73 100644 --- a/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/netmonitor.properties +++ b/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/netmonitor.properties @@ -363,3 +363,7 @@ netmonitor.cache.fetchCount = Numero letture netmonitor.cache.lastFetched = Ultima lettura netmonitor.cache.lastModified = Ultima modifica netmonitor.cache.device = Dispositivo +netmonitor.settings.menuTooltip = Impostazioni rete +netmonitor.settings.importHarTooltip = Importa un file HAR con i dati di rete +netmonitor.settings.saveHarTooltip = Salva i dati di rete in un file HAR +netmonitor.settings.copyHarTooltip = Copia i dati di rete negli appunti diff --git a/thunderbird-l10n/it/chrome/it/locale/it/global/css.properties b/thunderbird-l10n/it/chrome/it/locale/it/global/css.properties index a365465849729db325a95a0a154a5fd34f849d4d..d7e63bbb94e04a120b84c3474a2de91ebbb332e3 100644 --- a/thunderbird-l10n/it/chrome/it/locale/it/global/css.properties +++ b/thunderbird-l10n/it/chrome/it/locale/it/global/css.properties @@ -158,6 +158,7 @@ PESupportsGroupRuleStart = Previsto “{” per iniziare la regola @supports, ri PEFilterEOF = filtro PEExpectedNoneOrURL = Previsto “none” o URL, invece è stato rilevato “%1$S”. PEExpectedNoneOrURLOrFilterFunction = Previsto “none”, URL o una funzione filtro, invece è stato rilevato “%1$S”. +PEDisallowedImportRule = Le regole @import non sono ancora valide in fogli di stile costruiti. PEExpectedNonnegativeNP = Previsto numero non negativo o percentuale. PEFilterFunctionArgumentsParsingError = Errore nell’analisi degli argomenti per la funzione filtro. PEVariableEOF = variabile diff --git a/thunderbird-l10n/it/chrome/it/locale/it/global/dom/dom.properties b/thunderbird-l10n/it/chrome/it/locale/it/global/dom/dom.properties index a40493b5f89a89d44fba7191d2da13cc4524f515..65f6f61237dcd3a2ec78cc2056bfa2f089e6514b 100644 --- a/thunderbird-l10n/it/chrome/it/locale/it/global/dom/dom.properties +++ b/thunderbird-l10n/it/chrome/it/locale/it/global/dom/dom.properties @@ -156,10 +156,10 @@ InterceptedNonResponseWithURL = Impossibile caricare “%1$S”. Un ServiceWorke PrefixedImageSmoothingEnabledWarning = L’utilizzo di mozImageSmoothingEnabled è deprecato. Al suo posto utilizzare la proprietà senza prefisso imageSmoothingEnabled. ServiceWorkerScopePathMismatch = Registrazione del ServiceWorker non riuscita: il percorso “%1$S” fornito per l’ambito non è incluso nell’ambito massimo consentito “%2$S”. Correggere l’ambito, spostare lo script del service worker o utilizzare l’header HTTP Service-Worker-Allowed per consentire l’ambito. ServiceWorkerRegisterNetworkError = Registrazione/aggiornamento del ServiceWorker non riuscito per l’ambito “%1$S”: caricamento non riuscito con stato “%2$S” per lo script “%3$S”. -ServiceWorkerRegisterStorageError = Registrazione/aggiornamento del ServiceWorker non riuscito per l’ambito “%1$S”: l’accesso allo storage è limitato dalle impostazioni utente o dalla modalità Navigazione anonima. -ServiceWorkerGetRegistrationStorageError = Impossibile ottenere la registrazione del service worker: l’accesso allo storage è limitato dalle impostazioni utente o dalla modalità Navigazione anonima. -ServiceWorkerGetClientStorageError = Impossibile ottenere i client del service worker: l’accesso allo storage è limitato dalle impostazioni utente o dalla modalità Navigazione anonima. -ServiceWorkerPostMessageStorageError = Il ServiceWorker per l’ambito “%S” non ha potuto eseguire “postMessage” in quanto l’accesso allo storage è limitato dalle impostazioni utente o dalla modalità Navigazione anonima. +ServiceWorkerRegisterStorageError = Registrazione/aggiornamento del ServiceWorker non riuscito per l’ambito “%1$S”: l’accesso alle risorse di archiviazione è limitato dalle impostazioni utente o dalla modalità Navigazione anonima. +ServiceWorkerGetRegistrationStorageError = Impossibile ottenere la registrazione del service worker: l’accesso alle risorse di archiviazione è limitato dalle impostazioni utente o dalla modalità Navigazione anonima. +ServiceWorkerGetClientStorageError = Impossibile ottenere i client del service worker: l’accesso alle risorse di archiviazione è limitato dalle impostazioni utente o dalla modalità Navigazione anonima. +ServiceWorkerPostMessageStorageError = Il ServiceWorker per l’ambito “%S” non ha potuto eseguire “postMessage” in quanto l’accesso alle risorse di archiviazione è limitato dalle impostazioni utente o dalla modalità Navigazione anonima. ServiceWorkerRegisterMimeTypeError2 = Registrazione/aggiornamento del ServiceWorker non riuscito per l’ambito “%1$S”: ricevuto Content-Type errato “%2$S” per lo script “%3$S”. Deve essere un tipo MIME JavaScript. ServiceWorkerGraceTimeoutTermination = Il ServiceWorker per l’ambito “%1$S” con waitUntil/respondWith promise in sospeso è stato interrotto per grace timeout. ServiceWorkerNoFetchHandler = I gestori degli eventi fetch devono essere aggiunti durante la valutazione iniziale dello script del worker. diff --git a/thunderbird-l10n/it/chrome/it/locale/it/global/security/security.properties b/thunderbird-l10n/it/chrome/it/locale/it/global/security/security.properties index 9752c7551c979e58226e7d7c9b6bc8c5429551c6..d3b62f36fcda94fc208be84e3511f74566c41bf1 100644 --- a/thunderbird-l10n/it/chrome/it/locale/it/global/security/security.properties +++ b/thunderbird-l10n/it/chrome/it/locale/it/global/security/security.properties @@ -85,6 +85,8 @@ ReferrerOriginLengthOverLimitation = Header HTTP Referrer: la lunghezza dell’o XFOInvalid = X-Frame-Options non valido: header “%1$S” da “%2$S” caricato in “%3$S”. XFODeny = Caricamento negato da X-Frame-Options: “%1$S” da “%2$S”, il sito non consente framing. Tentativo di caricamento in “%3$S”. XFOSameOrigin = Caricamento negato da X-Frame-Options: “%1$S” da “%2$S”, il sito non consente framing cross-origin da “%3$S”. +XFrameOptionsInvalid = Rilevato header X-Frame-Options non valido durante il caricamento di “%2$S”: “%1$S” non è una direttiva valida. +XFrameOptionsDeny = Il caricamento di “%2$S” in un riquadro è vietato dalla direttiva “X-Frame-Options“ impostata a “%1$S“. HTTPSOnlyUpgradeRequest = Aggiornamento della richiesta non sicura da “%1$S” a “%2$S”. HTTPSOnlyNoUpgradeException = Richiesta non sicura “%1$S” non aggiornata in quanto esentata. HTTPSOnlyFailedRequest = Aggiornamento della richiesta non sicura “%1$S” non riuscito. (%2$S) diff --git a/thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.dtd b/thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.dtd index 161439bdd9e937e889eadcf076b6f48ba591363d..c4c232b15b8105cd33d1142db1b06a4fb042f139 100644 --- a/thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.dtd +++ b/thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Cerca messaggi…"> <!ENTITY searchMailCmd.accesskey "m"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Ricerca globale…"> +<!ENTITY glodaSearchCmd.accesskey "G"> <!ENTITY searchAddressesCmd.label "Cerca indirizzi…"> <!ENTITY searchAddressesCmd.accesskey "C"> diff --git a/thunderbird-l10n/it/chrome/it/locale/it/messenger/pgpmime.properties b/thunderbird-l10n/it/chrome/it/locale/it/messenger/pgpmime.properties index b08650e6c4b2bde1f4ea978f7286eb20e1f142d3..93cc06eecb500153476548b0623f0808d97cf462 100644 --- a/thunderbird-l10n/it/chrome/it/locale/it/messenger/pgpmime.properties +++ b/thunderbird-l10n/it/chrome/it/locale/it/messenger/pgpmime.properties @@ -2,4 +2,13 @@ # 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/. -pgpMimeNeedsAddon = Questo è un messaggio cifrato OpenPGP.<br>Per decrittare questo messaggio si deve installare un <a href="%S">add-on OpenPGP</a>. +# +# The following are used by the pgpmime content type handler +# + +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +# %S is the url to Enigmail on AMO supplied from preferences. +pgpMimeNeedsAddon=Questo è un messaggio cifrato OpenPGP.<br>Per decrittare questo messaggio si deve installare un <a href="%S">add-on OpenPGP</a>. + +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Questo è un messaggio OpenPGP crittato, ma il supporto per la decrittazione OpenPGP non è disponibile. diff --git a/thunderbird-l10n/it/chrome/it/locale/it/necko/necko.properties b/thunderbird-l10n/it/chrome/it/locale/it/necko/necko.properties index eaf17c7c19cb67770c93d9c6c8b9a2e5d7284dc1..52cd82502282ce114b4e13cbc2d60682eb5ba38d 100644 --- a/thunderbird-l10n/it/chrome/it/locale/it/necko/necko.properties +++ b/thunderbird-l10n/it/chrome/it/locale/it/necko/necko.properties @@ -29,14 +29,15 @@ SuperfluousAuth = Ci si sta autenticando sul sito “%1$S” con nome utente “ AutomaticAuth = Ci si sta autenticando sul sito “%1$S” con nome utente “%2$S”. TrackerUriBlocked = La risorsa “%1$S” è stata bloccata in quanto è attivo il blocco contenuti. UnsafeUriBlocked = La risorsa “%1$S” è stata bloccata dal servizio Safe Browsing. -CookieBlockedByPermission = La richiesta di accedere a cookie e spazio di archiviazione (storage) per “%1$S” è stata bloccata da permessi personalizzati per i cookie. -CookieBlockedTracker = La richiesta di accedere a cookie e spazio di archiviazione (storage) per “%1$S” è stata bloccata in quanto proviene da un elemento tracciante e il blocco contenuti è attivo. -CookieBlockedAll = La richiesta di accedere a cookie e spazio di archiviazione (storage) per “%1$S” è stata bloccata in quanto tutte le richieste di accesso allo spazio di archiviazione sono bloccate. -CookieBlockedForeign = La richiesta di accedere a cookie e spazio di archiviazione (storage) per “%1$S” è stata bloccata in quanto tutte le richieste di accesso di terze parti allo spazio di archiviazione sono bloccate e il blocco contenuti è attivo. -CookieAllowedForOriginOnTrackerByStorageAccessAPI = Consentito accesso allo spazio di archiviazione (storage) per “%3$S” aperto da elemento tracciante “%2$S” su “%1$S”. -CookieAllowedForTrackerByStorageAccessAPI = Consentito accesso allo spazio di archiviazione (storage) per elemento tracciante “%2$S” su “%1$S”. -CookieAllowedForOriginOnTrackerByHeuristic = Consentito automaticamente accesso allo spazio di archiviazione (storage) per “%3$S” aperto da elemento tracciante “%2$S” su “%1$S”. -CookieAllowedForTrackerByHeuristic = Consentito automaticamente accesso allo spazio di archiviazione (storage) per elemento tracciante “%2$S” su “%1$S”. +CookieBlockedByPermission = La richiesta di accedere a cookie e risorse di archiviazione per “%1$S” è stata bloccata da permessi personalizzati per i cookie. +CookieBlockedTracker = La richiesta di accedere a cookie e risorse di archiviazione per “%1$S” è stata bloccata in quanto proviene da un elemento tracciante e il blocco contenuti è attivo. +CookieBlockedAll = La richiesta di accedere a cookie e risorse di archiviazione per “%1$S” è stata bloccata in quanto tutte le richieste di accesso alle risorse di archiviazione sono bloccate. +CookieBlockedForeign = La richiesta di accedere a cookie e risorse di archiviazione per “%1$S” è stata bloccata in quanto tutte le richieste di accesso di terze parti alle risorse di archiviazione sono bloccate e il blocco contenuti è attivo. +CookieAllowedForOriginOnTrackerByStorageAccessAPI = Consentito accesso alle risorse di archiviazione per “%3$S” aperto da elemento tracciante “%2$S” su “%1$S”. +CookieAllowedForTrackerByStorageAccessAPI = Consentito accesso alle risorse di archiviazione per elemento tracciante “%2$S” su “%1$S”. +CookieAllowedForOriginOnTrackerByHeuristic = Consentito automaticamente accesso alle risorse di archiviazione per “%3$S” aperto da elemento tracciante “%2$S” su “%1$S”. +CookieAllowedForTrackerByHeuristic = Consentito automaticamente accesso alle risorse di archiviazione per elemento tracciante “%2$S” su “%1$S”. +CookieAllowedForFpiByHeuristic = Accesso alle risorse di archiviazione garantito automaticamente per isolamento First-Party “%2$S” su “%1$S”. CookieRejectedNonRequiresSecure = Cookie “%1$S” rifiutato in quanto include l’attributo “sameSite=none” ma manca l’attributo “secure”. CookieRejectedNonRequiresSecureForBeta = Il cookie “%1$S” verrà presto rifiutato in quanto l’attributo “sameSite” è impostato a “none” o un valore non valido, senza l’attributo “secure”. Per ulteriori informazioni sull’attributo “sameSite”, consultare %2$S CookieLaxForced = Il criterio “sameSite” è impostato a “lax” per il cookie “%1$S” in quanto manca l’attributo “sameSite”. “sameSite=lax” è il valore predefinito per questo attributo. diff --git a/thunderbird-l10n/it/localization/it/messenger/accountCentral.ftl b/thunderbird-l10n/it/localization/it/messenger/accountCentral.ftl index 79d15caf2f8f6b927d6c9a0042c2dcaba16e6fc0..9f5b72a4369a1a7a5807f04f862f74d457663fdd 100644 --- a/thunderbird-l10n/it/localization/it/messenger/accountCentral.ftl +++ b/thunderbird-l10n/it/localization/it/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Benvenuto in { -brand-full-name } +account-settings = Impostazioni account +# $accounts (Number) - the number of configured accounts setup-title = Scegli che cosa vuoi configurare about-title = Informazioni su { -brand-full-name } resources-title = Risorse @@ -40,3 +42,10 @@ explore-link = Scopri le funzionalità support-link = Supporto involved-link = Collabora con noi developer-link = Documentazione per sviluppatori +read = Leggi messaggi +compose = Scrivi un nuovo messaggio +search = Cerca tra i messaggi +filter = Gestisci i filtri per i messaggi +nntp-subscription = Gestisci le sottoscrizioni ai gruppi di discussione +rss-subscription = Gestisci le sottoscrizioni ai feed +e2e = Crittografia end-to-end diff --git a/thunderbird-l10n/it/localization/it/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/it/localization/it/toolkit/about/aboutAddons.ftl index 7dd8f99e9eaab2cab736590a89909964e39f9900..2e6bccd8683529b335e2c69827b993cd4f76fd83 100644 --- a/thunderbird-l10n/it/localization/it/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/it/localization/it/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Installa componente aggiuntivo da file… .accesskey = I help-button = Supporto componenti aggiuntivi +sidebar-help-button-title = + .title = Supporto componenti aggiuntivi preferences = { PLATFORM() -> [windows] Opzioni di { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Strumenti per tutti i componenti aggiuntivi +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Opzioni di { -brand-short-name } + *[other] Preferenze di { -brand-short-name } + } show-unsigned-extensions-button = .label = Non è stato possibile verificare alcune estensioni show-all-extensions-button = @@ -167,13 +175,29 @@ extensions-view-available-updates = .name = Aggiornamenti disponibili .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Consigli +addon-category-discover-title = + .title = Consigli addon-category-extension = Estensioni +addon-category-extension-title = + .title = Estensioni addon-category-theme = Temi +addon-category-theme-title = + .title = Temi addon-category-plugin = Plugin +addon-category-plugin-title = + .title = Plugin addon-category-dictionary = Dizionari +addon-category-dictionary-title = + .title = Dizionari addon-category-locale = Lingue +addon-category-locale-title = + .title = Lingue addon-category-available-updates = Aggiornamenti disponibili +addon-category-available-updates-title = + .title = Aggiornamenti disponibili addon-category-recent-updates = Aggiornamenti recenti +addon-category-recent-updates-title = + .title = Aggiornamenti recenti ## These are global warnings @@ -286,6 +310,7 @@ shortcuts-no-commands = Le seguenti estensioni non hanno scorciatoie da tastiera shortcuts-input = .placeholder = Inserisci una scorciatoia shortcuts-browserAction = Attiva estensione +shortcuts-browserAction2 = Attiva pulsante nella barra degli strumenti shortcuts-pageAction = Attiva azione pagina shortcuts-sidebarAction = Attiva/disattiva barra laterale shortcuts-modifier-mac = Includi Ctrl, Alt o ⌘ @@ -304,6 +329,8 @@ shortcuts-card-expand-button = Visualizza altre { $numberToShow } shortcuts-card-collapse-button = Mostra meno scorciatoie go-back-button = .tooltiptext = Torna indietro +header-back-button = + .title = Torna indietro ## Recommended add-ons page diff --git a/thunderbird-l10n/it/localization/it/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/it/localization/it/toolkit/about/aboutSupport.ftl index 0415afe624ed8d9828fb96842a162eb53dfa8e7c..669e5aafb8e8c4e883119eac8dec9929c033b78e 100644 --- a/thunderbird-l10n/it/localization/it/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/it/localization/it/toolkit/about/aboutSupport.ftl @@ -300,6 +300,7 @@ touch-enabled = input touch attivo drag-enabled = trascinamento barre di scorrimento attivo keyboard-enabled = tastiera attiva autoscroll-enabled = scorrimento automatico attivo +zooming-enabled = smooth pinch-zoom attivo ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/it/localization/it/toolkit/about/certviewer.ftl b/thunderbird-l10n/it/localization/it/toolkit/about/certviewer.ftl index d684311e75c9b098af6d0750e29fe3d4765dc497..796e80713c5b85254bc209f9f23cf0afb835ae7d 100644 --- a/thunderbird-l10n/it/localization/it/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/it/localization/it/toolkit/about/certviewer.ftl @@ -16,6 +16,9 @@ certificate-viewer-certificate-authority = Autorità di certificazione certificate-viewer-cipher-suite = Suite di cifratura certificate-viewer-common-name = Nome comune certificate-viewer-email-address = Indirizzo email +# Variables: +# $firstCertName (String) - Common Name for the displayed certificate +certificate-viewer-tab-title = Certificato per { $firstCertName } # Inc. means Incorporated, e.g GitHub is incorporated in Delaware certificate-viewer-inc-country = Paese di costituzione certificate-viewer-country = Paese @@ -96,3 +99,18 @@ certificate-viewer-download-pem = PEM (certificato) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (catena) .download = { $fileName }-catena.pem + +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Questa estensione è stata contrassegnata come critica. Questo significa che un client deve rifiutare il certificato se non è in grado di interpretarla. + +certificate-viewer-export = Esporta + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Certificati personali +certificate-viewer-tab-people = Persone +certificate-viewer-tab-servers = Server +certificate-viewer-tab-ca = Autorità +certificate-viewer-tab-unkonwn = Sconosciuti diff --git a/thunderbird-l10n/it/localization/it/toolkit/global/processTypes.ftl b/thunderbird-l10n/it/localization/it/toolkit/global/processTypes.ftl index 4c0b8d9238435ae7f3fc107edf6403d4b254209b..585b41724d8e5b6ccd110fd224af453c427f9180 100644 --- a/thunderbird-l10n/it/localization/it/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/it/localization/it/toolkit/global/processTypes.ftl @@ -11,3 +11,4 @@ process-type-file = File locale process-type-weblargeallocation = Allocazione di grandi dimensioni process-type-webisolated = Contenuti web isolati process-type-gpu = GPU +process-type-socket = Socket diff --git a/thunderbird-l10n/it/localization/it/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/it/localization/it/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..cf5738b1d93c9d05c3a93668c06108bc61372d3c --- /dev/null +++ b/thunderbird-l10n/it/localization/it/toolkit/global/profileDowngrade.ftl @@ -0,0 +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/. + +profiledowngrade-window = + .title = Stai utilizzando una versione più vecchia di { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Crea un nuovo profilo +profiledowngrade-sync = L’utilizzo di una versione più vecchia di { -brand-product-name } può danneggiare segnalibri e cronologia di navigazione già salvati in un profilo esistente di { -brand-product-name }. Per proteggere queste informazioni, creare un nuovo profilo per questa installazione di { -brand-short-name }. È possibile utilizzare un { -fxaccount-brand-name } per sincronizzare segnalibri e cronologia di navigazione tra profili diversi. +profiledowngrade-nosync = L’utilizzo di una versione più vecchia di { -brand-product-name } può danneggiare segnalibri e cronologia di navigazione già salvati in un profilo esistente di { -brand-product-name }. Per proteggere queste informazioni, creare un nuovo profilo per questa installazione di { -brand-short-name }. +profiledowngrade-quit = + .label = Esci diff --git a/thunderbird-l10n/it/localization/it/toolkit/updates/elevation.ftl b/thunderbird-l10n/it/localization/it/toolkit/updates/elevation.ftl new file mode 100644 index 0000000000000000000000000000000000000000..7480eddd9aecca6bd9683f45aec15b30ae372d0b --- /dev/null +++ b/thunderbird-l10n/it/localization/it/toolkit/updates/elevation.ftl @@ -0,0 +1,14 @@ +# 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/. +# This is temporary until bug 1521632 is fixed + +elevation-update-wizard = + .title = Aggiornamento software +elevation-details-link-label = + .value = Dettagli +elevation-error-manual = È possibile aggiornare { -brand-short-name } manualmente visitando il seguente link e scaricando l’ultima versione: +elevation-finished-page = Aggiornamento pronto per l’installazione +elevation-finished-background-page = È stato scaricato ed è pronto per l’installazione un aggiornamento per migliorare la stabilità e la sicurezza di { -brand-short-name }. +elevation-finished-background = Aggiornamento: +elevation-more-elevated = L’installazione di questo aggiornamento richiede privilegi di amministratore e verrà effettuata al prossimo avvio di { -brand-short-name }. È possibile riavviare { -brand-short-name } adesso, proseguire con il proprio lavoro e riavviarlo più tardi, oppure annullare l’aggiornamento. diff --git a/thunderbird-l10n/it/manifest.json b/thunderbird-l10n/it/manifest.json index 3a8dc5125c8f1c98c828aa28a63fe187818ededd..2970451856524c4aa15548e16b2f052de55c388d 100644 --- a/thunderbird-l10n/it/manifest.json +++ b/thunderbird-l10n/it/manifest.json @@ -1,48 +1,50 @@ { + "manifest_version": 2, + "author": "mozilla.org (contributors: Roberto Principiano)", + "langpack_id": "it", "languages": { "it": { "chrome_resources": { - "branding": "chrome/it/locale/it/branding/", + "messenger-smime": "chrome/it/locale/it/messenger-smime/", + "places": "chrome/it/locale/it/places/", + "communicator": "chrome/it/locale/it/communicator/", + "global": "chrome/it/locale/it/global/", + "passwordmgr": "chrome/it/locale/it/passwordmgr/", "messenger-newsblog": "chrome/it/locale/it/messenger-newsblog/", - "global-platform": { - "linux": "chrome/it/locale/it/global-platform/unix/", - "macosx": "chrome/it/locale/it/global-platform/mac/", - "android": "chrome/it/locale/it/global-platform/unix/", - "win": "chrome/it/locale/it/global-platform/win/" - }, "devtools-shared": "chrome/it/locale/it/devtools/shared/", + "necko": "chrome/it/locale/it/necko/", + "autoconfig": "chrome/it/locale/it/autoconfig/", + "alerts": "chrome/it/locale/it/alerts/", "pipnss": "chrome/it/locale/it/pipnss/", - "messenger-region": "chrome/it/locale/it/messenger-region/", "mozldap": "chrome/it/locale/it/mozldap/", - "global": "chrome/it/locale/it/global/", - "lightning": "chrome/it/locale/it/lightning/", - "necko": "chrome/it/locale/it/necko/", - "passwordmgr": "chrome/it/locale/it/passwordmgr/", - "communicator": "chrome/it/locale/it/communicator/", - "places": "chrome/it/locale/it/places/", "calendar": "chrome/it/locale/it/calendar/", + "pluginproblem": "chrome/it/locale/it/pluginproblem/", + "chat": "chrome/it/locale/it/chat/", "pippki": "chrome/it/locale/it/pippki/", - "alerts": "chrome/it/locale/it/alerts/", "messenger-mapi": "chrome/it/locale/it/messenger-mapi/", - "chat": "chrome/it/locale/it/chat/", - "messenger-smime": "chrome/it/locale/it/messenger-smime/", + "global-platform": { + "android": "chrome/it/locale/it/global-platform/unix/", + "linux": "chrome/it/locale/it/global-platform/unix/", + "win": "chrome/it/locale/it/global-platform/win/", + "macosx": "chrome/it/locale/it/global-platform/mac/" + }, + "devtools-startup": "chrome/it/locale/it/devtools/startup/", "mozapps": "chrome/it/locale/it/mozapps/", - "autoconfig": "chrome/it/locale/it/autoconfig/", + "lightning": "chrome/it/locale/it/lightning/", + "branding": "chrome/it/locale/it/branding/", + "messenger-region": "chrome/it/locale/it/messenger-region/", "devtools": "chrome/it/locale/it/devtools/client/", - "devtools-startup": "chrome/it/locale/it/devtools/startup/", - "pluginproblem": "chrome/it/locale/it/pluginproblem/", "messenger": "chrome/it/locale/it/messenger/" }, - "version": "20200406064310" + "version": "20200420155819" } }, - "author": "mozilla.org (contributors: Roberto Principiano)", - "version": "76.0buildid20200407173003", + "description": "Language pack for Thunderbird for it", "applications": { "gecko": { - "strict_min_version": "76.0", + "id": "langpack-it@thunderbird.mozilla.org", "strict_max_version": "76.*", - "id": "langpack-it@thunderbird.mozilla.org" + "strict_min_version": "76.0" } }, "sources": { @@ -50,8 +52,6 @@ "base_path": "browser/" } }, - "langpack_id": "it", - "description": "Language pack for Thunderbird for it", - "manifest_version": 2, + "version": "76.0buildid20200420212409", "name": "Italiano (IT) Language Pack" } diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/debugger.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/debugger.properties index f91ef8e8a7fcb3ef144eba3e4cbb391c2a8197ca..a091cb916925e0e1736e72b2e8ac2a1460ce7a9a 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/debugger.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/debugger.properties @@ -55,6 +55,41 @@ setDirectoryRoot.accesskey =r removeDirectoryRoot.label =ルートディレクトリーを削除 removeDirectoryRoot.accesskey =d +# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item +blackBoxAll.label =ブラックボックス + +# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected group +blackBoxAllInGroup.label =このグループのファイルをブラックボックス化 + +# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected group +unblackBoxAllInGroup.label =このグループのファイルのブラックボックス化を解除 + +# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected group +blackBoxAllOutsideGroup.label =このグループ以外のファイルをブラックボックス化 + +# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to unblackbox all files outside of the selected group +unblackBoxAllOutsideGroup.label =このグループ以外のファイルのブラックボックス化を解除 + +# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected directory +blackBoxAllInDir.label =このディレクトリーのファイルをブラックボックス化 + +# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected directory +unblackBoxAllInDir.label =このディレクトリーのファイルのブラックボックス化を解除 + +# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected directory +blackBoxAllOutsideDir.label =このディレクトリー以外のファイルをブラックボックス化 + +# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the +# context submenu to unblackbox all files outside of the selected directory +unblackBoxAllOutsideDir.label =このディレクトリー以外のファイルのブラックボックス化を解除 + # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the # context menu to copy the function the user selected copyFunction.label =関数をコピー @@ -1054,11 +1089,6 @@ whyPaused.mutationBreakpointRemoved =削除: # a JS execution whyPaused.interrupted =実行中に停止しました -# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed -# in a info block explaining how the debugger is currently paused in a -# recording. -whyPaused.replayForcedPause =記録中に停止しました - # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed # in a info block explaining how the debugger is currently paused while stepping # in or out of the stack @@ -1287,30 +1317,3 @@ serviceWorkerInfo.redundant =冗長 # LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a # service worker that is in an unknown state. serviceWorkerInfo.unknown =不明 - -# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item -blackBoxAll.label=Blackbox -# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the -# context submenu to blackbox all files inside of the selected group -blackBoxAllInGroup.label=Blackbox files in this group -# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the -# context submenu to unblackbox all files inside of the selected group -unblackBoxAllInGroup.label=Unblackbox files in this group -# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the -# context submenu to blackbox all files outside of the selected group -blackBoxAllOutsideGroup.label=Blackbox files outside this group -# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the -# context submenu to unblackbox all files outside of the selected group -unblackBoxAllOutsideGroup.label=Unblackbox files outside this group -# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the -# context submenu to blackbox all files inside of the selected directory -blackBoxAllInDir.label=Blackbox files in this directory -# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the -# context submenu to unblackbox all files inside of the selected directory -unblackBoxAllInDir.label=Unblackbox files in this directory -# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the -# context submenu to blackbox all files outside of the selected directory -blackBoxAllOutsideDir.label=Blackbox files outside this directory -# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the -# context submenu to unblackbox all files outside of the selected directory -unblackBoxAllOutsideDir.label=Unblackbox files outside this directory diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/inspector.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/inspector.properties index a25cbedaf0443ed1ebbdf2ee61ee1543ea861cc5..45771ae55f7547a12bffc6bf0b3080bebed98916 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/inspector.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/inspector.properties @@ -546,7 +546,11 @@ markupView.scrollableBadge.tooltip =この要素にはスクロール可能な # LOCALIZATION NOTE (rulePreviewTooltip.noAssociatedRule): This is the text displayed inside # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. -rulePreviewTooltip.noAssociatedRule =該当するルールはありません。 +rulePreviewTooltip.noAssociatedRule =該当するルールはありません + +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut =Shift を押しながらクリックすると、ルールに移動します # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/jsonview.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/jsonview.properties index bc6caba30fa64c25376b55caf794c397cd371f09..16b2857e45c08b63e5755093ccb1c4f42ba60745 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/jsonview.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/jsonview.properties @@ -32,6 +32,8 @@ jsonViewer.Copy =コピー # LOCALIZATION NOTE (jsonViewer.ExpandAll): Label for expanding all nodes jsonViewer.ExpandAll =すべて展開 +jsonViewer.ExpandAllSlow =すべて展開 (時間がかかります) + # LOCALIZATION NOTE (jsonViewer.CollapseAll): Label for collapsing all nodes jsonViewer.CollapseAll =すべて折りたたむ @@ -50,5 +52,3 @@ jsonViewer.filterJSON =JSON を検索 # LOCALIZATION NOTE (jsonViewer.reps.reference): Label used for cycle # references in an array. jsonViewer.reps.reference =循環参照 - -jsonViewer.ExpandAllSlow=Expand All (slow) diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/menus.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/menus.properties index 2f429dbaf606cc22d70a4bed043ffd716fc75941..447cf2be2e87fb99514d6ed208810b42c8ff3426 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/menus.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/menus.properties @@ -47,17 +47,17 @@ browserContentToolboxMenu.accesskey =x webide.label =WebIDE webide.accesskey =W -# LOCALIZATION NOTE (toggleProfilerButtonMenu.label): This is the label for the -# application menu item that toggles the profiler button to record performance profiles. -toggleProfilerButtonMenu.label =プロファイラーツールバーアイコンを有効にする -toggleProfilerButtonMenu.accesskey =P - devtoolsWebReplay.label =Web Replay devtoolsRecordNewTab.label =新しい記録タブを開く devtoolsReloadAndRecordTab.label =再読み込みしてタブを記録 devtoolsSaveRecording.label =記録を保存 devtoolsReplayNewTab.label =新しいタブに記録を読み込み +# LOCALIZATION NOTE (toggleProfilerButtonMenu.label): This is the label for the +# application menu item that toggles the profiler button to record performance profiles. +toggleProfilerButtonMenu.label =プロファイラーツールバーアイコンを有効にする +toggleProfilerButtonMenu.accesskey =P + devToolboxMenuItem.label =開発ツールを表示 devToolboxMenuItem.accesskey =T diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/netmonitor.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/netmonitor.properties index ac262869cf1f153de08c50cc10c60ba69212387f..07aee69498530c2cfa8474697c8c2ceef6636a0a 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/netmonitor.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/netmonitor.properties @@ -351,6 +351,10 @@ netmonitor.timings.startedAt =要求開始: %S # %S is time expressed in milliseconds or minutes. netmonitor.timings.downloadedAt =ダウンロード開始: %S +# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the +# timings pane when thea request has been blocked +netmonitor.timings.noTimings =この要求のタイミング情報はありません + # LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed # in the network menu specifying timing interval divisions (in milliseconds). networkMenu.millisecond =%S ms @@ -761,6 +765,14 @@ netmonitor.ws.context.received =受信 # for the "Received" menu item displayed in the context menu in the websocket toolbar. netmonitor.ws.context.received.accesskey =R +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed +# on the context menu that shows "Control Frames" WebSocket frames. +netmonitor.ws.context.controlFrames =制御 + +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key +# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. +netmonitor.ws.context.controlFrames.accesskey =o + # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed # on the context menu that shows "Copy Message". netmonitor.ws.context.copyFrame =メッセージをコピー @@ -781,11 +793,6 @@ netmonitor.ws.type.sent =送信 # accessible text for the "received" type icon in the websocket table's "data" column. netmonitor.ws.type.received =受信 -# LOCALIZATION NOTE (netmonitor.ws.time.format): This is the format used for the -# time values in the websocket table's "time" column -# %1$S is the formatted hour-minutes-seconds, %2$S is the milliseconds (zero-padded) -netmonitor.ws.time.format =%1$S.%2$S - # LOCALIZATION NOTE (netmonitor.ws.rawData.header): This is the label displayed # in the messages panel identifying the raw data. netmonitor.ws.rawData.header =生データ (%S) @@ -1022,6 +1029,14 @@ netmonitor.toolbar.resetColumns =列表示をリセット # displayed in the network table header context menu to reset sorting netmonitor.toolbar.resetSorting =並べ替えをリセット +# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent): This is the label +# displayed in the network table header context menu to resize a column to fit its content +netmonitor.toolbar.resizeColumnToFitContent =列の幅を内容に合わせる + +# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent.title): This is the title +# tooltip displayed when draggable resizer in network table headers is hovered +netmonitor.toolbar.resizeColumnToFitContent.title =ダブルクリックで列の幅を内容に合わせます + # LOCALIZATION NOTE (netmonitor.toolbar.timings): This is the label # displayed in the network table header context menu for the timing submenu netmonitor.toolbar.timings =タイミング @@ -1518,19 +1533,3 @@ netmonitor.cache.lastModified =最終更新日時 # LOCALIZATION NOTE (netmonitor.cache.device): This is the label text for the device # where a cached object was fetched from (e.g. "disk"). netmonitor.cache.device =取得元デバイス - -# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the -# timings pane when thea request has been blocked -netmonitor.timings.noTimings=No timings for this request -# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed -# on the context menu that shows "Control Frames" WebSocket frames. -netmonitor.ws.context.controlFrames=Control -# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key -# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. -netmonitor.ws.context.controlFrames.accesskey=o -# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent): This is the label -# displayed in the network table header context menu to resize a column to fit its content -netmonitor.toolbar.resizeColumnToFitContent=Resize Column To Fit Content -# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent.title): This is the title -# tooltip displayed when draggable resizer in network table headers is hovered -netmonitor.toolbar.resizeColumnToFitContent.title=Double-click to fit column to content diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/toolbox.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/toolbox.properties index 6ccfacd3dbb3c26ea02a19a8aa3efc477380a02c..a097e5480d85ba33d1b99cfb95c5f8581f3daab1 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/toolbox.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/toolbox.properties @@ -291,22 +291,6 @@ browserToolbox.statusMessage =ブラウザーツールボックスの接続状 # shown in the web replay timeline marker toolbox.replay.jumpMessage =メッセージ %1$S に移動 -# LOCALIZATION NOTE (toolbox.replay.jumpMessage2): This is the label -# shown in the web replay timeline marker -toolbox.replay.jumpMessage2 =%1$S に移動 - -# LOCALIZATION NOTE (toolbox.replay.resume): This is the text that appears in the -# Replay command bar to prompt the user to resume the program. -toolbox.replay.resume =復帰 - -# LOCALIZATION NOTE (toolbox.replay.rewind): This is the text that appears in the -# Replay command bar to prompt the user to rewind the program. -toolbox.replay.rewind =巻き戻し - -# LOCALIZATION NOTE (toolbox.replay.pause): This is the text that appears in the -# Replay command bar to prompt the user to pause the program. -toolbox.replay.pause =停止 - # LOCALIZATION NOTE (toolbox.debugTargetErrorPage.title): This is the title # for the Error view shown by the toolbox when a connection to a debug target # could not be made @@ -322,11 +306,6 @@ toolbox.debugTargetErrorPage.description =デバッグ対象に接続できま # This entire text is treated as a link to an MDN page. options.deprecationNotice =非推奨です。詳細... -# LOCALIZATION NOTE (options.experimentalNotice): This is the text that appears in the -# settings panel for the checkbox that enables Replay. -# This entire text is treated as a link to an MDN page. -options.experimentalNotice =実験的な機能です。詳細... - # LOCALIZATION NOTE (options.enableMultiProcessToolbox): This is the text that appears in the # settings panel for the checkbox that enables the Multiprocess Browser Toolbox. options.enableMultiProcessToolbox =マルチプロセスブラウザーツールボックスを有効化 (ブラウザーツールボックスの再起動が必要です) diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/webconsole.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/webconsole.properties index e94bfa8b3f6bb1cfe11152f308d5380f82b292ab..164ee7c148c3d61e4a2b317356354c05b1b84cd5 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/webconsole.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/webconsole.properties @@ -192,6 +192,12 @@ webconsole.menu.openInNetworkPanel.accesskey =N webconsole.menu.resendNetworkRequest.label =要求を再送 webconsole.menu.resendNetworkRequest.accesskey =n +# LOCALIZATION NOTE (webconsole.menu.openNodeInInspector.label) +# Label used for a context-menu item displayed for DOM Node logs. Clicking on it will +# reveal that specific DOM Node in the Inspector. +webconsole.menu.openNodeInInspector.label =インスペクターで確認 +webconsole.menu.openNodeInInspector.accesskey =Q + # LOCALIZATION NOTE (webconsole.menu.storeAsGlobalVar.label) # Label used for a context-menu item displayed for object/variable logs. Clicking on it # creates a new global variable pointing to the logged variable. @@ -227,6 +233,19 @@ webconsole.menu.openInSidebar.accesskey =V # copies the entire output of the console to the clipboard. webconsole.menu.exportClipboard.label =表示メッセージをクリップボードにエクスポートする +# LOCALIZATION NOTE (webconsole.menu.timeWarp.label) +# Label used for a context-menu item displayed for any log. Clicking on it will +# jump to the execution point where the log item was generated. +webconsole.menu.timeWarp.label =ここに移動 + +# LOCALIZATION NOTE (webconsole.jumpButton.tooltip) +# Label used for the tooltip on the "jump" button in the console. It's displayed when +# the user recorded execution with WebReplay, is now paused in the debugger, and hover a +# message in the console output. Clicking on it will jump to the execution point where the +# log item was generated. +# Parameters: %S is the level of the message. +webconsole.jumpButton.tooltip =%S - ここに移動 + # LOCALIZATION NOTE (webconsole.menu.exportSubmenu.label) # Label used for a context-menu item displayed on the output. Clicking on it # opens a submenu where the user can select how to export messages. @@ -243,19 +262,6 @@ webconsole.menu.exportSubmenu.exportCliboard.label =クリップボード # the output of the console. webconsole.menu.exportSubmenu.exportFile.label =ファイル -# LOCALIZATION NOTE (webconsole.menu.timeWarp.label) -# Label used for a context-menu item displayed for any log. Clicking on it will -# jump to the execution point where the log item was generated. -webconsole.menu.timeWarp.label =ここに移動 - -# LOCALIZATION NOTE (webconsole.jumpButton.tooltip) -# Label used for the tooltip on the "jump" button in the console. It's displayed when -# the user recorded execution with WebReplay, is now paused in the debugger, and hover a -# message in the console output. Clicking on it will jump to the execution point where the -# log item was generated. -# Parameters: %S is the level of the message. -webconsole.jumpButton.tooltip =%S - ここに移動 - # LOCALIZATION NOTE (webconsole.clearButton.tooltip) # Label used for the tooltip on the clear logs button in the console top toolbar bar. # Clicking on it will clear the content of the console. @@ -386,11 +392,6 @@ webconsole.console.settings.menu.item.enablePersistentLogs.label =永続ログ # LOCALIZATION NOTE (webconsole.console.settings.menu.item.enablePersistentLogs.tooltip) webconsole.console.settings.menu.item.enablePersistentLogs.tooltip =このオプションを有効にすると、新しいページへ移動しても出力が消去されなくなります -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.label) -webconsole.console.settings.menu.item.eagerEvaluation.label =先行評価 -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.tooltip) -webconsole.console.settings.menu.item.eagerEvaluation.tooltip =このオプションを有効にすると、キー入力時に先行評価が行われます - # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.label) webconsole.console.settings.menu.item.instantEvaluation.label =即時評価 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.tooltip) @@ -587,12 +588,7 @@ webconsole.input.selector.top =トップ # expression for. webconsole.input.selector.tooltip =評価コンテキストを選択します -# LOCALIZATION NOTE (webconsole.menu.openNodeInInspector.label) -# Label used for a context-menu item displayed for DOM Node logs. Clicking on it will -# reveal that specific DOM Node in the Inspector. -webconsole.menu.openNodeInInspector.label=Reveal in Inspector -webconsole.menu.openNodeInInspector.accesskey=Q # LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultEnabled): do not translate 'sameSite'. -webconsole.group.cookieSameSiteLaxByDefaultEnabled=Some cookies are misusing the “sameSite“ attribute, so it won’t work as expected +webconsole.group.cookieSameSiteLaxByDefaultEnabled =一部の Cookie は “sameSite“ 属性がないため、期待通りの動作にはなりません # LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultDisabled): do not translate 'sameSite'. -webconsole.group.cookieSameSiteLaxByDefaultDisabled=Some cookies are misusing the recommended “sameSite“ attribute +webconsole.group.cookieSameSiteLaxByDefaultDisabled =一部の Cookie は推奨される “sameSite“ 属性がありません diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/mac/accessible.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/mac/accessible.properties index 67a81d48594e1d3c7d1b8318c9c66f70fe3f8697..353a089835e57d4dd415ecd419080ccaafb5630f 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/mac/accessible.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/mac/accessible.properties @@ -4,8 +4,8 @@ jump =移動 press =押す -check =チェック -uncheck =チェックしない +check =チェックを入れる +uncheck =チェックを外す select =選択 open =開く close =閉じる @@ -14,7 +14,7 @@ click =クリック collapse=折りたたむ expand =展開する activate=動作させる -cycle =切り替え +cycle =切り替え # Universal Access API support # (Mac Only) @@ -58,8 +58,7 @@ separator =区切り tabPanel =タブパネル # The roleDescription for the html:mark element highlight =強調 - # The roleDescription for the details element -details = details +details =詳細 # The roleDescription for the summary element -summary = summary +summary =要約 diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/unix/accessible.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/unix/accessible.properties index d89d8ef3f85d88cc3f7c6f3b860a36f681ab075f..252e22f7a82b53e86a0c8869bf7059a86d65eb0a 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/unix/accessible.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/unix/accessible.properties @@ -2,16 +2,16 @@ # 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/. -jump = 移動 -press = 押す -check = チェック -uncheck = チェックしない -select = 選択 -open = 開く -close = 閉じる -switch = 切り替え -click = クリック -collapse= 折りたたむ -expand = 展開する -activate= 動作させる -cycle = 切り替え +jump =移動 +press =押す +check =チェックを入れる +uncheck =チェックを外す +select =選択 +open =開く +close =閉じる +switch =切り替え +click =クリック +collapse=折りたたむ +expand =展開する +activate=動作させる +cycle =切り替え diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/win/accessible.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/win/accessible.properties index d89d8ef3f85d88cc3f7c6f3b860a36f681ab075f..252e22f7a82b53e86a0c8869bf7059a86d65eb0a 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/win/accessible.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/win/accessible.properties @@ -2,16 +2,16 @@ # 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/. -jump = 移動 -press = 押す -check = チェック -uncheck = チェックしない -select = 選択 -open = 開く -close = 閉じる -switch = 切り替え -click = クリック -collapse= 折りたたむ -expand = 展開する -activate= 動作させる -cycle = 切り替え +jump =移動 +press =押す +check =チェックを入れる +uncheck =チェックを外す +select =選択 +open =開く +close =閉じる +switch =切り替え +click =クリック +collapse=折りたたむ +expand =展開する +activate=動作させる +cycle =切り替え diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/global/css.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/global/css.properties index bae7e3b00d5a8f2b5de39ebe08983c197f7cf4af..2454991b6583d41f8afb230afd8c003fab839eea 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/global/css.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/global/css.properties @@ -188,5 +188,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList =repeat(auto-fill, ...) はサブグ PEMoreThanOneGridRepeatAutoFillFitInTrackList =repeat(auto-fill, ...) または repeat(auto-fit, ...) はトラックリスト内で一度しか許可されていません。 PEMoreThanOneGridRepeatTrackSize =トラックサイズの指定は repeat(auto-fit/auto-fill, ...) 内で一個しか許可されていません。 +PEDisallowedImportRule =後で構築されたスタイルシート内の @import 規則はまだ検証されていません。 + TooLargeDashedRadius =‘dashed’ スタイルの border radius が大きすぎます (最大 100000px まで)。実線で描画します。 TooLargeDottedRadius =‘dotted’ スタイルの border radius が大きすぎます (最大 100000px まで)。実線で描画します。 diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/global/dom/dom.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/global/dom/dom.properties index fd2e338beb116dfefbda84b56620ec9e06cc1c2f..a50335eac7dd1631a641edbd7e11d5df9fc1632d 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/global/dom/dom.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/global/dom/dom.properties @@ -10,7 +10,7 @@ KillScriptLocation =スクリプト: %S KillAddonScriptTitle =警告:: 応答のないアドオンスクリプト # LOCALIZATION NOTE (KillAddonScriptMessage): %1$S is the name of an extension. # %2$S is the name of the application (e.g., Firefox). -KillAddonScriptMessage =このページ上で実行中の拡張機能 “%1$S” のスクリプトが原因で %2$S からの応答がありません。\n\nスクリプトがビジー状態か応答を停止しているかのうせいがあります。スクリプトを今すぐ停止するか処理が完了するまで待機してください。 +KillAddonScriptMessage =このページ上で実行中の拡張機能 “%1$S” のスクリプトが原因で %2$S からの応答がありません。\n\nスクリプトがビジー状態か応答を停止している可能性があります。スクリプトを今すぐ停止するか処理が完了するまで待機してください。 KillAddonScriptGlobalMessage =次回再読み込みするまで、このページ上で拡張機能のスクリプトが実行されないようにする StopScriptButton =スクリプトを停止 @@ -427,6 +427,5 @@ MathML_DeprecatedStyleAttributeWarning =MathML 属性の “background”, “co MathML_DeprecatedXLinkAttributeWarning =XLink 属性の “href”, “type”, “show” および “actuate” は MathML 要素での使用が推奨されません。これらは将来のバージョンで削除されます。 WebShareAPI_Failed =共有操作が失敗しました。 WebShareAPI_Aborted =共有操作が中止されました。 - # LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL. -UnknownProtocolNavigationPrevented=Prevented navigation to “%1$S” due to an unknown protocol. +UnknownProtocolNavigationPrevented =プロトコルが不明なため “%1$S” への移動を中止しました。 diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/global/layout_errors.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/global/layout_errors.properties index 485bca2093b35ae43e6e84927624e2b23bc46557..db5433e5046fbb7039d835d6cab3596ee9d01d91 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/global/layout_errors.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/global/layout_errors.properties @@ -39,7 +39,6 @@ CompositorAnimationWarningTransformFrameInactive =フレームに ‘transform CompositorAnimationWarningTransformIsBlockedByImportantRules =transform 関連のプロパティが !important 規則により上書きされているため、このコンポジターでは transform アニメーションを実行できません。 CompositorAnimationWarningOpacityFrameInactive =フレームに ‘opacity’ アニメーションがアクティブであることを示すマークがないため、このコンポジターではアニメーションを実行できません。 CompositorAnimationWarningHasRenderingObserver =要素の描画が -moz-element または SVG clipping/masking により監視されているため、このコンポジターではアニメーションを実行できません。 - CompositorAnimationWarningHasCurrentColor =この ‘current-color’ キーフレームを持つコンポジターでは ‘background-color’ のアニメーションを実行できません。 ## LOCALIZATION NOTE: Do not translate zoom, calc(), "transform", "transform-origin: 0 0" @@ -55,4 +54,4 @@ PrincipalWritingModePropagationWarning =<html> 要素のレンダリング時に ## %3$S is a floating point value with the total adjusted distance ScrollAnchoringDisabledInContainer =スクロールアンカーは、連続調整 (%1$S) が多すぎ、移動距離の合計 (平均 %2$S px、合計 %3$S px) が小さすぎるため、スクロールコンテナー内で無効化されています。 -ForcedLayoutStart=Layout was forced before the page was fully loaded. If stylesheets are not yet loaded this may cause a flash of unstyled content. +ForcedLayoutStart =ページの読み込みが完了する前にレイアウトの開始が強制されました。スタイルシートがまだ読み込まれていない場合、スタイル付けされていないコンテンツがちらつく原因となる可能性があります。 diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/global/security/security.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/global/security/security.properties index 6806de93409db3fc5b179ca97da7e132cfd1e80c..ec518aef341ca3020c18544661c8b6a22d06fba8 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/global/security/security.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/global/security/security.properties @@ -149,8 +149,8 @@ XFOSameOrigin =X-Frame-Options による読み込み拒否: “%2$S” からの # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. -HTTPSOnlyUpgradeRequest = Upgrading insecure request “%1$S” to use “%2$S”. +HTTPSOnlyUpgradeRequest =安全でない要求 “%1$S” が “%2$S” を使用するようにアップグレードします。 # LOCALIZATION NOTE: %1$S is the URL of request. -HTTPSOnlyNoUpgradeException = Not upgrading insecure request “%1$S” because it is exempt. +HTTPSOnlyNoUpgradeException =安全でない要求 “%1$S” は除外されているたアップグレードされません。 # LOCALIZATION NOTE: %1$S is the URL of the failed request; %2$S is an error-code. -HTTPSOnlyFailedRequest = Upgrading insecure request “%1$S” failed. (%2$S) +HTTPSOnlyFailedRequest =安全でない要求 “%1$S” のアップグレードに失敗しました。(%2$S) diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/accountCreation.dtd b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/accountCreation.dtd index fa2e5201032bf55bc4465b45d19f027ab468b0a2..30c9c7b69f050a14458a4cae06ac0508aee41e33 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/accountCreation.dtd +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/accountCreation.dtd @@ -37,6 +37,7 @@ <!ENTITY imapLong.label "IMAP (リモートフォルダー)"> <!ENTITY pop3Long.label "POP3 (メールをコンピューターに保存)"> +<!ENTITY manualConfigTable.summary "サーバー設定"> <!ENTITY incoming.label "受信サーバー:"> <!ENTITY incomingColumn.label "受信サーバー"> <!ENTITY outgoing.label "送信サーバー:"> @@ -117,5 +118,3 @@ <!ENTITY insecureUnencrypted.description "あなたのメールと認証情報が暗号化されずに送信されるため、パスワード (およびメッセージの内容) が他の人々に簡単に読まれる危険性があります。このまま &brandShortName; でメールの送受信ができますが、メールプロバイダーに、安全な接続を行うサーバーを構成するように連絡してください。"> <!ENTITY insecureSelfSigned.description "サーバーが、自己署名された信頼できない証明書を使用しているため、&brandShortName; とサーバーの間の通信が盗聴されないことを保証できません。このまま &brandShortName; でメールの送受信ができますが、信頼できる証明書を使用しているメールプロバイダーを利用すべきです。"> <!ENTITY secureServer.description "設定が完了しました。このサーバーは安全な接続を行うサーバーです。"> - -<!ENTITY manualConfigTable.summary "Server settings"> diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/addons.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/addons.properties index 692a278d9c2757287590d54caef3974a77814e7e..626cfe315095d188d1000ada3aab6c57b56e986f 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/addons.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/addons.properties @@ -1,16 +1,45 @@ -xpinstallPromptMessage =このサイトからは %S にソフトウェアをインストールできない設定になっています。 -xpinstallPromptMessage.dontAllow =許可しない +# 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/. + +xpinstallPromptMessage =このサイトからは %S にソフトウェアをインストールできない設定になっています。 +# LOCALIZATION NOTE (xpinstallPromptMessage.header) +# The string contains the hostname of the site the add-on is being installed from. +xpinstallPromptMessage.header =%S にアドオンのインストールを許可しますか? +xpinstallPromptMessage.message =%S からアドオンをインストールしようとしています。続ける前に、これが信頼できるサイトかどうか確認してください。 +xpinstallPromptMessage.header.unknown =知らないサイトにアドオンのインストールを許可しますか? +xpinstallPromptMessage.message.unknown =知らないサイトからアドオンをインストールしようとしています。続ける前に、これが信頼できるサイトかどうか確認してください。 +xpinstallPromptMessage.learnMore =アドオンを安全にインストールするための情報 +xpinstallPromptMessage.dontAllow =許可しない xpinstallPromptMessage.dontAllow.accesskey=D -xpinstallPromptAllowButton =許可する +xpinstallPromptAllowButton =許可する +# Accessibility Note: +# Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button) +# See http://www.mozilla.org/access/keyboard/accesskey for details +xpinstallPromptAllowButton.accesskey =A +xpinstallPromptMessage.neverAllow =許可しない +xpinstallPromptMessage.neverAllow.accesskey =N +# Accessibility Note: +# Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button) +# See https://website-archive.mozilla.org/www.mozilla.org/access/access/keyboard/ for details +xpinstallPromptMessage.install =インストールを続ける +xpinstallPromptMessage.install.accesskey =C + # Accessibility Note: # Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button) # See http://www.mozilla.org/access/keyboard/accesskey for details -xpinstallPromptAllowButton.accesskey =A xpinstallDisabledMessageLocked =ソフトウェアのインストールはシステム管理者により無効化されています。 xpinstallDisabledMessage =ソフトウェアのインストールは現在無効になっています。[有効にする] をクリックしてからもう一度やり直してください。 xpinstallDisabledButton =有効にする xpinstallDisabledButton.accesskey =n +# LOCALIZATION NOTE (addonInstallBlockedByPolicy) +# This message is shown when the installation of an add-on is blocked by +# enterprise policy. %1$S is replaced by the name of the add-on. +# %2$S is replaced by the ID of add-on. %3$S is a custom message that +# the administration can add to the message. +addonInstallBlockedByPolicy =%1$S (%2$S) のインストールがシステム管理者によりブロックされました。%3$S + # LOCALIZATION NOTE (addonPostInstall.message1) # %1$S is replaced with the localized named of the extension that was # just installed. @@ -97,6 +126,8 @@ addonInstallErrorBlocklisted =セキュリティまたは安定性に問題が # Note, this string will be used as raw markup. Avoid characters like <, >, & webextPerms.header =%S を追加しますか? +# %S is brandShortName +webextPerms.experimentWarning =悪意のあるアドオンはユーザーの個人情報を盗んだりコンピューターを危険にさらすことがあります。提供元を信頼できない場合は、このアドオンをインストールしないでください。 webextPerms.unsignedWarning =注意: このアドオンは検証されていません。悪意のあるアドオンはユーザーの個人情報を盗んだりコンピューターを危険にさらすことがあります。提供元を信頼できない場合は、このアドオンをインストールしないでください。 # LOCALIZATION NOTE (webextPerms.listIntro) @@ -165,6 +196,9 @@ webextPerms.description.devtools =開いたタブのユーザーデータへア webextPerms.description.dns =IP アドレスとホスト名情報へのアクセス webextPerms.description.downloads =ファイルのダウンロードおよびブラウザーのダウンロード履歴の読み取りと変更 webextPerms.description.downloads.open =コンピューターにダウンロードしたファイルを開く +# LOCALIZATION NOTE (webextPerms.description.experiment) +# %S will be replaced with the name of the application +webextPerms.description.experiment =%S とコンピューターへの完全に無制限なアクセス webextPerms.description.find =すべての開いたタブのテキストの読み取り webextPerms.description.geolocation =ユーザーの位置情報へのアクセス webextPerms.description.history =ブラウジング履歴へのアクセス @@ -229,29 +263,3 @@ webext.remove.confirmation.title =%1$S を削除 # %2$S is brandShorterName webext.remove.confirmation.message =%2$S から %1$S を削除しますか? webext.remove.confirmation.button =削除 - -# LOCALIZATION NOTE (xpinstallPromptMessage.header) -# The string contains the hostname of the site the add-on is being installed from. -xpinstallPromptMessage.header=Allow %S to install an add-on? -xpinstallPromptMessage.message=You are attempting to install an add-on from %S. Make sure you trust this site before continuing. -xpinstallPromptMessage.header.unknown=Allow an unknown site to install an add-on? -xpinstallPromptMessage.message.unknown=You are attempting to install an add-on from an unknown site. Make sure you trust this site before continuing. -xpinstallPromptMessage.learnMore=Learn more about installing add-ons safely -xpinstallPromptMessage.neverAllow=Never Allow -xpinstallPromptMessage.neverAllow.accesskey=N -# Accessibility Note: -# Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button) -# See https://website-archive.mozilla.org/www.mozilla.org/access/access/keyboard/ for details -xpinstallPromptMessage.install=Continue to Installation -xpinstallPromptMessage.install.accesskey=C -# LOCALIZATION NOTE (addonInstallBlockedByPolicy) -# This message is shown when the installation of an add-on is blocked by -# enterprise policy. %1$S is replaced by the name of the add-on. -# %2$S is replaced by the ID of add-on. %3$S is a custom message that -# the administration can add to the message. -addonInstallBlockedByPolicy=%1$S (%2$S) is blocked by your system administrator.%3$S -# %S is brandShortName -webextPerms.experimentWarning=Malicious add-ons can steal your private information or compromise your computer. Only install this add-on if you trust the source. -# LOCALIZATION NOTE (webextPerms.description.experiment) -# %S will be replaced with the name of the application -webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-e2e.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-e2e.properties index 9d42cb9257683ae1cba68a98c753002d63e30bd5..62ed41f15b38c347df82f2f20ad0cea54feeae40 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-e2e.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-e2e.properties @@ -2,4 +2,4 @@ # 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/. -prefPanel-e2e=End-To-End Encryption +prefPanel-e2e =エンドツーエンド暗号化 diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-smime.dtd b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-smime.dtd index 135917ad4c8e960f53a2fac18c63412ffb3ce1e1..1cd7227f4505ec919ea12ff49c0a2f45959407b4 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-smime.dtd +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-smime.dtd @@ -2,16 +2,31 @@ - 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/. --> -<!ENTITY securityTitle.label "セキュリティ"> -<!ENTITY securityTab.label "セキュリティ"> -<!ENTITY securityHeading.label "署名や暗号化されたメッセージを送受信するには、デジタル署名証明書と暗号化証明書の両方を指定する必要があります。"> -<!ENTITY encryptionGroupTitle.label "暗号化"> -<!ENTITY encryptionChoiceLabel.label "メッセージ送信時に使用する既定の暗号化設定:"> -<!ENTITY neverEncrypt.label "暗号化しない"> -<!ENTITY neverEncrypt.accesskey "N"> -<!ENTITY alwaysEncryptMessage.label "暗号化する (すべての受信者が証明書を持っていなければ送信できません)"> -<!ENTITY alwaysEncryptMessage.accesskey "u"> -<!ENTITY encryptionCert.message "あなたへのメッセージの暗号化と復号に使用する証明書:"> +<!ENTITY securityTitle.label "セキュリティ"> +<!ENTITY securityTab.label "セキュリティ"> +<!ENTITY securityHeading.label "署名や暗号化されたメッセージを送受信するには、デジタル署名証明書と暗号化証明書の両方を指定する必要があります。"> +<!ENTITY encryptionGroupTitle.label "暗号化"> +<!ENTITY encryptionChoiceLabel.label "メッセージ送信時に使用する既定の暗号化設定:"> +<!ENTITY neverEncrypt.label "暗号化しない"> +<!ENTITY neverEncrypt.accesskey "N"> +<!ENTITY alwaysEncryptMessage.label "暗号化する (すべての受信者が証明書を持っていなければ送信できません)"> +<!ENTITY alwaysEncryptMessage.accesskey "u"> +<!ENTITY encryptionCert.message "あなたへのメッセージの暗号化と復号に使用する証明書:"> +<!ENTITY e2eTitle.label "エンドツーエンド暗号化"> +<!ENTITY e2eIntro.description "暗号化またはデジタル署名されたメッセージを送信するには、OpenPGP または S/MIME のどちらかの暗号技術を設定する必要があります。"> +<!ENTITY e2eLearnMore.label "詳細情報"> + +<!ENTITY e2eEnc.description "エンドツーエンド暗号化をしないメッセージのコンテンツは、ご利用のメールプロバイダーや監視システムに容易にさらされます。"> +<!ENTITY e2eeReqWarning.description "送信メッセージを暗号化する必要がある場合は、あなたの公開鍵またはすべての受信者の証明書を用意しなければなりません。"> + +<!ENTITY e2eSigning.description "デジタル署名により、メッセージの送信者があなたであり、コンテンツが改変されていないことを受信者が検証できます。"> +<!ENTITY e2eTechPref.description "優先される暗号化技術:"> + +<!ENTITY doNotEncrypt.label "既定で暗号化を有効にしない"> +<!ENTITY doNotEncrypt.accesskey "N"> +<!ENTITY requireEncryptMessage.label "既定で暗号化を必須にする"> +<!ENTITY requireEncryptMessage.accesskey "u"> +<!ENTITY encryptionCert2.message "暗号化のための個人証明書:"> <!ENTITY digitalSign.certificate.button "選択..."> <!ENTITY digitalSign.certificate.accesskey "S"> <!ENTITY digitalSign.certificate_clear.button "消去"> @@ -22,46 +37,40 @@ <!ENTITY encryption.certificate_clear.accesskey "e"> <!ENTITY signingGroupTitle.label "デジタル署名"> <!ENTITY signMessage.label "メッセージにデジタル署名する (既定の動作)"> +<!ENTITY signMessage2.label "既定でデジタル署名を追加する"> <!ENTITY signMessage.accesskey "D"> -<!ENTITY signingCert.message "メッセージのデジタル署名に使用する証明書:"> +<!ENTITY signingCert.message "送信メッセージのデジタル署名に使用する証明書:"> + +<!ENTITY certificates.label "証明書"> +<!ENTITY manageCerts2.label "証明書を管理"> +<!ENTITY manageCerts2.accesskey "M"> +<!ENTITY manageDevices.label "セキュリティデバイス"> +<!ENTITY manageDevices.accesskey "y"> + +<!ENTITY signingCert2.message "デジタル署名のための個人証明書:"> + +<!ENTITY sendingDefaults.label "メッセージ送信の既定の設定"> + +<!ENTITY technologyAutomatic.label "利用可能な鍵または証明書をもとに自動的に選択する"> + +<!ENTITY certificates2.label "S/MIME"> +<!ENTITY manageCerts3.label "S/MIME 証明書の管理"> +<!ENTITY manageCerts3.accesskey "M"> +<!ENTITY manageDevices2.label "S/MIME セキュリティデバイス"> +<!ENTITY manageDevices2.accesskey "y"> + +<!ENTITY technologySMIME.label "S/MIME を優先する"> +<!ENTITY technologyOpenPGP.label "OpenPGP を優先する"> -<!ENTITY certificates.label "証明書"> -<!ENTITY manageCerts2.label "証明書を管理"> -<!ENTITY manageCerts2.accesskey "M"> -<!ENTITY manageDevices.label "セキュリティデバイス"> -<!ENTITY manageDevices.accesskey "y"> +<!ENTITY openpgpKeys.label "OpenPGP"> +<!ENTITY manageKeys.label "OpenPGP 鍵の管理"> +<!ENTITY manageKeys.accesskey "K"> <!-- Strings for the cert picker dialog --> -<!ENTITY certPicker.title "証明書の選択"> -<!ENTITY certPicker.info "証明書:"> -<!ENTITY certPicker.detailsLabel "選択した証明書の詳細:"> +<!ENTITY certPicker.title "証明書の選択"> +<!ENTITY certPicker.info "証明書:"> +<!ENTITY certPicker.detailsLabel "選択した証明書の詳細:"> -<!ENTITY e2eTitle.label "End-To-End Encryption"> -<!ENTITY e2eIntro.description "To send encrypted or digitally signed messages, you need to configure an encryption technology, either OpenPGP or S/MIME."> -<!ENTITY e2eLearnMore.label "Learn more"> -<!ENTITY e2eEnc.description "Without end-to-end encryption the contents of messages are easily exposed to your email provider and to mass surveillance."> -<!ENTITY e2eeReqWarning.description "If you require encryption, to send a message you must have the public key or certificate of every recipient."> -<!ENTITY e2eSigning.description "A digital signature allows recipients to verify the message was sent by you, and that the content has not been changed."> -<!ENTITY e2eTechPref.description "Preferred encryption technology:"> -<!ENTITY doNotEncrypt.label "Do not enable encryption by default"> -<!ENTITY doNotEncrypt.accesskey "N"> -<!ENTITY requireEncryptMessage.label "Require encryption by default"> -<!ENTITY requireEncryptMessage.accesskey "u"> -<!ENTITY encryptionCert2.message "Personal certificate for encryption:"> -<!ENTITY signMessage2.label "Add my digital signature by default"> -<!ENTITY signingCert2.message "Personal certificate for digital signing:"> -<!ENTITY sendingDefaults.label "Default settings for sending messages"> -<!ENTITY technologyAutomatic.label "Select automatically based on available keys or certificates"> -<!ENTITY certificates2.label "S/MIME"> -<!ENTITY manageCerts3.label "Manage S/MIME Certificates"> -<!ENTITY manageCerts3.accesskey "M"> -<!ENTITY manageDevices2.label "S/MIME Security Devices"> -<!ENTITY manageDevices2.accesskey "y"> -<!ENTITY technologySMIME.label "Prefer S/MIME"> -<!ENTITY technologyOpenPGP.label "Prefer OpenPGP"> -<!ENTITY openpgpKeys.label "OpenPGP"> -<!ENTITY manageKeys.label "Manage OpenPGP Keys"> -<!ENTITY manageKeys.accesskey "K"> -<!ENTITY openpgpKey.message "Personal key for encryption and digital signing:"> -<!ENTITY openpgpKey.button "Set Personal Key…"> -<!ENTITY openpgpKey.accesskey "o"> +<!ENTITY openpgpKey.message "暗号化およびデジタル署名のための秘密鍵:"> +<!ENTITY openpgpKey.button "秘密鍵を設定..."> +<!ENTITY openpgpKey.accesskey "o"> diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-smime.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-smime.properties index 4bef385195bedc3c48d4b67f17343e61a61101e9..0e9cc99d0a33ddfe7754016d8f4e9e3da75f90cf 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-smime.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-smime.properties @@ -12,6 +12,8 @@ ErrorCanNotSignMail =メッセージに署名できません。アカウント ## Strings used for in the prefs. prefPanel-smime =セキュリティ + +## Strings used for in the prefs. NoSigningCert =証明書マネージャーはメッセージをデジタル署名する際に使用する有効な証明書を見つけられませんでした。 NoSigningCertForThisAddress =証明書マネージャーは <%S> のアドレスでメッセージをデジタル署名する際に使用する有効な証明書を見つけられませんでした。 NoEncryptionCert =証明書マネージャーは他の人があなたに暗号化したメールを送信する際に使用する有効な証明書を見つけられませんでした。 diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/customizeToolbar.dtd b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/customizeToolbar.dtd index 4e32d0f2eebc0c0938e4a96a110f3431ed8b317b..65c6d5ce0d476a3c5f4ff9829b8025988994156d 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/customizeToolbar.dtd +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/customizeToolbar.dtd @@ -15,8 +15,7 @@ <!ENTITY addNewToolbar.label "ツールバーを追加"> <!ENTITY showTitlebar.label "タイトルバーを表示"> <!ENTITY extraDragSpace.label "ドラッグスペースを追加"> +<!ENTITY showTitlebar2.label "タイトルバー"> +<!ENTITY extraDragSpace2.label "ドラッグスペース"> <!ENTITY saveChanges.label "完了"> <!ENTITY undoChanges.label "元に戻す"> - -<!ENTITY showTitlebar2.label "Title Bar"> -<!ENTITY extraDragSpace2.label "Drag Space"> diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/imapMsgs.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/imapMsgs.properties index ca8682414e0b254e25e47f9c2d67ff1b4bc6f1a2..624a9d909a5a5bcf8ba458ff7c4a8497a3c79732 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/imapMsgs.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/imapMsgs.properties @@ -194,16 +194,28 @@ imapAclExpungeRight =整理 (Expunge) imapServerDisconnected =サーバー %S との接続が切断されました。サーバーがダウンしたか、ネットワークに問題があるかもしれません。 +# LOCALIZATION NOTE (autoSubscribeText): %1$S is the imap folder. imapSubscribePrompt =%1$S を購読しますか? imapServerDroppedConnection =IMAP サーバーへ接続できませんでした。このサーバーへの同時接続数の限度を超えている可能性があります。その場合は [アカウント設定] の [サーバー設定] の [詳細] でサーバーへの最大同時接続数を減らしてください。 +# This will occur when a folder that has never been imap selected or opened +# (left-clicked) is first right-clicked to access quota properties. imapQuotaStatusFolderNotOpen =フォルダーが開かれていないため、クォータ情報は利用できません。 +# The imap capability response reports that QUOTA is not supported. imapQuotaStatusNotSupported =このサーバーはクォータをサポートしていません。 imapQuotaStatusNoQuota =このフォルダーにはクォータが割り当てられていません。 +# The getqutaroot command succeeded but reported no quota information. +imapQuotaStatusNoQuota2 =このフォルダーにはクォータ情報がありません。 + +# Folder properties were requested by the user (right-click) before the getquotaroot +# command was sent. +imapQuotaStatusInProgress =クォータ情報はまだ利用できません + +# Out of memory imapOutOfMemory =メモリーが不足しています。 # LOCALIZATION NOTE (imapCopyingMessageOf2): Do not translate the word "%S" below. @@ -254,9 +266,3 @@ imapFolderCommandFailed ='%2$S' に対する現在の操作を正常に完了 # Place the word %1$S in your translation where the name of the account should appear. # Place the word %2$S in your translation where the alert from the server should appear. imapServerAlert =%1$S アカウントからの警告: %2$S - -# The getqutaroot command succeeded but reported no quota information. -imapQuotaStatusNoQuota2=This folder reports no quota information. -# Folder properties were requested by the user (right-click) before the getquotaroot -# command was sent. -imapQuotaStatusInProgress=Quota information not yet available. diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messenger.dtd b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messenger.dtd index 32f739f85669203dc73daa706171e5265e3ac2cc..e5ee74b801ca541274e9b95cb18e01ae5441b1e2 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messenger.dtd +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messenger.dtd @@ -292,6 +292,8 @@ <!ENTITY searchMailCmd.label "メッセージを検索..."> <!ENTITY searchMailCmd.accesskey "M"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "グローバル検索..."> +<!ENTITY glodaSearchCmd.accesskey "G"> <!ENTITY searchAddressesCmd.label "アドレスを検索..."> <!ENTITY searchAddressesCmd.accesskey "S"> diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messenger.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messenger.properties index fc3bb9dc255b7892157e9840c755d0706cfe4226..3cf450580fb873df4caccfc3831e0d24cd7e038a 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messenger.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messenger.properties @@ -316,7 +316,8 @@ mailnews.search_date_leading_zeros =true nocachedbodybody2 =このメッセージの本文はオフライン作業用にサーバーからダウンロードされていません。メッセージを読むには、[ファイル] メニューを開いて [オフライン] を選択し、[オフライン作業] のチェックを外してネットワークに接続してください。オフラインで使用するフォルダーとメッセージは [ツール] メニューから [アカウント設定] を開き、[同期とディスク領域] で設定できます。 # accountCentral -mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xhtml +mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xul + # LOCALIZATION NOTE(acctCentralTitleFormat): %1$S is brand, %2$S is account type, %3$S is account name acctCentralTitleFormat =%1$S %2$S - %3$S mailAcctType =Mail @@ -465,11 +466,15 @@ macBiffNotification_separator =,\u0020 # For the Quota tab in the mail folder properties dialog quotaUsedFree =%S / %S KB 使用 + +# For the Quota tab in the mail folder properties dialog quotaPercentUsed =%S%% 使用 # for quota in main window (commandglue.js) percent =%S%% quotaTooltip =IMAP クォータ: ディスク領域の割り当て %2$S KB 中の %1$S KB 使用しています。クリックすると詳細を表示します。 +quotaTooltip2 =IMAP クォータ: ディスク領域の割り当て %2$S 中の %1$S 使用しています。クリックすると詳細を表示します。 + # for message views confirmViewDeleteTitle =確認 confirmViewDeleteMessage =本当にこの絞り込み条件を削除しますか? @@ -812,5 +817,3 @@ errorConsoleTitle =エラーコンソール # This is used by screen readers to label the "back" button in various browser # popup panels, including the sliding subviews of the appmenu. panel.back =戻る - -quotaTooltip2=IMAP quota: %S used of %S total. Click for details. diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messengercompose/messengercompose.dtd b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messengercompose/messengercompose.dtd index 750f6b3ec6bb4aa25ba0aae34028f604e1ceef27..0ff73515f6d30b4f65b137d5c3872317afaa4849 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messengercompose/messengercompose.dtd +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messengercompose/messengercompose.dtd @@ -90,15 +90,8 @@ <!ENTITY reorderAttachmentsCmd.accesskey "s"> <!ENTITY reorderAttachmentsCmd.key "x"> <!ENTITY toggleAttachmentPaneCmd.label "添付ペイン"> -<!-- LOCALIZATION NOTE (toggleAttachmentPaneCmd.accesskey): - For better mnemonics, toggleAttachmentPaneCmd.accesskey should be the same - as attachments.accesskey. --> <!ENTITY toggleAttachmentPaneCmd.accesskey "m"> -<!-- LOCALIZATION NOTE (toggleAttachmentPaneCmd.key): - As Mac does not have access keys, this key defines a Mac-only, cross-l10n - shortcut key (Ctrl+M). Typically, this key should not be translated unless - otherwise required by specific needs of the localization. --> -<!ENTITY toggleAttachmentPaneCmd.key "m"> +<!ENTITY toggleAttachmentPaneCmd.key "M"> <!ENTITY selectAllCmd.label "すべて選択"> <!ENTITY selectAllCmd.accesskey "a"> <!ENTITY selectAllCmd.key "A"> diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/pgpmime.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/pgpmime.properties index 06b3405bbce1561115859624e1a99aec5d4870ce..b2c6f4b3ec543b8a3cc9647250d8b7535847a323 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/pgpmime.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/pgpmime.properties @@ -8,5 +8,8 @@ # LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. # %S is the url to Enigmail on AMO supplied from preferences. -pgpMimeNeedsAddon =これは暗号化された OpenPGP メッセージです。<br>このメールを復号するには <a href="%S">OpenPGP アドオン</a> をインストールする必要があります。 ## (^m^) リンク先設定 mail.pgpmime.addon_url +pgpMimeNeedsAddon =これは暗号化された OpenPGP メッセージです。<br>このメールを復号するには <a href="%S">OpenPGP アドオン</a> をインストールする必要があります。 + +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable =これは暗号化された OpenPGP メッセージですが、OpenPGP の復号サポートが利用できません。 diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/preferences/general.dtd b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/preferences/general.dtd index 1a839c7a25ead96f0b08001e04a66f7bfa05420a..4182e31f57394ee55aa05d5be888ea9156fd218c 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/preferences/general.dtd +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/preferences/general.dtd @@ -43,5 +43,5 @@ <!ENTITY removeSearchEngine.label "削除"> <!ENTITY removeSearchEngine.accesskey "v"> -<!ENTITY minimizeToTray.label "When &brandShortName; is minimized, move it to the tray"> -<!ENTITY minimizeToTray.accesskey "m"> +<!ENTITY minimizeToTray.label "最小化した &brandShortName; をタスクトレイにしまう"> +<!ENTITY minimizeToTray.accesskey "m"> diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/necko/necko.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/necko/necko.properties index 415d5194b30011ff58cdc6223a628fcc6fe6a9ab..221f307c0c06765cd8f5faffc9a93e0471d0e99a 100644 --- a/thunderbird-l10n/ja/chrome/ja/locale/ja/necko/necko.properties +++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/necko/necko.properties @@ -68,8 +68,7 @@ CookieLaxForced =Cookie “%1$S” は “sameSite” 属性が足りない CookieLaxForcedForBeta =Cookie “%1$S” に正しい “sameSite” 属性の値が設定されていません。“sameSite” 属性を持たない Cookie またはその属性値が不正なものの値は “lax” として扱われます。これは、Cookie が第三者のコンテキストに送信されないことを意味します。あなたのアプリケーションがこのようなコンテキストで利用可能になっている Cookie に依存する場合は、“sameSite=none” 属性を追加してください。“sameSite” 属性についての詳細は %2$S をお読みください。 # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none" CookieSameSiteValueInvalid =Cookie “%1$S” の “sameSite” の値が不正です。サポートされた値は “lax”, “strict”, “none” です。 - # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookieOversize=Cookie “%1$S” is invalid because its size is too big. Max size is %2$S B. +CookieOversize =Cookie “%1$S” のサイズが大きすぎるため正しく読み込めません。最大サイズは %2$S バイトです。 # LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B. +CookiePathOversize =Cookie “%1$S” のパスが長すぎるため正しく読み込めません。最大サイズは %2$S バイトです。 diff --git a/thunderbird-l10n/ja/localization/ja/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/ja/localization/ja/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..f3250ea8c38b61be21c09876b7ba7a273a1ef4a6 --- /dev/null +++ b/thunderbird-l10n/ja/localization/ja/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,14 @@ +# 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/. + +calendar-uri-redirect-window = + .title = カレンダー URI のリダイレクト + +calendar-uri-redirect-description = + サーバーが "{ $calendarName }" のカレンダーの URI をリダイレクトしています。 + このカレンダーのリダイレクトを受け入れて新しい URI を使用しますか? + +calendar-uri-redirect-original-uri-label = 現在の URI: + +calendar-uri-redirect-target-uri-label = リダイレクト先の新しい URI: diff --git a/thunderbird-l10n/ja/localization/ja/calendar/calendar-widgets.ftl b/thunderbird-l10n/ja/localization/ja/calendar/calendar-widgets.ftl new file mode 100644 index 0000000000000000000000000000000000000000..3e1f3fe9fceaf52a6da10ba293c542b13e7bb101 --- /dev/null +++ b/thunderbird-l10n/ja/localization/ja/calendar/calendar-widgets.ftl @@ -0,0 +1,6 @@ +# 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/. + +calendar-deactivated-notification-events = 現在すべてのカレンダーが無効化されています。既存のカレンダーを有効にするか、新しいカレンダーを追加して予定を編集してください。 +calendar-deactivated-notification-tasks = 現在すべてのカレンダーが無効化されています。既存のカレンダーを有効にするか、新しいカレンダーを追加して ToDo を編集してください。 diff --git a/thunderbird-l10n/ja/localization/ja/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/ja/localization/ja/devtools/client/aboutdebugging.ftl index e27be3d5faa7f468b20a1977987a8de6c5452b77..5c6fd9d672e35f5f7ba4cf6548d5005c4afe4a3c 100644 --- a/thunderbird-l10n/ja/localization/ja/devtools/client/aboutdebugging.ftl +++ b/thunderbird-l10n/ja/localization/ja/devtools/client/aboutdebugging.ftl @@ -231,6 +231,10 @@ about-debugging-browser-version-too-old = 接続したブラウザーのバー # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1") about-debugging-browser-version-too-old-67-debugger = 接続したブラウザーではデバッガーパネルが動作しないようです。このブラウザーでデバッガーを利用したい場合は、Firefox { $runtimeVersion } を使用してください。 +# Dedicated message for a backward compatibility issue that occurs when connecting: +# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68. +about-debugging-browser-version-too-old-fennec = このバージョンの Firefox は Android 版 Firefox (68) をデバッグできません。携帯電話でのテストには Android 版 Firefox Nightly のインストールをお勧めします。<a>詳細</a> + # This string is displayed in the runtime page if the remote browser version is too recent. # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd) diff --git a/thunderbird-l10n/ja/localization/ja/messenger/accountCentral.ftl b/thunderbird-l10n/ja/localization/ja/messenger/accountCentral.ftl new file mode 100644 index 0000000000000000000000000000000000000000..add8754530145a3ebcc0c75b584315c3ff0179bc --- /dev/null +++ b/thunderbird-l10n/ja/localization/ja/messenger/accountCentral.ftl @@ -0,0 +1,69 @@ +# 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/. + +account-central-title = Welcome to { -brand-full-name } +account-settings = アカウント設定 + +# $accounts (Number) - the number of configured accounts +setup-title = { $accounts -> + [0] セットアップするアカウントを選んでください + *[other] 別のアカウントをセットアップ +} +about-title = { -brand-full-name } について +resources-title = 製品情報 + +release-notes = + .title = { -brand-full-name } について + +email-label = メール + .aria-label = 既存のメールアカウントに接続します +email-description = { -brand-short-name } に既存のメールアカウントを設定します。このアプリケーションからあなたのメールを利便性が高く効果的な方法で読むことができます。 + +calendar-label = カレンダー + .aria-label = 新しいカレンダーを作成します +calendar-description = { -brand-short-name } であなたの予定を整理できます。リモートのカレンダーに接続することにより、あなたの予定をお持ちのすべての端末と同期します。 + +chat-label = チャット + .aria-label = チャットアカウントに接続します +chat-description = { -brand-short-name } で複数のインスタントメッセージアカウントに接続し、様々なプラットフォームのサポートを提供します。 + +filelink-label = Filelink + .aria-label = Filelink をセットアップします +filelink-description = { -brand-short-name } に便利な Filelink クラウドアカウントをセットアップすると、サイズの大きな添付ファイルを簡単に送信できます。 + +addressbook-label = アドレス帳 + .aria-label = 新しいアドレス帳を作成します +addressbook-description = { -brand-short-name } でアドレス帳のすべての連絡先を整理できます。リモートのアドレス帳に接続して連絡先を同期することもできます。 + +feeds-label = フィード + .aria-label = フィードに接続します +feeds-description = { -brand-short-name } を RSS/Atom フィードに接続して、世の中のニュースや更新情報を受け取れます。 + +newsgroups-label = ニュースグループ + .aria-label = ニュースグループに接続します +newsgroups-description = { -brand-short-name } をお好みのすべてのニュースグループに接続できます。 + +import-title = 別のプログラムからインポート +import-paragraph = { -brand-short-name } に他のメールプログラムからメールメッセージやフィード購読、環境設定、メッセージフィルターを、一般的なアドレス帳形式からアドレス帳をインポートすることができます。 + +import-label = データをインポート + .aria-label = 他のプログラムからデータをインポートします + +about-paragraph = Thunderbird は、オープンソースでクロスプラットフォームを特徴とし、ビジネスでも個人でも無料で利用できる人気のメール・カレンダークライアントです。私たちはそのセキュリティを守りつつ、さらに改善していきたいと考えています。皆さんからの寄付によって、開発者の雇用、インフラストラクチャの購入、改良の継続が可能となります。 + +about-paragraph-2 = <b>Thunderbird はあなたのようなユーザーに支えられています! Thunderbird を気に入っていただけた方は寄付をご検討ください。</b> Thunderbird を存続可能にするため、あなたができる最善の方法は +about-donation = 寄付をしていただくことです。 + +explore-link = 機能紹介 +support-link = サポート +involved-link = 参加協力 +developer-link = 開発者ドキュメント + +read = メッセージを読む +compose = メッセージを作成 +search = メッセージを検索 +filter = メッセージフィルターを管理 +nntp-subscription = ニュースグループ購読を管理 +rss-subscription = フィード購読を管理 +e2e = エンドツーエンド暗号化 diff --git a/thunderbird-l10n/ja/localization/ja/messenger/policies/policies-descriptions.ftl b/thunderbird-l10n/ja/localization/ja/messenger/policies/policies-descriptions.ftl index 929be65ac3cf1acac54753411e36e028765b0d90..74bbd202ba16586aa663bbd36e84efe56a782704 100644 --- a/thunderbird-l10n/ja/localization/ja/messenger/policies/policies-descriptions.ftl +++ b/thunderbird-l10n/ja/localization/ja/messenger/policies/policies-descriptions.ftl @@ -31,6 +31,8 @@ policy-CertificatesDescription = 証明書を追加、または組み込みの policy-Cookies = Cookie の保存をウェブサイトに許可または拒否します。 +policy-DisabledCiphers = 暗号を無効にします。 + policy-DefaultDownloadDirectory = 既定のダウンロードディレクトリーを設定します。 policy-DisableAppUpdate = { -brand-short-name } の更新を禁止します。 diff --git a/thunderbird-l10n/ja/localization/ja/messenger/preferences/passwordManager.ftl b/thunderbird-l10n/ja/localization/ja/messenger/preferences/passwordManager.ftl index bf81e59e832b2feb2e54bb31f1016757b847076f..a3c211a6e257521663b969353c1e625101090fff 100644 --- a/thunderbird-l10n/ja/localization/ja/messenger/preferences/passwordManager.ftl +++ b/thunderbird-l10n/ja/localization/ja/messenger/preferences/passwordManager.ftl @@ -69,3 +69,17 @@ remove-all-shown = remove-all-passwords-prompt = 本当にすべてのパスワードを消去しますか? remove-all-passwords-title = すべてのパスワードを消去 no-master-password-prompt = パスワードを表示しますか? + +## OS Authentication dialog + +# This message can be seen by trying to show or copy the passwords. +password-os-auth-dialog-message = 保存されたパスワードを開示するため、あなたのアカウントを検証します。 + +# This message can be seen by trying to show or copy the passwords. +# The macOS strings are preceded by the operating system with "Thunderbird is trying to " +# and includes subtitle of "Enter password for the user "xxx" to allow this." These +# notes are only valid for English. Please test in your locale. +password-os-auth-dialog-message-macosx = 保存されたパスワードを開示 + +# Don't change this label. +password-os-auth-dialog-caption = { -brand-full-name } diff --git a/thunderbird-l10n/ja/localization/ja/messenger/preferences/preferences.ftl b/thunderbird-l10n/ja/localization/ja/messenger/preferences/preferences.ftl index 29b392bea7f796af62a4d7f303d0c806d5bd032f..a366c99c630b645b086cdd0724e787ae28c360f4 100644 --- a/thunderbird-l10n/ja/localization/ja/messenger/preferences/preferences.ftl +++ b/thunderbird-l10n/ja/localization/ja/messenger/preferences/preferences.ftl @@ -88,3 +88,17 @@ update-in-progress-ok-button = 破棄(&D) # Continue is the cancel button so pressing escape or using a platform standard # method of closing the UI will not discard the update. update-in-progress-cancel-button = 続行(&C) + +## OS Authentication dialog + +# This message can be seen by trying to add a Master Password. +master-password-os-auth-dialog-message = マスターパスワードを作成するため、あなたのアカウントを検証します。 + +# This message can be seen by trying to add a Master Password. +# The macOS strings are preceded by the operating system with "Thunderbird is trying to " +# and includes subtitle of "Enter password for the user "xxx" to allow this." These +# notes are only valid for English. Please test in your locale. +master-password-os-auth-dialog-message-macosx = マスターパスワードを作成 + +# Don't change this label. +master-password-os-auth-dialog-caption = { -brand-full-name } diff --git a/thunderbird-l10n/ja/localization/ja/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ja/localization/ja/toolkit/about/aboutAddons.ftl index 84e2fc9db2ea9f7ea04214b150d52d675a44a916..2ec5a638a04a54793693f420c30405eb6fae03ad 100644 --- a/thunderbird-l10n/ja/localization/ja/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/ja/localization/ja/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = ファイルからアドオンをインストール... .accesskey = I help-button = アドオンのサポート +sidebar-help-button-title = + .title = アドオンのサポート preferences = { PLATFORM() -> [windows] { -brand-short-name } オプション @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = アドオンツール +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } オプション + *[other] { -brand-short-name } 設定 + } show-unsigned-extensions-button = .label = 一部の拡張機能を検証できませんでした show-all-extensions-button = @@ -168,13 +176,29 @@ extensions-view-available-updates = .name = 更新可能 .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = おすすめ +addon-category-discover-title = + .title = おすすめ addon-category-extension = 拡張機能 +addon-category-extension-title = + .title = 拡張機能 addon-category-theme = テーマ +addon-category-theme-title = + .title = テーマ addon-category-plugin = プラグイン +addon-category-plugin-title = + .title = プラグイン addon-category-dictionary = 辞書 +addon-category-dictionary-title = + .title = 辞書 addon-category-locale = 言語パック +addon-category-locale-title = + .title = 言語パック addon-category-available-updates = 更新可能 +addon-category-available-updates-title = + .title = 更新可能 addon-category-recent-updates = 最近の更新 +addon-category-recent-updates-title = + .title = 最近の更新 ## These are global warnings @@ -287,6 +311,7 @@ shortcuts-no-commands = 次の拡張機能にはショートカットがあり shortcuts-input = .placeholder = ショートカットキーを入力してください shortcuts-browserAction = 拡張機能を有効化 +shortcuts-browserAction2 = ツールバーボタンを有効化 shortcuts-pageAction = ページ操作を有効化 shortcuts-sidebarAction = サイドバーの表示を切り替え shortcuts-modifier-mac = Ctrl, Alt または ⌘ を含む @@ -311,6 +336,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = 折りたたむ go-back-button = .tooltiptext = 前のページへ戻ります +header-back-button = + .title = 前のページへ戻ります ## Recommended add-ons page diff --git a/thunderbird-l10n/ja/localization/ja/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/ja/localization/ja/toolkit/about/aboutSupport.ftl index 02e5e741f666cc3de8c0569767925c5907156f76..f8fef75cee73099cb7f3e65d4b668094837b4fcc 100644 --- a/thunderbird-l10n/ja/localization/ja/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/ja/localization/ja/toolkit/about/aboutSupport.ftl @@ -4,6 +4,7 @@ page-title = トラブルシューティング情報 page-subtitle = このページには問題発生時に役立てられる技術情報が表示されます。{ -brand-short-name } に関する一般的な質問については <a data-l10n-name="support-link">サポートサイト</a> をご覧ください。 + crashes-title = クラッシュレポート crashes-id = レポート ID crashes-send-date = 送信日時 @@ -120,6 +121,7 @@ audio-backend = 音声バックエンド max-audio-channels = 最大チャンネル数 channel-layout = 優先チャンネルレイアウト sample-rate = 優先サンプルレート + media-title = メディア media-output-devices-title = 出力デバイス media-input-devices-title = 入力デバイス @@ -135,7 +137,6 @@ media-device-latency = 遅延 media-capabilities-title = メディア性能 # List all the entries of the database. media-capabilities-enumerate = データベースを列挙 - ## intl-title = 国際化とローカライズ @@ -181,7 +182,6 @@ raw-data-copied = 生データをクリップボードにコピーしました text-copied = テキストをクリップボードにコピーしました ## The verb "blocked" here refers to a graphics feature such as "Direct2D" or "OpenGL layers". - blocked-driver = グラフィックドライバーのバージョンが対応していないため描画支援がブロックされました。 blocked-gfx-card = グラフィックカードのドライバーの未解決の問題により描画支援がブロックされました。 blocked-os-version = オペレーティングシステムのバージョンが対応していないため描画支援がブロックされました。 @@ -189,9 +189,11 @@ blocked-mismatched-version = グラフィックドライバーのバージョン # Variables # $driverVersion - The graphics driver version string try-newer-driver = グラフィックドライバーのバージョンが対応していないため描画支援がブロックされました。グラフィックドライバーをバージョン { $driverVersion } 以降に更新してみてください。 + # "ClearType" is a proper noun and should not be translated. Feel free to leave English strings if # there are no good translations, these are only used in about:support clear-type-parameters = ClearType パラメーター + compositing = 画像処理 hardware-h264 = ハードウェア H264 デコード main-thread-no-omtc = メインスレッド、OMTC なし @@ -203,9 +205,9 @@ virtual-monitor-disp = 仮想デスクトップ ## The following strings indicate if an API key has been found. ## In some development versions, it's expected for some API keys that they are ## not found. - found = あり missing = なし + gpu-process-pid = GPUProcessPid gpu-process = GPUProcess gpu-description = 型番 @@ -229,12 +231,15 @@ webgl2-version = WebGL 2 ドライバーのバージョン webgl2-driver-extensions = WebGL 2 ドライバーの拡張 webgl2-extensions = WebGL 2 拡張 blocklisted-bug = 既知の問題によりブロックリストに掲載されています + # Variables # $bugNumber (string) - String of bug number from Bugzilla bug-link = Bug { $bugNumber } + # Variables # $failureCode (string) - String that can be searched in the source tree. unknown-failure = ブロックリストに掲載。失敗コード { $failureCode } + d3d11layers-crash-guard = D3D11 コンポジター d3d11video-crash-guard = D3D11 動画デコーダー d3d9video-crash-buard = D3D9 動画デコーダー @@ -252,8 +257,10 @@ content-uses-tiling = タイリングの使用 (コンテンツ) off-main-thread-paint-enabled = メインスレッド外ペイント有効 off-main-thread-paint-worker-count = メインスレッド外ペイントワーカー数 target-frame-rate = ターゲットのフレームレート + min-lib-versions = 想定される最低バージョン loaded-lib-versions = 使用中のバージョン + has-seccomp-bpf = Seccomp-BPF (システムコールフィルタリング) has-seccomp-tsync = Seccomp スレッド同期 has-user-namespaces = ユーザー名前空間 @@ -266,10 +273,18 @@ sandbox-proc-type-content = コンテンツ sandbox-proc-type-file = ファイルコンテンツ sandbox-proc-type-media-plugin = メディアプラグイン sandbox-proc-type-data-decoder = データデコーダー + +startup-cache-title = 起動時キャッシュ +startup-cache-disk-cache-path = ディスクキャッシュのパス +startup-cache-ignore-disk-cache = ディスクキャッシュ無視 +startup-cache-found-disk-cache-on-init = 初期化時に見つけたディスクキャッシュ +startup-cache-wrote-to-disk-cache = ディスクキャッシュへの書き込み + launcher-process-status-0 = 有効 launcher-process-status-1 = 失敗したため無効 launcher-process-status-2 = 強制的に無効 launcher-process-status-unknown = 状態不明 + # Variables # $remoteWindows (integer) - Number of remote windows # $totalWindows (integer) - Number of total windows @@ -282,6 +297,7 @@ multi-process-status-6 = 未サポートのテキスト入力により無効 multi-process-status-7 = アドオンにより無効 multi-process-status-8 = 強制的に無効 multi-process-status-unknown = 状態不明 + async-pan-zoom = 非同期パン / ズーム apz-none = なし wheel-enabled = ホイール入力有効 @@ -290,14 +306,14 @@ drag-enabled = スクロールバーのドラッグ有効 keyboard-enabled = キーボード有効 autoscroll-enabled = 自動スクロール有効 +zooming-enabled = スムーズなピンチズーム有効 + ## Variables ## $preferenceKey (string) - String ID of preference - wheel-warning = 非同期ホイール入力は未サポートの設定により無効化されます: { $preferenceKey } touch-warning = 非同期タッチ入力は未サポートの設定により無効化されます: { $preferenceKey } ## Strings representing the status of the Enterprise Policies engine. - policies-inactive = 非アクティブ policies-active = アクティブ policies-error = エラー diff --git a/thunderbird-l10n/ja/localization/ja/toolkit/about/certviewer.ftl b/thunderbird-l10n/ja/localization/ja/toolkit/about/certviewer.ftl index fe7d15212895bbf2191902904edb761191cf5092..b5136b54ddb8008919d57f85d6103de7765abd91 100644 --- a/thunderbird-l10n/ja/localization/ja/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/ja/localization/ja/toolkit/about/certviewer.ftl @@ -30,6 +30,8 @@ certificate-viewer-id = ID certificate-viewer-key-exchange-group = Key Exchange Group certificate-viewer-key-id = Key ID certificate-viewer-key-size = Key Size +# Inc. means Incorporated, e.g GitHub is incorporated in Delaware +certificate-viewer-inc-locality = Inc. Locality certificate-viewer-locality = Locality certificate-viewer-location = Location certificate-viewer-logid = Log ID diff --git a/thunderbird-l10n/ja/localization/ja/toolkit/extensions/blocklist.ftl b/thunderbird-l10n/ja/localization/ja/toolkit/extensions/blocklist.ftl index 64d9ebb8384ec498c4e64e9540f4d1fbb3bd3640..71a57fec1adc1170358bcf65a8a7d6f52f97f5c6 100644 --- a/thunderbird-l10n/ja/localization/ja/toolkit/extensions/blocklist.ftl +++ b/thunderbird-l10n/ja/localization/ja/toolkit/extensions/blocklist.ftl @@ -8,7 +8,7 @@ blocklist-window = blocklist-accept = .label = { -brand-short-name } を再起動 .accesskey = R -blocklist-label-summary = 安定性またはセキュリティの問題を生じるものとして知られているアドオンを検出しました: +blocklist-label-summary = 安定性またはセキュリティの問題を生じるものとして知られているアドオンが { -brand-short-name } により検出されました: blocklist-soft-and-hard = 安定性またはセキュリティの問題を生じる高いリスクがあるアドオンはブロックされます。その他のアドオンのリスクは低いですが、再起動して無効化することが強く推奨されます。 blocklist-hard-blocked = このアドオンには安定性またはセキュリティの問題を生じる高いリスクがあるため、ブロックされますが、完全に無効化するには再起動する必要があります。 blocklist-soft-blocked = 安全のために、再起動してこのアドオンを無効化することが強く推奨されます。 diff --git a/thunderbird-l10n/ja/localization/ja/toolkit/global/processTypes.ftl b/thunderbird-l10n/ja/localization/ja/toolkit/global/processTypes.ftl index 4da798b55eca63bdb1a2bc2112a6f53e70fc4bcf..2de9f68498e77eb0b13d2bf02166fa7c1da90dc1 100644 --- a/thunderbird-l10n/ja/localization/ja/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/ja/localization/ja/toolkit/global/processTypes.ftl @@ -32,3 +32,6 @@ process-type-webisolated = 隔離されたウェブコンテンツ # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU + +# process used to perform network operations +process-type-socket = ソケット diff --git a/thunderbird-l10n/ja/localization/ja/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ja/localization/ja/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..1f316ecd05cd7a216e030e0a22cb17d9116fa4b1 --- /dev/null +++ b/thunderbird-l10n/ja/localization/ja/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = 古いバージョンの { -brand-product-name } を起動しています + .style = width: 490px; +profiledowngrade-window-create = + .label = 新しいプロファイルを作成 +profiledowngrade-sync = 古いバージョンの { -brand-product-name } を使用すると既存のプロファイルに保存されたブックマークやブラウジング履歴が壊れる可能性があります。これらの情報を保護するため、この { -brand-short-name } 用に新しいプロファイルを作成してください。{ -fxaccount-brand-name }にログインして、いつでもブックマークとブラウジング履歴をプロファイル間で同期できます。 +profiledowngrade-nosync = 古いバージョンの { -brand-product-name } を使用すると既存のプロファイルに保存されたブックマークやブラウジング履歴が壊れる可能性があります。これらの情報を保護するため、この { -brand-short-name } 用に新しいプロファイルを作成してください。 +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] 終了 + *[other] 終了 + } diff --git a/thunderbird-l10n/ja/localization/ja/toolkit/global/profileSelection.ftl b/thunderbird-l10n/ja/localization/ja/toolkit/global/profileSelection.ftl index 91f2a3673ef5d5d76e6cadee4a50742a19fbe979..77305ffb65621cec0d36f4747bf7bad092acf894 100644 --- a/thunderbird-l10n/ja/localization/ja/toolkit/global/profileSelection.ftl +++ b/thunderbird-l10n/ja/localization/ja/toolkit/global/profileSelection.ftl @@ -20,7 +20,7 @@ profile-selection-delete-button = ## Messages used in the profile manager -profile-manager-description = ユーザーの設定やデータなどはユーザープロファイルに保存されます。 +profile-manager-description = ユーザーの設定やデータなどは { -brand-short-name } のユーザープロファイルに保存されます。 profile-manager-work-offline = .label = オフライン作業 .accesskey = o diff --git a/thunderbird-l10n/ja/manifest.json b/thunderbird-l10n/ja/manifest.json index 7523934b3291bf34c695a71f661e623834e6ab2d..fb434b2c9cca4d65c7ebf235fe3c92bc218cfbc8 100644 --- a/thunderbird-l10n/ja/manifest.json +++ b/thunderbird-l10n/ja/manifest.json @@ -1,57 +1,57 @@ { - "author": "Mozilla Japanese L10N Community (contributors: Makoto Arai, Tomoya Asai, Hideyuki EMURA, Shaw Hosaka, Joji Ikeda, Masahiko Imanaka, Kosuke Kaizuka, Hidehiro Kozawa, Teiji Matsuba, Shigeki Narisawa, Takeshi Nishimura, Atsushi Sakai, Hiroshi Sekiya, Youhei Tooyama, Satoru Yamaguchi)", - "applications": { - "gecko": { - "id": "langpack-ja@thunderbird.mozilla.org", - "strict_min_version": "76.0", - "strict_max_version": "76.*" + "sources": { + "browser": { + "base_path": "browser/" } }, - "name": "Japanese Language Pack", - "version": "76.0buildid20200407173003", - "langpack_id": "ja", + "description": "Language pack for Thunderbird for ja", + "version": "76.0buildid20200420212409", "languages": { "ja": { - "version": "20200403075200", + "version": "20200417160521", "chrome_resources": { - "calendar": "chrome/ja/locale/ja/calendar/", - "messenger": "chrome/ja/locale/ja/messenger/", + "messenger-newsblog": "chrome/ja/locale/ja/messenger-newsblog/", + "pipnss": "chrome/ja/locale/ja/pipnss/", + "global": "chrome/ja/locale/ja/global/", + "necko": "chrome/ja/locale/ja/necko/", "messenger-mapi": "chrome/ja/locale/ja/messenger-mapi/", - "devtools-startup": "chrome/ja/locale/ja/devtools/startup/", - "places": "chrome/ja/locale/ja/places/", - "alerts": "chrome/ja/locale/ja/alerts/", "pluginproblem": "chrome/ja/locale/ja/pluginproblem/", - "necko": "chrome/ja/locale/ja/necko/", - "messenger-newsblog": "chrome/ja/locale/ja/messenger-newsblog/", "lightning": "chrome/ja/locale/ja/lightning/", + "mozldap": "chrome/ja/locale/ja/mozldap/", + "alerts": "chrome/ja/locale/ja/alerts/", + "passwordmgr": "chrome/ja/locale/ja/passwordmgr/", + "calendar": "chrome/ja/locale/ja/calendar/", + "communicator": "chrome/ja/locale/ja/communicator/", "devtools": "chrome/ja/locale/ja/devtools/client/", + "chat": "chrome/ja/locale/ja/chat/", "pippki": "chrome/ja/locale/ja/pippki/", - "messenger-smime": "chrome/ja/locale/ja/messenger-smime/", - "branding": "chrome/ja/locale/ja/branding/", - "mozapps": "chrome/ja/locale/ja/mozapps/", - "pipnss": "chrome/ja/locale/ja/pipnss/", "autoconfig": "chrome/ja/locale/ja/autoconfig/", + "messenger-smime": "chrome/ja/locale/ja/messenger-smime/", "messenger-region": "chrome/ja/locale/ja/messenger-region/", + "devtools-shared": "chrome/ja/locale/ja/devtools/shared/", + "messenger": "chrome/ja/locale/ja/messenger/", + "branding": "chrome/ja/locale/ja/branding/", + "places": "chrome/ja/locale/ja/places/", "global-platform": { "macosx": "chrome/ja/locale/ja/global-platform/mac/", "win": "chrome/ja/locale/ja/global-platform/win/", - "android": "chrome/ja/locale/ja/global-platform/unix/", - "linux": "chrome/ja/locale/ja/global-platform/unix/" + "linux": "chrome/ja/locale/ja/global-platform/unix/", + "android": "chrome/ja/locale/ja/global-platform/unix/" }, - "global": "chrome/ja/locale/ja/global/", - "mozldap": "chrome/ja/locale/ja/mozldap/", - "passwordmgr": "chrome/ja/locale/ja/passwordmgr/", - "chat": "chrome/ja/locale/ja/chat/", - "communicator": "chrome/ja/locale/ja/communicator/", - "devtools-shared": "chrome/ja/locale/ja/devtools/shared/" + "mozapps": "chrome/ja/locale/ja/mozapps/", + "devtools-startup": "chrome/ja/locale/ja/devtools/startup/" } } }, - "description": "Language pack for Thunderbird for ja", "manifest_version": 2, - "sources": { - "browser": { - "base_path": "browser/" + "applications": { + "gecko": { + "strict_min_version": "76.0", + "id": "langpack-ja@thunderbird.mozilla.org", + "strict_max_version": "76.*" } - } + }, + "langpack_id": "ja", + "name": "Japanese Language Pack", + "author": "Mozilla Japanese L10N Community (contributors: Makoto Arai, Tomoya Asai, Hideyuki EMURA, Shaw Hosaka, Joji Ikeda, Masahiko Imanaka, Kosuke Kaizuka, Hidehiro Kozawa, Teiji Matsuba, Shigeki Narisawa, Takeshi Nishimura, Atsushi Sakai, Hiroshi Sekiya, Youhei Tooyama, Satoru Yamaguchi)" } diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/calendar/calendar.dtd b/thunderbird-l10n/ka/chrome/ka/locale/ka/calendar/calendar.dtd index 6c981e735ba9523e45ac2d91621b3b131c0d243a..22c755868941ac6233974eae4e97aa776219b2e1 100644 --- a/thunderbird-l10n/ka/chrome/ka/locale/ka/calendar/calendar.dtd +++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/calendar/calendar.dtd @@ -50,7 +50,7 @@ <!ENTITY calendar.unifinder.tree.categories.tooltip2 "კატეგორიებით დალაგება"> <!ENTITY calendar.unifinder.tree.location.label "მისამართი"> <!ENTITY calendar.unifinder.tree.location.tooltip2 "მდებარეობის მიხედვით დალაგება"> -<!ENTITY calendar.unifinder.tree.status.label "სტატუსი"> +<!ENTITY calendar.unifinder.tree.status.label "მდგომარეობა"> <!ENTITY calendar.unifinder.tree.status.tooltip2 "მდგომარეობის მიხედვით დალაგება"> <!ENTITY calendar.unifinder.tree.calendarname.label "კალენდრის სახელი"> <!ENTITY calendar.unifinder.tree.calendarname.tooltip2 "კალენდრის სახელით დალაგება"> diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/devtools/client/inspector.properties b/thunderbird-l10n/ka/chrome/ka/locale/ka/devtools/client/inspector.properties index 45a759da19dfbfa5612c25d8c1d2e75cb0e60e1b..c94f909f67df9f13a827ae794e175fa4ed2fdcda 100644 --- a/thunderbird-l10n/ka/chrome/ka/locale/ka/devtools/client/inspector.properties +++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=This element has scrollable overflow. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=No associated rule +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Hold Shift and click to jump to rule + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/appstrings.properties b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/appstrings.properties index 402e7081c5896ed3f808d8599a2f416a846d7ab2..eb69624f905657446e0eb6d6a7377b1b929c1f4b 100644 --- a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/appstrings.properties +++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/appstrings.properties @@ -15,7 +15,7 @@ confirmRepostPrompt=ამ გვერდის საჩვენებლა resendButton.label=ხელახლა გადაგზავნა unknownSocketType=ეს დოკუმენტი ვერ აისახება პირადი უსაფრთხოების მმართველის (PSM) ჩადგმამდე. ჩამოტვირთეთ და ჩადგით PSM და კვლავ სცადეთ ან მიმართეთ სისტემის ადმინს. netReset=დოკუმენტი მონაცემებს არ შეიცავს. -notCached=ეს დოკუმენტი აღარ არის ხელმისაწვდომი. +notCached=შიგთავსი აღარაა ხელმისაწვდომი. netOffline=ეს დოკუმენტი კავშირგარეშე რეჟიმში ვერ გამოჩნდება. ინტერნეტში გასასვლელად, მოხსენით მონიშვნა კავშირგარეშე მუშაობას მენიუდან. isprinting=დაბეჭვდისას ან ამოსაბეჭდის ნახვის დროს დოკუმენტის შეცვლა შეუძლებელია. deniedPortAccess=მისამართი იყენებს ქსელის პორტს, რომელიც სხვა მიზნებით გამოიყენება. უსაფრთხოების მიზნით პროგრამამ მოთხოვნა გააუქმა. diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/css.properties b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/css.properties index 02c527882b0daf8a72bf7120dc703c341ee2904c..6c353a0b3256cfddca2ed5aa7c898531157416c4 100644 --- a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/css.properties +++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=სტილების ნაკრები %1$S ჩაიტ PEUnexpEOF2=ფაილის მოულოდნელი დასასრული %1$S ძებნისას. PEParseRuleWSOnly=მხოლოდ ხარეების გამოხშირვაა მითითებული. + PEDeclDropped=დეკლარაცია გამოიტოვა. PEDeclSkipped=გადასვლა შემდეგ დეკლარაციაზე. PEUnknownProperty=უცნობი პარამეტრი '%1$S'. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=subgrid-ისთვის სახ PEMoreThanOneGridRepeatAutoFillFitInTrackList=ბილიკის სიაში დაშვებულია მხოლოდ ერთი repeat(auto-fill, …) ან repeat(auto-fit, …). PEMoreThanOneGridRepeatTrackSize=გამეორების (auto-fit/auto-fill, …) შიგნით დაშვებულია მხოლოდ ერთი ბილიკის ზომა. +PEDisallowedImportRule=@import წესები ჯერ არაა მართებული სტილის აწყობილ ცხრილებში. + TooLargeDashedRadius=Border radius is too large for ‘dashed’ style (the limit is 100000px). Rendering as solid. TooLargeDottedRadius=Border radius is too large for ‘dotted’ style (the limit is 100000px). Rendering as solid. diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/dom/dom.properties b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/dom/dom.properties index c062150eb4c1a590fc3d171bc52bee40e096e645..622c62d97b14b5a37983172e1b20e38662eb8263 100644 --- a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/dom/dom.properties +++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/dom/dom.properties @@ -194,9 +194,9 @@ IgnoringWillChangeOverBudgetWarning=Will-change მეხსიერები # LOCALIZATION NOTE: Do not translate "Worker". HittingMaxWorkersPerDomain2=Worker-ის სწრაფად გაშვება შეუძლებელია, რადგან იმავე წყაროს სხვა დოკუმენტები უკვე იყენებენ worker-ების სრულ რაოდენობას. Worker ახლა იცდის და გაეშვება მაშინვე, როცა სხვა რომელიმე worker დაასრულებს სამუშაოს. # LOCALIZATION NOTE: Do not translate "Application Cache API", "AppCache" and "ServiceWorker". -AppCacheWarning=API-ის დროებითი მეხსიერების (AppCache) გამოყენება მოძველებულია და მომავალში მოცილდება. გთხოვთ, მის ნაცვლად, ხაზგარეშე მხარდაჭერისთვის ისარგებლოთ ServiceWorker-ით. +AppCacheWarning=აპლიკაციის დროებითი მეხსიერების API-ის (AppCache) გამოყენება მოძველებულია და მომავალში მოცილდება. გთხოვთ, მის ნაცვლად, კავშირგარეშე მხარდაჭერისთვის ისარგებლოთ ServiceWorker-ით. # LOCALIZATION NOTE: Do not translate "Application Cache API", "AppCache". -AppCacheInsecureWarning=აპლიკაციის კეშის API-ის (AppCache) გამოყენების შესაძლებლობა დაუცველი კავშირებისას მოცილებული იქნება 62 ვერსიაში. +AppCacheInsecureWarning=აპლიკაციის დროებითი მეხსიერების API-ის (AppCache) გამოყენების შესაძლებლობა დაუცველი კავშირებისას მოცილებული იქნება 62 ვერსიაში. # LOCALIZATION NOTE: Do not translate "Worker". EmptyWorkerSourceWarning=Worker-ის შექმნის მცდელობა ცარიელი წყაროდან. ალბათ, უნებლიე. WebrtcDeprecatedPrefixWarning=WebRTC ინტერფეისი “moz” თავსართით (mozRTCPeerConnection, mozRTCSessionDescription, mozRTCIceCandidate) უკვე მოძველებულია. diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/netError.dtd b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/netError.dtd index 037b49943934d8072b3fc80f6e20f56a8f1e7178..17be9e986f8761dd2071809a16255d13a5ee37e4 100644 --- a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/netError.dtd +++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/netError.dtd @@ -32,7 +32,7 @@ <!ENTITY netInterrupt.longDesc "<p>დაკავშირება წარმატებული იყო, მაგრამ მოულოდნელად გაწყდა მონაცემთა გადმოტანისას. გთხოვთ, კვლავ სცადოთ.</p><ul><li>სხვა საიტებზეც ვერ შედიხართ? შეამოწმეთ კომპიუტერის კავშირი ქსელთან.</li><li>ჯერ კიდევ არ გამოსწორდა ხარვეზი? დახმარებისთვის მიმართეთ თქვენი ქსელის მმართველს, ან ინტერნეტმომსახურების მომწოდებელს.</li></ul>"> <!ENTITY notCached.title "შიგთავსი ვადაგასულია"> -<!ENTITY notCached.longDesc "<p>მოთხოვნილი შიგთავსი არაა ხელმისაწვდომი ბრაუზერის კავშირგარეშე საცავში (კეშში).</p><ul><li>უსაფრთხოების მიზნით, ბრაუზერი დაუკითხავად არ ითხოვს ხოლმე საიტიდან მნიშვნელოვანი მასალის ხელახლა ჩამოტვირთვას.</li><li>ჩამოტვირთვის ხელმეორედ მოთხოვნისთვის, დააწკაპეთ ღილაკზე „სცადეთ ხელახლა“.</li></ul>"> +<!ENTITY notCached.longDesc "<p>მოთხოვნილი შიგთავსი არაა ხელმისაწვდომი ადგილობრივად, სადაც ბრაუზერი მას დროებით ინახავს.</p><ul><li>უსაფრთხოების მიზნით, ბრაუზერი დაუკითხავად არ ითხოვს ხოლმე საიტიდან მნიშვნელოვანი მასალის ხელახლა ჩამოტვირთვას.</li><li>ჩამოტვირთვის ხელმეორედ მოთხოვნისთვის, დააწკაპეთ ღილაკზე „სცადეთ ხელახლა“.</li></ul>"> <!ENTITY netOffline.title "კავშირგარეშე რეჟიმი"> <!ENTITY netOffline.longDesc2 "<p>ბრაუზერი მუშაობს კავშირგარეშედ და მოთხოვნილ მისამართს ვერ დაუკავშირდება.</p><ul><li>ჩართულია მოწყობილობა მოქმედ ქსელში?</li><li>გამოიყენეთ "სცადეთ ხელახლა" ღილაკი კავშირზე დასაბრუნებლად და გვერდის ხელახლა ჩასატვირთად.</li></ul>"> diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/security/security.properties b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/security/security.properties index fc5e58a359557db28d2b8b70ca24951f70ace8e0..fc0cf99c530f10d115e779065d394732c2439e9f 100644 --- a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/security/security.properties +++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = ჩატვირთვა უარყო X-Frame-Options-მა: # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = ჩატვირთვას ზღუდავს X-Frame-Options: „%1$S“ თავსართის „%2$S“ მისამართიდან, საიტი არ იძლევა „%3$S“ განსხვავებული წყაროდან ჩარჩოში ჩასმის ნებართვას. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = არამართებული X-Frame-Options თავსართია ნაპოვნი, როცა იტვირთებოდა „%2$S“: “%1$S” დაუშვებელი მითითებაა. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=„%2$S“ ვერ ჩაიტვირთა, ვინაიდან უარყოფს „X-Frame-Options“ მითითება, პარამეტრით „%1$S“. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = დაუცველი მოთხოვნის “%1$S” განახლება რომ გამოიყენოს “%2$S”. diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/messenger/messenger.dtd b/thunderbird-l10n/ka/chrome/ka/locale/ka/messenger/messenger.dtd index 2c436ec78f6e37287d5ca14fa5d589c907776ad0..92c15f2f2cbf2bce200204997f602583ba845f01 100644 --- a/thunderbird-l10n/ka/chrome/ka/locale/ka/messenger/messenger.dtd +++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "წერილების ძიება…"> <!ENTITY searchMailCmd.accesskey "ძ"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "საერთო ძიება…"> +<!ENTITY glodaSearchCmd.accesskey "თ"> <!ENTITY searchAddressesCmd.label "მისამართების ძიება…"> <!ENTITY searchAddressesCmd.accesskey "ე"> diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/messenger/pgpmime.properties b/thunderbird-l10n/ka/chrome/ka/locale/ka/messenger/pgpmime.properties index 8f8508c1500867bf29b2fd12b5489d1f88d8d4e1..a7be87346094a11fc01c243483aba597ceb8102d 100644 --- a/thunderbird-l10n/ka/chrome/ka/locale/ka/messenger/pgpmime.properties +++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=ეს დაშიფრული OpenPGP გზავნილია.<br>წერილის გასაშიფრად აუცილებელია გადგათ <a href="%S">OpenPGP მოდული</a>. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=ეს დაშიფრული OpenPGP-წერილია, მაგრამ OpenPGP-ის გაშიფვრის მხარდაჭერა, არაა ხელმისაწვდომი. diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/necko/necko.properties b/thunderbird-l10n/ka/chrome/ka/locale/ka/necko/necko.properties index 86c0b97bbb4527471c414105c1ef64750f0133c6..991e47aaac1a32bc99fc0b77609e8bf1d7e0bd5c 100644 --- a/thunderbird-l10n/ka/chrome/ka/locale/ka/necko/necko.properties +++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/necko/necko.properties @@ -8,55 +8,58 @@ #SendingRequestTo=Sending request to #TransferringDataFrom=Transferring data from -3=ეძებს – %1$S… -4=დაკავშირებულია – %1$S… -5=იგზავნება მოთხოვნა – %1$S… +3=იძებნება %1$S… +4=დაუკავშირდა %1$S… +5=იღებს მოთხოვნას %1$S… 6=მონაცემთა გადმოტანა – %1$S… -7=უკავშირდება – %1$S… -8=დამუშავდა – %1$S -9=ჩაიწერა – %1$S +7=უკავშირდება %1$S… +8=დამუშავდა %1$S +9=ჩაიწერა %1$S 10=ელოდება – %1$S… 11=მოიძებნა %1$S… -12=TLS დამმოწმებელი კავშირი %1$S-სთან… -13=TLS დამმოწმებელი კავშირი %1$S-სთან, დასრულებულია… +12=კავშირის TLS-დამოწმება – %1$S… +13=TLS-დამოწმება დასრულდა – %1$S… -27=FTP ტრანზაქციის დაწყება... -28=დასრულებული FTP ტრანზაქცია +27=FTP-გადაცემის დაწყება... +28=FTP-გადაცემა დასრულდა RepostFormData=ეს გვერდი სხვა ბმულზე გადამისამართდა. გსურთ თქვენი შევსებული ველების ახალ მისამართზე გადაგზავნა? # Directory listing strings DirTitle=ნუსხა – %1$S DirGoUp=ზედა საქაღალდე -ShowHidden=დამალული ობიექტების ჩვენება +ShowHidden=დამალულების გამოჩენა DirColName=სახელი DirColSize=ზომა DirColMTime=ბოლო ცვლილება DirFileLabel=ფაილი:\u0020 -PhishingAuth=თქვენ აპირებთ მოინახულოთ “%1$S”. ეს საიტი შესაძლოა ცდილობს მოგაჩვენოთ, რომ თქვენ სხვა საიტს სტუმრობთ. გამოიყენეთ მხოლოდ განსაკუთრებულ შემთხვევებში. -PhishingAuthAccept=მივხვდი და ძალიან ფრთხილად ვიქნები +PhishingAuth=თქვენ აპირებთ მოინახულოთ „%1$S“. ეს საიტი შესაძლოა ცდილობდეს თავი სხვა საიტად გაასაღოს. იმოქმედეთ განსაკუთრებული სიფრთხილით. +PhishingAuthAccept=გასაგებია და სიფრთხილით მოვეკიდები -SuperfluousAuth=თქვენ აპირებთ შეხვიდეთ “%1$S” საიტზე “%2$S” სახელით, მაგრამ ვებსაიტი, ანგარიშზე შესვლას არ ითხოვს. აქ შესაძლოა რამე თაღლითობას ჰქონდეს ადგილი.\n\n“%1$S” ნამდვილად ის საიტია, რომლის ნახვაც გსურთ? -AutomaticAuth=თქვენ აპირებთ შეხვიდეთ “%1$S” საიტზე “%2$S” სახელით. +SuperfluousAuth=თქვენ აპირებთ შეხვიდეთ „%1$S“ საიტზე „%2$S“ სახელით, მაგრამ ვებსაიტი, ანგარიშზე შესვლას არ საჭიროებს. აქ შესაძლოა რამე თაღლითობას ჰქონდეს ადგილი.\n\n„%1$S“ ნამდვილად ის საიტია, რომლის ნახვაც გსურთ? +AutomaticAuth=თქვენ აპირებთ შეხვიდეთ „%1$S“ საიტზე „%2$S“ სახელით. -TrackerUriBlocked=მასალა „%1$S“ შეიზღუდა, ვინაიდან შიგთავსის შეზღუდვა ჩართულია. -UnsafeUriBlocked=მასალა „%1$S“ შეიზღუდა, უსაფრთხო თვალიერების რეჟიმის მიერ. -CookieBlockedByPermission=ფუნთუშებთან ან საცავთან წვდომის მოთხოვნა “%1$S-ზე” შეიზღუდა, ფუნთუშების განსაზღვრული ნებართვების შესაბამისად. -CookieBlockedTracker=ფუნთუშებთან ან საცავთან წვდომის მოთხოვნა “%1$S-ზე” შეიზღუდა, ვინაიდან მომდინარეობდა მეთვალყურისგან და შიგთავსის შეზღუდვა ჩართულია. -CookieBlockedAll=ფუნთუშებთან ან საცავთან წვდომის მოთხოვნა “%1$S-ზე” შეიზღუდა, ვინაიდან ყველა საცავთან წვდომა შეზღუდული გაქვთ. -CookieBlockedForeign=ფუნთუშებთან ან საცავთან წვდომის მოთხოვნა “%1$S-ზე” შეიზღუდა, ვინაიდან ყველა მესამე მხარისთვის შეზღუდული გაქვთ საცავთან წვდომის მოთხოვნა და შიგთავსის შეზღუდვაც ჩართულია. +TrackerUriBlocked=მასალა „%1$S“ მისამართზე შეიზღუდა, ვინაიდან შიგთავსის შეზღუდვა ჩართულია. +UnsafeUriBlocked=მასალა „%1$S“ მისამართზე შეიზღუდა, უსაფრთხო თვალიერების რეჟიმის მიერ. +CookieBlockedByPermission=ფუნთუშებთან ან საცავთან წვდომის მოთხოვნა „%1$S“ მისამართზე შეიზღუდა, ფუნთუშების მითითებული ნებართვების შესაბამისად. +CookieBlockedTracker=ფუნთუშებთან ან საცავთან წვდომის მოთხოვნა „%1$S“ მისამართზე შეიზღუდა, ვინაიდან მომდინარეობდა მეთვალყურისგან და შიგთავსის შეზღუდვა ჩართულია. +CookieBlockedAll=ფუნთუშებთან ან საცავთან წვდომის მოთხოვნა „%1$S“ მისამართზე შეიზღუდა, ვინაიდან ყველა საცავთან წვდომა შეზღუდული გაქვთ. +CookieBlockedForeign=ფუნთუშებთან ან საცავთან წვდომის მოთხოვნა „%1$S“ მისამართზე შეიზღუდა, ვინაიდან შეზღუდული გაქვთ ყველა გარეშე საცავთან წვდომის მოთხოვნა და შიგთავსის შეზღუდვაც ჩართულია. # LOCALIZATION NOTE (CookieAllowedForOriginOnTrackerByStorageAccessAPI): %3$S, %2$S and %1$S are URLs. -CookieAllowedForOriginOnTrackerByStorageAccessAPI=საცავთან წვდომის უფლება მიიღო “%3$S-მა“, გახსნილმა “%2$S” მეთვალყურის მიერ “%1$S-ზე”. +CookieAllowedForOriginOnTrackerByStorageAccessAPI=საცავთან წვდომის მიმღებია „%3$S“, რომელიც გახსნა „%2$S“ მეთვალყურემ მისამართზე „%1$S“. # LOCALIZATION NOTE (CookieAllowedForTrackerByStorageAccessAPI): %2$S and %1$S are URLs. -CookieAllowedForTrackerByStorageAccessAPI=საცავთან წვდომა მიიღო “%2$S-მა” “%1$S-ზე”. +CookieAllowedForTrackerByStorageAccessAPI=საცავთან წვდომის მიმღებია „%2$S“ მისამართზე „%1$S“. # LOCALIZATION NOTE (CookieAllowedForOriginOnTrackerByHeuristic): %3$S, %2$S and %1$S are URLs. -CookieAllowedForOriginOnTrackerByHeuristic=საცავთან წვდომა ავტომატურად მიიღო “%3$S-მა” გახსნილმა “%2$S” მეთვალყურის მიერ “%1$S-ზე”. +CookieAllowedForOriginOnTrackerByHeuristic=საცავთან წვდომის მიმღებია „%3$S“, რომელიც გახსნა „%2$S“ მეთვალყურემ მისამართზე „%1$S“. # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=საცავთან წვდომა ავტომატურად მიიღო “%2$S” მეთვალყურემ “%1$S-ზე”. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=საცავთან წვდომა მიღებულია პირველი მხარის გამიჯვნისთვის „%2$S“ მისამართზე „%1$S“. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=უარყოფილია “%1$S” ფუნთუშა, ვინაიდან აქვს “sameSite=none” თვისება და აკლია “secure” თვისება. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/pippki/pippki.properties b/thunderbird-l10n/ka/chrome/ka/locale/ka/pippki/pippki.properties index cb3095f9f8dc64e27f00d01a0248ade62188a9a0..eef3a6b524e0bf553c9306d23334cbb3fa3cdd10 100644 --- a/thunderbird-l10n/ka/chrome/ka/locale/ka/pippki/pippki.properties +++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/pippki/pippki.properties @@ -64,7 +64,7 @@ pageInfo_Privacy_None4=გვერდი, რომელსაც ათვა pageInfo_EncryptionWithBitsAndProtocol=კავშირი დაშიფრულია (%1$S, გასაღების სიგრძე %2$S ბიტი, %3$S) pageInfo_BrokenEncryption=დაზიანებული დაშიფვრა (%1$S, გასაღების სიგრძე %2$S ბიტი, %3$S) pageInfo_Privacy_Encrypted1=გვერდი, რომელსაც ათვალიერებთ ინტერნეტით გადაცემამდე დაიშიფრა. -pageInfo_Privacy_Encrypted2=დაშიფვრა ურთულებს უცხო პირებს, უნებართვოდ ნახონ კომპიუტერებს შორის გადაცემული ინფორმაცია. ამიტომ, ნაკლებად სავარაუდოა, რომ ქსელში გადაცემისას, ვინმე ხედავდეს ამ გვერდს. +pageInfo_Privacy_Encrypted2=დაშიფვრა ურთულებს უცხო პირებს, უნებართვოდ იხილონ კომპიუტერებს შორის მიმოცვლილი ინფორმაცია. ამიტომ, ნაკლებად სავარაუდოა, რომ ქსელში გადაცემისას, ვინმე ხედავდეს ამ გვერდს. pageInfo_MixedContent=კავშირი ნაწილობრივ დაშიფრულია pageInfo_MixedContent2=გვერდის შიგთავსის ნაწილი, რომელსაც ათვალიერებთ, ინტერნეტით გადაცემამდე არ დაშიფრულა. pageInfo_WeakCipher=საიტთან კავშირისას სუსტი დაშიფვრაა გამოყენებული, რაც ვერ უზრუნველყოფს პირადი მონაცემების უსაფრთხოებას. შესაძლოა, სხვებმაც იხილონ გადაცემული ინფორმაცია, ან საიტის შიგთავსი შეცვალონ. diff --git a/thunderbird-l10n/ka/localization/ka/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/ka/localization/ka/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..af60be7c6db4a2cd9958a703045564fc8cb7c321 --- /dev/null +++ b/thunderbird-l10n/ka/localization/ka/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = კალენდარის URI-გადამისამართება +calendar-uri-redirect-description = + სერვერი ამისამართებს URI-ის კალენდრისთვის „{ $calendarName }“. + გსურთ, გადამისამართების მიღება და ახალი URI-ის გამოყენება ამ კალენდრისთვის? +calendar-uri-redirect-original-uri-label = მიმდინარე URI: +calendar-uri-redirect-target-uri-label = გადამისამართების ახალი URI: diff --git a/thunderbird-l10n/ka/localization/ka/devtools/startup/aboutDevTools.ftl b/thunderbird-l10n/ka/localization/ka/devtools/startup/aboutDevTools.ftl index f5f9fcf9a2fa39b5d19141c7a6bf3c2b4d171d09..270daf23911ad358bb4a28bbfe9499e5160544e4 100644 --- a/thunderbird-l10n/ka/localization/ka/devtools/startup/aboutDevTools.ftl +++ b/thunderbird-l10n/ka/localization/ka/devtools/startup/aboutDevTools.ftl @@ -35,7 +35,7 @@ features-debugger-desc = JavaScript-ის მძლავრი გამმა features-network-title = ქსელი features-network-desc = თვალი ადევნეთ დაკავშირების მოთხოვნებს, რომელთაც შეუძლია შეანელოს ან შეზღუდოს საიტთან წვდომა. <a data-l10n-name="learn-more">{ features-learn-more }</a> features-storage-title = საცავების მართვა -features-storage-desc = დაამატეთ, შეცვალეთ ან გააუქმეთ კეში, ფუნთუშები, ბაზები და სეანსის მონაცემები. <a data-l10n-name="learn-more">{ features-learn-more }</a> +features-storage-desc = დაამატეთ, შეცვალეთ ან გააუქმეთ დროებითი ფაილები, ფუნთუშები, ბაზები და სეანსის მონაცემები. <a data-l10n-name="learn-more">{ features-learn-more }</a> features-responsive-title = თავსებადი იერსახე features-responsive-desc = გამოცადეთ საიტები ვირტუალურ მოწყობილობებზე, თქვენს ბრაუზერშივე. <a data-l10n-name="learn-more">{ features-learn-more }</a> features-visual-editing-title = იერსახის შესწორება diff --git a/thunderbird-l10n/ka/localization/ka/messenger/accountCentral.ftl b/thunderbird-l10n/ka/localization/ka/messenger/accountCentral.ftl index 5fbdd64957b79a49cd48cbde3813947299c2a76f..2069c97873b70fff029b09f5d92248caeaa9e20f 100644 --- a/thunderbird-l10n/ka/localization/ka/messenger/accountCentral.ftl +++ b/thunderbird-l10n/ka/localization/ka/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = მოგესალმებათ { -brand-full-name } +account-settings = ანგარიშის პარამეტრები +# $accounts (Number) - the number of configured accounts setup-title = აირჩიეთ, რისი გამართვა გსურთ about-title = { -brand-full-name } – შესახებ resources-title = მასალები @@ -40,3 +42,10 @@ explore-link = აღმოაჩინეთ შესაძლებლობ support-link = მხარდაჭერა involved-link = ჩაერთეთ developer-link = შემმუშავებლის მასალები +read = წერილების წაკითხვა +compose = ახალი წერილის შედგენა +search = წერილების ძიება +filter = წერილების ფილტრების მართვა +nntp-subscription = გამოწერილი ჯგუფების მართვა +rss-subscription = გამოწერილი არხების მართვა +e2e = გამჭოლი დაშიფვრა diff --git a/thunderbird-l10n/ka/localization/ka/security/certificates/certManager.ftl b/thunderbird-l10n/ka/localization/ka/security/certificates/certManager.ftl index 238f48f4cc44f13aacc641b063da7e5732d49a11..049797be0e6f73a91464f26dae757bc987113881 100644 --- a/thunderbird-l10n/ka/localization/ka/security/certificates/certManager.ftl +++ b/thunderbird-l10n/ka/localization/ka/security/certificates/certManager.ftl @@ -11,7 +11,7 @@ certmgr-tab-people = certmgr-tab-servers = .label = სერვერები certmgr-tab-ca = - .label = სერტიფიკატის გამცემები + .label = გამომცემები certmgr-mine = თქვენ გაქვთ ამ ორგანიზაციებიდან სერტიფიკატები, რომლებითაც თქვენი ამოცნობა ხდება certmgr-people = თქვენ გაქვთ სერტიფიკატები, რომლებითაც შემდეგი პირების ამოცნობა ხდება certmgr-servers = თქვენ გაქვთ სერტიფიკატები, რომლებითაც შემდეგი სერვერების ამოცნობა ხდება diff --git a/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutAddons.ftl index 708905e06a24a86285b737c30a18df58976a1434..53faf7b1467eeb85ffee05c4674d199b5fb48797 100644 --- a/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = დამატების დაყენება ფაილის მეშვეობით… .accesskey = ფ help-button = დამატებების მხარდაჭერა +sidebar-help-button-title = + .title = დამატებების მხარდაჭერა preferences = { PLATFORM() -> [windows] { -brand-short-name } პარამეტრები @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = ხელსაწყოები ყველა დამატებისთვის +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } პარამეტრები + *[other] { -brand-short-name } პარამეტრები + } show-unsigned-extensions-button = .label = ზოგიერთი გაფართოება ვერ გადამოწმდა show-all-extensions-button = @@ -171,13 +179,29 @@ extensions-view-available-updates = .name = ხელმისწვდომი განახლებები .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = შემოთავაზებები +addon-category-discover-title = + .title = შემოთავაზებები addon-category-extension = გაფართოებები +addon-category-extension-title = + .title = გაფართოებები addon-category-theme = თემები +addon-category-theme-title = + .title = თემები addon-category-plugin = მოდულები +addon-category-plugin-title = + .title = მოდულები addon-category-dictionary = ლექსიკონები +addon-category-dictionary-title = + .title = ლექსიკონები addon-category-locale = ენები +addon-category-locale-title = + .title = ენები addon-category-available-updates = ხელმისწვდომი განახლებები +addon-category-available-updates-title = + .title = ხელმისწვდომი განახლებები addon-category-recent-updates = ბოლო განახლებები +addon-category-recent-updates-title = + .title = ბოლო განახლებები ## These are global warnings @@ -290,6 +314,7 @@ shortcuts-no-commands = სწრაფი ღილაკები არ ა shortcuts-input = .placeholder = სწრაფი ღილაკის აკრეფა shortcuts-browserAction = გაფართოების ამოქმედება +shortcuts-browserAction2 = ხელსაწყოთა ზოლზე ღილაკის ამოქმედება shortcuts-pageAction = გვერდზე მოქმედების ჩართვა shortcuts-sidebarAction = გვერდითა ზოლის გამოჩენა/დამალვა shortcuts-modifier-mac = გამოყენებული იყოს Ctrl, Alt, ან ⌘ @@ -314,6 +339,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = ნაკლების ჩვენება go-back-button = .tooltiptext = უკან გადასვლა +header-back-button = + .title = უკან გადასვლა ## Recommended add-ons page diff --git a/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutSupport.ftl index 49d9e4bc10417872ab7e1457b1b591807e611aec..96989347e266e2a4acfb037d3a3c076aab8e9641 100644 --- a/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutSupport.ftl @@ -287,6 +287,11 @@ sandbox-proc-type-content = შიგთავსი sandbox-proc-type-file = ფაილის შიგთავსი sandbox-proc-type-media-plugin = მედიის მოდული sandbox-proc-type-data-decoder = მონაცემთა გამშიფრავი +startup-cache-title = დროებითი საცავი გაშვებისთვის +startup-cache-disk-cache-path = დისკის დროებითი საცავის მისამართი +startup-cache-ignore-disk-cache = დისკის დროებითი საცავის უგულებელყოფა +startup-cache-found-disk-cache-on-init = ნაპოვნია დისკის დროებითი საცავი Init-ზე +startup-cache-wrote-to-disk-cache = ჩაწერილია დისკის დროებით საცავში launcher-process-status-0 = ჩართულია launcher-process-status-1 = გამორთულია ხარვეზის გამო launcher-process-status-2 = გამორთულია ძალით @@ -310,6 +315,7 @@ touch-enabled = შეხებით შეტანა ჩართული drag-enabled = გადაადგილების ზოლის გადატანა შესაძლებელია keyboard-enabled = კლავიატურა ჩართულია autoscroll-enabled = თვითგადაადგილება ჩართულია +zooming-enabled = ორი თითით გლუვი მოახლოება და დაშორება ჩართულია ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/ka/localization/ka/toolkit/about/certviewer.ftl b/thunderbird-l10n/ka/localization/ka/toolkit/about/certviewer.ftl index b3b926872114a84f223a1d256f7bfa91fe472175..0db4d0350b3b8e6c850366296bae4aa9ccbaada6 100644 --- a/thunderbird-l10n/ka/localization/ka/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/ka/localization/ka/toolkit/about/certviewer.ftl @@ -64,7 +64,7 @@ certificate-viewer-business-category = ბიზნესის კატეგ certificate-viewer-subject-name = სუბიექტის დასახელება certificate-viewer-issuer-name = გამომცემის დასახელება certificate-viewer-validity = ძალამოსილობა -certificate-viewer-subject-alt-names = სუბიექტის შემცვლელი სახელები +certificate-viewer-subject-alt-names = სუბიექტის სხვა სახელები certificate-viewer-public-key-info = საჯარო გასაღების მონაცემები certificate-viewer-miscellaneous = სხვადასხვა certificate-viewer-fingerprints = ანაბეჭდები @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (სერტიფიკატი) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (ჯაჭვი) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = ეს გაფართოება მიჩნეულია გადამწვეტად, რაც ნიშნავს, რომ კლიენტებმა უნდა უარყონ სერტიფიკატი, თუ მათთვის გაუგებარია. +certificate-viewer-export = ცალკე შენახვა + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = თქვენი სერტიფიკატები +certificate-viewer-tab-people = ხალხი +certificate-viewer-tab-servers = სერვერები +certificate-viewer-tab-ca = გამომცემები +certificate-viewer-tab-unkonwn = უცნობი diff --git a/thunderbird-l10n/ka/localization/ka/toolkit/about/url-classifier.ftl b/thunderbird-l10n/ka/localization/ka/toolkit/about/url-classifier.ftl index 459981e0c2d2a3af1815bca75cf8f0805ade5890..bb0733c0299f62151fe061661284fd44fde7c565 100644 --- a/thunderbird-l10n/ka/localization/ka/toolkit/about/url-classifier.ftl +++ b/thunderbird-l10n/ka/localization/ka/toolkit/about/url-classifier.ftl @@ -20,18 +20,18 @@ url-classifier-provider-next-update-time = მომდევნო განა url-classifier-provider-back-off-time = უკან დაბრუნების დრო url-classifier-provider-last-update-status = ბოლო განახლების მდგომარეობა url-classifier-provider-update-btn = განახლება -url-classifier-cache-title = კეში +url-classifier-cache-title = დროებითი ფაილები url-classifier-cache-refresh-btn = განახლება url-classifier-cache-clear-btn = გასუფთავება url-classifier-cache-table-name = ცხრილის სახელი url-classifier-cache-ncache-entries = კეშის უარყოფითი ჩანაწერების რაოდენობა url-classifier-cache-pcache-entries = კეშის დადებითი ჩანაწერების რაოდენობა url-classifier-cache-show-entries = ჩანაწერების ჩვენება -url-classifier-cache-entries = კეშის ჩანაწერები +url-classifier-cache-entries = დროებითი ჩანაწერები url-classifier-cache-prefix = წინსართი -url-classifier-cache-ncache-expiry = კეშის უარყოფითი ჩანაწერების ვადა +url-classifier-cache-ncache-expiry = უარყოფითი დროებითი ჩანაწერების ვადა url-classifier-cache-fullhash = სრული ჰეში -url-classifier-cache-pcache-expiry = კეშის დადებითი ჩანაწერების ვადა +url-classifier-cache-pcache-expiry = დადებითი დროებითი ჩანაწერების ვადა url-classifier-debug-title = გამართვა url-classifier-debug-module-btn = აღრიცხვის მოდულების მითითება url-classifier-debug-file-btn = აღრიცხვის ფაილის მითითება diff --git a/thunderbird-l10n/ka/localization/ka/toolkit/global/processTypes.ftl b/thunderbird-l10n/ka/localization/ka/toolkit/global/processTypes.ftl index fa5ef1f5f15a7acd3c5527fd4aabafd09fe897a3..208a31f1b2f797a7d0b221ddea7e0be18a7a22b3 100644 --- a/thunderbird-l10n/ka/localization/ka/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/ka/localization/ka/toolkit/global/processTypes.ftl @@ -5,7 +5,7 @@ process-type-web = ვებშიგთავსი # process used to run privileged pages, # such as about:home -process-type-privileged = უპირატესად შიგთავსი +process-type-privileged = უპირატესი შიგთავსი # process used to run privileged about pages, # such as about:home process-type-privilegedabout = უპირატესად შესახებ-გვერდები @@ -24,3 +24,5 @@ process-type-webisolated = განცალკევებული ვებ # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = სოკეტი diff --git a/thunderbird-l10n/ka/localization/ka/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ka/localization/ka/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..e1a799f63d52c0150e547e3fdbc45394b0d6eeaa --- /dev/null +++ b/thunderbird-l10n/ka/localization/ka/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = თქვენ გაუშვით { -brand-product-name }-ის ძველი ვერსია + .style = width: 490px; +profiledowngrade-window-create = + .label = ახალი პროფილის შექმნა +profiledowngrade-sync = { -brand-product-name }-ის ძველმა ვერსიამ შესაძლოა დააზიანოს სანიშნები და მონახულებული საიტების ისტორია, რომლებიც არსებული { -brand-product-name }-ის პროფილშია განთავსებული. მონაცემების დასაცავად, შექმენით ახალი პროფილი, რომელსაც ეს { -brand-short-name } გამოიყენებს. ასევე ყოველთვის შეგიძლიათ მოიხმაროთ { -fxaccount-brand-name } სანიშნებისა და ისტორიის დასინქრონებისთვის, სხვადასხვა პროფილებს შორის. +profiledowngrade-nosync = { -brand-product-name }-ის ძველმა ვერსიამ შესაძლოა დააზიანოს სანიშნები და მონახულებული საიტების ისტორია, რომლებიც არსებული { -brand-product-name }-ის პროფილშია განთავსებული. მონაცემების დასაცავად, შექმენით ახალი პროფილი, რომელსაც ეს { -brand-short-name } გამოიყენებს. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] გამოსვლა + *[other] დახურვა + } diff --git a/thunderbird-l10n/ka/manifest.json b/thunderbird-l10n/ka/manifest.json index 30bbdcdd20f39b77f21298ab0c7ac959c6300e49..600c127e10ce7e74282193b8ae63eff88b16c787 100644 --- a/thunderbird-l10n/ka/manifest.json +++ b/thunderbird-l10n/ka/manifest.json @@ -1,57 +1,57 @@ { + "langpack_id": "ka", + "sources": { + "browser": { + "base_path": "browser/" + } + }, + "version": "76.0buildid20200420212409", + "author": "giasher.com (contributors: გია შერვაშიძე, http://giasher.com)", + "name": "Georgian (ქართული) Language Pack", + "description": "Language pack for Thunderbird for ka", + "applications": { + "gecko": { + "strict_max_version": "76.*", + "id": "langpack-ka@thunderbird.mozilla.org", + "strict_min_version": "76.0" + } + }, "languages": { "ka": { - "version": "20200404171350", + "version": "20200418135253", "chrome_resources": { - "devtools-shared": "chrome/ka/locale/ka/devtools/shared/", - "messenger-region": "chrome/ka/locale/ka/messenger-region/", - "places": "chrome/ka/locale/ka/places/", - "alerts": "chrome/ka/locale/ka/alerts/", - "calendar": "chrome/ka/locale/ka/calendar/", - "mozapps": "chrome/ka/locale/ka/mozapps/", - "messenger-newsblog": "chrome/ka/locale/ka/messenger-newsblog/", - "pippki": "chrome/ka/locale/ka/pippki/", - "devtools": "chrome/ka/locale/ka/devtools/client/", - "messenger-mapi": "chrome/ka/locale/ka/messenger-mapi/", - "chat": "chrome/ka/locale/ka/chat/", + "pipnss": "chrome/ka/locale/ka/pipnss/", "messenger": "chrome/ka/locale/ka/messenger/", - "pluginproblem": "chrome/ka/locale/ka/pluginproblem/", - "mozldap": "chrome/ka/locale/ka/mozldap/", + "messenger-smime": "chrome/ka/locale/ka/messenger-smime/", + "lightning": "chrome/ka/locale/ka/lightning/", + "messenger-mapi": "chrome/ka/locale/ka/messenger-mapi/", + "mozapps": "chrome/ka/locale/ka/mozapps/", "global-platform": { - "linux": "chrome/ka/locale/ka/global-platform/unix/", - "android": "chrome/ka/locale/ka/global-platform/unix/", "win": "chrome/ka/locale/ka/global-platform/win/", - "macosx": "chrome/ka/locale/ka/global-platform/mac/" + "android": "chrome/ka/locale/ka/global-platform/unix/", + "macosx": "chrome/ka/locale/ka/global-platform/mac/", + "linux": "chrome/ka/locale/ka/global-platform/unix/" }, - "pipnss": "chrome/ka/locale/ka/pipnss/", - "branding": "chrome/ka/locale/ka/branding/", + "communicator": "chrome/ka/locale/ka/communicator/", + "messenger-newsblog": "chrome/ka/locale/ka/messenger-newsblog/", "passwordmgr": "chrome/ka/locale/ka/passwordmgr/", - "messenger-smime": "chrome/ka/locale/ka/messenger-smime/", - "lightning": "chrome/ka/locale/ka/lightning/", - "necko": "chrome/ka/locale/ka/necko/", "global": "chrome/ka/locale/ka/global/", - "communicator": "chrome/ka/locale/ka/communicator/", + "pluginproblem": "chrome/ka/locale/ka/pluginproblem/", + "messenger-region": "chrome/ka/locale/ka/messenger-region/", + "necko": "chrome/ka/locale/ka/necko/", "autoconfig": "chrome/ka/locale/ka/autoconfig/", + "branding": "chrome/ka/locale/ka/branding/", + "devtools": "chrome/ka/locale/ka/devtools/client/", + "pippki": "chrome/ka/locale/ka/pippki/", + "calendar": "chrome/ka/locale/ka/calendar/", + "chat": "chrome/ka/locale/ka/chat/", + "devtools-shared": "chrome/ka/locale/ka/devtools/shared/", + "alerts": "chrome/ka/locale/ka/alerts/", + "places": "chrome/ka/locale/ka/places/", + "mozldap": "chrome/ka/locale/ka/mozldap/", "devtools-startup": "chrome/ka/locale/ka/devtools/startup/" } } }, - "author": "giasher.com (contributors: გია შერვაშიძე, http://giasher.com)", - "name": "Georgian (ქართული) Language Pack", - "sources": { - "browser": { - "base_path": "browser/" - } - }, - "applications": { - "gecko": { - "strict_max_version": "76.*", - "id": "langpack-ka@thunderbird.mozilla.org", - "strict_min_version": "76.0" - } - }, - "langpack_id": "ka", - "version": "76.0buildid20200407173003", - "manifest_version": 2, - "description": "Language pack for Thunderbird for ka" + "manifest_version": 2 } diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/calendar/calendar.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/calendar/calendar.properties index a8f3a3b3783141b501f27d3218c9076c9ac32fdc..5e02b850fba9802842ee20054d27d654d5ca46b4 100644 --- a/thunderbird-l10n/kab/chrome/kab/locale/kab/calendar/calendar.properties +++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/calendar/calendar.properties @@ -325,7 +325,7 @@ caldavResponseError=Teḍra-d tucḍa lawan n uciyaε n tririt. caldavRequestStatusCode=Tangalt n waddad: %1$S caldavRequestStatusCodeStringGeneric=Asuter ur izmir ara ad yeddu. caldavRequestStatusCodeString400=Asuter ur ittwaru yara akken iwata ɣef aya ur izmir ara ad yeddu. -caldavRequestStatusCodeString403=Aseqdac ur ɣu-s ara tisirag ilaqen akken ad iselkem tuttra. +caldavRequestStatusCodeString403=Aseqdac ur ɣur-s ara tisirag akken ad iselkem tuttra. caldavRequestStatusCodeString404=Taɣbalut ulac-itt caldavRequestStatusCodeString409=Tilla di teɣbalut. caldavRequestStatusCodeString412=Tawtilt tuzwirt ur teddi ara. diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/chat/irc.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/chat/irc.properties index d8fdce002cb1271cc689c639c81e77d35a287c61..ef625c36fb49a58beb7714c3a38ca3503c119624 100644 --- a/thunderbird-l10n/kab/chrome/kab/locale/kab/chat/irc.properties +++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/chat/irc.properties @@ -133,10 +133,10 @@ message.unknownNick=%S d meffer isem arussin. message.channelKeyAdded=%1$S isnifel awall uffir n ubadu ɣeṛ %2$S. message.channelKeyRemoved=%S ikkes awal uffir n ubadu. # This will be followed by a list of ban masks. -message.banMasks=Iseqdacen id yeqqnen si tansiwin-agi ttawagedlen si %S: +message.banMasks=Iseqdacen i d-yeqqnen si tansiwin-agi ttawagedlen si %S: message.noBanMasks=Ulac tnasa ittwagedlen i %S. -message.banMaskAdded=Iseqdacen id yeqqnen si tansiwin imeɣṛan %1$S ttawagedlen si %2$S. -message.banMaskRemoved=Iseqdacen id yeqqnen si tansiwin-agi imeɣṛan %1$S ur ttawagedlen ara si %2$S. +message.banMaskAdded=Iseqdacen i d-yeqqnen si tansiwin n iimeɣran %1$S ttawagedlen si %2$S. +message.banMaskRemoved=Iseqdacen i d-yeqqnen si tansiwin-agi n yimeɣra %1$S ur ttawagedlen ara si %2$S. # LOCALIZATION NOTE (message.ping): Semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # %1$S is the nickname of the user or the server that was pinged. diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/chat/xmpp.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/chat/xmpp.properties index 0b80937aae545f3da254a1850d97acc522c73450..a37ad5723c03733cf3c08c96c1da01a6815454c2 100644 --- a/thunderbird-l10n/kab/chrome/kab/locale/kab/chat/xmpp.properties +++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/chat/xmpp.properties @@ -34,7 +34,7 @@ connection.error.notSendingPasswordInClear=Aqeddac isefrak kan aseseteb s tuzzna connection.error.authenticationFailure=Aseseteb ur yeddi ara connection.error.notAuthorized=Ur yettusireg ara (Ahat tmuddeḍ awal uffir mačči d ameɣtu?) connection.error.failedToGetAResource=Ur yessaweḍ ara ad d-yawi taɣbalut -connection.error.failedMaxResourceLimit=Amiḍan-agi yeqqen si deqs n imedqan deg iwet n tikelt. +connection.error.failedMaxResourceLimit=Amiḍan-agi yeqqen si ddeqs n yimeḍqan deg yiwet n tikkelt. connection.error.failedResourceNotValid=Taɣbalut mačči d tameɣtut. connection.error.XMPPNotSupported=Aqeddac-agi ur yessefrak ara XMPP @@ -110,7 +110,6 @@ tooltip.title=Azwel tooltip.organization=Takebbanit tooltip.locality=Tamnaṭ tooltip.country=Tamurt - tooltip.telephone=Uṭṭun n tiliɣṛi # LOCALIZATION NOTE (chatRoomField.*): diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/inspector.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/inspector.properties index 5d587f647a654a3bd3ac94d5a839b76d8254696f..de36ec13cc34ca166835011a78d8a9520d053dc9 100644 --- a/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/inspector.properties +++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Tzemred ad tsedrurmeḍ aḥric i yefaḍen s # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Ulac alugan icudden +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Ttekki ɣef Shift tessiteḍ akken ad tneggzeḍ ɣer ulugen. + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/scratchpad.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/scratchpad.properties index 9d50cc50ef9c9c52d6f5891cc7c1dfe719ed96e6..9f7dd3bb42b69e1de4905e5fcad0d3a5dbcf9698 100644 --- a/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/scratchpad.properties +++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/scratchpad.properties @@ -17,7 +17,7 @@ export.fileOverwriteConfirmation=Afaylu yella. Ad tsemselsiḍ-t? # LOCALIZATION NOTE (browserWindow.unavailable): This error message is shown # when Scratchpad does not find any recently active main browser window. -browserWindow.unavailable=Tacirra JavaScript ur d-tuffi ara asfaylu n iminig urmid anda tettuselkam tengalt. +browserWindow.unavailable=Tacirra JavaScript ur d-tufi ara asfaylu n yiminig urmid anda tettuselkam tengalt. # LOCALIZATION NOTE (scratchpadContext.invalid): This error message is shown # when user tries to run an operation in Scratchpad in an unsupported context. diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/global/css.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/global/css.properties index bcc885296c8f0f413c84ef5ed542e78fc94df5a9..ac664ceaadd522d93c79f753f2f3610b4ed5b8f5 100644 --- a/thunderbird-l10n/kab/chrome/kab/locale/kab/global/css.properties +++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/global/css.properties @@ -180,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Ala yiwen n repeat(auto-fill, …) i y PEMoreThanOneGridRepeatAutoFillFitInTrackList=Ala yiwen repeat(auto-fill, …) neɣ repeat(auto-fit, …) i yettwasirgen deg tebdart n uḍfaṛ. PEMoreThanOneGridRepeatTrackSize=Ala yiwet n teɣzi n uḍfaṛ i yettwasirgen deg ugensu n repeat(auto-fit/auto-fill, …). +PEDisallowedImportRule=Ilugan @import mačči d imeɣta akka tura deg tferikiyin n uɣanib yettwabnan. + TooLargeDashedRadius=Border radius is too large for ‘dashed’ style (the limit is 100000px). Rendering as solid. TooLargeDottedRadius=Border radius is too large for ‘dashed’ style (the limit is 100000px). Rendering as solid. diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/global/security/security.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/global/security/security.properties index f902cf04aec803519f6b2f65da24bc6fe5664280..02f6a8651ab2b5425b5d535fb69281fa3ae114cf 100644 --- a/thunderbird-l10n/kab/chrome/kab/locale/kab/global/security/security.properties +++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Asali igdel-it X-Frame-Options: “%1$S” ɣer “%2$S”, asmel ur i # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Asali igdel-it X-Frame-Options: “%1$S” ɣer “%2$S”, asmel ur ittaǧǧa ara aseqdec n yikataren cross-origin seg “%3$S”. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Yiwen uqeṛṛu X-Frame-Options arameɣtu yettwaf-d mi id-yettali “%2$S” : “%1$S” ur telli ara d tazunfalit tameɣtut. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=Asali n “%2$S” deg ukatar tegdel-it tzunfalit “ X-Frame-Options“ yettwasbadun ɣer “%1$S“. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Aleqqem n tuttra taraɣelsant “%1$S” akken ad tesseqdec “%2$S”. diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/messenger.dtd b/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/messenger.dtd index b2262258ded5f97c27a0766d7a95e499331e47bc..6f4aa8139bfab021e3653c88e2d3c78fa8b3ad19 100644 --- a/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/messenger.dtd +++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Nadi iznan di…"> <!ENTITY searchMailCmd.accesskey "d"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Anadi amatu..."> +<!ENTITY glodaSearchCmd.accesskey "G"> <!ENTITY searchAddressesCmd.label "Nadi tansiwin…"> <!ENTITY searchAddressesCmd.accesskey "d"> diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/pgpmime.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/pgpmime.properties index d88a633d8273be1f94d41d7d632bfc666c4429da..3eb8f9822f9e99cdcea45636cf00056c1d64a814 100644 --- a/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/pgpmime.properties +++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=Wagi d izen awgelhan OpenPGP.<br>Akke ad yettwazmek yimayl-agi, tesriḍ ad tesbeddeḍ <a href="%S"> Azegrir OpenPGP</a>. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Aya d izen OpenPGP awgelhen, maaca tallelt i tukksa n uweglhen OpenPGP ulac-itt. diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/preferences/advanced.dtd b/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/preferences/advanced.dtd index 5ce47540a677c4d5c30fb235e450db2f01ee3caf..7f9626b3a0cb9742ac397ab533785719e44b19d3 100644 --- a/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/preferences/advanced.dtd +++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/preferences/advanced.dtd @@ -42,7 +42,7 @@ <!-- Data Choices --> <!ENTITY telemetrySection.label "Tilisɣelt"> -<!ENTITY telemetryDesc.label "Ad yebḍu isefka n timellit, aseqdec, arrum d usugenn n umsaq-inek n tirawt akked &vendorShortName; akken aɣ-d-yefk tallalt i usnerni d useggem n &brandShortName;"> +<!ENTITY telemetryDesc.label "Bḍu isefka n tmellit, n useqdec, n warrum d waggan n yifecka yeɛnan amsaɣ-inek n yimayl s &vendorShortName; akken ad aɣ-talleḍ ad nerr &brandShortName; ifaz"> <!ENTITY enableTelemetry.label "Rmed tilisɣelt"> <!ENTITY enableTelemetry.accesskey "l"> <!ENTITY telemetryLearnMore.label "Issin ugar"> diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/search-operators.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/search-operators.properties index 79bdc45e7ea6ab75725d2de34816adfabc4ddfd1..1ca8adbd809cba1a0b396769b343ebd4fd3842d1 100644 --- a/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/search-operators.properties +++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/search-operators.properties @@ -10,7 +10,7 @@ 5=send 6=enld - + 7=yugar 8=daw @@ -28,4 +28,4 @@ 17=ulac-it deg imedlis-iw n tensa 18=mačči d ilem 19=imeɣra -20=ur imeqri ara +20=ur imcuba ara diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/necko/necko.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/necko/necko.properties index b8652cbeb2549a2365e29b81d0954a0ab8966e9a..253fcf7b40ca33021a74dc9319f89f81f0c7f724 100644 --- a/thunderbird-l10n/kab/chrome/kab/locale/kab/necko/necko.properties +++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Anekcum Ɣer uklas ittusireg s wudem # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Anekcum Ɣer uklas ittusireg s wudem awurman i uneḍfar “%2$S” deg “%1$S”. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Anekcum ɣer uklas yettusireg s wudem awurman i uɛzal n uḥric amezwaru "%2$S" deg "%1$S". + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Anagi n tuqqna “%1$S” yettwagi acku amyerr “sameSite=none” maca mačči imyerr “secure”. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/kab/localization/kab/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/kab/localization/kab/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..e4ea553606fdb6c828aeb1dfa6ad65866201843b --- /dev/null +++ b/thunderbird-l10n/kab/localization/kab/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Wehhi URL n uwitay +calendar-uri-redirect-description = + Aqeddac iwehha URL ɣer uwitay "{ $calendarName }". + Qbel awehhi, tebduḍ aseqdec n URI amaynut i uwitay-a? +calendar-uri-redirect-original-uri-label = URI amiran: +calendar-uri-redirect-target-uri-label = Awehhi ɣer URI amaynut: diff --git a/thunderbird-l10n/kab/localization/kab/messenger/accountCentral.ftl b/thunderbird-l10n/kab/localization/kab/messenger/accountCentral.ftl index 14c58bc444a5e4df361e038477c937cd38749f28..2a0626cc0550d402b090b0c6e5facb21ec988752 100644 --- a/thunderbird-l10n/kab/localization/kab/messenger/accountCentral.ftl +++ b/thunderbird-l10n/kab/localization/kab/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Ansuf ɣer { -brand-full-name } +account-settings = Iɣewwaṛen n umiḍan +# $accounts (Number) - the number of configured accounts setup-title = Fren iferdisen ara yemtawin about-title = Ɣef { -brand-full-name } resources-title = Tiɣbula @@ -42,3 +44,10 @@ explore-link = Snirem timahilin support-link = Tallelt involved-link = Ttekki developer-link = Tasemlit n uneflay +read = Ɣer iznan +compose = Aru izen amaynut +search = Nadi iznan +filter = Sefrek imsizdigen n yizen +nntp-subscription = Sefrek amulteɣ n ugraw n yisallen +rss-subscription = Sefrek amulteɣ n usuddem +e2e = Awgelhen seg yixef ɣer wayeḍ diff --git a/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutAddons.ftl index cd896e1f3d427140e5b549640c55ce77b256950c..205c2b50332a9bc2790a0d7fd78ac1b6f3725ca5 100644 --- a/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Sebded azegrir seg ufaylu… .accesskey = S help-button = Tallelt izegrar +sidebar-help-button-title = + .title = Tallelt izegrar preferences = { PLATFORM() -> [windows] Iɣewwaren n { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Ifecka i yizegrar imaṛṛa +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Iɣewwaren n { -brand-short-name } + *[other] Ismenyifen n { -brand-short-name } + } show-unsigned-extensions-button = .label = Kra n iseɣzaf ur ţwasenqeden ara show-all-extensions-button = @@ -168,13 +176,29 @@ extensions-view-available-updates = .name = Ileqman yellan .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Iwellihen +addon-category-discover-title = + .title = Iwellihen addon-category-extension = Isiɣzaf +addon-category-extension-title = + .title = Isiɣzaf addon-category-theme = Isental +addon-category-theme-title = + .title = Isental addon-category-plugin = Izegrar +addon-category-plugin-title = + .title = Izegrar addon-category-dictionary = Imawalen +addon-category-dictionary-title = + .title = Imawalen addon-category-locale = Tutlayin +addon-category-locale-title = + .title = Tutlayin addon-category-available-updates = Ileqman yellan +addon-category-available-updates-title = + .title = Ileqman yellan addon-category-recent-updates = Ileqman n melmi kan +addon-category-recent-updates-title = + .title = Ileqman n melmi kan ## These are global warnings @@ -287,6 +311,7 @@ shortcuts-no-commands = Isiɣzaf id-iteddun ur sɛin ara inegzumen: shortcuts-input = .placeholder = Sekcem anegzum shortcuts-browserAction = Rmed isiɣzaf +shortcuts-browserAction2 = Rmed taqeffalt n ufeggag n yifecka shortcuts-pageAction = Rmed tigawt n usebter shortcuts-sidebarAction = Sken/Fer agalis adisan shortcuts-modifier-mac = Seddu Ctrl, Alt, neɣ ⌘ @@ -312,6 +337,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Sken qel go-back-button = .tooltiptext = Uɣal ɣer deffir +header-back-button = + .title = Uɣal ɣer deffir ## Recommended add-ons page diff --git a/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutSupport.ftl index 0fb6dbee2e37c07fb5ebda4de07f911256dd002f..592db6bbf4a0ee7a24f251fe073905849c42fad1 100644 --- a/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutSupport.ftl @@ -287,6 +287,11 @@ sandbox-proc-type-content = agbur sandbox-proc-type-file = agbur n ufaylu sandbox-proc-type-media-plugin = asiɣzef n wallen n teywalt sandbox-proc-type-data-decoder = akestengal n yisefka +startup-cache-title = Tanekkra tuffirt +startup-cache-disk-cache-path = Abrid n uḍbsi n tuffra +startup-cache-ignore-disk-cache = Eǧǧ aḍebsi n tuffra +startup-cache-found-disk-cache-on-init = Aḍebsi n tuffra yettwaf deg Init +startup-cache-wrote-to-disk-cache = Aru deg uḍebsi n tuffra launcher-process-status-0 = Irmed launcher-process-status-1 = Yensa ɣef sebba n tuccḍa launcher-process-status-2 = Arurmid s tedusi @@ -310,6 +315,7 @@ touch-enabled = anekcum amennalan irmed drag-enabled = Adrurem nufeggag yettwarmed keyboard-enabled = anasiw yermed autoscroll-enabled = Adrurem awurman yermed +zooming-enabled = smooth pinch-zoom yermed ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutTelemetry.ftl b/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutTelemetry.ftl index 5947b0883442aa54139df6f7c64c26a8a3466d8f..b75b4aa672693f414679a74958576271da17ce50 100644 --- a/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutTelemetry.ftl +++ b/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutTelemetry.ftl @@ -19,7 +19,7 @@ about-telemetry-page-title = Isefka n tilisɣelt about-telemetry-current-store = Tahanut tamirant: about-telemetry-more-information = Tettnadiḍ ugar n telγut? about-telemetry-firefox-data-doc = <a data-l10n-name="data-doc-link">Tisemlit n isefka Firefox</a> tegber imniren γef amek ad nseqdec s ifecka n isefka. -about-telemetry-telemetry-client-doc = <a data-l10n-name="client-doc-link">Tisemlit n umsaγ tilisγelt</a>tegber tabadut yef tiktiwin, API tisemlit akked isefka ittwamlen. +about-telemetry-telemetry-client-doc = <a data-l10n-name="client-doc-link">Tisemlit n umsaγ tilisγelt</a>tegber tabadutin yef tiktiwin, API tisemlit akked isefka ittwamlen. about-telemetry-telemetry-dashboard = <a data-l10n-name="dashboard-link">Tafelwit n tilisγelt</a> ad k-tsireg akken ad twaliḍ isefka ittwaznen i Mozilla s ttawil n tilispyelt. about-telemetry-telemetry-probe-dictionary = <a data-l10n-name="probe-dictionary-link">Amawal n usenqed</a> ittmuddu-d talqayt akked uglam i isenqaden id-telqeḍ tilisɣelt. about-telemetry-show-in-Firefox-json-viewer = Ldi deg umeskan JSON diff --git a/thunderbird-l10n/kab/localization/kab/toolkit/about/certviewer.ftl b/thunderbird-l10n/kab/localization/kab/toolkit/about/certviewer.ftl index e734e1d31e84b8fe0a8a32970372bd3935f45c41..9bafd9532325e550038b09987a5075599cca2078 100644 --- a/thunderbird-l10n/kab/localization/kab/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/kab/localization/kab/toolkit/about/certviewer.ftl @@ -80,7 +80,7 @@ certificate-viewer-embedded-scts = SCT usliɣ certificate-viewer-crl-endpoints = Agazen n tagara CRL # This message is used as a row header in the Miscellaneous section. # The associated data cell contains links to download the certificate. -certificate-viewer-download = Sider +certificate-viewer-download = Sader # This message is used to replace boolean values (true/false) in several certificate fields, e.g. Certificate Authority # Variables: # $boolean (String) - true/false value for the specific field @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (chain) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Asiɣzef-agi yettwacreḍ d uzɣin, ayagi yebɣa ad d-yini dakken ilaq imsaɣen ad agin aselkin ma yella ur tegzin ara. +certificate-viewer-export = Kter + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Iselkinen-ik(im) +certificate-viewer-tab-people = Medden +certificate-viewer-tab-servers = Iqeddacen +certificate-viewer-tab-ca = Iduba +certificate-viewer-tab-unkonwn = Arussin diff --git a/thunderbird-l10n/kab/localization/kab/toolkit/global/processTypes.ftl b/thunderbird-l10n/kab/localization/kab/toolkit/global/processTypes.ftl index 24aaeefdfdcace314be1e080b9503ca8c33195f5..90acda52b085e7186c539b25663642c441d774d2 100644 --- a/thunderbird-l10n/kab/localization/kab/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/kab/localization/kab/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Agbur web yettwaɛezlen # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Agrudmawan diff --git a/thunderbird-l10n/kab/localization/kab/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/kab/localization/kab/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..3c274e55984132e199ab21a259ca080af3675ee8 --- /dev/null +++ b/thunderbird-l10n/kab/localization/kab/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Tessenkkreḍ lqem aqbuṛ n { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Rnu amaɣnu amaynut +profiledowngrade-sync = Aseqdec n lqem aqbuṛ n { -brand-product-name } izmer ad isexseṛ ticraḍ n yisebtar akked uzray n tunigin i yettwaskelsen yakan deg umaɣnu { -brand-product-name } yellan. Akken ad tettummesten telɣut-ik, rnu amaqnu amaynut i usebeddi-a n { -brand-short-name }. Tzemreḍ yal tikkelt ad teqqneḍ s { -fxaccount-brand-name } akken ad temtawiḍ ticraḍ-ik n yisebtar akked uzray n tunigin gar yimuɣna. +profiledowngrade-nosync = Aseqdec n lqem aqbuṛ n { -brand-product-name } izmer ad isexseṛ ticraḍ n yisebtar akked uzray n tunigin i yettwaskelsen yakan deg umaɣnu { -brand-product-name } yellan. Akken ad tettummesten telɣut-ik, rnu amaqnu amaynut i usebeddi-a n { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Ffeɣ + *[other] Ffeɣ + } diff --git a/thunderbird-l10n/kab/localization/kab/toolkit/printing/printPreview.ftl b/thunderbird-l10n/kab/localization/kab/toolkit/printing/printPreview.ftl index 074a38de9ffbabdba369e3d9e2e255efe59d5e4c..bc05e42df5dd1c9120776fd1f1c25cf313f208d9 100644 --- a/thunderbird-l10n/kab/localization/kab/toolkit/printing/printPreview.ftl +++ b/thunderbird-l10n/kab/localization/kab/toolkit/printing/printPreview.ftl @@ -9,7 +9,7 @@ printpreview-simplify-page-checkbox = printpreview-simplify-page-checkbox-enabled = .label = { printpreview-simplify-page-checkbox.label } .accesskey = { printpreview-simplify-page-checkbox.accesskey } - .tooltiptext = Snifek taneɣruft i tɣuri fessusen + .tooltiptext = Snifel taneɣruft i tɣuri fessusen printpreview-close = .label = Mdel .accesskey = M diff --git a/thunderbird-l10n/kab/manifest.json b/thunderbird-l10n/kab/manifest.json index 335cdbd60780748986aae659302f4c0d9c4c7609..5e614e6e2c1f10f45a2da5b61bf2dd48cabded2e 100644 --- a/thunderbird-l10n/kab/manifest.json +++ b/thunderbird-l10n/kab/manifest.json @@ -1,57 +1,57 @@ { "name": "Taqbaylit Language Pack", - "version": "76.0buildid20200407173003", + "version": "76.0buildid20200420212409", + "sources": { + "browser": { + "base_path": "browser/" + } + }, + "description": "Language pack for Thunderbird for kab", "languages": { "kab": { - "version": "20200405203521", + "version": "20200420102502", "chrome_resources": { - "communicator": "chrome/kab/locale/kab/communicator/", - "pluginproblem": "chrome/kab/locale/kab/pluginproblem/", - "messenger-mapi": "chrome/kab/locale/kab/messenger-mapi/", - "messenger-newsblog": "chrome/kab/locale/kab/messenger-newsblog/", - "global": "chrome/kab/locale/kab/global/", "devtools": "chrome/kab/locale/kab/devtools/client/", - "devtools-startup": "chrome/kab/locale/kab/devtools/startup/", + "mozapps": "chrome/kab/locale/kab/mozapps/", + "branding": "chrome/kab/locale/kab/branding/", + "messenger-region": "chrome/kab/locale/kab/messenger-region/", + "chat": "chrome/kab/locale/kab/chat/", + "global": "chrome/kab/locale/kab/global/", + "mozldap": "chrome/kab/locale/kab/mozldap/", + "devtools-shared": "chrome/kab/locale/kab/devtools/shared/", + "passwordmgr": "chrome/kab/locale/kab/passwordmgr/", + "messenger-mapi": "chrome/kab/locale/kab/messenger-mapi/", + "alerts": "chrome/kab/locale/kab/alerts/", "messenger-smime": "chrome/kab/locale/kab/messenger-smime/", + "devtools-startup": "chrome/kab/locale/kab/devtools/startup/", + "pippki": "chrome/kab/locale/kab/pippki/", "global-platform": { - "win": "chrome/kab/locale/kab/global-platform/win/", + "macosx": "chrome/kab/locale/kab/global-platform/mac/", "linux": "chrome/kab/locale/kab/global-platform/unix/", "android": "chrome/kab/locale/kab/global-platform/unix/", - "macosx": "chrome/kab/locale/kab/global-platform/mac/" + "win": "chrome/kab/locale/kab/global-platform/win/" }, + "messenger-newsblog": "chrome/kab/locale/kab/messenger-newsblog/", + "pluginproblem": "chrome/kab/locale/kab/pluginproblem/", "lightning": "chrome/kab/locale/kab/lightning/", - "messenger-region": "chrome/kab/locale/kab/messenger-region/", - "mozapps": "chrome/kab/locale/kab/mozapps/", - "chat": "chrome/kab/locale/kab/chat/", - "alerts": "chrome/kab/locale/kab/alerts/", - "pippki": "chrome/kab/locale/kab/pippki/", - "devtools-shared": "chrome/kab/locale/kab/devtools/shared/", - "passwordmgr": "chrome/kab/locale/kab/passwordmgr/", - "mozldap": "chrome/kab/locale/kab/mozldap/", - "necko": "chrome/kab/locale/kab/necko/", - "pipnss": "chrome/kab/locale/kab/pipnss/", - "branding": "chrome/kab/locale/kab/branding/", "messenger": "chrome/kab/locale/kab/messenger/", "calendar": "chrome/kab/locale/kab/calendar/", "autoconfig": "chrome/kab/locale/kab/autoconfig/", - "places": "chrome/kab/locale/kab/places/" + "pipnss": "chrome/kab/locale/kab/pipnss/", + "places": "chrome/kab/locale/kab/places/", + "necko": "chrome/kab/locale/kab/necko/", + "communicator": "chrome/kab/locale/kab/communicator/" } } }, + "manifest_version": 2, + "author": "mozilla.org (contributors: Belkacem Mohammed)", "applications": { "gecko": { + "strict_min_version": "76.0", "id": "langpack-kab@thunderbird.mozilla.org", - "strict_max_version": "76.*", - "strict_min_version": "76.0" + "strict_max_version": "76.*" } }, - "sources": { - "browser": { - "base_path": "browser/" - } - }, - "manifest_version": 2, - "description": "Language pack for Thunderbird for kab", - "langpack_id": "kab", - "author": "mozilla.org (contributors: Belkacem Mohammed)" + "langpack_id": "kab" } diff --git a/thunderbird-l10n/kk/chrome/kk/locale/kk/calendar/calendar.dtd b/thunderbird-l10n/kk/chrome/kk/locale/kk/calendar/calendar.dtd index 1fe6fe9460f259c192c67db825bf887f3b194838..72b191b17993add5091252fc6d0be48dc74c997a 100644 --- a/thunderbird-l10n/kk/chrome/kk/locale/kk/calendar/calendar.dtd +++ b/thunderbird-l10n/kk/chrome/kk/locale/kk/calendar/calendar.dtd @@ -10,6 +10,7 @@ <!ENTITY calendar.newtask.button.tooltip "Жаңа тапсырманы жасау" > <!ENTITY calendar.unifinder.todoitems.label "Тапсырмалар" > + <!ENTITY calendar.unifinder.showcompletedtodos.label "Аяқталған тапсырмаларды көрсету"> <!ENTITY calendar.today.button.label "Бүгін"> @@ -178,8 +179,6 @@ <!ENTITY calendar.context.attendance.menu.label "Қатысу"> <!ENTITY calendar.context.attendance.menu.accesskey "т"> <!ENTITY calendar.context.attendance.occurrence.label "Бұл қайталануы"> -<!ENTITY calendar.context.attendance.all.label "Бүкіл кездерін" > - <!ENTITY calendar.context.attendance.all2.label "Оқиғалардың барлық қайталанулары"> <!ENTITY calendar.context.attendance.send.label "Ескертуді қазір жіберу"> <!ENTITY calendar.context.attendance.send.accesskey "ж"> @@ -366,6 +365,7 @@ <!ENTITY calendarproperties.firealarms.label "Еске салуларды көрсету"> <!ENTITY calendarproperties.cache3.label "Желіден тыс қолдау"> <!ENTITY calendarproperties.enabled.label "Бұл күнтізбені іске қосу"> +<!ENTITY calendarproperties.enabled2.label "Бұл күнтізбені іске қосу"> <!ENTITY calendarproperties.forceDisabled.label "Бұл күнтізбенің ұсынушысын табу мүмкін емес. Бұл кейбір қосымшалар сөндірілген немесе өшірілген кезде болуы мүмкін."> <!ENTITY calendarproperties.unsubscribe.label "Жазылудан бас тарту"> <!ENTITY calendarproperties.unsubscribe.accesskey "б"> diff --git a/thunderbird-l10n/kk/chrome/kk/locale/kk/calendar/preferences/preferences.dtd b/thunderbird-l10n/kk/chrome/kk/locale/kk/calendar/preferences/preferences.dtd index 492a17a4f9fdea2fb72b72fb4151057d792c827d..4e342778407c507a858f3a4cc26c073c01b23b1d 100644 --- a/thunderbird-l10n/kk/chrome/kk/locale/kk/calendar/preferences/preferences.dtd +++ b/thunderbird-l10n/kk/chrome/kk/locale/kk/calendar/preferences/preferences.dtd @@ -8,4 +8,4 @@ <!ENTITY paneViews.title "Көріністер"> <!ENTITY panelHeader.title "Күнтізбе"> <!ENTITY panelReminder.title "Еске салулар"> -<!ENTITY panelCatecory.title "Санаттар"> +<!ENTITY panelCategory.title "Санаттар"> diff --git a/thunderbird-l10n/kk/chrome/kk/locale/kk/lightning/lightning.dtd b/thunderbird-l10n/kk/chrome/kk/locale/kk/lightning/lightning.dtd index 5edc9c9eed8c1301d1b26ba8455c4f260e2fe68f..7815f908ea9880022c8b7fbc71b27df6c5a27dcd 100644 --- a/thunderbird-l10n/kk/chrome/kk/locale/kk/lightning/lightning.dtd +++ b/thunderbird-l10n/kk/chrome/kk/locale/kk/lightning/lightning.dtd @@ -23,6 +23,8 @@ <!ENTITY lightning.menupopup.open.accesskey "А"> <!ENTITY lightning.menupopup.open.message.label "Сақталған хабарлама…"> <!ENTITY lightning.menupopup.open.message.accesskey "л"> + +<!-- Open menu popup in File menu --> <!ENTITY lightning.menupopup.open.calendar.label "Күнтізбе файлы…"> <!ENTITY lightning.menupopup.open.calendar.accesskey "К"> @@ -67,6 +69,9 @@ <!ENTITY lightning.imipbar.btnDelete.tooltiptext "Күнтізбеден өшіру"> <!ENTITY lightning.imipbar.btnDetails.label "Көбірек білу…"> <!ENTITY lightning.imipbar.btnDetails.tooltiptext "Оқиға ақпаратын көрсету"> +<!ENTITY lightning.imipbar.btnDoNotShowImipBar.label "Бұл хабарларламаларды маған көрсетпеу"> +<!ENTITY lightning.imipbar.btnGoToCalendar.label "Күнтізбе"> +<!ENTITY lightning.imipbar.btnGoToCalendar.tooltiptext "Күнтізбе бетіне ауысу"> <!ENTITY lightning.imipbar.btnMore.label "Көбірек"> <!ENTITY lightning.imipbar.btnMore.tooltiptext "Көбірек опцияларды көрсету үшін шертіңіз"> <!ENTITY lightning.imipbar.btnReconfirm2.label "Қайта растау"> diff --git a/thunderbird-l10n/kk/chrome/kk/locale/kk/lightning/lightning.properties b/thunderbird-l10n/kk/chrome/kk/locale/kk/lightning/lightning.properties index 41ae672da8893b3d4224b734d8fa247e918cca16..f3d617b62963859752f5aed029722fd6d09a2995 100644 --- a/thunderbird-l10n/kk/chrome/kk/locale/kk/lightning/lightning.properties +++ b/thunderbird-l10n/kk/chrome/kk/locale/kk/lightning/lightning.properties @@ -142,29 +142,22 @@ imipBarReplyToNotExistingItem=Бұл хабарламада сіздің күн imipBarReplyToRecentlyRemovedItem=Бұл хабарламада сіздің күнтізбеңізден %1$S өшірілген оқиғаға сілтейтін жауап бар. imipBarUnsupportedText=Бұл хабарламада Lightning бұл нұсқасы өңдей алмайтын оқиға бар. imipBarProcessingFailed=Хабарламаны өңдеу сәтсіз аяқталды. Қалып-күйі: %1$S. +imipBarCalendarDeactivated=Бұл хабарламада оқиға туралы ақпарат бар. Оны өңдеу үшін күнтізбені іске қосыңыз. imipBarNotWritable=Шақырулар үшін ешбір күнтізбе бапталмаған, күнтізбе қасиеттерін тексеріңіз. imipSendMail.title=Эл. поштамен хабарландыру imipSendMail.text=Хабарландыру эл. поштасын қазір жіберуді қалайсыз ба? imipNoIdentity=Ешнәрсе imipNoCalendarAvailable=Жазуға болатын бірде-бір қолжетерлік күнтізбе жоқ. -itipReplySubject=Оқиғаға шақыруға жауап: %1$S - itipReplySubject2=Шақыруға жауап: %1$S itipReplyBodyAccept=%1$S сіздің оқиғаға шақыруыңызды қабылдады. itipReplyBodyDecline=%1$S сіздің оқиғаға шақыруыңызды тайдырды. -itipReplySubjectAccept=Оқиғаға шақыруға жауап (қабылданды): %1$S -itipReplySubjectDecline=Оқиғаға шақыруға жауап (тайдырылды): %1$S -itipReplySubjectTentative=Оқиғаға шақыруға жауап (мүмкін деп): %1$S -itipRequestSubject=Оқиғаға шақыру: %1$S -itipRequestUpdatedSubject=Жаңартылған оқиғаға шақыру: %1$S itipReplySubjectAccept2=Қабылданды: %1$S itipReplySubjectDecline2=Шақыру тайдырылды: %1$S itipReplySubjectTentative2=Мүмкін деп: %1$S itipRequestSubject2=Шақыру: %1$S itipRequestUpdatedSubject2=Жаңартылды: %1$S itipRequestBody=%1$S сізді %2$S қатысуға шақырды -itipCancelSubject=Оқиғадан бас тартылды: %1$S itipCancelSubject2=Бас тартылды: %1$S itipCancelBody=%1$S бұл оқиғаны бас тартылған етті: %2$S itipCounterBody=%1$S "%2$S" үшін кері ұсынысты жасады: @@ -203,27 +196,5 @@ binaryComponentUnknown=%1$S үшін керек бинарлық құраман # %1$S - The Lightning brand name, from the brandShortName string above. binaryComponentTitle=%1$S нұсқасы сәйкес келмейді -# LOCALIZATION_NOTE(integrationLabel): Used by the notification bar shown when -# Lightning is installed from the distribution folder. To trigger it, start a -# new profile without Lightning in a previous Thunderbird version, then upgrade -# to a Thunderbird that has Lightning packaged. See bug 1130852 for details. -integrationLabel=%1$S құрамында енді %2$S кеңейтудің енуі көмегімен күнтізбе мүмкіндіктері бар. -integrationLearnMoreButton=Көбірек білу -integrationLearnMoreAccessKey=л -integrationOptOutButton=Сөндіру -integrationOptOutAccessKey=д -integrationKeepItButton=Қалдыру -integrationKeepItAccessKey=л - -# LOCALIZATION_NOTE(integrationRestartLabel): At the current time its not yet -# clear if we will be completely uninstalling Lightning or disabling it. Please -# translate this string in a general manner, so that it makes sense for both -# options. -integrationRestartLabel=%1$S сіз келесі рет %2$S қайта іске қосқан кезде өшірілетін болады. Сіз оны кейін де, Қосымшалар басқарушысын қолданып, орната аласыз. -integrationRestartButton=Қазір қайта қосу -integrationRestartAccessKey=й -integrationUndoButton=Болдырмау -integrationUndoAccessKey=ы - # LOCALIZATION NOTE(noIdentitySelectedNotification): noIdentitySelectedNotification=Бұл күнтізбеде басқа адамдарға жіберілетін немесе олардан келген шақыруларды сақтауды қаласаңыз, төменде эл. пошта адресіңізді көрсетуіңіз керек. diff --git a/thunderbird-l10n/kk/localization/kk/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/kk/localization/kk/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..2a5e5719ea6449ed7227ef3c8e2cd8280a2b2d7e --- /dev/null +++ b/thunderbird-l10n/kk/localization/kk/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Күнтізбе URI-ін қайта бағыттау +calendar-uri-redirect-description = + Сервер "{ $calendarName }" күнтізбе URI-ін қайта бағыттауда. + Қайта бағыттауды қабылдап, бұл күнтізбе үшін жаңа URI қолданып бастау керек пе? +calendar-uri-redirect-original-uri-label = Ағымдағы URI: +calendar-uri-redirect-target-uri-label = Жаңа URI-ге қайта бағыттау: diff --git a/thunderbird-l10n/kk/localization/kk/calendar/calendar-widgets.ftl b/thunderbird-l10n/kk/localization/kk/calendar/calendar-widgets.ftl new file mode 100644 index 0000000000000000000000000000000000000000..1e00697fd8d72261b6ca97b9753f9ece78b0fbe4 --- /dev/null +++ b/thunderbird-l10n/kk/localization/kk/calendar/calendar-widgets.ftl @@ -0,0 +1,6 @@ +# 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/. + +calendar-deactivated-notification-events = Барлық күнтізбелер қазір сөндірілген. Оқиғаларды қосу немесе түзету үшін бар болып тұрған күнтізбені іске қосыңыз, немесе жаңасын қосыңыз. +calendar-deactivated-notification-tasks = Барлық күнтізбелер қазір сөндірілген. Тапсырмаларды қосу немесе түзету үшін бар болып тұрған күнтізбені іске қосыңыз, немесе жаңасын қосыңыз. diff --git a/thunderbird-l10n/kk/localization/kk/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/kk/localization/kk/toolkit/about/aboutAddons.ftl index 6bceb6d5c99d56d0f935e62d9f7cc42ec268cea3..7c54bb59fd552481ffffff20577b0c8b9c949d90 100644 --- a/thunderbird-l10n/kk/localization/kk/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/kk/localization/kk/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Файлдан қосымшаны орнату… .accesskey = Ф help-button = Қосымшаларды қолдау +sidebar-help-button-title = + .title = Қосымшаларды қолдау preferences = { PLATFORM() -> [windows] { -brand-short-name } опциялары @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Барлық қосымшалар үшін құралдар +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } опциялары + *[other] { -brand-short-name } баптаулары + } show-unsigned-extensions-button = .label = Кейбір кеңейтулерді растау мүмкін емес show-all-extensions-button = @@ -163,13 +171,29 @@ extensions-view-available-updates = .name = Қолжетерлік жаңартулар .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Ұсыныстар +addon-category-discover-title = + .title = Ұсыныстар addon-category-extension = Кеңейтулер +addon-category-extension-title = + .title = Кеңейтулер addon-category-theme = Темалар +addon-category-theme-title = + .title = Темалар addon-category-plugin = Плагиндер +addon-category-plugin-title = + .title = Плагиндер addon-category-dictionary = Сөздіктер +addon-category-dictionary-title = + .title = Сөздіктер addon-category-locale = Тілдер +addon-category-locale-title = + .title = Тілдер addon-category-available-updates = Қолжетерлік жаңартулар +addon-category-available-updates-title = + .title = Қолжетерлік жаңартулар addon-category-recent-updates = Соңғы жаңартулар +addon-category-recent-updates-title = + .title = Соңғы жаңартулар ## These are global warnings @@ -306,6 +330,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Азырақ көрсету go-back-button = .tooltiptext = Артқа +header-back-button = + .title = Артқа ## Recommended add-ons page diff --git a/thunderbird-l10n/kk/localization/kk/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/kk/localization/kk/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..dbf951b8baf0f8cc390dd2730f3db72a8d819ae5 --- /dev/null +++ b/thunderbird-l10n/kk/localization/kk/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Сіз ескірген { -brand-product-name } нұсқасын жөнелттіңіз + .style = width: 490px; +profiledowngrade-window-create = + .label = Жаңа профильді жасау +profiledowngrade-sync = Ескілеу { -brand-product-name } нұсқасын қолдану бар болып тұрған { -brand-product-name } профиліне сақталған бетбелгілер және шолу тарихын зақымдауы мүмкін. Ақпаратыңызды қорғау үшін, { -brand-short-name } бұл орнатуы үшін жаңа профильді жасаңыз. Профильдер арасында бетбелгілер және шолу тарихын синхрондау үшін, сіз әрқашан да { -fxaccount-brand-name } көмегімен кіре аласыз. +profiledowngrade-nosync = Ескілеу { -brand-product-name } нұсқасын қолдану бар болып тұрған { -brand-product-name } профиліне сақталған бетбелгілер және шолу тарихын зақымдауы мүмкін. Ақпаратыңызды қорғау үшін, { -brand-short-name } бұл орнатуы үшін жаңа профильді жасаңыз. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Шығу + *[other] Шығу + } diff --git a/thunderbird-l10n/kk/manifest.json b/thunderbird-l10n/kk/manifest.json index bc2fd7453ecc02d6a2e3dddc961207f0b356228e..6e6b40b43ead031b788dbcde81e829e6ee226295 100644 --- a/thunderbird-l10n/kk/manifest.json +++ b/thunderbird-l10n/kk/manifest.json @@ -1,57 +1,57 @@ { + "manifest_version": 2, + "sources": { + "browser": { + "base_path": "browser/" + } + }, + "langpack_id": "kk", + "name": "Kazakh (KZ) Language Pack", + "author": "mozilla.org (contributors: Baurzhan Muftakhidinov, Timur Timirkhanov, Zhanbolat Satybaldinov)", + "version": "76.0buildid20200420212409", + "description": "Language pack for Thunderbird for kk", "languages": { "kk": { - "version": "20200405082441", + "version": "20200419175425", "chrome_resources": { - "chat": "chrome/kk/locale/kk/chat/", - "messenger": "chrome/kk/locale/kk/messenger/", - "lightning": "chrome/kk/locale/kk/lightning/", + "pipnss": "chrome/kk/locale/kk/pipnss/", + "devtools-startup": "chrome/kk/locale/kk/devtools/startup/", "calendar": "chrome/kk/locale/kk/calendar/", - "passwordmgr": "chrome/kk/locale/kk/passwordmgr/", - "places": "chrome/kk/locale/kk/places/", - "devtools": "chrome/kk/locale/kk/devtools/client/", + "lightning": "chrome/kk/locale/kk/lightning/", + "mozldap": "chrome/kk/locale/kk/mozldap/", + "messenger-smime": "chrome/kk/locale/kk/messenger-smime/", + "communicator": "chrome/kk/locale/kk/communicator/", + "messenger-region": "chrome/kk/locale/kk/messenger-region/", "messenger-mapi": "chrome/kk/locale/kk/messenger-mapi/", - "messenger-newsblog": "chrome/kk/locale/kk/messenger-newsblog/", + "pluginproblem": "chrome/kk/locale/kk/pluginproblem/", "global-platform": { - "android": "chrome/kk/locale/kk/global-platform/unix/", "win": "chrome/kk/locale/kk/global-platform/win/", - "linux": "chrome/kk/locale/kk/global-platform/unix/", - "macosx": "chrome/kk/locale/kk/global-platform/mac/" + "android": "chrome/kk/locale/kk/global-platform/unix/", + "macosx": "chrome/kk/locale/kk/global-platform/mac/", + "linux": "chrome/kk/locale/kk/global-platform/unix/" }, - "autoconfig": "chrome/kk/locale/kk/autoconfig/", - "messenger-smime": "chrome/kk/locale/kk/messenger-smime/", - "alerts": "chrome/kk/locale/kk/alerts/", + "passwordmgr": "chrome/kk/locale/kk/passwordmgr/", + "messenger-newsblog": "chrome/kk/locale/kk/messenger-newsblog/", + "chat": "chrome/kk/locale/kk/chat/", + "messenger": "chrome/kk/locale/kk/messenger/", + "devtools-shared": "chrome/kk/locale/kk/devtools/shared/", + "devtools": "chrome/kk/locale/kk/devtools/client/", "mozapps": "chrome/kk/locale/kk/mozapps/", "pippki": "chrome/kk/locale/kk/pippki/", - "devtools-startup": "chrome/kk/locale/kk/devtools/startup/", - "messenger-region": "chrome/kk/locale/kk/messenger-region/", + "places": "chrome/kk/locale/kk/places/", + "autoconfig": "chrome/kk/locale/kk/autoconfig/", "branding": "chrome/kk/locale/kk/branding/", - "global": "chrome/kk/locale/kk/global/", - "mozldap": "chrome/kk/locale/kk/mozldap/", - "communicator": "chrome/kk/locale/kk/communicator/", "necko": "chrome/kk/locale/kk/necko/", - "devtools-shared": "chrome/kk/locale/kk/devtools/shared/", - "pluginproblem": "chrome/kk/locale/kk/pluginproblem/", - "pipnss": "chrome/kk/locale/kk/pipnss/" + "alerts": "chrome/kk/locale/kk/alerts/", + "global": "chrome/kk/locale/kk/global/" } } }, - "langpack_id": "kk", "applications": { "gecko": { - "strict_max_version": "76.*", "strict_min_version": "76.0", - "id": "langpack-kk@thunderbird.mozilla.org" + "id": "langpack-kk@thunderbird.mozilla.org", + "strict_max_version": "76.*" } - }, - "manifest_version": 2, - "description": "Language pack for Thunderbird for kk", - "version": "76.0buildid20200407173003", - "sources": { - "browser": { - "base_path": "browser/" - } - }, - "name": "Kazakh (KZ) Language Pack", - "author": "mozilla.org (contributors: Baurzhan Muftakhidinov, Timur Timirkhanov, Zhanbolat Satybaldinov)" + } } diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/calendar/calendar.dtd b/thunderbird-l10n/ko/chrome/ko/locale/ko/calendar/calendar.dtd index 16ea668d5e148b25cf6ceb6df057b173174366cc..8739aaf26cf7368ca1a616dfe6fe5b56876aff05 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/calendar/calendar.dtd +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/calendar/calendar.dtd @@ -10,6 +10,7 @@ <!ENTITY calendar.newtask.button.tooltip "새 캘린더 태스크를 만듭니다" > <!ENTITY calendar.unifinder.todoitems.label "태스크" > + <!ENTITY calendar.unifinder.showcompletedtodos.label "완료된 태스크 보이기"> <!ENTITY calendar.today.button.label "오늘"> @@ -178,8 +179,6 @@ <!ENTITY calendar.context.attendance.menu.label "참여"> <!ENTITY calendar.context.attendance.menu.accesskey "d"> <!ENTITY calendar.context.attendance.occurrence.label "현재 일정만"> -<!ENTITY calendar.context.attendance.all.label "모든 일정" > - <!ENTITY calendar.context.attendance.all2.label "완전한 시리즈"> <!ENTITY calendar.context.attendance.send.label "지금 알림 보냄"> <!ENTITY calendar.context.attendance.send.accesskey "S"> @@ -366,6 +365,7 @@ <!ENTITY calendarproperties.firealarms.label "알람 보기"> <!ENTITY calendarproperties.cache3.label "오프라인 지원"> <!ENTITY calendarproperties.enabled.label "이 캘린더 전환: "> +<!ENTITY calendarproperties.enabled2.label "이 캘린더 활성화"> <!ENTITY calendarproperties.forceDisabled.label "이 캘린더에 대한 공급자를 찾을 수 없습니다. 이 문제는 어떤 부가 기능을 사용 안함 또는 삭제를 했을 경우에 자주 발생할 수 있습니다."> <!ENTITY calendarproperties.unsubscribe.label "해지"> <!ENTITY calendarproperties.unsubscribe.accesskey "U"> @@ -409,5 +409,3 @@ <!ENTITY calendar.extract.task.button "태스크 추가"> <!ENTITY calendar.extract.event.button.tooltip "메시지에서 날짜 정보를 추출하여 캘린더에 이벤트로 추가"> <!ENTITY calendar.extract.task.button.tooltip "메시지에서 날짜 정보를 추출하여 캘린더에 태스크로 추가"> - -<!ENTITY calendarproperties.enabled2.label "Enable This Calendar"> diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/connection-screen.dtd b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/connection-screen.dtd index f1cfe6af01150660642605a98a0aeba3989f63e7..83ca221440d45d774367392898f7f30e1c204a1b 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/connection-screen.dtd +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/connection-screen.dtd @@ -24,7 +24,7 @@ <!-- LOCALIZATION NOTE (remoteHelp, remoteDocumentation, remoteHelpSuffix): these strings will be concatenated in a single label, remoteDocumentation will be used as text for a link to MDN. --> -<!ENTITY remoteHelp "Firefox 개발자 도구로 원격 기기(예: Android 용 Firefox 및 Firefox OS)를 디버깅 할 수 있습니다. 원격 기기에서 '원격 디버깅' 옵션이 켜져 있는지 확인하세요. 자세한 내용은"> +<!ENTITY remoteHelp "Firefox 개발자 도구로 원격 기기(예: Android용 Firefox 및 Firefox OS)를 디버깅 할 수 있습니다. 원격 기기에서 '원격 디버깅' 옵션이 켜져 있는지 확인하세요. 자세한 내용은"> <!ENTITY remoteDocumentation "이 문서"> <!ENTITY remoteHelpSuffix "를 보세요."> diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/debugger.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/debugger.properties index 3dbdfeac27657ae3d6248856ca86ebce1d204183..67d1ed11da723f5ae1c309f17b49e74826bed00c 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/debugger.properties +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/debugger.properties @@ -110,7 +110,7 @@ expandBreakpoints=중단점 창 펼치기 # LOCALIZATION NOTE (evaluateInConsole.label): Editor right-click menu item # to execute selected text in browser console. -evaluateInConsole.label=콘손에서 실행 +evaluateInConsole.label=콘솔에서 실행 # LOCALIZATION NOTE (pauseButtonTooltip): The tooltip that is displayed for the pause # button when the debugger is in a running state. @@ -875,7 +875,7 @@ scopes.mapScopes=스코프 맵 outline.placeholder=함수 필터 # LOCALIZATION NOTE (outline.sortLabel): Label for the sort button -outline.sortLabel=이름으로 정렬 +outline.sortLabel=이름순 정렬 # LOCALIZATION NOTE (outline.noFunctions): Outline text when there are no functions to display outline.noFunctions=함수 없음 diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/inspector.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/inspector.properties index c3b6deacd685859925bc18042e223e7e73a3e2e5..8e37351387331caba1ea24aaad6273d11a6f2d28 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/inspector.properties +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/inspector.properties @@ -453,7 +453,7 @@ inspector.sidebar.changesViewTitle=변경사항 # This is the title shown in a tab in the side panel of the Inspector panel # that corresponds to the tool displaying the list of CSS rules used # in the page. -inspector.sidebar.ruleViewTitle=선언 +inspector.sidebar.ruleViewTitle=규칙 # LOCALIZATION NOTE (inspector.sidebar.computedViewTitle): # This is the title shown in a tab in the side panel of the Inspector panel @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=이 요소는 스크롤 할 수 있는 넘친 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=관련 규칙 없음 +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Shift 키를 누른 상태에서 클릭하여 규칙으로 이동 + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/netmonitor.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/netmonitor.properties index b72d0c1bd300799cb37e62ff3dbf1f81c9671f88..c22f3d52a4f9159bd6701ff3e3a664ce1aaf93e2 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/netmonitor.properties +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/netmonitor.properties @@ -1102,7 +1102,7 @@ netmonitor.response.name=이름: # LOCALIZATION NOTE (netmonitor.response.dimensions): This is the label displayed # in the network details response tab identifying an image's dimensions. -netmonitor.response.dimensions=이미지 크기: +netmonitor.response.dimensions=픽셀 크기: # LOCALIZATION NOTE (netmonitor.response.mime): This is the label displayed # in the network details response tab identifying an image's mime. diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/webconsole.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/webconsole.properties index f21b516f99e4fd42e88cf10206c1e6b847f4e60b..1ea70afe24c5e1bcabbd5fa56a4e963c582252bf 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/webconsole.properties +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/webconsole.properties @@ -119,7 +119,7 @@ cdFunctionInvalidArgument=주어진 창에서 cd()를 할 수 없습니다. 유 # LOCALIZATION NOTE (selfxss.msg): the text that is displayed when # a new user of the developer tools pastes code into the console # %1 is the text of selfxss.okstring -selfxss.msg=사기 주의: 자신이 이해하지 못하는 것을 붙여넣을 때에는 조심하세요. 이를 통해 공격자가 여러분의 개인 정보를 훔치거나 컴퓨터를 제어할 수 있습니다. 붙여넣기를 허용하려면 '%S'를 아래에 입력하세요(엔터키를 누르지 않아도 됩니다). +selfxss.msg=사기 주의: 자신이 이해하지 못하는 것을 붙여넣을 때에는 조심하세요. 이를 통해 공격자가 여러분의 개인 정보를 훔치거나 컴퓨터를 제어할 수 있습니다. 붙여넣기를 허용하려면 '%S'를 아래에 입력하세요(Enter 키를 누르지 않아도 됩니다). # LOCALIZATION NOTE (selfxss.okstring): the string to be typed # in by a new user of the developer tools when they receive the sefxss.msg prompt. @@ -233,6 +233,19 @@ webconsole.menu.openInSidebar.accesskey=V # copies the entire output of the console to the clipboard. webconsole.menu.exportClipboard.label=보이는 메시지를 클립보드로 내보내기 +# LOCALIZATION NOTE (webconsole.menu.timeWarp.label) +# Label used for a context-menu item displayed for any log. Clicking on it will +# jump to the execution point where the log item was generated. +webconsole.menu.timeWarp.label=여기로 건너뛰기 + +# LOCALIZATION NOTE (webconsole.jumpButton.tooltip) +# Label used for the tooltip on the "jump" button in the console. It's displayed when +# the user recorded execution with WebReplay, is now paused in the debugger, and hover a +# message in the console output. Clicking on it will jump to the execution point where the +# log item was generated. +# Parameters: %S is the level of the message. +webconsole.jumpButton.tooltip=%S - 여기로 이동 + # LOCALIZATION NOTE (webconsole.menu.exportSubmenu.label) # Label used for a context-menu item displayed on the output. Clicking on it # opens a submenu where the user can select how to export messages. @@ -249,19 +262,6 @@ webconsole.menu.exportSubmenu.exportCliboard.label=클립보드 # the output of the console. webconsole.menu.exportSubmenu.exportFile.label=파일 -# LOCALIZATION NOTE (webconsole.menu.timeWarp.label) -# Label used for a context-menu item displayed for any log. Clicking on it will -# jump to the execution point where the log item was generated. -webconsole.menu.timeWarp.label=여기로 건너뛰기 - -# LOCALIZATION NOTE (webconsole.jumpButton.tooltip) -# Label used for the tooltip on the "jump" button in the console. It's displayed when -# the user recorded execution with WebReplay, is now paused in the debugger, and hover a -# message in the console output. Clicking on it will jump to the execution point where the -# log item was generated. -# Parameters: %S is the level of the message. -webconsole.jumpButton.tooltip=%S - 여기로 이동 - # LOCALIZATION NOTE (webconsole.clearButton.tooltip) # Label used for the tooltip on the clear logs button in the console top toolbar bar. # Clicking on it will clear the content of the console. @@ -392,11 +392,6 @@ webconsole.console.settings.menu.item.enablePersistentLogs.label=로그 유지 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.enablePersistentLogs.tooltip) webconsole.console.settings.menu.item.enablePersistentLogs.tooltip=이 옵션을 사용하면 새 페이지로 이동할 때마다 출력이 지워지지 않습니다 -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.label) -webconsole.console.settings.menu.item.eagerEvaluation.label=조급한 계산 -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.tooltip) -webconsole.console.settings.menu.item.eagerEvaluation.tooltip=이 옵션을 사용하면 입력 할 때 조급하게 계산됩니다 - # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.label) webconsole.console.settings.menu.item.instantEvaluation.label=즉시 계산 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.tooltip) @@ -573,7 +568,7 @@ webconsole.input.editor.onboarding.dissmis.label=확인 # LOCALIZATION NOTE (webconsole.enterKey): The text that will be used to represent the # Enter key in the editor onboarding UI, as well as on the Editor toolbar "Run" button # tooltip. -webconsole.enterKey=엔터 +webconsole.enterKey=Enter # LOCALIZATION NOTE (webconsole.input.openJavaScriptFile): This is a label # used for opening a file in the console input (Ctrl+O or Cmd+O on OSX while diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/global/appstrings.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/global/appstrings.properties index 09aaffa87d0ee5e227d9c027c19da03d776dbeaa..f7696fc6bf3138b0577784df0d857e7abc015cfc 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/global/appstrings.properties +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/global/appstrings.properties @@ -13,7 +13,7 @@ netTimeout=%S 서버의 응답이 너무 늦습니다. redirectLoop=이 주소에 대하여 완전하지 못한 방법의 연결 이동 요청이 감지되었습니다. confirmRepostPrompt=이 페이지를 표시하려면 응용프로그램이 이전에 수행했던 정보가 필요합니다. 이전에 실행하였던 작업(검색 또는 입력 양식 제출)을 다시 반복 합니다. resendButton.label=다시 보내기 -unknownSocketType=PSM (Personal Security Manager)을 설치하지 않으면 이 문서를 표시 할 수 없습니다. PSM을 다운로드하고 설치한 후 다시 시도하시거나 시스템 관리자에게 문의하세요. +unknownSocketType=PSM (Personal Security Manager)을 설치하지 않으면 이 문서를 표시할 수 없습니다. PSM을 다운로드하고 설치한 후 다시 시도하시거나 시스템 관리자에게 문의하세요. netReset=페이지 로딩 중 서버와의 연결이 초기화 되었습니다. notCached=페이지가 더 이상 저장되어 있지 않습니다. netOffline=오프라인 상태에서는 웹에 연결할 수 없습니다. diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/global/css.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/global/css.properties index ac5cf658e0284a4b96b3998031a799fc0ea65b3c..4fabee44e86112ab906d545cef1589da0c2bf8c4 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/global/css.properties +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/global/css.properties @@ -180,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=subgrid의 이름 목록에는 한개 PEMoreThanOneGridRepeatAutoFillFitInTrackList=트랙 목록에는 한개의 반복 (auto-fill, …) 또는 반복(auto-fit, …) 만 허용됩니다. PEMoreThanOneGridRepeatTrackSize=반복 (auto-fit/auto-fill, …) 안에서는 한개의 트랙 크기만 허용됩니다. +PEDisallowedImportRule=@import 규칙은 생성된 스타일시트에서 아직 유효하지 않습니다. + TooLargeDashedRadius=‘dashed’ 스타일에 대한 border radius가 너무 큽니다(최대 100000px). solid로 랜더링 합니다. TooLargeDottedRadius=‘dotted’ 스타일에 대한 border radius가 너무 큽니다(최대 100000px). solid로 랜더링 합니다. diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/global/dom/dom.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/global/dom/dom.properties index 623a43d3de88f4d7ef90aa455483c2f6e871550c..0e58d8355946a893fb5dc9564379a008da393ed7 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/global/dom/dom.properties +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/global/dom/dom.properties @@ -20,7 +20,7 @@ DontAskAgain=다시 묻지 않음 JSURLLoadBlockedWarning=자바스크립트 읽기 시도 중: 다른 호스트로부터 받은 콘텐츠를 창에 표시하는 중 보안 관리자에 의해 중지되었습니다. WindowCloseBlockedWarning=스크립트에 의해 열리지 않은 창을 닫을 수 없습니다. OnBeforeUnloadTitle=페이지 나가기 여부 -OnBeforeUnloadMessage=이 페이지를 나갈 지 여부를 결정합니다. 입력한 데이터는 저장되지 않을 수 있습니다. +OnBeforeUnloadMessage=이 페이지가 나갈지 여부를 묻습니다. 입력한 데이터는 저장되지 않을 수 있습니다. OnBeforeUnloadStayButton=계속 사용 OnBeforeUnloadLeaveButton=나가기 UnexpectedCanvasVariantStyle=canvas: 문자열이 아닌 값이 strokeStyle나 fillStyle로 설정 하여 CanvasGradient나 CanvasPattern은 무시합니다. diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/global/security/security.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/global/security/security.properties index d899e3fa1274131fe446d937b09bed7be2ced8cb..3bc08887ed20f6d58757843c1fdb6e188b800dcf 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/global/security/security.properties +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = X-Frame-Options에 의해 로드 거부됨: “%2$S”의 “%1$S”, # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = X-Frame-Options에 의해 로드 거부됨: “%2$S”의 “%1$S”, 사이트에서는 “%3$S”의 원본 간 프레임을 허용하지 않습니다. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = “%2$S”를 로드할 때 잘못된 X-Frame-Options 헤더가 발견됨: “%1$S”는 유효한 지시자가 아닙니다. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=프레임에서 “%2$S”의 로드는 “X1-Frame-Options” 지시자가 “%1$S”로 설정되어 거부되었습니다. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = “%2$S”(을)를 사용하도록 안전하지 않은 요청 “%1$S”(을)를 업그레이드 중 diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/lightning/lightning.dtd b/thunderbird-l10n/ko/chrome/ko/locale/ko/lightning/lightning.dtd index 1b4e12564a90ae0930ee56afa77f66361790c95f..93d025bdc3bcef7552cfac6d6b1903a75f6b6029 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/lightning/lightning.dtd +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/lightning/lightning.dtd @@ -23,6 +23,8 @@ <!ENTITY lightning.menupopup.open.accesskey "O"> <!ENTITY lightning.menupopup.open.message.label "메시지 저장…"> <!ENTITY lightning.menupopup.open.message.accesskey "M"> + +<!-- Open menu popup in File menu --> <!ENTITY lightning.menupopup.open.calendar.label "캘린더 파일…"> <!ENTITY lightning.menupopup.open.calendar.accesskey "C"> @@ -67,6 +69,9 @@ <!ENTITY lightning.imipbar.btnDelete.tooltiptext "캘린더에서 삭제"> <!ENTITY lightning.imipbar.btnDetails.label "상세…"> <!ENTITY lightning.imipbar.btnDetails.tooltiptext "이벤트 상세 보기"> +<!ENTITY lightning.imipbar.btnDoNotShowImipBar.label "이 메시지 보여주지 않기"> +<!ENTITY lightning.imipbar.btnGoToCalendar.label "달력"> +<!ENTITY lightning.imipbar.btnGoToCalendar.tooltiptext "캘린더 탭으로 이동"> <!ENTITY lightning.imipbar.btnMore.label "더 보기"> <!ENTITY lightning.imipbar.btnMore.tooltiptext "더 많은 옵션을 보려면 클릭"> <!ENTITY lightning.imipbar.btnReconfirm2.label "재확인"> @@ -109,7 +114,3 @@ <!ENTITY todaypane.showTodayPane.label "오늘 일정 보기"> <!ENTITY todaypane.showTodayPane.accesskey "o"> <!ENTITY todaypane.statusButton.label "오늘 일정"> - -<!ENTITY lightning.imipbar.btnDoNotShowImipBar.label "Don't show me these messages"> -<!ENTITY lightning.imipbar.btnGoToCalendar.label "Calendar"> -<!ENTITY lightning.imipbar.btnGoToCalendar.tooltiptext "Go to the calendar tab"> diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/lightning/lightning.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/lightning/lightning.properties index 542dfc5e47a6695a4b492adda624ee050af94e2a..ed7cf97af38ace479dfce157264325bf45c4123d 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/lightning/lightning.properties +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/lightning/lightning.properties @@ -142,29 +142,22 @@ imipBarReplyToNotExistingItem=이 메시지는 달력에 기록되지 않은 이 imipBarReplyToRecentlyRemovedItem=이 메시지는 %1$S에 달력에서 삭제된 이벤트를 참조하는 답변을 포함하고 있습니다. imipBarUnsupportedText=이 메시지는 현재 버전의 Lightning이 처리할 수 없는 이벤트를 포함하고 있습니다. imipBarProcessingFailed=메시지 처리 실패. 상태: %1$S. +imipBarCalendarDeactivated=이 메시지에는 이벤트 정보가 포함되어 있습니다. 캘린더가 처리 할 수 있도록합니다. imipBarNotWritable=초대가 설정된 쓰기 가능한 달력이 없습니다. 달력 속성을 확인해 보십시오. imipSendMail.title=이 메일 통지 imipSendMail.text=이메일 통지를 발송 하시겠습니까? imipNoIdentity=없음 imipNoCalendarAvailable=쓰기 가능한 캘린더가 없습니다. -itipReplySubject=이벤트 초대 응답: %1$S - itipReplySubject2=초대 응답: %1$S itipReplyBodyAccept=%1$S 님이 이벤트 초대를 허가했습니다. itipReplyBodyDecline=%1$S 님이 이벤트 초대를 거부했습니다. -itipReplySubjectAccept=이벤트 초대 응답 (참여): %1$S -itipReplySubjectDecline=이벤트 초대 응답 (참여 안함): %1$S -itipReplySubjectTentative=이벤트 초대 응답 (불확실): %1$S -itipRequestSubject=이벤트 초대: %1$S -itipRequestUpdatedSubject=이벤트 초대 (내용 업데이트): %1$S itipReplySubjectAccept2=승낙됨: %1$S itipReplySubjectDecline2=초대 거절됨: %1$S itipReplySubjectTentative2=미정: %1$S itipRequestSubject2=초대: %1$S itipRequestUpdatedSubject2=수정됨: %1$S itipRequestBody=%1$S 님이 %2$S (으)로 초대했습니다. -itipCancelSubject=이벤트 취소: %1$S itipCancelSubject2=취소됨: %1$S itipCancelBody=%1$S 님이 이 이벤트를 취소했습니다: < %2$S > itipCounterBody=%1$S 님이 "%2$S"에 대한 반대 의견을 만들었음: @@ -203,29 +196,5 @@ binaryComponentUnknown=%1$S에 필요한 바이너리 컴포넌트가 로딩되 # %1$S - The Lightning brand name, from the brandShortName string above. binaryComponentTitle=잘못된 %1$S 버전 -# LOCALIZATION_NOTE(integrationLabel): Used by the notification bar shown when -# Lightning is installed from the distribution folder. To trigger it, start a -# new profile without Lightning in a previous Thunderbird version, then upgrade -# to a Thunderbird that has Lightning packaged. See bug 1130852 for details. -integrationLabel=%1$S는 이제 %2$S 확장기능과의 통합으로 달력 기능이 포함됩니다. -integrationLearnMoreButton=더 알아보기 -integrationLearnMoreAccessKey=m -integrationOptOutButton=비활성화 -integrationOptOutAccessKey=D -integrationKeepItButton=계속 진행하기 -integrationKeepItAccessKey=K - -# LOCALIZATION_NOTE(integrationRestartLabel): At the current time its not yet -# clear if we will be completely uninstalling Lightning or disabling it. Please -# translate this string in a general manner, so that it makes sense for both -# options. -integrationRestartLabel=%2$S를 재시작 하면 %1$S가 제거 될 것입니다. 언제든지 부가 기능 도구에서 추가하실 수 있습니다. -integrationRestartButton=지금 재시작 -integrationRestartAccessKey=R -integrationUndoButton=되돌리기 -integrationUndoAccessKey=U - # LOCALIZATION NOTE(noIdentitySelectedNotification): noIdentitySelectedNotification=이 달력이 다른 사람의 초대를 저장하게 하려면 아래의 이메일 확인을 설정해야 합니다. - -imipBarCalendarDeactivated=This message contains event information. Enable a calendar to handle it. diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/addons.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/addons.properties index 8c4e9450a760995292a6073c9c6c1151cfdda024..3fa4071bdbd082b6bcb046e9637a4f0725d45cbc 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/addons.properties +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/addons.properties @@ -126,6 +126,8 @@ addonInstallErrorBlocklisted=%S는 불안정하게 만들고 보안 문제를 # Note, this string will be used as raw markup. Avoid characters like <, >, & webextPerms.header=%S 추가? +# %S is brandShortName +webextPerms.experimentWarning=악의적인 목적으로 제작된 추가 기능은 개인 정보를 빼돌리거나 컴퓨터를 망가뜨릴 수 있습니다. 이 추가 기능의 출처를 신뢰할 수 있는 경우에만 설치하실 것을 권장합니다. webextPerms.unsignedWarning=주의: 이 추가 기능은 검증되지 않았습니다. 악의적인 목적으로 제작된 추가 기능은 개인 정보를 빼돌리거나 컴퓨터를 망가뜨릴 수 있습니다. 이 추가 기능의 출처를 신뢰할 수 있는 경우에만 설치하실 것을 권장합니다. # LOCALIZATION NOTE (webextPerms.listIntro) @@ -194,6 +196,9 @@ webextPerms.description.devtools=열려있는 탭의 데이터에 접근하도 webextPerms.description.dns=IP 주소와 호스트 이름 정보에 접근 webextPerms.description.downloads=파일을 다운로드하고 브라우저의 다운로드 기록을 변경 webextPerms.description.downloads.open=컴퓨터에 다운로드 된 파일 열기 +# LOCALIZATION NOTE (webextPerms.description.experiment) +# %S will be replaced with the name of the application +webextPerms.description.experiment=%S 및 컴퓨터에 대한 무제한의 전체 접근 권한 webextPerms.description.find=열려있는 모든 탭의 텍스트 읽기 webextPerms.description.geolocation=현재 위치에 접근 webextPerms.description.history=브라우징 기록에 접근 @@ -258,9 +263,3 @@ webext.remove.confirmation.title=%S 삭제 # %2$S is brandShorterName webext.remove.confirmation.message=%2$S에서 %1$S 확장기능을 지우시겠어요? webext.remove.confirmation.button=삭제 - -# %S is brandShortName -webextPerms.experimentWarning=Malicious add-ons can steal your private information or compromise your computer. Only install this add-on if you trust the source. -# LOCALIZATION NOTE (webextPerms.description.experiment) -# %S will be replaced with the name of the application -webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/am-e2e.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/am-e2e.properties index 9d42cb9257683ae1cba68a98c753002d63e30bd5..103517f6dcb0597ed12fc84613fc7542c7afacc6 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/am-e2e.properties +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/am-e2e.properties @@ -2,4 +2,4 @@ # 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/. -prefPanel-e2e=End-To-End Encryption +prefPanel-e2e=종단간 암호화 diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/am-smime.dtd b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/am-smime.dtd index a73c5ea8c31f5a06999f95f752002a1eec9f0de3..e5b79c7a592f43a1dfae63b04d078f35e201bb80 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/am-smime.dtd +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/am-smime.dtd @@ -12,6 +12,22 @@ <!ENTITY alwaysEncryptMessage.label "암호화 사용함 (개인 인증서 필요)"> <!ENTITY alwaysEncryptMessage.accesskey "u"> <!ENTITY encryptionCert.message "다음 개인 인증서 사용:"> + +<!ENTITY e2eTitle.label "종단간 암호화"> +<!ENTITY e2eIntro.description "암호화되거나 디지털 서명 된 메시지를 보내려면 OpenPGP 또는 S/MIME과 같은 암호화 기술을 구성해야 합니다."> +<!ENTITY e2eLearnMore.label "더 알아보기"> + +<!ENTITY e2eEnc.description "종단간 암호화가 없으면 메시지 내용이 전자 메일 공급자 및 대중 사찰에 쉽게 노출됩니다."> +<!ENTITY e2eeReqWarning.description "암호화가 필요한 경우 메시지를 보내려면 모든 수신자의 공개 키 또는 인증서가 있어야 합니다."> + +<!ENTITY e2eSigning.description "디지털 서명을 사용하면 수신자가 메시지를 보냈으며 내용이 변경되지 않았음을 확인할 수 있습니다."> +<!ENTITY e2eTechPref.description "선호하는 암호화 기술:"> + +<!ENTITY doNotEncrypt.label "기본적으로 암호화를 활성화하지 않음"> +<!ENTITY doNotEncrypt.accesskey "N"> +<!ENTITY requireEncryptMessage.label "기본적으로 암호화를 필요로 함"> +<!ENTITY requireEncryptMessage.accesskey "u"> +<!ENTITY encryptionCert2.message "암호화를 위한 개인 인증서:"> <!ENTITY digitalSign.certificate.button "선택…"> <!ENTITY digitalSign.certificate.accesskey "S"> <!ENTITY digitalSign.certificate_clear.button "제거"> @@ -22,6 +38,7 @@ <!ENTITY encryption.certificate_clear.accesskey "e"> <!ENTITY signingGroupTitle.label "디지털 서명"> <!ENTITY signMessage.label "디지털 서명 메시지 (기본)"> +<!ENTITY signMessage2.label "기본적으로 내 디지털 서명 추가"> <!ENTITY signMessage.accesskey "D"> <!ENTITY signingCert.message "다음 개인 인증서 사용:"> @@ -31,37 +48,30 @@ <!ENTITY manageDevices.label "보안 장치 관리"> <!ENTITY manageDevices.accesskey "y"> -<!-- Strings for the cert picker dialog --> -<!ENTITY certPicker.title "인증서 선택"> -<!ENTITY certPicker.info "인증서:"> -<!ENTITY certPicker.detailsLabel "선택한 인증서 상세 정보:"> +<!ENTITY signingCert2.message "디지털 서명을 위한 개인 인증서:"> + +<!ENTITY sendingDefaults.label "메시지 전송을 위한 기본 설정"> + +<!ENTITY technologyAutomatic.label "사용 가능한 키 또는 인증서를 기반으로 자동 선택"> -<!ENTITY e2eTitle.label "End-To-End Encryption"> -<!ENTITY e2eIntro.description "To send encrypted or digitally signed messages, you need to configure an encryption technology, either OpenPGP or S/MIME."> -<!ENTITY e2eLearnMore.label "Learn more"> -<!ENTITY e2eEnc.description "Without end-to-end encryption the contents of messages are easily exposed to your email provider and to mass surveillance."> -<!ENTITY e2eeReqWarning.description "If you require encryption, to send a message you must have the public key or certificate of every recipient."> -<!ENTITY e2eSigning.description "A digital signature allows recipients to verify the message was sent by you, and that the content has not been changed."> -<!ENTITY e2eTechPref.description "Preferred encryption technology:"> -<!ENTITY doNotEncrypt.label "Do not enable encryption by default"> -<!ENTITY doNotEncrypt.accesskey "N"> -<!ENTITY requireEncryptMessage.label "Require encryption by default"> -<!ENTITY requireEncryptMessage.accesskey "u"> -<!ENTITY encryptionCert2.message "Personal certificate for encryption:"> -<!ENTITY signMessage2.label "Add my digital signature by default"> -<!ENTITY signingCert2.message "Personal certificate for digital signing:"> -<!ENTITY sendingDefaults.label "Default settings for sending messages"> -<!ENTITY technologyAutomatic.label "Select automatically based on available keys or certificates"> <!ENTITY certificates2.label "S/MIME"> -<!ENTITY manageCerts3.label "Manage S/MIME Certificates"> +<!ENTITY manageCerts3.label "S/MIME 인증서 관리"> <!ENTITY manageCerts3.accesskey "M"> -<!ENTITY manageDevices2.label "S/MIME Security Devices"> +<!ENTITY manageDevices2.label "S/MIME 보안 장치"> <!ENTITY manageDevices2.accesskey "y"> -<!ENTITY technologySMIME.label "Prefer S/MIME"> -<!ENTITY technologyOpenPGP.label "Prefer OpenPGP"> + +<!ENTITY technologySMIME.label "S/MIME 선호"> +<!ENTITY technologyOpenPGP.label "OpenPGP 선호"> + <!ENTITY openpgpKeys.label "OpenPGP"> -<!ENTITY manageKeys.label "Manage OpenPGP Keys"> +<!ENTITY manageKeys.label "OpenPGP 키 관리"> <!ENTITY manageKeys.accesskey "K"> -<!ENTITY openpgpKey.message "Personal key for encryption and digital signing:"> -<!ENTITY openpgpKey.button "Set Personal Key…"> + +<!-- Strings for the cert picker dialog --> +<!ENTITY certPicker.title "인증서 선택"> +<!ENTITY certPicker.info "인증서:"> +<!ENTITY certPicker.detailsLabel "선택한 인증서 상세 정보:"> + +<!ENTITY openpgpKey.message "암호화 및 디지털 서명을위한 개인 키:"> +<!ENTITY openpgpKey.button "개인 키 설정…"> <!ENTITY openpgpKey.accesskey "o"> diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/customizeToolbar.dtd b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/customizeToolbar.dtd index e32ed9f54e0100debc97dd6a442d56713d5ed3bb..7491e30057e52607b50719e0d19db5f0ca0f9d75 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/customizeToolbar.dtd +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/customizeToolbar.dtd @@ -15,8 +15,7 @@ <!ENTITY addNewToolbar.label "새 도구 모음 추가"> <!ENTITY showTitlebar.label "제목 표시줄 표시"> <!ENTITY extraDragSpace.label "드래그 영역 추가"> +<!ENTITY showTitlebar2.label "제목 표시 줄"> +<!ENTITY extraDragSpace2.label "드래그 공간"> <!ENTITY saveChanges.label "완료"> <!ENTITY undoChanges.label "변경사항 취소"> - -<!ENTITY showTitlebar2.label "Title Bar"> -<!ENTITY extraDragSpace2.label "Drag Space"> diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/imapMsgs.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/imapMsgs.properties index 894f6efa076aed355f8d0f0eb9c8bad6018f117a..5fa6b57664f21a5b898c3e80ed728762c29eaa25 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/imapMsgs.properties +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/imapMsgs.properties @@ -201,12 +201,22 @@ imapServerDroppedConnection=IMAP 서버에 연결할 수 없습니다. 서버의 있습니다. 만약 그렇다면, 고급 IMAP 서버 설정창에서 캐시된 연결 숫자를 \ 줄여 보세요. +# This will occur when a folder that has never been imap selected or opened +# (left-clicked) is first right-clicked to access quota properties. imapQuotaStatusFolderNotOpen=폴더가 열리지 않았기 때문에 용량 제한 정보를 가져올 수 없습니다. +# The imap capability response reports that QUOTA is not supported. imapQuotaStatusNotSupported=서버가 용량 제한 정보를 지원하지 않습니다. imapQuotaStatusNoQuota=이 폴더에 할당된 용량이 없습니다. +# The getqutaroot command succeeded but reported no quota information. +imapQuotaStatusNoQuota2=이 폴더는 할당량 정보를 보고하지 않습니다. + +# Folder properties were requested by the user (right-click) before the getquotaroot +# command was sent. +imapQuotaStatusInProgress=할당량 정보가 아직 없습니다. + # Out of memory imapOutOfMemory=메모리가 부족합니다. @@ -258,9 +268,3 @@ imapFolderCommandFailed='%2$S'의 현재 작업을 실패했습니다. %1$S 메 # Place the word %1$S in your translation where the name of the account should appear. # Place the word %2$S in your translation where the alert from the server should appear. imapServerAlert=%1$S 계정 경고: %2$S - -# The getqutaroot command succeeded but reported no quota information. -imapQuotaStatusNoQuota2=This folder reports no quota information. -# Folder properties were requested by the user (right-click) before the getquotaroot -# command was sent. -imapQuotaStatusInProgress=Quota information not yet available. diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/messenger.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/messenger.properties index b92b0ff68a289ab7e04de11bd10a1afafe0bf44b..f98cfe7ce4048597f11f8f2a6068ea2d2c66ade9 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/messenger.properties +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/messenger.properties @@ -464,11 +464,15 @@ macBiffNotification_separator=,\u0020 # For the Quota tab in the mail folder properties dialog quotaUsedFree=%S (전체: %S KB) 사용됨. + +# For the Quota tab in the mail folder properties dialog quotaPercentUsed=%S%% 용량 초과 # for quota in main window (commandglue.js) percent=%S%% quotaTooltip=IMAP 용량: %S KB 사용(총 %S KB). 자세한 정보를 선택하십시오. +quotaTooltip2=IMAP 용량: %S 사용(총 %S). 자세한 내용을 보려면 클릭하십시오. + # for message views confirmViewDeleteTitle=확인 confirmViewDeleteMessage=이것을 삭제하시겠습니까? @@ -804,5 +808,3 @@ errorConsoleTitle = 오류 콘솔 # This is used by screen readers to label the "back" button in various browser # popup panels, including the sliding subviews of the appmenu. panel.back = 뒤로 - -quotaTooltip2=IMAP quota: %S used of %S total. Click for details. diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/preferences/general.dtd b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/preferences/general.dtd index 6f51a722e5ca0c911462afbf7956fe146fdea760..084381f57c207542905805d1fdbdd31efd5c7961 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/preferences/general.dtd +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/preferences/general.dtd @@ -43,5 +43,5 @@ <!ENTITY removeSearchEngine.label "삭제"> <!ENTITY removeSearchEngine.accesskey "v"> -<!ENTITY minimizeToTray.label "When &brandShortName; is minimized, move it to the tray"> +<!ENTITY minimizeToTray.label "&brandShortName;가 최소화되면 트레이로 이동"> <!ENTITY minimizeToTray.accesskey "m"> diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/mozapps/handling/handling.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/mozapps/handling/handling.properties index a01f23be328fe25aae69bbe69520944f146cfdb0..716590cc9b70d873fc7e742ae0340aed94690417 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/mozapps/handling/handling.properties +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/mozapps/handling/handling.properties @@ -5,7 +5,7 @@ protocol.title=응용 프로그램 실행 protocol.description=이 링크는 응용 프로그램으로 열어야 합니다. protocol.choices.label=보낼 대상: -protocol.checkbox.label=%S 링크에 대한 선택 사항을 기억합니다. +protocol.checkbox.label=%S 링크에 대한 이 선택 기억하기 protocol.checkbox.accesskey=R protocol.checkbox.extra=세부 사항은 %S 설정에서 바꿀 수 있습니다. diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/necko/necko.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/necko/necko.properties index 0ec897637e28fee957762ae789c2fb1760f5294d..a73f39600aa5bc8801dd3ce6f41a5045f73aebf7 100644 --- a/thunderbird-l10n/ko/chrome/ko/locale/ko/necko/necko.properties +++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/necko/necko.properties @@ -14,7 +14,7 @@ 6=%1$S 전송 중… 7=%1$S 연결 중… 8=%1$S 읽음 -9=%1$S 씀 +9=%1$S 기록 10=%1$S 기다리는 중… 11=%1$S 조회함… 12=%1$S TLS 핸드셰이크 수행 중… @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=“%1$S”의 추적기 “%2$S”에 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=“%1$S”의 추적기 “%2$S”의 저장소 접근이 자동으로 승인되었습니다. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=“%1$S”의 자사 격리 “%2$S”의 저장소 접근이 자동으로 승인되었습니다. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=쿠키 “%1$S”에 “sameSite=none” 속성이 있지만 “secure” 속성이 없기 때문에 거부되었습니다. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/ko/localization/ko/calendar/calendar-widgets.ftl b/thunderbird-l10n/ko/localization/ko/calendar/calendar-widgets.ftl new file mode 100644 index 0000000000000000000000000000000000000000..cd3c6cf1d7e1a380b76cd2d89b12600b5c097373 --- /dev/null +++ b/thunderbird-l10n/ko/localization/ko/calendar/calendar-widgets.ftl @@ -0,0 +1,6 @@ +# 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/. + +calendar-deactivated-notification-events = 모든 캘린더가 현재 비활성화되어 있습니다. 기존 캘린더를 활성화하거나 새 캘린더를 추가하여 이벤트 생성 및 편집을 하십시오. +calendar-deactivated-notification-tasks = 모든 캘린더가 현재 비활성화되어 있습니다. 기존 캘린더를 활성화하거나 새 캘린더를 추가하여 작업 생성 및 편집을 하십시오. diff --git a/thunderbird-l10n/ko/localization/ko/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/ko/localization/ko/devtools/client/aboutdebugging.ftl index 8c72a8e8f9b7af980ddb0fa7e77dd92de83396ef..874312b8ec6508006e9870708a53021459cd0dff 100644 --- a/thunderbird-l10n/ko/localization/ko/devtools/client/aboutdebugging.ftl +++ b/thunderbird-l10n/ko/localization/ko/devtools/client/aboutdebugging.ftl @@ -178,7 +178,7 @@ about-debugging-runtime-service-workers-not-compatible = 브라우저 구성이 # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1") # { $minVersion } is the minimum version that is compatible with the current Firefox instance (same format) -about-debugging-browser-version-too-old = 연결된 브라우저에는 이전 버전 ({ $runtimeVersion })이 있습니다. 지원되는 최소 버전은 ({ $minVersion }) 입니다. 이것은 지원되지 않는 설정이며 DevTools가 실패 할 수 있습니다. 연결된 브라우저를 업데이트하세요. <a>문제 해결</a> +about-debugging-browser-version-too-old = 연결된 브라우저에는 이전 버전 ({ $runtimeVersion })이 있습니다. 지원되는 최소 버전은 ({ $minVersion }) 입니다. 이것은 지원되지 않는 설정이며 DevTools가 실패할 수 있습니다. 연결된 브라우저를 업데이트하세요. <a>문제 해결</a> # Dedicated message for a backward compatibility issue that occurs when connecting: # - from Fx 67 to 66 or to 65 # - from Fx 68 to 66 @@ -188,14 +188,14 @@ about-debugging-browser-version-too-old = 연결된 브라우저에는 이전 about-debugging-browser-version-too-old-67-debugger = 디버거 패널이 연결된 브라우저와 작동하지 않을 수 있습니다. 이 브라우저에 디버거를 사용해야 하는 경우 Firefox { $runtimeVersion }를 사용하세요. # Dedicated message for a backward compatibility issue that occurs when connecting: # from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68. -about-debugging-browser-version-too-old-fennec = 이 Firefox 버전은 Android 용 Firefox (68)를 디버깅 할 수 없습니다. 테스트를 위해 휴대폰에 Android Nightly 용 Firefox를 설치하는 것이 좋습니다. <a>추가 정보</a> +about-debugging-browser-version-too-old-fennec = 이 Firefox 버전은 Android용 Firefox (68)를 디버깅 할 수 없습니다. 테스트를 위해 휴대폰에 Android Nightly용 Firefox를 설치하는 것이 좋습니다. <a>추가 정보</a> # This string is displayed in the runtime page if the remote browser version is too recent. # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd) # { $localID } is the build ID of the current Firefox instance (same format) # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1") # { $localVersion } is the version of your current browser (same format) -about-debugging-browser-version-too-recent = 연결된 브라우저가 { -brand-shorter-name } ({ $localVersion }, buildID { $localID })보다 최근 버전({ $runtimeVersion }, buildID { $runtimeID })입니다. 이것은 지원되지 않는 설정이며 DevTools가 실패 할 수 있습니다. Firefox를 업데이트하세요. <a>문제 해결</a> +about-debugging-browser-version-too-recent = 연결된 브라우저가 { -brand-shorter-name } ({ $localVersion }, buildID { $localID })보다 최근 버전({ $runtimeVersion }, buildID { $runtimeID })입니다. 이것은 지원되지 않는 설정이며 DevTools가 실패할 수 있습니다. Firefox를 업데이트하세요. <a>문제 해결</a> # Displayed for runtime info in runtime pages. # { $name } is brand name such as "Firefox Nightly" # { $version } is version such as "64.0a1" diff --git a/thunderbird-l10n/ko/localization/ko/devtools/startup/aboutDevTools.ftl b/thunderbird-l10n/ko/localization/ko/devtools/startup/aboutDevTools.ftl index d8342825d50ff51355e069d90edaa7f59895713f..251272bcf0c2578bd0e43eefe85ffc74ef9b9b1c 100644 --- a/thunderbird-l10n/ko/localization/ko/devtools/startup/aboutDevTools.ftl +++ b/thunderbird-l10n/ko/localization/ko/devtools/startup/aboutDevTools.ftl @@ -9,7 +9,7 @@ enable-inspect-element-message = 개발자 도구의 검사기로 HTML과 CSS를 enable-about-debugging-message = Firefox 개발자 도구로 WebExtensions이나 웹 Worker, Service Worker 등을 개발하고 디버깅하세요. enable-key-shortcut-message = 개발자 도구 바로가기를 활성화했습니다. 만약 실수인 경우, 이 탭을 닫을 수 있습니다. enable-menu-message = 검사기와 디버거 같은 도구로 웹 사이트의 HTML, CSS와 JavaScript를 완벽하게 처리하세요. -enable-common-message = Firefox 개발자 도구는 브라우저를 보다 강력하게 제어 할 수 있도록 기본적으로 비활성화되어 있습니다. +enable-common-message = Firefox 개발자 도구는 브라우저를 보다 강력하게 제어할 수 있도록 기본적으로 비활성화되어 있습니다. enable-learn-more-link = 개발자 도구에 대하여 더 알아보기 enable-enable-button = 개발자 도구 활성화 enable-close-button = 이 탭 닫기 @@ -21,7 +21,7 @@ newsletter-email-placeholder = newsletter-privacy-label = 전 Mozilla에서 제 정보를 이 <a data-l10n-name="privacy-policy">개인 정보 정책</a>에 나와있는 대로 다뤄도 괜찮습니다. newsletter-subscribe-button = 구독 newsletter-thanks-title = 고맙습니다! -newsletter-thanks-message = 만약 이전에 Mozilla 관련 뉴스 레터 구독을 확인하지 않았다면 그렇게해야 할 수 있습니다. 받은 편지함이나 스팸 필터에서 이메일을 확인하세요. +newsletter-thanks-message = 만약 이전에 Mozilla 관련 뉴스 레터 구독을 확인하지 않았다면 그렇게 해야 할 수 있습니다. 받은 편지함이나 스팸 필터에서 이메일을 확인하세요. footer-title = Firefox 개발자 버전 footer-message = 더 좋은 개발자 도구를 찾고 계신가요? 개발자와 현대적인 워크플로우를 위해 특별히 제작된 Firefox 브라우저를 확인해보세요. footer-learn-more-link = 더 알아보기 @@ -35,9 +35,9 @@ features-debugger-desc = 프레임워크를 지원하는 강력한 JavaScript features-network-title = 네트워크 features-network-desc = 웹 사이트를 느리게하거나 방해하는 네트워크 요청을 모니터링하세요. <a data-l10n-name="learn-more">{ features-learn-more }</a> features-storage-title = 저장소 -features-storage-desc = 캐시, 쿠키, 데이터베이스 및 세션 데이터를 추가, 수정 그리고 제거합니다. <a data-l10n-name="learn-more">{ features-learn-more }</a> +features-storage-desc = 캐시, 쿠키, 데이터베이스 및 세션 데이터를 추가, 수정 및 제거합니다. <a data-l10n-name="learn-more">{ features-learn-more }</a> features-responsive-title = 반응형 디자인 모드 -features-responsive-desc = 브라우저의 에뮬레이터된 기기에서 사이트를 테스트하세요. <a data-l10n-name="learn-more">{ features-learn-more }</a> +features-responsive-desc = 브라우저에 에뮬레이트된 기기에서 사이트를 테스트하세요. <a data-l10n-name="learn-more">{ features-learn-more }</a> features-visual-editing-title = 시각적 편집 기능 features-visual-editing-desc = 애니메이션, 정렬 및 패딩을 미세 조정합니다. <a data-l10n-name="learn-more">{ features-learn-more }</a> features-performance-title = 성능 diff --git a/thunderbird-l10n/ko/localization/ko/messenger/accountCentral.ftl b/thunderbird-l10n/ko/localization/ko/messenger/accountCentral.ftl index dea503210c8d44fc1b56cd53746e2e84fd1a16c2..107beac8db7516b28585393ccb67227315cf6ad3 100644 --- a/thunderbird-l10n/ko/localization/ko/messenger/accountCentral.ftl +++ b/thunderbird-l10n/ko/localization/ko/messenger/accountCentral.ftl @@ -3,11 +3,38 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = { -brand-full-name }를 사용해 주셔서 감사합니다. +account-settings = 계정 설정 +# $accounts (Number) - the number of configured accounts setup-title = 설정할 항목 선택 about-title = { -brand-full-name } 정보 resources-title = 자원 release-notes = .title = { -brand-full-name } 정보 +email-label = 이메일 + .aria-label = 기존 이메일 계정과 연결 +email-description = { -brand-short-name }를 사용하면 기존 이메일 계정에 연결하여 응용 프로그램 내에서 편리하고 효율적으로 이메일을 읽을 수 있습니다. +calendar-label = 달력 + .aria-label = 새 달력 생성 +calendar-description = { -brand-short-name }를 사용하면 이벤트를 처리하고 체계적으로 유지할 수 있습니다. 원격 캘린더에 연결하면 모든 기기에서 모든 일정이 동기화됩니다. +chat-label = 채팅 + .aria-label = 채팅 계정과 연결 +chat-description = { -brand-short-name }를 사용하면 다양한 플랫폼에서 여러 인스턴트 메시징 계정에 연결할 수 있습니다. +filelink-label = Filelink + .aria-label = Filelink 설정 +filelink-description = { -brand-short-name }를 사용하면 첨부 파일을 쉽게 보낼 수있는 편리한 filelink 클라우드 계정을 설정할 수 있습니다. +addressbook-label = 주소록 + .aria-label = 새 주소록 생성 +addressbook-description = { -brand-short-name }를 사용하면 주소록에서 모든 연락처를 구성 할 수 있습니다. 원격 주소록에 연결하여 모든 연락처를 동기화 할 수도 있습니다. +feeds-label = 피드 + .aria-label = 피드에 연결 +feeds-description = { -brand-short-name }를 사용하면 RSS/Atom 피드에 연결하여 모든 곳에서 뉴스와 업데이트를 받을 수 있습니다. +newsgroups-label = 뉴스 그룹 + .aria-label = 뉴스 그룹에 연결 +newsgroups-description = { -brand-short-name }를 사용하면 원하는 모든 뉴스 그룹에 연결할 수 있습니다. +import-title = 다른 프로그램에서 가져 오기 +import-paragraph = { -brand-short-name }를 사용하면 다른 메일 프로그램 및 일반 주소록 형식에서 메일 메시지, 주소록 항목, 피드 구독, 환경 설정 또는 필터를 가져올 수 있습니다. +import-label = 가져오기 + .aria-label = 다른 프로그램에서 데이터 가져오기 about-paragraph = Thunderbird는 오픈 소스 크로스 플랫폼으로 회사에서나 개인이 무료로 이용할 수있는 인기 높은 메일, 캘린더 클라이언트입니다. 저희는 보안을 지키면서 더욱 개선해 나가고자 합니다. 기부는 개발자 채용, 인프라 구축 및 개선 작업을 진행할 수 있게 해줍니다. about-paragraph-2 = <b>Thunderbird는 사용자에 의해서 자금을 지원 받습니다. Thunderbird를 좋아하신다면 기부를 해 주세요.</b> Thunderbird를 계속 사용할 수 있는 가장 좋은 방법은 about-donation = 기부 하기 @@ -15,3 +42,10 @@ explore-link = 기능 살펴보기 support-link = 지원 involved-link = 참여하기 developer-link = 개발자 문서 +read = 메시지 읽기 +compose = 새 메시지 작성 +search = 메시지 검색 +filter = 메시지 필터 관리 +nntp-subscription = 뉴스 그룹 구독 관리 +rss-subscription = 피드 구독 관리 +e2e = 종단간 암호화 diff --git a/thunderbird-l10n/ko/localization/ko/messenger/preferences/passwordManager.ftl b/thunderbird-l10n/ko/localization/ko/messenger/preferences/passwordManager.ftl index 9f3de5c77881d0728b67b9797ccc4ebee3afaa85..1e9b9c259debf8d62e327c2b67a0dd1605491338 100644 --- a/thunderbird-l10n/ko/localization/ko/messenger/preferences/passwordManager.ftl +++ b/thunderbird-l10n/ko/localization/ko/messenger/preferences/passwordManager.ftl @@ -68,3 +68,15 @@ remove-all-shown = remove-all-passwords-prompt = 비밀번호를 모두 삭제하시겠습니까? remove-all-passwords-title = 모든 비밀번호 삭제 no-master-password-prompt = 정말 암호를 보이게 하시겠습니까? + +## OS Authentication dialog + +# This message can be seen by trying to show or copy the passwords. +password-os-auth-dialog-message = 저장된 비밀번호를 보려면 자격 증명을 검증하세요. +# This message can be seen by trying to show or copy the passwords. +# The macOS strings are preceded by the operating system with "Thunderbird is trying to " +# and includes subtitle of "Enter password for the user "xxx" to allow this." These +# notes are only valid for English. Please test in your locale. +password-os-auth-dialog-message-macosx = 저장된 비밀번호 표시 +# Don't change this label. +password-os-auth-dialog-caption = { -brand-full-name } diff --git a/thunderbird-l10n/ko/localization/ko/messenger/preferences/preferences.ftl b/thunderbird-l10n/ko/localization/ko/messenger/preferences/preferences.ftl index 03d4072cf0836c18c6c526851615247ca3bb9819..64ccdad36f971890017d32b6b39b85c7c3d26001 100644 --- a/thunderbird-l10n/ko/localization/ko/messenger/preferences/preferences.ftl +++ b/thunderbird-l10n/ko/localization/ko/messenger/preferences/preferences.ftl @@ -55,3 +55,15 @@ update-in-progress-ok-button = 취소 # Continue is the cancel button so pressing escape or using a platform standard # method of closing the UI will not discard the update. update-in-progress-cancel-button = 계속 + +## OS Authentication dialog + +# This message can be seen by trying to add a Master Password. +master-password-os-auth-dialog-message = 마스터 비밀번호를 만들기 위해 자격 증명을 검증하세요. +# This message can be seen by trying to add a Master Password. +# The macOS strings are preceded by the operating system with "Thunderbird is trying to " +# and includes subtitle of "Enter password for the user "xxx" to allow this." These +# notes are only valid for English. Please test in your locale. +master-password-os-auth-dialog-message-macosx = 마스터 비밀번호 만들기 +# Don't change this label. +master-password-os-auth-dialog-caption = { -brand-full-name } diff --git a/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutAddons.ftl index 45629784fd2ace04dbc0f7b3475b4083727d04ec..020b613f1431838a5ed908f2ebe773ee9d35c932 100644 --- a/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = 파일에서 부가 기능 설치… .accesskey = I help-button = 부가 기능 지원 +sidebar-help-button-title = + .title = 부가 기능 지원 preferences = { PLATFORM() -> [windows] { -brand-short-name } 설정 @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = 부가 기능 도구 +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } 설정 + *[other] { -brand-short-name } 설정 + } show-unsigned-extensions-button = .label = 몇몇 확장 기능은 확인을 할 수 없음 show-all-extensions-button = @@ -167,13 +175,29 @@ extensions-view-available-updates = .name = 업데이트 가능 항목 .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = 추천 +addon-category-discover-title = + .title = 추천 addon-category-extension = 확장 기능 +addon-category-extension-title = + .title = 확장 기능 addon-category-theme = 테마 +addon-category-theme-title = + .title = 테마 addon-category-plugin = 플러그인 +addon-category-plugin-title = + .title = 플러그인 addon-category-dictionary = 사전 +addon-category-dictionary-title = + .title = 사전 addon-category-locale = 언어팩 +addon-category-locale-title = + .title = 언어팩 addon-category-available-updates = 업데이트 가능 항목 +addon-category-available-updates-title = + .title = 업데이트 가능 항목 addon-category-recent-updates = 최근 업데이트 +addon-category-recent-updates-title = + .title = 최근 업데이트 ## These are global warnings @@ -286,6 +310,7 @@ shortcuts-no-commands = 다음 확장 기능에는 단축키가 없습니다: shortcuts-input = .placeholder = 단축키 입력 shortcuts-browserAction = 확장 기능 활성화 +shortcuts-browserAction2 = 도구 모음 버튼 활성화 shortcuts-pageAction = 페이지 작업 활성화 shortcuts-sidebarAction = 탐색창 표시/숨기기 shortcuts-modifier-mac = Ctrl, Alt 또는 ⌘ 포함 @@ -310,6 +335,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = 간략히 보기 go-back-button = .tooltiptext = 뒤로 가기 +header-back-button = + .title = 뒤로 가기 ## Recommended add-ons page diff --git a/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutPerformance.ftl b/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutPerformance.ftl index 1b647ddc0b4f84fa33c557ec4967d23f81d31388..ab21c2cffdd39518200e6b482af6e49aa235a977 100644 --- a/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutPerformance.ftl +++ b/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutPerformance.ftl @@ -8,7 +8,7 @@ about-performance-title = 작업 관리자 ## Column headers column-name = 이름 -column-type = 형식 +column-type = 유형 column-energy-impact = 에너지 영향 column-memory = 메모리 diff --git a/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutSupport.ftl index 90872845199e52facde84d79dd26a1b1e6a97145..67abad7c8a4ef090190b908be9818346f8dea0aa 100644 --- a/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutSupport.ftl @@ -140,7 +140,7 @@ media-capabilities-enumerate = 데이터베이스 열거 ## -intl-title = 국제화 & 현지화 +intl-title = 국제화 및 현지화 intl-app-title = 응용 프로그램 설정 intl-locales-requested = 요청된 언어 intl-locales-available = 사용 가능한 언어 @@ -267,6 +267,11 @@ sandbox-proc-type-content = 내용 sandbox-proc-type-file = 파일 내용 sandbox-proc-type-media-plugin = 미디어 플러그인 sandbox-proc-type-data-decoder = 데이터 디코더 +startup-cache-title = 시작 캐시 +startup-cache-disk-cache-path = 디스크 캐시 경로 +startup-cache-ignore-disk-cache = 디스크 캐시 무시 +startup-cache-found-disk-cache-on-init = 초기화시 디스크 캐시 찾음 +startup-cache-wrote-to-disk-cache = 디스크 캐시에 기록 launcher-process-status-0 = 활성화됨 launcher-process-status-1 = 실패로 비활성화됨 launcher-process-status-2 = 강제로 비활성화됨 @@ -287,9 +292,10 @@ async-pan-zoom = 비동기 팬 및 확대/축소 apz-none = 없음 wheel-enabled = 휠 입력 활성화됨 touch-enabled = 터치 입력 활성화됨 -drag-enabled = 스크롤바 끌기 활성화됨 +drag-enabled = 스크롤 막대 끌기 활성화됨 keyboard-enabled = 키보드 활성화됨 autoscroll-enabled = 자동 스크롤 활성화됨 +zooming-enabled = 부드러운 핀치 확대/축소 활성화됨 ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutTelemetry.ftl b/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutTelemetry.ftl index 205f8edcb38f7b56e7f1670922e771913eede5ec..a5cf43d12ced57bfa877e4de763e7d4abe45748d 100644 --- a/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutTelemetry.ftl +++ b/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutTelemetry.ftl @@ -8,7 +8,7 @@ about-telemetry-show-current-data = 현재 데이터 about-telemetry-show-archived-ping-data = 저장된 핑 데이터 about-telemetry-show-subsession-data = 하위 세션 데이터 보기 about-telemetry-choose-ping = 핑 선택: -about-telemetry-archive-ping-type = 핑 종류 +about-telemetry-archive-ping-type = 핑 유형 about-telemetry-archive-ping-header = 핑 about-telemetry-option-group-today = 오늘 about-telemetry-option-group-yesterday = 어제 diff --git a/thunderbird-l10n/ko/localization/ko/toolkit/about/certviewer.ftl b/thunderbird-l10n/ko/localization/ko/toolkit/about/certviewer.ftl index 0ea22f095ace7185f86d7c51b250043b2add7fb2..d784d0923602347f2e0f92a9976291798ff05a82 100644 --- a/thunderbird-l10n/ko/localization/ko/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/ko/localization/ko/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (인증서) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (체인) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = 이 확장 기능은 클라이언트가 인증서를 이해하지 못할 경우 반드시 인증서를 거부해야 함을 의미하는 위험한 것으로 표시되었습니다. +certificate-viewer-export = 내보내기 + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = 개인 인증서 +certificate-viewer-tab-people = 다른 사람 +certificate-viewer-tab-servers = 서버 +certificate-viewer-tab-ca = 인증 기관 +certificate-viewer-tab-unkonwn = 알 수 없음 diff --git a/thunderbird-l10n/ko/localization/ko/toolkit/global/processTypes.ftl b/thunderbird-l10n/ko/localization/ko/toolkit/global/processTypes.ftl index 343cb5541e788ebabdc9dbca37e9b8bb0af219bc..4e33a3df58dddca6363eb16110c7e820b98b43bb 100644 --- a/thunderbird-l10n/ko/localization/ko/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/ko/localization/ko/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = 격리된 웹 콘텐츠 # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = 소켓 diff --git a/thunderbird-l10n/ko/localization/ko/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ko/localization/ko/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..0aa507da7634fdd07f20538f5b8082260d86caf0 --- /dev/null +++ b/thunderbird-l10n/ko/localization/ko/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = { -brand-product-name } 이전 버전을 사용 중입니다 + .style = width: 490px; +profiledowngrade-window-create = + .label = 새 프로필 만들기 +profiledowngrade-sync = 이전 버전의 { -brand-product-name }를 사용하면 기존 { -brand-product-name } 프로필에 이미 저장된 북마크와 방문 기록이 손상될 수 있습니다. 정보를 보호하려면 이 { -brand-short-name } 설치에 대한 새 프로필을 만드세요. 언제든지 { -fxaccount-brand-name }로 로그인하여 프로필간에 북마크와 방문 기록을 동기화 할 수 있습니다. +profiledowngrade-nosync = 이전 버전의 { -brand-product-name }를 사용하면 기존 { -brand-product-name } 프로필에 이미 저장된 북마크와 방문 기록이 손상될 수 있습니다. 정보를 보호하려면 이 { -brand-short-name } 설치에 대한 새 프로필을 만드세요. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] 종료 + *[other] 종료 + } diff --git a/thunderbird-l10n/ko/localization/ko/toolkit/printing/printDialogs.ftl b/thunderbird-l10n/ko/localization/ko/toolkit/printing/printDialogs.ftl index f2f6205af2fcdeae456189b7c061364e219aae1f..70450a697651b85525b399f25f9128e955628e3b 100644 --- a/thunderbird-l10n/ko/localization/ko/toolkit/printing/printDialogs.ftl +++ b/thunderbird-l10n/ko/localization/ko/toolkit/printing/printDialogs.ftl @@ -58,7 +58,7 @@ margin-right = margin-right-invisible = .value = 오른쪽: header-footer-label = - .value = 머리글/바닥글 + .value = 머리글 및 바닥글 hf-left-label = .value = 왼쪽 hf-center-label = diff --git a/thunderbird-l10n/ko/manifest.json b/thunderbird-l10n/ko/manifest.json index 6691729ee24fec69852c66db9f4511e73250b8df..a62d08c8fa0f3ac0b9ee37a8c0b4833e08952d45 100644 --- a/thunderbird-l10n/ko/manifest.json +++ b/thunderbird-l10n/ko/manifest.json @@ -1,54 +1,54 @@ { - "name": "Korean (KR) Language Pack", "languages": { "ko": { - "version": "20200403125500", + "version": "20200420021306", "chrome_resources": { - "messenger": "chrome/ko/locale/ko/messenger/", - "mozapps": "chrome/ko/locale/ko/mozapps/", - "devtools": "chrome/ko/locale/ko/devtools/client/", - "necko": "chrome/ko/locale/ko/necko/", - "messenger-mapi": "chrome/ko/locale/ko/messenger-mapi/", - "global": "chrome/ko/locale/ko/global/", "calendar": "chrome/ko/locale/ko/calendar/", + "chat": "chrome/ko/locale/ko/chat/", + "global": "chrome/ko/locale/ko/global/", + "mozapps": "chrome/ko/locale/ko/mozapps/", + "lightning": "chrome/ko/locale/ko/lightning/", + "pipnss": "chrome/ko/locale/ko/pipnss/", "passwordmgr": "chrome/ko/locale/ko/passwordmgr/", + "messenger": "chrome/ko/locale/ko/messenger/", + "global-platform": { + "win": "chrome/ko/locale/ko/global-platform/win/", + "android": "chrome/ko/locale/ko/global-platform/unix/", + "linux": "chrome/ko/locale/ko/global-platform/unix/", + "macosx": "chrome/ko/locale/ko/global-platform/mac/" + }, + "branding": "chrome/ko/locale/ko/branding/", "messenger-newsblog": "chrome/ko/locale/ko/messenger-newsblog/", + "necko": "chrome/ko/locale/ko/necko/", + "devtools-shared": "chrome/ko/locale/ko/devtools/shared/", + "places": "chrome/ko/locale/ko/places/", "messenger-region": "chrome/ko/locale/ko/messenger-region/", - "mozldap": "chrome/ko/locale/ko/mozldap/", - "pipnss": "chrome/ko/locale/ko/pipnss/", "autoconfig": "chrome/ko/locale/ko/autoconfig/", + "mozldap": "chrome/ko/locale/ko/mozldap/", "devtools-startup": "chrome/ko/locale/ko/devtools/startup/", - "devtools-shared": "chrome/ko/locale/ko/devtools/shared/", - "pluginproblem": "chrome/ko/locale/ko/pluginproblem/", + "messenger-smime": "chrome/ko/locale/ko/messenger-smime/", "communicator": "chrome/ko/locale/ko/communicator/", - "alerts": "chrome/ko/locale/ko/alerts/", + "messenger-mapi": "chrome/ko/locale/ko/messenger-mapi/", + "pluginproblem": "chrome/ko/locale/ko/pluginproblem/", "pippki": "chrome/ko/locale/ko/pippki/", - "global-platform": { - "linux": "chrome/ko/locale/ko/global-platform/unix/", - "win": "chrome/ko/locale/ko/global-platform/win/", - "macosx": "chrome/ko/locale/ko/global-platform/mac/", - "android": "chrome/ko/locale/ko/global-platform/unix/" - }, - "messenger-smime": "chrome/ko/locale/ko/messenger-smime/", - "chat": "chrome/ko/locale/ko/chat/", - "branding": "chrome/ko/locale/ko/branding/", - "places": "chrome/ko/locale/ko/places/", - "lightning": "chrome/ko/locale/ko/lightning/" + "devtools": "chrome/ko/locale/ko/devtools/client/", + "alerts": "chrome/ko/locale/ko/alerts/" } } }, + "author": "한글 Mozilla 프로젝트(mozilla.or.kr) (contributors: Seokchan Yun, JoungKyun Kim)", + "name": "Korean (KR) Language Pack", + "description": "Language pack for Thunderbird for ko", "manifest_version": 2, - "version": "76.0buildid20200407173003", + "version": "76.0buildid20200420212409", + "langpack_id": "ko", "applications": { "gecko": { "strict_max_version": "76.*", - "strict_min_version": "76.0", - "id": "langpack-ko@thunderbird.mozilla.org" + "id": "langpack-ko@thunderbird.mozilla.org", + "strict_min_version": "76.0" } }, - "description": "Language pack for Thunderbird for ko", - "langpack_id": "ko", - "author": "한글 Mozilla 프로젝트(mozilla.or.kr) (contributors: Seokchan Yun, JoungKyun Kim)", "sources": { "browser": { "base_path": "browser/" diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/debugger.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/debugger.properties index a4045529f6cd666e2d7594d48187b86867e79c89..1eb5adfde3b5d7b7b2476fef97a7c208607fb969 100644 --- a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/debugger.properties +++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/debugger.properties @@ -55,6 +55,41 @@ setDirectoryRoot.accesskey=a removeDirectoryRoot.label=Nelaikyti pradiniu aplanku removeDirectoryRoot.accesskey=p +# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item +blackBoxAll.label=Juodoji dėžė + +# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected group +blackBoxAllInGroup.label=Juodosios dėžės failai šioje grupėje + +# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected group +unblackBoxAllInGroup.label=Išimti šios grupės failus iš juodosios dėžės + +# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected group +blackBoxAllOutsideGroup.label=Padėti visus ne šios grupės failus į juodąją dėžę + +# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to unblackbox all files outside of the selected group +unblackBoxAllOutsideGroup.label=Išimti visus ne šios grupės failus iš juodosios dėžės + +# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected directory +blackBoxAllInDir.label=Įdėti visus šio aplanko failus į juodąją dėžę + +# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected directory +unblackBoxAllInDir.label=Išimti visus šio aplanko failus iš juodosios dėžės + +# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected directory +blackBoxAllOutsideDir.label=Įdėti visus ne šio aplanko failus į juodąją dėžę + +# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the +# context submenu to unblackbox all files outside of the selected directory +unblackBoxAllOutsideDir.label=Išimti visus ne šio aplanko failus iš juodosios dėžės + # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the # context menu to copy the function the user selected copyFunction.label=Kopijuoti funkciją @@ -1054,11 +1089,6 @@ whyPaused.mutationBreakpointRemoved=Pašalinta: # a JS execution whyPaused.interrupted=Pristabdyta ties vykdymu -# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed -# in a info block explaining how the debugger is currently paused in a -# recording. -whyPaused.replayForcedPause=Pristabdyta ties įrašinėjimu - # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed # in a info block explaining how the debugger is currently paused while stepping # in or out of the stack @@ -1287,30 +1317,3 @@ serviceWorkerInfo.redundant=nereikalingas # LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a # service worker that is in an unknown state. serviceWorkerInfo.unknown=nežinomas - -# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item -blackBoxAll.label=Blackbox -# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the -# context submenu to blackbox all files inside of the selected group -blackBoxAllInGroup.label=Blackbox files in this group -# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the -# context submenu to unblackbox all files inside of the selected group -unblackBoxAllInGroup.label=Unblackbox files in this group -# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the -# context submenu to blackbox all files outside of the selected group -blackBoxAllOutsideGroup.label=Blackbox files outside this group -# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the -# context submenu to unblackbox all files outside of the selected group -unblackBoxAllOutsideGroup.label=Unblackbox files outside this group -# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the -# context submenu to blackbox all files inside of the selected directory -blackBoxAllInDir.label=Blackbox files in this directory -# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the -# context submenu to unblackbox all files inside of the selected directory -unblackBoxAllInDir.label=Unblackbox files in this directory -# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the -# context submenu to blackbox all files outside of the selected directory -blackBoxAllOutsideDir.label=Blackbox files outside this directory -# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the -# context submenu to unblackbox all files outside of the selected directory -unblackBoxAllOutsideDir.label=Unblackbox files outside this directory diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/inspector.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/inspector.properties index d0490c88581035a92bdd58f30e1167335408aab9..2a36ac23fcc01110b3063dd4ba7073a5a84aa49e 100644 --- a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/inspector.properties +++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Šis elementas turi slinkimo galimybę. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Nėra susietos taisyklės +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Laikykite „Vald“ ir spustelėkite, norėdami peršokti į taisyklę + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/jsonview.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/jsonview.properties index ca13ee1020b88966f4c31dbdf9e4b41f666658f0..20dffdfa631cd337cb500c97857f8f0262ed2ea8 100644 --- a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/jsonview.properties +++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/jsonview.properties @@ -32,6 +32,8 @@ jsonViewer.Copy=Kopijuoti # LOCALIZATION NOTE (jsonViewer.ExpandAll): Label for expanding all nodes jsonViewer.ExpandAll=Išskleisti viską +jsonViewer.ExpandAllSlow=Išskleisti viską (lėtai) + # LOCALIZATION NOTE (jsonViewer.CollapseAll): Label for collapsing all nodes jsonViewer.CollapseAll=Suskleisti visus @@ -50,5 +52,3 @@ jsonViewer.filterJSON=Filtruoti JSON # LOCALIZATION NOTE (jsonViewer.reps.reference): Label used for cycle # references in an array. jsonViewer.reps.reference=Ciklo nuoroda - -jsonViewer.ExpandAllSlow=Expand All (slow) diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/netmonitor.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/netmonitor.properties index 6916183ab97607f29b3e63998505d260b451c107..ad1c3d96dab8de6cfd2fd63575f3b746a7a1d1c7 100644 --- a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/netmonitor.properties +++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/netmonitor.properties @@ -351,6 +351,10 @@ netmonitor.timings.startedAt=Pradėta: %S # %S is time expressed in milliseconds or minutes. netmonitor.timings.downloadedAt=Atsiųsta: %S +# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the +# timings pane when thea request has been blocked +netmonitor.timings.noTimings=Nėra šios užklausos trukmių + # LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed # in the network menu specifying timing interval divisions (in milliseconds). networkMenu.millisecond=%S ms @@ -761,6 +765,14 @@ netmonitor.ws.context.received=Gauta # for the "Received" menu item displayed in the context menu in the websocket toolbar. netmonitor.ws.context.received.accesskey=G +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed +# on the context menu that shows "Control Frames" WebSocket frames. +netmonitor.ws.context.controlFrames=Valdymo + +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key +# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. +netmonitor.ws.context.controlFrames.accesskey=o + # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed # on the context menu that shows "Copy Message". netmonitor.ws.context.copyFrame=Kopijuoti pranešimą @@ -781,11 +793,6 @@ netmonitor.ws.type.sent=Išsiųsta # accessible text for the "received" type icon in the websocket table's "data" column. netmonitor.ws.type.received=Gauta -# LOCALIZATION NOTE (netmonitor.ws.time.format): This is the format used for the -# time values in the websocket table's "time" column -# %1$S is the formatted hour-minutes-seconds, %2$S is the milliseconds (zero-padded) -netmonitor.ws.time.format=%1$S.%2$S - # LOCALIZATION NOTE (netmonitor.ws.rawData.header): This is the label displayed # in the messages panel identifying the raw data. netmonitor.ws.rawData.header=Neapdoroti duomenys (%S) @@ -1526,13 +1533,3 @@ netmonitor.cache.lastModified=Atnaujinta # LOCALIZATION NOTE (netmonitor.cache.device): This is the label text for the device # where a cached object was fetched from (e.g. "disk"). netmonitor.cache.device=Įrenginys - -# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the -# timings pane when thea request has been blocked -netmonitor.timings.noTimings=No timings for this request -# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed -# on the context menu that shows "Control Frames" WebSocket frames. -netmonitor.ws.context.controlFrames=Control -# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key -# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. -netmonitor.ws.context.controlFrames.accesskey=o diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/webconsole.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/webconsole.properties index 1923c7cfcc22ee76e842926d71e5b0e952f84d7f..69c634219dc7c109e0aff138f0989cbf8f2093dd 100644 --- a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/webconsole.properties +++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/webconsole.properties @@ -233,6 +233,19 @@ webconsole.menu.openInSidebar.accesskey=v # copies the entire output of the console to the clipboard. webconsole.menu.exportClipboard.label=Kopijuoti matomus pranešimus į iškarpinę +# LOCALIZATION NOTE (webconsole.menu.timeWarp.label) +# Label used for a context-menu item displayed for any log. Clicking on it will +# jump to the execution point where the log item was generated. +webconsole.menu.timeWarp.label=Peršokti čia + +# LOCALIZATION NOTE (webconsole.jumpButton.tooltip) +# Label used for the tooltip on the "jump" button in the console. It's displayed when +# the user recorded execution with WebReplay, is now paused in the debugger, and hover a +# message in the console output. Clicking on it will jump to the execution point where the +# log item was generated. +# Parameters: %S is the level of the message. +webconsole.jumpButton.tooltip=%S – peršokti čia + # LOCALIZATION NOTE (webconsole.menu.exportSubmenu.label) # Label used for a context-menu item displayed on the output. Clicking on it # opens a submenu where the user can select how to export messages. @@ -249,19 +262,6 @@ webconsole.menu.exportSubmenu.exportCliboard.label=Iškarpinę # the output of the console. webconsole.menu.exportSubmenu.exportFile.label=Failą -# LOCALIZATION NOTE (webconsole.menu.timeWarp.label) -# Label used for a context-menu item displayed for any log. Clicking on it will -# jump to the execution point where the log item was generated. -webconsole.menu.timeWarp.label=Peršokti čia - -# LOCALIZATION NOTE (webconsole.jumpButton.tooltip) -# Label used for the tooltip on the "jump" button in the console. It's displayed when -# the user recorded execution with WebReplay, is now paused in the debugger, and hover a -# message in the console output. Clicking on it will jump to the execution point where the -# log item was generated. -# Parameters: %S is the level of the message. -webconsole.jumpButton.tooltip=%S – peršokti čia - # LOCALIZATION NOTE (webconsole.clearButton.tooltip) # Label used for the tooltip on the clear logs button in the console top toolbar bar. # Clicking on it will clear the content of the console. @@ -392,11 +392,6 @@ webconsole.console.settings.menu.item.enablePersistentLogs.label=Išlaikyti žur # LOCALIZATION NOTE (webconsole.console.settings.menu.item.enablePersistentLogs.tooltip) webconsole.console.settings.menu.item.enablePersistentLogs.tooltip=Įjungus šią parinktį, išvestys nebus išvalomos pereinant į kitą tinklalapį -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.label) -webconsole.console.settings.menu.item.eagerEvaluation.label=Išankstinis įvertinimas -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.tooltip) -webconsole.console.settings.menu.item.eagerEvaluation.tooltip=Įjungus šią parinktį, įvestis bus įvertinama iš anksto, jums ją renkant - # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.label) webconsole.console.settings.menu.item.instantEvaluation.label=Greitas įvertinimas # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.tooltip) @@ -594,6 +589,6 @@ webconsole.input.selector.top=Viršutinė webconsole.input.selector.tooltip=Pasirinkti įvertinimo kontekstą # LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultEnabled): do not translate 'sameSite'. -webconsole.group.cookieSameSiteLaxByDefaultEnabled=Some cookies are misusing the “sameSite“ attribute, so it won’t work as expected +webconsole.group.cookieSameSiteLaxByDefaultEnabled=Kai kurie slapukai netinkamai naudoja „sameSite“ atributą, tad jis neveiks kaip turėtų # LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultDisabled): do not translate 'sameSite'. -webconsole.group.cookieSameSiteLaxByDefaultDisabled=Some cookies are misusing the recommended “sameSite“ attribute +webconsole.group.cookieSameSiteLaxByDefaultDisabled=Kai kurie slapukai netinkamai naudoja „sameSite“ atributą diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/global-platform/mac/accessible.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/global-platform/mac/accessible.properties index fea483242a9e7ce03d81b74a3ea95e658d2af959..6390f85be06d62d0469cb7b528ccbd1c0d787085 100644 --- a/thunderbird-l10n/lt/chrome/lt/locale/lt/global-platform/mac/accessible.properties +++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/global-platform/mac/accessible.properties @@ -58,8 +58,7 @@ separator = skyriklis tabPanel = kortelių juosta # The roleDescription for the html:mark element highlight = paryškinimas - # The roleDescription for the details element -details = details +details = išsamiau # The roleDescription for the summary element -summary = summary +summary = santrauka diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/global/css.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/global/css.properties index f3a649c1e887b078546878a0fc9c10649f96d752..f4a1b894b26f2c987836e6cd6afc4a8566ed8b80 100644 --- a/thunderbird-l10n/lt/chrome/lt/locale/lt/global/css.properties +++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=Stilių rinkinys %1$S buvo įkeltas kaip CSS nors jo MIME tipas ( PEUnexpEOF2=Ieškant elemento „%1$S“, pasiekta failo pabaiga. PEParseRuleWSOnly=Vietoj taisyklės pateikta tuščia eilutė. + PEDeclDropped=Nėra aprašo. PEDeclSkipped=Pereita prie tolesnio aprašo. PEUnknownProperty=Savybė „%1$S“ nėra žinoma. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Potinklelio vardų sąrašui yra leid PEMoreThanOneGridRepeatAutoFillFitInTrackList=Takelių sąraše yra leidžiamas tik vienas „repeat(auto-fill, …)“ arba „repeat(auto-fit, …)“. PEMoreThanOneGridRepeatTrackSize=Viduje „repeat(auto-fill, …)“ yra leidžiamas tik vienas takelio dydis. +PEDisallowedImportRule=Kol kas „@import“ taisyklės nėra galimos konstruotuose stilių aprašuose. + TooLargeDashedRadius=Rėmelio spindulys yra per didelis „dashed“ stiliui (riba yra 100000 taškų). Atvaizduojamas kaip vientisas. TooLargeDottedRadius=Rėmelio spindulys yra per didelis „dotted“ stiliui (riba yra 100000 taškų). Atvaizduojamas kaip vientisas. diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/global/dom/dom.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/global/dom/dom.properties index 7ed1c4f539748a2b93492da138a98e913869fd1f..0ff67759d6fc61fb773eeeeafcd50a86e35ca552 100644 --- a/thunderbird-l10n/lt/chrome/lt/locale/lt/global/dom/dom.properties +++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/global/dom/dom.properties @@ -424,6 +424,5 @@ MathML_DeprecatedStyleAttributeWarning=„MathML“ atributai „background“, MathML_DeprecatedXLinkAttributeWarning=„XLink“ atributai „href“, „type“, „show“ ir „actuate“ yra nenaudotini su „MathML“ elementais, ir ateityje bus panaikinti. WebShareAPI_Failed=Dalinimosi operacija nepavyko. WebShareAPI_Aborted=Dalinimosi operacija buvo nutraukta. - # LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL. -UnknownProtocolNavigationPrevented=Prevented navigation to “%1$S” due to an unknown protocol. +UnknownProtocolNavigationPrevented=Neleista patekti į „%1$S“ dėl nežinomo protokolo. diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/global/security/security.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/global/security/security.properties index 46ceb19ccfdd9d08699effe6112bf7949531b457..996be13a6694f01932cef3a9533982cf12c2c432 100644 --- a/thunderbird-l10n/lt/chrome/lt/locale/lt/global/security/security.properties +++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/global/security/security.properties @@ -147,13 +147,16 @@ XFODeny = Įkėlimas atmestas dėl X-Frame-Options: „%1$S“ iš „%2$S“, s # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Įkėlimas atmestas dėl X-Frame-Options: „%1$S“ iš „%2$S“, svetainė neleidžia „cross-origin“ rėminimo iš „%3$S“. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Netinkama „X-Frame-Options“ antraštė įkeliant „%2$S“: „%1$S“ nėra galima direktyva. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=„%2$S“ įkėlimas kadre buvo uždraustas, nes „X-Frame-Options“ direktyvos reikšmė yra „%1$S“. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Nesaugi užklausa „%1$S“ dabar naudos „%2$S“. # LOCALIZATION NOTE: %1$S is the URL of request. -HTTPSOnlyNoUpgrade = Nepavyko pataisyti užklausos „%1$S“, nes ji turi „NoUpgrade“ žymę. - -# LOCALIZATION NOTE: %1$S is the URL of request. -HTTPSOnlyNoUpgradeException = Not upgrading insecure request “%1$S” because it is exempt. +HTTPSOnlyNoUpgradeException = Nesaugi užklausa „%1$S“ turi išimtį. # LOCALIZATION NOTE: %1$S is the URL of the failed request; %2$S is an error-code. -HTTPSOnlyFailedRequest = Upgrading insecure request “%1$S” failed. (%2$S) +HTTPSOnlyFailedRequest = Nesaugios užklausos „%1$S“ atnaujinimas nepavyko. (%2$S“) diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/necko/necko.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/necko/necko.properties index 54c35c0ad1e89aefe1123b6cde0b75015e852700..f4299365c1ce7eb29964862cc469c63cc993d753 100644 --- a/thunderbird-l10n/lt/chrome/lt/locale/lt/necko/necko.properties +++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Saugyklų prieiga automatiškai sutei # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Saugyklų prieiga automatiškai suteikta stebėjimo elementui „%2$S“ per „%1$S“. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Priėjimas prie saugyklos automatiškai suteiktas „First-Party“ izoliacijai „%2$S“, esančiai „%1$S“. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Slapukas „%1$S“ buvo atmestas, nes turi atributą „sameSite=none“, tačiau neturi atributo „secure“. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". @@ -67,8 +70,7 @@ CookieLaxForced=Slapuko „%1$S“ atributo „sameSite“ reikšmė nustatyta CookieLaxForcedForBeta=Slapukas „%1$S“ neturi tinkamos atributo „sameSite“ reikšmės. Netrukus slapukai be „sameSite“ atributo, arba su netinkama reikšme, bus laikomi „lax“. Tai reiškia, kad tokie slapukai nebus persiunčiami trečiųjų šalių kontekstuose. Jei jūsų programai reikia, kad šie slapukai egzistuotų tokiuose kontekstuose, prašome jiems pridėti „sameSite=none“ atributą. Norėdami sužinoti daugiau, skaitykite %2$S # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none" CookieSameSiteValueInvalid=Netinkama „sameSite“ atributo reikšmė slapukui „%1$S“. Galimos reikšmės: „lax“, „strict“, „none“. - # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookieOversize=Cookie “%1$S” is invalid because its size is too big. Max size is %2$S B. +CookieOversize=Slapukas „%1$S“ yra negalimas, nes jo dydis per didelis. Didžiausias dydis yra %2$S B. # LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B. +CookiePathOversize=Slapukas „%1$S“ yra negalimas, nes jo kelio dydis per didelis. Didžiausias dydis yra %2$S B. diff --git a/thunderbird-l10n/lt/localization/lt/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/lt/localization/lt/devtools/client/aboutdebugging.ftl index 6d92d4d2dfe3fae8cda011589317e997eacb3cee..95d6e158e46093b83e7e153b18ecd729e87c79bd 100644 --- a/thunderbird-l10n/lt/localization/lt/devtools/client/aboutdebugging.ftl +++ b/thunderbird-l10n/lt/localization/lt/devtools/client/aboutdebugging.ftl @@ -186,6 +186,9 @@ about-debugging-browser-version-too-old = Prijungto įrenginio darinio laida ({ # backward compatible changes broke the debugger in those scenarios (Bug 1528219). # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1") about-debugging-browser-version-too-old-67-debugger = Derintuvės polangis gali neveikti su prijungto įrenginio naršykle. Naudokite „Firefox“ { $runtimeVersion }, jeigu turite naudoti derintuvę su šia įrenginio naršykle. +# Dedicated message for a backward compatibility issue that occurs when connecting: +# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68. +about-debugging-browser-version-too-old-fennec = Ši „Firefox“ laida negali būti naudojama „Firefox“ (68), skirtos „Android“, derinimui. Testavimui rekomenduojame savo telefone įdiegti „Firefox for Android Nightly“. <a>Daugiau informacijos</a> # This string is displayed in the runtime page if the remote browser version is too recent. # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd) diff --git a/thunderbird-l10n/lt/localization/lt/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/lt/localization/lt/toolkit/about/aboutAddons.ftl index 325ba70fea5b19bfb9d47eb0197d996b37dbbc3e..059596bec382ff371ec81a8ca773c58998fd8ba9 100644 --- a/thunderbird-l10n/lt/localization/lt/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/lt/localization/lt/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Įdiegti priedą iš failo… .accesskey = d help-button = Priedų pagalba +sidebar-help-button-title = + .title = Priedų pagalba preferences = { PLATFORM() -> [windows] „{ -brand-short-name }“ nuostatos @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Visiems priedams taikomos priemonės +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] „{ -brand-short-name }“ nuostatos + *[other] „{ -brand-short-name }“ nuostatos + } show-unsigned-extensions-button = .label = Kai kurių plėtinių patikrinti nepavyko show-all-extensions-button = @@ -168,13 +176,29 @@ extensions-view-available-updates = .name = Galimi naujinimai .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Rekomendacijos +addon-category-discover-title = + .title = Rekomendacijos addon-category-extension = Plėtiniai +addon-category-extension-title = + .title = Plėtiniai addon-category-theme = Grafiniai apvalkalai +addon-category-theme-title = + .title = Grafiniai apvalkalai addon-category-plugin = Papildiniai +addon-category-plugin-title = + .title = Papildiniai addon-category-dictionary = Žodynai +addon-category-dictionary-title = + .title = Žodynai addon-category-locale = Kalbos +addon-category-locale-title = + .title = Kalbos addon-category-available-updates = Galimi naujinimai +addon-category-available-updates-title = + .title = Galimi naujinimai addon-category-recent-updates = Paskiausiai atnaujinti +addon-category-recent-updates-title = + .title = Paskiausiai atnaujinti ## These are global warnings @@ -287,6 +311,7 @@ shortcuts-no-commands = Šie priedai neturi sparčiųjų klavišų komandų: shortcuts-input = .placeholder = Surinkite klavišų kombinaciją shortcuts-browserAction = Įjungti priedą +shortcuts-browserAction2 = Aktyvuoti priemonių juostos mygtuką shortcuts-pageAction = Įjungti veiksmą tinklalapyje shortcuts-sidebarAction = Rodyti / slėpti šoninį polangį shortcuts-modifier-mac = Įtraukti Ctrl, Alt arba ⌘ @@ -313,6 +338,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Rodyti mažiau go-back-button = .tooltiptext = Eiti atgal +header-back-button = + .title = Eiti atgal ## Recommended add-ons page diff --git a/thunderbird-l10n/lt/localization/lt/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/lt/localization/lt/toolkit/about/aboutSupport.ftl index 89f0f0187fe6ab79c6254d864a1b17d6ac04b364..e129dd3704a1a410894c83c4b553101964378daf 100644 --- a/thunderbird-l10n/lt/localization/lt/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/lt/localization/lt/toolkit/about/aboutSupport.ftl @@ -292,6 +292,11 @@ sandbox-proc-type-content = turinys sandbox-proc-type-file = failo turinys sandbox-proc-type-media-plugin = medijos įskiepis sandbox-proc-type-data-decoder = duomenų iškoduotuvas +startup-cache-title = Paleisties podėlis +startup-cache-disk-cache-path = Disko podėlio kelias +startup-cache-ignore-disk-cache = Ignoruoti disko podėlį +startup-cache-found-disk-cache-on-init = Rastas disko podėlis įkėlimo metu +startup-cache-wrote-to-disk-cache = Įrašyta į disko podėlį launcher-process-status-0 = Įjungta launcher-process-status-1 = Išjungta dėl gedimo launcher-process-status-2 = Išjungta priverstinai @@ -315,6 +320,7 @@ touch-enabled = įjungta įvestis lietimu drag-enabled = slankjuostės tempimas įjungtas keyboard-enabled = klaviatūra įjungta autoscroll-enabled = automatinis slinkimas įjungtas +zooming-enabled = įjungtas tolygus artinimas suimant ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/lt/localization/lt/toolkit/about/certviewer.ftl b/thunderbird-l10n/lt/localization/lt/toolkit/about/certviewer.ftl index 3a496fcdd1134af94de4711b9481efc0d0f44eec..6cc12edca5fb1ef26f5f2081c90fa0f9d2acb87d 100644 --- a/thunderbird-l10n/lt/localization/lt/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/lt/localization/lt/toolkit/about/certviewer.ftl @@ -29,6 +29,8 @@ certificate-viewer-id = ID certificate-viewer-key-exchange-group = Apsikeitimo raktais grupė certificate-viewer-key-id = Rakto identifikatorius certificate-viewer-key-size = Rakto dydis +# Inc. means Incorporated, e.g GitHub is incorporated in Delaware +certificate-viewer-inc-locality = Centrinė buveinė certificate-viewer-locality = Vietovė certificate-viewer-location = Vieta certificate-viewer-logid = Įrašo identifikatorius @@ -95,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (chain) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Šis plėtinys buvo pažymėtas kaip kritinis, kas reiškia, kad klientai privalo atmesti liudijimą, jeigu jo nesupranta. +certificate-viewer-export = Eksportuoti + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Jūsų liudijimai +certificate-viewer-tab-people = Žmonės +certificate-viewer-tab-servers = Serveriai +certificate-viewer-tab-ca = Liudijimų įstaigos +certificate-viewer-tab-unkonwn = Nežinoma diff --git a/thunderbird-l10n/lt/localization/lt/toolkit/global/processTypes.ftl b/thunderbird-l10n/lt/localization/lt/toolkit/global/processTypes.ftl index 9cfe18c3ff9a4a5348d08fb0ff9fc790192b72a2..e2dc69d796269a7d096dffea61d39b3262a79a82 100644 --- a/thunderbird-l10n/lt/localization/lt/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/lt/localization/lt/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Izoliuotas saityno turinys # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Sujungimas diff --git a/thunderbird-l10n/lt/localization/lt/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/lt/localization/lt/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..9c257a5af387daf222a7b9df3b46eca135636541 --- /dev/null +++ b/thunderbird-l10n/lt/localization/lt/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Jūs paleidote senesnę „{ -brand-product-name }“ laidą + .style = width: 490px; +profiledowngrade-window-create = + .label = Kurti naują profilį +profiledowngrade-sync = Senesnės „{ -brand-product-name }“ laidos naudojimas gali sugadinti adresyną ir naršymo žurnalą, įrašytus jau esančiame „{ -brand-product-name }“ profilyje. Norėdami apsaugoti savo duomenis, šiai „{ -brand-short-name }“ įdiegčiai susikurkite naują profilį. Vėliau galėsite prisijungti su { -fxaccount-brand-name } ir sinchronizuoti savo adresyną bei naršymo istoriją tarp profilių. +profiledowngrade-nosync = Senesnės „{ -brand-product-name }“ laidos naudojimas gali sugadinti adresyną ir naršymo žurnalą, įrašytus jau esančiame „{ -brand-product-name }“ profilyje. Norėdami apsaugoti savo duomenis, šiai „{ -brand-short-name }“ įdiegčiai susikurkite naują profilį. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Išeiti + *[other] Išeiti + } diff --git a/thunderbird-l10n/lt/manifest.json b/thunderbird-l10n/lt/manifest.json index 4391fb1340549725a0c77d1c987762e1fec94086..c2e5ac39e2797a23ae95b065de0fd51749f9a299 100644 --- a/thunderbird-l10n/lt/manifest.json +++ b/thunderbird-l10n/lt/manifest.json @@ -1,57 +1,57 @@ { - "version": "76.0buildid20200407173003", - "langpack_id": "lt", - "manifest_version": 2, - "author": "Mozilla Lietuvoje (contributors: Gintautas Grigas, Tatjana Jevsikova, Rimas Kudelis, Sigita Pedzevičienė)", - "sources": { - "browser": { - "base_path": "browser/" - } - }, - "description": "Language pack for Thunderbird for lt", - "name": "Lietuvių Language Pack", - "applications": { - "gecko": { - "strict_min_version": "76.0", - "strict_max_version": "76.*", - "id": "langpack-lt@thunderbird.mozilla.org" - } - }, "languages": { "lt": { - "version": "20200405184421", "chrome_resources": { + "pluginproblem": "chrome/lt/locale/lt/pluginproblem/", + "messenger-newsblog": "chrome/lt/locale/lt/messenger-newsblog/", + "pippki": "chrome/lt/locale/lt/pippki/", + "calendar": "chrome/lt/locale/lt/calendar/", "lightning": "chrome/lt/locale/lt/lightning/", + "alerts": "chrome/lt/locale/lt/alerts/", "communicator": "chrome/lt/locale/lt/communicator/", + "necko": "chrome/lt/locale/lt/necko/", + "chat": "chrome/lt/locale/lt/chat/", "messenger-mapi": "chrome/lt/locale/lt/messenger-mapi/", "branding": "chrome/lt/locale/lt/branding/", - "mozapps": "chrome/lt/locale/lt/mozapps/", "passwordmgr": "chrome/lt/locale/lt/passwordmgr/", - "chat": "chrome/lt/locale/lt/chat/", + "devtools-startup": "chrome/lt/locale/lt/devtools/startup/", + "pipnss": "chrome/lt/locale/lt/pipnss/", "devtools": "chrome/lt/locale/lt/devtools/client/", - "messenger-newsblog": "chrome/lt/locale/lt/messenger-newsblog/", + "mozapps": "chrome/lt/locale/lt/mozapps/", + "devtools-shared": "chrome/lt/locale/lt/devtools/shared/", + "places": "chrome/lt/locale/lt/places/", + "autoconfig": "chrome/lt/locale/lt/autoconfig/", + "global": "chrome/lt/locale/lt/global/", + "messenger-region": "chrome/lt/locale/lt/messenger-region/", + "messenger": "chrome/lt/locale/lt/messenger/", + "messenger-smime": "chrome/lt/locale/lt/messenger-smime/", "global-platform": { - "macosx": "chrome/lt/locale/lt/global-platform/mac/", + "android": "chrome/lt/locale/lt/global-platform/unix/", "linux": "chrome/lt/locale/lt/global-platform/unix/", - "win": "chrome/lt/locale/lt/global-platform/win/", - "android": "chrome/lt/locale/lt/global-platform/unix/" + "macosx": "chrome/lt/locale/lt/global-platform/mac/", + "win": "chrome/lt/locale/lt/global-platform/win/" }, - "messenger": "chrome/lt/locale/lt/messenger/", - "mozldap": "chrome/lt/locale/lt/mozldap/", - "messenger-region": "chrome/lt/locale/lt/messenger-region/", - "autoconfig": "chrome/lt/locale/lt/autoconfig/", - "pippki": "chrome/lt/locale/lt/pippki/", - "alerts": "chrome/lt/locale/lt/alerts/", - "places": "chrome/lt/locale/lt/places/", - "pipnss": "chrome/lt/locale/lt/pipnss/", - "devtools-startup": "chrome/lt/locale/lt/devtools/startup/", - "devtools-shared": "chrome/lt/locale/lt/devtools/shared/", - "pluginproblem": "chrome/lt/locale/lt/pluginproblem/", - "global": "chrome/lt/locale/lt/global/", - "calendar": "chrome/lt/locale/lt/calendar/", - "necko": "chrome/lt/locale/lt/necko/", - "messenger-smime": "chrome/lt/locale/lt/messenger-smime/" - } + "mozldap": "chrome/lt/locale/lt/mozldap/" + }, + "version": "20200418172531" + } + }, + "sources": { + "browser": { + "base_path": "browser/" + } + }, + "author": "Mozilla Lietuvoje (contributors: Gintautas Grigas, Tatjana Jevsikova, Rimas Kudelis, Sigita Pedzevičienė)", + "manifest_version": 2, + "langpack_id": "lt", + "name": "Lietuvių Language Pack", + "description": "Language pack for Thunderbird for lt", + "version": "76.0buildid20200420212409", + "applications": { + "gecko": { + "strict_min_version": "76.0", + "id": "langpack-lt@thunderbird.mozilla.org", + "strict_max_version": "76.*" } } } diff --git a/thunderbird-l10n/ms/localization/ms/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ms/localization/ms/toolkit/about/aboutAddons.ftl index 8ca16bae08cfe6afbfcae9770612593f40001326..b7db3cc4aaec4bdc516723999efe679901e24706 100644 --- a/thunderbird-l10n/ms/localization/ms/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/ms/localization/ms/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Pasang Add-ons Dari Fail… .accesskey = I help-button = Sokongan Add-ons +sidebar-help-button-title = + .title = Sokongan Add-ons preferences = { PLATFORM() -> [windows] Pilihan { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Alatan untuk semua add-on +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Pilihan { -brand-short-name } + *[other] Keutamaan { -brand-short-name } + } show-unsigned-extensions-button = .label = Beberapa ekstensi tidak dapat disahkan show-all-extensions-button = @@ -141,12 +149,26 @@ extensions-view-available-updates = .name = Kemaskini Tersedia .tooltiptext = { extensions-view-available-updates.name } addon-category-extension = Ekstensi +addon-category-extension-title = + .title = Ekstensi addon-category-theme = Tema +addon-category-theme-title = + .title = Tema addon-category-plugin = Plugin +addon-category-plugin-title = + .title = Plugin addon-category-dictionary = Kamus +addon-category-dictionary-title = + .title = Kamus addon-category-locale = Bahasa +addon-category-locale-title = + .title = Bahasa addon-category-available-updates = Kemaskini Tersedia +addon-category-available-updates-title = + .title = Kemaskini Tersedia addon-category-recent-updates = Kemaskini Terkini +addon-category-recent-updates-title = + .title = Kemaskini Terkini ## These are global warnings diff --git a/thunderbird-l10n/ms/localization/ms/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ms/localization/ms/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..6fbe8159b2db12df85a3ecca3b73921192c6e43f --- /dev/null +++ b/thunderbird-l10n/ms/localization/ms/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,3 @@ +# 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/. diff --git a/thunderbird-l10n/ms/manifest.json b/thunderbird-l10n/ms/manifest.json index 1095a62c12017851cfd36a8c750d620e99271f93..b4cf652cd1afe38a31250109c07407588b8420ee 100644 --- a/thunderbird-l10n/ms/manifest.json +++ b/thunderbird-l10n/ms/manifest.json @@ -1,11 +1,5 @@ { - "name": "Bahasa Melayu (ms) Language Pack", "manifest_version": 2, - "sources": { - "browser": { - "base_path": "browser/" - } - }, "applications": { "gecko": { "strict_min_version": "76.0", @@ -13,45 +7,51 @@ "id": "langpack-ms@thunderbird.mozilla.org" } }, + "name": "Bahasa Melayu (ms) Language Pack", + "author": "mozilla.org (contributors: Joe Solon, Suzy Solon)", + "langpack_id": "ms", + "version": "76.0buildid20200420212409", "description": "Language pack for Thunderbird for ms", + "sources": { + "browser": { + "base_path": "browser/" + } + }, "languages": { "ms": { + "version": "20200415060535", "chrome_resources": { - "chat": "chrome/ms/locale/ms/chat/", + "alerts": "chrome/ms/locale/ms/alerts/", + "branding": "chrome/ms/locale/ms/branding/", "devtools-shared": "chrome/ms/locale/ms/devtools/shared/", - "devtools": "chrome/ms/locale/ms/devtools/client/", - "messenger-newsblog": "chrome/ms/locale/ms/messenger-newsblog/", - "lightning": "chrome/ms/locale/ms/lightning/", - "necko": "chrome/ms/locale/ms/necko/", - "passwordmgr": "chrome/ms/locale/ms/passwordmgr/", - "mozldap": "chrome/ms/locale/ms/mozldap/", - "devtools-startup": "chrome/ms/locale/ms/devtools/startup/", - "autoconfig": "chrome/ms/locale/ms/autoconfig/", - "calendar": "chrome/ms/locale/ms/calendar/", - "messenger-smime": "chrome/ms/locale/ms/messenger-smime/", - "communicator": "chrome/ms/locale/ms/communicator/", - "global": "chrome/ms/locale/ms/global/", - "pipnss": "chrome/ms/locale/ms/pipnss/", "places": "chrome/ms/locale/ms/places/", - "messenger-mapi": "chrome/ms/locale/ms/messenger-mapi/", "global-platform": { + "linux": "chrome/ms/locale/ms/global-platform/unix/", "android": "chrome/ms/locale/ms/global-platform/unix/", "macosx": "chrome/ms/locale/ms/global-platform/mac/", - "win": "chrome/ms/locale/ms/global-platform/win/", - "linux": "chrome/ms/locale/ms/global-platform/unix/" + "win": "chrome/ms/locale/ms/global-platform/win/" }, - "messenger-region": "chrome/ms/locale/ms/messenger-region/", - "pluginproblem": "chrome/ms/locale/ms/pluginproblem/", - "branding": "chrome/ms/locale/ms/branding/", + "messenger-smime": "chrome/ms/locale/ms/messenger-smime/", + "chat": "chrome/ms/locale/ms/chat/", "pippki": "chrome/ms/locale/ms/pippki/", - "alerts": "chrome/ms/locale/ms/alerts/", + "mozldap": "chrome/ms/locale/ms/mozldap/", + "global": "chrome/ms/locale/ms/global/", + "messenger-mapi": "chrome/ms/locale/ms/messenger-mapi/", + "autoconfig": "chrome/ms/locale/ms/autoconfig/", + "devtools": "chrome/ms/locale/ms/devtools/client/", + "calendar": "chrome/ms/locale/ms/calendar/", + "messenger-newsblog": "chrome/ms/locale/ms/messenger-newsblog/", "messenger": "chrome/ms/locale/ms/messenger/", - "mozapps": "chrome/ms/locale/ms/mozapps/" - }, - "version": "20200403075703" + "mozapps": "chrome/ms/locale/ms/mozapps/", + "communicator": "chrome/ms/locale/ms/communicator/", + "messenger-region": "chrome/ms/locale/ms/messenger-region/", + "lightning": "chrome/ms/locale/ms/lightning/", + "pluginproblem": "chrome/ms/locale/ms/pluginproblem/", + "necko": "chrome/ms/locale/ms/necko/", + "pipnss": "chrome/ms/locale/ms/pipnss/", + "devtools-startup": "chrome/ms/locale/ms/devtools/startup/", + "passwordmgr": "chrome/ms/locale/ms/passwordmgr/" + } } - }, - "langpack_id": "ms", - "version": "76.0buildid20200407173003", - "author": "mozilla.org (contributors: Joe Solon, Suzy Solon)" + } } diff --git a/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/devtools/client/inspector.properties b/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/devtools/client/inspector.properties index 47a0200a2fd5455a1599f3b8cd8a44be1e6e8725..851048c11ba1050a00eb437793f34bd9db40a445 100644 --- a/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/devtools/client/inspector.properties +++ b/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=This element has scrollable overflow. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=No associated rule +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Hold Shift and click to jump to rule + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/global/css.properties b/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/global/css.properties index 217ed9d1fffced2e7e6ba24c1231abbd9e11a706..cfe0e8f5ed9809cb6ecd1af7a1f0a31bb554a2d4 100644 --- a/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/global/css.properties +++ b/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=The stylesheet %1$S was loaded as CSS even though its MIME type, PEUnexpEOF2=Unexpected end of file while searching for %1$S. PEParseRuleWSOnly=Whitespace-only string given to be parsed as rule. + PEDeclDropped=Declaration dropped. PEDeclSkipped=Skipped to next declaration. PEUnknownProperty=Unknown property '%1$S'. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Only one repeat(auto-fill, …) is all PEMoreThanOneGridRepeatAutoFillFitInTrackList=Only one repeat(auto-fill, …) or repeat(auto-fit, …) is allowed in a track list. PEMoreThanOneGridRepeatTrackSize=Only one track size is allowed inside repeat(auto-fit/auto-fill, …). +PEDisallowedImportRule=@import-regler er ennå ikke gyldige i konstruerte stilsett. + TooLargeDashedRadius=Kantradius er for stor for ‘stiplet’ stil (grensen er 100000 px). Gjengis som fyllt. TooLargeDottedRadius=Kantradius er for stor for ‘prikket’ stil (grensen er 100000 px). Gjengis som fyllt. diff --git a/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/global/security/security.properties b/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/global/security/security.properties index 494f43fc8da129d7f7cd8228ba300954783a48c9..7402aac6bff7c2afb9d63b43d56d64bdb1f7e09f 100644 --- a/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/global/security/security.properties +++ b/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Lasting nektet av X-Frame-Options: «%1$S» fra «%2$S», nettstedet t # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Lasting nektet av X-Frame-Options: «%1$S» fra «%2$S», nettstedet tillater ikke kryss-opprinnelse innramming fra «%3$S». +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = En ugyldig X-Frame-Options-header ble funnet under innlesing av «%1$S»: «%2$S» er ikke et gyldig direktiv. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=Lasting av «%2$S» i en ramme blir nektet av «X-Frame-Options»-direktivet satt ti «%1$S». + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Oppgraderer usikker forespørsel «%1$S» til å bruke «%2$S». diff --git a/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/necko/necko.properties b/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/necko/necko.properties index a243e9be11bb3eb698d54688cd590dcd98704e9e..ad56de38dad21a274337b79b12aa3d80d3caf329 100644 --- a/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/necko/necko.properties +++ b/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Lagringstilgang ble automatisk tildel # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Lagringstilgang ble automatisk tildelt for sporer «%2$S» på «%1$S». +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Lagringstilgang ble automatisk tildelt for førstepartsisolasjon «%2$S» på «%1$S». + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Infokapsel «%1$S» ble avvist fordi den har attributten «sameSite=none», men mangler «secure»-attributten. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/nb-NO/localization/nb-NO/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/nb-NO/localization/nb-NO/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..dfe02707fdfab742b685674662e4a5c93992737f --- /dev/null +++ b/thunderbird-l10n/nb-NO/localization/nb-NO/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Omdirigering av URI for kalender +calendar-uri-redirect-description = + Serveren omdirigerer URI for kalenderen «{ $calendarName }». + Godta omdirigering og begynne å bruke den nye URI-en for denne kalenderen? +calendar-uri-redirect-original-uri-label = GJeldende URI: +calendar-uri-redirect-target-uri-label = Omdirigerer til ny URI: diff --git a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutAddons.ftl index 7520798023199562552708f865c2637d9be6065a..7d52eb8808867d32f168c14d8a49ea6284a66517 100644 --- a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Installer utvidelse fra fil … .accesskey = I help-button = Brukerstøtte for utvidelser +sidebar-help-button-title = + .title = Brukerstøtte for utvidelser preferences = { PLATFORM() -> [windows] { -brand-short-name }-innstillinger @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Verktøy for alle utvidelser +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name }-innstillinger + *[other] { -brand-short-name }-innstillinger + } show-unsigned-extensions-button = .label = Noen utvidelser kunne ikke bli kontrollert show-all-extensions-button = @@ -168,13 +176,29 @@ extensions-view-available-updates = .name = Tilgjengelige oppdateringer .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Anbefalinger +addon-category-discover-title = + .title = Anbefalinger addon-category-extension = Utvidelser +addon-category-extension-title = + .title = Utvidelser addon-category-theme = Temaer +addon-category-theme-title = + .title = Temaer addon-category-plugin = Programtillegg +addon-category-plugin-title = + .title = Programtillegg addon-category-dictionary = Ordbøker +addon-category-dictionary-title = + .title = Ordbøker addon-category-locale = Språk +addon-category-locale-title = + .title = Språk addon-category-available-updates = Tilgjengelige oppdateringer +addon-category-available-updates-title = + .title = Tilgjengelige oppdateringer addon-category-recent-updates = Nylig oppdatert +addon-category-recent-updates-title = + .title = Nylig oppdatert ## These are global warnings @@ -287,6 +311,7 @@ shortcuts-no-commands = Følgende utvidelser har ikke snarveier: shortcuts-input = .placeholder = Skriver inn en snarvei shortcuts-browserAction = Aktiver utvidelse +shortcuts-browserAction2 = Aktiver verktøylinjeknapp shortcuts-pageAction = Aktiver sidehandling shortcuts-sidebarAction = Vis/skjul sidestolpe shortcuts-modifier-mac = Inkluder Ctrl, Alt eller ⌘ @@ -311,6 +336,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Vis mindre go-back-button = .tooltiptext = Gå tilbake +header-back-button = + .title = Gå tilbake ## Recommended add-ons page diff --git a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutSupport.ftl index 316d7355387c017c9feed8297dfed224c24d0875..38427ea5b69db20b856a09fc6e53619fd538163e 100644 --- a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutSupport.ftl @@ -287,6 +287,11 @@ sandbox-proc-type-content = innhold sandbox-proc-type-file = filinnhold sandbox-proc-type-media-plugin = programtillegg for medier sandbox-proc-type-data-decoder = datadekoder +startup-cache-title = Oppstartshurtiglager +startup-cache-disk-cache-path = Sti for diskhurtiglager +startup-cache-ignore-disk-cache = Ignorer diskhurtiglager +startup-cache-found-disk-cache-on-init = Fant diskhurtiglager på Init +startup-cache-wrote-to-disk-cache = Skrev til diskhurtiglager launcher-process-status-0 = Aktivert launcher-process-status-1 = Deaktivert på grunn av feil launcher-process-status-2 = Tvunget deaktivert @@ -310,6 +315,7 @@ touch-enabled = touchinput påslått drag-enabled = dra og slipp av rullelinje påslått keyboard-enabled = tastatur aktivert autoscroll-enabled = automatisk rulling slått på +zooming-enabled = glatt pinch-zoom aktivert ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/certviewer.ftl b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/certviewer.ftl index 3094c92378bd975d666223c8573a986653f759f8..852e1cc59fc48eddff3a5c91129194c348245cc0 100644 --- a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (chain) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Denne utvidelsen er merket som kritisk, noe som betyr at klienter må avvise sertifikatet hvis de ikke forstår det. +certificate-viewer-export = Eksporter + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Dine sertifikater +certificate-viewer-tab-people = Personer +certificate-viewer-tab-servers = Servere +certificate-viewer-tab-ca = Utstedere +certificate-viewer-tab-unkonwn = Ukjent diff --git a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/global/processTypes.ftl b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/global/processTypes.ftl index 59a04068a41849f7d963abbb5206a78491dc56ab..783607e540c2192520792ff69173b612396a78bd 100644 --- a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Isolert nettinnhold # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..445971cc636497468b9df1f7cef472649dbba045 --- /dev/null +++ b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Du har startet en eldre versjon av { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Lag en ny profil +profiledowngrade-sync = Bruk av en eldre versjon av { -brand-product-name } kan ødelegge bokmerker og nettlesingshistorikk som allerede er lagret i en eksisterende { -brand-product-name }-profil. For å beskytte informasjonen din, opprett en ny profil for denne installasjonen av { -brand-short-name }. Du kan logge på med en { -fxaccount-brand-name } for å synkronisere bokmerker og nettleserhistorikken mellom ulike profiler. +profiledowngrade-nosync = Bruk av en eldre versjon av { -brand-product-name } kan ødelegge bokmerker og nettlesingshistorikken som allerede er lagret i en eksisterende { -brand-product-name }-profil. For å beskytte informasjonen din, opprett en ny profil for denne installasjonen av { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Avslutt + *[other] Avslutt + } diff --git a/thunderbird-l10n/nb-NO/manifest.json b/thunderbird-l10n/nb-NO/manifest.json index 00542177a9106d898158ec6f8d23a31e7f4ba26a..ef1f5dd31d2455a07443aa7178fd7fda6c8c5d36 100644 --- a/thunderbird-l10n/nb-NO/manifest.json +++ b/thunderbird-l10n/nb-NO/manifest.json @@ -1,57 +1,57 @@ { - "author": "firefox.no (contributors: Pascual Strømsnæs, Vidar Braut Haarr, Håvar Henriksen, Reidar Djupvik, Jan-Espen Pettersen, Håvard Mork, Lasse Marøen, Martin Joné, Morten Liljegren)", - "sources": { - "browser": { - "base_path": "browser/" - } - }, - "applications": { - "gecko": { - "id": "langpack-nb-NO@thunderbird.mozilla.org", - "strict_min_version": "76.0", - "strict_max_version": "76.*" - } - }, - "langpack_id": "nb-NO", "languages": { "nb-NO": { + "version": "20200420123524", "chrome_resources": { - "pluginproblem": "chrome/nb-NO/locale/nb-NO/pluginproblem/", - "lightning": "chrome/nb-NO/locale/nb-NO/lightning/", - "necko": "chrome/nb-NO/locale/nb-NO/necko/", - "messenger-newsblog": "chrome/nb-NO/locale/nb-NO/messenger-newsblog/", - "communicator": "chrome/nb-NO/locale/nb-NO/communicator/", + "devtools": "chrome/nb-NO/locale/nb-NO/devtools/client/", "branding": "chrome/nb-NO/locale/nb-NO/branding/", + "chat": "chrome/nb-NO/locale/nb-NO/chat/", + "pipnss": "chrome/nb-NO/locale/nb-NO/pipnss/", + "communicator": "chrome/nb-NO/locale/nb-NO/communicator/", + "messenger-smime": "chrome/nb-NO/locale/nb-NO/messenger-smime/", "alerts": "chrome/nb-NO/locale/nb-NO/alerts/", + "passwordmgr": "chrome/nb-NO/locale/nb-NO/passwordmgr/", + "messenger-mapi": "chrome/nb-NO/locale/nb-NO/messenger-mapi/", + "calendar": "chrome/nb-NO/locale/nb-NO/calendar/", "mozapps": "chrome/nb-NO/locale/nb-NO/mozapps/", - "devtools": "chrome/nb-NO/locale/nb-NO/devtools/client/", - "messenger-smime": "chrome/nb-NO/locale/nb-NO/messenger-smime/", + "devtools-startup": "chrome/nb-NO/locale/nb-NO/devtools/startup/", + "mozldap": "chrome/nb-NO/locale/nb-NO/mozldap/", + "pluginproblem": "chrome/nb-NO/locale/nb-NO/pluginproblem/", "devtools-shared": "chrome/nb-NO/locale/nb-NO/devtools/shared/", "messenger-region": "chrome/nb-NO/locale/nb-NO/messenger-region/", - "passwordmgr": "chrome/nb-NO/locale/nb-NO/passwordmgr/", + "messenger-newsblog": "chrome/nb-NO/locale/nb-NO/messenger-newsblog/", + "pippki": "chrome/nb-NO/locale/nb-NO/pippki/", "global-platform": { - "macosx": "chrome/nb-NO/locale/nb-NO/global-platform/mac/", "win": "chrome/nb-NO/locale/nb-NO/global-platform/win/", "linux": "chrome/nb-NO/locale/nb-NO/global-platform/unix/", + "macosx": "chrome/nb-NO/locale/nb-NO/global-platform/mac/", "android": "chrome/nb-NO/locale/nb-NO/global-platform/unix/" }, - "pippki": "chrome/nb-NO/locale/nb-NO/pippki/", - "calendar": "chrome/nb-NO/locale/nb-NO/calendar/", - "messenger-mapi": "chrome/nb-NO/locale/nb-NO/messenger-mapi/", - "global": "chrome/nb-NO/locale/nb-NO/global/", - "messenger": "chrome/nb-NO/locale/nb-NO/messenger/", - "devtools-startup": "chrome/nb-NO/locale/nb-NO/devtools/startup/", + "lightning": "chrome/nb-NO/locale/nb-NO/lightning/", "places": "chrome/nb-NO/locale/nb-NO/places/", - "pipnss": "chrome/nb-NO/locale/nb-NO/pipnss/", - "chat": "chrome/nb-NO/locale/nb-NO/chat/", - "mozldap": "chrome/nb-NO/locale/nb-NO/mozldap/", - "autoconfig": "chrome/nb-NO/locale/nb-NO/autoconfig/" - }, - "version": "20200403232428" + "necko": "chrome/nb-NO/locale/nb-NO/necko/", + "autoconfig": "chrome/nb-NO/locale/nb-NO/autoconfig/", + "global": "chrome/nb-NO/locale/nb-NO/global/", + "messenger": "chrome/nb-NO/locale/nb-NO/messenger/" + } } }, - "name": "Norsk (bokmål) Language Pack", - "description": "Language pack for Thunderbird for nb-NO", "manifest_version": 2, - "version": "76.0buildid20200407173003" + "sources": { + "browser": { + "base_path": "browser/" + } + }, + "langpack_id": "nb-NO", + "applications": { + "gecko": { + "strict_max_version": "76.*", + "strict_min_version": "76.0", + "id": "langpack-nb-NO@thunderbird.mozilla.org" + } + }, + "author": "firefox.no (contributors: Pascual Strømsnæs, Vidar Braut Haarr, Håvar Henriksen, Reidar Djupvik, Jan-Espen Pettersen, Håvard Mork, Lasse Marøen, Martin Joné, Morten Liljegren)", + "description": "Language pack for Thunderbird for nb-NO", + "name": "Norsk (bokmål) Language Pack", + "version": "76.0buildid20200420212409" } diff --git a/thunderbird-l10n/nl/chrome/nl/locale/nl/devtools/client/inspector.properties b/thunderbird-l10n/nl/chrome/nl/locale/nl/devtools/client/inspector.properties index 050c81b7f35216120f9321e9b6158c9f9a0936a7..cbd776be8c4d08904238192840a848170b018003 100644 --- a/thunderbird-l10n/nl/chrome/nl/locale/nl/devtools/client/inspector.properties +++ b/thunderbird-l10n/nl/chrome/nl/locale/nl/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Dit element heeft scrolbare overloop. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Geen gekoppelde regel +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Houd Shift ingedrukt en klik om naar de regel te springen + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/nl/chrome/nl/locale/nl/global/css.properties b/thunderbird-l10n/nl/chrome/nl/locale/nl/global/css.properties index fded64bd23b8cc7cc150105cc11c492ecb45e129..a43062b951ec8e39e8eecf059a17adae7c39dbd2 100644 --- a/thunderbird-l10n/nl/chrome/nl/locale/nl/global/css.properties +++ b/thunderbird-l10n/nl/chrome/nl/locale/nl/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=Het stijlblad %1$S werd geladen als CSS, hoewel het MIME-type erv PEUnexpEOF2=Onverwacht einde van bestand tijdens zoeken naar %1$S. PEParseRuleWSOnly=String met alleen witruimte gegeven om te parsen als regel. + PEDeclDropped=Declaratie genegeerd. PEDeclSkipped=Naar volgende declaratie gesprongen. PEUnknownProperty=Onbekende eigenschap ‘%1$S’. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Er is maar één repeat(auto-fill, … PEMoreThanOneGridRepeatAutoFillFitInTrackList=Er is maar één repeat(auto-fill, …) of repeat(auto-fit, …) in een track list toegestaan. PEMoreThanOneGridRepeatTrackSize=Er is maar één track size binnen repeat(auto-fit/auto-fill, …) toegestaan. +PEDisallowedImportRule=@import-regels zijn nog niet geldig in geconstrueerde stylesheets. + TooLargeDashedRadius=Border-straal is te groot voor ‘dashed’ stijl (de limiet is 100000px). Wordt gerenderd als solid. TooLargeDottedRadius=Border-straal is te groot voor ‘dotted’ stijl (de limiet is 100000px). Wordt gerenderd als solid. diff --git a/thunderbird-l10n/nl/chrome/nl/locale/nl/global/security/security.properties b/thunderbird-l10n/nl/chrome/nl/locale/nl/global/security/security.properties index 272902999982c85cc13ac76122875afd6f351e86..7c0eb221c9ff97dea9aaf5edbb4d602732a47008 100644 --- a/thunderbird-l10n/nl/chrome/nl/locale/nl/global/security/security.properties +++ b/thunderbird-l10n/nl/chrome/nl/locale/nl/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Laden door X-Frame-Options geweigerd: ‘%1$S’ van ‘%2$S’, websi # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Laden door X-Frame-Options geweigerd: ‘%1$S’ van ‘%2$S’, website staat cross-origin-framing van ‘%3$S’ niet toe. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Er is een ongeldige X-Frame-Options-koptekst gevonden bij het laden van ‘%2$S’: ‘%1$S’ is geen geldige richtlijn. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=Het laden in een frame van ‘%2$S’ is geweigerd door de richtlijn ‘X-Frame-Options’, die is ingesteld op ‘%1$S’. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Onveilige aanvraag ‘%1$S’ wordt geüpgraded voor gebruik van ‘%2$S’ diff --git a/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/messenger.dtd b/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/messenger.dtd index c9203573500ae91aa9d9942616db8d7a180c39e0..c30d3e82755cc7bbd4be953f215dc2c9bfe49803 100644 --- a/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/messenger.dtd +++ b/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Berichten zoeken…"> <!ENTITY searchMailCmd.accesskey "B"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Globaal zoeken…"> +<!ENTITY glodaSearchCmd.accesskey "G"> <!ENTITY searchAddressesCmd.label "Adressen zoeken…"> <!ENTITY searchAddressesCmd.accesskey "A"> diff --git a/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/pgpmime.properties b/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/pgpmime.properties index 1c46ebc21d6107195fb5e211d03ac5944c5a45c3..02b6445bc8a53e73b3fbe22456b920afad9939c8 100644 --- a/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/pgpmime.properties +++ b/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/pgpmime.properties @@ -9,3 +9,6 @@ # LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=Dit is een versleuteld OpenPGP-bericht.<br>Om deze e-mail te ontcijferen dient u een <a href="%S">OpenPGP-add-on</a> te installeren. + +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Dit is een versleuteld OpenPGP-bericht, maar ondersteuning voor OpenPGP-ontsleuteling is niet beschikbaar. diff --git a/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/preferences/advanced.dtd b/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/preferences/advanced.dtd index e71cbe23bcc342716a9dea7f04eb74483a317f04..576ce3c9348701a90fe1f5f26ddb66174fda3b0b 100644 --- a/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/preferences/advanced.dtd +++ b/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/preferences/advanced.dtd @@ -9,7 +9,7 @@ <!ENTITY itemCertificates.label "Certificaten"> <!-- General Settings --> -<!ENTITY enableGlodaSearch.label "Globaal zoeken en indexer activeren"> +<!ENTITY enableGlodaSearch.label "Globaal zoeken en indexeren activeren"> <!ENTITY enableGlodaSearch.accesskey "G"> <!ENTITY dateTimeFormatting.label "Datum- en tijdopmaak"> <!ENTITY languageSelector.label "Taal"> @@ -58,7 +58,7 @@ Strings from aboutDialog.dtd are displayed in this section of the preferences. Please check for possible accesskey conflicts. --> -<!ENTITY updateApp2.label "&brandShortName;-updates"> +<!ENTITY updateApp2.label "&brandShortName;-updates"> <!-- LOCALIZATION NOTE (updateApp.version.*): updateApp.version.pre is followed by a version number, keep the trailing space or replace it with a different character as needed. updateApp.version.post is displayed after @@ -118,10 +118,11 @@ <!ENTITY enableOCSP.label "OCSP-responderservers vragen om de huidige geldigheid van certificaten te bevestigen"> <!ENTITY enableOCSP.accesskey "v"> -<!ENTITY manageCertificates.label "Certificaten beheren"> -<!ENTITY manageCertificates.accesskey "C"> -<!ENTITY viewSecurityDevices.label "Beveiligingsapparaten"> -<!ENTITY viewSecurityDevices.accesskey "B"> +<!ENTITY manageCertificates.label "Certificaten beheren"> +<!ENTITY manageCertificates.accesskey "C"> +<!ENTITY viewSecurityDevices.label "Beveiligingsapparaten"> +<!ENTITY viewSecurityDevices.accesskey "B"> + <!ENTITY manageCertificates2.label "Certificaten beheren…"> <!ENTITY manageCertificates2.accesskey "C"> <!ENTITY viewSecurityDevices2.label "Beveiligingsapparaten…"> diff --git a/thunderbird-l10n/nl/chrome/nl/locale/nl/necko/necko.properties b/thunderbird-l10n/nl/chrome/nl/locale/nl/necko/necko.properties index 1b54ccf221cf724ba6ef7be31c0c8db86411867f..b498e0eb46387512348605ac135d864d13030573 100644 --- a/thunderbird-l10n/nl/chrome/nl/locale/nl/necko/necko.properties +++ b/thunderbird-l10n/nl/chrome/nl/locale/nl/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Toegang tot opslag automatisch verlee # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Toegang tot opslag automatisch verleend voor tracker ‘%2$S’ op ‘%1$S’. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Toegang tot opslag automatisch verleend voor isolatie van rechtstreekse cookie ‘%2$S’ op ‘%1$S’. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Cookie ‘%1$S’ is afgewezen omdat het het attribuut ‘sameSite=none’ bevat, maar het attribuut ‘secure’ ontbreekt. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/nl/localization/nl/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/nl/localization/nl/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..85a39f54f160d8f6e2d56c3c8887abb1d05ffe66 --- /dev/null +++ b/thunderbird-l10n/nl/localization/nl/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Omleiding agenda-URI +calendar-uri-redirect-description = + De server leidt de URI voor de agenda ‘{ $calendarName }’ om. + Deze omleiding accepteren en de nieuwe URI voor deze agenda gebruiken? +calendar-uri-redirect-original-uri-label = Huidige URI: +calendar-uri-redirect-target-uri-label = Omleiden naar nieuwe URI: diff --git a/thunderbird-l10n/nl/localization/nl/messenger/accountCentral.ftl b/thunderbird-l10n/nl/localization/nl/messenger/accountCentral.ftl index 76ff04c46908a082c87b58e76f90fe275e904960..0f0070723f613b7d0578657de2a01a1707371044 100644 --- a/thunderbird-l10n/nl/localization/nl/messenger/accountCentral.ftl +++ b/thunderbird-l10n/nl/localization/nl/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Welkom bij { -brand-full-name } +account-settings = Accountinstellingen +# $accounts (Number) - the number of configured accounts setup-title = Kies wat u wilt instellen about-title = Over { -brand-full-name } resources-title = Bronnen @@ -40,3 +42,10 @@ explore-link = Functies verkennen support-link = Ondersteuning involved-link = Meewerken developer-link = Documentatie voor ontwikkelaars +read = Berichten lezen +compose = Nieuw bericht opstellen +search = Berichten zoeken +filter = Berichtenfilters beheren +nntp-subscription = Nieuwsgroepabonnementen beheren +rss-subscription = Feedabonnementen beheren +e2e = End-to-end-versleuteling diff --git a/thunderbird-l10n/nl/localization/nl/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/nl/localization/nl/toolkit/about/aboutAddons.ftl index 7dec7e4b639f15e51321cc306bfd450cbe36d7cf..0b15e7a96ddbbe36ef68f1c4e25f123f9685e1de 100644 --- a/thunderbird-l10n/nl/localization/nl/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/nl/localization/nl/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Add-on installeren via bestand… .accesskey = s help-button = Add-on-ondersteuning +sidebar-help-button-title = + .title = Add-on-ondersteuning preferences = { PLATFORM() -> [windows] { -brand-short-name }-opties @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Hulpmiddelen voor alle add-ons +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name }-opties + *[other] { -brand-short-name }-voorkeuren + } show-unsigned-extensions-button = .label = Sommige extensies konden niet worden geverifieerd show-all-extensions-button = @@ -177,13 +185,29 @@ extensions-view-available-updates = .name = Beschikbare updates .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Aanbevelingen +addon-category-discover-title = + .title = Aanbevelingen addon-category-extension = Extensies +addon-category-extension-title = + .title = Extensies addon-category-theme = Thema’s +addon-category-theme-title = + .title = Thema’s addon-category-plugin = Plug-ins +addon-category-plugin-title = + .title = Plug-ins addon-category-dictionary = Woordenboeken +addon-category-dictionary-title = + .title = Woordenboeken addon-category-locale = Talen +addon-category-locale-title = + .title = Talen addon-category-available-updates = Beschikbare updates +addon-category-available-updates-title = + .title = Beschikbare updates addon-category-recent-updates = Recente updates +addon-category-recent-updates-title = + .title = Recente updates ## These are global warnings @@ -296,6 +320,7 @@ shortcuts-no-commands = De volgende extensies hebben geen sneltoetsen: shortcuts-input = .placeholder = Typ een sneltoets shortcuts-browserAction = Extensie activeren +shortcuts-browserAction2 = Werkbalkknop activeren shortcuts-pageAction = Pagina-actie activeren shortcuts-sidebarAction = De zijbalk in-/uitschakelen shortcuts-modifier-mac = Druk ook op Ctrl, Alt of ⌘ @@ -320,6 +345,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Minder tonen go-back-button = .tooltiptext = Teruggaan +header-back-button = + .title = Terug ## Recommended add-ons page diff --git a/thunderbird-l10n/nl/localization/nl/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/nl/localization/nl/toolkit/about/aboutSupport.ftl index 9292e153c375424050bcfafb62ddb49543535337..e3246382dc0f20fb6c4ae1665e77c0e2caf9335b 100644 --- a/thunderbird-l10n/nl/localization/nl/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/nl/localization/nl/toolkit/about/aboutSupport.ftl @@ -290,6 +290,11 @@ sandbox-proc-type-content = inhoud sandbox-proc-type-file = bestandsinhoud sandbox-proc-type-media-plugin = mediaplug-in sandbox-proc-type-data-decoder = gegevensdecoder +startup-cache-title = Opstartbuffer +startup-cache-disk-cache-path = Pad naar schijfbuffer +startup-cache-ignore-disk-cache = Schijfbuffer negeren +startup-cache-found-disk-cache-on-init = Schijfbuffer bij Init gevonden +startup-cache-wrote-to-disk-cache = Naar schijfbuffer geschreven launcher-process-status-0 = Ingeschakeld launcher-process-status-1 = Uitgeschakeld vanwege fout launcher-process-status-2 = Geforceerd uitgeschakeld @@ -313,6 +318,7 @@ touch-enabled = aanraakinvoer ingeschakeld drag-enabled = slepen via scrollbalk ingeschakeld keyboard-enabled = toetsenbord ingeschakeld autoscroll-enabled = automatisch scrollen ingeschakeld +zooming-enabled = soepele knijp-zoom ingeschakeld ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/nl/localization/nl/toolkit/about/certviewer.ftl b/thunderbird-l10n/nl/localization/nl/toolkit/about/certviewer.ftl index 7faec01ee2689e72c157f51d136543fb3d472288..6e79189400e54f67e696db51b02e8f572b30a6be 100644 --- a/thunderbird-l10n/nl/localization/nl/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/nl/localization/nl/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (keten) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Deze extensie is als kritiek gemarkeerd, wat betekent dat clients het certificaat moeten weigeren als ze het niet begrijpen. +certificate-viewer-export = Exporteren + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Uw certificaten +certificate-viewer-tab-people = Personen +certificate-viewer-tab-servers = Servers +certificate-viewer-tab-ca = Organisaties +certificate-viewer-tab-unkonwn = Onbekend diff --git a/thunderbird-l10n/nl/localization/nl/toolkit/global/processTypes.ftl b/thunderbird-l10n/nl/localization/nl/toolkit/global/processTypes.ftl index e53571d059c4dd77b0760c9715cf79558e933983..355a0361c869a0bb6b6c81597ededef66fe334f1 100644 --- a/thunderbird-l10n/nl/localization/nl/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/nl/localization/nl/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Geïsoleerde webinhoud # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/nl/localization/nl/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/nl/localization/nl/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..1b47a37851bdc7627bc16b5074f462564ee24c5f --- /dev/null +++ b/thunderbird-l10n/nl/localization/nl/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = U hebt een oudere versie van { -brand-product-name } gestart + .style = width: 490px; +profiledowngrade-window-create = + .label = Nieuw profiel aanmaken +profiledowngrade-sync = Het gebruik van een oudere versie van { -brand-product-name } kan bladwijzers en navigatiegeschiedenis die al in een bestaand { -brand-product-name }-profiel is opgeslagen beschadigen. Maak een nieuw profiel aan voor deze installatie van { -brand-short-name } om uw informatie te beschermen. U kunt zich altijd aanmelden met een { -fxaccount-brand-name } om uw bladwijzers en navigatiegeschiedenis tussen profielen te synchroniseren. +profiledowngrade-nosync = Het gebruik van een oudere versie van { -brand-product-name } kan bladwijzers en navigatiegeschiedenis die al in een bestaand { -brand-product-name }-profiel is opgeslagen beschadigen. Maak een nieuw profiel aan voor deze installatie van { -brand-short-name } om uw informatie te beschermen. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Afsluiten + *[other] Afsluiten + } diff --git a/thunderbird-l10n/nl/manifest.json b/thunderbird-l10n/nl/manifest.json index 96ea7de222a2a2da0db945e355ac4c30bce41dc4..f45fe4c9f111b194eade707e73a8f8dbe53a62f7 100644 --- a/thunderbird-l10n/nl/manifest.json +++ b/thunderbird-l10n/nl/manifest.json @@ -1,57 +1,57 @@ { - "name": "Nederlands (NL) Language Pack", + "sources": { + "browser": { + "base_path": "browser/" + } + }, "langpack_id": "nl", - "author": "mozilla.org (contributors: Gert-Paul van der Beek, Tim Maks van den Broek, Onno Ekker, Laurens Holst, Ton Kensen, Anne van Kesteren, Hendrik Maryns, Martijn Ras, leden MozBrowser-forum)", "manifest_version": 2, + "version": "76.0buildid20200420212409", + "author": "mozilla.org (contributors: Gert-Paul van der Beek, Tim Maks van den Broek, Onno Ekker, Laurens Holst, Ton Kensen, Anne van Kesteren, Hendrik Maryns, Martijn Ras, leden MozBrowser-forum)", + "applications": { + "gecko": { + "id": "langpack-nl@thunderbird.mozilla.org", + "strict_max_version": "76.*", + "strict_min_version": "76.0" + } + }, + "name": "Nederlands (NL) Language Pack", "description": "Language pack for Thunderbird for nl", "languages": { "nl": { + "version": "20200416071503", "chrome_resources": { "messenger-smime": "chrome/nl/locale/nl/messenger-smime/", - "lightning": "chrome/nl/locale/nl/lightning/", - "mozapps": "chrome/nl/locale/nl/mozapps/", - "pluginproblem": "chrome/nl/locale/nl/pluginproblem/", - "devtools": "chrome/nl/locale/nl/devtools/client/", "autoconfig": "chrome/nl/locale/nl/autoconfig/", - "passwordmgr": "chrome/nl/locale/nl/passwordmgr/", - "places": "chrome/nl/locale/nl/places/", - "messenger": "chrome/nl/locale/nl/messenger/", - "devtools-startup": "chrome/nl/locale/nl/devtools/startup/", - "mozldap": "chrome/nl/locale/nl/mozldap/", - "alerts": "chrome/nl/locale/nl/alerts/", - "branding": "chrome/nl/locale/nl/branding/", - "calendar": "chrome/nl/locale/nl/calendar/", + "messenger-mapi": "chrome/nl/locale/nl/messenger-mapi/", + "communicator": "chrome/nl/locale/nl/communicator/", "global-platform": { + "android": "chrome/nl/locale/nl/global-platform/unix/", "linux": "chrome/nl/locale/nl/global-platform/unix/", "win": "chrome/nl/locale/nl/global-platform/win/", - "macosx": "chrome/nl/locale/nl/global-platform/mac/", - "android": "chrome/nl/locale/nl/global-platform/unix/" + "macosx": "chrome/nl/locale/nl/global-platform/mac/" }, - "pipnss": "chrome/nl/locale/nl/pipnss/", - "chat": "chrome/nl/locale/nl/chat/", "necko": "chrome/nl/locale/nl/necko/", - "messenger-region": "chrome/nl/locale/nl/messenger-region/", - "messenger-mapi": "chrome/nl/locale/nl/messenger-mapi/", + "branding": "chrome/nl/locale/nl/branding/", + "places": "chrome/nl/locale/nl/places/", + "devtools": "chrome/nl/locale/nl/devtools/client/", + "alerts": "chrome/nl/locale/nl/alerts/", + "passwordmgr": "chrome/nl/locale/nl/passwordmgr/", + "messenger": "chrome/nl/locale/nl/messenger/", "pippki": "chrome/nl/locale/nl/pippki/", - "devtools-shared": "chrome/nl/locale/nl/devtools/shared/", - "global": "chrome/nl/locale/nl/global/", + "lightning": "chrome/nl/locale/nl/lightning/", "messenger-newsblog": "chrome/nl/locale/nl/messenger-newsblog/", - "communicator": "chrome/nl/locale/nl/communicator/" - }, - "version": "20200405083605" - } - }, - "applications": { - "gecko": { - "strict_min_version": "76.0", - "id": "langpack-nl@thunderbird.mozilla.org", - "strict_max_version": "76.*" - } - }, - "sources": { - "browser": { - "base_path": "browser/" + "pipnss": "chrome/nl/locale/nl/pipnss/", + "global": "chrome/nl/locale/nl/global/", + "mozapps": "chrome/nl/locale/nl/mozapps/", + "pluginproblem": "chrome/nl/locale/nl/pluginproblem/", + "devtools-shared": "chrome/nl/locale/nl/devtools/shared/", + "messenger-region": "chrome/nl/locale/nl/messenger-region/", + "mozldap": "chrome/nl/locale/nl/mozldap/", + "devtools-startup": "chrome/nl/locale/nl/devtools/startup/", + "chat": "chrome/nl/locale/nl/chat/", + "calendar": "chrome/nl/locale/nl/calendar/" + } } - }, - "version": "76.0buildid20200407173003" + } } diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/calendar/calendar.dtd b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/calendar/calendar.dtd index 419b52d6dd85f7a9a1fa32c3c26a9bf6aef3b985..d8440af89544448e3d9ef9c571933cce1139b2f2 100644 --- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/calendar/calendar.dtd +++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/calendar/calendar.dtd @@ -10,6 +10,7 @@ <!ENTITY calendar.newtask.button.tooltip "Lag ny oppgåve" > <!ENTITY calendar.unifinder.todoitems.label "Oppgåver" > + <!ENTITY calendar.unifinder.showcompletedtodos.label "Vis fullførte oppgåver"> <!ENTITY calendar.today.button.label "I dag"> @@ -364,6 +365,7 @@ <!ENTITY calendarproperties.firealarms.label "Vis alarmar"> <!ENTITY calendarproperties.cache3.label "Fråkopla støtte"> <!ENTITY calendarproperties.enabled.label "Slå på denne kalenderen"> +<!ENTITY calendarproperties.enabled2.label "Aktiver denne kalenderen"> <!ENTITY calendarproperties.forceDisabled.label "Fann ikkje tilbydaren av denne kalenderen. Dette skjer ofte om du har slått av eller avinstallert enkelte utvidingar."> <!ENTITY calendarproperties.unsubscribe.label "Stopp abonnement"> <!ENTITY calendarproperties.unsubscribe.accesskey "S"> @@ -407,5 +409,3 @@ <!ENTITY calendar.extract.task.button "Legg til som oppgåve"> <!ENTITY calendar.extract.event.button.tooltip "Hent ut kalenderinfo frå meldinga og legg til i kalenderen din som ei hending"> <!ENTITY calendar.extract.task.button.tooltip "Hent ut kalenderinfo frå meldinga og legg til i kalenderen din som ei oppgåve"> - -<!ENTITY calendarproperties.enabled2.label "Enable This Calendar"> diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/calendar/preferences/preferences.dtd b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/calendar/preferences/preferences.dtd index 5d802e2ee375d270a702d1ef4825a4f9fc2621c0..14b8f7428fe4180b210308fdc2ab8332cb5a7f29 100644 --- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/calendar/preferences/preferences.dtd +++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/calendar/preferences/preferences.dtd @@ -8,6 +8,4 @@ <!ENTITY paneViews.title "Utsjånad"> <!ENTITY panelHeader.title "Kalender"> <!ENTITY panelReminder.title "Påminningar"> -<!ENTITY panelCatecory.title "Kategoriar"> - -<!ENTITY panelCategory.title "Categories"> +<!ENTITY panelCategory.title "Kategoriar"> diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/devtools/client/inspector.properties b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/devtools/client/inspector.properties index 47a0200a2fd5455a1599f3b8cd8a44be1e6e8725..851048c11ba1050a00eb437793f34bd9db40a445 100644 --- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/devtools/client/inspector.properties +++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=This element has scrollable overflow. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=No associated rule +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Hold Shift and click to jump to rule + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global-platform/mac/accessible.properties b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global-platform/mac/accessible.properties index 808ead6b29dbdb8f3b5e65e2907e6275c59af533..4ccbcce7fabdc547c21e4c156d37b0800aa5a56b 100644 --- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global-platform/mac/accessible.properties +++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global-platform/mac/accessible.properties @@ -58,8 +58,7 @@ separator = skiljelinje tabPanel = fanepanel # The roleDescription for the html:mark element highlight = markere - # The roleDescription for the details element -details = details +details = detaljar # The roleDescription for the summary element -summary = summary +summary = samandrag diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/css.properties b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/css.properties index b7051be2eee6172b0f443296e21684b350747837..0ff128116be99f9bf687470121ac3900ec1af5ba 100644 --- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/css.properties +++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/css.properties @@ -180,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Berre ei repetering(auto-fill, …) er PEMoreThanOneGridRepeatAutoFillFitInTrackList=Berre ei repetering(auto-fill, …) eller repeterande(auto-fit, …) er tillate i ei sporliste. PEMoreThanOneGridRepeatTrackSize=Berre ein sporstorleik er tillate inne i repeterande(auto-fit/auto-fill, …). +PEDisallowedImportRule=@import-reglar er enno ikkje gyldige i konstruerte stilsett. + TooLargeDashedRadius=Kantradius er for stor for ‘stipla’ stil (grensa er 100000 px). Renderar som fyllt. TooLargeDottedRadius=Grensradius er for stor for ‘prikka’ stil (grensa er 100000 px). Renderar som fyllt. diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/dom/dom.properties b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/dom/dom.properties index 1dfefc388d8a46b822cf9b9800bdc42a11044b7a..131f1d6693af1dd54491a39586a5641667b629ec 100644 --- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/dom/dom.properties +++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/dom/dom.properties @@ -424,6 +424,5 @@ MathML_DeprecatedStyleAttributeWarning=MathML-attributene «background», «colo MathML_DeprecatedXLinkAttributeWarning=XLink-attributtene «href», «type», «show» og «actuate» er forelda på MathML-element og vil bli fjerna i framtida. WebShareAPI_Failed=Mislykka delingsoperasjon. WebShareAPI_Aborted=Avbroten delingsoperasjon. - # LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL. -UnknownProtocolNavigationPrevented=Prevented navigation to “%1$S” due to an unknown protocol. +UnknownProtocolNavigationPrevented=Hindra navigering til «%1$S» på grunn av ein ukjend protokoll. diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/security/security.properties b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/security/security.properties index 86e474aedd29d228e4c37a7bcc6f5050f0f6623f..33c7d6d59a014e671482d2fdf7c2771009824e36 100644 --- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/security/security.properties +++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/security/security.properties @@ -147,13 +147,16 @@ XFODeny = Lasting nekta av X-Frame-Options: «%1$S» fra «%2$S», nettstaden ti # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Lasting nekta av X-Frame-Options: «%1$S» frå «%2$S», nettstaden tillèt ikkje kryss-opphav innramming frå «%3$S». +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Ein ugyldig X-Frame-Options-header vart funnen under innlesing av «%1$S»: «%2$S» er ikkje eit gyldig direktiv. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=Lasting av «%2$S» i ei ramme vert nekta av «X-Frame-Options»-direktivet sett til «%1$S». + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Oppgraderer usikker førespurnad «%1$S» til å bruke «%2$S». # LOCALIZATION NOTE: %1$S is the URL of request. -HTTPSOnlyNoUpgrade = Førespurnad for «%1$S» vart ikkje oppgradert fordi han hadde NoUpgrade-flagget. - -# LOCALIZATION NOTE: %1$S is the URL of request. -HTTPSOnlyNoUpgradeException = Not upgrading insecure request “%1$S” because it is exempt. +HTTPSOnlyNoUpgradeException = Oppgraderer ikkje utrygg førespurnad «%1$S» fordi han er unntatt. # LOCALIZATION NOTE: %1$S is the URL of the failed request; %2$S is an error-code. -HTTPSOnlyFailedRequest = Upgrading insecure request “%1$S” failed. (%2$S) +HTTPSOnlyFailedRequest = Oppgradering av utrygg førespurnad «%1$S» mislyktast. (%2$S) diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/videocontrols.dtd b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/videocontrols.dtd index 7e0c2895279ddd1411d9c236e3421abd0d663871..c5dd4023963acd89d715713c3cf78b5801dd075b 100644 --- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/videocontrols.dtd +++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/videocontrols.dtd @@ -38,7 +38,7 @@ the Picture-in-Picture video toggle button when the mouse is hovering it. --> <!ENTITY error.noSource2 "Ingen video med eit støtta format eller MIME-type funne."> <!ENTITY error.generic "Videoavspeling avbroten på grunn av ukjend feil."> -<!ENTITY status.pictureInPicture "Denne videoen vert spela av i Picture-in-Picture-modus."> +<!ENTITY status.pictureInPicture "Denne videoen vert spela av i bilde-i-bilde modus."> <!-- LOCALIZATION NOTE (scrubberScale.nameFormat): the #1 string is the current media position, and the #2 string is the total duration. For example, when at diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/lightning/lightning.dtd b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/lightning/lightning.dtd index 0f3a416e7cee9bd0f694dba73022b82de6d8f35f..89e36999e1034308e7cad222c9d32ab4b5dbb3bc 100644 --- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/lightning/lightning.dtd +++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/lightning/lightning.dtd @@ -23,6 +23,8 @@ <!ENTITY lightning.menupopup.open.accesskey "O"> <!ENTITY lightning.menupopup.open.message.label "Lagra melding…"> <!ENTITY lightning.menupopup.open.message.accesskey "L"> + +<!-- Open menu popup in File menu --> <!ENTITY lightning.menupopup.open.calendar.label "Kalenderfil…"> <!ENTITY lightning.menupopup.open.calendar.accesskey "K"> @@ -67,6 +69,9 @@ <!ENTITY lightning.imipbar.btnDelete.tooltiptext "Slett frå kalenderen"> <!ENTITY lightning.imipbar.btnDetails.label "Detaljar…"> <!ENTITY lightning.imipbar.btnDetails.tooltiptext "Vis detaljar"> +<!ENTITY lightning.imipbar.btnDoNotShowImipBar.label "Ikkje vis meg desse meldingane"> +<!ENTITY lightning.imipbar.btnGoToCalendar.label "Kalender"> +<!ENTITY lightning.imipbar.btnGoToCalendar.tooltiptext "Gå til kalenderfana"> <!ENTITY lightning.imipbar.btnMore.label "Meir"> <!ENTITY lightning.imipbar.btnMore.tooltiptext "Trykk for å vise fleire val"> <!ENTITY lightning.imipbar.btnReconfirm2.label "Stadfest på nytt"> @@ -109,7 +114,3 @@ <!ENTITY todaypane.showTodayPane.label "Vis i dag-ruta"> <!ENTITY todaypane.showTodayPane.accesskey "a"> <!ENTITY todaypane.statusButton.label "I dag-ruta"> - -<!ENTITY lightning.imipbar.btnDoNotShowImipBar.label "Don't show me these messages"> -<!ENTITY lightning.imipbar.btnGoToCalendar.label "Calendar"> -<!ENTITY lightning.imipbar.btnGoToCalendar.tooltiptext "Go to the calendar tab"> diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/lightning/lightning.properties b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/lightning/lightning.properties index 6187798a7ff254a6af808c93917743a840af7e1f..842ffebf1956d95fc5d658b29d8a32e599e5b67f 100644 --- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/lightning/lightning.properties +++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/lightning/lightning.properties @@ -142,6 +142,7 @@ imipBarReplyToNotExistingItem=Denne meldinga inneheld eit svar som viser til ei imipBarReplyToRecentlyRemovedItem=Denne meldinga inneheld eit svar som viser til ei hending som vart fjerna frå kalenderen den %1$S. imipBarUnsupportedText=Denne meldinga inneheld ei hending som denne versjonen av Lightning ikkje kan lese. imipBarProcessingFailed=Klarte ikkje å handsame meldinga. Status: %1$S. +imipBarCalendarDeactivated=Denne meldinga inneheld informasjon om hendingar. Aktiver ein kalender for å handtere han. imipBarNotWritable=Ingen skrivbare kalendrar er konfigurerte for invitasjonar. Kontroller kalenderinnstillingane. imipSendMail.title=Informer deltakarar på e-post imipSendMail.text=Vil du sende ut kunngjeringar på e-post no? @@ -197,5 +198,3 @@ binaryComponentTitle=Feil %1$S-versjon # LOCALIZATION NOTE(noIdentitySelectedNotification): noIdentitySelectedNotification=Viss du vil bruka denne kalenderen for å lagra innbydingar til eller frå andre personar, skal du tildela ein e-postidentitet nedanfor. - -imipBarCalendarDeactivated=This message contains event information. Enable a calendar to handle it. diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger-smime/msgCompSMIMEOverlay.dtd b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger-smime/msgCompSMIMEOverlay.dtd index 200459c04f53cff8cc48f9b0d09cb98d09926c3b..b05abb949040cbfbe228eb4b11b50775a908c072 100644 --- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger-smime/msgCompSMIMEOverlay.dtd +++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger-smime/msgCompSMIMEOverlay.dtd @@ -5,11 +5,23 @@ <!--LOCALIZATION NOTE msgCompSMIMEOverlay.dtd UI for s/mime hooks in message composition --> <!ENTITY menu_securityEncryptRequire.label "Krypter denne meldinga"> + + +<!-- not yet used +<!ENTITY menu_securityEncryptOptional.label "Allow Encryption"> +<!ENTITY menu_securityEncryptOptional.accesskey "w"> +--> + <!ENTITY menu_securityEncryptRequire.accesskey "K"> <!ENTITY menu_securitySign.label "Signer denne meldinga digitalt"> <!ENTITY menu_securitySign.accesskey "S"> + + +<!ENTITY menu_techPGP.label "OpenPGP"> +<!ENTITY menu_techPGP.accesskey "O"> + <!ENTITY menu_securityStatus.label "Vis tryggingsinfo"> <!ENTITY menu_securityStatus.accesskey "V"> @@ -26,7 +38,5 @@ <!ENTITY menu_securityAttachMyKey.accesskey "A"> <!ENTITY menu_securityTech.label "Encryption Technology"> <!ENTITY menu_securityTech.accesskey "T"> -<!ENTITY menu_techPGP.label "OpenPGP"> -<!ENTITY menu_techPGP.accesskey "O"> <!ENTITY menu_techSMIME.label "S/MIME"> <!ENTITY menu_techSMIME.accesskey "S"> diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/am-smime.dtd b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/am-smime.dtd index 9ec4fe7c168859caa5e3d4d6a3996bbe65a43c81..e27a930a940a4110aa344920f95f97c92a7d78b3 100644 --- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/am-smime.dtd +++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/am-smime.dtd @@ -12,6 +12,10 @@ <!ENTITY alwaysEncryptMessage.label "Påkravd (alle mottakarar må ha sertifikat)"> <!ENTITY alwaysEncryptMessage.accesskey "P"> <!ENTITY encryptionCert.message "Bruk dette sertifikatet til å kryptera og dekryptera meldingar sendt til deg:"> + + + + <!ENTITY digitalSign.certificate.button "Vel…"> <!ENTITY digitalSign.certificate.accesskey "V"> <!ENTITY digitalSign.certificate_clear.button "Tøm"> @@ -31,11 +35,24 @@ <!ENTITY manageDevices.label "Tryggingseiningar"> <!ENTITY manageDevices.accesskey "T"> + + + + +<!ENTITY technologyOpenPGP.label "Føretrekk OpenPGP"> + +<!ENTITY openpgpKeys.label "OpenPGP"> +<!ENTITY manageKeys.label "Handter OpenPGP-nøklar"> + <!-- Strings for the cert picker dialog --> <!ENTITY certPicker.title "Vel sertifikat"> <!ENTITY certPicker.info "Sertifikat:"> <!ENTITY certPicker.detailsLabel "Detaljar om valt sertifikat:"> +<!ENTITY openpgpKey.message "Personleg nøkkel for kryptering og digital signering:"> +<!ENTITY openpgpKey.button "Still inn personleg nøkkel…"> +<!ENTITY openpgpKey.accesskey "o"> + <!ENTITY e2eTitle.label "End-To-End Encryption"> <!ENTITY e2eIntro.description "To send encrypted or digitally signed messages, you need to configure an encryption technology, either OpenPGP or S/MIME."> <!ENTITY e2eLearnMore.label "Learn more"> @@ -58,10 +75,4 @@ <!ENTITY manageDevices2.label "S/MIME Security Devices"> <!ENTITY manageDevices2.accesskey "y"> <!ENTITY technologySMIME.label "Prefer S/MIME"> -<!ENTITY technologyOpenPGP.label "Prefer OpenPGP"> -<!ENTITY openpgpKeys.label "OpenPGP"> -<!ENTITY manageKeys.label "Manage OpenPGP Keys"> <!ENTITY manageKeys.accesskey "K"> -<!ENTITY openpgpKey.message "Personal key for encryption and digital signing:"> -<!ENTITY openpgpKey.button "Set Personal Key…"> -<!ENTITY openpgpKey.accesskey "o"> diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/messengercompose/composeMsgs.properties b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/messengercompose/composeMsgs.properties index be3b67454ee07296d28624dc33f721f59a4795dd..90a64fd0e6b95b5a49dc30cc1b379c59aebc5a60 100644 --- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/messengercompose/composeMsgs.properties +++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/messengercompose/composeMsgs.properties @@ -362,6 +362,10 @@ smtpEnterPasswordPrompt=Skriv inn passordet ditt for %S: smtpEnterPasswordPromptWithUsername=Skriv inn passordet ditt for %2$S på %1$S: smtpEnterPasswordPromptTitle=SMTP tenaren krev passord +## LOCALIZATION NOTE(smtpEnterPasswordPromptTitleWithHostname): Do not translate the +## word %1$S. Place the word %1$S where the server host name should appear. +smtpEnterPasswordPromptTitleWithHostname=Passord er påkravd for utgåande (SMTP) server %1$S + # LOCALIZATION NOTE (removeAttachmentMsgs): Semi-colon list of plural forms. # See: https://developer.mozilla.org/en/Localization_and_Plurals removeAttachmentMsgs=Fjern vedlegg;Fjern vedlegg @@ -481,19 +485,14 @@ blockedContentPrefAccesskeyUnix=n ## LOCALIZATION NOTE(identityWarning): %S will be replaced with the identity name. identityWarning=Ein unik identitet som passar med frå-adressen vart ikkje funnen. Meldinga vert sendt ved hjelp av gjeldande frå-felt og innstillingar frå identiteten %S. -## Recipient pills fileds. -## LOCALIZATION NOTE(confirmRemoveRecipientRowTitle): %S will be replaced with the field name. -confirmRemoveRecipientRowTitle=Fjern %S -## LOCALIZATION NOTE(confirmRemoveRecipientRowTitle): %S will be replaced with the field name. -confirmRemoveRecipientRowBody=Alle adressene i %S-feltet blir fjerna. Vil du fortsetje? +## Recipient pills fields. +## LOCALIZATION NOTE(confirmRemoveRecipientRowTitle2): %S will be replaced with the field name. +## LOCALIZATION NOTE(confirmRemoveRecipientRowBody2): %S will be replaced with the field name. ## LOCALIZATION NOTE headersSpaceStyle is for aligning label of a newly create recipient row. ## It should be larger than the largest Header label and identical to &headersSpace2.style; headersSpaceStyle=width: 8em -## LOCALIZATION NOTE(smtpEnterPasswordPromptTitleWithHostname): Do not translate the -## word %1$S. Place the word %1$S where the server host name should appear. -smtpEnterPasswordPromptTitleWithHostname=Password Required for Outgoing (SMTP) Server %1$S ## Recipient pills fields. ## LOCALIZATION NOTE(confirmRemoveRecipientRowTitle2): %S will be replaced with the field name. confirmRemoveRecipientRowTitle2=Remove %S Addresses diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/necko/necko.properties b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/necko/necko.properties index c317169421bd3503754427ceacfec6e82e62f4bb..92fad4620130017bcfc9f27f9559a6c9a0748e36 100644 --- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/necko/necko.properties +++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Lagringstilgang vart automatisk tilde # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Lagringstilgang vart automatisk tildelt for sporfølgjaren "%2$S" på "%1$S". +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Lagringstilgang vart automatisk tildelt for førstepartsisolasjon «%2$S» på «%1$S». + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Infokapsel «%1$S» vart avvist fordi han har attributten «sameSite=none», men manglar «secure»-attributten. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". @@ -67,8 +70,7 @@ CookieLaxForced=Infokapsel «%1$S» har «sameSite»-policy sett til «lax» for CookieLaxForcedForBeta=Infokapsel «%1$S» har ikkje rett «sameSite» attributtverdi. Snart vil infokapslar utan attributten «sameSite» eller med ein ugyldig verdi bli behandla som «lax». Dette betyr at infokapselen ikkje lenger vil bli sendt i tredjeparts samanhengar. Dersom applikasjonen din er avhengig av at denne infokapselen er tilgjengeleg i slike samanhengar, kan du leggje til attributtet «sameSite=none». Les %2$S for å lære meir om «sameSite»-atributten # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none" CookieSameSiteValueInvalid=Ugyldig «sameSite»-verdi for infokapsel «%1$S». Dei støtta verdiane er: «lax», «strict» og «none». - # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookieOversize=Cookie “%1$S” is invalid because its size is too big. Max size is %2$S B. +CookieOversize=Infokapsel «%1$S» er ugyldig fordi størrelsen er for stor. Maks størrelse er %2$S B. # LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B. +CookiePathOversize=Infokapsel «%1$S» er ugyldig fordi filstistørrelsen er for stor. Maks størrelse er %2$S B. diff --git a/thunderbird-l10n/nn-NO/localization/nn-NO/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/nn-NO/localization/nn-NO/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..32056f5939f59bbe29d0299065e526992e59f8bf --- /dev/null +++ b/thunderbird-l10n/nn-NO/localization/nn-NO/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Omdirigering av URI for kalender +calendar-uri-redirect-description = + Serveren omdirigerer URI for kalenderen «{ $calendarName }». + Godta omdirigering og begynne å bruke den nye URI-en for denne kalenderen? +calendar-uri-redirect-original-uri-label = Gjeldande URI: +calendar-uri-redirect-target-uri-label = Omdirigerer til ny URI: diff --git a/thunderbird-l10n/nn-NO/localization/nn-NO/calendar/calendar-widgets.ftl b/thunderbird-l10n/nn-NO/localization/nn-NO/calendar/calendar-widgets.ftl new file mode 100644 index 0000000000000000000000000000000000000000..7b63121d7529a4c69fce93dbbe7e09a6ab77ff1a --- /dev/null +++ b/thunderbird-l10n/nn-NO/localization/nn-NO/calendar/calendar-widgets.ftl @@ -0,0 +1,6 @@ +# 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/. + +calendar-deactivated-notification-events = Alle kalendrar er akkurat noi deaktiverte. Aktiver ein eksisterande kalender, eller legg til ein ny for å opprette og redigere hendingar. +calendar-deactivated-notification-tasks = Alle kalendrar er akkurat no deaktiverte. Aktiver ein eksisterande kalender, eller legg til ein ny for å opprette og redigere oppgåver. diff --git a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/aboutAddons.ftl index 9bbc8f63f452261ae6b8f8fd8dc4d49b55b3084b..26903bff850b25baf8f4eb327964fbcd3af0e342 100644 --- a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Installer tillegg frå ei fil… .accesskey = I help-button = Brukarstøtte for tillegg +sidebar-help-button-title = + .title = Brukarstøtte for tillegg preferences = { PLATFORM() -> [windows] Innstillingar for { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Verktøy for alle tillegg +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Innstillingar for { -brand-short-name } + *[other] Innstillingar for { -brand-short-name } + } show-unsigned-extensions-button = .label = Nokre utvidingar kunne ikkje stadfestast show-all-extensions-button = @@ -168,13 +176,29 @@ extensions-view-available-updates = .name = Tilgjengelege oppdateringar .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Tilrådingar +addon-category-discover-title = + .title = Tilrådingar addon-category-extension = Utvidingar +addon-category-extension-title = + .title = Utvidingar addon-category-theme = Tema +addon-category-theme-title = + .title = Tema addon-category-plugin = Programtillegg +addon-category-plugin-title = + .title = Programtillegg addon-category-dictionary = Ordbøker +addon-category-dictionary-title = + .title = Ordbøker addon-category-locale = Språk +addon-category-locale-title = + .title = Språk addon-category-available-updates = Tilgjengelege oppdateringar +addon-category-available-updates-title = + .title = Tilgjengelege oppdateringar addon-category-recent-updates = Nyleg oppdatert +addon-category-recent-updates-title = + .title = Nyleg oppdatert ## These are global warnings @@ -287,6 +311,7 @@ shortcuts-no-commands = Følgjande utvidingar har ikkje snarvegar: shortcuts-input = .placeholder = Skriv inn ein snarveg shortcuts-browserAction = Aktiver utviding +shortcuts-browserAction2 = Aktiver verktøylinjeknapp shortcuts-pageAction = Aktiver sidehandling shortcuts-sidebarAction = Vis/skjul sidepanelet shortcuts-modifier-mac = Inkluder Ctrl, Alt eller ⌘ @@ -311,6 +336,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Vis mindre go-back-button = .tooltiptext = Gå tilbake +header-back-button = + .title = Gå tilbake ## Recommended add-ons page diff --git a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/aboutSupport.ftl index 418414366317c2119eaa5533a5cf03518b63109e..032c5c3f46ae5bf00bcaaefa097e3a56f9618524 100644 --- a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/aboutSupport.ftl @@ -287,6 +287,11 @@ sandbox-proc-type-content = innhald sandbox-proc-type-file = filinnhald sandbox-proc-type-media-plugin = programtillegg for media sandbox-proc-type-data-decoder = datadekodar +startup-cache-title = Oppstart-snøgglager +startup-cache-disk-cache-path = Sti for disk-snøgglager +startup-cache-ignore-disk-cache = Ignorer disk-snøgglager +startup-cache-found-disk-cache-on-init = Fann disk-snøgglager på Init +startup-cache-wrote-to-disk-cache = Skreiv til disk-snøgglager launcher-process-status-0 = Påslått launcher-process-status-1 = Deaktivert på grunn av feil launcher-process-status-2 = Tvungen deaktivering @@ -310,6 +315,7 @@ touch-enabled = tøtsj-input slått på drag-enabled = drag og slepp av rullelinje påslått keyboard-enabled = tastatur aktivert autoscroll-enabled = autorulling slått på +zooming-enabled = glatt pinch-zoom aktivert ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/certviewer.ftl b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/certviewer.ftl index 9b71db97712aa80c8654d1ec70cbedddd2f8c748..26892ee48b41506f995ed4c7df75f84616103128 100644 --- a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/certviewer.ftl @@ -29,6 +29,8 @@ certificate-viewer-id = ID certificate-viewer-key-exchange-group = Gruppe for nøkkelutveksling certificate-viewer-key-id = Nøkkel-ID certificate-viewer-key-size = Nøkkelstorleik +# Inc. means Incorporated, e.g GitHub is incorporated in Delaware +certificate-viewer-inc-locality = Organisasjonsplassering certificate-viewer-locality = Stad certificate-viewer-location = Adresse certificate-viewer-logid = Logg-ID @@ -95,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (chain) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Denne utvidinga er merkt som kritisk, noko som tyder at klientar må avvise sertifikatet dersom dei ikkje forstår det. +certificate-viewer-export = Eksporter + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Dine sertifikat +certificate-viewer-tab-people = Personar +certificate-viewer-tab-servers = Serverar +certificate-viewer-tab-ca = Utskrivarar +certificate-viewer-tab-unkonwn = Ukjent diff --git a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/global/processTypes.ftl b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/global/processTypes.ftl index 91c02385e5d0beba40a2e208b3370aaa90a43401..b8028def37e0d263b9b078796ac839231e44197e 100644 --- a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Isolert nettinnhald # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..bfbf6990f00dfa1236f50468a6ede92d5a3b34fb --- /dev/null +++ b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Du har starta ein eldre versjon av { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Lag ein ny profil +profiledowngrade-sync = Bruk av ein eldre versjon av { -brand-product-name } kan øydeleggje bokmerke og nettlesingshistorikk som allereie er lagra i ein eksisterande { -brand-product-name }-profil. For å beskytte informasjonen din, lag ein ny profil for denne installasjonen av { -brand-short-name }. Du kan logge på med ein { -fxaccount-brand-name } for å synkronisere bokmerke og nettlesarhistorikk mellom ulike profilar. +profiledowngrade-nosync = Bruk av ein eldre versjon av { -brand-product-name } kan øydeleggje bokmerke og nettlesingshistorikk som allereie er lagra i ein eksisterande { -brand-product-name }-profil. For å beskytte informasjonen din, lag ein ny profil for denne installasjonen av { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Avslutt + *[other] Avslutt + } diff --git a/thunderbird-l10n/nn-NO/manifest.json b/thunderbird-l10n/nn-NO/manifest.json index 9a832049a705ad75ba27ca020243853024121e5e..e9cdc9dba6b979469e7f224c857dfd3a306b6777 100644 --- a/thunderbird-l10n/nn-NO/manifest.json +++ b/thunderbird-l10n/nn-NO/manifest.json @@ -1,57 +1,57 @@ { + "manifest_version": 2, + "version": "76.0buildid20200420212409", "description": "Language pack for Thunderbird for nn-NO", - "name": "Norsk (nynorsk) Language Pack", "author": "firefox.no (contributors: Kurt-Rune Bergset, Eirik Ulltang Birkeland, Håvar Henriksen, Torstein Hønsi, Erik Klepsvik, Håvard Mork, Jan-Espen Pettersen, Tom Ottar Røw, Åsmund Skjæveland, Pascual Strømsnæs, Vebjørn Sture, Kristian Svanes, Bjørn I. Svindseth, Ronny Vårdal)", - "applications": { - "gecko": { - "id": "langpack-nn-NO@thunderbird.mozilla.org", - "strict_min_version": "76.0", - "strict_max_version": "76.*" - } - }, "sources": { "browser": { "base_path": "browser/" } }, - "manifest_version": 2, + "applications": { + "gecko": { + "strict_max_version": "76.*", + "id": "langpack-nn-NO@thunderbird.mozilla.org", + "strict_min_version": "76.0" + } + }, "languages": { "nn-NO": { - "version": "20200406121446", + "version": "20200420153332", "chrome_resources": { - "lightning": "chrome/nn-NO/locale/nn-NO/lightning/", - "devtools-startup": "chrome/nn-NO/locale/nn-NO/devtools/startup/", - "mozldap": "chrome/nn-NO/locale/nn-NO/mozldap/", - "branding": "chrome/nn-NO/locale/nn-NO/branding/", - "messenger": "chrome/nn-NO/locale/nn-NO/messenger/", - "messenger-region": "chrome/nn-NO/locale/nn-NO/messenger-region/", - "pipnss": "chrome/nn-NO/locale/nn-NO/pipnss/", - "global": "chrome/nn-NO/locale/nn-NO/global/", - "messenger-mapi": "chrome/nn-NO/locale/nn-NO/messenger-mapi/", "mozapps": "chrome/nn-NO/locale/nn-NO/mozapps/", + "devtools-shared": "chrome/nn-NO/locale/nn-NO/devtools/shared/", "communicator": "chrome/nn-NO/locale/nn-NO/communicator/", - "devtools": "chrome/nn-NO/locale/nn-NO/devtools/client/", + "chat": "chrome/nn-NO/locale/nn-NO/chat/", + "messenger-mapi": "chrome/nn-NO/locale/nn-NO/messenger-mapi/", + "pipnss": "chrome/nn-NO/locale/nn-NO/pipnss/", + "places": "chrome/nn-NO/locale/nn-NO/places/", + "lightning": "chrome/nn-NO/locale/nn-NO/lightning/", "alerts": "chrome/nn-NO/locale/nn-NO/alerts/", - "passwordmgr": "chrome/nn-NO/locale/nn-NO/passwordmgr/", - "devtools-shared": "chrome/nn-NO/locale/nn-NO/devtools/shared/", + "branding": "chrome/nn-NO/locale/nn-NO/branding/", "pluginproblem": "chrome/nn-NO/locale/nn-NO/pluginproblem/", "global-platform": { - "linux": "chrome/nn-NO/locale/nn-NO/global-platform/unix/", - "macosx": "chrome/nn-NO/locale/nn-NO/global-platform/mac/", "android": "chrome/nn-NO/locale/nn-NO/global-platform/unix/", + "macosx": "chrome/nn-NO/locale/nn-NO/global-platform/mac/", + "linux": "chrome/nn-NO/locale/nn-NO/global-platform/unix/", "win": "chrome/nn-NO/locale/nn-NO/global-platform/win/" }, - "autoconfig": "chrome/nn-NO/locale/nn-NO/autoconfig/", - "messenger-newsblog": "chrome/nn-NO/locale/nn-NO/messenger-newsblog/", - "chat": "chrome/nn-NO/locale/nn-NO/chat/", - "calendar": "chrome/nn-NO/locale/nn-NO/calendar/", - "messenger-smime": "chrome/nn-NO/locale/nn-NO/messenger-smime/", "pippki": "chrome/nn-NO/locale/nn-NO/pippki/", + "passwordmgr": "chrome/nn-NO/locale/nn-NO/passwordmgr/", "necko": "chrome/nn-NO/locale/nn-NO/necko/", - "places": "chrome/nn-NO/locale/nn-NO/places/" + "devtools": "chrome/nn-NO/locale/nn-NO/devtools/client/", + "global": "chrome/nn-NO/locale/nn-NO/global/", + "messenger": "chrome/nn-NO/locale/nn-NO/messenger/", + "devtools-startup": "chrome/nn-NO/locale/nn-NO/devtools/startup/", + "messenger-smime": "chrome/nn-NO/locale/nn-NO/messenger-smime/", + "autoconfig": "chrome/nn-NO/locale/nn-NO/autoconfig/", + "calendar": "chrome/nn-NO/locale/nn-NO/calendar/", + "messenger-region": "chrome/nn-NO/locale/nn-NO/messenger-region/", + "messenger-newsblog": "chrome/nn-NO/locale/nn-NO/messenger-newsblog/", + "mozldap": "chrome/nn-NO/locale/nn-NO/mozldap/" } } }, - "langpack_id": "nn-NO", - "version": "76.0buildid20200407173003" + "name": "Norsk (nynorsk) Language Pack", + "langpack_id": "nn-NO" } diff --git a/thunderbird-l10n/pl/chrome/pl/locale/pl/devtools/client/inspector.properties b/thunderbird-l10n/pl/chrome/pl/locale/pl/devtools/client/inspector.properties index 65df6e3868abfa051fef6f549be0c3118de3d0c2..9c0c3e39dc331da8db88a96d96e871ab927591b4 100644 --- a/thunderbird-l10n/pl/chrome/pl/locale/pl/devtools/client/inspector.properties +++ b/thunderbird-l10n/pl/chrome/pl/locale/pl/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Ten element ma przepełnienie, które można # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Brak powiązanej reguły +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Przytrzymaj Shift i kliknij, aby przejść do reguły + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/pl/chrome/pl/locale/pl/devtools/client/netmonitor.properties b/thunderbird-l10n/pl/chrome/pl/locale/pl/devtools/client/netmonitor.properties index c5c12889680bf417cb4615b5d4fac0ea1b2e924f..ff803579ed80dfe4b8f5f6fdecde54ddb98b528b 100644 --- a/thunderbird-l10n/pl/chrome/pl/locale/pl/devtools/client/netmonitor.properties +++ b/thunderbird-l10n/pl/chrome/pl/locale/pl/devtools/client/netmonitor.properties @@ -767,7 +767,7 @@ netmonitor.ws.context.received.accesskey=O # LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed # on the context menu that shows "Control Frames" WebSocket frames. -netmonitor.ws.context.controlFrames=Kontrola +netmonitor.ws.context.controlFrames=Kontrolne # LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key # for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. diff --git a/thunderbird-l10n/pl/chrome/pl/locale/pl/global/css.properties b/thunderbird-l10n/pl/chrome/pl/locale/pl/global/css.properties index e08e54f6212a9dcd94a30193fec0a25c47568b82..1c837f5c50e1f8b6093b0ce207c4225b852c6270 100644 --- a/thunderbird-l10n/pl/chrome/pl/locale/pl/global/css.properties +++ b/thunderbird-l10n/pl/chrome/pl/locale/pl/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=Arkusz stylów %1$S został wczytany jako poprawny CSS pomimo teg PEUnexpEOF2=Niespodziewany koniec pliku podczas poszukiwania %1$S. PEParseRuleWSOnly=Do przetwarzania przekazano ciąg składający się wyłącznie ze znaków odstępu. + PEDeclDropped=Deklaracja opuszczona. PEDeclSkipped=Przeskoczono do następnej deklaracji. PEUnknownProperty=Nieznana własność „%1$S”. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Tylko jedno wystąpienie „repeat(aut PEMoreThanOneGridRepeatAutoFillFitInTrackList=Tylko jedno wystąpienie „repeat(auto-fill, …)” oraz „repeat(auto-fit, …)” jest dozwolone na liście ścieżek. PEMoreThanOneGridRepeatTrackSize=Tylko jeden rozmiar ścieżki jest dozwolony wewnątrz „repeat(auto-fit/auto-fill, …)”. +PEDisallowedImportRule=Reguły @import nie są jeszcze prawidłowe w zbudowanych arkuszach stylów. + TooLargeDashedRadius=Promień obramowania jest zbyt duży dla stylu „dashed” (limit to 100000 px), wyświetlanie jako „solid”. TooLargeDottedRadius=Promień obramowania jest zbyt duży dla stylu „dotted” (limit to 100000 px), wyświetlanie jako „solid”. diff --git a/thunderbird-l10n/pl/chrome/pl/locale/pl/global/security/security.properties b/thunderbird-l10n/pl/chrome/pl/locale/pl/global/security/security.properties index 450e4c2e7d9d86806d6aea1dec56216c35c9760b..9ec74fff52e798992533556ef971cf02132d09dc 100644 --- a/thunderbird-l10n/pl/chrome/pl/locale/pl/global/security/security.properties +++ b/thunderbird-l10n/pl/chrome/pl/locale/pl/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = X-Frame-Options odmówiło wczytania: „%1$S” z „%2$S”, witryn # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = X-Frame-Options odmówiło wczytania: „%1$S” z „%2$S”, witryna nie zezwala na ramki innego pochodzenia z „%3$S”. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Podczas wczytywania „%2$S” znaleziono nieprawidłowy nagłówek X-Frame-Options: „%1$S” nie jest prawidłową dyrektywą. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=Dyrektywa „X-Frame-Options” ustawiona na „%1$S” odmówiła wczytania „%2$S” w ramce. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Zmiana niezabezpieczonego żądania „%1$S” na „%2$S”. diff --git a/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/messenger.dtd b/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/messenger.dtd index 8eec18b0527d6a55acec3e70919b1607730235a0..a21f360a353d3eec9dd79d28813e1c984df4cced 100644 --- a/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/messenger.dtd +++ b/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Wyszukaj wiadomości…"> <!ENTITY searchMailCmd.accesskey "m"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Wyszukaj…"> +<!ENTITY glodaSearchCmd.accesskey "W"> <!ENTITY searchAddressesCmd.label "Wyszukaj wizytówki…"> <!ENTITY searchAddressesCmd.accesskey "a"> diff --git a/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/messengercompose/composeMsgs.properties b/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/messengercompose/composeMsgs.properties index f90a6220abfdf7397293b6d8679baf5ca970298a..75d2f244ed183f8de352068d57c44489ae459a33 100644 --- a/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/messengercompose/composeMsgs.properties +++ b/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/messengercompose/composeMsgs.properties @@ -318,7 +318,7 @@ attachmentReminderMsg=Czy ta wiadomość nie powinna zawierać załączników? attachmentReminderKeywordsMsgs=Znaleziono słowo wskazujące na brakujący załącznik:;Znaleziono #1 słowa wskazujące na brakujący załącznik:;Znaleziono #1 słów wskazujących na brakujący załącznik: attachmentReminderOptionsMsg=Przypomnienia o brakujących załącznikach mogą zostać skonfigurowane w ustawieniach attachmentReminderYesIForgot=Faktycznie! -attachmentReminderFalseAlarm=Nie, wyślij teraz +attachmentReminderFalseAlarm=Nie, wyślij bez załączników # Strings used by the Filelink offer notification bar. learnMore.label=Więcej informacji… @@ -485,12 +485,6 @@ blockedContentPrefAccesskeyUnix=P ## LOCALIZATION NOTE(identityWarning): %S will be replaced with the identity name. identityWarning=Nie odnaleziono unikalnej tożsamości pasującej do adresu nadawcy. Wiadomość zostanie wysłana za pomocą obecnego pola nadawcy i ustawień z tożsamości „%S”. -## Recipient pills fileds. -## LOCALIZATION NOTE(confirmRemoveRecipientRowTitle): %S will be replaced with the field name. -confirmRemoveRecipientRowTitle=Usuwanie pola „%S” -## LOCALIZATION NOTE(confirmRemoveRecipientRowTitle): %S will be replaced with the field name. -confirmRemoveRecipientRowBody=Wszystkie adresy w polu „%S” zostaną usunięte. Czy chcesz kontynuować? - ## Recipient pills fields. ## LOCALIZATION NOTE(confirmRemoveRecipientRowTitle2): %S will be replaced with the field name. confirmRemoveRecipientRowTitle2=Usuwanie adresów z pola „%S” diff --git a/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/pgpmime.properties b/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/pgpmime.properties index df351be1dfca3b32947f965f19fcf47397d58dfa..9dc2414a17e36337613646f5a5f05bbba1447477 100644 --- a/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/pgpmime.properties +++ b/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/pgpmime.properties @@ -2,4 +2,13 @@ # 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/. -pgpMimeNeedsAddon=Wiadomość zaszyfrowana przy użyciu OpenPGP.<br>W celu odszyfrowania tej wiadomości wymagana jest instalacja <a href="%S">dodatku OpenPGP</a>. +# +# The following are used by the pgpmime content type handler +# + +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +# %S is the url to Enigmail on AMO supplied from preferences. +pgpMimeNeedsAddon=Wiadomość zaszyfrowana przy użyciu OpenPGP.<br>W celu odszyfrowania tej wiadomości wymagana jest instalacja <a href="%S">dodatku OpenPGP</a>. + +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Wiadomość zaszyfrowana przy użyciu OpenPGP, ale obsługa odszyfrowywania OpenPGP jest niedostępna. diff --git a/thunderbird-l10n/pl/chrome/pl/locale/pl/necko/necko.properties b/thunderbird-l10n/pl/chrome/pl/locale/pl/necko/necko.properties index cdd560f50d684f609bc43722ace1bd32fce9092b..406e5a7d12f8d092d50eba98d9543ec3939ce4b6 100644 --- a/thunderbird-l10n/pl/chrome/pl/locale/pl/necko/necko.properties +++ b/thunderbird-l10n/pl/chrome/pl/locale/pl/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Automatycznie zezwolono na dostęp do # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Automatycznie zezwolono na dostęp do przechowywania danych dla elementu śledzącego „%2$S” pod adresem „%1$S”. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Automatycznie zezwolono na dostęp do przechowywania danych dla izolacji typu First-Party „%2$S” pod adresem „%1$S”. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Ciasteczko „%1$S” zostało odrzucone, ponieważ ma atrybut „sameSite=none”, ale nie ma atrybutu „secure”. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/pl/localization/pl/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/pl/localization/pl/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..fe59fdbfb78126ab406cb468a3cbd21f1a7b16f1 --- /dev/null +++ b/thunderbird-l10n/pl/localization/pl/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Przekierowanie adresu URI kalendarza +calendar-uri-redirect-description = + Serwer przekierowuje adres URI kalendarza „{ $calendarName }”. + Czy zaakceptować przekierowanie i zacząć używać nowego adresu URI dla tego kalendarza? +calendar-uri-redirect-original-uri-label = Obecny adres URI: +calendar-uri-redirect-target-uri-label = Przekierowywanie do nowego adresu URI: diff --git a/thunderbird-l10n/pl/localization/pl/messenger/accountCentral.ftl b/thunderbird-l10n/pl/localization/pl/messenger/accountCentral.ftl index c793dd5030ab92a5bd21bb352cea43f5d4ea33f5..b07caf481b1b092ed5b3bd083600f59db021fdf4 100644 --- a/thunderbird-l10n/pl/localization/pl/messenger/accountCentral.ftl +++ b/thunderbird-l10n/pl/localization/pl/messenger/accountCentral.ftl @@ -3,7 +3,13 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Witamy w programie { -brand-full-name } -setup-title = Wybierz, co skonfigurować +account-settings = Ustawienia konta +# $accounts (Number) - the number of configured accounts +setup-title = + { $accounts -> + [0] Wybierz, co skonfigurować + *[other] Skonfiguruj następne konto + } about-title = O programie { -brand-full-name } resources-title = Więcej informacji release-notes = @@ -40,3 +46,10 @@ explore-link = Odkrywaj możliwości support-link = Pomoc involved-link = Dołącz do nas developer-link = Dokumentacja dla programistów +read = Przeczytaj wiadomości +compose = Napisz nową wiadomość +search = Wyszukaj wiadomości +filter = Zarządzaj filtrami wiadomości +nntp-subscription = Subskrybuj grupę dyskusyjną +rss-subscription = Subskrybuj aktualności +e2e = Szyfrowanie „end-to-end” diff --git a/thunderbird-l10n/pl/localization/pl/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/pl/localization/pl/toolkit/about/aboutAddons.ftl index fae2f0c5b200f14b8f6508ed5e94b4d49760ab7c..8a68ef938cb283b0fe6d96f043a9a7d15afb251b 100644 --- a/thunderbird-l10n/pl/localization/pl/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/pl/localization/pl/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Zainstaluj dodatek z pliku… .accesskey = Z help-button = Wsparcie dla dodatków +sidebar-help-button-title = + .title = Wsparcie dla dodatków preferences = { PLATFORM() -> [windows] Opcje programu @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Narzędzia dla wszystkich dodatków +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Opcje programu + *[other] Preferencje programu + } show-unsigned-extensions-button = .label = Niektóre rozszerzenia nie mogły zostać zweryfikowane show-all-extensions-button = @@ -168,13 +176,29 @@ extensions-view-available-updates = .name = Dostępne aktualizacje .tooltiptext = Wyświetl dostępne aktualizacje addon-category-discover = Polecane +addon-category-discover-title = + .title = Polecane addon-category-extension = Rozszerzenia +addon-category-extension-title = + .title = Rozszerzenia addon-category-theme = Motywy +addon-category-theme-title = + .title = Motywy addon-category-plugin = Wtyczki +addon-category-plugin-title = + .title = Wtyczki addon-category-dictionary = Słowniki +addon-category-dictionary-title = + .title = Słowniki addon-category-locale = Języki +addon-category-locale-title = + .title = Języki addon-category-available-updates = Dostępne aktualizacje +addon-category-available-updates-title = + .title = Dostępne aktualizacje addon-category-recent-updates = Ostatnie aktualizacje +addon-category-recent-updates-title = + .title = Ostatnie aktualizacje ## These are global warnings @@ -287,6 +311,7 @@ shortcuts-no-commands = Te rozszerzenia nie mają skrótów: shortcuts-input = .placeholder = Wprowadź skrót shortcuts-browserAction = Włącz rozszerzenie +shortcuts-browserAction2 = Włącz przycisk na pasku narzędzi shortcuts-pageAction = Włącz działanie na stronie shortcuts-sidebarAction = Przełącz panel boczny shortcuts-modifier-mac = Uwzględnij Ctrl, Alt lub ⌘ @@ -313,6 +338,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Mniej go-back-button = .tooltiptext = Wstecz +header-back-button = + .title = Wstecz ## Recommended add-ons page diff --git a/thunderbird-l10n/pl/localization/pl/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/pl/localization/pl/toolkit/about/aboutSupport.ftl index dd99b67dca031710a74df6dd8c3c0c983118c063..ab9d7b0e2de1b9ed216d542a4533f7cd8b6061af 100644 --- a/thunderbird-l10n/pl/localization/pl/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/pl/localization/pl/toolkit/about/aboutSupport.ftl @@ -296,6 +296,11 @@ sandbox-proc-type-content = zawartość sandbox-proc-type-file = zawartość pliku sandbox-proc-type-media-plugin = wtyczka sandbox-proc-type-data-decoder = dekoder danych +startup-cache-title = Pamięć podręczna uruchamiania +startup-cache-disk-cache-path = Ścieżka do pamięci podręcznej na dysku +startup-cache-ignore-disk-cache = Ignorowanie pamięci podręcznej na dysku +startup-cache-found-disk-cache-on-init = Odnaleziono pamięć podręczną na dysku podczas inicjacji +startup-cache-wrote-to-disk-cache = Zapisano do pamięci podręcznej na dysku launcher-process-status-0 = włączony launcher-process-status-1 = wyłączony z powodu awarii launcher-process-status-2 = wymuszone wyłączenie @@ -319,6 +324,7 @@ touch-enabled = dotyk drag-enabled = pasek przewijania keyboard-enabled = klawiatura autoscroll-enabled = automatyczne przewijanie +zooming-enabled = płynne powiększanie gestem ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/pl/localization/pl/toolkit/about/certviewer.ftl b/thunderbird-l10n/pl/localization/pl/toolkit/about/certviewer.ftl index c4fd53963be8316d5de2f1e7062b0fbe1040cbf5..35a393d70fef5bccbe46ad81136054370966c40f 100644 --- a/thunderbird-l10n/pl/localization/pl/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/pl/localization/pl/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (certyfikat) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (łańcuch) .download = { $fileName }-łańcuch.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = To rozszerzenie zostało oznaczone jako krytyczne, co oznacza, że klienci muszą odrzucić certyfikat, jeśli go nie rozumieją. +certificate-viewer-export = Eksportuj + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Użytkownik +certificate-viewer-tab-people = Osoby +certificate-viewer-tab-servers = Serwery +certificate-viewer-tab-ca = Organy certyfikacji +certificate-viewer-tab-unkonwn = Nieznane diff --git a/thunderbird-l10n/pl/localization/pl/toolkit/global/processTypes.ftl b/thunderbird-l10n/pl/localization/pl/toolkit/global/processTypes.ftl index d7150fca1bb70a88c86c73570b06b5097bf10b0a..f7abbac6ed457a232df32ecf44705ecdcbe53570 100644 --- a/thunderbird-l10n/pl/localization/pl/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/pl/localization/pl/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Wydzielone strony # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Gniazdo diff --git a/thunderbird-l10n/pl/localization/pl/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/pl/localization/pl/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..554e4fbda96b4e8bb9490bfdc63a9b422059b9ec --- /dev/null +++ b/thunderbird-l10n/pl/localization/pl/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Uruchomiono starszą wersję programu { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Utwórz nowy profil +profiledowngrade-sync = Używanie starszej wersji programu { -brand-product-name } może uszkodzić zakładki i historię przeglądania już zachowaną w istniejącym profilu programu { -brand-product-name }. Aby chronić swoje dane, utwórz nowy profil dla tej instalacji programu { -brand-short-name }. Zawsze można zalogować się na { -fxaccount-brand-name(case: "loc", capitalization: "lower") }, aby synchronizować zakładki i historię przeglądania między profilami. +profiledowngrade-nosync = Używanie starszej wersji programu { -brand-product-name } może uszkodzić zakładki i historię przeglądania już zachowaną w istniejącym profilu programu { -brand-product-name }. Aby chronić swoje dane, utwórz nowy profil dla tej instalacji programu { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Zakończ + *[other] Zakończ + } diff --git a/thunderbird-l10n/pl/manifest.json b/thunderbird-l10n/pl/manifest.json index 21dd17c04d811e560c01ef8f7d4739ad61e12f5e..8f84345a098871c64dc3d206170f021fda9b7f73 100644 --- a/thunderbird-l10n/pl/manifest.json +++ b/thunderbird-l10n/pl/manifest.json @@ -1,9 +1,11 @@ { + "name": "Polski Language Pack", + "langpack_id": "pl", "applications": { "gecko": { "strict_min_version": "76.0", - "strict_max_version": "76.*", - "id": "langpack-pl@thunderbird.mozilla.org" + "id": "langpack-pl@thunderbird.mozilla.org", + "strict_max_version": "76.*" } }, "sources": { @@ -11,47 +13,45 @@ "base_path": "browser/" } }, - "langpack_id": "pl", - "author": "Aviary.pl (contributors: Aviary.pl, Piotr Komoda, Zbigniew Braniecki, Marek Wawoczny, Piotr Bartecki, Stefan Plewako)", - "name": "Polski Language Pack", "languages": { "pl": { + "version": "20200418114439", "chrome_resources": { - "branding": "chrome/pl/locale/pl/branding/", - "pippki": "chrome/pl/locale/pl/pippki/", - "messenger-region": "chrome/pl/locale/pl/messenger-region/", - "calendar": "chrome/pl/locale/pl/calendar/", - "mozldap": "chrome/pl/locale/pl/mozldap/", - "pluginproblem": "chrome/pl/locale/pl/pluginproblem/", - "pipnss": "chrome/pl/locale/pl/pipnss/", - "devtools": "chrome/pl/locale/pl/devtools/client/", - "messenger-mapi": "chrome/pl/locale/pl/messenger-mapi/", - "lightning": "chrome/pl/locale/pl/lightning/", - "necko": "chrome/pl/locale/pl/necko/", - "devtools-shared": "chrome/pl/locale/pl/devtools/shared/", - "communicator": "chrome/pl/locale/pl/communicator/", - "messenger-newsblog": "chrome/pl/locale/pl/messenger-newsblog/", - "devtools-startup": "chrome/pl/locale/pl/devtools/startup/", + "alerts": "chrome/pl/locale/pl/alerts/", "global-platform": { - "macosx": "chrome/pl/locale/pl/global-platform/mac/", "android": "chrome/pl/locale/pl/global-platform/unix/", - "win": "chrome/pl/locale/pl/global-platform/win/", - "linux": "chrome/pl/locale/pl/global-platform/unix/" + "macosx": "chrome/pl/locale/pl/global-platform/mac/", + "linux": "chrome/pl/locale/pl/global-platform/unix/", + "win": "chrome/pl/locale/pl/global-platform/win/" }, - "places": "chrome/pl/locale/pl/places/", - "autoconfig": "chrome/pl/locale/pl/autoconfig/", + "pipnss": "chrome/pl/locale/pl/pipnss/", + "communicator": "chrome/pl/locale/pl/communicator/", + "global": "chrome/pl/locale/pl/global/", + "messenger-mapi": "chrome/pl/locale/pl/messenger-mapi/", "chat": "chrome/pl/locale/pl/chat/", - "passwordmgr": "chrome/pl/locale/pl/passwordmgr/", "mozapps": "chrome/pl/locale/pl/mozapps/", + "pluginproblem": "chrome/pl/locale/pl/pluginproblem/", "messenger": "chrome/pl/locale/pl/messenger/", + "lightning": "chrome/pl/locale/pl/lightning/", + "messenger-newsblog": "chrome/pl/locale/pl/messenger-newsblog/", + "devtools": "chrome/pl/locale/pl/devtools/client/", + "passwordmgr": "chrome/pl/locale/pl/passwordmgr/", + "devtools-shared": "chrome/pl/locale/pl/devtools/shared/", + "messenger-region": "chrome/pl/locale/pl/messenger-region/", + "pippki": "chrome/pl/locale/pl/pippki/", + "branding": "chrome/pl/locale/pl/branding/", + "devtools-startup": "chrome/pl/locale/pl/devtools/startup/", + "calendar": "chrome/pl/locale/pl/calendar/", + "autoconfig": "chrome/pl/locale/pl/autoconfig/", + "mozldap": "chrome/pl/locale/pl/mozldap/", + "places": "chrome/pl/locale/pl/places/", "messenger-smime": "chrome/pl/locale/pl/messenger-smime/", - "global": "chrome/pl/locale/pl/global/", - "alerts": "chrome/pl/locale/pl/alerts/" - }, - "version": "20200404095343" + "necko": "chrome/pl/locale/pl/necko/" + } } }, "description": "Language pack for Thunderbird for pl", "manifest_version": 2, - "version": "76.0buildid20200407173003" + "version": "76.0buildid20200420212409", + "author": "Aviary.pl (contributors: Aviary.pl, Piotr Komoda, Zbigniew Braniecki, Marek Wawoczny, Piotr Bartecki, Stefan Plewako)" } diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/devtools/client/inspector.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/devtools/client/inspector.properties index c11c7bfbc3df959fdbba6aca382607c6ffa7d713..640ba027a1c24880c0bf83a4cec30e45c7cfd590 100644 --- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/devtools/client/inspector.properties +++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=This element has scrollable overflow. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=No associated rule +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Hold Shift and click to jump to rule + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/css.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/css.properties index 1709630c54fa3cdde53f5d43f5ba327ddfca9543..c75f2a0714b3c2838603a65793f4c5152aa60be7 100644 --- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/css.properties +++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=The stylesheet %1$S was loaded as CSS even though its MIME type, PEUnexpEOF2=Unexpected end of file while searching for %1$S. PEParseRuleWSOnly=Whitespace-only string given to be parsed as rule. + PEDeclDropped=Declaration dropped. PEDeclSkipped=Skipped to next declaration. PEUnknownProperty=Unknown property ‘%1$S’. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Apenas um repeat(auto-fill, …) é ac PEMoreThanOneGridRepeatAutoFillFitInTrackList=Apenas um repeat(auto-fill, …) ou repeat(auto-fit, …) é aceito numa lista de faixas. PEMoreThanOneGridRepeatTrackSize=Apenas um tamanho de faixa é aceito dentro de repeat(auto-feit, /auto-fill,…). +PEDisallowedImportRule=As regras @import ainda não são válidas nas folhas de estilo construídas. + TooLargeDashedRadius=Border radius is too large for ‘dashed’ style (the limit is 100000px). Rendering as solid. TooLargeDottedRadius=Border radius is too large for ‘dotted’ style (the limit is 100000px). Rendering as solid. diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/nsWebBrowserPersist.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/nsWebBrowserPersist.properties index cd7be6e06072525d5ecd3f3ce308c9eb118308b6..f78c5ab64e0dd6f9f9737c82304faa84981b0979 100644 --- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/nsWebBrowserPersist.properties +++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/nsWebBrowserPersist.properties @@ -5,8 +5,8 @@ readError=%S could not be saved, because the source file could not be read.\n\nTry again later, or contact the server administrator. writeError=%S could not be saved, because an unknown error occurred.\n\nTry saving to a different location. launchError=%S could not be opened, because an unknown error occurred.\n\nTry saving to disk first and then opening the file. -diskFull=There is not enough room on the disk to save %S.\n\nRemove unnecessary files from the disk and try again, or try saving in a different location. -readOnly=%S could not be saved, because the disk, folder, or file is write-protected.\n\nWrite-enable the disk and try again, or try saving in a different location. +diskFull=Não há espaço suficiente no disco para salvar %S.\n\nRemova arquivos desnecessários e tente novamente, ou salve em outro local. +readOnly=%S não pôde ser salvo porque o disco, a pasta ou o arquivo estão protegidos contra gravação.\n\nMude a permissão de escrita e tente novamente, ou salve em outro local. accessError=%S could not be saved, because you cannot change the contents of that folder.\n\nChange the folder properties and try again, or try saving in a different location. SDAccessErrorCardReadOnly=Cannot download file because the SD card is in use. SDAccessErrorCardMissing=Cannot download file because the SD card is missing. diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/security/security.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/security/security.properties index 22fde750ae54ba009c2069e137b8df6d94512617..8395fe7c094518a63e45705599142d8a101089b4 100644 --- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/security/security.properties +++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Carregamento negado pelo X-Frame-Options: “%1$S” de “%2$S”, o # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Carregamento negado pelo X-Frame-Options: “%1$S” de “%2$S”, o site não permite frames de origens diferentes em “%3$S”. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Cabeçalho X-Frame-Options inválido encontrado ao carregar “%2$S”: “%1$S” não é uma diretiva válida. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=O carregamento de “%2$S” em um frame é negado pela diretiva “X-Frame-Options“ definida como “%1$S“. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Atualizando solicitação insegura “%1$S” para usar “%2$S”. diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/addons.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/addons.properties index 3e44f0575793e9d55b138d370513ac8c7705ea11..c2fdc6a6002b826f7292ab4c21f93c00c7b450e7 100644 --- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/addons.properties +++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/addons.properties @@ -126,6 +126,8 @@ addonInstallErrorBlocklisted=%S não pôde ser instalada porque tem um elevado r # Note, this string will be used as raw markup. Avoid characters like <, >, & webextPerms.header=Adicionar %S? +# %S is brandShortName +webextPerms.experimentWarning=Extensões maliciosas podem roubar suas informações privativas ou comprometer seu computador. Só instale esta extensão se confiar na origem. webextPerms.unsignedWarning=Cuidado: esta extensão não foi verificada. Extensões maliciosas podem roubar suas informações privativas ou comprometer seu computador. Somente instale esta extensão se você confiar na origem. # LOCALIZATION NOTE (webextPerms.listIntro) @@ -194,6 +196,9 @@ webextPerms.description.devtools=Estender as ferramentas de desenvolvimento para webextPerms.description.dns=Acessar o endereço IP e o nome do servidor webextPerms.description.downloads=Baixar arquivos, ler e modificar o histórico de download do navegador webextPerms.description.downloads.open=Abrir arquivos baixados no seu computador +# LOCALIZATION NOTE (webextPerms.description.experiment) +# %S will be replaced with the name of the application +webextPerms.description.experiment=Ter acesso total e irrestrito ao %S e ao seu computador webextPerms.description.find=Ler o texto de todas as abas abertas webextPerms.description.geolocation=Acessar sua localização webextPerms.description.history=Acessar o histórico de navegação @@ -258,9 +263,3 @@ webext.remove.confirmation.title=Remover %S # %2$S is brandShorterName webext.remove.confirmation.message=Remover %1$S do %2$S? webext.remove.confirmation.button=Remover - -# %S is brandShortName -webextPerms.experimentWarning=Malicious add-ons can steal your private information or compromise your computer. Only install this add-on if you trust the source. -# LOCALIZATION NOTE (webextPerms.description.experiment) -# %S will be replaced with the name of the application -webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/customizeToolbar.dtd b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/customizeToolbar.dtd index 60aba62ddc06aafdb610447c7ceb1bb603d1d4fd..60e74f0168dc79c5f8528ce53264ccaf8e5667b5 100644 --- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/customizeToolbar.dtd +++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/customizeToolbar.dtd @@ -15,8 +15,7 @@ <!ENTITY addNewToolbar.label "Adicionar nova barra de ferramentas"> <!ENTITY showTitlebar.label "Mostrar barra de título"> <!ENTITY extraDragSpace.label "Adicionar espaço para onde arrastar"> +<!ENTITY showTitlebar2.label "Barra de titulo"> +<!ENTITY extraDragSpace2.label "Borda de janela"> <!ENTITY saveChanges.label "Concluído"> <!ENTITY undoChanges.label "Desfazer alterações"> - -<!ENTITY showTitlebar2.label "Title Bar"> -<!ENTITY extraDragSpace2.label "Drag Space"> diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/imapMsgs.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/imapMsgs.properties index 31cca749426a105dc22f033103f60c5ca5b68da3..1df7a2325940ddaf51c1d605f31f78fce71b2861 100644 --- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/imapMsgs.properties +++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/imapMsgs.properties @@ -199,12 +199,22 @@ imapSubscribePrompt=Deseja inscrever %1$S? imapServerDroppedConnection=Não foi possível conectar ao seu servidor IMAP. Você pode ter excedido o número máximo de conexões desse servidor. Se sim, vá as Configurações Avançadas do Servidor IMAP para reduzir o número de conexões em cache. +# This will occur when a folder that has never been imap selected or opened +# (left-clicked) is first right-clicked to access quota properties. imapQuotaStatusFolderNotOpen=Informação sobre a cota não está disponível pois a pasta não está aberta. +# The imap capability response reports that QUOTA is not supported. imapQuotaStatusNotSupported=Esse servidor não suporta cotas. imapQuotaStatusNoQuota=Não há cotas de armazenamento definidas para essa pasta. +# The getqutaroot command succeeded but reported no quota information. +imapQuotaStatusNoQuota2=Esta pasta não apresenta nenhuma informação de cota. + +# Folder properties were requested by the user (right-click) before the getquotaroot +# command was sent. +imapQuotaStatusInProgress=Informações de cota ainda não disponíveis. + # Out of memory imapOutOfMemory=O aplicativo excedeu a capacidade de memória. @@ -256,9 +266,3 @@ imapFolderCommandFailed=A operação atual em '%2$S' não obteve sucesso. O serv # Place the word %1$S in your translation where the name of the account should appear. # Place the word %2$S in your translation where the alert from the server should appear. imapServerAlert=Alerta da conta %1$S: %2$S - -# The getqutaroot command succeeded but reported no quota information. -imapQuotaStatusNoQuota2=This folder reports no quota information. -# Folder properties were requested by the user (right-click) before the getquotaroot -# command was sent. -imapQuotaStatusInProgress=Quota information not yet available. diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/messenger.dtd b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/messenger.dtd index 70e5208ccf1bcd98068bc132271f300c9f3ebd2d..95d00e2c875d1f0836f53513bf05e58244eb7125 100644 --- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/messenger.dtd +++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Pesquisar mensagens…"> <!ENTITY searchMailCmd.accesskey "P"> <!ENTITY searchMailCmd.key "F"> +<!ENTITY glodaSearchCmd.label "Pesquisa global…"> +<!ENTITY glodaSearchCmd.accesskey "G"> <!ENTITY searchAddressesCmd.label "Pesquisar catálogo…"> <!ENTITY searchAddressesCmd.accesskey "e"> diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/messenger.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/messenger.properties index 9f7c87a44dcfb994eec87df42aed77c913fe7c9b..fde09798edff8f4d783e42b61155bfc67d7a46ac 100644 --- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/messenger.properties +++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/messenger.properties @@ -311,6 +311,7 @@ nocachedbodybody2=O texto desta mensagem não foi baixado do servidor para leitu # accountCentral mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xul + # LOCALIZATION NOTE(acctCentralTitleFormat): %1$S is brand, %2$S is account type, %3$S is account name acctCentralTitleFormat=%1$S %2$S - %3$S mailAcctType=E-mail @@ -458,11 +459,15 @@ macBiffNotification_separator=,\u0020 # For the Quota tab in the mail folder properties dialog quotaUsedFree=%S de %SKB usados + +# For the Quota tab in the mail folder properties dialog quotaPercentUsed=%S%% ocupado # for quota in main window (commandglue.js) percent=%S%% quotaTooltip=Cota IMAP: %SKB usados de um total de %SKB. Clique para detalhes. +quotaTooltip2=Cota IMAP: usado %S do total de %S. Clique para ver detalhes. + # for message views confirmViewDeleteTitle=Confirmar confirmViewDeleteMessage=Tem certeza de que deseja excluir este modo de visualização? @@ -798,5 +803,3 @@ errorConsoleTitle = Console de erros # This is used by screen readers to label the "back" button in various browser # popup panels, including the sliding subviews of the appmenu. panel.back = Voltar - -quotaTooltip2=IMAP quota: %S used of %S total. Click for details. diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/pgpmime.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/pgpmime.properties index 619481e20965a9cad4b99e7856d76737560d7247..07e4924f5682edb816e35e280e78e04017f9b6ea 100644 --- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/pgpmime.properties +++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=Esta é uma mensagem OpenPGP criptografada.<br>Para decodificá-la, você precisa instalar uma <a href="%S">extensão OpenPGP</a>. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Esta é uma mensagem criptografada com OpenPGP, mas o suporte à descriptografia do OpenPGP não está disponível. diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/preferences/general.dtd b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/preferences/general.dtd index aca2b0a2172164ed6477861d236180eece5404ca..184319f20ed0a497ccf6997faee02990ad0eb329 100644 --- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/preferences/general.dtd +++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/preferences/general.dtd @@ -43,5 +43,5 @@ <!ENTITY removeSearchEngine.label "Remover"> <!ENTITY removeSearchEngine.accesskey "v"> -<!ENTITY minimizeToTray.label "When &brandShortName; is minimized, move it to the tray"> +<!ENTITY minimizeToTray.label "Quando o &brandShortName; for minimizado, mover para a bandeja"> <!ENTITY minimizeToTray.accesskey "m"> diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/necko/necko.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/necko/necko.properties index e9693deca31b94abe7d1d0e3a474ba322bf7a326..98d93d8ff4cd9947d8070e6375499875b9468b40 100644 --- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/necko/necko.properties +++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Acesso ao armazenamento concedido aut # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Acesso ao armazenamento concedido automaticamente para o rastreador “%2$S” em “%1$S”. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Acesso ao armazenamento concedido automaticamente para o isolamento próprio “%2$S” em “%1$S”. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Cookie “%1$S” rejeitado porque tem o atributo “sameSite=none”, mas falta o atributo “secure”. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/pt-BR/localization/pt-BR/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/pt-BR/localization/pt-BR/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..7e87c8f967445948d4fc2da3d9b5f9fd475b5186 --- /dev/null +++ b/thunderbird-l10n/pt-BR/localization/pt-BR/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Redirecionamento de URI da agenda +calendar-uri-redirect-description = + O servidor está redirecionando o URI da agenda "{ $calendarName }". + Aceita o redirecionamento, passando a usar o novo URI desta agenda? +calendar-uri-redirect-original-uri-label = URI atual: +calendar-uri-redirect-target-uri-label = Redirecionando para o novo URI: diff --git a/thunderbird-l10n/pt-BR/localization/pt-BR/messenger/accountCentral.ftl b/thunderbird-l10n/pt-BR/localization/pt-BR/messenger/accountCentral.ftl index 0db21e8cdaaa83811335dd1c8b6afb05a311d2ce..84a1cf84a3a345234f02a137703209f5346ef565 100644 --- a/thunderbird-l10n/pt-BR/localization/pt-BR/messenger/accountCentral.ftl +++ b/thunderbird-l10n/pt-BR/localization/pt-BR/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Boas-vindas ao { -brand-full-name } +account-settings = Configurações da conta +# $accounts (Number) - the number of configured accounts setup-title = Escolha o que configurar about-title = Sobre o { -brand-full-name } resources-title = Recursos @@ -14,18 +16,36 @@ email-description = O { -brand-short-name } permite conectar-se à sua conta de calendar-label = Agenda .aria-label = Criar uma nova agenda calendar-description = O { -brand-short-name } permite gerenciar eventos e manter você organizado. A conexão com uma agenda remota mantém todos os seus eventos sincronizados em todos os seus dispositivos. +chat-label = Bate-papo + .aria-label = Conectar-se à sua conta de conversas chat-description = O { -brand-short-name } permite conectar-se a várias contas de mensagens instantâneas, oferecendo suporte a várias plataformas. +filelink-label = Filelink + .aria-label = Configurar anexos online +filelink-description = O { -brand-short-name } permite configurar uma conveniente conta na nuvem de links de arquivos para enviar anexos grandes com facilidade. addressbook-label = Catálogo de endereços .aria-label = Criar um novo catálogo de endereços addressbook-description = O { -brand-short-name } permite organizar todos os seus contatos em um catálogo de endereços. Você também pode se conectar a um catálogo de endereços remoto para manter todos os seus contatos sincronizados. +feeds-label = RSS + .aria-label = Conectar-se a RSS +feeds-description = O { -brand-short-name } permite conectar-se a feeds RSS/Atom para obter notícias e atualizações de todos os lados. newsgroups-label = Grupos de notícias .aria-label = Conectar a um grupos de notícias newsgroups-description = O { -brand-short-name } permite conectar-se a todos os grupos de notícias que deseja. import-title = Importar de outro programa +import-paragraph = O { -brand-short-name } permite importar mensagens de e-mail, itens do catálogo de endereços, assinaturas de feeds, preferências e/ou filtros de outros programas de e-mail e formatos comuns de catálogo de endereços. import-label = Importar .aria-label = Importar dados de outros programas +about-paragraph = O Thunderbird é o principal cliente de e-mail e agenda de código aberto, multiplataforma e livre para uso comercial e pessoal. Queremos que ele permaneça seguro e melhore ainda mais. Uma doação nos permitirá contratar mais desenvolvedores, pagar a infraestrutura e continuar a aprimorar. +about-paragraph-2 = <b>O Thunderbird é financiado por usuários como você! Se gosta de usar o Thunderbird, considere fazer uma doação.</b> A melhor maneira de garantir que o Thunderbird permaneça disponível é about-donation = fazer uma doação explore-link = Explorar recursos support-link = Suporte involved-link = Envolva-se developer-link = Documentação do desenvolvedor +read = Ler mensagens +compose = Escrever uma nova mensagem +search = Pesquisar mensagens +filter = Gerenciar filtros de mensagens +nntp-subscription = Gerenciar inscrições em grupos de notícias +rss-subscription = Gerenciar inscrições em RSS +e2e = Criptografia de ponta a ponta diff --git a/thunderbird-l10n/pt-BR/localization/pt-BR/messenger/policies/policies-descriptions.ftl b/thunderbird-l10n/pt-BR/localization/pt-BR/messenger/policies/policies-descriptions.ftl index 2a3858f8a57340ddad32ed8ac9b3479dbd1e96e9..2d574241a0328137ec9b875e90ce8594fb2fc9bc 100644 --- a/thunderbird-l10n/pt-BR/localization/pt-BR/messenger/policies/policies-descriptions.ftl +++ b/thunderbird-l10n/pt-BR/localization/pt-BR/messenger/policies/policies-descriptions.ftl @@ -21,6 +21,7 @@ policy-BlockAboutSupport = Bloquear acesso à página about:support. policy-CaptivePortal = Ativar ou desativar suporte a portal cativo policy-CertificatesDescription = Adicionar certificados ou usar certificados integrados. policy-Cookies = Permitir ou negar que sites criem cookies. +policy-DisabledCiphers = Desativar algoritmos de criptografia. policy-DefaultDownloadDirectory = Definir o diretório padrão de download. policy-DisableAppUpdate = Impedir que o { -brand-short-name } seja atualizado. policy-DisableDeveloperTools = Bloquear acesso às ferramentas do desenvolvedor. diff --git a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutAddons.ftl index c3bb288a60f3d16a8777852b944fddd70475a765..f47b0d6fc8daec15083792e722a6b0827029a783 100644 --- a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Instalar de um arquivo… .accesskey = I help-button = Suporte para extensões +sidebar-help-button-title = + .title = Suporte para extensões preferences = { PLATFORM() -> [windows] Opções do { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Ferramentas para todas as extensões +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Opções do { -brand-short-name } + *[other] Preferências do { -brand-short-name } + } show-unsigned-extensions-button = .label = Algumas extensões não puderam ser verificadas show-all-extensions-button = @@ -173,13 +181,29 @@ extensions-view-available-updates = .name = Atualizações disponíveis .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Recomendações +addon-category-discover-title = + .title = Recomendações addon-category-extension = Extensões +addon-category-extension-title = + .title = Extensões addon-category-theme = Temas +addon-category-theme-title = + .title = Temas addon-category-plugin = Plugins +addon-category-plugin-title = + .title = Plugins addon-category-dictionary = Dicionários +addon-category-dictionary-title = + .title = Dicionários addon-category-locale = Idiomas +addon-category-locale-title = + .title = Idiomas addon-category-available-updates = Atualizações disponíveis +addon-category-available-updates-title = + .title = Atualizações disponíveis addon-category-recent-updates = Atualizações recentes +addon-category-recent-updates-title = + .title = Atualizações recentes ## These are global warnings @@ -292,6 +316,7 @@ shortcuts-no-commands = As seguintes extensões não têm atalhos de teclado: shortcuts-input = .placeholder = Digite um atalho shortcuts-browserAction = Ativar extensão +shortcuts-browserAction2 = Ativar botão na barra de ferramentas shortcuts-pageAction = Ativar ação de página shortcuts-sidebarAction = Exibir/ocultar o painel lateral shortcuts-modifier-mac = Incluir Ctrl, Alt ou ⌘ @@ -317,6 +342,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Mostrar menos go-back-button = .tooltiptext = Voltar +header-back-button = + .title = Voltar ## Recommended add-ons page diff --git a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutSupport.ftl index 6f45d6e443d4b4a8d3ba7ac0da5c26cf37affc60..2fd277794a5af56bb44e6485378dafe42abb77f1 100644 --- a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutSupport.ftl @@ -290,6 +290,11 @@ sandbox-proc-type-content = conteúdo sandbox-proc-type-file = conteúdo do arquivo sandbox-proc-type-media-plugin = plugin de mídia sandbox-proc-type-data-decoder = decodificador de dados +startup-cache-title = Cache ao iniciar +startup-cache-disk-cache-path = Caminho do cache em disco +startup-cache-ignore-disk-cache = Ignorar cache em disco +startup-cache-found-disk-cache-on-init = Cache em disco encontrado ao iniciar +startup-cache-wrote-to-disk-cache = Gravado no cache em disco launcher-process-status-0 = Ativado launcher-process-status-1 = Desativado devido a falha launcher-process-status-2 = Desativado à força @@ -313,6 +318,7 @@ touch-enabled = entrada touch ativada drag-enabled = arrasto da barra de rolagem ativado keyboard-enabled = teclado ativado autoscroll-enabled = rolagem automática ativada +zooming-enabled = zoom suave com gesto de pinça ativado ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/certviewer.ftl b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/certviewer.ftl index d83fcb0066479ba4d30a1ee67221f5f2c0cf04f1..5d1d161793976fe41bf4fa2063f8c50aca607f8c 100644 --- a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (certificado) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (cadeia) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Esta extensão foi marcada como crítica. Isso significa que os clientes devem rejeitar o certificado se não o entenderem. +certificate-viewer-export = Exportar + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Seus certificados +certificate-viewer-tab-people = Pessoas +certificate-viewer-tab-servers = Servidores +certificate-viewer-tab-ca = Autoridades +certificate-viewer-tab-unkonwn = Desconhecido diff --git a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/global/processTypes.ftl b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/global/processTypes.ftl index b7f672afb52f079b2efc8e1530eebc0f5df252dd..25d33f522248d5bb341f1391c4344c3e80bb2ea6 100644 --- a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Conteúdo web isolado # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..9741a4cd540832961de8afa5bfb0f8be89f10991 --- /dev/null +++ b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Você lançou uma versão mais antiga do { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Criar novo perfil +profiledowngrade-sync = Usar uma versão mais antiga do { -brand-product-name } pode corromper favoritos e o histórico de navegação já salvos em um perfil existente do { -brand-product-name }. Para proteger suas informações, crie um novo perfil para esta instalação do { -brand-short-name }. Você sempre pode entrar em uma { -fxaccount-brand-name } para sincronizar seus favoritos e o histórico de navegação entre os perfis. +profiledowngrade-nosync = Usar uma versão mais antiga do { -brand-product-name } pode corromper favoritos e o histórico de navegação já salvos em um perfil existente do { -brand-product-name }. Para proteger suas informações, crie um novo perfil para esta instalação do { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Sair + *[other] Fechar + } diff --git a/thunderbird-l10n/pt-BR/manifest.json b/thunderbird-l10n/pt-BR/manifest.json index 952b9face2608f010feb1de926a232139999ff28..66391f7e93e7039290fe09729ae68ccafbd5ee2c 100644 --- a/thunderbird-l10n/pt-BR/manifest.json +++ b/thunderbird-l10n/pt-BR/manifest.json @@ -1,57 +1,57 @@ { + "description": "Language pack for Thunderbird for pt-BR", + "author": "mozilla.org (contributors: Jeferson Hultmann, Fernando Pereira Silveira, Marco Aurélio Krause, Maykon Chagas)", + "applications": { + "gecko": { + "strict_max_version": "76.*", + "id": "langpack-pt-BR@thunderbird.mozilla.org", + "strict_min_version": "76.0" + } + }, + "langpack_id": "pt-BR", + "sources": { + "browser": { + "base_path": "browser/" + } + }, "manifest_version": 2, - "name": "Português (pt-BR) Language Pack", "languages": { "pt-BR": { - "version": "20200406020830", "chrome_resources": { - "branding": "chrome/pt-BR/locale/pt-BR/branding/", - "devtools": "chrome/pt-BR/locale/pt-BR/devtools/client/", - "passwordmgr": "chrome/pt-BR/locale/pt-BR/passwordmgr/", - "autoconfig": "chrome/pt-BR/locale/pt-BR/autoconfig/", "places": "chrome/pt-BR/locale/pt-BR/places/", + "lightning": "chrome/pt-BR/locale/pt-BR/lightning/", + "chat": "chrome/pt-BR/locale/pt-BR/chat/", + "autoconfig": "chrome/pt-BR/locale/pt-BR/autoconfig/", + "mozldap": "chrome/pt-BR/locale/pt-BR/mozldap/", + "messenger-region": "chrome/pt-BR/locale/pt-BR/messenger-region/", + "messenger-mapi": "chrome/pt-BR/locale/pt-BR/messenger-mapi/", + "devtools-startup": "chrome/pt-BR/locale/pt-BR/devtools/startup/", + "calendar": "chrome/pt-BR/locale/pt-BR/calendar/", "global": "chrome/pt-BR/locale/pt-BR/global/", + "devtools": "chrome/pt-BR/locale/pt-BR/devtools/client/", + "mozapps": "chrome/pt-BR/locale/pt-BR/mozapps/", + "passwordmgr": "chrome/pt-BR/locale/pt-BR/passwordmgr/", + "messenger": "chrome/pt-BR/locale/pt-BR/messenger/", + "communicator": "chrome/pt-BR/locale/pt-BR/communicator/", + "necko": "chrome/pt-BR/locale/pt-BR/necko/", + "devtools-shared": "chrome/pt-BR/locale/pt-BR/devtools/shared/", + "alerts": "chrome/pt-BR/locale/pt-BR/alerts/", "pippki": "chrome/pt-BR/locale/pt-BR/pippki/", "messenger-smime": "chrome/pt-BR/locale/pt-BR/messenger-smime/", - "necko": "chrome/pt-BR/locale/pt-BR/necko/", - "messenger-region": "chrome/pt-BR/locale/pt-BR/messenger-region/", + "pluginproblem": "chrome/pt-BR/locale/pt-BR/pluginproblem/", + "pipnss": "chrome/pt-BR/locale/pt-BR/pipnss/", "global-platform": { - "macosx": "chrome/pt-BR/locale/pt-BR/global-platform/mac/", - "android": "chrome/pt-BR/locale/pt-BR/global-platform/unix/", "linux": "chrome/pt-BR/locale/pt-BR/global-platform/unix/", - "win": "chrome/pt-BR/locale/pt-BR/global-platform/win/" + "android": "chrome/pt-BR/locale/pt-BR/global-platform/unix/", + "win": "chrome/pt-BR/locale/pt-BR/global-platform/win/", + "macosx": "chrome/pt-BR/locale/pt-BR/global-platform/mac/" }, - "alerts": "chrome/pt-BR/locale/pt-BR/alerts/", - "communicator": "chrome/pt-BR/locale/pt-BR/communicator/", - "messenger": "chrome/pt-BR/locale/pt-BR/messenger/", - "devtools-startup": "chrome/pt-BR/locale/pt-BR/devtools/startup/", "messenger-newsblog": "chrome/pt-BR/locale/pt-BR/messenger-newsblog/", - "calendar": "chrome/pt-BR/locale/pt-BR/calendar/", - "messenger-mapi": "chrome/pt-BR/locale/pt-BR/messenger-mapi/", - "lightning": "chrome/pt-BR/locale/pt-BR/lightning/", - "devtools-shared": "chrome/pt-BR/locale/pt-BR/devtools/shared/", - "pipnss": "chrome/pt-BR/locale/pt-BR/pipnss/", - "chat": "chrome/pt-BR/locale/pt-BR/chat/", - "mozapps": "chrome/pt-BR/locale/pt-BR/mozapps/", - "pluginproblem": "chrome/pt-BR/locale/pt-BR/pluginproblem/", - "mozldap": "chrome/pt-BR/locale/pt-BR/mozldap/" - } + "branding": "chrome/pt-BR/locale/pt-BR/branding/" + }, + "version": "20200415164724" } }, - "author": "mozilla.org (contributors: Jeferson Hultmann, Fernando Pereira Silveira, Marco Aurélio Krause, Maykon Chagas)", - "version": "76.0buildid20200407173003", - "description": "Language pack for Thunderbird for pt-BR", - "applications": { - "gecko": { - "id": "langpack-pt-BR@thunderbird.mozilla.org", - "strict_min_version": "76.0", - "strict_max_version": "76.*" - } - }, - "sources": { - "browser": { - "base_path": "browser/" - } - }, - "langpack_id": "pt-BR" + "name": "Português (pt-BR) Language Pack", + "version": "76.0buildid20200420212409" } diff --git a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/devtools/client/inspector.properties b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/devtools/client/inspector.properties index e5293f5cef8a46d5f4060d53388cb0f79cb5dbf4..52355d660a065392fe5964807d7559588be125b4 100644 --- a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/devtools/client/inspector.properties +++ b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Este elemento tem excesso deslocável. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Nenhuma regra associada +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Pressione Shift e clique para ir para a regra + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/css.properties b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/css.properties index 777310972b988bf7d0c315f9cc3f065a936c58fa..5edbe9d1ab6ef9f0f4135bf6cfdc03d1c8e58b9d 100644 --- a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/css.properties +++ b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=A folha de estilo %1$S foi carregada como CSS ainda que o seu tip PEUnexpEOF2=Fim de ficheiro inesperado ao pesquisar por %1$S. PEParseRuleWSOnly=Uma string de espaço em branco dada para ser analisada como regra. + PEDeclDropped=Declaração ignorada. PEDeclSkipped=Ignorado para a declaração seguinte. PEUnknownProperty=Propriedade desconhecida ‘%1$S’. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Apenas um repeat(auto-fill, ...) é pe PEMoreThanOneGridRepeatAutoFillFitInTrackList=Apenas um repeat(auto-fill, ...) ou repeat(auto-fit, ...) é permitido numa track list. PEMoreThanOneGridRepeatTrackSize=Apenas um track size é permitido dentro de repeat(auto-fit/auto-fill, ...). +PEDisallowedImportRule=As regras @import ainda não são válidas em folhas de estilo construídas. + TooLargeDashedRadius=O raio da borda é muito grande para o estilo ‘dashed’ (o limite é 100000px). A renderizar como sólido. TooLargeDottedRadius=O raio da borda é muito grande para o estilo ‘dotted’ (o limite é 100000px). A renderizar como sólido. diff --git a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/security/security.properties b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/security/security.properties index 396d3419732054cbb1488b19c436d02f9692c146..e5b1c008bc65084df996e57828a373ae218540ea 100644 --- a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/security/security.properties +++ b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Carregamento negado por X-Frame-Options: “%1$S” de “%2$S”, o s # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Carregamento negado por X-Frame-Options: “%1$S” de “%2$S”, o site não permite cross-origin framing de “%3$S”. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Foi encontrado um cabeçalho X-Frame-Options inválido ao carregar “%2$S”: “%1$S” não é uma diretiva válida. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=O carregamento de “%2$S” numa frame é impedido pela diretiva “X-Frame-Options“ definida como “%1$S“. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = A atualizar o pedido inseguro “%1$S” para utilizar “%2$S”. diff --git a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/videocontrols.dtd b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/videocontrols.dtd index e78c4eb3126fe0147a42a1694d76fddf7cad04a4..7323b6bd831a751af3a8c9c0a3a432ae7ab1cca6 100644 --- a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/videocontrols.dtd +++ b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/videocontrols.dtd @@ -38,7 +38,7 @@ the Picture-in-Picture video toggle button when the mouse is hovering it. --> <!ENTITY error.noSource2 "Não foi encontrado nenhum vídeo com um formato e tipo MIME suportado."> <!ENTITY error.generic "Reprodução de vídeo abortada devido a um erro desconhecido."> -<!ENTITY status.pictureInPicture "Este vídeo está a ser reproduzido no modo vídeo em janela flutuante."> +<!ENTITY status.pictureInPicture "Este vídeo está a ser reproduzido numa janela flutuante."> <!-- LOCALIZATION NOTE (scrubberScale.nameFormat): the #1 string is the current media position, and the #2 string is the total duration. For example, when at diff --git a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/messenger/messenger.dtd b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/messenger/messenger.dtd index 1ffbd8feb1d9e026c111e75cc031fe6cbbc0b1d8..90084971a3c82be176ccb98de148c216ed1952a8 100644 --- a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/messenger/messenger.dtd +++ b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Pesquisar mensagens…"> <!ENTITY searchMailCmd.accesskey "m"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Pesquisa global…"> +<!ENTITY glodaSearchCmd.accesskey "g"> <!ENTITY searchAddressesCmd.label "Pesquisar endereços…"> <!ENTITY searchAddressesCmd.accesskey "s"> diff --git a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/messenger/pgpmime.properties b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/messenger/pgpmime.properties index 6f0b3f259f77167c4cb1cf7bad58e8b912bd1c95..da565ff69ebc70f044245db107d55603bdbf720a 100644 --- a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/messenger/pgpmime.properties +++ b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=Esta é uma mensagem OpenPGP encriptada.<br>Para poder desencriptar esta mensagem, tem de instalar um <a href="%S">extra OpenPGP</a>. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Esta é uma mensagem encriptada com o OpenPGP, mas o suporte para a encriptação OpenPGP não está disponível. diff --git a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/necko/necko.properties b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/necko/necko.properties index 32c6e8920519557a1a1c5292501bedb27b7c9867..72180c51218aedf3b96e3c0a55495be4aef0d405 100644 --- a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/necko/necko.properties +++ b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Acesso ao armazenamento concedido aut # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Acesso ao armazenamento concedido automaticamente para o rastreador “%2$S” em “%1$S”. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Acesso de armazenamento concedido automaticamente para o isolamento de primeira linha “%2$S” em “%1$S”. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=A cookie “%1$S” foi rejeitada porque possui o atributo “sameSite=none”, mas o atributo “secure” está em falta. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/pt-PT/localization/pt-PT/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/pt-PT/localization/pt-PT/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..bc881a1e66d7a312b769d7e0ac4630aa24dffc37 --- /dev/null +++ b/thunderbird-l10n/pt-PT/localization/pt-PT/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Redirecionamento de URI do calendário +calendar-uri-redirect-description = + O servidor está a redirecionar o URI para o calendário "{ $calendarName }". + Aceitar o redirecionamento e começar a utilizar o novo URI para este calendário? +calendar-uri-redirect-original-uri-label = URI atual: +calendar-uri-redirect-target-uri-label = A redirecionar para o novo URI: diff --git a/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/accountCentral.ftl b/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/accountCentral.ftl index 13ab37305c83bc59566bc9b175619586f2dfe7e7..2d7ed063e47f2a0aca20607d87206c6cc7bfea97 100644 --- a/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/accountCentral.ftl +++ b/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Bem-vindo ao { -brand-full-name } +account-settings = Definições da conta +# $accounts (Number) - the number of configured accounts setup-title = Escolha o que configurar about-title = Sobre o { -brand-full-name } resources-title = Recursos @@ -40,3 +42,10 @@ explore-link = Explorar as funcionalidades support-link = Apoio involved-link = Participar developer-link = Documentação do programador +read = Ler mensagens +compose = Escrever uma nova mensagem +search = Pesquisar mensagens +filter = Gerir filtros de mensagens +nntp-subscription = Gerir subscrições de grupos de notícias +rss-subscription = Gerir subscrições de fontes +e2e = Criptografia de ponto a ponto diff --git a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutAddons.ftl index 7a9b4300e58e8fc8e0e4fb3a84917ebde7cb0739..4c0926b0e23a6ac5bccfe3f9f31e710bffad5e1b 100644 --- a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Instalar extra a partir de ficheiro… .accesskey = I help-button = Apoio dos extras +sidebar-help-button-title = + .title = Apoio dos extras preferences = { PLATFORM() -> [windows] Opções do { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Ferramentas para todos os extras +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Opções do { -brand-short-name } + *[other] Preferências do { -brand-short-name } + } show-unsigned-extensions-button = .label = Algumas extensões não foram verificadas show-all-extensions-button = @@ -170,13 +178,29 @@ extensions-view-available-updates = .name = Atualizações disponíveis .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Recomendações +addon-category-discover-title = + .title = Recomendações addon-category-extension = Extensões +addon-category-extension-title = + .title = Extensões addon-category-theme = Temas +addon-category-theme-title = + .title = Temas addon-category-plugin = Plugins +addon-category-plugin-title = + .title = Plugins addon-category-dictionary = Dicionários +addon-category-dictionary-title = + .title = Dicionários addon-category-locale = Idiomas +addon-category-locale-title = + .title = Idiomas addon-category-available-updates = Atualizações disponíveis +addon-category-available-updates-title = + .title = Atualizações disponíveis addon-category-recent-updates = Atualizações recentes +addon-category-recent-updates-title = + .title = Atualizações recentes ## These are global warnings @@ -289,6 +313,7 @@ shortcuts-no-commands = As seguintes extensões não possuem atalhos: shortcuts-input = .placeholder = Escrever um atalho shortcuts-browserAction = Ativar extensão +shortcuts-browserAction2 = Ativar botão da barra de ferramentas shortcuts-pageAction = Ativar ação da página shortcuts-sidebarAction = Alternar a barra lateral shortcuts-modifier-mac = Incluir Ctrl, Alt ou ⌘ @@ -314,6 +339,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Mostrar menos go-back-button = .tooltiptext = Retroceder +header-back-button = + .title = Retroceder ## Recommended add-ons page diff --git a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutRights.ftl b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutRights.ftl index a04ce791adf8a1e383c26c5be8103a5b7451ea5d..437a35cd5e009da0ea881d55466a5173620609a5 100644 --- a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutRights.ftl +++ b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutRights.ftl @@ -33,7 +33,7 @@ rights-webservices-unbranded = assim como instruções sobre como os desativar, se necessário, devem ser colocados aqui. rights-webservices-term-unbranded = Quaisquer termos de serviço devem ser listados aqui. -rights-webservices-term-1 = A { -vendor-short-name } os seus contribuidores, licenciadores e parceiros trabalham para fornecer os serviços mais precisos e atualizados. No entanto, não podemos garantir que esta informação é abrangente e livre de erros. Por exemplo, o serviço de navegação segura poderá não identificar alguns sites perigosos e pode identificar alguns sites seguros por engano e, no serviço de localização, todas as localizações devolvidas pelos nossos fornecedores do serviço são apenas estimativas e nem nós, nem os nossos fornecedores do serviço, garantimos a exatidão das localizações fornecidas. +rights-webservices-term-1 = A { -vendor-short-name } os seus colaboradores, licenciadores e parceiros trabalham para fornecer os serviços mais precisos e atualizados. No entanto, não podemos garantir que esta informação é abrangente e isenta de erros. Por exemplo o serviço de navegação segura, por engano, poderá não identificar alguns sites perigosos e pode identificar alguns sites seguros. No serviço de localização, todas as localizações devolvidas pelos nossos fornecedores do serviço são apenas estimativas e nem nós, nem os nossos fornecedores do serviço, garantimos a exatidão das localizações fornecidas. rights-webservices-term-2 = A { -vendor-short-name } pode descontinuar ou alterar os serviços a qualquer momento. rights-webservices-term-3 = Está à vontade para utilizar estes Serviços que acompanham a sua versão do { -brand-short-name }, e a { -vendor-short-name } concede-lhe os direitos necessários para o fazer. A { -vendor-short-name } e os seus licenciantes reservam todos os outros direitos nos Serviços. Estes termos não têm a intenção de limitar quaisquer direitos sobre as licenças de código aberto aplicáveis ao { -brand-short-name } e às correspondentes versões do código fonte do { -brand-short-name }. rights-webservices-term-4 = <strong>Os serviços são disponibilizados "as-is." A { -vendor-short-name }, os seus contribuidores, licenciantes e distribuidores renunciam a todas as garantias, sejam elas explícitas ou implícitas, incluindo sem limites, garantias que o serviço é comercial e serve para os seus objetivos pessoais. Você é responsável por selecionar os serviços para os seus propósitos, assim como a qualidade e o desempenho dos serviços. Algumas jurisdições não permitem a exclusão ou a limitação de garantias implícitas, como tal este aviso poderá não ser adequado para si.</strong> diff --git a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutSupport.ftl index 4e24b300cf54abc546b13ef289cf7f7fa5793299..0fe95fcbd8f9911ca8f7079f171c75f83ef43f68 100644 --- a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutSupport.ftl @@ -290,6 +290,11 @@ sandbox-proc-type-content = conteúdo sandbox-proc-type-file = conteúdo de ficheiro sandbox-proc-type-media-plugin = plugin multimédia sandbox-proc-type-data-decoder = descodificador de dados +startup-cache-title = Cache de inicialização +startup-cache-disk-cache-path = Caminho da cache em disco +startup-cache-ignore-disk-cache = Ignorar cache em disco +startup-cache-found-disk-cache-on-init = Encontrada cache em disco na inicialização +startup-cache-wrote-to-disk-cache = Gravado na cache em disco launcher-process-status-0 = Ativado launcher-process-status-1 = Desativado devido a falha launcher-process-status-2 = Desativado forçadamente @@ -313,6 +318,7 @@ touch-enabled = introdução com toque ativada drag-enabled = arrasto da barra de deslocamento ativado keyboard-enabled = teclado ativado autoscroll-enabled = auto-deslocamento ativado +zooming-enabled = beliscar para zoom suave ativado ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/certviewer.ftl b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/certviewer.ftl index 8730122a871f1c8885e6582b1d492a8f667a2d72..77903717363c92a5f04d4d8894fd1d20b0910409 100644 --- a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (certificado) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (cadeia) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Esta extensão foi marcada como crítica, o que significa que os clientes devem rejeitar o certificado se não o entenderem. +certificate-viewer-export = Exportar + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Os seus certificados +certificate-viewer-tab-people = Pessoas +certificate-viewer-tab-servers = Servidores +certificate-viewer-tab-ca = Autoridades +certificate-viewer-tab-unkonwn = Desconhecido diff --git a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/global/processTypes.ftl b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/global/processTypes.ftl index 000163bcd4323039b3fa0624de78a6a5643b30d6..57520a4fd196deb799d9fe52d4da1b7af8ef25a2 100644 --- a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Conteúdo web isolado # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..0db0a01a3457f8f85d990d1f8e10e1b2c7ed756a --- /dev/null +++ b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Iniciou uma versão antiga do { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Criar novo perfil +profiledowngrade-sync = Utilizar uma versão antiga do { -brand-product-name } pode corromper marcadores e histórico de navegação já guardado num perfil do { -brand-product-name } existente. Para proteger a sua informação, crie um novo perfil para esta instalação do { -brand-short-name }. Pode sempre iniciar sessão com uma { -fxaccount-brand-name } para sincronizar os seus marcadores e histórico de navegação entre perfis. +profiledowngrade-nosync = Utilizar uma versão antiga do { -brand-product-name } pode corromper marcadores e histórico de navegação já guardado num perfil do { -brand-product-name } existente. Para proteger a sua informação, crie um novo perfil para esta instalação do { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Sair + *[other] Sair + } diff --git a/thunderbird-l10n/pt-PT/manifest.json b/thunderbird-l10n/pt-PT/manifest.json index 3226093fff3f6325e08c300a7431a08400d35a12..1a154bd6ec74447bd98286009bccb06421d80f0f 100644 --- a/thunderbird-l10n/pt-PT/manifest.json +++ b/thunderbird-l10n/pt-PT/manifest.json @@ -1,57 +1,57 @@ { + "author": "mozilla.org (contributors: Joe Solon, Suzy Solon)", "manifest_version": 2, + "name": "Português (Europeu) Language Pack", "applications": { "gecko": { "id": "langpack-pt-PT@thunderbird.mozilla.org", - "strict_min_version": "76.0", - "strict_max_version": "76.*" + "strict_max_version": "76.*", + "strict_min_version": "76.0" } }, + "version": "76.0buildid20200420212409", + "description": "Language pack for Thunderbird for pt-PT", "sources": { "browser": { "base_path": "browser/" } }, - "description": "Language pack for Thunderbird for pt-PT", "langpack_id": "pt-PT", - "author": "mozilla.org (contributors: Joe Solon, Suzy Solon)", "languages": { "pt-PT": { "chrome_resources": { + "branding": "chrome/pt-PT/locale/pt-PT/branding/", + "messenger-newsblog": "chrome/pt-PT/locale/pt-PT/messenger-newsblog/", + "devtools": "chrome/pt-PT/locale/pt-PT/devtools/client/", "places": "chrome/pt-PT/locale/pt-PT/places/", - "devtools-startup": "chrome/pt-PT/locale/pt-PT/devtools/startup/", - "mozldap": "chrome/pt-PT/locale/pt-PT/mozldap/", - "messenger-smime": "chrome/pt-PT/locale/pt-PT/messenger-smime/", - "devtools-shared": "chrome/pt-PT/locale/pt-PT/devtools/shared/", - "passwordmgr": "chrome/pt-PT/locale/pt-PT/passwordmgr/", + "calendar": "chrome/pt-PT/locale/pt-PT/calendar/", "global": "chrome/pt-PT/locale/pt-PT/global/", - "pipnss": "chrome/pt-PT/locale/pt-PT/pipnss/", - "chat": "chrome/pt-PT/locale/pt-PT/chat/", + "pluginproblem": "chrome/pt-PT/locale/pt-PT/pluginproblem/", "messenger": "chrome/pt-PT/locale/pt-PT/messenger/", - "branding": "chrome/pt-PT/locale/pt-PT/branding/", "global-platform": { - "linux": "chrome/pt-PT/locale/pt-PT/global-platform/unix/", - "android": "chrome/pt-PT/locale/pt-PT/global-platform/unix/", "win": "chrome/pt-PT/locale/pt-PT/global-platform/win/", + "android": "chrome/pt-PT/locale/pt-PT/global-platform/unix/", + "linux": "chrome/pt-PT/locale/pt-PT/global-platform/unix/", "macosx": "chrome/pt-PT/locale/pt-PT/global-platform/mac/" }, - "messenger-newsblog": "chrome/pt-PT/locale/pt-PT/messenger-newsblog/", - "communicator": "chrome/pt-PT/locale/pt-PT/communicator/", - "calendar": "chrome/pt-PT/locale/pt-PT/calendar/", "lightning": "chrome/pt-PT/locale/pt-PT/lightning/", - "autoconfig": "chrome/pt-PT/locale/pt-PT/autoconfig/", - "alerts": "chrome/pt-PT/locale/pt-PT/alerts/", - "pippki": "chrome/pt-PT/locale/pt-PT/pippki/", - "devtools": "chrome/pt-PT/locale/pt-PT/devtools/client/", - "pluginproblem": "chrome/pt-PT/locale/pt-PT/pluginproblem/", - "messenger-region": "chrome/pt-PT/locale/pt-PT/messenger-region/", + "passwordmgr": "chrome/pt-PT/locale/pt-PT/passwordmgr/", "necko": "chrome/pt-PT/locale/pt-PT/necko/", + "pipnss": "chrome/pt-PT/locale/pt-PT/pipnss/", + "chat": "chrome/pt-PT/locale/pt-PT/chat/", + "messenger-smime": "chrome/pt-PT/locale/pt-PT/messenger-smime/", + "mozapps": "chrome/pt-PT/locale/pt-PT/mozapps/", + "pippki": "chrome/pt-PT/locale/pt-PT/pippki/", + "devtools-shared": "chrome/pt-PT/locale/pt-PT/devtools/shared/", + "devtools-startup": "chrome/pt-PT/locale/pt-PT/devtools/startup/", "messenger-mapi": "chrome/pt-PT/locale/pt-PT/messenger-mapi/", - "mozapps": "chrome/pt-PT/locale/pt-PT/mozapps/" + "messenger-region": "chrome/pt-PT/locale/pt-PT/messenger-region/", + "communicator": "chrome/pt-PT/locale/pt-PT/communicator/", + "alerts": "chrome/pt-PT/locale/pt-PT/alerts/", + "autoconfig": "chrome/pt-PT/locale/pt-PT/autoconfig/", + "mozldap": "chrome/pt-PT/locale/pt-PT/mozldap/" }, - "version": "20200405212353" + "version": "20200415232442" } - }, - "name": "Português (Europeu) Language Pack", - "version": "76.0buildid20200407173003" + } } diff --git a/thunderbird-l10n/rm/chrome/rm/locale/rm/devtools/client/inspector.properties b/thunderbird-l10n/rm/chrome/rm/locale/rm/devtools/client/inspector.properties index 0c95612fa79d4b6217ad3459c257fb73c06d7fdb..db503d0988f50934418b4fef0c6d6feb9c422053 100644 --- a/thunderbird-l10n/rm/chrome/rm/locale/rm/devtools/client/inspector.properties +++ b/thunderbird-l10n/rm/chrome/rm/locale/rm/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=This element has scrollable overflow. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=No associated rule +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Hold Shift and click to jump to rule + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/rm/localization/rm/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/rm/localization/rm/toolkit/about/aboutAddons.ftl index 86379a1851405fb041b267b92ca16aedf83080d9..dacea3249cbffb8a5f2120e6c38e3e9c38bcd782 100644 --- a/thunderbird-l10n/rm/localization/rm/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/rm/localization/rm/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Installar in supplement a basa dad ina datoteca… .accesskey = I help-button = Agid cun supplements +sidebar-help-button-title = + .title = Agid cun supplements preferences = { PLATFORM() -> [windows] Preferenzas da { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Utensils per tut ils supplements +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Preferenzas da { -brand-short-name } + *[other] Preferenzas da { -brand-short-name } + } show-unsigned-extensions-button = .label = Impussibel da verifitgar tschertas extensiuns show-all-extensions-button = @@ -173,13 +181,29 @@ extensions-view-available-updates = .name = Actualisaziuns disponiblas .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Recumandaziuns +addon-category-discover-title = + .title = Recumandaziuns addon-category-extension = Extensiuns +addon-category-extension-title = + .title = Extensiuns addon-category-theme = Designs +addon-category-theme-title = + .title = Designs addon-category-plugin = Plug-ins +addon-category-plugin-title = + .title = Plug-ins addon-category-dictionary = Dicziunaris +addon-category-dictionary-title = + .title = Dicziunaris addon-category-locale = Linguas +addon-category-locale-title = + .title = Linguas addon-category-available-updates = Actualisaziuns disponiblas +addon-category-available-updates-title = + .title = Actualisaziuns disponiblas addon-category-recent-updates = Ultimas actualisaziuns +addon-category-recent-updates-title = + .title = Ultimas actualisaziuns ## These are global warnings @@ -317,6 +341,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Mussar damain go-back-button = .tooltiptext = Turnar +header-back-button = + .title = Turnar ## Recommended add-ons page diff --git a/thunderbird-l10n/rm/localization/rm/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/rm/localization/rm/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..eba73698c8082225be484ffdf4fd6610acdcd55c --- /dev/null +++ b/thunderbird-l10n/rm/localization/rm/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Ti has avià ina versiun pli veglia da { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Crear in nov profil +profiledowngrade-sync = L'utilisaziun dad ina versiun veglia da { -brand-product-name } po donnegiar la cronologia da navigaziun ed ils segnapaginas gia memorisads en in profil existent da { -brand-product-name }. Per proteger questas infurmaziuns, crear in nov profil per questa installaziun da { -brand-short-name }. Igl è adina pussaivel da s'annunziar cun in { -fxaccount-brand-name } per sincronisar segnapaginas e la cronologia da navigaziun tranter differents profils. +profiledowngrade-nosync = L'utilisaziun dad ina versiun veglia da { -brand-product-name } po donnegiar la cronologia da navigaziun ed ils segnapaginas gia memorisads en il profil existent da { -brand-product-name }. Per proteger questas infurmaziuns, crear in nov profil per questa installaziun da { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Terminar + *[other] Terminar + } diff --git a/thunderbird-l10n/rm/manifest.json b/thunderbird-l10n/rm/manifest.json index 7e873c60e3315a45404b3353543297fed10b39b3..53ea703409e2b72ec124bbaba378c4a868dcab3e 100644 --- a/thunderbird-l10n/rm/manifest.json +++ b/thunderbird-l10n/rm/manifest.json @@ -1,57 +1,57 @@ { - "manifest_version": 2, - "sources": { - "browser": { - "base_path": "browser/" + "author": "mozilla.org (contributors: Joe Solon, Suzy Solon)", + "langpack_id": "rm", + "name": "Rumantsch Language Pack", + "applications": { + "gecko": { + "strict_min_version": "76.0", + "id": "langpack-rm@thunderbird.mozilla.org", + "strict_max_version": "76.*" } }, + "description": "Language pack for Thunderbird for rm", "languages": { "rm": { "chrome_resources": { + "pippki": "chrome/rm/locale/rm/pippki/", + "mozapps": "chrome/rm/locale/rm/mozapps/", + "devtools": "chrome/rm/locale/rm/devtools/client/", "global-platform": { - "macosx": "chrome/rm/locale/rm/global-platform/mac/", - "linux": "chrome/rm/locale/rm/global-platform/unix/", "android": "chrome/rm/locale/rm/global-platform/unix/", - "win": "chrome/rm/locale/rm/global-platform/win/" + "macosx": "chrome/rm/locale/rm/global-platform/mac/", + "win": "chrome/rm/locale/rm/global-platform/win/", + "linux": "chrome/rm/locale/rm/global-platform/unix/" }, - "messenger-smime": "chrome/rm/locale/rm/messenger-smime/", + "pluginproblem": "chrome/rm/locale/rm/pluginproblem/", "lightning": "chrome/rm/locale/rm/lightning/", - "passwordmgr": "chrome/rm/locale/rm/passwordmgr/", - "messenger-newsblog": "chrome/rm/locale/rm/messenger-newsblog/", - "pippki": "chrome/rm/locale/rm/pippki/", - "messenger-region": "chrome/rm/locale/rm/messenger-region/", - "communicator": "chrome/rm/locale/rm/communicator/", "pipnss": "chrome/rm/locale/rm/pipnss/", - "branding": "chrome/rm/locale/rm/branding/", - "chat": "chrome/rm/locale/rm/chat/", - "messenger": "chrome/rm/locale/rm/messenger/", "calendar": "chrome/rm/locale/rm/calendar/", - "mozapps": "chrome/rm/locale/rm/mozapps/", - "places": "chrome/rm/locale/rm/places/", - "mozldap": "chrome/rm/locale/rm/mozldap/", - "devtools-startup": "chrome/rm/locale/rm/devtools/startup/", - "pluginproblem": "chrome/rm/locale/rm/pluginproblem/", - "autoconfig": "chrome/rm/locale/rm/autoconfig/", "global": "chrome/rm/locale/rm/global/", - "devtools": "chrome/rm/locale/rm/devtools/client/", + "messenger-newsblog": "chrome/rm/locale/rm/messenger-newsblog/", + "messenger-region": "chrome/rm/locale/rm/messenger-region/", "devtools-shared": "chrome/rm/locale/rm/devtools/shared/", + "devtools-startup": "chrome/rm/locale/rm/devtools/startup/", "necko": "chrome/rm/locale/rm/necko/", "alerts": "chrome/rm/locale/rm/alerts/", - "messenger-mapi": "chrome/rm/locale/rm/messenger-mapi/" + "passwordmgr": "chrome/rm/locale/rm/passwordmgr/", + "messenger-smime": "chrome/rm/locale/rm/messenger-smime/", + "mozldap": "chrome/rm/locale/rm/mozldap/", + "communicator": "chrome/rm/locale/rm/communicator/", + "autoconfig": "chrome/rm/locale/rm/autoconfig/", + "branding": "chrome/rm/locale/rm/branding/", + "messenger-mapi": "chrome/rm/locale/rm/messenger-mapi/", + "places": "chrome/rm/locale/rm/places/", + "chat": "chrome/rm/locale/rm/chat/", + "messenger": "chrome/rm/locale/rm/messenger/" }, - "version": "20200405184430" + "version": "20200415064345" } }, - "version": "76.0buildid20200407173003", - "langpack_id": "rm", - "applications": { - "gecko": { - "strict_max_version": "76.*", - "strict_min_version": "76.0", - "id": "langpack-rm@thunderbird.mozilla.org" + "manifest_version": 2, + "version": "76.0buildid20200420212409", + "sources": { + "browser": { + "base_path": "browser/" } - }, - "name": "Rumantsch Language Pack", - "author": "mozilla.org (contributors: Joe Solon, Suzy Solon)", - "description": "Language pack for Thunderbird for rm" + } } diff --git a/thunderbird-l10n/ro/chrome/ro/locale/ro/devtools/client/netmonitor.properties b/thunderbird-l10n/ro/chrome/ro/locale/ro/devtools/client/netmonitor.properties index 7611a745c8abadf7800e8234c41cd2a02e176068..8708f27d72df3f39a6a269be535b8fba5529dda3 100644 --- a/thunderbird-l10n/ro/chrome/ro/locale/ro/devtools/client/netmonitor.properties +++ b/thunderbird-l10n/ro/chrome/ro/locale/ro/devtools/client/netmonitor.properties @@ -765,6 +765,14 @@ netmonitor.ws.context.received=Primite # for the "Received" menu item displayed in the context menu in the websocket toolbar. netmonitor.ws.context.received.accesskey=R +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed +# on the context menu that shows "Control Frames" WebSocket frames. +netmonitor.ws.context.controlFrames=Control + +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key +# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. +netmonitor.ws.context.controlFrames.accesskey=o + # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed # on the context menu that shows "Copy Message". netmonitor.ws.context.copyFrame=Copiază mesajul @@ -1525,10 +1533,3 @@ netmonitor.cache.lastModified=Ultima modificare # LOCALIZATION NOTE (netmonitor.cache.device): This is the label text for the device # where a cached object was fetched from (e.g. "disk"). netmonitor.cache.device=Dispozitiv - -# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed -# on the context menu that shows "Control Frames" WebSocket frames. -netmonitor.ws.context.controlFrames=Control -# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key -# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. -netmonitor.ws.context.controlFrames.accesskey=o diff --git a/thunderbird-l10n/ro/chrome/ro/locale/ro/global/css.properties b/thunderbird-l10n/ro/chrome/ro/locale/ro/global/css.properties index b988a19cf7f3fdd1a2a54658e54eb81e9496ce32..0b9bfeddb9bc1b87dee2d016f6a8f3b0aa0db00d 100644 --- a/thunderbird-l10n/ro/chrome/ro/locale/ro/global/css.properties +++ b/thunderbird-l10n/ro/chrome/ro/locale/ro/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=Foaia de stil %1$S a fost încărcată ca și CSS deși tipul MIM PEUnexpEOF2=Sfârșit neașteptat de fișier în timpul căutării după %1$S. PEParseRuleWSOnly=S-a dat un text care conține doar spații pentru a fi prelucrat ca regulă. + PEDeclDropped=Declarație abandonată. PEDeclSkipped=Salt la declarația următoare. PEUnknownProperty=Proprietate necunoscută „%1$S”. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Doar un singur repeat(auto-fill, …) PEMoreThanOneGridRepeatAutoFillFitInTrackList=Nu este permisă decât un singur repeat(auto-fill, …) sau repeat(auto-fit, …) într-un track list. PEMoreThanOneGridRepeatTrackSize=Doar un singur track size este permis în cadrul unui repeat(auto-fit/auto-fill, …). +PEDisallowedImportRule=Regulile @import nu sunt încă valabile în foile de stil construite. + TooLargeDashedRadius=Border radius este prea mare pentru stilul „dashed” (limita este 100000px). Se redă ca solid. TooLargeDottedRadius=Border radius este prea mare pentru stilul „dotted” (limita este 100000px). Se redă ca solid. diff --git a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/addons.properties b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/addons.properties index be4351db1525069a5cae9dea70b4294bad8b1c2b..3ec1460e9cdae23e0b206e70b49c5a63043b8e10 100644 --- a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/addons.properties +++ b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/addons.properties @@ -126,6 +126,8 @@ addonInstallErrorBlocklisted=%S nu a putut fi instalat deoarece prezintă un ris # Note, this string will be used as raw markup. Avoid characters like <, >, & webextPerms.header=Adaugi %S? +# %S is brandShortName +webextPerms.experimentWarning=Suplimentele rău-intenționate îți pot fura informațiile private sau îți pot compromite calculatorul. Instalează acest supliment numai dacă ai încredere în sursă. webextPerms.unsignedWarning=Atenție: Acest supliment este neverificat. Suplimentele rău intenționate pot să îți fure informații private sau să îți compromită calculatorul. Instalează suplimentul doar dacă ai încredere în sursă. # LOCALIZATION NOTE (webextPerms.listIntro) @@ -194,6 +196,9 @@ webextPerms.description.devtools=Să extindă uneltele de dezvoltare pentru a-ț webextPerms.description.dns=Să acceseze adresa IP și informații despre denumirea gazdei webextPerms.description.downloads=Să descarce fișiere și să citească sau să modifice istoricul descărcărilor din browser webextPerms.description.downloads.open=Să deschidă fișiere descărcate pe calculator +# LOCALIZATION NOTE (webextPerms.description.experiment) +# %S will be replaced with the name of the application +webextPerms.description.experiment=Acces complet, nerestricționat la %S și la calculator webextPerms.description.find=Să citească textul din toate filele deschise webextPerms.description.geolocation=Să îți acceseze locația webextPerms.description.history=Să acceseze istoricul de navigare @@ -258,9 +263,3 @@ webext.remove.confirmation.title=Elimină %S # %2$S is brandShorterName webext.remove.confirmation.message=Elimini %1$S din %2$S? webext.remove.confirmation.button=Elimină - -# %S is brandShortName -webextPerms.experimentWarning=Malicious add-ons can steal your private information or compromise your computer. Only install this add-on if you trust the source. -# LOCALIZATION NOTE (webextPerms.description.experiment) -# %S will be replaced with the name of the application -webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer diff --git a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/customizeToolbar.dtd b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/customizeToolbar.dtd index 8d4724150e665909d01c74c4530ae10721cfba0a..5a04d5d033a82829057a3528bfbee664b260a07b 100644 --- a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/customizeToolbar.dtd +++ b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/customizeToolbar.dtd @@ -15,8 +15,7 @@ <!ENTITY addNewToolbar.label "Adaugă o nouă bară de unelte"> <!ENTITY showTitlebar.label "Afișează bara de titlu"> <!ENTITY extraDragSpace.label "Adaugă spațiu de tragere"> +<!ENTITY showTitlebar2.label "Bară de titlu"> +<!ENTITY extraDragSpace2.label "Spațiu de tragere"> <!ENTITY saveChanges.label "Terminat"> <!ENTITY undoChanges.label "Anulează schimbările"> - -<!ENTITY showTitlebar2.label "Title Bar"> -<!ENTITY extraDragSpace2.label "Drag Space"> diff --git a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/imapMsgs.properties b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/imapMsgs.properties index d5cd92fec3f08c92b0cedd5ce3fce5507c205dbf..62d386de3e6ab2e6b1294c19652485e4f20800d7 100644 --- a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/imapMsgs.properties +++ b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/imapMsgs.properties @@ -199,12 +199,22 @@ imapSubscribePrompt=Vrei să te abonezi la %1$S? imapServerDroppedConnection=Nu se poate conecta la serverul IMAP. Se poate să fi depășit numărul maxim de conexiuni cu acest server. În acest caz, reduceți numărul de conexiuni memorate în dialogul Setări avansate pentru serverul IMAP. +# This will occur when a folder that has never been imap selected or opened +# (left-clicked) is first right-clicked to access quota properties. imapQuotaStatusFolderNotOpen=Nu există informații despre cotă deoarece dosarul nu este deschis. +# The imap capability response reports that QUOTA is not supported. imapQuotaStatusNotSupported=Serverul nu suportă cote. imapQuotaStatusNoQuota=Nu există cotă de stocare pentru acest dosar. +# The getqutaroot command succeeded but reported no quota information. +imapQuotaStatusNoQuota2=Acest dosar nu raportează informații despre spațiul disponibil. + +# Folder properties were requested by the user (right-click) before the getquotaroot +# command was sent. +imapQuotaStatusInProgress=Informațiile despre spațiul disponibil nu sunt încă disponibile. + # Out of memory imapOutOfMemory=Aplicația nu mai are memorie. @@ -256,9 +266,3 @@ imapFolderCommandFailed=Operațiunea actuală privind „%2$S” nu a reușit. S # Place the word %1$S in your translation where the name of the account should appear. # Place the word %2$S in your translation where the alert from the server should appear. imapServerAlert=Alertă de la contul %1$S: %2$S - -# The getqutaroot command succeeded but reported no quota information. -imapQuotaStatusNoQuota2=This folder reports no quota information. -# Folder properties were requested by the user (right-click) before the getquotaroot -# command was sent. -imapQuotaStatusInProgress=Quota information not yet available. diff --git a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/messenger.properties b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/messenger.properties index 847d61be78c74242d23d520dd9d594a7838e26cb..690a1715e47f99d989f5dbf46e137fee44999118 100644 --- a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/messenger.properties +++ b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/messenger.properties @@ -459,11 +459,15 @@ macBiffNotification_separator=,\u0020 # For the Quota tab in the mail folder properties dialog quotaUsedFree=%S din %S KB folosiți + +# For the Quota tab in the mail folder properties dialog quotaPercentUsed=%S%% plin # for quota in main window (commandglue.js) percent=%S%% quotaTooltip=Cotă IMAP: %S KO folosiți din totalul de %S KO. Clic pentru detalii. +quotaTooltip2=Spațiu IMAP: %S utilizat din totalul de %S. Dă clic pentru detalii. + # for message views confirmViewDeleteTitle=Confirmare confirmViewDeleteMessage=Sigur vrei să ștergi această vizualizare? @@ -799,5 +803,3 @@ errorConsoleTitle = Consola de erori # This is used by screen readers to label the "back" button in various browser # popup panels, including the sliding subviews of the appmenu. panel.back = Înapoi - -quotaTooltip2=IMAP quota: %S used of %S total. Click for details. diff --git a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/pgpmime.properties b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/pgpmime.properties index 0017eea8d83ae94b33b9fcaa5d41ba8a4832a200..7256a6baee748f85073032e071b023ad69fb1d36 100644 --- a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/pgpmime.properties +++ b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/pgpmime.properties @@ -9,3 +9,6 @@ # LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=Acesta este un mesaj criptat OpenPGP.<br>Pentru a putea decripta acest mesaj, va trebui să instalezi un <a href="%S">supliment OpenPGP</a>. + +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Acesta este un mesaj criptat OpenPGP, dar suportul pentru decriptarea OpenPGP nu este disponibil. diff --git a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/preferences/general.dtd b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/preferences/general.dtd index 0d9c57f2e01aa1b58156027f8d2cf510ed473bde..2f0cfa59aafb2f0afc9150fb4f5fae0bc4021d35 100644 --- a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/preferences/general.dtd +++ b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/preferences/general.dtd @@ -43,5 +43,5 @@ <!ENTITY removeSearchEngine.label "Elimină"> <!ENTITY removeSearchEngine.accesskey "v"> -<!ENTITY minimizeToTray.label "When &brandShortName; is minimized, move it to the tray"> +<!ENTITY minimizeToTray.label "Când &brandShortName; este minimalizat, mută-l în bara de sistem"> <!ENTITY minimizeToTray.accesskey "m"> diff --git a/thunderbird-l10n/ro/localization/ro/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/ro/localization/ro/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..fef19b40451fc9c7a73c97a2cc9c52cc8dc77490 --- /dev/null +++ b/thunderbird-l10n/ro/localization/ro/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Redirecționare URI calendar +calendar-uri-redirect-description = + Serverul redirecționează URI pentru calendarul „{ $calendarName }”. + Accepți redirecționarea și începi să utilizezi noul URI pentru acest calendar? +calendar-uri-redirect-original-uri-label = URI actual: +calendar-uri-redirect-target-uri-label = Redirecționare către noul URI: diff --git a/thunderbird-l10n/ro/localization/ro/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/ro/localization/ro/devtools/client/aboutdebugging.ftl index 6a5c98c8b21c9a16036bdaef255d93a4bea901e2..fbcfeda99d70d61686bcaddd6bbb7b0870485946 100644 --- a/thunderbird-l10n/ro/localization/ro/devtools/client/aboutdebugging.ftl +++ b/thunderbird-l10n/ro/localization/ro/devtools/client/aboutdebugging.ftl @@ -186,6 +186,9 @@ about-debugging-browser-version-too-old = Browserul conectat are o versiune vech # backward compatible changes broke the debugger in those scenarios (Bug 1528219). # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1") about-debugging-browser-version-too-old-67-debugger = Este posibil ca panoul de depanare să nu funcționeze în browserul conectat. Te rugăm să folosești Firefox { $runtimeVersion } dacă trebuie să folosești Depanatorul în acest browser. +# Dedicated message for a backward compatibility issue that occurs when connecting: +# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68. +about-debugging-browser-version-too-old-fennec = Această versiune de Firefox nu poate depana Firefox pentru Android (68). Recomandăm instalarea pentru testare pe telefon a versiunii Nightly de Firefox pentru Android. <a>Mai multe detalii</a> # This string is displayed in the runtime page if the remote browser version is too recent. # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd) diff --git a/thunderbird-l10n/ro/localization/ro/messenger/accountCentral.ftl b/thunderbird-l10n/ro/localization/ro/messenger/accountCentral.ftl index 9b41c8b6cc13693bcbea2bd2ae9983b556bcd7f6..ddc7d804a559647f690ba8a10f1c1753ceadbcbf 100644 --- a/thunderbird-l10n/ro/localization/ro/messenger/accountCentral.ftl +++ b/thunderbird-l10n/ro/localization/ro/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Bine ai venit la { -brand-full-name } +account-settings = Setări cont +# $accounts (Number) - the number of configured accounts setup-title = Alege ce să setezi about-title = Despre { -brand-full-name } resources-title = Resurse @@ -40,3 +42,10 @@ explore-link = Explorează funcționalitățile support-link = Asistență involved-link = Implică-te developer-link = Documentația dezvoltatorului +read = Citește mesajele +compose = Scrie un mesaj nou +search = Caută în mesaje +filter = Gestionează filtrele de mesaje +nntp-subscription = Gestionează abonamentele la grupurile de știri +rss-subscription = Gestionează abonamentele la fluxuri +e2e = Criptare end-to-end diff --git a/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutAddons.ftl index 6c3b5d71f4022aea047280d1eeb279e8d482d33e..9b558a2c8a9178cbe4e3e128e16b3a99ae97884a 100644 --- a/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Instalează un supliment dintr-un fișier… .accesskey = I help-button = Suport pentru suplimente +sidebar-help-button-title = + .title = Suport pentru suplimente preferences = { PLATFORM() -> [windows] Opțiuni { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Instrumente pentru toate suplimentele +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Opțiuni { -brand-short-name } + *[other] Preferințe { -brand-short-name } + } show-unsigned-extensions-button = .label = Unele extensii nu au putut fi verificate show-all-extensions-button = @@ -165,13 +173,29 @@ extensions-view-available-updates = .name = Actualizări disponibile .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Recomandări +addon-category-discover-title = + .title = Recomandări addon-category-extension = Extensii +addon-category-extension-title = + .title = Extensii addon-category-theme = Teme +addon-category-theme-title = + .title = Teme addon-category-plugin = Pluginuri +addon-category-plugin-title = + .title = Pluginuri addon-category-dictionary = Dicționare +addon-category-dictionary-title = + .title = Dicționare addon-category-locale = Limbi +addon-category-locale-title = + .title = Limbi addon-category-available-updates = Actualizări disponibile +addon-category-available-updates-title = + .title = Actualizări disponibile addon-category-recent-updates = Actualizări recente +addon-category-recent-updates-title = + .title = Actualizări recente ## These are global warnings @@ -284,6 +308,7 @@ shortcuts-no-commands = Următoarele extensii nu au comenzi rapide: shortcuts-input = .placeholder = Tastează o comandă rapidă shortcuts-browserAction = Activează extensia +shortcuts-browserAction2 = Activează butonul pentru bara de unelte shortcuts-pageAction = Activează acțiunea pe pagină shortcuts-sidebarAction = Comută bara laterală shortcuts-modifier-mac = Include Ctrl, Alt sau ⌘ @@ -310,6 +335,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Afișează mai puțin go-back-button = .tooltiptext = Înapoi +header-back-button = + .title = Înapoi ## Recommended add-ons page diff --git a/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutSupport.ftl index 7e083062555161b941a999a3b5882d1df07942c4..49a6aa4163a47f5083121da6503554254474d5d8 100644 --- a/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutSupport.ftl @@ -295,6 +295,11 @@ sandbox-proc-type-content = conținut sandbox-proc-type-file = conținut fișier sandbox-proc-type-media-plugin = plugin media sandbox-proc-type-data-decoder = decodor de date +startup-cache-title = Cache de pornire +startup-cache-disk-cache-path = Cale de salvare locală pentru cache +startup-cache-ignore-disk-cache = Ignoră cache-ul salvat local +startup-cache-found-disk-cache-on-init = Cache local identificat la inițializare +startup-cache-wrote-to-disk-cache = Cache salvat local launcher-process-status-0 = Activat launcher-process-status-1 = Dezactivat din cauza unei probleme launcher-process-status-2 = Dezactivat forțat @@ -318,6 +323,7 @@ touch-enabled = intrare tactilă activată drag-enabled = tragerea barei de derulare activată keyboard-enabled = tastatură activată autoscroll-enabled = autoderulare activată +zooming-enabled = Zoom lin prin pișcare activat ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/ro/localization/ro/toolkit/about/certviewer.ftl b/thunderbird-l10n/ro/localization/ro/toolkit/about/certviewer.ftl index 62f11121663f5e37877354231c6d9fe4f1bccf86..ed0351bcfb77734b4c35d48ebdd4a0eb7630a327 100644 --- a/thunderbird-l10n/ro/localization/ro/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/ro/localization/ro/toolkit/about/certviewer.ftl @@ -29,6 +29,8 @@ certificate-viewer-id = ID certificate-viewer-key-exchange-group = Grup de schimb de chei certificate-viewer-key-id = ID cheie certificate-viewer-key-size = Mărime cheie +# Inc. means Incorporated, e.g GitHub is incorporated in Delaware +certificate-viewer-inc-locality = Sediu social certificate-viewer-locality = Localitate certificate-viewer-location = Loc certificate-viewer-logid = ID de jurnal diff --git a/thunderbird-l10n/ro/localization/ro/toolkit/global/processTypes.ftl b/thunderbird-l10n/ro/localization/ro/toolkit/global/processTypes.ftl index 790b2919c1acab0156928eebe3098c690beb4b3c..c28caed206619a5f400ea66346cab8afb5d46ed1 100644 --- a/thunderbird-l10n/ro/localization/ro/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/ro/localization/ro/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Conținut web izolat # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/ro/localization/ro/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ro/localization/ro/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..d0ab8e0e52464506016c3ad8bd29e450ab5ccce7 --- /dev/null +++ b/thunderbird-l10n/ro/localization/ro/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Ai lansat o versiune mai veche de { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Creează un profil nou +profiledowngrade-sync = Folosirea unei versiuni mai vechi de { -brand-product-name } poate corupe marcajele și istoricul de navigare deja salvate într-un profil { -brand-product-name } existent. Pentru a-ți proteja informațiile, creează un profil nou pentru această instalare { -brand-short-name }. Te poți oricum autentifica oricând cu un { -fxaccount-brand-name } pentru a sincroniza marcajele și istoricul de navigare între profiluri. +profiledowngrade-nosync = Folosirea unei versiuni mai vechi de { -brand-product-name } poate corupe marcajele și istoricul de navigare deja salvate într-un profil { -brand-product-name } existent. Pentru a-ți proteja informațiile, creează un profil nou pentru această instalare { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Ieșire + *[other] Închide + } diff --git a/thunderbird-l10n/ro/manifest.json b/thunderbird-l10n/ro/manifest.json index cce250406dc021a003ae6e99c6e79e0d761d329a..a98307e477aee1c7eaa2343b5c1c2f6b951b0fea 100644 --- a/thunderbird-l10n/ro/manifest.json +++ b/thunderbird-l10n/ro/manifest.json @@ -1,57 +1,57 @@ { - "manifest_version": 2, - "name": "Română (România) Language Pack", - "author": "mozilla.org (contributors: Alexandru Szasz, Raul Nicolae Malea, Cristian Silaghi, Jobava)", + "sources": { + "browser": { + "base_path": "browser/" + } + }, "description": "Language pack for Thunderbird for ro", + "manifest_version": 2, "languages": { "ro": { "chrome_resources": { - "devtools": "chrome/ro/locale/ro/devtools/client/", - "passwordmgr": "chrome/ro/locale/ro/passwordmgr/", "chat": "chrome/ro/locale/ro/chat/", - "messenger-region": "chrome/ro/locale/ro/messenger-region/", "pippki": "chrome/ro/locale/ro/pippki/", + "messenger-smime": "chrome/ro/locale/ro/messenger-smime/", + "devtools-shared": "chrome/ro/locale/ro/devtools/shared/", + "alerts": "chrome/ro/locale/ro/alerts/", + "lightning": "chrome/ro/locale/ro/lightning/", + "pipnss": "chrome/ro/locale/ro/pipnss/", + "pluginproblem": "chrome/ro/locale/ro/pluginproblem/", + "mozapps": "chrome/ro/locale/ro/mozapps/", + "passwordmgr": "chrome/ro/locale/ro/passwordmgr/", + "global": "chrome/ro/locale/ro/global/", + "calendar": "chrome/ro/locale/ro/calendar/", + "messenger-mapi": "chrome/ro/locale/ro/messenger-mapi/", "communicator": "chrome/ro/locale/ro/communicator/", + "devtools": "chrome/ro/locale/ro/devtools/client/", "global-platform": { - "macosx": "chrome/ro/locale/ro/global-platform/mac/", - "android": "chrome/ro/locale/ro/global-platform/unix/", "win": "chrome/ro/locale/ro/global-platform/win/", - "linux": "chrome/ro/locale/ro/global-platform/unix/" + "linux": "chrome/ro/locale/ro/global-platform/unix/", + "android": "chrome/ro/locale/ro/global-platform/unix/", + "macosx": "chrome/ro/locale/ro/global-platform/mac/" }, - "mozapps": "chrome/ro/locale/ro/mozapps/", - "alerts": "chrome/ro/locale/ro/alerts/", - "necko": "chrome/ro/locale/ro/necko/", "mozldap": "chrome/ro/locale/ro/mozldap/", - "messenger-newsblog": "chrome/ro/locale/ro/messenger-newsblog/", - "messenger-smime": "chrome/ro/locale/ro/messenger-smime/", - "calendar": "chrome/ro/locale/ro/calendar/", - "messenger": "chrome/ro/locale/ro/messenger/", "devtools-startup": "chrome/ro/locale/ro/devtools/startup/", - "lightning": "chrome/ro/locale/ro/lightning/", - "pluginproblem": "chrome/ro/locale/ro/pluginproblem/", + "branding": "chrome/ro/locale/ro/branding/", + "messenger": "chrome/ro/locale/ro/messenger/", + "messenger-region": "chrome/ro/locale/ro/messenger-region/", "autoconfig": "chrome/ro/locale/ro/autoconfig/", - "places": "chrome/ro/locale/ro/places/", - "devtools-shared": "chrome/ro/locale/ro/devtools/shared/", - "pipnss": "chrome/ro/locale/ro/pipnss/", - "messenger-mapi": "chrome/ro/locale/ro/messenger-mapi/", - "global": "chrome/ro/locale/ro/global/", - "branding": "chrome/ro/locale/ro/branding/" + "messenger-newsblog": "chrome/ro/locale/ro/messenger-newsblog/", + "necko": "chrome/ro/locale/ro/necko/", + "places": "chrome/ro/locale/ro/places/" }, - "version": "20200403080214" + "version": "20200415060958" } }, + "author": "mozilla.org (contributors: Alexandru Szasz, Raul Nicolae Malea, Cristian Silaghi, Jobava)", + "version": "76.0buildid20200420212409", "langpack_id": "ro", - "version": "76.0buildid20200407173003", "applications": { "gecko": { - "strict_min_version": "76.0", "strict_max_version": "76.*", + "strict_min_version": "76.0", "id": "langpack-ro@thunderbird.mozilla.org" } }, - "sources": { - "browser": { - "base_path": "browser/" - } - } + "name": "Română (România) Language Pack" } diff --git a/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/messenger.dtd b/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/messenger.dtd index 955e2a2bbf9f33e5ab15aaeeab8449243d16ad6b..ad9cf8f4c5975e1f8b33e4bf9856ecb3ef69f65d 100644 --- a/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/messenger.dtd +++ b/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Поиск сообщений…"> <!ENTITY searchMailCmd.accesskey "П"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Глобальный поиск…"> +<!ENTITY glodaSearchCmd.accesskey "л"> <!ENTITY searchAddressesCmd.label "Поиск адресов…"> <!ENTITY searchAddressesCmd.accesskey "а"> diff --git a/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/pgpmime.properties b/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/pgpmime.properties index 69733029d283da4d113057af9e32ec2a6831bd66..de977199809d0c0bff15da4e5a53ba646a8dcacf 100644 --- a/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/pgpmime.properties +++ b/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/pgpmime.properties @@ -8,5 +8,7 @@ # LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. # %S is the url to Enigmail on AMO supplied from preferences. -pgpMimeNeedsAddon=Это зашифрованное сообщение OpenPGP.<br>Чтобы расшифровать это письмо, вам необходимо установить <a href="%S">дополнение OpenPGP</a>. +pgpMimeNeedsAddon=Это сообщение зашифровано OpenPGP.<br>Чтобы расшифровать это письмо, вам необходимо установить <a href="%S">дополнение OpenPGP</a>. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Это сообщение зашифровано OpenPGP, но поддержка расшифровки OpenPGP недоступна. diff --git a/thunderbird-l10n/ru/chrome/ru/locale/ru/necko/necko.properties b/thunderbird-l10n/ru/chrome/ru/locale/ru/necko/necko.properties index df12b8dba8f82af0de8f92ad4359e50ab6f1e59a..a1b54579185d31d15fc70660b7f9bae84dd26bfd 100644 --- a/thunderbird-l10n/ru/chrome/ru/locale/ru/necko/necko.properties +++ b/thunderbird-l10n/ru/chrome/ru/locale/ru/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Автоматически предо # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Автоматически предоставлен доступ к хранилищу для трекера «%2$S» на «%1$S». +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Автоматически предоставлен доступ к хранилищу для First-Party изоляции «%2$S» на «%1$S». + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Кука «%1$S» отклонена, поскольку в ней присутствует атрибут «sameSite=none», но отсутствует атрибут «secure». # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/ru/localization/ru/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/ru/localization/ru/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..8d50209c5978b6ef083d86052871274844a11d5b --- /dev/null +++ b/thunderbird-l10n/ru/localization/ru/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Перенаправление URI календаря +calendar-uri-redirect-description = + Сервер перенаправляет URI для календаря «{ $calendarName }». + Принять перенаправление и начать использовать новый URI для этого календаря? +calendar-uri-redirect-original-uri-label = Текущий URI: +calendar-uri-redirect-target-uri-label = Перенаправление на новый URI: diff --git a/thunderbird-l10n/ru/localization/ru/messenger/accountCentral.ftl b/thunderbird-l10n/ru/localization/ru/messenger/accountCentral.ftl index d319159c7eb9e02aab973016818f55ce00c5b9bb..f7e88d2c941f1df8279d6192b1f1fa6c13eebb0f 100644 --- a/thunderbird-l10n/ru/localization/ru/messenger/accountCentral.ftl +++ b/thunderbird-l10n/ru/localization/ru/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Добро пожаловать в { -brand-full-name } +account-settings = Параметры учётной записи +# $accounts (Number) - the number of configured accounts setup-title = Выберите, что нужно настроить about-title = О { -brand-full-name } resources-title = Ресурсы @@ -10,18 +12,25 @@ release-notes = .title = О { -brand-full-name } email-label = Электронная почта .aria-label = Подключиться к имеющейся у вас учётной записи электронной почты +email-description = { -brand-short-name } позволяет вам подключить существующую учётную запись электронной почты для удобного и эффективного чтения ваших писем в приложении. calendar-label = Календарь .aria-label = Создать новый календарь +calendar-description = { -brand-short-name } позволяет вам управлять вашими событиями и помогает в удобной их организации. Подключение удалённого календаря позволяет синхронизировать все ваши события на всех ваших устройствах. chat-label = Чат .aria-label = Подключить учётную запись чата +chat-description = { -brand-short-name } позволяет вам подключить несколько учётных записей служб мгновенного обмена сообщениями, на различных платформах. filelink-label = Filelink .aria-label = Настроить Filelink +filelink-description = { -brand-short-name } позволяет вам настроить удобную облачную учётную запись для лёгкой отправки больших вложений. addressbook-label = Адресная книга .aria-label = Создать новую адресную книгу +addressbook-description = { -brand-short-name } позволяет организовать все ваши контакты в адресной книге. Вы также можете подключиться к удалённой адресной книге, чтобы синхронизировать все ваши контакты. feeds-label = Ленты новостей .aria-label = Подписаться на ленты новостей +feeds-description = { -brand-short-name } позволяет вам подключаться к лентам новостей RSS/Atom для получения новостей и обновлений отовсюду сразу. newsgroups-label = Группы новостей .aria-label = Подключиться к группе новостей +newsgroups-description = { -brand-short-name } позволяет вам подключаться ко всем нужным группам новостей. import-title = Импорт из другой программы import-paragraph = { -brand-short-name } может импортировать почтовые сообщения, содержимое адресных книг, подписки на ленты новостей, настройки и/или фильтры из других почтовых программ и распространённых форматов адресных книг. import-label = Импорт @@ -33,3 +42,10 @@ explore-link = Узнать о возможностях support-link = Поддержка involved-link = Принять участие developer-link = Документация для разработчиков +read = Чтение сообщений +compose = Создание новых сообщений +search = Поиск сообщений +filter = Управление фильтрами сообщений +nntp-subscription = Управление подписками на группы новостей +rss-subscription = Управление подписками на ленты новостей +e2e = Сквозное шифрование diff --git a/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutAddons.ftl index 06f30debc1d7517eb273747679523043cf0d7aa7..ed79a6a9bf2cff26b1062b9d9ac4e667cd058432 100644 --- a/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Установить дополнение из файла… .accesskey = а help-button = Поддержка дополнений +sidebar-help-button-title = + .title = Поддержка дополнений preferences = { PLATFORM() -> [windows] Настройки { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Инструменты для всех дополнений +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Настройки { -brand-short-name } + *[other] Настройки { -brand-short-name } + } show-unsigned-extensions-button = .label = Некоторые расширения не могут быть проверены show-all-extensions-button = @@ -168,13 +176,29 @@ extensions-view-available-updates = .name = Доступные обновления .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Рекомендации +addon-category-discover-title = + .title = Рекомендации addon-category-extension = Расширения +addon-category-extension-title = + .title = Расширения addon-category-theme = Темы +addon-category-theme-title = + .title = Темы addon-category-plugin = Плагины +addon-category-plugin-title = + .title = Плагины addon-category-dictionary = Словари +addon-category-dictionary-title = + .title = Словари addon-category-locale = Языки +addon-category-locale-title = + .title = Языки addon-category-available-updates = Доступные обновления +addon-category-available-updates-title = + .title = Доступные обновления addon-category-recent-updates = Недавние обновления +addon-category-recent-updates-title = + .title = Недавние обновления ## These are global warnings @@ -313,6 +337,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Показать меньше go-back-button = .tooltiptext = Вернуться назад +header-back-button = + .title = Вернуться назад ## Recommended add-ons page diff --git a/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutSupport.ftl index 64a96daf4187232d4e2838a649434e2b59ae7531..1efae4fb8e04860eba63917c4e90983e41e6e522 100644 --- a/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutSupport.ftl @@ -292,6 +292,8 @@ sandbox-proc-type-content = контент sandbox-proc-type-file = содержимое файла sandbox-proc-type-media-plugin = медиаплагин sandbox-proc-type-data-decoder = декодер данных +startup-cache-disk-cache-path = Путь к дисковому кешу +startup-cache-ignore-disk-cache = Игнорировать дисковый кэш launcher-process-status-0 = Включён launcher-process-status-1 = Отключён из-за сбоя launcher-process-status-2 = Принудительно отключён diff --git a/thunderbird-l10n/ru/localization/ru/toolkit/about/certviewer.ftl b/thunderbird-l10n/ru/localization/ru/toolkit/about/certviewer.ftl index 6fd65a068ee2942a392fa6c2b8ccca65939ca490..e8f8f64955e2810e1c924ddbc32cb3492bc3b99a 100644 --- a/thunderbird-l10n/ru/localization/ru/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/ru/localization/ru/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (сертификат) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (цепочка сертификатов) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Это расширение помечено как критическое, что означает, что клиенты должны отклонить сертификат, если они его не понимают. +certificate-viewer-export = Экспортировать + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Ваши сертификаты +certificate-viewer-tab-people = Люди +certificate-viewer-tab-servers = Серверы +certificate-viewer-tab-ca = Центры сертификации +certificate-viewer-tab-unkonwn = Неизвестно diff --git a/thunderbird-l10n/ru/localization/ru/toolkit/global/processTypes.ftl b/thunderbird-l10n/ru/localization/ru/toolkit/global/processTypes.ftl index e52c266126278d039e92fbdf66e0e567250f3a87..1c49d4824bdb7641cd1dc3908ebd60067efea96c 100644 --- a/thunderbird-l10n/ru/localization/ru/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/ru/localization/ru/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Изолированное веб-содержимо # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Сокет diff --git a/thunderbird-l10n/ru/localization/ru/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ru/localization/ru/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..96928eab5f933c766905fe2f3a89e221caef3ac3 --- /dev/null +++ b/thunderbird-l10n/ru/localization/ru/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Вы запустили устаревшую версию { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Создать новый профиль +profiledowngrade-sync = Использование устаревшей версии { -brand-product-name } может повредить закладки и историю просмотра, уже сохранённые в существующем профиле { -brand-product-name }. Чтобы защитить вашу информацию, создайте новый профиль для этой установки { -brand-short-name }. Вы всегда можете войти в свой { -fxaccount-brand-name }, чтобы синхронизировать ваши закладки и историю просмотра между профилями. +profiledowngrade-nosync = Использование устаревшей версии { -brand-product-name } может повредить закладки и историю просмотра, уже сохранённые в существующем профиле { -brand-product-name }. Чтобы защитить вашу информацию, создайте новый профиль для этой установки { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Выйти + *[other] Выйти + } diff --git a/thunderbird-l10n/ru/manifest.json b/thunderbird-l10n/ru/manifest.json index ddec1bd2c3099695d7ab79903a819d9a8cbb4192..e6240a173790c2c2ad4a3997d2d9af00d17e659f 100644 --- a/thunderbird-l10n/ru/manifest.json +++ b/thunderbird-l10n/ru/manifest.json @@ -1,57 +1,57 @@ { - "applications": { - "gecko": { - "id": "langpack-ru@thunderbird.mozilla.org", - "strict_max_version": "76.*", - "strict_min_version": "76.0" - } - }, - "manifest_version": 2, + "version": "76.0buildid20200420212409", "languages": { "ru": { + "version": "20200419145404", "chrome_resources": { + "passwordmgr": "chrome/ru/locale/ru/passwordmgr/", + "messenger-smime": "chrome/ru/locale/ru/messenger-smime/", + "chat": "chrome/ru/locale/ru/chat/", + "devtools-startup": "chrome/ru/locale/ru/devtools/startup/", "places": "chrome/ru/locale/ru/places/", - "lightning": "chrome/ru/locale/ru/lightning/", - "global": "chrome/ru/locale/ru/global/", + "alerts": "chrome/ru/locale/ru/alerts/", "devtools-shared": "chrome/ru/locale/ru/devtools/shared/", + "calendar": "chrome/ru/locale/ru/calendar/", "global-platform": { "android": "chrome/ru/locale/ru/global-platform/unix/", + "macosx": "chrome/ru/locale/ru/global-platform/mac/", "linux": "chrome/ru/locale/ru/global-platform/unix/", - "win": "chrome/ru/locale/ru/global-platform/win/", - "macosx": "chrome/ru/locale/ru/global-platform/mac/" + "win": "chrome/ru/locale/ru/global-platform/win/" }, - "branding": "chrome/ru/locale/ru/branding/", - "pipnss": "chrome/ru/locale/ru/pipnss/", - "messenger-newsblog": "chrome/ru/locale/ru/messenger-newsblog/", + "necko": "chrome/ru/locale/ru/necko/", "autoconfig": "chrome/ru/locale/ru/autoconfig/", - "mozapps": "chrome/ru/locale/ru/mozapps/", - "passwordmgr": "chrome/ru/locale/ru/passwordmgr/", + "messenger-region": "chrome/ru/locale/ru/messenger-region/", + "lightning": "chrome/ru/locale/ru/lightning/", + "devtools": "chrome/ru/locale/ru/devtools/client/", "communicator": "chrome/ru/locale/ru/communicator/", - "devtools-startup": "chrome/ru/locale/ru/devtools/startup/", - "pluginproblem": "chrome/ru/locale/ru/pluginproblem/", - "necko": "chrome/ru/locale/ru/necko/", - "calendar": "chrome/ru/locale/ru/calendar/", - "mozldap": "chrome/ru/locale/ru/mozldap/", + "messenger-mapi": "chrome/ru/locale/ru/messenger-mapi/", "pippki": "chrome/ru/locale/ru/pippki/", - "devtools": "chrome/ru/locale/ru/devtools/client/", - "messenger-region": "chrome/ru/locale/ru/messenger-region/", + "branding": "chrome/ru/locale/ru/branding/", + "mozldap": "chrome/ru/locale/ru/mozldap/", + "mozapps": "chrome/ru/locale/ru/mozapps/", + "pipnss": "chrome/ru/locale/ru/pipnss/", + "messenger-newsblog": "chrome/ru/locale/ru/messenger-newsblog/", + "global": "chrome/ru/locale/ru/global/", "messenger": "chrome/ru/locale/ru/messenger/", - "alerts": "chrome/ru/locale/ru/alerts/", - "chat": "chrome/ru/locale/ru/chat/", - "messenger-mapi": "chrome/ru/locale/ru/messenger-mapi/", - "messenger-smime": "chrome/ru/locale/ru/messenger-smime/" - }, - "version": "20200405222243" + "pluginproblem": "chrome/ru/locale/ru/pluginproblem/" + } } }, - "version": "76.0buildid20200407173003", "description": "Language pack for Thunderbird for ru", - "langpack_id": "ru", "author": "Mozilla Russia (contributors: Александр Словесник)", + "applications": { + "gecko": { + "strict_max_version": "76.*", + "strict_min_version": "76.0", + "id": "langpack-ru@thunderbird.mozilla.org" + } + }, + "langpack_id": "ru", + "name": "Russian (RU) Language Pack", + "manifest_version": 2, "sources": { "browser": { "base_path": "browser/" } - }, - "name": "Russian (RU) Language Pack" + } } diff --git a/thunderbird-l10n/si/localization/si/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/si/localization/si/toolkit/about/aboutAddons.ftl index d42fb5585fca07494fe761c62d662d4a8bc44d33..87194fcd1d7ca4e5495dba54712ea303d237d5ab 100644 --- a/thunderbird-l10n/si/localization/si/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/si/localization/si/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = ඇඩෝන ගොනුවෙන් ස්ථාපනය කරන්න… .accesskey = I help-button = ඇඩෝන සහාය +sidebar-help-button-title = + .title = ඇඩෝන සහාය preferences = { PLATFORM() -> [windows] { -brand-short-name } විකල්ප @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = සියළු ඇඩෝන සඳහා මෙවලම් +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } විකල්ප + *[other] { -brand-short-name } අභිප්රේත + } show-unsigned-extensions-button = .label = ඇතැම් දිගු තහවුරු කළ නොහැක show-all-extensions-button = @@ -147,11 +155,23 @@ extensions-view-available-updates = .name = පවතින යාවත්කාලීන .tooltiptext = { extensions-view-available-updates.name } addon-category-extension = දිගුකිරීම් +addon-category-extension-title = + .title = දිගුකිරීම් addon-category-plugin = ප්ලගීන +addon-category-plugin-title = + .title = ප්ලගීන addon-category-dictionary = ශබ්දකෝෂයන් +addon-category-dictionary-title = + .title = ශබ්දකෝෂයන් addon-category-locale = භාෂාවන් +addon-category-locale-title = + .title = භාෂාවන් addon-category-available-updates = පවතින යාවත්කාලීන +addon-category-available-updates-title = + .title = පවතින යාවත්කාලීන addon-category-recent-updates = මෑතකාලීන යාවත්කාලීන +addon-category-recent-updates-title = + .title = මෑතකාලීන යාවත්කාලීන ## These are global warnings diff --git a/thunderbird-l10n/si/localization/si/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/si/localization/si/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..b3ea5c5e9c29b73db6c31eaf335243212f1919fc --- /dev/null +++ b/thunderbird-l10n/si/localization/si/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,15 @@ +# 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/. + +profiledowngrade-window = + .title = ඔබ පැරණි { -brand-product-name } නිකුතුවක් දියත් කරයි. + .style = width: 490px; +profiledowngrade-window-create = + .label = නව පැතිකඩක් තනන්න +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] පිටවීම + *[other] ඉවත්වීම + } diff --git a/thunderbird-l10n/si/manifest.json b/thunderbird-l10n/si/manifest.json index 02bc4b3b953c3e77364ff9ff135055f5849a37f7..dccc1db0447df780547f2d5272625008805a508b 100644 --- a/thunderbird-l10n/si/manifest.json +++ b/thunderbird-l10n/si/manifest.json @@ -4,6 +4,10 @@ "base_path": "browser/" } }, + "name": "Sinhala (si-LK) Language Pack", + "manifest_version": 2, + "author": "mozilla.org (contributors: රෝහන දසනායක, මහේෂා හතරසිංහ, කසුන් කරුණාරත්න)", + "description": "Language pack for Thunderbird for si", "applications": { "gecko": { "strict_max_version": "76.*", @@ -13,45 +17,41 @@ }, "languages": { "si": { - "version": "20200403080409", "chrome_resources": { - "messenger-mapi": "chrome/si/locale/si/messenger-mapi/", - "communicator": "chrome/si/locale/si/communicator/", - "mozldap": "chrome/si/locale/si/mozldap/", - "alerts": "chrome/si/locale/si/alerts/", "devtools-startup": "chrome/si/locale/si/devtools/startup/", - "devtools": "chrome/si/locale/si/devtools/client/", - "pluginproblem": "chrome/si/locale/si/pluginproblem/", - "branding": "chrome/si/locale/si/branding/", + "necko": "chrome/si/locale/si/necko/", + "messenger-mapi": "chrome/si/locale/si/messenger-mapi/", "messenger-region": "chrome/si/locale/si/messenger-region/", - "places": "chrome/si/locale/si/places/", - "messenger-smime": "chrome/si/locale/si/messenger-smime/", - "mozapps": "chrome/si/locale/si/mozapps/", + "branding": "chrome/si/locale/si/branding/", "calendar": "chrome/si/locale/si/calendar/", - "autoconfig": "chrome/si/locale/si/autoconfig/", - "lightning": "chrome/si/locale/si/lightning/", + "mozapps": "chrome/si/locale/si/mozapps/", + "mozldap": "chrome/si/locale/si/mozldap/", + "pluginproblem": "chrome/si/locale/si/pluginproblem/", "devtools-shared": "chrome/si/locale/si/devtools/shared/", - "messenger-newsblog": "chrome/si/locale/si/messenger-newsblog/", - "global": "chrome/si/locale/si/global/", + "pipnss": "chrome/si/locale/si/pipnss/", + "communicator": "chrome/si/locale/si/communicator/", + "places": "chrome/si/locale/si/places/", "passwordmgr": "chrome/si/locale/si/passwordmgr/", + "chat": "chrome/si/locale/si/chat/", + "lightning": "chrome/si/locale/si/lightning/", + "messenger": "chrome/si/locale/si/messenger/", + "messenger-smime": "chrome/si/locale/si/messenger-smime/", "global-platform": { - "macosx": "chrome/si/locale/si/global-platform/mac/", - "win": "chrome/si/locale/si/global-platform/win/", "android": "chrome/si/locale/si/global-platform/unix/", - "linux": "chrome/si/locale/si/global-platform/unix/" + "win": "chrome/si/locale/si/global-platform/win/", + "linux": "chrome/si/locale/si/global-platform/unix/", + "macosx": "chrome/si/locale/si/global-platform/mac/" }, - "messenger": "chrome/si/locale/si/messenger/", - "pipnss": "chrome/si/locale/si/pipnss/", - "necko": "chrome/si/locale/si/necko/", - "chat": "chrome/si/locale/si/chat/", - "pippki": "chrome/si/locale/si/pippki/" - } + "messenger-newsblog": "chrome/si/locale/si/messenger-newsblog/", + "autoconfig": "chrome/si/locale/si/autoconfig/", + "global": "chrome/si/locale/si/global/", + "pippki": "chrome/si/locale/si/pippki/", + "devtools": "chrome/si/locale/si/devtools/client/", + "alerts": "chrome/si/locale/si/alerts/" + }, + "version": "20200415061136" } }, - "manifest_version": 2, - "name": "Sinhala (si-LK) Language Pack", - "author": "mozilla.org (contributors: රෝහන දසනායක, මහේෂා හතරසිංහ, කසුන් කරුණාරත්න)", - "description": "Language pack for Thunderbird for si", - "version": "76.0buildid20200407173003", + "version": "76.0buildid20200420212409", "langpack_id": "si" } diff --git a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/accountCreation.dtd b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/accountCreation.dtd index 0abac67ce30774b9711cc223a314dc2d1223d626..5fbc8ed02d1ff9e387e589c263f6cab161643860 100644 --- a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/accountCreation.dtd +++ b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/accountCreation.dtd @@ -37,6 +37,7 @@ <!ENTITY imapLong.label "IMAP (vzdialené priečinky)"> <!ENTITY pop3Long.label "POP3 (uchováva poštu na disku počítača)"> +<!ENTITY manualConfigTable.summary "Nastavenia servera"> <!ENTITY incoming.label "Prijímanie:"> <!ENTITY incomingColumn.label "Prijímanie"> <!ENTITY outgoing.label "Odosielanie:"> @@ -119,5 +120,3 @@ <!ENTITY insecureUnencrypted.description "Vaša e-mailová adresa a prihlasovacie údaje sú odosielané nezašifrované, takže heslo (a vaša správa) môžu byť jednoducho prečítané inými ľuďmi. &brandShortName; vám umožní získať vaše e-mailové správy, ale mali by ste vášho poskytovateľa požiadať o zriadenie zabezpečeného pripojenia k poštovému serveru."> <!ENTITY insecureSelfSigned.description "Server používa certifikát, ktorému nemôžeme dôverovať, takže nemôžeme zaručiť, že niekto nesleduje údaje posielané medzi &brandShortName;om a serverom. &brandShortName; vám umožní získať vaše e-mailové správy, ale mali by ste vášho poskytovateľa požiadať o zriadenie zabezpečeného pripojenia s platným certifikátom poštového servera."> <!ENTITY secureServer.description "Gratulujeme! Toto je zabezpečený server."> - -<!ENTITY manualConfigTable.summary "Server settings"> diff --git a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/addons.properties b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/addons.properties index 39270ffe7be883df8ac7a000bba84749ebf15f24..16472a29a282ac30d42e244b2350dfcc7abd1f56 100644 --- a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/addons.properties +++ b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/addons.properties @@ -1,4 +1,15 @@ +# 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/. + xpinstallPromptMessage=%S zabránil tejto stránke požiadať o inštaláciu softvéru. +# LOCALIZATION NOTE (xpinstallPromptMessage.header) +# The string contains the hostname of the site the add-on is being installed from. +xpinstallPromptMessage.header=Chcete nainštalovať doplnok z %S? +xpinstallPromptMessage.message=Pokúšate sa nainštalovať doplnok z %S. Uistite sa, že tejto stránke môžete dôverovať. +xpinstallPromptMessage.header.unknown=Chcete nainštalovať doplnok z neznámej stránky? +xpinstallPromptMessage.message.unknown=Pokúšate sa nainštalovať doplnok z neznámej stránky. Uistite sa, že tejto stránke môžete dôverovať. +xpinstallPromptMessage.learnMore=Ďalšie informácie o bezpečnej inštalácii doplnkov xpinstallPromptMessage.dontAllow=Nepovoliť xpinstallPromptMessage.dontAllow.accesskey=N xpinstallPromptAllowButton=Povoliť @@ -6,11 +17,29 @@ xpinstallPromptAllowButton=Povoliť # Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button) # See http://www.mozilla.org/access/keyboard/accesskey for details xpinstallPromptAllowButton.accesskey=P +xpinstallPromptMessage.neverAllow=Nikdy nepovoliť +xpinstallPromptMessage.neverAllow.accesskey=N +# Accessibility Note: +# Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button) +# See https://website-archive.mozilla.org/www.mozilla.org/access/access/keyboard/ for details +xpinstallPromptMessage.install=Nainštalovať +xpinstallPromptMessage.install.accesskey=a + +# Accessibility Note: +# Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button) +# See http://www.mozilla.org/access/keyboard/accesskey for details xpinstallDisabledMessageLocked=Inštalácia softvéru bola vypnutá vaším správcom systému. xpinstallDisabledMessage=Inštalácia softvéru je momentálne vypnutá. Kliknite na tlačidlo Povoliť a skúste to znova. xpinstallDisabledButton=Povoliť xpinstallDisabledButton.accesskey=o +# LOCALIZATION NOTE (addonInstallBlockedByPolicy) +# This message is shown when the installation of an add-on is blocked by +# enterprise policy. %1$S is replaced by the name of the add-on. +# %2$S is replaced by the ID of add-on. %3$S is a custom message that +# the administration can add to the message. +addonInstallBlockedByPolicy=Doplnok %1$S (%2$S) bol zablokovaný správcom vášho počítača. %3$S + # LOCALIZATION NOTE (addonPostInstall.message1) # %1$S is replaced with the localized named of the extension that was # just installed. @@ -97,6 +126,8 @@ addonInstallErrorBlocklisted=Doplnok %S nebol byť nainštalovaný, pretože je # Note, this string will be used as raw markup. Avoid characters like <, >, & webextPerms.header=Chcete pridať %S? +# %S is brandShortName +webextPerms.experimentWarning=Škodlivé doplnky môžu ukradnúť vaše osobné informácie alebo nakaziť váš počítač. Tento doplnok nainštalujte iba ak pochádza z dôveryhodného zdroja. webextPerms.unsignedWarning=Upozornenie: Tento doplnok je neoverený. Škodlivé doplnky môžu ukradnúť vaše osobné informácie alebo nakaziť váš počítač. Tento doplnok nainštalujte iba ak pochádza z dôveryhodného zdroja. # LOCALIZATION NOTE (webextPerms.listIntro) @@ -165,6 +196,9 @@ webextPerms.description.devtools=Rozšíriť vývojárske nástroje a získať p webextPerms.description.dns=Prístup k informáciám o IP adrese a názve hostiteľa webextPerms.description.downloads=Preberať súbory a čítať a upravovať históriu prevzatých súborov webextPerms.description.downloads.open=Otvárať súbory prevzaté do vášho počítača +# LOCALIZATION NOTE (webextPerms.description.experiment) +# %S will be replaced with the name of the application +webextPerms.description.experiment=Mať úplný, neobmedzený prístup k %Su a k vášmu počítaču webextPerms.description.find=Prístup k textu všetkých otvorených kariet webextPerms.description.geolocation=Prístup k údajom o polohe webextPerms.description.history=Prístup k histórii prehliadania @@ -229,29 +263,3 @@ webext.remove.confirmation.title=Odstrániť %S # %2$S is brandShorterName webext.remove.confirmation.message=Odstrániť %1$S z aplikácie %2$S? webext.remove.confirmation.button=Odstrániť - -# LOCALIZATION NOTE (xpinstallPromptMessage.header) -# The string contains the hostname of the site the add-on is being installed from. -xpinstallPromptMessage.header=Allow %S to install an add-on? -xpinstallPromptMessage.message=You are attempting to install an add-on from %S. Make sure you trust this site before continuing. -xpinstallPromptMessage.header.unknown=Allow an unknown site to install an add-on? -xpinstallPromptMessage.message.unknown=You are attempting to install an add-on from an unknown site. Make sure you trust this site before continuing. -xpinstallPromptMessage.learnMore=Learn more about installing add-ons safely -xpinstallPromptMessage.neverAllow=Never Allow -xpinstallPromptMessage.neverAllow.accesskey=N -# Accessibility Note: -# Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button) -# See https://website-archive.mozilla.org/www.mozilla.org/access/access/keyboard/ for details -xpinstallPromptMessage.install=Continue to Installation -xpinstallPromptMessage.install.accesskey=C -# LOCALIZATION NOTE (addonInstallBlockedByPolicy) -# This message is shown when the installation of an add-on is blocked by -# enterprise policy. %1$S is replaced by the name of the add-on. -# %2$S is replaced by the ID of add-on. %3$S is a custom message that -# the administration can add to the message. -addonInstallBlockedByPolicy=%1$S (%2$S) is blocked by your system administrator.%3$S -# %S is brandShortName -webextPerms.experimentWarning=Malicious add-ons can steal your private information or compromise your computer. Only install this add-on if you trust the source. -# LOCALIZATION NOTE (webextPerms.description.experiment) -# %S will be replaced with the name of the application -webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer diff --git a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/customizeToolbar.dtd b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/customizeToolbar.dtd index c11f880bc2632986dd1d6421ade4dc81b3a4e874..3bae3bedc44bddba4c34c8b0cf741f6d0acb2d0a 100644 --- a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/customizeToolbar.dtd +++ b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/customizeToolbar.dtd @@ -15,8 +15,7 @@ <!ENTITY addNewToolbar.label "Pridať nový panel"> <!ENTITY showTitlebar.label "Zobraziť panel s titulkom okna"> <!ENTITY extraDragSpace.label "Pridať priestor na presunutie"> +<!ENTITY showTitlebar2.label "Panel s titulkom okna"> +<!ENTITY extraDragSpace2.label "Priestor na presunutie"> <!ENTITY saveChanges.label "Hotovo"> <!ENTITY undoChanges.label "Zrušiť zmeny"> - -<!ENTITY showTitlebar2.label "Title Bar"> -<!ENTITY extraDragSpace2.label "Drag Space"> diff --git a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/imapMsgs.properties b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/imapMsgs.properties index a3bbc654aff84845f8efc5216fe76efbefbed763..da3f0f632681bf757f4ea5aa63d457742f43966f 100644 --- a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/imapMsgs.properties +++ b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/imapMsgs.properties @@ -166,7 +166,7 @@ imapPersonalSharedFolderTypeDescription=Toto je osobný poštový priečinok. Je imapPublicFolderTypeDescription=Toto je verejný priečinok. -imapOtherUsersFolderTypeDescription=Toto je poštový priečinok zdieľaný používateľom '%S'. +imapOtherUsersFolderTypeDescription=Toto je poštový priečinok zdieľaný používateľom „%S“. imapAclFullRights=Úplná kontrola @@ -199,12 +199,22 @@ imapSubscribePrompt=Chcete sa prihlásiť k odberu priečinka %1$S? imapServerDroppedConnection=Nepodarilo sa spojiť so serverom IMAP. Je možné, že bol prekročený maximálny povolený počet pripojení na tento server. Pokiaľ k tomu došlo, znížte počet pripojení v dialógovom okne Pokročilé nastavenie servera IMAP. +# This will occur when a folder that has never been imap selected or opened +# (left-clicked) is first right-clicked to access quota properties. imapQuotaStatusFolderNotOpen=Informácie o kvóte nie sú k dispozícii, pretože priečinok nie je otvorený. +# The imap capability response reports that QUOTA is not supported. imapQuotaStatusNotSupported=Tento server nepodporuje kvóty. imapQuotaStatusNoQuota=Na tomto priečinku nie sú nastavené žiadne kvóty. +# The getqutaroot command succeeded but reported no quota information. +imapQuotaStatusNoQuota2=Tento priečinok nehlási žiadne informácie o kvóte. + +# Folder properties were requested by the user (right-click) before the getquotaroot +# command was sent. +imapQuotaStatusInProgress=Informácie o kvóte zatiaľ nie sú k dispozícii. + # Out of memory imapOutOfMemory=Aplikácia má nedostatok pamäte. @@ -256,9 +266,3 @@ imapFolderCommandFailed=Práve vykonávaná operácia na priečinku '%2$S' zlyha # Place the word %1$S in your translation where the name of the account should appear. # Place the word %2$S in your translation where the alert from the server should appear. imapServerAlert=Upozornenie z účtu %1$S: %2$S - -# The getqutaroot command succeeded but reported no quota information. -imapQuotaStatusNoQuota2=This folder reports no quota information. -# Folder properties were requested by the user (right-click) before the getquotaroot -# command was sent. -imapQuotaStatusInProgress=Quota information not yet available. diff --git a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/messenger.properties b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/messenger.properties index e8d9c37ff7b2f8870e7d08d9aed38525e28ea790..dc6c90a3db8f6f9f283335810f2da837efeb16a2 100644 --- a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/messenger.properties +++ b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/messenger.properties @@ -318,6 +318,7 @@ preberaniu veľkých správ. # accountCentral mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xul + # LOCALIZATION NOTE(acctCentralTitleFormat): %1$S is brand, %2$S is account type, %3$S is account name acctCentralTitleFormat=%2$S %1$S - %3$S mailAcctType=Pošta @@ -465,11 +466,15 @@ macBiffNotification_separator=,\u0020 # For the Quota tab in the mail folder properties dialog quotaUsedFree=Využitých %S z %S + +# For the Quota tab in the mail folder properties dialog quotaPercentUsed=Zaplnené: %S%% # for quota in main window (commandglue.js) percent=%S%% quotaTooltip=Kvóta pre IMAP: využitých %S kB z celkovo %S kB. Kliknutím získate ďalšie informácie +quotaTooltip2=Kvóta pre IMAP: využitých %S z celkovo %S. Kliknutím získate ďalšie informácie + # for message views confirmViewDeleteTitle=Potvrdenie odstránenia confirmViewDeleteMessage=Naozaj chcete odstrániť tento pohľad? @@ -805,5 +810,3 @@ errorConsoleTitle = Chybová konzola # This is used by screen readers to label the "back" button in various browser # popup panels, including the sliding subviews of the appmenu. panel.back = Naspäť - -quotaTooltip2=IMAP quota: %S used of %S total. Click for details. diff --git a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/pgpmime.properties b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/pgpmime.properties index 6515ec7b2c70bd97a7c45affe75d6d2e0ad81c2b..9a622146e112a8a4204c7c132cc5af5da49e8111 100644 --- a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/pgpmime.properties +++ b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=Toto je zašifrovaná správa OpenPGP.<br>Ak ju chcete odšifrovať, musíte si nainštalovať <a href="%S">doplnok OpenPGP</a>. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Toto je správa zašifrovaná pomocou OpenPGP, no podpora pre dešifrovanie OpenPGP nie je k dispozícii. diff --git a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/preferences/general.dtd b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/preferences/general.dtd index dd269305e8092c7acb3906f9f05ec96396cb4979..13a5df21038ebef6017388f15f90a5462b4835be 100644 --- a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/preferences/general.dtd +++ b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/preferences/general.dtd @@ -43,5 +43,6 @@ <!ENTITY removeSearchEngine.label "Odstrániť"> <!ENTITY removeSearchEngine.accesskey "i"> -<!ENTITY minimizeToTray.label "When &brandShortName; is minimized, move it to the tray"> <!ENTITY minimizeToTray.accesskey "m"> + +<!ENTITY minimizeToTray.label "When &brandShortName; is minimized, move it to the tray"> diff --git a/thunderbird-l10n/sk/localization/sk/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/sk/localization/sk/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..d14b01959b9b4c00c08621b89f90ac5d9c4dd5d1 --- /dev/null +++ b/thunderbird-l10n/sk/localization/sk/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Presmerovanie URI kalendára +calendar-uri-redirect-description = + Server presmerováva URI pre kalendár „{ $calendarName }“. + Chcete prijať presmerovanie a začať používať nové URI pre tento kalendár? +calendar-uri-redirect-original-uri-label = Súčasné URI: +calendar-uri-redirect-target-uri-label = Presmerovanie na nové URI: diff --git a/thunderbird-l10n/sk/localization/sk/calendar/calendar-widgets.ftl b/thunderbird-l10n/sk/localization/sk/calendar/calendar-widgets.ftl new file mode 100644 index 0000000000000000000000000000000000000000..90caf9765dd5b39fe966e29df8e7808453343c40 --- /dev/null +++ b/thunderbird-l10n/sk/localization/sk/calendar/calendar-widgets.ftl @@ -0,0 +1,6 @@ +# 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/. + +calendar-deactivated-notification-events = Všetky kalendáre sú v súčasnosti zakázané. Pre pridanie alebo úpravu udalostí povoľte existujúci kalendár alebo pridajte nový. +calendar-deactivated-notification-tasks = Všetky kalendáre sú v súčasnosti zakázané. Pre pridanie alebo úpravu úloh povoľte existujúci kalendár alebo pridajte nový. diff --git a/thunderbird-l10n/sk/localization/sk/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/sk/localization/sk/devtools/client/aboutdebugging.ftl index 601cff3e2022e3ea7ebccbb5f6c306a5fadd6d44..b65ceb2df65985eaa4a605720366976484b3e2b6 100644 --- a/thunderbird-l10n/sk/localization/sk/devtools/client/aboutdebugging.ftl +++ b/thunderbird-l10n/sk/localization/sk/devtools/client/aboutdebugging.ftl @@ -153,6 +153,9 @@ about-debugging-runtime-processes = # target runtime is incompatible with service workers. "Learn more" points to MDN. # https://developer.mozilla.org/en-US/docs/Tools/about%3Adebugging#Service_workers_not_compatible about-debugging-runtime-service-workers-not-compatible = Konfigurácia vášho prehliadača nie je kompatibilná so službou Service Workers. <a>Ďalšie informácie</a> +# Dedicated message for a backward compatibility issue that occurs when connecting: +# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68. +about-debugging-browser-version-too-old-fennec = Táto verzia Firefoxu nemôže ladiť Firefox pre Android (68). Odporúčame vám nainštalovať Firefox pre Android Nightly. <a>Viac podrobností</a> # Displayed for runtime info in runtime pages. # { $name } is brand name such as "Firefox Nightly" # { $version } is version such as "64.0a1" diff --git a/thunderbird-l10n/sk/localization/sk/devtools/client/tooltips.ftl b/thunderbird-l10n/sk/localization/sk/devtools/client/tooltips.ftl index 491131abb8310ec9d9d5d102bf17e46091bd20be..4911c8903bfe25276b2e8b33b22fdd879f942c74 100644 --- a/thunderbird-l10n/sk/localization/sk/devtools/client/tooltips.ftl +++ b/thunderbird-l10n/sk/localization/sk/devtools/client/tooltips.ftl @@ -28,20 +28,24 @@ inactive-css-not-grid-item = <strong>{ $property }</strong> nemá na tento prvok inactive-css-not-grid-container = <strong>{ $property }</strong> nemá na tento prvok žiadny vplyv, pretože nejde o grid kontajner. inactive-css-not-flex-item = <strong>{ $property }</strong> nemá na tento prvok žiadny vplyv, pretože nejde o flex položku. inactive-css-not-flex-container = <strong>{ $property }</strong> nemá na tento prvok žiadny vplyv, pretože nejde o flex kontajner. +inactive-css-not-inline-or-tablecell = <strong>{ $property }</strong> nemá na tento prvok žiadny vplyv, pretože nejde o vložený prvok ani prvok tabuľky. ## In the Rule View when a CSS property cannot be successfully applied we display ## an icon. When this icon is hovered this message is displayed to explain how ## the problem can be solved. inactive-css-not-grid-or-flex-container-fix = Skúste pridať <strong>display:grid</strong> alebo <strong>display:flex</strong>. { learn-more } -inactive-css-not-grid-or-flex-container-or-multicol-container-fix = Skúste pridať <strong>display:grid</strong>, <strong>display:flex</strong> alebo <strong>columns:2</strong>. { learn-more } inactive-css-not-grid-or-flex-item-fix = Skúste pridať <strong>display:grid</strong>, <strong>display:flex</strong>, <strong>display:inline-grid</strong> alebo <strong>display:inline-flex</strong>. { learn-more } inactive-css-not-grid-item-fix = Skúste pridať <strong>display:grid</strong> alebo <strong>display:inline-grid</strong> do nadradenej položky. { learn-more } +inactive-css-not-grid-or-flex-container-or-multicol-container-fix = Skúste pridať <strong>display:grid</strong>, <strong>display:flex</strong> alebo <strong>columns:2</strong>. { learn-more } inactive-css-not-grid-or-flex-item-fix-2 = Skúste pridať <strong>display:grid</strong>, <strong>display:flex</strong>, <strong>display:inline-grid</strong> alebo <strong>display:inline-flex</strong>. { learn-more } +inactive-css-not-grid-item-fix-2 = Skúste pridať <strong>display:grid</strong> alebo <strong>display:inline-grid</strong> do nadradenej položky. { learn-more } inactive-css-not-grid-container-fix = Skúste pridať <strong>display:grid</strong> alebo <strong>display:inline-grid</strong>. { learn-more } inactive-css-not-flex-item-fix = Skúste pridať <strong>display:flex</strong> alebo <strong>display:inline-flex</strong> do nadradenej položky. { learn-more } +inactive-css-not-flex-item-fix-2 = Skúste pridať <strong>display:flex</strong> alebo <strong>display:inline-flex</strong> do nadradenej položky. { learn-more } inactive-css-not-flex-container-fix = Skúste pridať <strong>display:flex</strong> alebo <strong>display:inline-flex</strong>. { learn-more } inactive-css-not-inline-or-tablecell-fix = Skúste pridať <strong>display:inline</strong> alebo <strong>display:table-cell</strong>. { learn-more } inactive-css-non-replaced-inline-or-table-row-or-row-group-fix = Skúste pridať <strong>display:inline-block</strong> alebo <strong>display:block</strong>. { learn-more } inactive-css-non-replaced-inline-or-table-column-or-column-group-fix = Skúste pridať <strong>display:inline-block</strong>. { learn-more } inactive-css-not-display-block-on-floated-fix = Skúste odstrániť <strong>float</strong> alebo pridať <strong>display:block</strong>. { learn-more } +inactive-text-overflow-when-no-overflow-fix = Skúste pridať <strong>overflow:hidden</strong>. { learn-more } diff --git a/thunderbird-l10n/sk/localization/sk/messenger/accountCentral.ftl b/thunderbird-l10n/sk/localization/sk/messenger/accountCentral.ftl index fca3a4b92a22568d671a3962593b942433763832..927a69ff6381ba6b235132aee897a0151d337c5b 100644 --- a/thunderbird-l10n/sk/localization/sk/messenger/accountCentral.ftl +++ b/thunderbird-l10n/sk/localization/sk/messenger/accountCentral.ftl @@ -3,6 +3,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Víta vás { -brand-full-name } +account-settings = Nastavenia účtu about-title = O aplikácii { -brand-full-name } resources-title = Zdroje release-notes = @@ -11,7 +12,14 @@ calendar-label = Kalendár .aria-label = Vytvoriť nový kalendár filelink-label = Filelink .aria-label = Nastaviť Filelink +import-title = Importovať z inej aplikácie +import-label = Importovať + .aria-label = Importovať údaje z iných aplikácii +about-paragraph = Thunderbird je dôležitý open source a multiplatformový e-mailový klient s funkciou kalendára, ktorý je zadarmo pre osobné použitie i pre firmy. Chceme, aby ostal bezpečný a neustále sa zlepšoval. Príspevok nám umožní najať vývojárov, zaplatiť za infraštruktúru a pomôže nám rozvíjať sa. +about-paragraph-2 = <b>Thunderbird je financovaný používateľmi, ako ste vy! Ak máte radi Thunderbird, zvážte poskytnutie príspevku. </b> Najlepším spôsobom, ako zaistiť, že Thunderbird ostane k dispozícii, je +about-donation = poskytnutie príspevku explore-link = Spoznajte funkcie support-link = Podpora involved-link = Zapojte sa developer-link = Dokumentácia pre vývojárov +e2e = End-to-end šifrovanie diff --git a/thunderbird-l10n/sk/localization/sk/messenger/preferences/passwordManager.ftl b/thunderbird-l10n/sk/localization/sk/messenger/preferences/passwordManager.ftl index c3482792fff05c9d2c1402b19116a7f2aef9cc4d..0d2100963ff817551376d55a7cada45b30fb68a2 100644 --- a/thunderbird-l10n/sk/localization/sk/messenger/preferences/passwordManager.ftl +++ b/thunderbird-l10n/sk/localization/sk/messenger/preferences/passwordManager.ftl @@ -68,3 +68,15 @@ remove-all-shown = remove-all-passwords-prompt = Naozaj chcete odstrániť všetky heslá? remove-all-passwords-title = Odstrániť všetky heslá no-master-password-prompt = Naozaj chcete zobraziť svoje heslá? + +## OS Authentication dialog + +# This message can be seen by trying to show or copy the passwords. +password-os-auth-dialog-message = Pre zobrazenie uložených hesiel najprv overte svoju totožnosť. +# This message can be seen by trying to show or copy the passwords. +# The macOS strings are preceded by the operating system with "Thunderbird is trying to " +# and includes subtitle of "Enter password for the user "xxx" to allow this." These +# notes are only valid for English. Please test in your locale. +password-os-auth-dialog-message-macosx = zobraziť uložené heslá +# Don't change this label. +password-os-auth-dialog-caption = { -brand-full-name } diff --git a/thunderbird-l10n/sk/localization/sk/messenger/preferences/preferences.ftl b/thunderbird-l10n/sk/localization/sk/messenger/preferences/preferences.ftl index ab9c84556f14688fe65868a990d30c725b7ffa87..4747053aae309bdd267671227320384b8c351ddd 100644 --- a/thunderbird-l10n/sk/localization/sk/messenger/preferences/preferences.ftl +++ b/thunderbird-l10n/sk/localization/sk/messenger/preferences/preferences.ftl @@ -55,3 +55,15 @@ update-in-progress-ok-button = &Zrušiť # Continue is the cancel button so pressing escape or using a platform standard # method of closing the UI will not discard the update. update-in-progress-cancel-button = &Pokračovať + +## OS Authentication dialog + +# This message can be seen by trying to add a Master Password. +master-password-os-auth-dialog-message = Pre vytvorenie hlavného hesla najprv overte svoju totožnosť. +# This message can be seen by trying to add a Master Password. +# The macOS strings are preceded by the operating system with "Thunderbird is trying to " +# and includes subtitle of "Enter password for the user "xxx" to allow this." These +# notes are only valid for English. Please test in your locale. +master-password-os-auth-dialog-message-macosx = vytvoriť hlavné heslo +# Don't change this label. +master-password-os-auth-dialog-caption = { -brand-full-name } diff --git a/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutAddons.ftl index 6f7c226ea6e6daf305d5a5f2bf29ea3b32ba98fa..43dab3c726c2d73316f770025b1807ef1a687bf3 100644 --- a/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Nainštalovať doplnok zo súboru… .accesskey = N help-button = Podpora doplnkov +sidebar-help-button-title = + .title = Podpora doplnkov preferences = { PLATFORM() -> [windows] Možnosti aplikácie @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Nástroje pre všetky doplnky +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Možnosti aplikácie + *[other] Možnosti aplikácie + } show-unsigned-extensions-button = .label = Niektoré rozšírenia nemohli byť overené show-all-extensions-button = @@ -173,13 +181,29 @@ extensions-view-available-updates = .name = Dostupné aktualizácie .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Odporúčania +addon-category-discover-title = + .title = Odporúčania addon-category-extension = Rozšírenia +addon-category-extension-title = + .title = Rozšírenia addon-category-theme = Témy vzhľadu +addon-category-theme-title = + .title = Témy vzhľadu addon-category-plugin = Zásuvné moduly +addon-category-plugin-title = + .title = Zásuvné moduly addon-category-dictionary = Slovníky +addon-category-dictionary-title = + .title = Slovníky addon-category-locale = Jazyky +addon-category-locale-title = + .title = Jazyky addon-category-available-updates = Dostupné aktualizácie +addon-category-available-updates-title = + .title = Dostupné aktualizácie addon-category-recent-updates = Nedávno aktualizované +addon-category-recent-updates-title = + .title = Nedávno aktualizované ## These are global warnings @@ -292,6 +316,7 @@ shortcuts-no-commands = Nasledujúce rozšírenia nemajú skratky: shortcuts-input = .placeholder = Zadajte klávesovú skratku shortcuts-browserAction = Aktivovať rozšírenie +shortcuts-browserAction2 = Pridať tlačidlo na panel nástrojov shortcuts-pageAction = Aktivovať akciu stránky shortcuts-sidebarAction = Prepnúť zobrazenie bočného panela shortcuts-modifier-mac = Nezabudnite vložiť aj Ctrl, Alt alebo ⌘ @@ -318,6 +343,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Zobraziť menej go-back-button = .tooltiptext = Späť +header-back-button = + .title = Späť ## Recommended add-ons page diff --git a/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutNetworking.ftl b/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutNetworking.ftl index 6af91046ef07cf2bffe80406629f7a2479efbb1e..a9bf107abdfb6ff8d35d92e513fcd2ab8cd2f969 100644 --- a/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutNetworking.ftl +++ b/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutNetworking.ftl @@ -9,6 +9,7 @@ ok = OK http = HTTP sockets = Sockety dns = DNS +dnssuffix = Prípona DNS websockets = WebSockety refresh = Obnoviť auto-refresh = Automaticky obnoviť každé 3 sekundy @@ -19,11 +20,13 @@ about-networking-title = O spojeniach about-networking-http = HTTP about-networking-sockets = Sockety about-networking-dns = DNS +about-networking-dns-suffix = Prípona DNS about-networking-websockets = WebSockety about-networking-refresh = Obnoviť about-networking-auto-refresh = Automaticky obnoviť každé 3 sekundy about-networking-hostname = Názov servera about-networking-port = Port +about-networking-http-version = Verzia HTTP ssl = SSL active = Aktívny idle = Nečinný @@ -115,6 +118,10 @@ about-networking-networkid-id = ID siete ## Link is intended as "network link" +networkid-isUp = Spojenie je aktívne +networkid-statusKnown = Stav spojenia nie je známy +about-networking-networkid-is-up = Spojenie je aktívne +about-networking-networkid-status-known = Stav spojenia je známy ## diff --git a/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutTelemetry.ftl b/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutTelemetry.ftl index 606121a1925bb7c9e3d00d7b6e3536853f8dd207..c73c0b3836c7eaa8da57a0380895260220d5f7c8 100644 --- a/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutTelemetry.ftl +++ b/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutTelemetry.ftl @@ -128,4 +128,9 @@ about-telemetry-category-header = kategória about-telemetry-method-header = metóda about-telemetry-object-header = objekt about-telemetry-extra-header = extra +about-telemetry-origin-section = Origin telemetria +about-telemetry-origin-origin = origin about-telemetry-origin-count = počet +# Variables: +# $process (String): type of process in subsection headers ( e.g. "content", "parent" ) +about-telemetry-process = typ procesu: { $process } diff --git a/thunderbird-l10n/sk/localization/sk/toolkit/about/certviewer.ftl b/thunderbird-l10n/sk/localization/sk/toolkit/about/certviewer.ftl index 105a0d78dfad3af69bea9fc888c30a6654208ba2..7ee887d69b0bed8a545e598faf7a8f5d2400ba54 100644 --- a/thunderbird-l10n/sk/localization/sk/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/sk/localization/sk/toolkit/about/certviewer.ftl @@ -95,3 +95,12 @@ certificate-viewer-download-pem = PEM (certifikát) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (reťazec) .download = { $fileName }-chain.pem +certificate-viewer-export = Exportovať + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Vaše certifikáty +certificate-viewer-tab-people = Ľudia +certificate-viewer-tab-servers = Servery +certificate-viewer-tab-ca = Autority diff --git a/thunderbird-l10n/sk/localization/sk/toolkit/global/processTypes.ftl b/thunderbird-l10n/sk/localization/sk/toolkit/global/processTypes.ftl index 016a550185bff83a404d724bd2b04308b1e38236..ba81e90b6859f8a1ccc56ee9e8d1f846157d9549 100644 --- a/thunderbird-l10n/sk/localization/sk/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/sk/localization/sk/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Izolovaný webový obsah # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/sk/localization/sk/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/sk/localization/sk/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..5193490661d3fd6d18564b3268a88403a75fb81a --- /dev/null +++ b/thunderbird-l10n/sk/localization/sk/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Spustili ste staršiu verziu { -brand-product-name }u + .style = width: 490px; +profiledowngrade-window-create = + .label = Vytvoriť nový profil +profiledowngrade-sync = Používaním staršej verzie { -brand-product-name }u môžete poškodiť záložky a históriu prehliadania, ktoré sú uložené vo vašom existujúcom profile. Aby ste svoje údaje ochránili, vytvorte si nový profil pre túto verziu aplikácie { -brand-short-name }. Pomocou účtu { -brand-product-name } sa vždy môžete prihlásiť a zosynchronizovať svoje záložky a históriu prehliadania s ostatnými profilmi. +profiledowngrade-nosync = Používaním staršej verzie { -brand-product-name }u môžete poškodiť záložky a históriu prehliadania, ktoré sú uložené vo vašom existujúcom profile. Aby ste svoje údaje ochránili, vytvorte si nový profil pre túto verziu aplikácie { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Ukončiť + *[other] Ukončiť + } diff --git a/thunderbird-l10n/sk/manifest.json b/thunderbird-l10n/sk/manifest.json index 144af7b8d2cdb3f2274c4199f6c4e729fa7e589b..76fe488ae91b5919899b38ae1199fd86eac1c547 100644 --- a/thunderbird-l10n/sk/manifest.json +++ b/thunderbird-l10n/sk/manifest.json @@ -1,57 +1,57 @@ { - "version": "76.0buildid20200407173003", - "langpack_id": "sk", - "description": "Language pack for Thunderbird for sk", "sources": { "browser": { "base_path": "browser/" } }, + "applications": { + "gecko": { + "strict_min_version": "76.0", + "id": "langpack-sk@thunderbird.mozilla.org", + "strict_max_version": "76.*" + } + }, + "manifest_version": 2, + "name": "Slovak (SK) Language Pack", + "author": "Mozilla.sk (contributors: Team Mozilla.sk)", + "description": "Language pack for Thunderbird for sk", "languages": { "sk": { "chrome_resources": { - "communicator": "chrome/sk/locale/sk/communicator/", - "pipnss": "chrome/sk/locale/sk/pipnss/", - "messenger-region": "chrome/sk/locale/sk/messenger-region/", - "lightning": "chrome/sk/locale/sk/lightning/", - "mozapps": "chrome/sk/locale/sk/mozapps/", - "pluginproblem": "chrome/sk/locale/sk/pluginproblem/", - "places": "chrome/sk/locale/sk/places/", - "messenger-newsblog": "chrome/sk/locale/sk/messenger-newsblog/", - "branding": "chrome/sk/locale/sk/branding/", + "messenger-mapi": "chrome/sk/locale/sk/messenger-mapi/", "pippki": "chrome/sk/locale/sk/pippki/", - "global": "chrome/sk/locale/sk/global/", - "messenger": "chrome/sk/locale/sk/messenger/", + "branding": "chrome/sk/locale/sk/branding/", "messenger-smime": "chrome/sk/locale/sk/messenger-smime/", - "chat": "chrome/sk/locale/sk/chat/", - "devtools-shared": "chrome/sk/locale/sk/devtools/shared/", "global-platform": { "win": "chrome/sk/locale/sk/global-platform/win/", - "android": "chrome/sk/locale/sk/global-platform/unix/", "linux": "chrome/sk/locale/sk/global-platform/unix/", - "macosx": "chrome/sk/locale/sk/global-platform/mac/" + "macosx": "chrome/sk/locale/sk/global-platform/mac/", + "android": "chrome/sk/locale/sk/global-platform/unix/" }, + "global": "chrome/sk/locale/sk/global/", + "chat": "chrome/sk/locale/sk/chat/", "passwordmgr": "chrome/sk/locale/sk/passwordmgr/", + "lightning": "chrome/sk/locale/sk/lightning/", + "devtools-startup": "chrome/sk/locale/sk/devtools/startup/", + "mozapps": "chrome/sk/locale/sk/mozapps/", + "messenger-region": "chrome/sk/locale/sk/messenger-region/", + "messenger": "chrome/sk/locale/sk/messenger/", "alerts": "chrome/sk/locale/sk/alerts/", - "autoconfig": "chrome/sk/locale/sk/autoconfig/", - "messenger-mapi": "chrome/sk/locale/sk/messenger-mapi/", - "necko": "chrome/sk/locale/sk/necko/", + "devtools-shared": "chrome/sk/locale/sk/devtools/shared/", + "pluginproblem": "chrome/sk/locale/sk/pluginproblem/", "devtools": "chrome/sk/locale/sk/devtools/client/", + "calendar": "chrome/sk/locale/sk/calendar/", + "communicator": "chrome/sk/locale/sk/communicator/", + "places": "chrome/sk/locale/sk/places/", + "pipnss": "chrome/sk/locale/sk/pipnss/", + "necko": "chrome/sk/locale/sk/necko/", "mozldap": "chrome/sk/locale/sk/mozldap/", - "devtools-startup": "chrome/sk/locale/sk/devtools/startup/", - "calendar": "chrome/sk/locale/sk/calendar/" + "autoconfig": "chrome/sk/locale/sk/autoconfig/", + "messenger-newsblog": "chrome/sk/locale/sk/messenger-newsblog/" }, - "version": "20200404140740" + "version": "20200418170704" } }, - "manifest_version": 2, - "author": "Mozilla.sk (contributors: Team Mozilla.sk)", - "name": "Slovak (SK) Language Pack", - "applications": { - "gecko": { - "strict_min_version": "76.0", - "strict_max_version": "76.*", - "id": "langpack-sk@thunderbird.mozilla.org" - } - } + "langpack_id": "sk", + "version": "76.0buildid20200420212409" } diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/calendar/preferences/general.dtd b/thunderbird-l10n/sl/chrome/sl/locale/sl/calendar/preferences/general.dtd index 5cdfacadc33122c2c764f0edb6fb06a51594de0d..b643775ef097af92143e46a45a5b90b73afd9c9f 100644 --- a/thunderbird-l10n/sl/chrome/sl/locale/sl/calendar/preferences/general.dtd +++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/calendar/preferences/general.dtd @@ -16,7 +16,7 @@ <!ENTITY pref.timezones.caption "Časovni pas"> <!ENTITY pref.timezones.label "Izberite najbližje mesto v svojem časovnem pasu:"> -<!ENTITY pref.timezones.accesskey "z"> +<!ENTITY pref.timezones.accesskey "s"> <!ENTITY pref.defaults.label "Privzete vrednosti za nove predmete"> <!ENTITY pref.events.label "Dogodki"> diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/global-platform/mac/accessible.properties b/thunderbird-l10n/sl/chrome/sl/locale/sl/global-platform/mac/accessible.properties index 4e05532b9c6a887937003d986fa692a2f054749e..4fa46bb31772710c85a187590ac9bfc944909ef8 100644 --- a/thunderbird-l10n/sl/chrome/sl/locale/sl/global-platform/mac/accessible.properties +++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/global-platform/mac/accessible.properties @@ -58,8 +58,7 @@ separator = razmejevalec tabPanel = plošča z zavihki # The roleDescription for the html:mark element highlight = označi - # The roleDescription for the details element -details = details +details = podrobnosti # The roleDescription for the summary element -summary = summary +summary = povzetek diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/addons.properties b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/addons.properties index 81682742abeebcc0f21a063eabce1502f74aaa2a..4e61846ea01f75c3fc2cd637d9d4603e7eb63c92 100644 --- a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/addons.properties +++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/addons.properties @@ -198,6 +198,7 @@ webextPerms.description.downloads=prenašanje datotek ter branje in spreminjanje webextPerms.description.downloads.open=odpiranje datotek, prenesenih na vaš računalnik # LOCALIZATION NOTE (webextPerms.description.experiment) # %S will be replaced with the name of the application +webextPerms.description.experiment=popoln, neomejen dostop do %Sa in vašega računalnika webextPerms.description.find=branje besedila vseh odprtih zavihkov webextPerms.description.geolocation=dostop do vaše lokacije webextPerms.description.history=dostop do zgodovine brskanja @@ -262,7 +263,3 @@ webext.remove.confirmation.title=Odstrani %S # %2$S is brandShorterName webext.remove.confirmation.message=Odstrani %1$S iz %2$Sa? webext.remove.confirmation.button=Odstrani - -# LOCALIZATION NOTE (webextPerms.description.experiment) -# %S will be replaced with the name of the application -webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/am-smime.dtd b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/am-smime.dtd index 680b3bcae95441cc111c22ba025e6706a66eda58..d35b75fd6fe416ce63654b240916a092aac3c128 100644 --- a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/am-smime.dtd +++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/am-smime.dtd @@ -54,6 +54,7 @@ <!ENTITY openpgpKeys.label "OpenPGP"> +<!ENTITY manageKeys.label "Upravljaj ključe OpenPGP"> <!-- Strings for the cert picker dialog --> <!ENTITY certPicker.title "Izberite potrdilo"> @@ -74,5 +75,4 @@ <!ENTITY manageDevices2.accesskey "y"> <!ENTITY technologySMIME.label "Prefer S/MIME"> <!ENTITY technologyOpenPGP.label "Prefer OpenPGP"> -<!ENTITY manageKeys.label "Manage OpenPGP Keys"> <!ENTITY manageKeys.accesskey "K"> diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/imapMsgs.properties b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/imapMsgs.properties index d696295b0d97efe7e1eb62396e7ef63180a06321..e78be47e2affb3639cc12564031fe1035fce2211 100644 --- a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/imapMsgs.properties +++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/imapMsgs.properties @@ -199,12 +199,21 @@ imapSubscribePrompt=Bi se radi naročili na %1$S? imapServerDroppedConnection=Povezava z vašim strežnikom IMAP ni mogoča. Morda ste presegli največje dovoljeno število povezav na ta strežnik. V tem primeru uporabite pogovorno okno za napredne nastavitve strežnika IMAP in znižajte število povezav v predpomnilniku. +# This will occur when a folder that has never been imap selected or opened +# (left-clicked) is first right-clicked to access quota properties. imapQuotaStatusFolderNotOpen=Podatek o količinski omejitvi ni na razpolago, ker mapa ni odprta. +# The imap capability response reports that QUOTA is not supported. imapQuotaStatusNotSupported=Ta strežnik ne podpira količinskih omejitev. imapQuotaStatusNoQuota=V tej mapi ni količinskih omejitev za shrambo. +# The getqutaroot command succeeded but reported no quota information. + +# Folder properties were requested by the user (right-click) before the getquotaroot +# command was sent. +imapQuotaStatusInProgress=Podatki o količinski omejitvi še niso na voljo. + # Out of memory imapOutOfMemory=Programu je zmanjkalo pomnilnika. @@ -259,6 +268,3 @@ imapServerAlert=Račun %1$S opozarja: %2$S # The getqutaroot command succeeded but reported no quota information. imapQuotaStatusNoQuota2=This folder reports no quota information. -# Folder properties were requested by the user (right-click) before the getquotaroot -# command was sent. -imapQuotaStatusInProgress=Quota information not yet available. diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/messenger.dtd b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/messenger.dtd index d609f9b7a556f7526471a429d9d9b5eeff865e82..3a67dd5d531063639f9600233aa170d2628d2972 100644 --- a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/messenger.dtd +++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/messenger.dtd @@ -289,6 +289,7 @@ <!ENTITY searchMailCmd.label "Išči po sporočilih …"> <!ENTITY searchMailCmd.accesskey "s"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Splošno iskanje …"> <!ENTITY searchAddressesCmd.label "Išči po naslovih …"> <!ENTITY searchAddressesCmd.accesskey "n"> diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/messenger.properties b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/messenger.properties index 319b228875d8bd5c3258b1791a1d909f1257b630..0bda7a1ed98057e778b7ad07007ded340fc5eea4 100644 --- a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/messenger.properties +++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/messenger.properties @@ -311,6 +311,7 @@ nocachedbodybody2=Telo tega sporočila ni bilo naloženo iz strežnika, tako da # accountCentral mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xul + # LOCALIZATION NOTE(acctCentralTitleFormat): %1$S is brand, %2$S is account type, %3$S is account name acctCentralTitleFormat=%1$S %2$S - %3$S mailAcctType=Pošta @@ -458,11 +459,15 @@ macBiffNotification_separator=,\u0020 # For the Quota tab in the mail folder properties dialog quotaUsedFree=uporabljeno %S od %S kB + +# For the Quota tab in the mail folder properties dialog quotaPercentUsed=Zasedenost: %S%% # for quota in main window (commandglue.js) percent=%S%% quotaTooltip=Količinska omejitev IMAP: porabljeno %S kB od skupno %S kB. Kliknite za podrobnosti. +quotaTooltip2=Količinska omejitev IMAP: porabljeno %S od skupno %S. Kliknite za podrobnosti. + # for message views confirmViewDeleteTitle=Potrdi confirmViewDeleteMessage=Ali res želite izbrisati ta pogled? @@ -798,5 +803,3 @@ errorConsoleTitle = Konzola napak # This is used by screen readers to label the "back" button in various browser # popup panels, including the sliding subviews of the appmenu. panel.back = Nazaj - -quotaTooltip2=IMAP quota: %S used of %S total. Click for details. diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/pgpmime.properties b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/pgpmime.properties index d0688be7767a247bfbb5b131dc96f570023648e6..f1141bc88baea22851c0e784804df87bfaff518c 100644 --- a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/pgpmime.properties +++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=To sporočilo je šifrirano z OpenPGP.<br>Za dešifriranje te pošte morate namestiti <a href="%S">dodatek Enigmail</a>. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=To sporočilo je šifrirano z OpenPGP, vendar podpora za dešifriranje OpenPGP ni na voljo. diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/preferences/chat.dtd b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/preferences/chat.dtd index 9a1711549122a68ac50948f428e96357a8583670..474b17316056de1ad1d65081f5e94b0dbdb68ed1 100644 --- a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/preferences/chat.dtd +++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/preferences/chat.dtd @@ -51,7 +51,7 @@ sentence. --> <!ENTITY messageStyleTheme.label "Tema:"> <!ENTITY messageStyleTheme.accesskey "T"> <!ENTITY messageStyleThunderbirdTheme.label "Thunderbird"> -<!ENTITY messageStyleBubblesTheme.label "Mehurčki"> +<!ENTITY messageStyleBubblesTheme.label "Oblački"> <!ENTITY messageStyleDarkTheme.label "Temno"> <!ENTITY messageStylePaperSheetsTheme.label "Listi papirja"> <!ENTITY messageStyleSimpleTheme.label "Preprosto"> diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/preferences/general.dtd b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/preferences/general.dtd index 371240379a4debf6772e81dd3218186c5455aafb..4bf327d9893ea6c41cd1fb85c100558abf98a438 100644 --- a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/preferences/general.dtd +++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/preferences/general.dtd @@ -43,5 +43,5 @@ <!ENTITY removeSearchEngine.label "Odstrani"> <!ENTITY removeSearchEngine.accesskey "s"> -<!ENTITY minimizeToTray.label "When &brandShortName; is minimized, move it to the tray"> +<!ENTITY minimizeToTray.label "Ob pomanjšanju premakni &brandShortName; v pladenj opravilne vrstice"> <!ENTITY minimizeToTray.accesskey "m"> diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/necko/necko.properties b/thunderbird-l10n/sl/chrome/sl/locale/sl/necko/necko.properties index f6dac14f88d2210210690322e9fb9a2d7a90e40d..87451aaaf332276323cfea01287c4439143cf272 100644 --- a/thunderbird-l10n/sl/chrome/sl/locale/sl/necko/necko.properties +++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/necko/necko.properties @@ -57,22 +57,21 @@ CookieAllowedForOriginOnTrackerByHeuristic=Dostop do shrambe samodejno odobren # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Dostop do shrambe samodejno odobren sledilcu “%2$S” na “%1$S”. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". +CookieRejectedNonRequiresSecure=Piškotek “%1$S” je zavrnjen, ker ima atribut “sameSite=none”, vendar manjka atribut “secure”. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". +CookieRejectedNonRequiresSecureForBeta=Piškotek “%1$S” bo kmalu zavrnjen, ker ima atribut “sameSite” nastavljen na “none” ali neveljavno vrednost brez atributa “secure”. Za več informacij o atributu “sameSite“ glejte %2$S # LOCALIZATION NOTE(CookieLaxForced): %1$S is the cookie name. Do not localize "sameSite", "lax" and "sameSite=lax". +CookieLaxForced=Piškotek “%1$S” ima pravilnik “sameSite” nastavljen na “lax”, ker manjka atribut “sameSite”, “sameSite=lax” pa je njegova privzeta vrednost. # LOCALIZATION NOTE(CookieLaxForcedForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "lax" and "sameSite=lax", "sameSite=none". # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none" CookieSameSiteValueInvalid=Neveljavna vrednost “sameSite“ za piškotek “%1$S”. Podprte vrednosti so : “lax“, “strict“, “none“. +# LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. +CookieOversize=Piškotek “%1$S” je neveljaven, ker je njegova velikost prevelika. Največja velikost je %2$S B. +# LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. +CookiePathOversize=Piškotek “%1$S” je neveljaven, ker je velikost njegove poti prevelika. Največja velikost je %2$S B. -# LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". -CookieRejectedNonRequiresSecure=Cookie “%1$S” rejected because it has the “sameSite=none” attribute but is missing the “secure” attribute. -# LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". -CookieRejectedNonRequiresSecureForBeta=Cookie “%1$S” will be soon rejected because it has the “sameSite” attribute set to “none” or an invalid value, without the “secure” attribute. To know more about the “sameSite“ attribute, read %2$S -# LOCALIZATION NOTE(CookieLaxForced): %1$S is the cookie name. Do not localize "sameSite", "lax" and "sameSite=lax". -CookieLaxForced=Cookie “%1$S” has “sameSite” policy set to “lax” because it is missing a “sameSite” attribute, and “sameSite=lax” is the default value for this attribute. # LOCALIZATION NOTE(CookieLaxForcedForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "lax" and "sameSite=lax", "sameSite=none". CookieLaxForcedForBeta=Cookie “%1$S” does not have a proper “sameSite” attribute value. Soon, cookies without the “sameSite” attribute or with an invalid value will be treated as “lax”. This means that the cookie will no longer be sent in third-party contexts. If your application depends on this cookie being available in such contexts, please add the “sameSite=none“ attribute to it. To know more about the “sameSite“ attribute, read %2$S -# LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookieOversize=Cookie “%1$S” is invalid because its size is too big. Max size is %2$S B. -# LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes. -CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B. diff --git a/thunderbird-l10n/sl/localization/sl/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/sl/localization/sl/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..71bc3cb9cff0357e2edc10eb02892b6f814d4b79 --- /dev/null +++ b/thunderbird-l10n/sl/localization/sl/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,6 @@ +# 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/. + +calendar-uri-redirect-original-uri-label = Trenutni URI: +calendar-uri-redirect-target-uri-label = Preusmerjanje na novi URI: diff --git a/thunderbird-l10n/sl/localization/sl/calendar/calendar-widgets.ftl b/thunderbird-l10n/sl/localization/sl/calendar/calendar-widgets.ftl new file mode 100644 index 0000000000000000000000000000000000000000..d27dd3e86bfebb80e7eea56bded61d1b4b5468c7 --- /dev/null +++ b/thunderbird-l10n/sl/localization/sl/calendar/calendar-widgets.ftl @@ -0,0 +1,6 @@ +# 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/. + +calendar-deactivated-notification-events = Vsi koledarji so trenutno onemogočeni. Za ustvarjanje in urejanje dogodkov omogočite obstoječi koledar ali dodajte novega. +calendar-deactivated-notification-tasks = Vsi koledarji so trenutno onemogočeni. Za ustvarjanje in urejanje opravil omogočite obstoječi koledar ali dodajte novega. diff --git a/thunderbird-l10n/sl/localization/sl/messenger/accountCentral.ftl b/thunderbird-l10n/sl/localization/sl/messenger/accountCentral.ftl index 418414f8b5fb551ba7f8d66a287239207e0b43a2..4f29daf81ec57afc00ae8f88938908b0f538d2b4 100644 --- a/thunderbird-l10n/sl/localization/sl/messenger/accountCentral.ftl +++ b/thunderbird-l10n/sl/localization/sl/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Dobrodošli v { -brand-full-name } +account-settings = Nastavitve računa +# $accounts (Number) - the number of configured accounts setup-title = Izberite, kaj nastaviti about-title = O { -brand-full-name }u resources-title = Viri @@ -10,6 +12,17 @@ release-notes = .title = O { -brand-full-name }u email-label = E-pošta .aria-label = Poveži z obstoječim e-poštnim računom +calendar-label = Koledar + .aria-label = Ustvari nov koledar +chat-label = Klepet + .aria-label = Poveži račun za klepet +filelink-label = Filelink + .aria-label = Nastavi Filelink +addressbook-label = Imenik + .aria-label = Ustvari nov imenik +import-title = Uvozi iz drugega programa +import-label = Uvozi + .aria-label = Uvozi podatke iz drugih programov about-paragraph = Thunderbird je vodilni odprtokodni odjemalec za e-pošto in koledar, ki deluje v več okoljih ter je brezplačen tako za poslovno kot za osebno uporabo. Želimo, da ostane varen in postane še boljši. Donacija nam bo omogočala najeti razvijalce, plačati stroške infrastrukture in nadaljevati izboljševanje. explore-link = Raziščite možnosti support-link = Podpora diff --git a/thunderbird-l10n/sl/localization/sl/messenger/preferences/passwordManager.ftl b/thunderbird-l10n/sl/localization/sl/messenger/preferences/passwordManager.ftl index 2e2a70acc667af94890157cc8778871d95a2a80a..0fa47a2023f3a7a20b0bf6ee8a91f58de3fa9fbc 100644 --- a/thunderbird-l10n/sl/localization/sl/messenger/preferences/passwordManager.ftl +++ b/thunderbird-l10n/sl/localization/sl/messenger/preferences/passwordManager.ftl @@ -71,5 +71,7 @@ no-master-password-prompt = Ali ste prepričani, da želite pokazati svoja gesla ## OS Authentication dialog +# This message can be seen by trying to show or copy the passwords. +password-os-auth-dialog-message = Potrdite svojo identiteto za prikaz shranjenih gesel. # Don't change this label. password-os-auth-dialog-caption = { -brand-full-name } diff --git a/thunderbird-l10n/sl/localization/sl/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/sl/localization/sl/toolkit/about/aboutAddons.ftl index 669e07382542aab90b219facdf72d1bf7540f463..5dd50862c701e9f7138033f6cdf68cb747270715 100644 --- a/thunderbird-l10n/sl/localization/sl/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/sl/localization/sl/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Namesti dodatek iz datoteke … .accesskey = I help-button = Podpora za dodatke +sidebar-help-button-title = + .title = Podpora za dodatke preferences = { PLATFORM() -> [windows] Možnosti { -brand-short-name }a @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Orodja za vse dodatke +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Možnosti { -brand-short-name }a + *[other] Nastavitve { -brand-short-name }a + } show-unsigned-extensions-button = .label = Nekaterih razširitev ni bilo mogoče potrditi show-all-extensions-button = @@ -169,13 +177,29 @@ extensions-view-available-updates = .name = Nove posodobitve .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Priporočila +addon-category-discover-title = + .title = Priporočila addon-category-extension = Razširitve +addon-category-extension-title = + .title = Razširitve addon-category-theme = Teme +addon-category-theme-title = + .title = Teme addon-category-plugin = Vtičniki +addon-category-plugin-title = + .title = Vtičniki addon-category-dictionary = Slovarji +addon-category-dictionary-title = + .title = Slovarji addon-category-locale = Jeziki +addon-category-locale-title = + .title = Jeziki addon-category-available-updates = Nove posodobitve +addon-category-available-updates-title = + .title = Nove posodobitve addon-category-recent-updates = Nedavne posodobitve +addon-category-recent-updates-title = + .title = Nedavne posodobitve ## These are global warnings @@ -288,6 +312,7 @@ shortcuts-no-commands = Naslednje razširitve nimajo dodeljenih bližnjic: shortcuts-input = .placeholder = Vnesite bližnjico shortcuts-browserAction = Aktiviraj razširitev +shortcuts-browserAction2 = Aktiviraj gumb orodne vrstice shortcuts-pageAction = Aktiviraj dejanje strani shortcuts-sidebarAction = Preklopi stransko vrstico shortcuts-modifier-mac = Vključi Ctrl, Alt ali ⌘ @@ -315,6 +340,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Prikaži manj go-back-button = .tooltiptext = Nazaj +header-back-button = + .title = Nazaj ## Recommended add-ons page diff --git a/thunderbird-l10n/sl/localization/sl/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/sl/localization/sl/toolkit/about/aboutSupport.ftl index bbbe0760975f535b6b92b735d82e077050c085e8..40054f67e2cb1b3c55fff11b2dad57a303a05e81 100644 --- a/thunderbird-l10n/sl/localization/sl/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/sl/localization/sl/toolkit/about/aboutSupport.ftl @@ -300,6 +300,11 @@ sandbox-proc-type-content = vsebina sandbox-proc-type-file = vsebina datoteke sandbox-proc-type-media-plugin = večpredstavni vtičnik sandbox-proc-type-data-decoder = podatkovni dekodirnik +startup-cache-title = Predpomnilnik zagona +startup-cache-disk-cache-path = Pot predpomnilnika diska +startup-cache-ignore-disk-cache = Prezri predpomnilnik diska +startup-cache-found-disk-cache-on-init = Najden predpomnilnik diska ob inicializaciji +startup-cache-wrote-to-disk-cache = Zapisano v predpomnilnik diska launcher-process-status-0 = Omogočeno launcher-process-status-1 = Onemogočeno zaradi napake launcher-process-status-2 = Prisilno onemogočeno @@ -323,6 +328,7 @@ touch-enabled = vnos na dotik omogočen drag-enabled = vlečenje drsnika omogočeno keyboard-enabled = tipkovnica omogočena autoscroll-enabled = samodrsenje omogočeno +zooming-enabled = omogočeno gladko povečanje s približevanjem prstov ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/sl/localization/sl/toolkit/about/certviewer.ftl b/thunderbird-l10n/sl/localization/sl/toolkit/about/certviewer.ftl index cc6fd10fa5adcac9a4c98bfc24a16ccb3d403d64..48a5ff627ff1ea06e5c96c4771eefb3597fd17ef 100644 --- a/thunderbird-l10n/sl/localization/sl/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/sl/localization/sl/toolkit/about/certviewer.ftl @@ -29,6 +29,8 @@ certificate-viewer-id = ID certificate-viewer-key-exchange-group = Skupina izmenjave ključev certificate-viewer-key-id = ID ključa certificate-viewer-key-size = Velikost ključa +# Inc. means Incorporated, e.g GitHub is incorporated in Delaware +certificate-viewer-inc-locality = Kraj registracije certificate-viewer-locality = Kraj certificate-viewer-location = Lokacija certificate-viewer-logid = ID dnevnika @@ -48,7 +50,7 @@ certificate-viewer-qualifiers = Kvalifikatorji certificate-viewer-required = Zahtevano certificate-viewer-unsupported = <nepodprto> # Inc. means Incorporated, e.g GitHub is incorporated in Delaware -certificate-viewer-inc-state-province = Država/območje +certificate-viewer-inc-state-province = Država/območje registracije certificate-viewer-state-province = Država/območje certificate-viewer-sha-1 = SHA-1 certificate-viewer-sha-256 = SHA-256 @@ -95,3 +97,16 @@ certificate-viewer-download-pem = PEM (potrdilo) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (veriga) .download = { $fileName }-veriga.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Ta razširitev je bila označena kot kritična, kar pomeni, da morajo uporabniki zavrniti potrdilo, če ga ne razumejo. +certificate-viewer-export = Izvozi + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Vaša digitalna potrdila +certificate-viewer-tab-people = Ljudje +certificate-viewer-tab-servers = Strežniki +certificate-viewer-tab-ca = Overitelji +certificate-viewer-tab-unkonwn = Neznano diff --git a/thunderbird-l10n/sl/localization/sl/toolkit/global/processTypes.ftl b/thunderbird-l10n/sl/localization/sl/toolkit/global/processTypes.ftl index 082530f809de859e844b01e1654d5fe06396d182..ee6117b6257d100aa876d106f68e112407987f4d 100644 --- a/thunderbird-l10n/sl/localization/sl/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/sl/localization/sl/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Ločena spletna vsebina # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPE +# process used to perform network operations +process-type-socket = Vtičnica diff --git a/thunderbird-l10n/sl/localization/sl/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/sl/localization/sl/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..a20ffe35dd6a6de3f78b14eab174257f90bea9e5 --- /dev/null +++ b/thunderbird-l10n/sl/localization/sl/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Zagnali ste starejšo različico { -brand-product-name }a + .style = width: 490px; +profiledowngrade-window-create = + .label = Ustvari nov profil +profiledowngrade-sync = Uporaba starejše različice { -brand-product-name }a lahko pokvari zgodovino brskanja in zaznamke, ki so že shranjeni v obstoječem { -brand-product-name }ovem profilu. Za zaščito svojih podatkov ustvarite nov profil za to namestitev { -brand-short-name }a. Svoje podatke lahko ohranite usklajene v vseh profilih s pomočjo { -fxaccount-brand-name }a. +profiledowngrade-nosync = Uporaba starejše različice { -brand-product-name }a lahko pokvari zgodovino brskanja in zaznamke, ki so že shranjeni v obstoječem { -brand-product-name }ovem profilu. Za zaščito svojih podatkov ustvarite nov profil za to namestitev { -brand-short-name }a. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Izhod + *[other] Izhod + } diff --git a/thunderbird-l10n/sl/manifest.json b/thunderbird-l10n/sl/manifest.json index 0ea2dc5a754ce0e8d939c6dcf7604bff4a00d75b..0c588667479c2d0eb4e77bd6569ed8428ae6fc0d 100644 --- a/thunderbird-l10n/sl/manifest.json +++ b/thunderbird-l10n/sl/manifest.json @@ -1,57 +1,57 @@ { - "langpack_id": "sl", - "author": "mozilla.org (contributors: Peter Klofutar, Vito Smolej)", - "name": "Slovenski jezik Language Pack", - "version": "76.0buildid20200407173003", - "description": "Language pack for Thunderbird for sl", - "applications": { - "gecko": { - "id": "langpack-sl@thunderbird.mozilla.org", - "strict_max_version": "76.*", - "strict_min_version": "76.0" - } - }, + "manifest_version": 2, "sources": { "browser": { "base_path": "browser/" } }, + "langpack_id": "sl", + "author": "mozilla.org (contributors: Peter Klofutar, Vito Smolej)", "languages": { "sl": { "chrome_resources": { - "mozapps": "chrome/sl/locale/sl/mozapps/", - "branding": "chrome/sl/locale/sl/branding/", - "places": "chrome/sl/locale/sl/places/", + "devtools": "chrome/sl/locale/sl/devtools/client/", + "necko": "chrome/sl/locale/sl/necko/", + "alerts": "chrome/sl/locale/sl/alerts/", + "messenger": "chrome/sl/locale/sl/messenger/", "messenger-newsblog": "chrome/sl/locale/sl/messenger-newsblog/", + "lightning": "chrome/sl/locale/sl/lightning/", + "devtools-startup": "chrome/sl/locale/sl/devtools/startup/", + "mozapps": "chrome/sl/locale/sl/mozapps/", + "communicator": "chrome/sl/locale/sl/communicator/", + "pipnss": "chrome/sl/locale/sl/pipnss/", "global-platform": { "android": "chrome/sl/locale/sl/global-platform/unix/", - "macosx": "chrome/sl/locale/sl/global-platform/mac/", + "win": "chrome/sl/locale/sl/global-platform/win/", "linux": "chrome/sl/locale/sl/global-platform/unix/", - "win": "chrome/sl/locale/sl/global-platform/win/" + "macosx": "chrome/sl/locale/sl/global-platform/mac/" }, - "communicator": "chrome/sl/locale/sl/communicator/", - "alerts": "chrome/sl/locale/sl/alerts/", - "necko": "chrome/sl/locale/sl/necko/", - "calendar": "chrome/sl/locale/sl/calendar/", - "chat": "chrome/sl/locale/sl/chat/", - "pluginproblem": "chrome/sl/locale/sl/pluginproblem/", - "global": "chrome/sl/locale/sl/global/", - "messenger": "chrome/sl/locale/sl/messenger/", - "passwordmgr": "chrome/sl/locale/sl/passwordmgr/", - "mozldap": "chrome/sl/locale/sl/mozldap/", + "messenger-smime": "chrome/sl/locale/sl/messenger-smime/", + "branding": "chrome/sl/locale/sl/branding/", + "messenger-mapi": "chrome/sl/locale/sl/messenger-mapi/", "devtools-shared": "chrome/sl/locale/sl/devtools/shared/", + "passwordmgr": "chrome/sl/locale/sl/passwordmgr/", + "autoconfig": "chrome/sl/locale/sl/autoconfig/", "pippki": "chrome/sl/locale/sl/pippki/", + "chat": "chrome/sl/locale/sl/chat/", + "places": "chrome/sl/locale/sl/places/", + "calendar": "chrome/sl/locale/sl/calendar/", "messenger-region": "chrome/sl/locale/sl/messenger-region/", - "messenger-mapi": "chrome/sl/locale/sl/messenger-mapi/", - "pipnss": "chrome/sl/locale/sl/pipnss/", - "messenger-smime": "chrome/sl/locale/sl/messenger-smime/", - "devtools-startup": "chrome/sl/locale/sl/devtools/startup/", - "devtools": "chrome/sl/locale/sl/devtools/client/", - "autoconfig": "chrome/sl/locale/sl/autoconfig/", - "lightning": "chrome/sl/locale/sl/lightning/" + "mozldap": "chrome/sl/locale/sl/mozldap/", + "pluginproblem": "chrome/sl/locale/sl/pluginproblem/", + "global": "chrome/sl/locale/sl/global/" }, - "version": "20200404140654" + "version": "20200420100552" + } + }, + "description": "Language pack for Thunderbird for sl", + "name": "Slovenski jezik Language Pack", + "applications": { + "gecko": { + "strict_min_version": "76.0", + "strict_max_version": "76.*", + "id": "langpack-sl@thunderbird.mozilla.org" } }, - "manifest_version": 2 + "version": "76.0buildid20200420212409" } diff --git a/thunderbird-l10n/sq/localization/sq/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/sq/localization/sq/toolkit/about/aboutAddons.ftl index b0a7960014e5a17031899ae08b817847d58ab5e7..d5836a4cda3ad751bc857869a49250bcb1161134 100644 --- a/thunderbird-l10n/sq/localization/sq/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/sq/localization/sq/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Instaloni Shtesë Prej Kartele… .accesskey = I help-button = Asistencë Shtesash +sidebar-help-button-title = + .title = Asistencë Shtesash preferences = { PLATFORM() -> [windows] Mundësi { -brand-short-name }-i @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Mjete për krejt shtesat +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Mundësi { -brand-short-name }-i + *[other] Parapëlqime { -brand-short-name }-i + } show-unsigned-extensions-button = .label = Disa nga shtesat nuk u verifikuan dot show-all-extensions-button = @@ -166,13 +174,29 @@ extensions-view-available-updates = .name = Përditësime të Gatshme .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Rekomandime +addon-category-discover-title = + .title = Rekomandime addon-category-extension = Zgjerime +addon-category-extension-title = + .title = Zgjerime addon-category-theme = Tema +addon-category-theme-title = + .title = Tema addon-category-plugin = Shtojca +addon-category-plugin-title = + .title = Shtojca addon-category-dictionary = Fjalorë +addon-category-dictionary-title = + .title = Fjalorë addon-category-locale = Gjuhë +addon-category-locale-title = + .title = Gjuhë addon-category-available-updates = Përditësime të Gatshme +addon-category-available-updates-title = + .title = Përditësime të Gatshme addon-category-recent-updates = Përditësime Së Fundi +addon-category-recent-updates-title = + .title = Përditësime Së Fundi ## These are global warnings @@ -310,6 +334,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Shfaq Më Pak go-back-button = .tooltiptext = Kthehuni mbrapsht +header-back-button = + .title = Kthehuni mbrapsht ## Recommended add-ons page diff --git a/thunderbird-l10n/sq/localization/sq/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/sq/localization/sq/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..b5cd71f4a96e691c75db2b0684118290104a404b --- /dev/null +++ b/thunderbird-l10n/sq/localization/sq/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Nisët një version të vjetër të { -brand-product-name }-it + .style = width: 490px; +profiledowngrade-window-create = + .label = Krijoni Profil të Ri +profiledowngrade-sync = Përdorimi i një versioni të vjetër të { -brand-product-name }-it mund të dëmtojë faqerojtës dhe historik shfletimi të ruajtur tashmë në një profil ekzistues të { -brand-product-name }-it. Që të mbroni të dhënat tuaja, krijoni një profil të ri për këtë instalim të { -brand-short-name }-it. Mundeni përherë të bëni hyrjen me një { -fxaccount-brand-name } për të kryer njëkohësim faqerojtësish dhe historiku shfletimesh mes profileve tuaj. +profiledowngrade-nosync = Përdorimi i një versioni të vjetër të { -brand-product-name }-it mund të dëmtojë faqerojtës dhe historik shfletimi të ruajtur tashmë në një profil ekzistues të { -brand-product-name }-it. Që të mbroni të dhënat tuaja, krijoni një profil të ri për këtë instalim të { -brand-short-name }-it. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Dilni + *[other] Dilni + } diff --git a/thunderbird-l10n/sq/manifest.json b/thunderbird-l10n/sq/manifest.json index 121401e81f95e4ff6dd339fcba3a5cc1be414339..806d5b87aa546694f73f0fdb65825ebd4ca61878 100644 --- a/thunderbird-l10n/sq/manifest.json +++ b/thunderbird-l10n/sq/manifest.json @@ -1,57 +1,57 @@ { + "author": "Besnik Bleta (contributors: Besnik Bleta)", + "version": "76.0buildid20200420212409", + "manifest_version": 2, "sources": { "browser": { "base_path": "browser/" } }, "name": "Shqip Language Pack", - "langpack_id": "sq", - "description": "Language pack for Thunderbird for sq", - "manifest_version": 2, - "applications": { - "gecko": { - "id": "langpack-sq@thunderbird.mozilla.org", - "strict_min_version": "76.0", - "strict_max_version": "76.*" - } - }, "languages": { "sq": { - "version": "20200403080516", + "version": "20200415061226", "chrome_resources": { - "devtools": "chrome/sq/locale/sq/devtools/client/", - "alerts": "chrome/sq/locale/sq/alerts/", "lightning": "chrome/sq/locale/sq/lightning/", - "pluginproblem": "chrome/sq/locale/sq/pluginproblem/", - "pippki": "chrome/sq/locale/sq/pippki/", - "passwordmgr": "chrome/sq/locale/sq/passwordmgr/", + "mozapps": "chrome/sq/locale/sq/mozapps/", + "messenger-newsblog": "chrome/sq/locale/sq/messenger-newsblog/", + "global": "chrome/sq/locale/sq/global/", + "calendar": "chrome/sq/locale/sq/calendar/", "messenger": "chrome/sq/locale/sq/messenger/", "global-platform": { "linux": "chrome/sq/locale/sq/global-platform/unix/", + "win": "chrome/sq/locale/sq/global-platform/win/", "android": "chrome/sq/locale/sq/global-platform/unix/", - "macosx": "chrome/sq/locale/sq/global-platform/mac/", - "win": "chrome/sq/locale/sq/global-platform/win/" + "macosx": "chrome/sq/locale/sq/global-platform/mac/" }, - "messenger-smime": "chrome/sq/locale/sq/messenger-smime/", - "autoconfig": "chrome/sq/locale/sq/autoconfig/", - "calendar": "chrome/sq/locale/sq/calendar/", - "global": "chrome/sq/locale/sq/global/", - "messenger-newsblog": "chrome/sq/locale/sq/messenger-newsblog/", - "communicator": "chrome/sq/locale/sq/communicator/", "mozldap": "chrome/sq/locale/sq/mozldap/", - "branding": "chrome/sq/locale/sq/branding/", - "messenger-mapi": "chrome/sq/locale/sq/messenger-mapi/", - "devtools-shared": "chrome/sq/locale/sq/devtools/shared/", + "pippki": "chrome/sq/locale/sq/pippki/", "chat": "chrome/sq/locale/sq/chat/", - "devtools-startup": "chrome/sq/locale/sq/devtools/startup/", - "messenger-region": "chrome/sq/locale/sq/messenger-region/", "necko": "chrome/sq/locale/sq/necko/", - "places": "chrome/sq/locale/sq/places/", + "messenger-region": "chrome/sq/locale/sq/messenger-region/", + "devtools": "chrome/sq/locale/sq/devtools/client/", + "alerts": "chrome/sq/locale/sq/alerts/", + "branding": "chrome/sq/locale/sq/branding/", + "autoconfig": "chrome/sq/locale/sq/autoconfig/", "pipnss": "chrome/sq/locale/sq/pipnss/", - "mozapps": "chrome/sq/locale/sq/mozapps/" + "devtools-startup": "chrome/sq/locale/sq/devtools/startup/", + "communicator": "chrome/sq/locale/sq/communicator/", + "pluginproblem": "chrome/sq/locale/sq/pluginproblem/", + "devtools-shared": "chrome/sq/locale/sq/devtools/shared/", + "passwordmgr": "chrome/sq/locale/sq/passwordmgr/", + "places": "chrome/sq/locale/sq/places/", + "messenger-smime": "chrome/sq/locale/sq/messenger-smime/", + "messenger-mapi": "chrome/sq/locale/sq/messenger-mapi/" } } }, - "author": "Besnik Bleta (contributors: Besnik Bleta)", - "version": "76.0buildid20200407173003" + "applications": { + "gecko": { + "strict_min_version": "76.0", + "id": "langpack-sq@thunderbird.mozilla.org", + "strict_max_version": "76.*" + } + }, + "description": "Language pack for Thunderbird for sq", + "langpack_id": "sq" } diff --git a/thunderbird-l10n/sr/chrome/sr/locale/sr/devtools/client/accessibility.properties b/thunderbird-l10n/sr/chrome/sr/locale/sr/devtools/client/accessibility.properties index 96bc569a23130f7c652024b2ff5469ff0d05ef01..6b55185f554c3e86912af9971fa4c51092f63d55 100644 --- a/thunderbird-l10n/sr/chrome/sr/locale/sr/devtools/client/accessibility.properties +++ b/thunderbird-l10n/sr/chrome/sr/locale/sr/devtools/client/accessibility.properties @@ -275,6 +275,7 @@ accessibility.documentation.label=Documentation… # LOCALIZATION NOTE (accessibility.simulation): A title text for the toolbar # within the main accessibility panel that contains a list of simulations for # vision deficiencies. +accessibility.simulation=Симулирај: # LOCALIZATION NOTE (accessibility.simulation.deuteranomaly): This label is shown # in the "Simulate" menu in the accessibility panel and represent the deuteranomaly simulation option. @@ -318,10 +319,6 @@ accessibility.badge.keyboard=keyboard # accessible row in the accessibility tree for a given accessible object that # does not satisfy the WCAG guideline for keyboard accessibility. accessibility.badge.keyboard.tooltip=Does not meet WCAG standards for keyboard accessibility. -# LOCALIZATION NOTE (accessibility.simulation): A title text for the toolbar -# within the main accessibility panel that contains a list of simulations for -# vision deficiencies. -accessibility.simulation=Simulate: # LOCALIZATION NOTE (accessibility.simulation.deuteranomaly): This label is shown # in the "Simulate" menu in the accessibility panel and represent the deuteranomaly simulation option. accessibility.simulation.deuteranomaly=Deuteranomaly (low green) diff --git a/thunderbird-l10n/sr/localization/sr/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/sr/localization/sr/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..dc068e0e25c589bde40ff339672bfe9bccc0ebcd --- /dev/null +++ b/thunderbird-l10n/sr/localization/sr/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Преусмеравање URI календара +calendar-uri-redirect-description = + Сервер преусмерава URI за календар "{ $calendarName }". + Прихватити преусмеравање и почетак коришћења новог URI за овај календар? +calendar-uri-redirect-original-uri-label = Тренутни URI: +calendar-uri-redirect-target-uri-label = Преусмеравање на нови URI: diff --git a/thunderbird-l10n/sr/localization/sr/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/sr/localization/sr/devtools/client/aboutdebugging.ftl index c05008deba81ddd1eb5ff509850e653772b821b1..44b3eb9d3608226241f49f1e771c6cbd4a685cbb 100644 --- a/thunderbird-l10n/sr/localization/sr/devtools/client/aboutdebugging.ftl +++ b/thunderbird-l10n/sr/localization/sr/devtools/client/aboutdebugging.ftl @@ -154,7 +154,7 @@ about-debugging-runtime-extensions = .name = Extensions # Title of the tabs category. about-debugging-runtime-tabs = - .name = Tabs + .name = Језичци # Title of the service workers category. about-debugging-runtime-service-workers = .name = Service Workers diff --git a/thunderbird-l10n/sr/localization/sr/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/sr/localization/sr/toolkit/about/aboutAddons.ftl index 32b2567c91cfc6335e3c9ac8f128e54d369de7a3..357a14708f7c54a79d4d1ab07ce95e641fdb5f9d 100644 --- a/thunderbird-l10n/sr/localization/sr/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/sr/localization/sr/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Инсталирај додатак из датотеке… .accesskey = И help-button = Подршка за додатке +sidebar-help-button-title = + .title = Подршка за додатке preferences = { PLATFORM() -> [windows] { -brand-short-name } опције @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Алатке за све додатке +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } опције + *[other] { -brand-short-name } поставке + } show-unsigned-extensions-button = .label = Неке екстензије нису могле бити потврђене show-all-extensions-button = @@ -174,13 +182,29 @@ extensions-view-available-updates = .name = Доступна ажурирања .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Препоруке +addon-category-discover-title = + .title = Препоруке addon-category-extension = Екстензије +addon-category-extension-title = + .title = Екстензије addon-category-theme = Теме +addon-category-theme-title = + .title = Теме addon-category-plugin = Прикључци +addon-category-plugin-title = + .title = Прикључци addon-category-dictionary = Речници +addon-category-dictionary-title = + .title = Речници addon-category-locale = Језици +addon-category-locale-title = + .title = Језици addon-category-available-updates = Доступна ажурирања +addon-category-available-updates-title = + .title = Доступна ажурирања addon-category-recent-updates = Недавна ажурирања +addon-category-recent-updates-title = + .title = Недавна ажурирања ## These are global warnings @@ -319,6 +343,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Прикажи мање go-back-button = .tooltiptext = Иди назад +header-back-button = + .title = Иди назад ## Recommended add-ons page @@ -352,9 +378,15 @@ addon-options-button = report-addon-button = Пријави remove-addon-button = Уклони +# The link will always be shown after the other text. +remove-addon-disabled-button = Не може се уклонити. <a data-l10n-name="link">Зашто?</a> disable-addon-button = Онемогући enable-addon-button = Омогући expand-addon-button = Више опција +# This is used for the toggle on the extension card, it's a checkbox and this +# is always its label. +extension-enable-addon-button-label = + .aria-label = Омогући preferences-addon-button = { PLATFORM() -> [windows] Подешавања @@ -418,6 +450,11 @@ install-update-button = Ажурирај # badge is the private browsing icon included next to the extension's name. addon-badge-private-browsing-allowed = .title = Дозвољено у приватним прозорима +# This is the tooltip text for the private browsing badge in about:addons. The +# badge is the private browsing icon included next to the extension's name. +addon-badge-private-browsing-allowed2 = + .title = Дозвољено у приватним прозорима + .aria-label = { addon-badge-private-browsing-allowed2.title } addon-detail-private-browsing-help = Када је дозвољено, проширење ће имати приступ вашим активностима на мрежи у приватном прегледавању. <a data-l10n-name="learn-more">Сазнај више</a> addon-detail-private-browsing-allow = Дозволи addon-detail-private-browsing-disallow = Не дозволи @@ -426,6 +463,11 @@ addon-detail-private-browsing-disallow = Не дозволи addon-badge-recommended = .title = Препоручено .alt = Препоручено +# This is the tooltip text for the recommended badge for an extension in about:addons. The +# badge is a small icon displayed next to an extension when it is recommended on AMO. +addon-badge-recommended2 = + .title = { -brand-product-name } препоручује само проширења која задовољавају наше стандарде сигурности и перформанси + .aria-label = { addon-badge-recommended2.title } available-updates-heading = Доступна ажурирања recent-updates-heading = Недавна ажурирања release-notes-loading = Учитава се... @@ -444,10 +486,12 @@ theme-heading = Управљајте вашим темама plugin-heading = Управљајте вашим прикључцима dictionary-heading = Управљајте вашим речницима locale-heading = Управљајте вашим језицима +updates-heading = Управљајте вашим ажурирањима discover-heading = Персонализујте ваш { -brand-short-name } shortcuts-heading = Управљај пречицама екстензија theme-heading-search-label = Нађите више тема extension-heading-search-label = Нађите више екстензија +default-heading-search-label = Пронађите још додатака addons-heading-search-input = .placeholder = Претражи сајт addons.mozilla.org addon-page-options-button = diff --git a/thunderbird-l10n/sr/localization/sr/toolkit/about/aboutTelemetry.ftl b/thunderbird-l10n/sr/localization/sr/toolkit/about/aboutTelemetry.ftl index c632a7367fe0de37de2ab3f0d611701737f3b3eb..ebbf101ffec4f531a05c646ff1561b00bc749d57 100644 --- a/thunderbird-l10n/sr/localization/sr/toolkit/about/aboutTelemetry.ftl +++ b/thunderbird-l10n/sr/localization/sr/toolkit/about/aboutTelemetry.ftl @@ -4,6 +4,7 @@ about-telemetry-ping-data-source = Извор података пинга: about-telemetry-show-current-ping-data = Подаци тренутног пинга +about-telemetry-show-current-data = Тренутни подаци about-telemetry-show-archived-ping-data = Архивирани подаци пинга about-telemetry-show-subsession-data = Прикажи податке сесије about-telemetry-choose-ping = Изабери пинг: @@ -15,10 +16,12 @@ about-telemetry-option-group-older = Старије about-telemetry-previous-ping = << about-telemetry-next-ping = >> about-telemetry-page-title = Подаци телеметрије +about-telemetry-current-store = Тренутна продавница: about-telemetry-more-information = Тражите више података? about-telemetry-firefox-data-doc = <a data-l10n-name="data-doc-link">Firefox документација података</a> садржи водиче о томе како радити са нашим алатима за податке. about-telemetry-telemetry-client-doc = <a data-l10n-name="client-doc-link">Firefox документација телеметрије клијента</a> укључује дефиниције концепта, API документацију и референце података. about-telemetry-telemetry-dashboard = <a data-l10n-name="dashboard-link">Командна табла телеметрије</a> вам дозвољава да визуелно прикажете податке које Mozilla прима путем телеметрије. +about-telemetry-telemetry-probe-dictionary = <a data-l10n-name="probe-dictionary-link">Речник узорака пружа детаље и описе за узорке прикупљене телеметријом.</a> about-telemetry-show-in-Firefox-json-viewer = Отвори у JSON приказивачу about-telemetry-home-section = Почетна about-telemetry-general-data-section = Општи подаци @@ -55,6 +58,17 @@ about-telemetry-upload-type = [enabled] омогућено *[disabled] онемогућено } +# Example Output: 1 sample, average = 0, sum = 0 +# Variables: +# $sampleCount (Integer): amount of histogram samples +# $prettyAverage (Integer): average of histogram samples +# $sum (Integer): sum of histogram samples +about-telemetry-histogram-stats = + { $sampleCount -> + [one] { $sampleCount } узорак, просек = { $prettyAverage }, збир = { $sum } + [few] { $sampleCount } узорка, просек = { $prettyAverage }, збир = { $sum } + *[other] { $sampleCount } узорака, просек = { $prettyAverage }, збир = { $sum } + } # Variables: # $telemetryServerOwner (String): the value of the toolkit.telemetry.server_owner preference. Typically "Mozilla" about-telemetry-page-subtitle = Ова страница ће приказати информације о перфомансама, хардверу, потрошњи и прилагођењу које је прикупила телеметрија. Ове информације ће бити послате { $telemetryServerOwner }-и да би се побољшао { -brand-full-name }. @@ -64,6 +78,7 @@ about-telemetry-settings-explanation = Телеметрија сакупља { a # $timeStamp (String): ping localized timestamp, e.g. “2017/07/08 10:40:46” about-telemetry-ping-details = Сваки део информације је послат у комплету у “<a data-l10n-name="ping-link">пингове</a>”. Ви гледате у { $name }, { $timestamp } пинг. about-telemetry-ping-details-current = Сваки део информације је послат у комплету у “<a data-l10n-name="ping-link">пингове</a>”. Ви гледате у тренутно пинг. +about-telemetry-data-details-current = Сваки делић података се шаље у пакетима под називом"<a data-l10n-name="ping-link">пинг</a>“. Ви гледате тренутне податке. # string used as a placeholder for the search field # More info about it can be found here: # https://firefox-source-docs.mozilla.org/toolkit/components/telemetry/telemetry/data/main-ping.html @@ -90,6 +105,8 @@ about-telemetry-no-search-results-all = Жао нам је! Нема резул about-telemetry-no-data-to-display = Жао нам је! Тренутно нема доступних података у “{ $sectionName }” # used as a tooltip for the “current” ping title in the sidebar about-telemetry-current-ping-sidebar = тренутни пинг +# used as a tooltip for the “current” ping title in the sidebar +about-telemetry-current-data-sidebar = тренутни подаци # used in the “Ping Type” select about-telemetry-telemetry-ping-type-all = све # button label to copy the histogram @@ -124,3 +141,12 @@ about-telemetry-category-header = категорија about-telemetry-method-header = метода about-telemetry-object-header = објекат about-telemetry-extra-header = додатно +about-telemetry-origin-section = Origin Telemetry +about-telemetry-origin-origin = извор +about-telemetry-origin-count = број +# Variables: +# $telemetryServerOwner (String): the value of the toolkit.telemetry.server_owner preference. Typically "Mozilla" +about-telemetry-origins-explanation = <a data-l10n-name="origin-doc-link">Firefox Origin Telemetry</a> кодира податке пре слања тако да { $telemetryServerOwner } може пребројати ствари, али не може знати да ли неки { -brand-product-name } доприноси том броју. (<a data-l10n-name="prio-blog-link">сазнајте више</a>) +# Variables: +# $process (String): type of process in subsection headers ( e.g. "content", "parent" ) +about-telemetry-process = { $process } процес diff --git a/thunderbird-l10n/sr/localization/sr/toolkit/about/abuseReports.ftl b/thunderbird-l10n/sr/localization/sr/toolkit/about/abuseReports.ftl index e7ec22212a896eb3df12c84867c1ec1e2022e837..6df1f90d292163e3087afa579307b90c6daad6d0 100644 --- a/thunderbird-l10n/sr/localization/sr/toolkit/about/abuseReports.ftl +++ b/thunderbird-l10n/sr/localization/sr/toolkit/about/abuseReports.ftl @@ -5,6 +5,18 @@ abuse-report-title-extension = Пријави ово проширење продавцу { -vendor-short-name } abuse-report-title-theme = Пријави ову тему продавцу { -vendor-short-name } abuse-report-subtitle = У чему је проблем? +# Variables: +# $author-name (string) - Name of the add-on author +abuse-report-addon-authored-by = од <a data-l10n-name="author-name">{ $author-name }</a> +abuse-report-learnmore = + Нисте сигурни шта да изаберете? + <a data-l10n-name="learnmore-link">Сазнајте више о пријављивању проширења и тема</a> +abuse-report-submit-description = Опишите проблем (није обавезно) +abuse-report-textarea = + .placeholder = Лакше нам је да решимо проблем ако знамо детаље. Опишите шта сте доживели. Хвала вам што нам помажете да одржимо веб здравим. +abuse-report-submit-note = + Напомена: не уносите личне податке (као што су име, е-адреса, број телефона, физичка адреса). + { -vendor-short-name } води сталну евидденцију ових извештаја. ## Panel buttons. @@ -19,7 +31,14 @@ abuse-report-submit-button = Пошаљи ## Variables: ## $addon-name (string) - Name of the add-on +abuse-report-messagebar-aborted = Пријава за <span data-l10n-name="addon-name">{ $addon-name }</span> је отказана. +abuse-report-messagebar-submitting = Слање пријаве за <span data-l10n-name="addon-name">{ $addon-name }</span>. abuse-report-messagebar-submitted = Хвала вам што сте поднели пријаву. Да ли желите уклонити додатак <span data-l10n-name="addon-name">{ $addon-name }</span>? +abuse-report-messagebar-submitted-noremove = Хвала вам што сте поднели пријаву. +abuse-report-messagebar-removed-extension = Хвала вам што сте поднели пријаву. Уклонили сте <span data-l10n-name="addon-name">{ $addon-name }</span> проширење. +abuse-report-messagebar-removed-theme = Хвала вам што сте поднели пријаву. Уклонили сте <span data-l10n-name="addon-name">{ $addon-name }</span> тему. +abuse-report-messagebar-error = Дошло је до грешке приликом слања пријаве за <span data-l10n-name="addon-name">{ $addon-name }</span>. +abuse-report-messagebar-error-recent-submit = Ваша пријава за <span data-l10n-name="addon-name">{ $addon-name }</span> није послана зато што је друга пријава поднета недавно. ## Message bars actions. @@ -32,5 +51,29 @@ abuse-report-messagebar-action-cancel = Откажи ## Abuse report reasons (optionally paired with related examples and/or suggestions) +abuse-report-damage-reason = Оштећује мој рачунар и податке +abuse-report-damage-example = Пример: убризгани злонамерни програм тј. malware или украдени подаци +abuse-report-spam-reason = Ствара нежељену пошту тј. spam или рекламе +abuse-report-spam-example = Пример: умеће рекламе на веб странице +abuse-report-settings-reason = Променио је мој претраживач, почетну страницу или нови језичак без обавештења или моје дозволе +abuse-report-settings-suggestions = Пре пријављивања проширења можете покушати да промените подешавања: abuse-report-settings-suggestions-search = Промените подразумеване поставке претраге +abuse-report-settings-suggestions-homepage = Промените почетну страницу и нови језичак +abuse-report-deceptive-reason = Претвара се да је нешто што није +abuse-report-deceptive-example = Пример: обмањујући опис или слике +abuse-report-broken-reason-extension = Не ради, квари веб странице или успорава { -brand-product-name } +abuse-report-broken-reason-theme = Не ради или квари приказ прегледача +abuse-report-broken-example = Пример: функције су споре, тешке за употребу или не раде; делови веб страница се не учитавају или изгледају неуобичајено +abuse-report-broken-suggestions-extension = + Звучи као да сте идентификовали грешку. Поред тога што овде подносите пријаву, најбољи начин + да решите проблем са функционалношћу је да контактирате програмера проширења. + <a data-l10n-name="support-link">Посетите страницу проширења</a> да бисте добили податке о програмеру. +abuse-report-broken-suggestions-theme = + Звучи као да сте идентификовали грешку. Поред тога што овде подносите пријаву, најбољи начин + да решите проблем са функционалношћу је да контактирате програмера теме. + <a data-l10n-name="support-link">Посетите страницу теме</a> да бисте добили податке о програмеру. +abuse-report-policy-reason = Садржај мржње или насиља и илегалан садржај +abuse-report-policy-suggestions = Напомена: проблеми са ауторским правима и заштитним знаковима морају бити пријављени у одвојеном процесу. <a data-l10n-name="report-infringement-link">Користите ова упутства</a> да пријавите проблем. +abuse-report-unwanted-reason = Никад нисам желео/ла ово проширење и не могу га се решити +abuse-report-unwanted-example = Пример: апликација је инсталирала проширење без моје дозволе abuse-report-other-reason = Нешто друго diff --git a/thunderbird-l10n/sr/localization/sr/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/sr/localization/sr/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..e6be2501eb83d3ce2328c80b423117f2c33e3abf --- /dev/null +++ b/thunderbird-l10n/sr/localization/sr/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Покренули сте старију { -brand-product-name } верзију + .style = width: 490px; +profiledowngrade-window-create = + .label = Направи нови профил +profiledowngrade-sync = Коришћење старије верзије { -brand-product-name }-а може да оштети забелешке и историју прегледања који су већ сачувани у постојећем { -brand-product-name } профилу. Да бисте заштитили своје информације, направите нови профил за инсталацију { -brand-short-name }. Увек се можете пријавити помоћу { -fxaccount-brand-name } да синхронизујете своје забелешке и историју прегледања међу профилима. +profiledowngrade-nosync = Коришћење старије верзије { -brand-product-name }-а може да оштети забелешке и историју прегледања који су већ сачувани у постојећем { -brand-product-name } профилу. Да бисте заштитили своје информације, направите нови профил за ову инсталацију { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Изађи + *[other] Напусти + } diff --git a/thunderbird-l10n/sr/manifest.json b/thunderbird-l10n/sr/manifest.json index 28560176b59560379be1a160b8058e49136ec75a..2f0e1672ea7985f8a83aece62347b7305d112268 100644 --- a/thunderbird-l10n/sr/manifest.json +++ b/thunderbird-l10n/sr/manifest.json @@ -1,57 +1,57 @@ { - "name": "српски (sr) Language Pack", - "manifest_version": 2, - "langpack_id": "sr", "sources": { "browser": { "base_path": "browser/" } }, - "version": "76.0buildid20200407173003", + "description": "Language pack for Thunderbird for sr", + "manifest_version": 2, + "langpack_id": "sr", "languages": { "sr": { - "version": "20200406190608", "chrome_resources": { - "mozapps": "chrome/sr/locale/sr/mozapps/", - "global": "chrome/sr/locale/sr/global/", - "autoconfig": "chrome/sr/locale/sr/autoconfig/", - "devtools-shared": "chrome/sr/locale/sr/devtools/shared/", + "pluginproblem": "chrome/sr/locale/sr/pluginproblem/", + "places": "chrome/sr/locale/sr/places/", "messenger-newsblog": "chrome/sr/locale/sr/messenger-newsblog/", "devtools": "chrome/sr/locale/sr/devtools/client/", - "lightning": "chrome/sr/locale/sr/lightning/", + "messenger-smime": "chrome/sr/locale/sr/messenger-smime/", + "devtools-shared": "chrome/sr/locale/sr/devtools/shared/", + "devtools-startup": "chrome/sr/locale/sr/devtools/startup/", + "mozldap": "chrome/sr/locale/sr/mozldap/", + "chat": "chrome/sr/locale/sr/chat/", + "messenger": "chrome/sr/locale/sr/messenger/", + "autoconfig": "chrome/sr/locale/sr/autoconfig/", + "necko": "chrome/sr/locale/sr/necko/", "branding": "chrome/sr/locale/sr/branding/", - "pippki": "chrome/sr/locale/sr/pippki/", - "alerts": "chrome/sr/locale/sr/alerts/", "global-platform": { "macosx": "chrome/sr/locale/sr/global-platform/mac/", - "win": "chrome/sr/locale/sr/global-platform/win/", + "android": "chrome/sr/locale/sr/global-platform/unix/", "linux": "chrome/sr/locale/sr/global-platform/unix/", - "android": "chrome/sr/locale/sr/global-platform/unix/" + "win": "chrome/sr/locale/sr/global-platform/win/" }, + "messenger-mapi": "chrome/sr/locale/sr/messenger-mapi/", "messenger-region": "chrome/sr/locale/sr/messenger-region/", + "pippki": "chrome/sr/locale/sr/pippki/", + "lightning": "chrome/sr/locale/sr/lightning/", + "pipnss": "chrome/sr/locale/sr/pipnss/", "communicator": "chrome/sr/locale/sr/communicator/", - "chat": "chrome/sr/locale/sr/chat/", - "necko": "chrome/sr/locale/sr/necko/", "passwordmgr": "chrome/sr/locale/sr/passwordmgr/", - "messenger": "chrome/sr/locale/sr/messenger/", - "mozldap": "chrome/sr/locale/sr/mozldap/", - "calendar": "chrome/sr/locale/sr/calendar/", - "pluginproblem": "chrome/sr/locale/sr/pluginproblem/", - "devtools-startup": "chrome/sr/locale/sr/devtools/startup/", - "messenger-mapi": "chrome/sr/locale/sr/messenger-mapi/", - "messenger-smime": "chrome/sr/locale/sr/messenger-smime/", - "pipnss": "chrome/sr/locale/sr/pipnss/", - "places": "chrome/sr/locale/sr/places/" - } + "global": "chrome/sr/locale/sr/global/", + "alerts": "chrome/sr/locale/sr/alerts/", + "mozapps": "chrome/sr/locale/sr/mozapps/", + "calendar": "chrome/sr/locale/sr/calendar/" + }, + "version": "20200415061238" } }, - "author": "mozilla.rs (contributors: Марко Костић, Марко Андрејић, Александра Узелац, Вања Тумбас)", - "description": "Language pack for Thunderbird for sr", "applications": { "gecko": { - "strict_min_version": "76.0", "strict_max_version": "76.*", - "id": "langpack-sr@thunderbird.mozilla.org" + "id": "langpack-sr@thunderbird.mozilla.org", + "strict_min_version": "76.0" } - } + }, + "name": "српски (sr) Language Pack", + "author": "mozilla.rs (contributors: Марко Костић, Марко Андрејић, Александра Узелац, Вања Тумбас)", + "version": "76.0buildid20200420212409" } diff --git a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/devtools/client/inspector.properties b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/devtools/client/inspector.properties index 80c712443f4cd9f3ad1cfab003dd35fcbbefb853..6ef5700427bab6a74c3a707c1fd25522075021e8 100644 --- a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/devtools/client/inspector.properties +++ b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Detta element har rullbar övergång. # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Ingen associerad regel +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Håll ner shift och klicka för att navigera till regeln + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/global/css.properties b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/global/css.properties index 6e1cce90d9ffb3b7f5b8ddf2329d3163b2ffa191..d850d07213e94de2de499c58d308d0232a3f4afd 100644 --- a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/global/css.properties +++ b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=Stilmallen %1$S laddades som CSS även fast dess MIME-typ, “%2$ PEUnexpEOF2=Oväntat slut på filen vid sökning efter %1$S. PEParseRuleWSOnly=Sträng med endast blanka tecken angavs som en regel för tolkning. + PEDeclDropped=Ignorerad deklaration. PEDeclSkipped=Hoppar till nästa deklaration. PEUnknownProperty=Okänd egenskap ‘%1$S’. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Endast en repeat(auto-fill, …) är t PEMoreThanOneGridRepeatAutoFillFitInTrackList=Endast en repeat(auto-fill, …) eller repeat(auto-fit, …) är tillåten i en tracklista. PEMoreThanOneGridRepeatTrackSize=Endast ett trackstorlek är tillåten inuti repeat(auto-fit/auto-fill, …). +PEDisallowedImportRule=@importreglerna är ännu inte giltiga i konstruerade formatmallar. + TooLargeDashedRadius=Gränsradie är för stor för ‘streckad’ stil (gränsen är 100000 px). Renderar som fylld. TooLargeDottedRadius=Gränsradie är för stor för ‘prickad’ stil (gränsen är 100000 px). Renderar som fylld. diff --git a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/global/security/security.properties b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/global/security/security.properties index 5119a384962403d70e14f26f5959934a467efc98..77f9a727cac200e5cd3eb09e4a4cdf30fe580511 100644 --- a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/global/security/security.properties +++ b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Laddning nekad av X-Frame-Options: “%1$S” från “%2$S”, webbpl # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Laddning nekad av X-Frame-Options: “%1$S” från “%2$S”, webbplats tillåter inte cross-origin ramning från “%3$S”. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Ogiltigt huvud X-Frame-Options hittades när “%2$S” laddades: “%1$S” är inte ett giltigt direktiv. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=Laddningen av “%2$S” i en ram nekas av ett direktivet “X-Frame-Options“ satt till “%1$S“. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Uppgraderar osäker begäran “%1$S” att använda “%2$S”. diff --git a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/messenger/messenger.dtd b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/messenger/messenger.dtd index 3531583ea46f386204c20ae380498b29cbe25c24..dd0b6e1ae6990c0bc86b10d719df6437e37687be 100644 --- a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/messenger/messenger.dtd +++ b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Sök meddelanden…"> <!ENTITY searchMailCmd.accesskey "m"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Global sökning…"> +<!ENTITY glodaSearchCmd.accesskey "G"> <!ENTITY searchAddressesCmd.label "Sök adresser…"> <!ENTITY searchAddressesCmd.accesskey "S"> diff --git a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/messenger/pgpmime.properties b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/messenger/pgpmime.properties index f403f0f80482d78b54af8f1acb1557d959928907..352e773d6a2b91a29eb12fab4df70656f08114ea 100644 --- a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/messenger/pgpmime.properties +++ b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=Detta är ett krypterat OpenPGP-meddelande.<br>För att dekryptera meddelandet, behöver du installera en <a href="%S">OpenPGP-tillägg</a>. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Detta är ett krypterat OpenPGP-meddelande, men stöd för OpenPGP-dekryptering är inte tillgängligt. diff --git a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/necko/necko.properties b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/necko/necko.properties index d1d0f3b0823969281aeca36b715b4f5e683484df..55c6470a9ea3b56930e5bbfe3fa906fa099d5e43 100644 --- a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/necko/necko.properties +++ b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Lagringsåtkomst automatiskt beviljad # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Lagringsåtkomst automatiskt beviljad för spårare “%2$S” på “%1$S”. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Lagringsåtkomst beviljas automatiskt för förstapartisolering “%2$S” på “%1$S”. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Kaka “%1$S” avvisades eftersom den har attributet “sameSite=none” men saknar attributet “secure”. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/sv-SE/localization/sv-SE/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/sv-SE/localization/sv-SE/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..104ce6b6c66f50a5e208875607108a136ce99b04 --- /dev/null +++ b/thunderbird-l10n/sv-SE/localization/sv-SE/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Omdirigering av URI för kalender +calendar-uri-redirect-description = + Servern omdirigerar URI för kalendern "{ $calendarName }". + Acceptera omdirigeringen och börja använda ny URI för den här kalendern? +calendar-uri-redirect-original-uri-label = Aktuell URI: +calendar-uri-redirect-target-uri-label = Omdirigerar till ny URI: diff --git a/thunderbird-l10n/sv-SE/localization/sv-SE/messenger/accountCentral.ftl b/thunderbird-l10n/sv-SE/localization/sv-SE/messenger/accountCentral.ftl index bb868aeacbde59a7a67bb5c5b78d3c8b770a9fcf..7590d9c57f95f87aac1fd5089874fe971602a0f1 100644 --- a/thunderbird-l10n/sv-SE/localization/sv-SE/messenger/accountCentral.ftl +++ b/thunderbird-l10n/sv-SE/localization/sv-SE/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Välkommen till { -brand-full-name } +account-settings = Kontoinställningar +# $accounts (Number) - the number of configured accounts setup-title = Välj vad du vill konfigurera about-title = Om { -brand-full-name } resources-title = Resurser @@ -40,3 +42,10 @@ explore-link = Utforska funktioner support-link = Hjälp involved-link = Engagera dig developer-link = Dokumentation för utvecklare +read = Lästa meddelanden +compose = Skriv ett nytt meddelande +search = Sök efter meddelanden +filter = Hantera meddelandefilter +nntp-subscription = Hantera prenumerationer på diskussionsgrupper +rss-subscription = Hantera RSS-prenumerationer +e2e = End-to-end-kryptering diff --git a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/aboutAddons.ftl index 37e65244afc936a246c9e637534c90812d1b9685..0a16d7e3a74610c41f396f3be479e784826fdeea 100644 --- a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Installera tillägg från fil… .accesskey = I help-button = Support för tillägg +sidebar-help-button-title = + .title = Support för tillägg preferences = { PLATFORM() -> [windows] Inställningar för { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Verktyg för alla tillägg +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Inställningar för { -brand-short-name } + *[other] Inställningar för { -brand-short-name } + } show-unsigned-extensions-button = .label = Vissa utökningar kunde inte verifieras show-all-extensions-button = @@ -163,13 +171,29 @@ extensions-view-available-updates = .name = Tillgängliga uppdateringar .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Rekommendationer +addon-category-discover-title = + .title = Rekommendationer addon-category-extension = Tillägg +addon-category-extension-title = + .title = Tillägg addon-category-theme = Teman +addon-category-theme-title = + .title = Teman addon-category-plugin = Insticksmoduler +addon-category-plugin-title = + .title = Insticksmoduler addon-category-dictionary = Ordlistor +addon-category-dictionary-title = + .title = Ordlistor addon-category-locale = Språk +addon-category-locale-title = + .title = Språk addon-category-available-updates = Tillgängliga uppdateringar +addon-category-available-updates-title = + .title = Tillgängliga uppdateringar addon-category-recent-updates = Senaste uppdateringar +addon-category-recent-updates-title = + .title = Senaste uppdateringar ## These are global warnings @@ -282,6 +306,7 @@ shortcuts-no-commands = Följande tillägg har inte genvägar: shortcuts-input = .placeholder = Skapa en genväg shortcuts-browserAction = Aktivera tillägg +shortcuts-browserAction2 = Aktivera verktygsfältets knapp shortcuts-pageAction = Aktivera sidans åtgärd shortcuts-sidebarAction = Visa sidofält shortcuts-modifier-mac = Inkludera Ctrl, Alt eller ⌘ @@ -307,6 +332,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Visa mindre go-back-button = .tooltiptext = Gå tillbaka +header-back-button = + .title = Gå tillbaka ## Recommended add-ons page diff --git a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/aboutSupport.ftl index 7e1d85f2798224f120b0afab2a1d43c717472243..4ec4260066fc9be930f5711ce6435355db9a6a1c 100644 --- a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/aboutSupport.ftl @@ -287,6 +287,11 @@ sandbox-proc-type-content = innehåll sandbox-proc-type-file = filinnehåll sandbox-proc-type-media-plugin = insticksmodul media sandbox-proc-type-data-decoder = dataavkodare +startup-cache-title = Startcache +startup-cache-disk-cache-path = Sökväg diskcache +startup-cache-ignore-disk-cache = Ignorera diskcache +startup-cache-found-disk-cache-on-init = Hittade diskcache på Init +startup-cache-wrote-to-disk-cache = Skrev till diskcache launcher-process-status-0 = Aktiverad launcher-process-status-1 = Inaktiverad på grund av fel launcher-process-status-2 = Inaktiverad med tvång @@ -310,6 +315,7 @@ touch-enabled = tryckinmatning aktiverad drag-enabled = rullningslist är dragaktiverad keyboard-enabled = tangentbord aktiverad autoscroll-enabled = autoscroll aktiverad +zooming-enabled = mjuk pinch-zoom aktiverad ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/certviewer.ftl b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/certviewer.ftl index 09fd7e5e557ff3a90757a260506dee8f1e798410..8eb22817dc35312334099562e575f8852e38f397 100644 --- a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (chain) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Denna utökning har markerats som kritisk, vilket innebär att klienter måste avvisa certifikatet om de inte förstår det. +certificate-viewer-export = Exportera + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Dina certifikat +certificate-viewer-tab-people = Personer +certificate-viewer-tab-servers = Servrar +certificate-viewer-tab-ca = Utfärdare +certificate-viewer-tab-unkonwn = Okänt diff --git a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/global/processTypes.ftl b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/global/processTypes.ftl index 4c7efb97c3975b5eeb208e8dd14309cc19537740..0ef8adf6ad2befda751f103db00f4286207a8a2f 100644 --- a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Isolerat webbinnehåll # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..b7fee66f4e8a344768ecb8aac202ef620fb10cfa --- /dev/null +++ b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Du har startat en äldre version av { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Skapa ny profil +profiledowngrade-sync = Genom att använda en äldre version av { -brand-product-name } kan korrupta bokmärken och surfhistorik redan ha sparats i en befintlig { -brand-product-name }-profil. För att skydda din information, skapa en ny profil för den här installationen av { -brand-short-name }. Du kan alltid logga in med ett { -fxaccount-brand-name } för att synkronisera dina bokmärken och surfhistorik mellan profiler. +profiledowngrade-nosync = Genom att använda en äldre version av { -brand-product-name } kan korrupta bokmärken och surfhistorik redan sparats i en befintlig { -brand-product-name }-profil. För att skydda din information, skapa en ny profil för den här installationen av { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Avsluta + *[other] Avsluta + } diff --git a/thunderbird-l10n/sv-SE/manifest.json b/thunderbird-l10n/sv-SE/manifest.json index 0bf69a03b7e758d3a5dca41b7fb0089ea515d67b..eaf581c9da4f731b0a070911a3d8647fa41f074d 100644 --- a/thunderbird-l10n/sv-SE/manifest.json +++ b/thunderbird-l10n/sv-SE/manifest.json @@ -1,57 +1,57 @@ { - "author": "Mozilla-sv (contributors: Andreas Pettersson)", - "sources": { - "browser": { - "base_path": "browser/" - } - }, - "description": "Language pack for Thunderbird for sv-SE", - "version": "76.0buildid20200407173003", + "manifest_version": 2, "languages": { "sv-SE": { + "version": "20200418165605", "chrome_resources": { - "global": "chrome/sv-SE/locale/sv-SE/global/", - "places": "chrome/sv-SE/locale/sv-SE/places/", - "autoconfig": "chrome/sv-SE/locale/sv-SE/autoconfig/", - "messenger-region": "chrome/sv-SE/locale/sv-SE/messenger-region/", - "devtools": "chrome/sv-SE/locale/sv-SE/devtools/client/", - "pippki": "chrome/sv-SE/locale/sv-SE/pippki/", "pipnss": "chrome/sv-SE/locale/sv-SE/pipnss/", - "pluginproblem": "chrome/sv-SE/locale/sv-SE/pluginproblem/", + "mozapps": "chrome/sv-SE/locale/sv-SE/mozapps/", "calendar": "chrome/sv-SE/locale/sv-SE/calendar/", - "mozldap": "chrome/sv-SE/locale/sv-SE/mozldap/", - "devtools-startup": "chrome/sv-SE/locale/sv-SE/devtools/startup/", + "messenger-mapi": "chrome/sv-SE/locale/sv-SE/messenger-mapi/", "branding": "chrome/sv-SE/locale/sv-SE/branding/", - "mozapps": "chrome/sv-SE/locale/sv-SE/mozapps/", - "necko": "chrome/sv-SE/locale/sv-SE/necko/", - "lightning": "chrome/sv-SE/locale/sv-SE/lightning/", - "messenger-smime": "chrome/sv-SE/locale/sv-SE/messenger-smime/", - "messenger": "chrome/sv-SE/locale/sv-SE/messenger/", + "passwordmgr": "chrome/sv-SE/locale/sv-SE/passwordmgr/", + "pippki": "chrome/sv-SE/locale/sv-SE/pippki/", "chat": "chrome/sv-SE/locale/sv-SE/chat/", + "mozldap": "chrome/sv-SE/locale/sv-SE/mozldap/", + "messenger-region": "chrome/sv-SE/locale/sv-SE/messenger-region/", + "pluginproblem": "chrome/sv-SE/locale/sv-SE/pluginproblem/", "alerts": "chrome/sv-SE/locale/sv-SE/alerts/", - "passwordmgr": "chrome/sv-SE/locale/sv-SE/passwordmgr/", - "devtools-shared": "chrome/sv-SE/locale/sv-SE/devtools/shared/", - "messenger-mapi": "chrome/sv-SE/locale/sv-SE/messenger-mapi/", + "messenger-newsblog": "chrome/sv-SE/locale/sv-SE/messenger-newsblog/", + "communicator": "chrome/sv-SE/locale/sv-SE/communicator/", + "devtools-startup": "chrome/sv-SE/locale/sv-SE/devtools/startup/", + "devtools": "chrome/sv-SE/locale/sv-SE/devtools/client/", + "messenger-smime": "chrome/sv-SE/locale/sv-SE/messenger-smime/", + "necko": "chrome/sv-SE/locale/sv-SE/necko/", + "autoconfig": "chrome/sv-SE/locale/sv-SE/autoconfig/", "global-platform": { - "android": "chrome/sv-SE/locale/sv-SE/global-platform/unix/", - "win": "chrome/sv-SE/locale/sv-SE/global-platform/win/", "linux": "chrome/sv-SE/locale/sv-SE/global-platform/unix/", - "macosx": "chrome/sv-SE/locale/sv-SE/global-platform/mac/" + "win": "chrome/sv-SE/locale/sv-SE/global-platform/win/", + "macosx": "chrome/sv-SE/locale/sv-SE/global-platform/mac/", + "android": "chrome/sv-SE/locale/sv-SE/global-platform/unix/" }, - "communicator": "chrome/sv-SE/locale/sv-SE/communicator/", - "messenger-newsblog": "chrome/sv-SE/locale/sv-SE/messenger-newsblog/" - }, - "version": "20200404145321" + "global": "chrome/sv-SE/locale/sv-SE/global/", + "devtools-shared": "chrome/sv-SE/locale/sv-SE/devtools/shared/", + "places": "chrome/sv-SE/locale/sv-SE/places/", + "lightning": "chrome/sv-SE/locale/sv-SE/lightning/", + "messenger": "chrome/sv-SE/locale/sv-SE/messenger/" + } + } + }, + "sources": { + "browser": { + "base_path": "browser/" } }, - "langpack_id": "sv-SE", - "name": "Svenska (SE) Language Pack", - "manifest_version": 2, "applications": { "gecko": { "id": "langpack-sv-SE@thunderbird.mozilla.org", - "strict_min_version": "76.0", - "strict_max_version": "76.*" + "strict_max_version": "76.*", + "strict_min_version": "76.0" } - } + }, + "langpack_id": "sv-SE", + "name": "Svenska (SE) Language Pack", + "description": "Language pack for Thunderbird for sv-SE", + "version": "76.0buildid20200420212409", + "author": "Mozilla-sv (contributors: Andreas Pettersson)" } diff --git a/thunderbird-l10n/tr/chrome/tr/locale/tr/devtools/client/debugger.properties b/thunderbird-l10n/tr/chrome/tr/locale/tr/devtools/client/debugger.properties index 25224f5a2a06b717b4572d6048f767473ef50111..ce80248983731aa87e9bb3f6abfc391ff11524fd 100644 --- a/thunderbird-l10n/tr/chrome/tr/locale/tr/devtools/client/debugger.properties +++ b/thunderbird-l10n/tr/chrome/tr/locale/tr/devtools/client/debugger.properties @@ -55,6 +55,41 @@ setDirectoryRoot.accesskey=k removeDirectoryRoot.label=Dizin kökünü kaldır removeDirectoryRoot.accesskey=d +# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item +blackBoxAll.label=Kara kutuya al + +# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected group +blackBoxAllInGroup.label=Bu gruptaki dosyaları kara kutuya al + +# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected group +unblackBoxAllInGroup.label=Bu gruptaki dosyaları kara kutudan çıkar + +# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected group +blackBoxAllOutsideGroup.label=Bu grup dışındaki dosyaları kara kutuya al + +# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to unblackbox all files outside of the selected group +unblackBoxAllOutsideGroup.label=Bu grup dışındaki dosyaları kara kutudan çıkar + +# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected directory +blackBoxAllInDir.label=Bu klasördeki dosyaları kara kutuya al + +# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected directory +unblackBoxAllInDir.label=Bu klasördeki dosyaları kara kutudan çıkar + +# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected directory +blackBoxAllOutsideDir.label=Bu klasör dışındaki dosyaları kara kutuya al + +# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the +# context submenu to unblackbox all files outside of the selected directory +unblackBoxAllOutsideDir.label=Bu klasör dışındaki dosyaları kara kutudan çıkar + # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the # context menu to copy the function the user selected copyFunction.label=Fonksiyonu kopyala @@ -1054,11 +1089,6 @@ whyPaused.mutationBreakpointRemoved=Kaldırıldı: # a JS execution whyPaused.interrupted=Yürütme sırasında duraklatıldı -# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed -# in a info block explaining how the debugger is currently paused in a -# recording. -whyPaused.replayForcedPause=Kayıtta duraklatıldı - # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed # in a info block explaining how the debugger is currently paused while stepping # in or out of the stack @@ -1287,30 +1317,3 @@ serviceWorkerInfo.redundant=gereksiz # LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a # service worker that is in an unknown state. serviceWorkerInfo.unknown=bilinmiyor - -# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item -blackBoxAll.label=Blackbox -# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the -# context submenu to blackbox all files inside of the selected group -blackBoxAllInGroup.label=Blackbox files in this group -# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the -# context submenu to unblackbox all files inside of the selected group -unblackBoxAllInGroup.label=Unblackbox files in this group -# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the -# context submenu to blackbox all files outside of the selected group -blackBoxAllOutsideGroup.label=Blackbox files outside this group -# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the -# context submenu to unblackbox all files outside of the selected group -unblackBoxAllOutsideGroup.label=Unblackbox files outside this group -# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the -# context submenu to blackbox all files inside of the selected directory -blackBoxAllInDir.label=Blackbox files in this directory -# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the -# context submenu to unblackbox all files inside of the selected directory -unblackBoxAllInDir.label=Unblackbox files in this directory -# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the -# context submenu to blackbox all files outside of the selected directory -blackBoxAllOutsideDir.label=Blackbox files outside this directory -# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the -# context submenu to unblackbox all files outside of the selected directory -unblackBoxAllOutsideDir.label=Unblackbox files outside this directory diff --git a/thunderbird-l10n/tr/chrome/tr/locale/tr/devtools/client/netmonitor.properties b/thunderbird-l10n/tr/chrome/tr/locale/tr/devtools/client/netmonitor.properties index 63b28b02770305beab849cd5a16ff807bad1d3cf..33d1b23b32bf54eb29d0b2901a3c6a9879dcbabe 100644 --- a/thunderbird-l10n/tr/chrome/tr/locale/tr/devtools/client/netmonitor.properties +++ b/thunderbird-l10n/tr/chrome/tr/locale/tr/devtools/client/netmonitor.properties @@ -765,6 +765,13 @@ netmonitor.ws.context.received=Alınan # for the "Received" menu item displayed in the context menu in the websocket toolbar. netmonitor.ws.context.received.accesskey=A +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed +# on the context menu that shows "Control Frames" WebSocket frames. + +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key +# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. +netmonitor.ws.context.controlFrames.accesskey=o + # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed # on the context menu that shows "Copy Message". netmonitor.ws.context.copyFrame=Mesajı kopyala @@ -1529,6 +1536,3 @@ netmonitor.cache.device=Cihaz # LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed # on the context menu that shows "Control Frames" WebSocket frames. netmonitor.ws.context.controlFrames=Control -# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key -# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. -netmonitor.ws.context.controlFrames.accesskey=o diff --git a/thunderbird-l10n/tr/localization/tr/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/tr/localization/tr/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..4730cc2c92c566415d8b1e8c9fe1364cbf398c7c --- /dev/null +++ b/thunderbird-l10n/tr/localization/tr/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Takvim URI Yönlendirmesi +calendar-uri-redirect-description = + Sunucu, "{ $calendarName }" takviminin URI'sini yeniden yönlendiriyor. + Yönlendirmeyi kabul edip bu takvim için yeni URI'yi kullanmaya başlamak ister misiniz? +calendar-uri-redirect-original-uri-label = Mevcut URI: +calendar-uri-redirect-target-uri-label = Yönlendirilen yeni URI: diff --git a/thunderbird-l10n/tr/localization/tr/calendar/calendar-widgets.ftl b/thunderbird-l10n/tr/localization/tr/calendar/calendar-widgets.ftl new file mode 100644 index 0000000000000000000000000000000000000000..d6759d59afb5087c565c61f14b9a6fc7078ecf5b --- /dev/null +++ b/thunderbird-l10n/tr/localization/tr/calendar/calendar-widgets.ftl @@ -0,0 +1,6 @@ +# 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/. + +calendar-deactivated-notification-events = Şu anda tüm takvimler devre dışı. Etkinlik oluşturmak ve düzenlemek için bir takvimi etkinleştirin veya yeni takvim ekleyin. +calendar-deactivated-notification-tasks = Şu anda tüm takvimler devre dışı. Görev oluşturmak ve düzenlemek için bir takvimi etkinleştirin veya yeni takvim ekleyin. diff --git a/thunderbird-l10n/tr/localization/tr/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/tr/localization/tr/devtools/client/aboutdebugging.ftl index 441f8602f52c71a612af4465426565373389fdae..ea2893c0bf1f762eddb2f88d6f324bd77ee8aa15 100644 --- a/thunderbird-l10n/tr/localization/tr/devtools/client/aboutdebugging.ftl +++ b/thunderbird-l10n/tr/localization/tr/devtools/client/aboutdebugging.ftl @@ -186,6 +186,9 @@ about-debugging-browser-version-too-old = Bağlı tarayıcının sürümü eski # backward compatible changes broke the debugger in those scenarios (Bug 1528219). # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1") about-debugging-browser-version-too-old-67-debugger = Hata ayıklayıcı paneli bağlı tarayıcıyla çalışmayabilir. Bu tarayıcıyla hata ayıklayıcıyı kullanmak istiyorsanız lütfen Firefox { $runtimeVersion } sürümünü kullanın. +# Dedicated message for a backward compatibility issue that occurs when connecting: +# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68. +about-debugging-browser-version-too-old-fennec = Firefox'un bu sürümü Android için Firefox'ta (68) hata ayıklayamıyor. Test için Firefox'un Android Nightly sürümünü telefonunuza yüklemenizi öneririz. <a>Daha fazla bilgi</a> # This string is displayed in the runtime page if the remote browser version is too recent. # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd) diff --git a/thunderbird-l10n/tr/localization/tr/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/tr/localization/tr/toolkit/about/aboutAddons.ftl index bc431bd209350c494faea61ccfa9a3a40cc77503..8673aa4d40fac2df4d5870c7863866140ba45ae5 100644 --- a/thunderbird-l10n/tr/localization/tr/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/tr/localization/tr/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Dosyadan eklenti kur... .accesskey = k help-button = Eklenti desteği +sidebar-help-button-title = + .title = Eklenti desteği preferences = { PLATFORM() -> [windows] { -brand-short-name } seçenekleri @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Tüm eklentiler için araçlar +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } seçenekleri + *[other] { -brand-short-name } tercihleri + } show-unsigned-extensions-button = .label = Bazı eklentiler doğrulanamadı show-all-extensions-button = @@ -168,13 +176,29 @@ extensions-view-available-updates = .name = Mevcut güncellemeler .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Öneriler +addon-category-discover-title = + .title = Öneriler addon-category-extension = Eklentiler +addon-category-extension-title = + .title = Eklentiler addon-category-theme = Temalar +addon-category-theme-title = + .title = Temalar addon-category-plugin = Yan uygulamalar +addon-category-plugin-title = + .title = Yan uygulamalar addon-category-dictionary = Sözlükler +addon-category-dictionary-title = + .title = Sözlükler addon-category-locale = Diller +addon-category-locale-title = + .title = Diller addon-category-available-updates = Mevcut güncellemeler +addon-category-available-updates-title = + .title = Mevcut güncellemeler addon-category-recent-updates = Yakın zamandaki güncellemeler +addon-category-recent-updates-title = + .title = Yakın zamandaki güncellemeler ## These are global warnings @@ -287,6 +311,7 @@ shortcuts-no-commands = Aşağıdaki eklentilerin kısayolları yok: shortcuts-input = .placeholder = Bir kısayol girin shortcuts-browserAction = Eklentiyi etkinleştir +shortcuts-browserAction2 = Araç çubuğu düğmesini etkinleştir shortcuts-pageAction = Sayfa eylemini etkinleştir shortcuts-sidebarAction = Kenar çubuğunu aç/kapat shortcuts-modifier-mac = Ctrl, Alt veya ⌘ kullanmalısınız @@ -312,6 +337,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Daha az göster go-back-button = .tooltiptext = Geri dön +header-back-button = + .title = Geri dön ## Recommended add-ons page diff --git a/thunderbird-l10n/tr/localization/tr/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/tr/localization/tr/toolkit/about/aboutSupport.ftl index 9ab3b5a0d7961b439c54e9ede71b921f61f10d21..56d1924aa7a77054fac36ec08cd637d07295097e 100644 --- a/thunderbird-l10n/tr/localization/tr/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/tr/localization/tr/toolkit/about/aboutSupport.ftl @@ -287,6 +287,11 @@ sandbox-proc-type-content = içerik sandbox-proc-type-file = dosya içeriği sandbox-proc-type-media-plugin = ortam yan uygulaması sandbox-proc-type-data-decoder = veri çözücü +startup-cache-title = Başlangıç önbelleği +startup-cache-disk-cache-path = Disk önbellek yolu +startup-cache-ignore-disk-cache = Disk önbelleğini yok say +startup-cache-found-disk-cache-on-init = Başlangıçta disk önbelleği bulundu +startup-cache-wrote-to-disk-cache = Disk önbelleğine yazıldı launcher-process-status-0 = Etkin launcher-process-status-1 = Hata nedeniyle devre dışı launcher-process-status-2 = Zorla devre dışı bırakıldı diff --git a/thunderbird-l10n/tr/localization/tr/toolkit/global/processTypes.ftl b/thunderbird-l10n/tr/localization/tr/toolkit/global/processTypes.ftl index cb9fde60e6d82193064ea7c18e385a14e79279be..7efba0878b99e0bc6ab16c594f79e6ba2bf8f26c 100644 --- a/thunderbird-l10n/tr/localization/tr/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/tr/localization/tr/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = İzole web içeriği # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Soket diff --git a/thunderbird-l10n/tr/localization/tr/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/tr/localization/tr/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..088fe6c88990f1ce8606253d74e0077c915c8001 --- /dev/null +++ b/thunderbird-l10n/tr/localization/tr/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = { -brand-product-name }’un eski bir sürümünü başlattınız + .style = width: 490px; +profiledowngrade-window-create = + .label = Yeni profil oluştur +profiledowngrade-sync = { -brand-product-name }’un eski sürümlerini kullanmak, mevcut bir { -brand-product-name } profiline kaydedilmiş yer imlerinize ve gezinti geçmişinize zarar verebilir. Bilgilerinizi korumak için bu { -brand-short-name } kurulumuna özel bir profil oluşturun. İstediğiniz zaman { -fxaccount-brand-name } ile giriş yaparak profillerinizdeki yer imlerinizi ve gezinti geçmişinizi senkronize edebilirsiniz. +profiledowngrade-nosync = { -brand-product-name }’un eski sürümlerini kullanmak, mevcut bir { -brand-product-name } profiline kaydedilmiş yer imlerinize ve gezinti geçmişinize zarar verebilir. Bilgilerinizi korumak için bu { -brand-short-name } kurulumuna özel bir profil oluşturun. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Çık + *[other] Çık + } diff --git a/thunderbird-l10n/tr/manifest.json b/thunderbird-l10n/tr/manifest.json index 1849511c5bb34a2cfcff6a747b7c551749092880..55a4e4a41cdb7f11bf65d9fa578a95c4b8fd2e2f 100644 --- a/thunderbird-l10n/tr/manifest.json +++ b/thunderbird-l10n/tr/manifest.json @@ -1,57 +1,57 @@ { - "sources": { - "browser": { - "base_path": "browser/" - } - }, - "applications": { - "gecko": { - "id": "langpack-tr@thunderbird.mozilla.org", - "strict_min_version": "76.0", - "strict_max_version": "76.*" - } - }, - "author": "mozilla.org (contributors: Mozilla Türkiye takımı)", - "name": "Türkçe (TR) Language Pack", - "manifest_version": 2, - "description": "Language pack for Thunderbird for tr", - "langpack_id": "tr", "languages": { "tr": { + "version": "20200415061504", "chrome_resources": { - "messenger-smime": "chrome/tr/locale/tr/messenger-smime/", - "messenger-newsblog": "chrome/tr/locale/tr/messenger-newsblog/", - "mozldap": "chrome/tr/locale/tr/mozldap/", - "pipnss": "chrome/tr/locale/tr/pipnss/", - "devtools": "chrome/tr/locale/tr/devtools/client/", - "global": "chrome/tr/locale/tr/global/", - "necko": "chrome/tr/locale/tr/necko/", - "passwordmgr": "chrome/tr/locale/tr/passwordmgr/", "global-platform": { - "linux": "chrome/tr/locale/tr/global-platform/unix/", - "macosx": "chrome/tr/locale/tr/global-platform/mac/", "android": "chrome/tr/locale/tr/global-platform/unix/", + "macosx": "chrome/tr/locale/tr/global-platform/mac/", + "linux": "chrome/tr/locale/tr/global-platform/unix/", "win": "chrome/tr/locale/tr/global-platform/win/" }, - "branding": "chrome/tr/locale/tr/branding/", - "messenger": "chrome/tr/locale/tr/messenger/", + "messenger-newsblog": "chrome/tr/locale/tr/messenger-newsblog/", + "necko": "chrome/tr/locale/tr/necko/", + "messenger-smime": "chrome/tr/locale/tr/messenger-smime/", + "messenger-mapi": "chrome/tr/locale/tr/messenger-mapi/", "devtools-shared": "chrome/tr/locale/tr/devtools/shared/", "messenger-region": "chrome/tr/locale/tr/messenger-region/", - "communicator": "chrome/tr/locale/tr/communicator/", - "lightning": "chrome/tr/locale/tr/lightning/", - "messenger-mapi": "chrome/tr/locale/tr/messenger-mapi/", - "autoconfig": "chrome/tr/locale/tr/autoconfig/", + "global": "chrome/tr/locale/tr/global/", "pluginproblem": "chrome/tr/locale/tr/pluginproblem/", "chat": "chrome/tr/locale/tr/chat/", + "branding": "chrome/tr/locale/tr/branding/", + "devtools": "chrome/tr/locale/tr/devtools/client/", + "devtools-startup": "chrome/tr/locale/tr/devtools/startup/", + "passwordmgr": "chrome/tr/locale/tr/passwordmgr/", + "communicator": "chrome/tr/locale/tr/communicator/", + "messenger": "chrome/tr/locale/tr/messenger/", "places": "chrome/tr/locale/tr/places/", - "alerts": "chrome/tr/locale/tr/alerts/", + "lightning": "chrome/tr/locale/tr/lightning/", "pippki": "chrome/tr/locale/tr/pippki/", - "mozapps": "chrome/tr/locale/tr/mozapps/", "calendar": "chrome/tr/locale/tr/calendar/", - "devtools-startup": "chrome/tr/locale/tr/devtools/startup/" - }, - "version": "20200403080822" + "mozldap": "chrome/tr/locale/tr/mozldap/", + "autoconfig": "chrome/tr/locale/tr/autoconfig/", + "pipnss": "chrome/tr/locale/tr/pipnss/", + "alerts": "chrome/tr/locale/tr/alerts/", + "mozapps": "chrome/tr/locale/tr/mozapps/" + } + } + }, + "langpack_id": "tr", + "description": "Language pack for Thunderbird for tr", + "applications": { + "gecko": { + "strict_min_version": "76.0", + "strict_max_version": "76.*", + "id": "langpack-tr@thunderbird.mozilla.org" } }, - "version": "76.0buildid20200407173003" + "sources": { + "browser": { + "base_path": "browser/" + } + }, + "manifest_version": 2, + "author": "mozilla.org (contributors: Mozilla Türkiye takımı)", + "version": "76.0buildid20200420212409", + "name": "Türkçe (TR) Language Pack" } diff --git a/thunderbird-l10n/uk/chrome/uk/locale/uk/devtools/client/inspector.properties b/thunderbird-l10n/uk/chrome/uk/locale/uk/devtools/client/inspector.properties index 3e36e20eb8c439f9cbaba13eead3e7448b24724b..ab5ac933d82564ac16454d469791a00386560f2d 100644 --- a/thunderbird-l10n/uk/chrome/uk/locale/uk/devtools/client/inspector.properties +++ b/thunderbird-l10n/uk/chrome/uk/locale/uk/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Цей елемент має вміст, що # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=Немає пов'язаного правила +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=Утримуйте натиснутою Shift і клацніть, щоб перейти до правила + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/uk/chrome/uk/locale/uk/global/css.properties b/thunderbird-l10n/uk/chrome/uk/locale/uk/global/css.properties index 0ff6365a2c75786ebf2e437d07a991e0df48100f..02a69caa84043c24fc3780d8e81d501a332ec52c 100644 --- a/thunderbird-l10n/uk/chrome/uk/locale/uk/global/css.properties +++ b/thunderbird-l10n/uk/chrome/uk/locale/uk/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=Таблицю стилів %1$S було завантажено, PEUnexpEOF2=Неочікуваний кінець файла під час пошуку %1$S. PEParseRuleWSOnly=Для розбору правила було передано рядок, що містить лише порожні місця. + PEDeclDropped=Оголошення пропущено. PEDeclSkipped=Пропущено до наступного оголошення. PEUnknownProperty=Невідома властивість '%1$S'. @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Лише одне повторення PEMoreThanOneGridRepeatAutoFillFitInTrackList=Лише одне повторення (автозаповнення, …) чи повторення (автопідбір розмірів, …) дозволено у трек-листі. PEMoreThanOneGridRepeatTrackSize=Лише один розмір треку дозволено всередині повтору (автопідбір розмірів /auto-fill, …). +PEDisallowedImportRule=Правила @import ще не діють у створених таблицях стилів. + TooLargeDashedRadius=Надто великий радіус границі для стилю ‘dashed’ (обмеження 100000px). Візуалізація як суцільний. TooLargeDottedRadius=Надто великий радіус границі для стилю ‘dotted’ (обмеження 100000px). Візуалізація як суцільний. diff --git a/thunderbird-l10n/uk/chrome/uk/locale/uk/global/security/security.properties b/thunderbird-l10n/uk/chrome/uk/locale/uk/global/security/security.properties index e51b8665626668b5dd3a5b2de2859de12ccaa94a..7a83783a05f00651ef2145f3101690e036de9323 100644 --- a/thunderbird-l10n/uk/chrome/uk/locale/uk/global/security/security.properties +++ b/thunderbird-l10n/uk/chrome/uk/locale/uk/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = Завантаження заборонено через X-Frame-Optio # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = Завантаження заборонено через X-Frame-Options: “%1$S” з “%2$S”, сайт не дозволяє cross-origin фреймінг з “%3$S”. +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = Знайдено недійсний заголовок X-Frame-Options при завантаженні “%2$S”: “%1$S” не є дійсною директивою. +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=Завантаження “%2$S” в фреймі заборонено директивою “X-Frame-Options“, встановленою на “%1$S“. + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = Оновлення незахищеного запиту “%1$S” для використання “%2$S”. diff --git a/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/messenger.dtd b/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/messenger.dtd index 3d0801de8a9cb5465404579bca0d3cdfa51c2a34..edaaa4efcf282e1db0fe48b3b987125da9e5d87c 100644 --- a/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/messenger.dtd +++ b/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "Пошук листів…"> <!ENTITY searchMailCmd.accesskey "П"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "Глобальний пошук…"> +<!ENTITY glodaSearchCmd.accesskey "Г"> <!ENTITY searchAddressesCmd.label "Пошук адрес…"> <!ENTITY searchAddressesCmd.accesskey "а"> diff --git a/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/messengercompose/EdDialogOverlay.dtd b/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/messengercompose/EdDialogOverlay.dtd index a1511282b5955d860f45eae250564e36f3a1b34b..91a580e83c1e787ddfa98bed3ebf592913c49752 100644 --- a/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/messengercompose/EdDialogOverlay.dtd +++ b/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/messengercompose/EdDialogOverlay.dtd @@ -14,7 +14,5 @@ <!ENTITY makeUrlRelative.tooltip "Змінити абсолютний URL на відносний. Перед зміною вам потрібно зберегти сторінку."> <!-- Shared by Link and Image dialogs --> -<!ENTITY LinkURLEditField.label "Введіть адресу веб-сторінки, локального файлу або виберіть якір або заголовок з ім’ям із списку:"> -<!ENTITY LinkURLEditField.accessKey "а"> -<!ENTITY LinkURLEditField2.label "Введіть адресу веб-сторінки, локального файлу або виберіть якір чи заголовок з іменем з контекстного меню поля:"> +<!ENTITY LinkURLEditField2.label "Введіть адресу вебсторінки, локального файлу або виберіть якір чи заголовок з іменем з контекстного меню поля:"> <!ENTITY LinkURLEditField2.accessKey "а"> diff --git a/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/pgpmime.properties b/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/pgpmime.properties index 244fe15f377747c7244fde55a0b9946e69a92aba..27072b662dbb96c63b98b9d296cd850b92dd2ebb 100644 --- a/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/pgpmime.properties +++ b/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=Цей лист зашифровано з допомогою OpenPGP.<br>Щоб розшифрувати цей лист, вам потрібно встановити <a href="%S">додаток OpenPGP</a>. +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=Це зашифроване OpenPGP повідомлення, але підтримка розшифрування OpenPGP недоступна. diff --git a/thunderbird-l10n/uk/chrome/uk/locale/uk/necko/necko.properties b/thunderbird-l10n/uk/chrome/uk/locale/uk/necko/necko.properties index 5b8ba0c26944fb50bc24846f1c3246782100b3e1..e7631ee1c0c7a7b8905549f1fa7d21fa9a6b7490 100644 --- a/thunderbird-l10n/uk/chrome/uk/locale/uk/necko/necko.properties +++ b/thunderbird-l10n/uk/chrome/uk/locale/uk/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Автоматично надано # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=Автоматично надано доступ до сховища для елемента стеження “%2$S” на “%1$S”. +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=Доступ до сховища автоматично надається для основної ізоляції “%2$S” на “%1$S”. + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=Куки “%1$S” відхилено, тому що вони містять атрибут “sameSite=none”, але відсутній атрибут “secure”. # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/uk/localization/uk/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/uk/localization/uk/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..b39360439261835a96c79d56a31202f5751b4d0f --- /dev/null +++ b/thunderbird-l10n/uk/localization/uk/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Перенаправлення URI календаря +calendar-uri-redirect-description = + Сервер перенаправляє URI для календаря "{ $calendarName }". + Схвалити перенаправлення і почати використання нового URI для цього календаря? +calendar-uri-redirect-original-uri-label = Поточний URI: +calendar-uri-redirect-target-uri-label = Перенаправлення на новий URI: diff --git a/thunderbird-l10n/uk/localization/uk/messenger/accountCentral.ftl b/thunderbird-l10n/uk/localization/uk/messenger/accountCentral.ftl index 94d1b9016b1d25f78c353837bbb22b487fc3f879..7cbc3385f92507103d56954a6c50815385c8246c 100644 --- a/thunderbird-l10n/uk/localization/uk/messenger/accountCentral.ftl +++ b/thunderbird-l10n/uk/localization/uk/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = Вітаємо в { -brand-full-name } +account-settings = Налаштування облікового запису +# $accounts (Number) - the number of configured accounts setup-title = Виберіть що налаштувати about-title = Про { -brand-full-name } resources-title = Ресурси @@ -40,3 +42,10 @@ explore-link = Дослідіть можливості support-link = Підтримка involved-link = Долучитися developer-link = Документація розробника +read = Читати повідомлення +compose = Написати лист +search = Пошук повідомлень +filter = Керувати фільтрами повідомлень +nntp-subscription = Керувати підписками на групи новин +rss-subscription = Керувати підписками стрічок +e2e = Наскрізне шифрування diff --git a/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutAddons.ftl index e4379840dcdee867a19e84697c25fdc93e64c116..5969b79d872b20dca09ed620463ad4aac08ec814 100644 --- a/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Встановити додаток з файлу… .accesskey = В help-button = Підтримка додатків +sidebar-help-button-title = + .title = Підтримка додатків preferences = { PLATFORM() -> [windows] Налаштування { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Інструменти для всіх додатків +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Налаштування { -brand-short-name } + *[other] Налаштування { -brand-short-name } + } show-unsigned-extensions-button = .label = Деякі розширення не можуть бути перевірені show-all-extensions-button = @@ -173,13 +181,29 @@ extensions-view-available-updates = .name = Доступні оновлення .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Рекомендації +addon-category-discover-title = + .title = Рекомендації addon-category-extension = Розширення +addon-category-extension-title = + .title = Розширення addon-category-theme = Теми +addon-category-theme-title = + .title = Теми addon-category-plugin = Плагіни +addon-category-plugin-title = + .title = Плагіни addon-category-dictionary = Словники +addon-category-dictionary-title = + .title = Словники addon-category-locale = Мови +addon-category-locale-title = + .title = Мови addon-category-available-updates = Доступні оновлення +addon-category-available-updates-title = + .title = Доступні оновлення addon-category-recent-updates = Недавні оновлення +addon-category-recent-updates-title = + .title = Недавні оновлення ## These are global warnings @@ -292,6 +316,7 @@ shortcuts-no-commands = Такі розширення не мають комбі shortcuts-input = .placeholder = Введіть комбінацію клавіш shortcuts-browserAction = Активувати розширення +shortcuts-browserAction2 = Активувати кнопку панелі shortcuts-pageAction = Активувати дію сторінки shortcuts-sidebarAction = Перемкнути бічну панель shortcuts-modifier-mac = Додайте Ctrl, Alt, або ⌘ @@ -318,6 +343,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Показати менше go-back-button = .tooltiptext = Повернутись назад +header-back-button = + .title = Повернутись назад ## Recommended add-ons page diff --git a/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutSupport.ftl index 595753451eec8be68b223966101feb8c4bf2e474..af62199eaf96e6274bcb57f2260646d92e7146a3 100644 --- a/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutSupport.ftl @@ -295,6 +295,11 @@ sandbox-proc-type-content = вміст sandbox-proc-type-file = вміст файлу sandbox-proc-type-media-plugin = медіаплагін sandbox-proc-type-data-decoder = декодер даних +startup-cache-title = Кеш запуску +startup-cache-disk-cache-path = Шлях дискового кешу +startup-cache-ignore-disk-cache = Ігнорувати дисковий кеш +startup-cache-found-disk-cache-on-init = Знайдено дисковий кеш в Init +startup-cache-wrote-to-disk-cache = Записано в дисковий кеш launcher-process-status-0 = Увімкнено launcher-process-status-1 = Вимкнено через збій launcher-process-status-2 = Примусово вимкнено @@ -318,6 +323,7 @@ touch-enabled = сенсорне введення увімкнено drag-enabled = перетягування смуги прокручування увімкнено keyboard-enabled = клавіатура увімкнена autoscroll-enabled = авто-прокручування увімкнено +zooming-enabled = smooth pinch-zoom увімкнено ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/uk/localization/uk/toolkit/about/certviewer.ftl b/thunderbird-l10n/uk/localization/uk/toolkit/about/certviewer.ftl index 9796a192ec0f9fab240596bf6208498b38c354c8..b740b6fddec469d88462bfa8b166356a70c1a8d7 100644 --- a/thunderbird-l10n/uk/localization/uk/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/uk/localization/uk/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (сертифікат) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (ланцюжок сертифікатів) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Це розширення було позначене критичним, тобто клієнти повинні відхилити сертифікат, якщо вони його не розуміють. +certificate-viewer-export = Експорт + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Ваші сертифікати +certificate-viewer-tab-people = Люди +certificate-viewer-tab-servers = Сервери +certificate-viewer-tab-ca = Центри сертифікації +certificate-viewer-tab-unkonwn = Невідомо diff --git a/thunderbird-l10n/uk/localization/uk/toolkit/global/processTypes.ftl b/thunderbird-l10n/uk/localization/uk/toolkit/global/processTypes.ftl index b1a22d72d4f66c7f098adf520fc43d59b4b46ad7..2c6c24ed81630111fe7918ea3f185b74d1d8473c 100644 --- a/thunderbird-l10n/uk/localization/uk/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/uk/localization/uk/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Ізольований веб-вміст # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Сокет diff --git a/thunderbird-l10n/uk/localization/uk/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/uk/localization/uk/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..7dff6a9b50510991e5730b6617fd51bd60f7ffd1 --- /dev/null +++ b/thunderbird-l10n/uk/localization/uk/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Ви запустили застарілу версію { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Створити новий профіль +profiledowngrade-sync = Використання застарілої версії { -brand-product-name } може пошкодити закладки та історію перегляду, що раніше збережені в наявному профілі. Для захисту інформації, створіть новий профіль для цього встановлення { -brand-short-name }. Ви завжди можете виконати вхід в { -fxaccount-brand-name } для синхронізації своїх закладок та історії перегляду між різними профілями. +profiledowngrade-nosync = Використання застарілої версії { -brand-product-name } може пошкодити закладки та історію перегляду, що раніше збережені в наявному профілі. Для захисту інформації, створіть новий профіль для цього встановлення { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Вийти + *[other] Вихід + } diff --git a/thunderbird-l10n/uk/manifest.json b/thunderbird-l10n/uk/manifest.json index 405455582542b122c4d6e03ef2e10a4bd8e27c3f..6bada154d25ea90932f9dedf12b79adb1c4b5b67 100644 --- a/thunderbird-l10n/uk/manifest.json +++ b/thunderbird-l10n/uk/manifest.json @@ -1,57 +1,57 @@ { - "description": "Language pack for Thunderbird for uk", - "langpack_id": "uk", - "version": "76.0buildid20200407173003", - "sources": { - "browser": { - "base_path": "browser/" - } - }, - "manifest_version": 2, + "version": "76.0buildid20200420212409", + "author": "mozilla.org (contributors: Артем Поліванчук, Сергій Хоружин, Тимофій Бабич, Тимур Фараджев)", "applications": { "gecko": { - "strict_min_version": "76.0", "strict_max_version": "76.*", - "id": "langpack-uk@thunderbird.mozilla.org" + "id": "langpack-uk@thunderbird.mozilla.org", + "strict_min_version": "76.0" } }, - "author": "mozilla.org (contributors: Артем Поліванчук, Сергій Хоружин, Тимофій Бабич, Тимур Фараджев)", - "name": "Ukrainian (UA) Language Pack", "languages": { "uk": { - "version": "20200403201442", "chrome_resources": { - "messenger-newsblog": "chrome/uk/locale/uk/messenger-newsblog/", + "passwordmgr": "chrome/uk/locale/uk/passwordmgr/", "devtools-shared": "chrome/uk/locale/uk/devtools/shared/", + "communicator": "chrome/uk/locale/uk/communicator/", + "pipnss": "chrome/uk/locale/uk/pipnss/", + "devtools-startup": "chrome/uk/locale/uk/devtools/startup/", + "places": "chrome/uk/locale/uk/places/", "global": "chrome/uk/locale/uk/global/", - "chat": "chrome/uk/locale/uk/chat/", - "mozldap": "chrome/uk/locale/uk/mozldap/", - "branding": "chrome/uk/locale/uk/branding/", - "mozapps": "chrome/uk/locale/uk/mozapps/", + "messenger": "chrome/uk/locale/uk/messenger/", + "alerts": "chrome/uk/locale/uk/alerts/", "pluginproblem": "chrome/uk/locale/uk/pluginproblem/", - "necko": "chrome/uk/locale/uk/necko/", - "pippki": "chrome/uk/locale/uk/pippki/", "messenger-mapi": "chrome/uk/locale/uk/messenger-mapi/", "calendar": "chrome/uk/locale/uk/calendar/", + "messenger-newsblog": "chrome/uk/locale/uk/messenger-newsblog/", + "pippki": "chrome/uk/locale/uk/pippki/", + "necko": "chrome/uk/locale/uk/necko/", + "messenger-region": "chrome/uk/locale/uk/messenger-region/", + "mozapps": "chrome/uk/locale/uk/mozapps/", + "branding": "chrome/uk/locale/uk/branding/", + "devtools": "chrome/uk/locale/uk/devtools/client/", + "lightning": "chrome/uk/locale/uk/lightning/", + "messenger-smime": "chrome/uk/locale/uk/messenger-smime/", + "mozldap": "chrome/uk/locale/uk/mozldap/", + "autoconfig": "chrome/uk/locale/uk/autoconfig/", "global-platform": { - "macosx": "chrome/uk/locale/uk/global-platform/mac/", - "linux": "chrome/uk/locale/uk/global-platform/unix/", + "win": "chrome/uk/locale/uk/global-platform/win/", "android": "chrome/uk/locale/uk/global-platform/unix/", - "win": "chrome/uk/locale/uk/global-platform/win/" + "macosx": "chrome/uk/locale/uk/global-platform/mac/", + "linux": "chrome/uk/locale/uk/global-platform/unix/" }, - "places": "chrome/uk/locale/uk/places/", - "lightning": "chrome/uk/locale/uk/lightning/", - "autoconfig": "chrome/uk/locale/uk/autoconfig/", - "devtools": "chrome/uk/locale/uk/devtools/client/", - "pipnss": "chrome/uk/locale/uk/pipnss/", - "messenger": "chrome/uk/locale/uk/messenger/", - "alerts": "chrome/uk/locale/uk/alerts/", - "devtools-startup": "chrome/uk/locale/uk/devtools/startup/", - "messenger-region": "chrome/uk/locale/uk/messenger-region/", - "messenger-smime": "chrome/uk/locale/uk/messenger-smime/", - "communicator": "chrome/uk/locale/uk/communicator/", - "passwordmgr": "chrome/uk/locale/uk/passwordmgr/" - } + "chat": "chrome/uk/locale/uk/chat/" + }, + "version": "20200416120505" } - } + }, + "langpack_id": "uk", + "name": "Ukrainian (UA) Language Pack", + "sources": { + "browser": { + "base_path": "browser/" + } + }, + "manifest_version": 2, + "description": "Language pack for Thunderbird for uk" } diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/aboutdebugging.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/aboutdebugging.properties index 1df3ffd9e1fda776eca32b5c4b081f6ac32f1b15..64d07973f5ccea64996c9dabc72eda23ad351d22 100644 --- a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/aboutdebugging.properties +++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/aboutdebugging.properties @@ -49,10 +49,13 @@ addonDebugging.tooltip = Bu funksiyani yoqib qo‘ysangiz, qo‘shimcha dastur v # the MDN documentation page for about:debugging. # (https://developer.mozilla.org/docs/Tools/about:debugging#Enabling_add-on_debugging) -# LOCALIZATION NOTE (loadTemporaryAddon): +# LOCALIZATION NOTE (loadTemporaryAddon2): # This string is displayed as a label of a button that allows the user to # load additional add-ons. -loadTemporaryAddon = Vaqtinchalik qo‘shimcha dasturni yuklash + +# LOCALIZATION NOTE (addonInstallError): +# This string is displayed when an error occurs while installing an addon. +# %S will be replaced with the error message. # LOCALIZATION NOTE (retryTemporaryInstall): # This string is displayed as a label of a button that allows the user to @@ -65,6 +68,9 @@ extensions = Kengaytmalar # LOCALIZATION NOTE (temporaryExtensions): # This string is displayed as a header above the list of temporarily loaded add-ons. +# LOCALIZATION NOTE (systemExtensions): +# This string is displayed as a header above the list of system add-ons. + # LOCALIZATION NOTE (internalUUID): # This string is displayed as a label for the internal UUID of an extension. # The UUID is generated for this profile on install. @@ -93,6 +99,13 @@ extensions = Kengaytmalar # This string is displayed as a link next to the temporaryID message and leads # the user to MDN. +# LOCALIZATION NOTE (legacyExtensionWarning): +# This string is displayed as a warning message when loading a temporary legacy extension. + +# LOCALIZATION NOTE (legacyExtensionWarning.learnMore): +# This string is displayed as a link next to the legacyExtensionWarning message and leads +# the user to https://wiki.mozilla.org/Add-ons/Future_of_Bootstrap. + # LOCALIZATION NOTE (selectAddonFromFile2): # This string is displayed as the title of the file picker that appears when # the user clicks the 'Load Temporary Add-on' button @@ -129,7 +142,7 @@ otherWorkers = Other Workers # LOCALIZATION NOTE (tabs): # This string is displayed as a header of the about:debugging#tabs page. -tabs = Ichki oynalar +tabs = Varaqlar # LOCALIZATION NOTE (pageNotFound): # This string is displayed as the main message at any error/invalid page. @@ -159,14 +172,14 @@ nothing = Hozircha hech narsa yo‘q. # This string is displayed as a warning message on top of the about:debugging#workers # page when multi-e10s is enabled -# LOCALIZATION NOTE (multiProcessWarningMessage): +# LOCALIZATION NOTE (multiProcessWarningMessage2): # This string is displayed in the warning section for multi-e10s in # about:debugging#workers -# LOCALIZATION NOTE (multiProcessWarningLink): +# LOCALIZATION NOTE (multiProcessWarningUpdateLink2): # This string is the text content of a link in the warning section for multi-e10s in # about:debugging#workers. The link updates the pref and restarts the browser. -# LOCALIZATION NOTE (multiProcessWarningConfirmUpdate): +# LOCALIZATION NOTE (multiProcessWarningConfirmUpdate2): # This string is displayed as a confirmation message when the user clicks on # the multiProcessWarningUpdateLink in about:debugging#workers diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/connection-screen.dtd b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/connection-screen.dtd index b8493089ac4bf662bb68fbc7a751f3c73d06588b..6404f08c5bc20f045ff058b58289f1ce9b45fe4c 100644 --- a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/connection-screen.dtd +++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/connection-screen.dtd @@ -1,29 +1,29 @@ <!-- 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/. --> + <!-- LOCALIZATION NOTE : FILE This file contains the Remote Connection strings. - The Remote Connection window can reached from the "connect…" menuitem - in the Web Developer menu. - --> - <!ENTITY title "Ulanish"> <!ENTITY header "Masofadagi qurilmaga ulanish."> <!ENTITY host "Host:"> <!ENTITY port "Port:"> <!ENTITY connect "Ulanish"> <!ENTITY connecting "Ulanmoqda..."> -<!ENTITY availableAddons "Mavjud masofadagi ichki oynalar:"> -<!ENTITY availableTabs "Mavjud masofadagi ichki oynalar:"> +<!ENTITY availableAddons "Mavjud masofadagi varaqlar:"> +<!ENTITY availableTabs "Mavjud masofadagi varaqlar:"> <!ENTITY availableProcesses "Mavjud masofadagi jarayonlar:"> <!ENTITY connectionError "Xato:"> <!ENTITY errorTimeout "Xato: ulanish vaqti o‘tib ketdi"> <!ENTITY errorRefused "Xato: ulanish rad etildi."> <!ENTITY errorUnexpected "Kutilmagan xato."> + <!-- LOCALIZATION NOTE (remoteHelp, remoteDocumentation, remoteHelpSuffix): these strings will be concatenated in a single label, remoteDocumentation will be used as text for a link to MDN. --> - <!ENTITY remoteHelp "Firefox dasturlash asboblari masofadagi qurilmalarni (masalan, Android va Firefox OS uchun Firefox) tuzata oladi. Masofadagi qurilmada "Masofadan tuzatish"ni yoqib qo‘yilganligiga ishonch hosil qiling. Ko‘proq ma’lumot olish uchun "> <!ENTITY remoteDocumentation "qo‘llanmani ko‘ring"> <!ENTITY remoteHelpSuffix "."> diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/debugger.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/debugger.properties index 2913fb96cad86d850111dd040932872c5d15caac..d15526c4f57b902cc20f7d7e55fd897313758290 100644 --- a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/debugger.properties +++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/debugger.properties @@ -10,25 +10,76 @@ # A good criteria is the language in which you'd find the best # documentation on web development on the web. -# LOCALIZATION NOTE (collapsePanes): This is the tooltip for the button -# that collapses the left and right panes in the debugger UI. -collapsePanes=Panellarni yig‘ish +# LOCALIZATION NOTE (collapseSources): This is the tooltip for the button +# that collapses the Sources and Outlines panes in the debugger UI. + +# LOCALIZATION NOTE (collapseBreakpoints): This is the tooltip for the button +# that collapses the Breakpoints panes in the debugger UI. + +# LOCALIZATION NOTE (copyToClipboard.label): This is the text that appears in the +# context menu to copy the complete source of the open file. + +# LOCALIZATION NOTE (copySource.label): This is the text that appears in the +# context menu to copy the selected source of file open. + +# LOCALIZATION NOTE (copySource.label): This is the text that appears in the +# context menu to copy the selected source of file open. + +# LOCALIZATION NOTE (copySourceUri2): This is the text that appears in the +# context menu to copy the source URI of file open. + +# LOCALIZATION NOTE (collapseAll.label): This is the text that appears in the +# context menu to collapse a directory and all of its subdirectories. + +# LOCALIZATION NOTE (expandAll.label): This is the text that appears in the +# context menu to expand a directory and all of its subdirectories. + +# LOCALIZATION NOTE (setDirectoryRoot.label): This is the text that appears in the +# context menu to set a directory as root directory + +# LOCALIZATION NOTE (removeDirectoryRoot.label): This is the text that appears in the +# context menu to remove a directory as root directory + +# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item + +# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected group + +# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected group + +# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected group + +# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the +# context submenu to unblackbox all files outside of the selected group -# LOCALIZATION NOTE (copySourceUrl): This is the text that appears in the -# context menu to copy the source URL of file open. +# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the +# context submenu to blackbox all files inside of the selected directory -# LOCALIZATION NOTE (copySourceUrl.accesskey): Access key to copy the source URL of a file from -# the context menu. +# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the +# context submenu to unblackbox all files inside of the selected directory + +# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the +# context submenu to blackbox all files outside of the selected directory + +# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the +# context submenu to unblackbox all files outside of the selected directory + +# LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the +# context menu to copy the function the user selected # LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the # context menu to copy the stack trace methods, file names and row number. -# LOCALIZATION NOTE (copyStackTrace.accesskey): Access key to copy the stack trace data from -# the context menu. +# LOCALIZATION NOTE (expandSources): This is the tooltip for the button +# that expands the Sources and Outlines panes in the debugger UI. + +# LOCALIZATION NOTE (expandBreakpoints): This is the tooltip for the button +# that expands the Breakpoints panes in the debugger UI. -# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button -# that expands the left and right panes in the debugger UI. -expandPanes=Panellarni yoyish +# LOCALIZATION NOTE (evaluateInConsole.label): Editor right-click menu item +# to execute selected text in browser console. # LOCALIZATION NOTE (pauseButtonTooltip): The tooltip that is displayed for the pause # button when the debugger is in a running state. @@ -49,6 +100,38 @@ pausePendingButtonTooltip=Keyingi bajarish kutilmoqda # LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the # button that steps out of a function call. +# LOCALIZATION NOTE (skipPausingTooltip.label): The tooltip text for disabling all +# breakpoints and pausing triggers + +# LOCALIZATION NOTE (undoSkipPausingTooltip.label): The tooltip text for enabling all +# breakpoints and pausing triggers + +# LOCALIZATION NOTE (pauseButtonItem): The label that is displayed for the dropdown pause +# list item when the debugger is in a running state. + +# LOCALIZATION NOTE (ignoreExceptionsItem): The pause on exceptions button description +# when the debugger will not pause on exceptions. + +# LOCALIZATION NOTE (pauseOnUncaughtExceptionsItem): The pause on exceptions dropdown +# item shown when a user is adding a new breakpoint. + +# LOCALIZATION NOTE (pauseOnExceptionsItem2): The pause on exceptions checkbox description +# when the debugger will pause on all exceptions. + +# LOCALIZATION NOTE (ignoreCaughtExceptionsItem): The pause on exceptions checkbox description +# when the debugger will not pause on any caught exception + +# LOCALIZATION NOTE (pauseOnCaughtExceptionsItem): The pause on exceptions checkbox description +# when the debugger should pause on caught exceptions + +# LOCALIZATION NOTE (workersHeader): The text to display in the events +# header. + +# LOCALIZATION NOTE (threadsHeader): The text to describe the threads header + +# LOCALIZATION NOTE (mainThread): The text to describe the thread of the +# program as opposed to worker threads. + # LOCALIZATION NOTE (noWorkersText): The text to display in the workers list # when there are no workers. noWorkersText=Bu sahifada workers yo‘q. @@ -117,35 +200,115 @@ otherEvents=Boshqa # the user hovers over the checkbox used to toggle blackboxing its associated # source. +# LOCALIZATION NOTE (eventListenersHeader1): The text to display in the events +# header. + +# LOCALIZATION NOTE (noDomMutationBreakpoints): The text to +# display in the DOM Mutation Breakpoints pane when there are no events. +# %S will be replaced by an active link using inspectorTool as text + +# LOCALIZATION NOTE (inspectorTool): The text to describe the the Inspector tool + +# LOCALIZATION NOTE (eventListenersHeader1.placeholder): The placeholder text in +# the event search input bar + +# LOCALIZATION NOTE (domMutationHeader): The text to display in the +# DOM Mutation Breakpoints header + +# LOCALIZATION NOTE (domMutationTypes.attribute): The text to display in the +# DOM Mutation Breakpoints panel for an attribute change + +# LOCALIZATION NOTE (domMutationTypes.removal): The text to display in the +# DOM Mutation Breakpoints panel for a DOM node removal + +# LOCALIZATION NOTE (domMutationTypes.subtree): The text to display in the +# DOM Mutation Breakpoints panel for a DOM subtree change + # LOCALIZATION NOTE (sources.search.key2): Key shortcut to open the search for # searching all the source files the debugger has seen. +# Do not localize "CmdOrCtrl+P", or change the format of the string. These are +# key identifiers, not messages displayed to the user. # LOCALIZATION NOTE (sources.search.alt.key): A second key shortcut to open the # search for searching all the source files the debugger has seen. +# Do not localize "CmdOrCtrl+O", or change the format of the string. These are +# key identifiers, not messages displayed to the user. # LOCALIZATION NOTE (projectTextSearch.key): A key shortcut to open the # full project text search for searching all the files the debugger has seen. +# Do not localize "CmdOrCtrl+Shift+F", or change the format of the string. These are +# key identifiers, not messages displayed to the user. + +# LOCALIZATION NOTE (allShortcut.key): A key shortcut to open the +# modal of full shortcuts list. +# Do not localize "CmdOrCtrl+/", or change the format of the string. These are +# key identifiers, not messages displayed to the user. + +# LOCALIZATION NOTE (functionSearch.key): A key shortcut to open the +# modal for searching functions in a file. +# Do not localize "CmdOrCtrl+Shift+O", or change the format of the string. These are +# key identifiers, not messages displayed to the user. + +# LOCALIZATION NOTE (toggleBreakpoint.key): A key shortcut to toggle +# breakpoints. +# Do not localize "CmdOrCtrl+B", or change the format of the string. These are +# key identifiers, not messages displayed to the user. + +# LOCALIZATION NOTE (toggleCondPanel.breakpoint.key): A key shortcut to toggle +# the conditional panel for breakpoints. +# Do not localize "CmdOrCtrl+Shift+B", or change the format of the string. These are +# key identifiers, not messages displayed to the user. + +# LOCALIZATION NOTE (toggleCondPanel.logPoint.key): A key shortcut to toggle +# the conditional panel for log points. +# Do not localize "CmdOrCtrl+Shift+Y", or change the format of the string. These are +# key identifiers, not messages displayed to the user. + +# LOCALIZATION NOTE (stepOut.key): A key shortcut to +# step out. + +# LOCALIZATION NOTE (shortcuts.header.editor): Sections header in +# the shortcuts modal for keyboard shortcuts related to editing. + +# LOCALIZATION NOTE (shortcuts.header.stepping): Sections header in +# the shortcuts modal for keyboard shortcuts related to stepping. + +# LOCALIZATION NOTE (shortcuts.header.search): Sections header in +# the shortcuts modal for keyboard shortcuts related to search. + +# LOCALIZATION NOTE (projectTextSearch.placeholder): A placeholder shown +# when searching across all of the files in a project. + +# LOCALIZATION NOTE (projectTextSearch.noResults): The center pane Text Search +# message when the query did not match any text of all files in a project. # LOCALIZATION NOTE (sources.noSourcesAvailable): Text shown when the debugger # does not have any sources. -# LOCALIZATION NOTE (sourcesPane.showSourcesTooltip): The tooltip shown when -# the user will navigate to the source tree view. - -# LOCALIZATION NOTE (sourcesPane.showOutlineTooltip): The tooltip shown when -# the user will navigate to the source outline view. +# LOCALIZATION NOTE (sources.noSourcesAvailableRoot): Text shown when the debugger +# does not have any sources under a specific directory root. # LOCALIZATION NOTE (sourceSearch.search.key2): Key shortcut to open the search # for searching within a the currently opened files in the editor +# Do not localize "CmdOrCtrl+F", or change the format of the string. These are +# key identifiers, not messages displayed to the user. +sourceSearch.search.key2=CmdOrCtrl+F # LOCALIZATION NOTE (sourceSearch.search.placeholder): placeholder text in # the source search input bar +# LOCALIZATION NOTE (sourceSearch.search.placeholder2): placeholder text in +# the source search input bar + # LOCALIZATION NOTE (sourceSearch.search.again.key2): Key shortcut to highlight # the next occurrence of the last search triggered from a source search +# Do not localize "CmdOrCtrl+G", or change the format of the string. These are +# key identifiers, not messages displayed to the user. # LOCALIZATION NOTE (sourceSearch.search.againPrev.key2): Key shortcut to highlight # the previous occurrence of the last search triggered from a source search +# Do not localize "CmdOrCtrl+Shift+G", or change the format of the string. These are +# key identifiers, not messages displayed to the user. # LOCALIZATION NOTE (sourceSearch.resultsSummary1): Shows a summary of # the number of matches for autocomplete @@ -178,9 +341,12 @@ searchPanelGlobal=Barcha fayllar ichidan izlash (%S) # filter panel popup for the function search operation. searchPanelFunction=Funksiyalarni aniqlashni izlash (%S) +# LOCALIZATION NOTE (searchPanelFunction2): This is the text that appears in the +# filter panel popup for the function search operation. + # LOCALIZATION NOTE (searchPanelToken): This is the text that appears in the # filter panel popup for the token search operation. -searchPanelToken=Ushbu sahifadan topish (%S) +searchPanelToken=%S fayli ichidan topish # LOCALIZATION NOTE (searchPanelGoToLine): This is the text that appears in the # filter panel popup for the line search operation. @@ -190,9 +356,29 @@ searchPanelGoToLine=Qatorga o‘tish (%S) # filter panel popup for the variables search operation. searchPanelVariable=O‘zgaruvchan qiymatlar filteri (%S) +# LOCALIZATION NOTE (sourceSearch.search.again.key3): Key shortcut to highlight +# the next occurrence of the last search triggered from a source search +# Do not localize "Cmd+G", or change the format of the string. These are +# key identifiers, not messages displayed to the user. + +# LOCALIZATION NOTE (sourceSearch.search.againPrev.key3): Key shortcut to highlight +# the previous occurrence of the last search triggered from a source search +# Do not localize "Cmd+Shift+G", or change the format of the string. These are +# key identifiers, not messages displayed to the user. + +# LOCALIZATION NOTE (sourceSearch.resultsSummary2): Semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# Shows a summary of the number of matches for autocomplete + +# LOCALIZATION NOTE (breakpointHeadingMenuItem.*): The text for all the elements +# that are displayed in the breakpoint headings menu item popup. + # LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that # are displayed in the breakpoints menu item popup. breakpointMenuItem.setConditional=Muhit to‘xtash nuqtasini moslash + +# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that +# are displayed in the breakpoints menu item popup. breakpointMenuItem.enableSelf=To‘xtash nuqtasini yoqib qo‘yish breakpointMenuItem.disableSelf=To‘xtash nuqtasini o‘chirib qo‘yish breakpointMenuItem.deleteSelf=To‘xtash nuqtasini olib tashlash @@ -228,12 +414,31 @@ breakpointMenuItem.deleteAll=Barcha to‘xtash nuqtalarini olib tashlash # LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane # message to show more of the frames. +# LOCALIZATION NOTE (callStack.group.expandTooltip): The text that will appear +# when hovering a collapsed Group of frames in the callStack panel. `frames` is +# always plural since a group can only exist if it contain more that 1 frame. +# %S is replaced by the name of the library of the frames in the group. +# example: `Show React frames`. + +# LOCALIZATION NOTE (callStack.group.collapseTooltip): The text that will appear +# when hovering an expanded Group of frames in the callStack panel. `frames` is +# always plural since a group can only exist if it contain more that 1 frame. +# %S is replaced by the name of the library of the frames in the group. +# example: `Collapse React frames`. + +# LOCALIZATION NOTE (components.header): Header for the +# Framework Components pane in the right sidebar. + # LOCALIZATION NOTE (editor.searchResults): Editor Search bar message # for the summarizing the selected search result. e.g. 5 of 10 results. -# LOCALIZATION NOTE (sourceSearch.singleResult): Copy shown when there is one result. +# LOCALIZATION NOTE (editor.singleResult): Copy shown when there is one result. + +# LOCALIZATION NOTE (editor.searchResults1): Semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# Editor Search bar message to summarize the selected search result. e.g. 5 of 10 results. -# LOCALIZATION NOTE (editor.noResults): Editor Search bar message +# LOCALIZATION NOTE (editor.noResultsFound): Editor Search bar message # for when no results found. # LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar @@ -245,6 +450,9 @@ breakpointMenuItem.deleteAll=Barcha to‘xtash nuqtalarini olib tashlash # LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for # toggling search type buttons(function search, variable search) +# LOCALIZATION NOTE (editor.continueToHere.label): Editor gutter context +# menu item for jumping to a new paused location + # LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item # for adding a breakpoint on a line. @@ -257,33 +465,57 @@ breakpointMenuItem.deleteAll=Barcha to‘xtash nuqtalarini olib tashlash # LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item # for removing a breakpoint on a line. -# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item +# LOCALIZATION NOTE (editor.addConditionBreakpoint): Editor gutter context +# menu item for adding a breakpoint condition on a line. + +# LOCALIZATION NOTE (editor.editConditionBreakpoint): Editor gutter context menu item # for setting a breakpoint condition on a line. -# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context -# menu item for adding a breakpoint condition on a line. +# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context menu item +# for creating a breakpoint with a condition + +# LOCALIZATION NOTE (editor.addLogBreakpoint): Editor gutter context menu item +# for creating a breakpoint with a log + +# LOCALIZATION NOTE (editor.addLogPoint): Editor gutter context +# menu item for adding a log point on a line. + +# LOCALIZATION NOTE (editor.editLogPoint): Editor gutter context menu item +# for editing a log point already set on a line. + +# LOCALIZATION NOTE (editor.removeLogPoint): Context menu item for removing +# a log point on a line. -# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for +# LOCALIZATION NOTE (editor.conditionalPanel.placeholder2): Placeholder text for # input element inside ConditionalPanel component -# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Tooltip text for +# LOCALIZATION NOTE (editor.conditionalPanel.logPoint.placeholder2): Placeholder text for +# input element inside ConditionalPanel component when a log point is set + +# LOCALIZATION NOTE (editor.conditionalPanel.close): Tooltip text for # close button inside ConditionalPanel component # LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item # for navigating to a source mapped location +# LOCALIZATION NOTE (downloadFile.label): Context menu item +# for downloading a source's content + +# LOCALIZATION NOTE (inlinePreview.show.label): Context menu item +# for showing the inline preview blocks + +# LOCALIZATION NOTE (inlinePreview.hide.label): Context menu item +# for hiding the inline preview block + +# LOCALIZATION NOTE (preview.noProperties): Label shown in the preview +# popup when there are no properties to show. + # LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the # context menu to disable framework grouping. -# LOCALIZATION NOTE (framework.disableGrouping.accesskey): Access key to toggle -# framework grouping from the context menu. - # LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the # context menu to enable framework grouping. -# LOCALIZATION NOTE (framework.enableGrouping.accesskey): Access key to toggle -# framework grouping from the context menu. - # LOCALIZATION NOTE (generated): Source Map term for a server source location # LOCALIZATION NOTE (original): Source Map term for a debugger UI source location @@ -291,69 +523,81 @@ breakpointMenuItem.deleteAll=Barcha to‘xtash nuqtalarini olib tashlash # LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression # input element +# LOCALIZATION NOTE (expressions.errorMsg): Error text for expression +# input element + +# LOCALIZATION NOTE (xhrBreakpoints.header): The pause on any XHR breakpoints headings + +# LOCALIZATION NOTE (xhrBreakpoints.item.label): message displayed when reaching a breakpoint for XHR requests. %S is replaced by the path provided as condition for the breakpoint. + +# LOCALIZATION NOTE (pauseOnAnyXHR): The pause on any XHR checkbox description +# when the debugger will pause on any XHR requests. + +# LOCALIZATION NOTE (watchpoints.submenu): This is the text for the watchpoints sub-menu. + +# LOCALIZATION NOTE (watchpoints.getWatchpoint): This is the text that appears in the +# watchpoints sub-menu to add a "get" watchpoint on an object property. + +# LOCALIZATION NOTE (watchpoints.setWatchpoint): This is the text that appears in the +# watchpoints submenu to add a "set" watchpoint on an object property. + +# LOCALIZATION NOTE (watchpoints.removeWatchpoint): This is the text that appears in the +# context menu to delete a watchpoint on an object property. + +# LOCALIZATION NOTE (watchpoints.removeWatchpointTooltip): This is the text that appears in the +# tooltip to delete a watchpoint on an object property. + # LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item # for closing the selected tab below the mouse. -# LOCALIZATION NOTE (sourceTabs.closeTab.accesskey): Access key to close the currently select -# source tab from the editor context menu item. - # LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item # for closing the other tabs. -# LOCALIZATION NOTE (sourceTabs.closeOtherTabs.accesskey): Access key to close other source tabs -# from the editor context menu. - # LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item # for closing the tabs to the end (the right for LTR languages) of the selected tab. -# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd.accesskey): Access key to close source tabs -# after the selected tab from the editor context menu. - # LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item # for closing all tabs. -# LOCALIZATION NOTE (sourceTabs.closeAllTabs.accesskey): Access key to close all tabs from the -# editor context menu. - # LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item # for revealing source in tree. -# LOCALIZATION NOTE (sourceTabs.revealInTree.accesskey): Access key to reveal a source in the -# tree from the context menu. - -# LOCALIZATION NOTE (sourceTabs.copyLink): Editor source tab context menu item -# for copying a link address. - -# LOCALIZATION NOTE (sourceTabs.copyLink.accesskey): Access key to copy a link addresss from the -# editor context menu. - # LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item # for pretty printing the source. -# LOCALIZATION NOTE (sourceTabs.prettyPrint.accesskey): Access key to pretty print a source from -# the editor context menu. - # LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated # with the blackbox button # LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated # with the blackbox button -# LOCALIZATION NOTE (sourceFooter.unblackbox.accesskey): Access key to blackbox -# an associated source +# LOCALIZATION NOTE (blackboxContextItem.blackbox): Text associated +# with the blackbox context menu item + +# LOCALIZATION NOTE (blackboxContextItem.unblackbox): Text associated +# with the unblackbox context menu item + +# LOCALIZATION NOTE (sourceFooter.mappedSource): Text associated +# with a mapped source. %S is replaced by the source map origin. + +# LOCALIZATION NOTE (sourceFooter.mappedSourceTooltip): Tooltip text associated +# with a mapped source. %S is replaced by the source map origin. + +# LOCALIZATION NOTE (sourceFooter.mappedSuffix): Text associated +# with a mapped source. Displays next to URLs in tree and tabs. + +# LOCALIZATION NOTE (sourceFooter.codeCoverage): Text associated +# with a code coverage button -# LOCALIZATION NOTE (sourceFooter.blackbox.accesskey): Access key to blackbox -# an associated source +# LOCALIZATION NOTE (sourceFooter.currentCursorPosition): Text associated +# with the current cursor line and column -# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated -# with a blackboxed source +# LOCALIZATION NOTE (sourceFooter.currentCursorPosition.tooltip): Text associated +# with the current cursor line and column # LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed # for close tab button in source tabs. -# LOCALIZATION NOTE (sourceTabs.newTabButtonTooltip): The tooltip that is displayed for -# new tab button in source tabs. - # LOCALIZATION NOTE (scopes.header): Scopes right sidebar pane header. # LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message @@ -362,14 +606,43 @@ breakpointMenuItem.deleteAll=Barcha to‘xtash nuqtalarini olib tashlash # LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message # for when the debugger is not paused. +# LOCALIZATION NOTE (scopes.mapping.label): Scopes right sidebar pane +# tooltip for checkbox and label + +# LOCALIZATION NOTE (eventlisteners.log.label): Event listeners tooltip for +# checkbox and label + +# LOCALIZATION NOTE (eventlisteners.log): Checkbox label for logging events + +# LOCALIZATION NOTE (scopes.helpTooltip.label): Scopes right sidebar pane +# icon tooltip for link to MDN + +# LOCALIZATION NOTE (scopes.map.label): Checkbox label to map scopes + # LOCALIZATION NOTE (scopes.block): Refers to a block of code in # the scopes pane when the debugger is paused. # LOCALIZATION NOTE (sources.header): Sources left sidebar header +sources.header=Manbalar + +# LOCALIZATION NOTE (outline.header): Outline left sidebar header +outline.header=Kontur + +# LOCALIZATION NOTE (scopes.mapScopes): Label for toggling scope mappings + +# LOCALIZATION NOTE (outline.placeholder): Placeholder text for the filter input +# element + +# LOCALIZATION NOTE (outline.sortLabel): Label for the sort button + +# LOCALIZATION NOTE (outline.noFunctions): Outline text when there are no functions to display + +# LOCALIZATION NOTE (outline.noFileSelected): Outline text when there are no files selected # LOCALIZATION NOTE (sources.search): Sources left sidebar prompt # e.g. Cmd+P to search. On a mac, we use the command unicode character. # On windows, it's ctrl. +sources.search=%S uchun qidiruv # LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar # pane header. @@ -381,10 +654,31 @@ breakpointMenuItem.deleteAll=Barcha to‘xtash nuqtalarini olib tashlash # search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on # a mac we use the unicode character. +# LOCALIZATION NOTE (welcome.search2): The center pane welcome panel's +# search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on +# a mac we use the unicode character. + +# LOCALIZATION NOTE (welcome.findInFiles): The center pane welcome panel's +# search prompt. e.g. cmd+f to search for files. On windows, it's ctrl+shift+f, on +# a mac we use the unicode character. + +# LOCALIZATION NOTE (welcome.findInFiles2): The center pane welcome panel's +# search prompt. e.g. cmd+f to search for files. On windows, it's ctrl+shift+f, on +# a mac we use the unicode character. + +# LOCALIZATION NOTE (welcome.searchFunction): Label displayed in the welcome +# panel. %S is replaced by the keyboard shortcut to search for functions. + +# LOCALIZATION NOTE (welcome.allShortcuts): The label to open the modal of +# shortcuts, displayed in the welcome panel. + # LOCALIZATION NOTE (sourceSearch.search): The center pane Source Search # prompt for searching for files. -# LOCALIZATION NOTE (sourceSearch.noResults): The center pane Source Search +# LOCALIZATION NOTE (sourceSearch.search2): The center pane Source Search +# prompt for searching for files. + +# LOCALIZATION NOTE (sourceSearch.noResults2): The center pane Source Search # message when the query did not match any of the sources. # LOCALIZATION NOTE (ignoreExceptions): The pause on exceptions button tooltip @@ -401,9 +695,11 @@ breakpointMenuItem.deleteAll=Barcha to‘xtash nuqtalarini olib tashlash # yet. loadingText=Yuklanmoqda... -# LOCALIZATION NOTE (errorLoadingText2): The text that is displayed in the debugger +# LOCALIZATION NOTE (wasmIsNotAvailable): The text that is displayed in the +# script editor when the WebAssembly source is not available. + +# LOCALIZATION NOTE (errorLoadingText3): The text that is displayed in the debugger # viewer when there is an error loading a file -errorLoadingText2=Ushbu URL manzilni yuklashda xatolik: %S # LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the # watch expressions list to add a new item. @@ -413,88 +709,43 @@ addWatchExpressionText=Kuzatish ifodasini qo‘shish # variables view popup. addWatchExpressionButton=Kuzatish -# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the -# variables pane when there are no variables to display. -emptyVariablesText=Ko‘rsatish uchun o‘zgaruvchan qiymat - -# LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables -# pane as a header for each variable scope (e.g. "Global scope, "With scope", -# etc.). -scopeLabel=%S harakat hududi - -# LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch -# expressions scope. This text is displayed in the variables pane as a header for -# the watch expressions scope. -watchExpressionsScopeLabel=Kuzatish uchun ifoda - -# LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text -# is added to scopeLabel and displayed in the variables pane as a header for -# the global scope. -globalScopeLabel=Global - -# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is -# shown before the stack trace in an error. -variablesViewErrorStacktrace=Stek-treys: - -# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed -# when you have an object preview that does not show all of the elements. At the end of the list -# you see "N more..." in the web console output. -# This is a semi-colon list of plural forms. -# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals -# #1 number of remaining items in the object -# example: 3 more… -variablesViewMoreObjects=#1 ta ko‘proq…;#1 ta ko‘proq… - -# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed -# in the variables list on an item with an editable name. -variablesEditableNameTooltip=Tahrirlash uchun ikki marta bosing +# LOCALIZATION NOTE (extensionsText): The text that is displayed to represent +# "moz-extension" directories in the source tree -# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed -# in the variables list on an item with an editable value. -variablesEditableValueTooltip=Qiymatni o‘zgartirish uchun bosing +# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the +# variables pane when there are no variables to display. +emptyVariablesText=Ko‘rsatish uchun o‘zgaruvchan qiymat -# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed -# in the variables list on an item which can be removed. -variablesCloseButtonTooltip=O‘chirish uchun bosing +# LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables +# pane as a header for each variable scope (e.g. "Global scope, "With scope", +# etc.). +scopeLabel=%S harakat hududi -# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed -# in the variables list on a getter or setter which can be edited. -variablesEditButtonTooltip=Qiymatni o‘rnatish uchun bosing +# LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch +# expressions scope. This text is displayed in the variables pane as a header for +# the watch expressions scope. +watchExpressionsScopeLabel=Kuzatish uchun ifoda -# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed -# in a tooltip on the "open in inspector" button in the the variables list for a -# DOMNode item. -variablesDomNodeValueTooltip=Nazorat qilgichdagi tugunlarni tanlash uchun bosing +# LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text +# is added to scopeLabel and displayed in the variables pane as a header for +# the global scope. +globalScopeLabel=Global -# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed -# in the variables list on certain variables or properties as tooltips. -# Expanations of what these represent can be found at the following links: -# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty -# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible -# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen -# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed -# It's probably best to keep these in English. -configurableTooltip=configurable -enumerableTooltip=enumerable -writableTooltip=writable -frozenTooltip=frozen -sealedTooltip=sealed -extensibleTooltip=extensible -overriddenTooltip=overridden -WebIDLTooltip=WebIDL +# LOCALIZATION NOTE(gotoLineModal.placeholder): The placeholder +# text displayed when the user searches for specific lines in a file -# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed -# in the variables list as a separator between the name and value. -variablesSeparatorLabel=: +# LOCALIZATION NOTE(gotoLineModal.title): The message shown to users +# to open the go to line modal -# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed -# in the watch expressions list as a separator between the code and evaluation. -watchExpressionsSeparatorLabel2=\u00A0→ +# LOCALIZATION NOTE(gotoLineModal.key2): The shortcut for opening the +# go to line modal +# Do not localize "CmdOrCtrl+;", or change the format of the string. These are +# key identifiers, not messages displayed to the user. -# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed -# in the functions search panel as a separator between function's inferred name -# and its real name (if available). -functionSearchSeparatorLabel=← +# LOCALIZATION NOTE(gotoLineModal.key3): The shortcut for opening the +# go to line modal +# Do not localize "Ctrl+G", or change the format of the string. These are +# key identifiers, not messages displayed to the user. # LOCALIZATION NOTE(symbolSearch.search.functionsPlaceholder): The placeholder # text displayed when the user searches for functions in a file @@ -504,6 +755,11 @@ functionSearchSeparatorLabel=← # LOCALIZATION NOTE(symbolSearch.search.key2): The Key Shortcut for # searching for a function or variable +# Do not localize "CmdOrCtrl+Shift+O", or change the format of the string. These are +# key identifiers, not messages displayed to the user. + +# LOCALIZATION NOTE(symbolSearch.searchModifier.modifiersLabel): A label +# preceding the group of modifiers # LOCALIZATION NOTE(symbolSearch.searchModifier.regex): A search option # when searching text in a file @@ -521,12 +777,6 @@ functionSearchSeparatorLabel=← # resumed first. resumptionOrderPanelTitle=Bir yoki bir nechta to‘xtatilgan tuzatgichlar bor. Avval eng so‘nggi to‘xtatilgan tuzatgichlarni davom ettiring: %S -variablesViewOptimizedOut=(optimallashtirilganligini ifodalaydi) -variablesViewUninitialized=(Ishga tushirib bo‘lmaydigan) -variablesViewMissingArgs=(mavjud emas) - -anonymousSourcesLabel=Anonim manba - experimental=Bu sinovdagi xususiyat # LOCALIZATION NOTE (whyPaused.debuggerStatement): The text that is displayed @@ -536,9 +786,27 @@ experimental=Bu sinovdagi xususiyat # LOCALIZATION NOTE (whyPaused.breakpoint): The text that is displayed # in a info block explaining how the debugger is currently paused on a breakpoint +# LOCALIZATION NOTE (whyPaused.eventBreakpoint): The text that is displayed +# in a info block explaining how the debugger is currently paused on an event +# breakpoint. + # LOCALIZATION NOTE (whyPaused.exception): The text that is displayed # in a info block explaining how the debugger is currently paused on an exception +# LOCALIZATION NOTE (whyPaused.mutationBreakpoint): The text that is displayed +# in a info block explaining how the debugger is currently paused on a +# DOM mutation breakpoint + +# LOCALIZATION NOTE (whyPaused.mutationBreakpointAdded): The text that +# is displayed to describe an added node which triggers a subtree modification + +# LOCALIZATION NOTE (whyPaused.mutationBreakpointRemoved): The text that +# is displayed to describe a removed node which triggers a subtree modification + +# LOCALIZATION NOTE (whyPaused.interrupted): The text that is displayed +# in a info block explaining how the debugger is currently paused at +# a JS execution + # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed # in a info block explaining how the debugger is currently paused while stepping # in or out of the stack @@ -554,10 +822,22 @@ experimental=Bu sinovdagi xususiyat # in a info block explaining how the debugger is currently paused on an # xml http request +# LOCALIZATION NOTE (whyPaused.XHR): The text that is displayed +# in a info block explaining how the debugger is currently paused on an +# xml http request + # LOCALIZATION NOTE (whyPaused.promiseRejection): The text that is displayed # in a info block explaining how the debugger is currently paused on a # promise rejection +# LOCALIZATION NOTE (whyPaused.getWatchpoint): The text that is displayed +# in a info block explaining how the debugger is currently paused at a +# watchpoint on an object property + +# LOCALIZATION NOTE (whyPaused.setWatchpoint): The text that is displayed +# in an info block explaining how the debugger is currently paused at a +# watchpoint on an object property + # LOCALIZATION NOTE (whyPaused.assert): The text that is displayed # in a info block explaining how the debugger is currently paused on an # assert @@ -573,6 +853,150 @@ experimental=Bu sinovdagi xususiyat # LOCALIZATION NOTE (ctrl): The text that is used for documenting # keyboard shortcuts that use the control key +# LOCALIZATION NOTE (anonymousFunction): this string is used to display +# JavaScript functions that have no given name - they are said to be +# anonymous. + +# LOCALIZATION NOTE (stacktrace.asyncStack): this string is used to +# indicate that a given stack frame has an async parent. +# %S is the "Async Cause" of the frame. + +# LOCALIZATION NOTE (shortcuts.toggleBreakpoint): text describing +# keyboard shortcut action for toggling breakpoint + +# LOCALIZATION NOTE (shortcuts.toggleCondPanel.breakpoint): text describing +# keyboard shortcut action for toggling conditional panel for breakpoints + +# LOCALIZATION NOTE (shortcuts.toggleCondPanel.logPoint): text describing +# keyboard shortcut action for toggling conditional panel for log points + +# LOCALIZATION NOTE (shortcuts.pauseOrResume): text describing +# keyboard shortcut action for pause of resume + +# LOCALIZATION NOTE (shortcuts.stepOver): text describing +# keyboard shortcut action for stepping over + +# LOCALIZATION NOTE (shortcuts.stepIn): text describing +# keyboard shortcut action for stepping in + +# LOCALIZATION NOTE (shortcuts.stepOut): text describing +# keyboard shortcut action for stepping out + +# LOCALIZATION NOTE (shortcuts.fileSearch): text describing +# keyboard shortcut action for source file search + +# LOCALIZATION NOTE (shortcuts.fileSearch2): text describing +# keyboard shortcut action for source file search + +# LOCALIZATION NOTE (shortcuts.gotoLine): text describing +# keyboard shortcut for jumping to a specific line + +# LOCALIZATION NOTE (shortcuts.searchAgain): text describing +# keyboard shortcut action for searching again + +# LOCALIZATION NOTE (shortcuts.searchAgain2): text describing +# keyboard shortcut action for searching again + +# LOCALIZATION NOTE (shortcuts.projectSearch): text describing +# keyboard shortcut action for full project search + +# LOCALIZATION NOTE (shortcuts.projectSearch2): text describing +# keyboard shortcut action for full project search + +# LOCALIZATION NOTE (shortcuts.functionSearch): text describing +# keyboard shortcut action for function search + +# LOCALIZATION NOTE (shortcuts.functionSearch2): text describing +# keyboard shortcut action for function search + +# LOCALIZATION NOTE (shortcuts.buttonName): text describing +# keyboard shortcut button text + +# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed +# in the variables list as a separator between the name and value. +variablesSeparatorLabel=: + +# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed +# in the watch expressions list as a separator between the code and evaluation. +watchExpressionsSeparatorLabel2=\u00A0→ + +# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed +# in the functions search panel as a separator between function's inferred name +# and its real name (if available). +functionSearchSeparatorLabel=← + +variablesViewOptimizedOut=(optimallashtirilganligini ifodalaydi) +variablesViewUninitialized=(Ishga tushirib bo‘lmaydigan) +variablesViewMissingArgs=(mavjud emas) + +anonymousSourcesLabel=Anonim manba + +# LOCALIZATION NOTE (variablesDomNodeValueTooltip): The text that is displayed +# in a tooltip on the "open in inspector" button in the the variables list for a +# DOMNode item. +variablesDomNodeValueTooltip=Nazorat qilgichdagi tugunlarni tanlash uchun bosing + +# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed +# in the variables list on a getter or setter which can be edited. +variablesEditButtonTooltip=Qiymatni o‘rnatish uchun bosing + +# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is +# shown before the stack trace in an error. +variablesViewErrorStacktrace=Stek-treys: + +# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed +# when you have an object preview that does not show all of the elements. At the end of the list +# you see "N more..." in the web console output. +# This is a semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# #1 number of remaining items in the object +# example: 3 more… +variablesViewMoreObjects=#1 ta ko‘proq…;#1 ta ko‘proq… + +# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed +# in the variables list on an item with an editable name. +variablesEditableNameTooltip=Tahrirlash uchun ikki marta bosing + +# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed +# in the variables list on an item with an editable value. +variablesEditableValueTooltip=Qiymatni o‘zgartirish uchun bosing + +# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed +# in the variables list on an item which can be removed. +variablesCloseButtonTooltip=O‘chirish uchun bosing + +# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed +# in the variables list on certain variables or properties as tooltips. +# Explanations of what these represent can be found at the following links: +# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty +# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible +# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen +# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed +# It's probably best to keep these in English. +configurableTooltip=configurable +enumerableTooltip=enumerable +writableTooltip=writable +frozenTooltip=frozen +sealedTooltip=sealed +extensibleTooltip=extensible +overriddenTooltip=overridden +WebIDLTooltip=WebIDL + +# LOCALIZATION NOTE (serviceWorkerInfo.parsed): State displayed for a service +# worker that has been parsed. +# LOCALIZATION NOTE (serviceWorkerInfo.installing): State displayed for a +# service worker that is being installed. +# LOCALIZATION NOTE (serviceWorkerInfo.installed): State displayed for a +# service worker that has finished being installed. +# LOCALIZATION NOTE (serviceWorkerInfo.activating): State displayed for a +# service worker that is being activated. +# LOCALIZATION NOTE (serviceWorkerInfo.activated): State displayed for a +# service worker that has finished being activated. +# LOCALIZATION NOTE (serviceWorkerInfo.redundant): State displayed for a +# service worker that is redundant. +# LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a +# service worker that is in an unknown state. + # LOCALIZATION NOTE (collapseSources): This is the tooltip for the button # that collapses the Sources and Outlines panes in the debugger UI. collapseSources=Collapse Sources and Outline panes @@ -761,11 +1185,6 @@ projectTextSearch.placeholder=Find in files… # LOCALIZATION NOTE (projectTextSearch.noResults): The center pane Text Search # message when the query did not match any text of all files in a project. projectTextSearch.noResults=No results found -# LOCALIZATION NOTE (sourceSearch.search.key2): Key shortcut to open the search -# for searching within a the currently opened files in the editor -# Do not localize "CmdOrCtrl+F", or change the format of the string. These are -# key identifiers, not messages displayed to the user. -sourceSearch.search.key2=CmdOrCtrl+F # LOCALIZATION NOTE (sourceSearch.search.placeholder): placeholder text in # the source search input bar sourceSearch.search.placeholder=Search in file… @@ -1059,10 +1478,6 @@ scopes.map.label=Map # LOCALIZATION NOTE (scopes.block): Refers to a block of code in # the scopes pane when the debugger is paused. scopes.block=Block -# LOCALIZATION NOTE (sources.header): Sources left sidebar header -sources.header=Sources -# LOCALIZATION NOTE (outline.header): Outline left sidebar header -outline.header=Outline # LOCALIZATION NOTE (outline.placeholder): Placeholder text for the filter input # element outline.placeholder=Filter functions @@ -1072,10 +1487,6 @@ outline.sortLabel=Sort by name outline.noFunctions=No functions # LOCALIZATION NOTE (outline.noFileSelected): Outline text when there are no files selected outline.noFileSelected=No file selected -# LOCALIZATION NOTE (sources.search): Sources left sidebar prompt -# e.g. Cmd+P to search. On a mac, we use the command unicode character. -# On windows, it's ctrl. -sources.search=%S to search # LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar # pane header. watchExpressions.header=Watch expressions diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/filterwidget.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/filterwidget.properties index 18460d812c80f44c4c0c791ba51121e0bb37f32e..4e9db0bc6211eba3f116a42b96569c5d70fe00fe 100644 --- a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/filterwidget.properties +++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/filterwidget.properties @@ -13,7 +13,7 @@ emptyFilterList=Filter ko‘rsatilmagan # LOCALIZATION NOTE (emptyPresetList): # This string is displayed when preset's list is empty -emptyPresetList=Siz birorta ham tayyor sozlamalarni saqlamagansiz. Siz filter tayyor sozlamalarining nomini tanlab, so‘ngra ularni saqlab joylashtirishingiz mumkin. Tayyor sozlamalardan tezkor foydalanish mumkin va ulardan qayta foydalanish oson bo‘ladi. +emptyPresetList=Siz birorta ham tayyor sozlamalarni saqlamagansiz. Siz filtr tayyor sozlamalarining nomini tanlab, soʻngra ularni saqlab joylashtirishingiz mumkin. Tayyor sozlamalardan tezkor foydalanish mumkin va ulardan qayta foydalanish oson bo‘ladi. # LOCALIZATION NOTE (addUsingList): # This string is displayed under [emptyFilterList] when filter's @@ -34,7 +34,7 @@ dragHandleTooltipText=Filterni qayta tartiblash uchun uni sudrang yok itashlang # This string is used as a tooltip text (shown on mouse hover) on the # filters' labels which can be dragged left/right to increase/decrease # the filter's value (like photoshop) -labelDragTooltipText=Qiymatni kattaalshtirish yoki kichiklashtirish uchun chapga yoki o‘ngga buringl +labelDragTooltipText=Qiymatni kattalshtirish yoki kichiklashtirish uchun chapga yoki oʻngga buring # LOCALIZATION NOTE (filterListSelectPlaceholder): # This string is used as a preview option in the list of possible filters diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/netmonitor.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/netmonitor.properties index 87f818624bcf3e8386d3714aa91dfbde95e5e9ce..463f02571c17b7ad3c587c1067235a4f05155543 100644 --- a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/netmonitor.properties +++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/netmonitor.properties @@ -57,9 +57,8 @@ netmonitor.security.notAvailable=<Mavjud emas> # that collapses the network details pane in the UI. collapseDetailsPane=So‘rov tafsilotlarini yashirish -# LOCALIZATION NOTE (expandDetailsPane): This is the tooltip for the button -# that expands the network details pane in the UI. -expandDetailsPane=So'rov tafsilotlarini ko‘rsatish +# LOCALIZATION NOTE (collapseActionPane): This is the tooltip for the button +# that collapses the network action pane in the UI. # LOCALIZATION NOTE (headersEmptyText): This is the text displayed in the # headers tab of the network details pane when there are no headers available. @@ -69,6 +68,9 @@ headersEmptyText=Ushbu so‘rov uchun bosh qatorlar yo‘q # headers tab of the network details pane for the filtering input. headersFilterText=Filter boshlang‘ich qismi +# LOCALIZATION NOTE (messagesEmptyText): This is the text displayed in the +# WebSockets tab of the network details pane when there are no frames available. + # LOCALIZATION NOTE (cookiesEmptyText): This is the text displayed in the # cookies tab of the network details pane when there are no cookies available. cookiesEmptyText=Ushbu so‘rov uchun kukilar yo‘q @@ -77,6 +79,10 @@ cookiesEmptyText=Ushbu so‘rov uchun kukilar yo‘q # cookies tab of the network details pane for the filtering input. cookiesFilterText=Filter kukilari +# LOCALIZATION NOTE (responseEmptyText): This is the text displayed in the +# response tab of the network details pane when the response is empty or not +# available for shown. + # LOCALIZATION NOTE (paramsEmptyText): This is the text displayed in the # params tab of the network details pane when there are no params available. paramsEmptyText=Ushbu so‘rov uchun parametrlar yo‘q @@ -133,6 +139,21 @@ jsonScopeName=JSON # in the response tab of the network details pane for a JSONP scope. jsonpScopeName=JSONP → teskari chaqiriq %S() +# LOCALIZATION NOTE (responseTruncated): This is the text displayed +# in the response tab of the network details pane when the response is over +# the truncation limit and thus was truncated. + +# LOCALIZATION NOTE (requestTruncated): This is the text displayed +# in the params tab of the network details pane when the request is over +# the truncation limit and thus was truncated. + +# LOCALIZATION NOTE (responsePreview): This is the text displayed +# in the response tab of the network details pane for an HTML preview. + +# LOCALIZATION NOTE (networkMenu.raced): This is the label displayed +# in the network menu specifying the transfer or a request is +# raced. %S refers to the current transfer size. + # LOCALIZATION NOTE (networkMenu.sortedAsc): This is the tooltip displayed # in the network table toolbar, for any column that is sorted ascending. networkMenu.sortedAsc=Ortib borish tartibida saralangan @@ -150,7 +171,7 @@ networkMenu.sortedDesc=Kamayib borish tartibida saralangan # LOCALIZATION NOTE (networkMenu.summary.tooltip.load): A tooltip explaining # what the load label displays -# LOCALIZATION NOTE (networkMenu.summary.requestsCount): This label is displayed +# LOCALIZATION NOTE (networkMenu.summary.requestsCount2): This label is displayed # in the network table footer providing the number of requests # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals @@ -165,7 +186,7 @@ networkMenu.summary.requestsCountEmpty=Soʻrovlar yo‘q # in the network table footer providing the transferred size. # LOCALIZATION NOTE (networkMenu.summary.tooltip.transferred): A tooltip explaining -# what the transferred label displays +# what the transferred label displays # LOCALIZATION NOTE (networkMenu.summary.finish): This label is displayed # in the network table footer providing the transfer time. @@ -173,6 +194,26 @@ networkMenu.summary.requestsCountEmpty=Soʻrovlar yo‘q # LOCALIZATION NOTE (networkMenu.summary.tooltip.finish): A tooltip explaining # what the finish label displays +# LOCALIZATION NOTE (networkMenu.ws.summary.framesCount2): This label is displayed +# in the messages table footer providing the number of frames +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals + +# LOCALIZATION NOTE (networkMenu.ws.summary.framesCountEmpty): This label is displayed +# in the messages table footer when there are no frames + +# LOCALIZATION NOTE (networkMenu.ws.summary.tooltip.framesCount): A tooltip explaining +# what the framesCount label displays + +# LOCALIZATION NOTE (networkMenu.ws.summary.tooltip.framesTotalSize): A tooltip explaining +# what the framesTotalSize label displays + +# LOCALIZATION NOTE (networkMenu.ws.summary.label.framesTranferredSize): A label showing +# summary size info related to the current list of WS messages +# %1$S is the total size of the transferred data, %2$S is the size of sent data, %3$S is the size of received data. + +# LOCALIZATION NOTE (networkMenu.ws.summary.tooltip.framesTotalTime): A tooltip explaining +# what framesTotalTime displays + # LOCALIZATION NOTE (networkMenu.sizeB): This is the label displayed # in the network menu specifying the size of a request (in bytes). @@ -191,8 +232,12 @@ networkMenu.sizeKB=%S KB # unavailable. networkMenu.sizeUnavailable=— +# LOCALIZATION NOTE (networkMenu.sizeUnavailable.title): This is the tooltip +# displayed in the network menu specifying that the transferred size of a +# request is unavailable. + # LOCALIZATION NOTE (networkMenu.sizeCached): This is the label displayed -# in the network menu specifying the transferred of a request is +# in the network menu specifying the transfer or a request is # cached. # LOCALIZATION NOTE (networkMenu.sizeServiceWorker): This is the label displayed @@ -200,9 +245,18 @@ networkMenu.sizeUnavailable=— # by a service worker. networkMenu.sizeServiceWorker=service worker -# LOCALIZATION NOTE (networkMenu.totalMS): This is the label displayed +# LOCALIZATION NOTE (networkMenu.sizeServiceWorker): This is the label displayed +# in the network menu specifying the request was blocked by something. +# %S is replaced by the blocked reason, which could be "DevTools", "CORS", etc. + +# LOCALIZATION NOTE (networkMenu.blocked2): This is a generic message for a +# URL that has been blocked for an unknown reason + +# LOCALIZATION NOTE (networkMenu.blockedTooltip): This is a the text displayed +# as a tooltip for the blocked icon in the request list + +# LOCALIZATION NOTE (networkMenu.totalMS2): This is the label displayed # in the network menu specifying the time for a request to finish (in milliseconds). -networkMenu.totalMS=→ %S ms # This string is used to concatenate tooltips (netmonitor.waterfall.tooltip.*) # in the requests waterfall for total time (in milliseconds). \\u0020 represents @@ -233,6 +287,26 @@ networkMenu.totalMS=→ %S ms # LOCALIZATION NOTE (netmonitor.waterfall.tooltip.receive): This is part of the tooltip # displayed in the requests waterfall for receive time (in milliseiconds). +# LOCALIZATION NOTE (netmonitor.timings.requestTiming): This is the title of the existing +# section in Timings side panel. This section contains request timings. + +# LOCALIZATION NOTE (netmonitor.timings.serverTiming): This is the title of a new section +# in Timings side panel. This section contains server timings transferred from the server +# through the "Server-Timing" header. + +# LOCALIZATION NOTE (netmonitor.timings.queuedAt): This is relative queued time to the +# first request. %S is time expressed in milliseconds or minutes. + +# LOCALIZATION NOTE (netmonitor.timings.startedAt): Relative to the first request, +# when the request actually started. %S is time expressed in milliseconds or minutes. + +# LOCALIZATION NOTE (netmonitor.timings.downloadedAt): Relative to first request, +# when the request actually finished downloading. +# %S is time expressed in milliseconds or minutes. + +# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the +# timings pane when thea request has been blocked + # LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed # in the network menu specifying timing interval divisions (in milliseconds). networkMenu.millisecond=%S ms @@ -276,7 +350,7 @@ charts.sizeKB=%S KB # in pie or table charts specifying the time for a request to finish (in seconds). charts.totalS=%S s -# LOCALIZATION NOTE (charts.totalTranferredSize): This is the label displayed +# LOCALIZATION NOTE (charts.totalTransferredSize): This is the label displayed # in the performance analysis view for total transferred size, in kilobytes. # LOCALIZATION NOTE (charts.cacheEnabled): This is the label displayed @@ -287,6 +361,9 @@ charts.cacheEnabled=Boshlang‘ich kesh # in the performance analysis view for "cache disabled" charts. charts.cacheDisabled=Keshni bo‘shatish +# LOCALIZATION NOTE (charts.learnMore): This is the label displayed +# in the performance analysis view, with a link to external documentation. + # LOCALIZATION NOTE (charts.totalSize): This is the label displayed # in the performance analysis view for total requests size, in kilobytes. @@ -296,6 +373,11 @@ charts.cacheDisabled=Keshni bo‘shatish # total requests time, in seconds. charts.totalSeconds=Vaqt: #1 soniya;Vaqt: #1 soniya +# LOCALIZATION NOTE (charts.totalSecondsNonBlocking): Semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# This is the label displayed in the performance analysis view for the +# total requests time (non-blocking), in seconds. + # LOCALIZATION NOTE (charts.totalCached): This is the label displayed # in the performance analysis view for total cached responses. charts.totalCached=Keshlangan javoblar: %S @@ -304,19 +386,31 @@ charts.totalCached=Keshlangan javoblar: %S # in the performance analysis view for total requests. charts.totalCount=Barcha so‘rovlar: %S -# LOCALIZATION NOTE (charts.totalCount): This is the label displayed +# LOCALIZATION NOTE (charts.size): This is the label displayed # in the header column in the performance analysis view for size of the request. -# LOCALIZATION NOTE (charts.totalCount): This is the label displayed +# LOCALIZATION NOTE (charts.type): This is the label displayed # in the header column in the performance analysis view for type of request. -# LOCALIZATION NOTE (charts.totalCount): This is the label displayed +# LOCALIZATION NOTE (charts.transferred): This is the label displayed # in the header column in the performance analysis view for transferred # size of the request. -# LOCALIZATION NOTE (charts.totalCount): This is the label displayed +# LOCALIZATION NOTE (charts.time): This is the label displayed # in the header column in the performance analysis view for time of request. +# LOCALIZATION NOTE (charts.nonBlockingTime): This is the label displayed +# in the header column in the performance analysis view for non blocking +# time of request. + +# LOCALIZATION NOTE (netRequest.originalFileURL.tooltip): This is the tooltip +# displayed for the file's original URL value displayed in the file column of +# a request. + +# LOCALIZATION NOTE (netRequest.decodedFileURL.tooltip): This is the tooltip +# displayed for the file's decoded URL value displayed in the file column of +# a request. + # LOCALIZATION NOTE (netRequest.headers): A label used for Headers tab # This tab displays list of HTTP headers @@ -380,10 +474,10 @@ charts.totalCount=Barcha so‘rovlar: %S # A label used for a certificate section in security tab # This section displays the valide period of this fingerprints -# LOCALIZATION NOTE (certmgr.certdetail.cn): +# LOCALIZATION NOTE (certmgr.begins): # A label used for Period of Validity sub-section in security tab -# LOCALIZATION NOTE (certmgr.certdetail.cn): +# LOCALIZATION NOTE (certmgr.expires): # A label used for Period of Validity sub-section in security tab # LOCALIZATION NOTE (certmgr.fingerprints.label): @@ -396,6 +490,24 @@ charts.totalCount=Barcha so‘rovlar: %S # LOCALIZATION NOTE (certmgr.certdetail.sha1fingerprint): # A label used for Fingerprints sub-section in security tab +# LOCALIZATION NOTE (certmgr.certificateTransparency.label): +# This string is used as a label in the security tab. + +# LOCALIZATION NOTE (certmgr.certificateTransparency.status.ok): +# This string is used to indicate that there are valid signed certificate +# timestamps. This is a property for the 'Transparency' +# field in the security tab. + +# LOCALIZATION NOTE (certmgr.certificateTransparency.status.notEnoughSCTS): +# This string is used to indicate that there are not enough valid signed +# certificate timestamps. This is a property for the 'Transparency' +# field in the security tab. + +# LOCALIZATION NOTE (certmgr.certificateTransparency.status.notDiverseSCTS): +# This string is used to indicate that there ar not enough diverse signed +# certificate timestamps. This is a property for the 'Transparency' +# field in the security tab. + # LOCALIZATION NOTE (netmonitor.perfNotice1/2/3): These are the labels displayed # in the network table when empty to start performance analysis. netmonitor.perfNotice1=• Tugmaga @@ -407,7 +519,7 @@ netmonitor.reloadNotice1=• So‘rovni amalga oshiring yoki netmonitor.reloadNotice2=Sahifani qayta yuklang - netmonitor.reloadNotice3=tarmoq faoliyati haqida batafsil ma’lumotlarni ko‘rish uchun -# LOCALIZATION NOTE (netmonitor.toolbar.status2): This is the label displayed +# LOCALIZATION NOTE (netmonitor.toolbar.status3): This is the label displayed # in the network table toolbar, above the "status" column. # LOCALIZATION NOTE (netmonitor.toolbar.method): This is the label displayed @@ -418,6 +530,9 @@ netmonitor.toolbar.method=Usul # in the network table toolbar, above the "file" column. netmonitor.toolbar.file=Fayl +# LOCALIZATION NOTE (netmonitor.toolbar.url): This is the label displayed +# in the network table toolbar, above the "url" column. + # LOCALIZATION NOTE (netmonitor.toolbar.protocol): This is the label displayed # in the network table toolbar, above the "protocol" column. @@ -431,6 +546,9 @@ netmonitor.toolbar.domain=Domen # LOCALIZATION NOTE (netmonitor.toolbar.cause): This is the label displayed # in the network table toolbar, above the "cause" column. +# LOCALIZATION NOTE (netmonitor.toolbar.initiator): This is the label displayed +# in the network table toolbar, above the "initiator" column. + # LOCALIZATION NOTE (netmonitor.toolbar.type): This is the label displayed # in the network table toolbar, above the "type" column. @@ -477,12 +595,161 @@ netmonitor.toolbar.domain=Domen # in the network table toolbar, above the "waterfall" column. netmonitor.toolbar.waterfall=Yilnoma +# LOCALIZATION NOTE (netmonitor.ws.toolbar.size): This is the label displayed +# in the websocket frame table header, above the "size" column. + +# LOCALIZATION NOTE (netmonitor.ws.toolbar.data): This is the label displayed +# in the websocket frame table header, above the "data" column. + +# LOCALIZATION NOTE (netmonitor.ws.toolbar.opCode): This is the label displayed +# in the websocket frame table header, above the "opCode" column. + +# LOCALIZATION NOTE (netmonitor.ws.toolbar.maskBit): This is the label displayed +# in the websocket frame table header, above the "maskBit" column. + +# LOCALIZATION NOTE (netmonitor.ws.toolbar.finBit): This is the label displayed +# in the websocket frame table header, above the "finBit" column. + +# LOCALIZATION NOTE (netmonitor.ws.toolbar.time): This is the label displayed +# in the websocket frame table header, above the "time" column. + +# LOCALIZATION NOTE (netmonitor.ws.toolbar.clear): This is the label displayed +# in the websocket toolbar for the "Clear" button. + +# LOCALIZATION NOTE (netmonitor.ws.toolbar.filterFreetext.label): This is the label +# displayed in the websocket toolbar for the frames filtering textbox. + +# LOCALIZATION NOTE (netmonitor.ws.toolbar.filterFreetext.key): This is the +# shortcut key to focus on the websocket toolbar frames filtering textbox + +# LOCALIZATION NOTE (netmonitor.ws.toolbar.resetColumns): This is the label +# displayed in the messages panel table header context menu. + +# LOCALIZATION NOTE (netmonitor.ws.context.all): This is the label displayed +# on the context menu that shows "All" WebSocket frames. + +# LOCALIZATION NOTE (netmonitor.ws.context.all.accesskey): This is the access key +# for the "All" menu item displayed in the context menu in the websocket toolbar. + +# LOCALIZATION NOTE (netmonitor.ws.context.sent): This is the label displayed +# on the context menu that shows "Sent" WebSocket frames. + +# LOCALIZATION NOTE (netmonitor.ws.context.sent.accesskey): This is the access key +# for the "Sent" menu item displayed in the context menu in the websocket toolbar. + +# LOCALIZATION NOTE (netmonitor.ws.context.received): This is the label displayed +# on the context menu that shows "Received" WebSocket frames. + +# LOCALIZATION NOTE (netmonitor.ws.context.received.accesskey): This is the access key +# for the "Received" menu item displayed in the context menu in the websocket toolbar. + +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed +# on the context menu that shows "Control Frames" WebSocket frames. + +# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key +# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar. + +# LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed +# on the context menu that shows "Copy Message". + +# LOCALIZATION NOTE (netmonitor.ws.context.copyFrame.accesskey): This is the access key +# for the "Copy Message" menu item displayed in the context menu of a WebSocket frame. + +# LOCALIZATION NOTE (netmonitor.ws.connection.closed): This is the text displayed in the +# websocket messages panel when the connection is closed + +# LOCALIZATION NOTE (netmonitor.ws.type.sent): This is the label used as +# accessible text for the "sent" type icon in the websocket table's "data" column. + +# LOCALIZATION NOTE (netmonitor.ws.type.received): This is the label used as +# accessible text for the "received" type icon in the websocket table's "data" column. + +# LOCALIZATION NOTE (netmonitor.ws.rawData.header): This is the label displayed +# in the messages panel identifying the raw data. + +# LOCALIZATION NOTE (netmonitor.search.toolbar.inputPlaceholder): This is the label +# displayed in the search toolbar for the search input as the placeholder. + +# LOCALIZATION NOTE (netmonitor.search.toolbar.close): This is the label +# displayed in the search toolbar to close the search panel. + +# LOCALIZATION NOTE (netmonitor.search.toolbar.clear): This is the label +# displayed in the search toolbar to clear the search panel. + +# LOCALIZATION NOTE (netmonitor.search.toolbar.caseSensitive): This is the label +# displayed in the search toolbar to do a case sensitive search. + +# LOCALIZATION NOTE (netmonitor.search.status.labels.fetching): This is the label +# displayed in the search results status bar when status is set to fetching. + +# LOCALIZATION NOTE (netmonitor.search.status.labels.canceled): This is the label +# displayed in the search results status bar when status is set to cancelled. + +# LOCALIZATION NOTE (netmonitor.search.status.labels.done): This is the label +# displayed in the search results status bar when status is set to done. +# %1$S is the number of matching lines in search results (netmonitor.search.status.labels.matchingLines) +# %2$S is the number of files in which matching lines were found (netmonitor.search.status.labels.fileCount) + +# LOCALIZATION NOTE (netmonitor.search.status.labels.matchingLines): Semi-colon list of plural forms. +# This is the label displayed in the search results status bar showing matching lines found. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# #1 is the number of matching lines found + +# LOCALIZATION NOTE (netmonitor.search.status.labels.fileCount): Semi-colon list of plural forms. +# This is the label displayed in the search results status bar showing file count +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# #1 is the number of files in which matching lines were found + +# LOCALIZATION NOTE (netmonitor.search.status.labels.error): This is the label +# displayed in the search results status bar when status is set to error. + +# LOCALIZATION NOTE (netmonitor.toolbar.requestBlocking): This is the tooltip displayed +# over the toolbar's Request Blocking buttonn + +# LOCALIZATION NOTE (netmonitor.actionbar.requestBlocking2): This is the label displayed +# in the action bar's request blocking tab + +# LOCALIZATION NOTE (netmonitor.actionbar.enableBlocking): This is the label displayed +# in request blocking tab to represent if requests blocking should be enabled + +# LOCALIZATION NOTE (netmonitor.actionbar.blockSearchPlaceholder): This is the +# placeholder text for the request addition form + +# LOCALIZATION NOTE (netmonitor.actionbar.removeBlockedUrl): This is the +# tooltip shown over the remove button for blocked URL item + +# LOCALIZATION NOTE (netmonitor.actionbar.addBlockedUrl): This is the +# tooltip shown over the Add Blocked URL button + +# LOCALIZATION NOTE (netmonitor.actionbar.search): This is the label displayed +# in the action bar's search tab + +# LOCALIZATION NOTE (messagesTruncated): This is the text displayed +# in the messages panel when the number of messages is over the +# truncation limit. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals + +# LOCALIZATION NOTE (disableMessagesTruncation): This is the text displayed +# in the messages panel checkbox label for toggling message truncation. + +# LOCALIZATION NOTE (toggleMessagesTruncation.title): This is the title used +# to describe the checkbox used to toggle message truncation. + +# LOCALIZATION NOTE (messageDataTruncated): This is the text displayed +# to describe to describe data truncation in the messages panel. + # LOCALIZATION NOTE (netmonitor.tab.headers): This is the label displayed # in the network details pane identifying the headers tab. +# LOCALIZATION NOTE (netmonitor.tab.messages): This is the label displayed +# in the network details pane identifying the messages tab. + # LOCALIZATION NOTE (netmonitor.tab.cookies): This is the label displayed # in the network details pane identifying the cookies tab. +# LOCALIZATION NOTE (netmonitor.tab.cache): This is the label displayed +# in the network details pane identifying the cache tab. + # LOCALIZATION NOTE (netmonitor.tab.params): This is the label displayed # in the network details pane identifying the params tab. @@ -548,6 +815,21 @@ netmonitor.toolbar.filter.other=Boshqa # LOCALIZATION NOTE (netmonitor.toolbar.filterFreetext.key): This is the # shortcut key to focus on the toolbar url filtering textbox +# LOCALIZATION NOTE (netmonitor.toolbar.search.key): This is the +# shortcut key to toggle the search panel + +# LOCALIZATION NOTE (netmonitor.toolbar.copy.key): This is the +# shortcut key to copy a selected request url from the network table + +# LOCALIZATION NOTE (netmonitor.toolbar.filterFreetext.learnMore): This is +# the title used for MDN icon in filtering textbox + +# LOCALIZATION NOTE (netmonitor.toolbar.enablePersistentLogs.label): This is the label +# displayed for the checkbox for enabling persistent logs. + +# LOCALIZATION NOTE (netmonitor.toolbar.enablePersistentLogs.tooltip): This is the tooltip +# displayed for the checkbox for enabling persistent logs. + # LOCALIZATION NOTE (netmonitor.toolbar.disableCache.label): This is the label # displayed for the checkbox for disabling browser cache. @@ -558,13 +840,28 @@ netmonitor.toolbar.filter.other=Boshqa # in the network toolbar for the "Clear" button. netmonitor.toolbar.clear=Tozalash +# LOCALIZATION NOTE (netmonitor.toolbar.toggleRecording): This is the label displayed +# in the network toolbar for the toggle recording button. + # LOCALIZATION NOTE (netmonitor.toolbar.perf): This is the label displayed # in the network toolbar for the performance analysis button. netmonitor.toolbar.perf=Ishlash natijalarini ko‘rsatish/yashirish… +# LOCALIZATION NOTE (netmonitor.toolbar.search): This is the tooltip label displayed +# in the network toolbar for the search button. + # LOCALIZATION NOTE (netmonitor.toolbar.resetColumns): This is the label # displayed in the network table header context menu. +# LOCALIZATION NOTE (netmonitor.toolbar.resetSorting): This is the label +# displayed in the network table header context menu to reset sorting + +# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent): This is the label +# displayed in the network table header context menu to resize a column to fit its content + +# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent.title): This is the title +# tooltip displayed when draggable resizer in network table headers is hovered + # LOCALIZATION NOTE (netmonitor.toolbar.timings): This is the label # displayed in the network table header context menu for the timing submenu @@ -592,6 +889,12 @@ netmonitor.summary.status=Holat kodi: # in the network details headers tab identifying the http version. netmonitor.summary.version=Versiyasi: +# LOCALIZATION NOTE (netmonitor.summary.learnMore): This is the label displayed +# in the network details headers tab, with a link to external documentation. + +# LOCALIZATION NOTE (netmonitor.summary.referrerPolicy): This is the label displayed +# in the network details headers tab identifying the referrer policy. + # LOCALIZATION NOTE (netmonitor.summary.editAndResend): This is the label displayed # on the button in the headers tab that opens a form to edit and resend the currently # displayed request @@ -659,6 +962,9 @@ netmonitor.timings.wait=Kutilmoqda: # in a "receive" state. netmonitor.timings.receive=Qabul qilish: +# LOCALIZATION NOTE (netmonitor.timings.learnMore): This is the label displayed +# in the network details timings tab, with a link to external documentation + # LOCALIZATION NOTE (netmonitor.security.warning.cipher): A tooltip # for warning icon that indicates a connection uses insecure cipher suite. netmonitor.security.warning.cipher=Kodlash uchun foydalanilgan kodlash usuli eskrigan yoki xavfsiz emas. @@ -675,6 +981,30 @@ netmonitor.security.protocolVersion=Protocol versiyasi: # in the security tab describing the cipher suite used to secure this connection. netmonitor.security.cipherSuite=Kodlash moslamasi: +# LOCALIZATION NOTE (netmonitor.security.keaGroup): This is the label displayed +# in the security tab describing the key exchange group suite used to secure +# this connection. + +# LOCALIZATION NOTE (netmonitor.security.keaGroup.none): This is the label +# displayed in the security tab describing the case when no group was used. + +# LOCALIZATION NOTE (netmonitor.security.keaGroup.custom): This is the label +# displayed in the security tab describing the case when a custom group was used. + +# LOCALIZATION NOTE (netmonitor.security.keaGroup.unknown): This is the value +# displayed in the security tab describing an unknown group. + +# LOCALIZATION NOTE (netmonitor.security.signatureScheme): This is the label +# displayed in the security tab describing the signature scheme used by for +# the server certificate in this connection. + +# LOCALIZATION NOTE (netmonitor.security.signatureScheme.none): This is the +# label displayed in the security tab describing the case when no signature +# was used. + +# LOCALIZATION NOTE (netmonitor.security.signatureScheme.unknown): This is the +# value displayed in the security tab describing an unknown signature scheme. + # LOCALIZATION NOTE (netmonitor.security.hsts): This is the label displayed # in the security tab describing the usage of HTTP Strict Transport Security. netmonitor.security.hsts=HTTP mustahkam transport xavfsizligi: @@ -692,11 +1022,14 @@ netmonitor.security.connection=Ulanish: # in the security tab describing the server certificate section. netmonitor.security.certificate=Sertifikat: +# LOCALIZATION NOTE (netmonitor.trackingResource.tooltip): This is the label used +# in the Network monitor panel as a tooltip for tracking resource icon. + # LOCALIZATION NOTE (netmonitor.context.copy): This is the label displayed # for the copy sub-menu in the context menu for a request # LOCALIZATION NOTE (netmonitor.context.copy.accesskey): This is the access key -# for the copy sub-menu displayed in the context menu for a request +# for the copy menu/sub-menu displayed in the context menu for a request # LOCALIZATION NOTE (netmonitor.context.copyUrl): This is the label displayed # on the context menu that copies the selected request's url @@ -714,11 +1047,11 @@ netmonitor.context.copyUrlParams=URL parametrlaridan nusxa olish # for the Copy URL Parameters menu item displayed in the context menu for a request netmonitor.context.copyUrlParams.accesskey=P -# LOCALIZATION NOTE (netmonitor.context.copyPostData): This is the label displayed -# on the context menu that copies the selected request's post data +# LOCALIZATION NOTE (netmonitor.context.copyRequestData): This is the label displayed +# on the context menu that copies the selected request's data -# LOCALIZATION NOTE (netmonitor.context.copyPostData.accesskey): This is the access key -# for the Copy POST Data menu item displayed in the context menu for a request +# LOCALIZATION NOTE (netmonitor.context.copyRequestData.accesskey): This is the access key +# for the Copy POST/PATCH/PUT/DELETE Data menu item displayed in the context menu for a request # LOCALIZATION NOTE (netmonitor.context.copyAsCurl): This is the label displayed # on the context menu that copies the selected request as a cURL command. @@ -726,9 +1059,20 @@ netmonitor.context.copyUrlParams.accesskey=P # http://en.wikipedia.org/wiki/CURL netmonitor.context.copyAsCurl=cURL sifatida nusxa olish -# LOCALIZATION NOTE (netmonitor.context.copyAsCUrl.accesskey): This is the access key +# LOCALIZATION NOTE (netmonitor.context.copyAsCurl.accesskey): This is the access key # for the Copy as cURL menu item displayed in the context menu for a request +# LOCALIZATION NOTE (netmonitor.context.copyAsCurl.*): This is the template used to add +# a target platform to the label for "Copy as cURL" command +# e.g. Copy as cURL (Windows) +# Localized label for "Copy as cURL": %S + +# LOCALIZATION NOTE (netmonitor.context.copyAsFetch): This is the label displayed +# on the context menu that copies the selected request as a fetch request. + +# LOCALIZATION NOTE (netmonitor.context.copyAsFetch.accesskey): This is the access key +# for the Copy as fetch menu item displayed in the context menu for a request + # LOCALIZATION NOTE (netmonitor.context.copyRequestHeaders): This is the label displayed # on the context menu that copies the selected item's request headers netmonitor.context.copyRequestHeaders=Yuqori qismlar so‘rovidan nusxa olish @@ -747,7 +1091,7 @@ netmonitor.context.copyResponseHeaders=Javob beradigan yuqori qismlardan nusxa o # on the context menu that copies the selected response as a string netmonitor.context.copyResponse=Javobdan nusxa olish -# LOCALIZATION NOTE (netmonitor.context.copyRespose.accesskey): This is the access key +# LOCALIZATION NOTE (netmonitor.context.copyResponse.accesskey): This is the access key # for the Copy Response menu item displayed in the context menu for a request # LOCALIZATION NOTE (netmonitor.context.copyImageAsDataUri): This is the label displayed @@ -758,12 +1102,23 @@ netmonitor.context.copyImageAsDataUri=Rasmdan URI ma’lumotlari sifatida nusxa # for the Copy Image As Data URI menu item displayed in the context menu for a request netmonitor.context.copyImageAsDataUri.accesskey=I +# LOCALIZATION NOTE (netmonitor.context.useAsFetch): This is the label displayed +# on the context menu that copies the selected request as a fetch command. + +# LOCALIZATION NOTE (netmonitor.context.useAsFetch.accesskey): This is the access key +# for the Copy as fetch menu item displayed in the context menu for a request + # LOCALIZATION NOTE (netmonitor.context.saveImageAs): This is the label displayed # on the context menu that save the Image -# LOCALIZATION NOTE (netmonitor.context.copyImageAsDataUri.accesskey): This is the access key +# LOCALIZATION NOTE (netmonitor.context.saveImageAs.accesskey): This is the access key # for the Copy Image As Data URI menu item displayed in the context menu for a request +# LOCALIZATION NOTE (netmonitor.context.copyAll): This is the label displayed +# on the context menu that copies all data + +# LOCALIZATION NOTE (netmonitor.context.copyAll.accesskey): This is the access key +# for the Copy All menu item displayed in the context menu for a properties view panel # LOCALIZATION NOTE (netmonitor.context.copyAllAsHar): This is the label displayed # on the context menu that copies all as HAR format @@ -777,6 +1132,27 @@ netmonitor.context.copyImageAsDataUri.accesskey=I # LOCALIZATION NOTE (netmonitor.context.saveAllAsHar.accesskey): This is the access key # for the Save All As HAR menu item displayed in the context menu for a network panel +# LOCALIZATION NOTE (netmonitor.context.importHar): This is the label displayed +# on the context menu that imports HAR files + +# LOCALIZATION NOTE (netmonitor.context.importHar.accesskey): This is the access key +# for the Import HAR menu item displayed in the context menu for a network panel + +# LOCALIZATION NOTE (netmonitor.har.importHarDialogTitle): This is a label +# used for import file open dialog + +# LOCALIZATION NOTE (netmonitor.har.importDialogHARFilter): +# This string is displayed as a filter for importing HAR file + +# LOCALIZATION NOTE (netmonitor.har.importDialogAllFilter): +# This string is displayed as a filter for importing HAR file + +# LOCALIZATION NOTE (netmonitor.context.resend.label): This is the label displayed +# on the context menu that resends the currently displayed request immediately + +# LOCALIZATION NOTE (netmonitor.context.resend.accesskey): This is the access key +# for the "Resend" menu item displayed in the context menu for a request + # LOCALIZATION NOTE (netmonitor.context.editAndResend): This is the label displayed # on the context menu that opens a form to edit and resend the currently # displayed request @@ -784,10 +1160,16 @@ netmonitor.context.copyImageAsDataUri.accesskey=I # LOCALIZATION NOTE (netmonitor.context.editAndResend.accesskey): This is the access key # for the "Edit and Resend" menu item displayed in the context menu for a request +# LOCALIZATION NOTE (netmonitor.context.blockURL): This is the label displayed +# on the context menu that blocks any requests matching the selected request's URL. + +# LOCALIZATION NOTE (netmonitor.context.unblockURL): This is the label displayed +# on the context menu that unblocks any requests matching the selected request's URL. + # LOCALIZATION NOTE (netmonitor.context.newTab): This is the label # for the Open in New Tab menu item displayed in the context menu of the # network container -netmonitor.context.newTab=Yangi ichki oynada ochish +netmonitor.context.newTab=Yangi varaqda ochish # LOCALIZATION NOTE (netmonitor.context.newTab.accesskey): This is the access key # for the Open in New Tab menu item displayed in the context menu of the @@ -797,7 +1179,7 @@ netmonitor.context.newTab=Yangi ichki oynada ochish # for the Open in Debugger menu item displayed in the context menu of the # network container -# LOCALIZATION NOTE (netmonitor.openInDebugger.accesskey): This is the access key +# LOCALIZATION NOTE (netmonitor.context.openInDebugger.accesskey): This is the access key # for the Open in Debugger menu item displayed in the context menu of the # network container @@ -820,6 +1202,12 @@ netmonitor.context.perfTools=Ishlash natijalarini ishga tushirish… # as the title of the new custom request form netmonitor.custom.newRequest=Yangi so‘rov +# LOCALIZATION NOTE (netmonitor.custom.newRequestMethodLabel): This is the label displayed +# above the method text input field of the new custom request form + +# LOCALIZATION NOTE (netmonitor.custom.newRequestUrlLabel): This is the label displayed +# above the url text input field of the new custom request form + # LOCALIZATION NOTE (netmonitor.custom.query): This is the label displayed # above the query string entry in the custom request form netmonitor.custom.query=So‘rov satri: @@ -863,6 +1251,40 @@ netmonitor.backButton=Orqaga # of the column status code, when the request is cached and is from a service worker # %1$S is the status code, %2$S is the status text. +# LOCALIZATION NOTE (netmonitor.label.dropHarFiles): This is a label +# rendered within the Network panel when *.har file(s) are dragged +# over the content. + +# LOCALIZATION NOTE (netmonitor.label.har): This is a label used +# as a tooltip for toolbar drop-down button with HAR actions + +# LOCALIZATION NOTE (netmonitor.cache.cache): This is the label text for the parent +# node in the TreeView. + +# LOCALIZATION NOTE (netmonitor.cache.empty): This is the text displayed when cache +# information is not available. + +# LOCALIZATION NOTE (netmonitor.cache.notAvailable): This is the text displayed under +# a node that has no information available. + +# LOCALIZATION NOTE (netmonitor.cache.dataSize): This is the label text for +# the datasize of the cached object. + +# LOCALIZATION NOTE (netmonitor.cache.expires): This is the label text for the +# expires time of the cached object. + +# LOCALIZATION NOTE (netmonitor.cache.fetchCount): This is the label text for the +# fetch count of the cached object. + +# LOCALIZATION NOTE (netmonitor.cache.lastFetched): This is the label text for the +# last fetched date/time of the cached object. + +# LOCALIZATION NOTE (netmonitor.cache.lastModified): This is the label text for the +# last modified date/time of the cached object. + +# LOCALIZATION NOTE (netmonitor.cache.device): This is the label text for the device +# where a cached object was fetched from (e.g. "disk"). + # LOCALIZATION NOTE (netmonitor.security.state.insecure) # This string is used as an tooltip for request that was performed over insecure # channel i.e. the connection was not https diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/storage.dtd b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/storage.dtd index d8e8142846b118572009c27e72e32189233e3770..bb72d2522041e0fca756924a956c3c4ecba6426b 100644 --- a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/storage.dtd +++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/storage.dtd @@ -5,13 +5,17 @@ <!-- LOCALIZATION NOTE : This file contains the Storage Inspector strings. --> <!-- LOCALIZATION NOTE : Placeholder for the searchbox that allows you to filter the table items. --> -<!ENTITY searchBox.placeholder "Filter Items"> +<!ENTITY searchBox.placeholder "Elementlarni qidirish"> <!-- LOCALIZATION NOTE : Label of popup menu action to delete all storage items. --> -<!ENTITY storage.popupMenu.deleteAllLabel "Delete All"> <!-- LOCALIZATION NOTE : Label of popup menu action to delete all session cookies. --> -<!ENTITY storage.popupMenu.deleteAllSessionCookiesLabel "Delete All Session Cookies"> +<!-- LOCALIZATION NOTE : Label of popup menu action to copy a storage item. --> + +<!-- LOCALIZATION NOTE : Label of popup menu action to delete all storage items. --> +<!ENTITY storage.popupMenu.deleteAllLabel "Delete All"> +<!-- LOCALIZATION NOTE : Label of popup menu action to delete all session cookies. --> +<!ENTITY storage.popupMenu.deleteAllSessionCookiesLabel "Delete All Session Cookies"> <!-- LOCALIZATION NOTE : Label of popup menu action to copy a storage item. --> <!ENTITY storage.popupMenu.copyLabel "Copy"> diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/global/aboutStudies.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/global/aboutStudies.properties index 188139fdda3496746841374a827069f3351159a7..16673dc661fa700ed8668feb987e1571016b8e79 100644 --- a/thunderbird-l10n/uz/chrome/uz/locale/uz/global/aboutStudies.properties +++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/global/aboutStudies.properties @@ -3,11 +3,25 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. +# LOCALIZATION NOTE (title): keep "Shield" in English. See +# https://wiki.mozilla.org/Firefox/Shield/Shield_Studies for more information + +# LOCALIZATION NOTE (activeStudiesList): Title above a list of active studies +# LOCALIZATION NOTE (activeStudiesList): Title above a list of completed studies +# LOCALIZATION NOTE (activeStatus): Displayed for an active study +# LOCALIZATION NOTE (completeStatus): Displayed for a study that is already complete + +# LOCALIZATION NOTE (enabledList): %S is brandShortName (e.g. Firefox) + +# LOCALIZATION NOTE (preferenceStudyDescription) $1%S will be replaced with the +# name of a preference (such as "stream.improvesearch.topSiteSearchShortcuts") +# and $2%S will be replaced with the value of that preference. Both values will +# be formatted differently than the surrounding text. +preferenceStudyDescription = Bu tadqiqot %1$S parametri uchun %2$S qiymatini oʻrnatadi. # LOCALIZATION NOTE (title): keep "Shield" in English. See # https://wiki.mozilla.org/Firefox/Shield/Shield_Studies for more information title = Shield Studies removeButton = Remove - # LOCALIZATION NOTE (activeStudiesList): Title above a list of active studies activeStudiesList = Active studies # LOCALIZATION NOTE (activeStudiesList): Title above a list of completed studies @@ -16,7 +30,6 @@ completedStudiesList = Completed studies activeStatus = Active # LOCALIZATION NOTE (completeStatus): Displayed for a study that is already complete completeStatus = Complete - updateButtonWin = Update Options updateButtonUnix = Update Preferences learnMore = Learn more @@ -24,9 +37,3 @@ noStudies = You have not participated in any studies. disabledList = This is a list of studies that you have participated in. No new studies will run. # LOCALIZATION NOTE (enabledList): %S is brandShortName (e.g. Firefox) enabledList = What’s this? %S may install and run studies from time to time. - -# LOCALIZATION NOTE (preferenceStudyDescription) $1%S will be replaced with the -# name of a preference (such as "stream.improvesearch.topSiteSearchShortcuts") -# and $2%S will be replaced with the value of that preference. Both values will -# be formatted differently than the surrounding text. -preferenceStudyDescription = This study sets %1$S to %2$S. \ No newline at end of file diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/global/aboutWebrtc.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/global/aboutWebrtc.properties index 768796f1b62c4a908097b13366d416b55248ab2a..5efdddbcfc9e50a7684080db4bdf1c97c2b52376 100644 --- a/thunderbird-l10n/uz/chrome/uz/locale/uz/global/aboutWebrtc.properties +++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/global/aboutWebrtc.properties @@ -30,7 +30,7 @@ debug_mode_on_state_msg = tuzatish rejimi faol, kuzatish jurnali: %1$S aec_logging_msg_label = AEC jurnalga kiritish aec_logging_off_state_label = AEC jurnalga kiritishni boshlash aec_logging_on_state_label = AEC jurnalga kiritishni to‘xtatish -aec_logging_on_state_msg = AEC jurnalga kiritish faol (chaqiruvchi bilan bir necha daqiqa gaplashing va so‘ngra yozib olishni to‘xtating) +aec_logging_on_state_msg = AEC jurnalga kiritish faol (chaqiruvchi bilan bir necha daqiqa gaplashing va soʻngra yozib olishni toʻxtating) # LOCALIZATION NOTE (aec_logging_off_state_msg): # %1$S will be replaced by the full path to the directory containing the captured log files. @@ -49,6 +49,11 @@ sdp_heading = SDP local_sdp_heading = Mahalliy SDP remote_sdp_heading = Masofadagi SDP +# LOCALIZATION NOTE (offer, answer): +# offer and answer describe whether the local sdp is an offer or answer or +# the remote sdp is an offer or answer. These are appended to the local and +# remote sdp headings. + # LOCALIZATION NOTE (rtp_stats_heading): "RTP" is an abbreviation for the # Real-time Transport Protocol, an IETF specification, and should not # normally be translated. "Stats" is an abbreviation for Statistics. @@ -61,16 +66,6 @@ rtp_stats_heading = RTP statistikasi ice_state = ICE statistikasi ice_stats_heading = ICE statistikasi -# LOCALIZATION NOTE (av_sync_label): "A/V" stands for Audio/Video. -# "sync" is an abbreviation for sychronization. This is used as -# a data label. -av_sync_label = A/V sinxronlash - -# LOCALIZATION NOTE (jitter_buffer_delay_label): A jitter buffer is an -# element in the processing chain, see http://wikipedia.org/wiki/Jitter -# This is used as a data label. -jitter_buffer_delay_label = Jitter-buffer kechikish - # LOCALIZATION NOTE (avg_bitrate_label, avg_framerate_label): "Avg." is an abbreviation # for Average. These are used as data labels. avg_bitrate_label = O‘rtacha bitreyt @@ -92,6 +87,13 @@ nominated = Belgilangan # or are left blank. This represents an attribute of an ICE candidate. selected = Tanlangan +# LOCALIZATION NOTE (trickle_caption_msg2, trickle_highlight_color_name2): ICE +# candidates arriving after the remote answer arrives are considered trickled +# (an attribute of an ICE candidate). These are highlighted in the ICE stats +# table with light blue background. %S is replaced by +# trickle_highlight_color_name2 ("blue"), highlighted with a light blue +# background to visually match the trickled ICE candidates. + save_page_label = Sahifani saqlash debug_mode_msg_label = Tuzatish rejimi debug_mode_off_state_label = Tuzatish rejimini ishga tushirish diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/global/autocomplete.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/global/autocomplete.properties index c29684d23169767279479140776b0e4accddb59f..c0d2b6d926c1be2f4d0289de29e34a4460cd4367 100644 --- a/thunderbird-l10n/uz/chrome/uz/locale/uz/global/autocomplete.properties +++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/global/autocomplete.properties @@ -2,10 +2,15 @@ # 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/. -# LOCALIZATION NOTE (searchWithEngine): %S will be replaced with -# the search engine provider's name. This format was chosen because -# the provider can also end with "Search" (e.g.: MSN Search). -searchWithEngine = %S bilan izlash +# LOCALIZATION NOTE (searchWithEngine, searchInPrivateWindowWithEngine): %S will +# be replaced with the search engine provider's name. This format was chosen +# because the provider can also end with "Search" (e.g.: MSN Search). +searchWithEngine = %S orqali izlash + +searchInPrivateWindowWithEngine = Maxfiy oynada %S yordamida izlash + +# LOCALIZATION NOTE (searchInPrivateWindow): Used when the private browsing +# engine is the same as the default engine. # LOCALIZATION NOTE (switchToTab2): This is the same as the older switchToTab # string that it's replacing, except it uses title case, so "Switch" and "Tab" @@ -22,7 +27,6 @@ visit = Kirish # search text that the user is typing. %2$S will not be empty. bookmarkKeywordSearch = %1$S: %2$S -searchInPrivateWindowWithEngine = Search with %S in a Private Window # LOCALIZATION NOTE (searchInPrivateWindow): Used when the private browsing # engine is the same as the default engine. searchInPrivateWindow = Search in a Private Window diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/mozapps/downloads/downloads.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/mozapps/downloads/downloads.properties index 488dd82a0a09e2237cdca9eb3b208f3953ffd991..4f9839b972cb13130e23477610556021407f09da 100644 --- a/thunderbird-l10n/uz/chrome/uz/locale/uz/mozapps/downloads/downloads.properties +++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/mozapps/downloads/downloads.properties @@ -47,7 +47,7 @@ infiniteRate=Juda tez # LOCALIZATION NOTE (statusFormat3): — is the "em dash" (long dash) # %1$S transfer progress; %2$S rate number; %3$S rate unit; %4$S time left # example: 4 minutes left — 1.1 of 11.1 GB (2.2 MB/sec) -statusFormat3=%4$S — %1$S (%2$S %3$S/sec) +statusFormat3=%4$S — %1$S (%2$S %3$S/soniya # LOCALIZATION NOTE (statusFormatInfiniteRate): — is the "em dash" (long dash) # %1$S transfer progress; %2$S substitute phrase for Infinity speed; %3$S time left @@ -81,12 +81,17 @@ transferNoTotal2=%1$S %2$S # example: 1m; 11h # LOCALIZATION NOTE (timeLeftSingle3): %1$S time left # example: 1m left; 11h left +timeLeftSingle3=%1$S qoldi # LOCALIZATION NOTE (timeLeftDouble3): %1$S time left; %2$S time left sub units # example: 11h 2m left; 1d 22h left +timeLeftDouble3=%1$S %2$S qoldi +timeFewSeconds2=Bir necha soniya qoldi +timeUnknown2=Qolgan vaqt nomaʼlum # LOCALIZATION NOTE (doneSize): #1 size number; #2 size unit doneSize=#1 #2 -# LOCALIZATION NOTE (doneScheme): #1 URI scheme like data: jar: about: + +# LOCALIZATION NOTE (doneScheme2): #1 URI scheme like data: jar: about: doneScheme2=%1$S resurs # LOCALIZATION NOTE (doneFileScheme): Special case of doneScheme for file: # This is used as an eTLD replacement for local files, so make it lower case @@ -94,12 +99,9 @@ doneFileScheme=mahalliy fayl # LOCALIZATION NOTE (yesterday): Displayed time for files finished yesterday yesterday=Kecha -# LOCALIZATION NOTE (monthDate): #1 month name; #2 date number; e.g., January 22 -monthDate2=%1$S %2$S fileExecutableSecurityWarning="%S" bajariladigan fayl. Bajariladigan fayllarda viruslar yoki kompyuteringizga zarar keltiradigan boshqa kodlar boʻlishi mumkin. Bu faylni ochishda ogohlantirishdan foydalaning. "%S"ni ishga tushirishga rozimisiz? fileExecutableSecurityWarningTitle=Bajariladigan fayl ochilsinmi? -fileExecutableSecurityWarningDontAsk=Bu mendan yana soʻralmasin # Desktop folder name for downloaded files downloadsFolder=Yuklab olishlar @@ -123,11 +125,3 @@ shortDays=d;d # LOCALIZATION NOTE (timePair3): %1$S time number; %2$S time unit # example: 1m; 11h timePair3=%1$S%2$S -# LOCALIZATION NOTE (timeLeftSingle3): %1$S time left -# example: 1m left; 11h left -timeLeftSingle3=%1$S left -# LOCALIZATION NOTE (timeLeftDouble3): %1$S time left; %2$S time left sub units -# example: 11h 2m left; 1d 22h left -timeLeftDouble3=%1$S %2$S left -timeFewSeconds2=A few seconds left -timeUnknown2=Unknown time left diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/mozapps/extensions/extensions.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/mozapps/extensions/extensions.properties index eb13f2f29f29fea1bc9eec0d4e567956788017e4..0511246ba16ac41684dfd9249a2f8fd017bce72c 100644 --- a/thunderbird-l10n/uz/chrome/uz/locale/uz/mozapps/extensions/extensions.properties +++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/mozapps/extensions/extensions.properties @@ -2,14 +2,6 @@ # 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/. -#LOCALIZATION NOTE (aboutWindowTitle) %S is the addon name -aboutWindowTitle=%S haqida -aboutWindowCloseButton=Yopish -#LOCALIZATION NOTE (aboutWindowVersionString) %S is the addon version -aboutWindowVersionString=%S versiyasi -#LOCALIZATION NOTE (aboutAddon) %S is the addon name -aboutAddon=%S haqida - #LOCALIZATION NOTE (uninstallNotice) %S is the add-on name uninstallNotice=%S o'chirildi. @@ -27,7 +19,6 @@ notification.incompatible=%1$S - %2$S %3$S bilan mos emas. notification.unsignedAndDisabled=%1$S qo‘shimcha dasturi %2$S brauzerida foydalanish uchun tasdiqdan o‘tmadi, shuning uchun u o‘chirib qo‘yildi. notification.unsigned=%1$S qo‘shimcha dasturi %2$S brauzerida foydalanish uchun tasdiqdan o‘tmadi. Jarayonni ehtiyotkorlik bilan davom ettiring. notification.unsigned.link=Batafsil ma’lumot -#LOCALIZATION NOTE (notification.nonMpcDisabled) %1$S is the add-on name #LOCALIZATION NOTE (notification.blocked) %1$S is the add-on name notification.blocked=Xavfsizlik va ishonchlilik sabablariga koʻra %1$S oʻchirilgan notification.blocked.link=Koʻproq ma`lumot @@ -43,16 +34,7 @@ notification.vulnerableUpdatable.link=Hozir yangilash #LOCALIZATION NOTE (notification.vulnerableNoUpdate) %1$S is the add-on name notification.vulnerableNoUpdate=%1$S zararli deb aniqlangan. Ehtiyot boʻlib foydalaning. notification.vulnerableNoUpdate.link=Koʻproq ma`lumot -#LOCALIZATION NOTE (notification.enable) %1$S is the add-on name, %2$S is brand name -notification.enable=%1$S %2$Sni qayta ishga tushirganingizdan soʻng oʻrnatiladi. -#LOCALIZATION NOTE (notification.disable) %1$S is the add-on name, %2$S is brand name -notification.disable=%1$S %2$Sni qayta ishga tushirganingizdan soʻng oʻchirib qoʻyiladi. -#LOCALIZATION NOTE (notification.install) %1$S is the add-on name, %2$S is brand name -notification.install=%1$S - %2$Sni qayta ishga tushirganingizdan soʻng oʻrnatiladi. -#LOCALIZATION NOTE (notification.uninstall) %1$S is the add-on name, %2$S is brand name -notification.uninstall=%1$S - %2$Sni qayta ishga tushirganingizdan soʻng oʻchiriladi. -#LOCALIZATION NOTE (notification.upgrade) %1$S is the add-on name, %2$S is brand name -notification.upgrade=%1$S - %2$Sni qayta ishga tushirganingizdan soʻng yangilanadi. +#LOCALIZATION NOTE (notification.restartless-uninstall) %1$S is the add-on name #LOCALIZATION NOTE (notification.downloadError) %1$S is the add-on name. notification.downloadError=%1$Sni yuklab olishda xato yuz berdi. notification.downloadError.retry=Yana urinib koʻrish @@ -72,8 +54,6 @@ installDownloaded=Yuklab olindi installDownloadFailed=Yuklab olishda xato installVerifying=Tekshirilmoqda installInstalling=Oʻrnatilmoqda -installEnablePending=Yoqish uchun qayta ishga tushirish -installDisablePending=Oʻchirish uchun qayta ishga tushiring installFailed=Oʻrnatishda xato installCancelled=Oʻrnatish bekor qilindi @@ -83,7 +63,6 @@ details.notification.incompatible=%1$S - %2$S %3$S bilan mos emas. details.notification.unsignedAndDisabled=%1$S qo‘shimcha dasturi %2$S brauzerida foydalanish uchun tasdiqdan o‘tmadi, shuning uchun u o‘chirib qo‘yildi. details.notification.unsigned=%1$S qo‘shimcha dasturi %2$S brauzerida foydalanish uchun tasdiqdan o‘tmadi. Jarayonni ehtiyotkorlik bilan davom ettiring. details.notification.unsigned.link=Batafsil ma’lumot -#LOCALIZATION NOTE (details.notification.nonMpcDisabled) %1$S is the add-on name #LOCALIZATION NOTE (details.notification.blocked) %1$S is the add-on name details.notification.blocked=%1$S xavfsizlik va ishonchlilik sabablariga koʻra oʻchirib qoʻyildi. details.notification.blocked.link=Koʻproq ma`lumot @@ -99,106 +78,44 @@ details.notification.vulnerableUpdatable.link=Hozir yangilash #LOCALIZATION NOTE (details.notification.vulnerableNoUpdate) %1$S is the add-on name details.notification.vulnerableNoUpdate=%1$S zararli dastur hisoblanadi. Ehtiyot boʻlib foydalaning. details.notification.vulnerableNoUpdate.link=Koʻproq ma`lumot -#LOCALIZATION NOTE (details.notification.enable) %1$S is the add-on name, %2$S is brand name -details.notification.enable=%1$S %2$S qayta ishga tushirilgandan keyin yoqiladi. -#LOCALIZATION NOTE (details.notification.disable) %1$S is the add-on name, %2$S is brand name -details.notification.disable=%1$S %2$S qayta ishga tushirilgandan soʻng oʻchiriladi. -#LOCALIZATION NOTE (details.notification.install) %1$S is the add-on name, %2$S is brand name -details.notification.install=%1$S %2$S qayta ishga tushirilgandan soʻng oʻrnatiladi. -#LOCALIZATION NOTE (details.notification.uninstall) %1$S is the add-on name, %2$S is brand name -details.notification.uninstall=%1$S - %2$Sni qayta ishga tushirganingizdan soʻng oʻchiriladi. -#LOCALIZATION NOTE (details.notification.upgrade) %1$S is the add-on name, %2$S is brand name -details.notification.upgrade=%1$S - %2$Sni qayta ishga tushirganingizdan soʻng yangilanadi. +#LOCALIZATION NOTE (details.notification.restartless-uninstall) %1$S is the add-on name. #LOCALIZATION NOTE (details.notification.gmpPending) %1$S is the add-on name details.notification.gmpPending=%1$S tezda o‘rnatiladi. -# LOCALIZATION NOTE (details.experiment.time.daysRemaining): -# Semicolon-separated list of plural forms. -# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals -# #1 is the number of days from now that the experiment will remain active (detail view). -details.experiment.time.daysRemaining=#1 kun qolmoqda;#1 kun qolmoqda -#LOCALIZATION NOTE (details.experiment.time.endsToday) The experiment will end in less than a day (detail view). -details.experiment.time.endsToday=Bir kundan oz vaqt qolmoqda -# LOCALIZATION NOTE (details.experiment.time.daysPassed): -# Semicolon-separated list of plural forms. -# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals -# #1 is the number of days since the experiment ran (detail view). -details.experiment.time.daysPassed=#1 kun oldin;#1 kun oldin -#LOCALIZATION NOTE (details.experiment.time.endedToday) The experiment ended less than a day ago (detail view). -details.experiment.time.endedToday=Bir kundan kamroq vaqt oldin -#LOCALIZATION NOTE (details.experiment.state.active) This experiment is active (detail view). -details.experiment.state.active=Faol -#LOCALIZATION NOTE (details.experiment.state.complete) This experiment is complete (it was previously active) (detail view). -details.experiment.state.complete=Tugadi - -# LOCALIZATION NOTE (experiment.time.daysRemaining): -# Semicolon-separated list of plural forms. -# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals -# #1 is the number of days from now that the experiment will remain active (list view item). -experiment.time.daysRemaining=#1 kun qolmoqda;#1 kun qolmoqda -#LOCALIZATION NOTE (experiment.time.endsToday) The experiment will end in less than a day (list view item). -experiment.time.endsToday=Bir kundan kam vaqt qolmoqda -# LOCALIZATION NOTE (experiment.time.daysPassed): -# Semicolon-separated list of plural forms. -# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals -# #1 is the number of days since the experiment ran (list view item). -experiment.time.daysPassed=#1 kun oldin;#1 kun oldin -#LOCALIZATION NOTE (experiment.time.endedToday) The experiment ended less than a day ago (list view item). -experiment.time.endedToday=Bir kundan kamroq vaqt oldin -#LOCALIZATION NOTE (experiment.state.active) This experiment is active (list view item). -experiment.state.active=Faol -#LOCALIZATION NOTE (experiment.state.complete) This experiment is complete (it was previously active) (list view item). -experiment.state.complete=Tugadi - installFromFile.dialogTitle=Oʻrnatish uchun qoʻshimcha dasturni tanlang installFromFile.filterName=Qoʻshimcha dasturlar uninstallAddonTooltip=Bu qoʻshimcha dasturni oʻchirish -uninstallAddonRestartRequiredTooltip=Bu qoʻshimcha dasturni oʻchirish (qayta ishga tushirish talab qilinadi) enableAddonTooltip=Bu qoʻshimcha dasturni yoqish -enableAddonRestartRequiredTooltip=Bu qoʻshimcha dasturni yoqish (qayta ishga tushirish talab qilinadi) disableAddonTooltip=Bu qoʻshimcha dasturni oʻchirish -disableAddonRestartRequiredTooltip=Bu qoʻshimcha dasturni oʻchirib qoʻyish (qayta ishga tushirish talab qilinadi) - -#LOCALIZATION NOTE (showAllSearchResults): Semicolon-separated list of plural forms. -# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals -# #1 is the total number of search results -showAllSearchResults=Bitta natijani koʻrish;Barcha #1 ta narijalarni koʻrish - -#LOCALIZATION NOTE (addon.purchase.label) displayed on a button in the list -# view, %S is the price of the add-on including currency symbol -addon.purchase.label=%Sni sotib olish… -addon.purchase.tooltip=Bu qoʻshimcha dasturni sotib olish uchun qoʻshimcha dasturlar galeriyasiga tashrif buyuring -#LOCALIZATION NOTE (cmd.purchaseAddon.label) displayed on a button in the detail -# view, %S is the price of the add-on including currency symbol -cmd.purchaseAddon.label=%Sni sotib olish… -cmd.purchaseAddon.accesskey=s - -#LOCALIZATION NOTE (eulaHeader) %S is name of the add-on asking the user to agree to the EULA -eulaHeader=Oʻrnatish davom etishi uchun %S quyidagi foydalanish litsenziyasiga rozi boʻlishingiz talab qiladi: type.extension.name=Kengaytmalar -type.theme.name=Koʻrinish +type.themes.name=Mavzular type.locale.name=Tillar type.plugin.name=Plaginlar type.dictionary.name=Lugʻatlar type.service.name=Xizmatlar -type.experiment.name=Tajribalar + +#LOCALIZATION NOTE(legacyWarning.description) %S is the brandShortName +#LOCALIZATION NOTE(legacyThemeWarning.description) %S is the brandShortName +legacyThemeWarning.description=Biror narsa yetishmayaptimi? Ayrim mavzular endi %Sda ishlamaydi. + +#LOCALIZATION NOTE(listHeading.discover) %S is the brandShortName +listHeading.theme=Mavzularni boshqarish + +searchLabel.theme=Yana mavzu topish #LOCALIZATION NOTE (notification.restartless-uninstall) %1$S is the add-on name notification.restartless-uninstall=%1$S will be uninstalled after you close this tab. #LOCALIZATION NOTE (details.notification.restartless-uninstall) %1$S is the add-on name. details.notification.restartless-uninstall=%1$S will be uninstalled after you close this tab. -type.themes.name=Themes type.legacy.name=Legacy Extensions type.unsupported.name=Unsupported #LOCALIZATION NOTE(listHeading.discover) %S is the brandShortName listHeading.discover=Personalize Your %S listHeading.extension=Manage Your Extensions listHeading.shortcuts=Manage Extension Shortcuts -listHeading.theme=Manage Your Themes listHeading.plugin=Manage Your Plugins listHeading.locale=Manage Your Languages listHeading.dictionary=Manage Your Dictionaries searchLabel.extension=Find more extensions -searchLabel.theme=Find more themes diff --git a/thunderbird-l10n/uz/localization/uz/devtools/client/toolbox-options.ftl b/thunderbird-l10n/uz/localization/uz/devtools/client/toolbox-options.ftl index b876c2a5f04fbf2d3f1dd083d4224f8c0e7dcd58..c212c4c6abf4f0adf60fdb67953b71535e535d39 100644 --- a/thunderbird-l10n/uz/localization/uz/devtools/client/toolbox-options.ftl +++ b/thunderbird-l10n/uz/localization/uz/devtools/client/toolbox-options.ftl @@ -62,7 +62,7 @@ options-sourceeditor-autoclosebrackets-label = Qavslarni avtomatik yopish options-sourceeditor-expandtab-tooltip = .title = Ichki oyna belgisi o‘rniga bo‘sh joylardan foydalanish options-sourceeditor-expandtab-label = Bo‘sh joylardan foydalanib xat boshidan boshlash -options-sourceeditor-tabsize-label = Ichki oyna hajmi +options-sourceeditor-tabsize-label = Varaq hajmi options-sourceeditor-keybinding-label = Tugmalar birikmasi options-sourceeditor-keybinding-default-label = Standart @@ -88,9 +88,6 @@ options-enable-service-workers-http-tooltip = .title = Asboblar paneli bo‘lgan barcha ichki oynalar uchun HTTP ustida service workers ta’minotni yoqib qo‘yadi. # The message shown for settings that trigger page reload options-context-triggers-page-refresh = * Faqat joriy seans, sahifani qayta yuklaydi - -## - # The label for the checkbox that toggles the display of the platform data in the # Profiler i.e. devtools.profiler.ui.show-platform-data a boolean preference in about:config options-show-platform-data-label = Gecko platformasi ma’lumotlarini koʻrsatish diff --git a/thunderbird-l10n/uz/localization/uz/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/uz/localization/uz/toolkit/about/aboutAddons.ftl index 483f8679bd4e81348c74f5c6c94c971695d0a4af..fed91769b072e5f1277df1fa9b5f9e2330743b73 100644 --- a/thunderbird-l10n/uz/localization/uz/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/uz/localization/uz/toolkit/about/aboutAddons.ftl @@ -117,18 +117,39 @@ disabled-unsigned-heading = disabled-unsigned-description = Quyidagi qo‘shimcha dasturlar { -brand-short-name } brauzerida foydalanish uchun tasdiqdan o‘tmagan. Siz <label data-l10n-name="find-addons">almashtiriladiganlarini topishingiz</label> yoki dasturchidan ularni tasdiqlashini so‘rashingiz mumkin. disabled-unsigned-learn-more = Onlayn xavfsizligingizni ta’minlash uchun qilayotgan harakatlarimiz haqida batafsil ma’lumot oling. disabled-unsigned-devinfo = Dasturchilar qo‘shimcha dasturlarini bizning qo‘llanmamizni o‘qib, tasdiqdan o‘tkazishga <label data-l10n-name="learn-more">qiziqishadi</label>. +extensions-view-discopane = + .name = Tavsiyalar + .tooltiptext = { extensions-view-discopane.name } extensions-view-recent-updates = .name = Soʻnggi yangilanishlar .tooltiptext = { extensions-view-recent-updates.name } extensions-view-available-updates = .name = Mavjud yangilanishlar .tooltiptext = { extensions-view-available-updates.name } +addon-category-discover = Tavsiyalar +addon-category-discover-title = + .title = Tavsiyalar addon-category-extension = Kengaytmalar +addon-category-extension-title = + .title = Kengaytmalar +addon-category-theme = Mavzular +addon-category-theme-title = + .title = Mavzular addon-category-plugin = Plaginlar +addon-category-plugin-title = + .title = Plaginlar addon-category-dictionary = Lugʻatlar +addon-category-dictionary-title = + .title = Lugʻatlar addon-category-locale = Tillar +addon-category-locale-title = + .title = Tillar addon-category-available-updates = Mavjud yangilanishlar +addon-category-available-updates-title = + .title = Mavjud yangilanishlar addon-category-recent-updates = Soʻnggi yangilanishlar +addon-category-recent-updates-title = + .title = Soʻnggi yangilanishlar ## These are global warnings @@ -233,14 +254,31 @@ addon-open-about-debugging = Qo‘shimcha dasturlarni tuzatish ## Recommended add-ons page +# Explanatory introduction to the list of recommended add-ons. The action word +# ("recommends") in the final sentence is a link to external documentation. +discopane-intro = + Kengaytmalar va mavzular brauzeringiz uchun ilovalarga oʻxshaydi. + Ular parollaringizni himoya qiladi, videolarni yuklab oladi, chegirmalarni topadi, + asabbuzar reklamalarni bloklaydi, brauzer koʻrinishini oʻzgartiradi. + Bunday kichik dasturiy taʼminotlarni begona dasturchilar ishlab chiqadi. + Bu yerdan mutlaq xavfsizligingiz, samaradorlik va funksionallik uchun { -brand-product-name } + <a data-l10n-name="learn-more-trigger">tavsiya etiladigan</a> kengaytma + va mavzular toʻplamini topish mumkin. +# Notice to make user aware that the recommendations are personalized. +discopane-notice-recommendations = + Ayrim tavsiyalar aynan siz uchun moslashtirilgan. Ular siz oʻrnatgan boshqa + kengaytmalar, profil sozlamalari va foydalanish statistikasi asosida tavsiya etiladi. ## Add-on actions ## Pending uninstall message bar +recommended-themes-heading = Tavsiya etilgan mavzular ## Page headings +theme-heading = Mavzularni boshqarish +theme-heading-search-label = Yana mavzu topish addon-page-options-button = .title = Barcha qoʻshimcha dasturlar uchun asboblar diff --git a/thunderbird-l10n/uz/localization/uz/toolkit/about/abuseReports.ftl b/thunderbird-l10n/uz/localization/uz/toolkit/about/abuseReports.ftl index 6fbe8159b2db12df85a3ecca3b73921192c6e43f..dba234989c30cf00cbf5612313535d0ce8055479 100644 --- a/thunderbird-l10n/uz/localization/uz/toolkit/about/abuseReports.ftl +++ b/thunderbird-l10n/uz/localization/uz/toolkit/about/abuseReports.ftl @@ -1,3 +1,26 @@ # 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/. + +abuse-report-learnmore = + Qaysi muammoni tanlashni bilamayapsizmi? + <a data-l10n-name="learnmore-link">Kengaytma va mavzular ustidan shikoyat qilish haqida batafsil</a> + +## Panel buttons. + + +## Message bars descriptions. + + +## Variables: +## $addon-name (string) - Name of the add-on + + +## Message bars actions. + + +## Abuse report reasons (optionally paired with related examples and/or suggestions) + +abuse-report-settings-reason = Qidiruv tizimi, bosh sahifa va yangi varaqlarni mendan soʻramasdan va menga xabar bermay oʻzgartiryapti +abuse-report-settings-reason-v2 = Qidiruv tizimi, bosh sahifa va yangi varaqlarni mendan soʻramasdan va menga xabar bermay oʻzgartiryapti +abuse-report-settings-suggestions-search = Qidiruv tizimi sozlamalari standart holat boʻyicha oʻzgaryapti diff --git a/thunderbird-l10n/uz/localization/uz/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/uz/localization/uz/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..6fbe8159b2db12df85a3ecca3b73921192c6e43f --- /dev/null +++ b/thunderbird-l10n/uz/localization/uz/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,3 @@ +# 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/. diff --git a/thunderbird-l10n/uz/manifest.json b/thunderbird-l10n/uz/manifest.json index 7abec26c6a4b7cb84618589670300fd85023c9aa..a09aed06573db707d833406c0e82fb897ab0e42d 100644 --- a/thunderbird-l10n/uz/manifest.json +++ b/thunderbird-l10n/uz/manifest.json @@ -1,57 +1,57 @@ { + "langpack_id": "uz", + "version": "76.0buildid20200420212409", + "sources": { + "browser": { + "base_path": "browser/" + } + }, + "description": "Language pack for Thunderbird for uz", + "applications": { + "gecko": { + "strict_min_version": "76.0", + "strict_max_version": "76.*", + "id": "langpack-uz@thunderbird.mozilla.org" + } + }, + "manifest_version": 2, "name": "Uzbek Language Pack", "languages": { "uz": { + "version": "20200417010542", "chrome_resources": { - "devtools-startup": "chrome/uz/locale/uz/devtools/startup/", + "communicator": "chrome/uz/locale/uz/communicator/", "messenger": "chrome/uz/locale/uz/messenger/", + "messenger-region": "chrome/uz/locale/uz/messenger-region/", "devtools-shared": "chrome/uz/locale/uz/devtools/shared/", + "calendar": "chrome/uz/locale/uz/calendar/", + "messenger-newsblog": "chrome/uz/locale/uz/messenger-newsblog/", + "pluginproblem": "chrome/uz/locale/uz/pluginproblem/", + "necko": "chrome/uz/locale/uz/necko/", "mozapps": "chrome/uz/locale/uz/mozapps/", - "communicator": "chrome/uz/locale/uz/communicator/", - "global": "chrome/uz/locale/uz/global/", - "autoconfig": "chrome/uz/locale/uz/autoconfig/", - "mozldap": "chrome/uz/locale/uz/mozldap/", - "messenger-smime": "chrome/uz/locale/uz/messenger-smime/", + "branding": "chrome/uz/locale/uz/branding/", "devtools": "chrome/uz/locale/uz/devtools/client/", - "messenger-mapi": "chrome/uz/locale/uz/messenger-mapi/", + "passwordmgr": "chrome/uz/locale/uz/passwordmgr/", + "messenger-smime": "chrome/uz/locale/uz/messenger-smime/", + "mozldap": "chrome/uz/locale/uz/mozldap/", + "devtools-startup": "chrome/uz/locale/uz/devtools/startup/", + "pipnss": "chrome/uz/locale/uz/pipnss/", + "places": "chrome/uz/locale/uz/places/", "pippki": "chrome/uz/locale/uz/pippki/", + "messenger-mapi": "chrome/uz/locale/uz/messenger-mapi/", + "chat": "chrome/uz/locale/uz/chat/", "lightning": "chrome/uz/locale/uz/lightning/", - "messenger-newsblog": "chrome/uz/locale/uz/messenger-newsblog/", - "pluginproblem": "chrome/uz/locale/uz/pluginproblem/", - "necko": "chrome/uz/locale/uz/necko/", "global-platform": { - "macosx": "chrome/uz/locale/uz/global-platform/mac/", "linux": "chrome/uz/locale/uz/global-platform/unix/", + "macosx": "chrome/uz/locale/uz/global-platform/mac/", "win": "chrome/uz/locale/uz/global-platform/win/", "android": "chrome/uz/locale/uz/global-platform/unix/" }, - "places": "chrome/uz/locale/uz/places/", - "messenger-region": "chrome/uz/locale/uz/messenger-region/", - "calendar": "chrome/uz/locale/uz/calendar/", - "branding": "chrome/uz/locale/uz/branding/", - "chat": "chrome/uz/locale/uz/chat/", "alerts": "chrome/uz/locale/uz/alerts/", - "pipnss": "chrome/uz/locale/uz/pipnss/", - "passwordmgr": "chrome/uz/locale/uz/passwordmgr/" - }, - "version": "20200403080946" - } - }, - "manifest_version": 2, - "author": "mozilla.org (contributors: Akmal Xushvaqov, Akmal Xushvaqov)", - "version": "76.0buildid20200407173003", - "sources": { - "browser": { - "base_path": "browser/" - } - }, - "applications": { - "gecko": { - "strict_min_version": "76.0", - "strict_max_version": "76.*", - "id": "langpack-uz@thunderbird.mozilla.org" + "autoconfig": "chrome/uz/locale/uz/autoconfig/", + "global": "chrome/uz/locale/uz/global/" + } } }, - "description": "Language pack for Thunderbird for uz", - "langpack_id": "uz" + "author": "mozilla.org (contributors: Akmal Xushvaqov, Akmal Xushvaqov)" } diff --git a/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/jsonview.properties b/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/jsonview.properties index 0c7517c17514a1b38da4ae49042d16e6d04f8319..cf0b61e580370761fde8ea8e93a3fd32a23dcd77 100644 --- a/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/jsonview.properties +++ b/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/jsonview.properties @@ -32,6 +32,8 @@ jsonViewer.Copy=Sao chép # LOCALIZATION NOTE (jsonViewer.ExpandAll): Label for expanding all nodes jsonViewer.ExpandAll=Mở rộng tất cả +jsonViewer.ExpandAllSlow=Mở rộng tất cả (chậm) + # LOCALIZATION NOTE (jsonViewer.CollapseAll): Label for collapsing all nodes jsonViewer.CollapseAll=Thu gọn tất cả @@ -50,5 +52,3 @@ jsonViewer.filterJSON=Bộ lọc JSON # LOCALIZATION NOTE (jsonViewer.reps.reference): Label used for cycle # references in an array. jsonViewer.reps.reference=Tham khảo chu kỳ - -jsonViewer.ExpandAllSlow=Expand All (slow) diff --git a/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/webconsole.properties b/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/webconsole.properties index 83682197f75684ce7808a9496fdb4987b334ecba..07c91b5b8686648271008da18e2c87ea09aa63cd 100644 --- a/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/webconsole.properties +++ b/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/webconsole.properties @@ -27,6 +27,7 @@ browserConsole.title=Dòng lệnh của trình duyệt # Console window when the pref `devtools.browsertoolbox.fission` is true. This # Browser Console will log messages from all processes, not just the the parent # process. +multiProcessBrowserConsole.title=Bảng điều khiển trình duyệt đa tiến trình # LOCALIZATION NOTE (timestampFormat): %1$02S = hours (24-hour clock), # %2$02S = minutes, %3$02S = seconds, %4$03S = milliseconds. @@ -191,6 +192,12 @@ webconsole.menu.openInNetworkPanel.accesskey=N webconsole.menu.resendNetworkRequest.label=Gửi lại yêu cầu webconsole.menu.resendNetworkRequest.accesskey=n +# LOCALIZATION NOTE (webconsole.menu.openNodeInInspector.label) +# Label used for a context-menu item displayed for DOM Node logs. Clicking on it will +# reveal that specific DOM Node in the Inspector. +webconsole.menu.openNodeInInspector.label=Hiển thị trong trình kiểm tra +webconsole.menu.openNodeInInspector.accesskey=Q + # LOCALIZATION NOTE (webconsole.menu.storeAsGlobalVar.label) # Label used for a context-menu item displayed for object/variable logs. Clicking on it # creates a new global variable pointing to the logged variable. @@ -226,6 +233,19 @@ webconsole.menu.openInSidebar.accesskey=V # copies the entire output of the console to the clipboard. webconsole.menu.exportClipboard.label=Xuất tin nhắn có thể hiển thị vào clipboard +# LOCALIZATION NOTE (webconsole.menu.timeWarp.label) +# Label used for a context-menu item displayed for any log. Clicking on it will +# jump to the execution point where the log item was generated. +webconsole.menu.timeWarp.label=Nhảy tới đây + +# LOCALIZATION NOTE (webconsole.jumpButton.tooltip) +# Label used for the tooltip on the "jump" button in the console. It's displayed when +# the user recorded execution with WebReplay, is now paused in the debugger, and hover a +# message in the console output. Clicking on it will jump to the execution point where the +# log item was generated. +# Parameters: %S is the level of the message. +webconsole.jumpButton.tooltip=%S - Nhảy tới đây + # LOCALIZATION NOTE (webconsole.menu.exportSubmenu.label) # Label used for a context-menu item displayed on the output. Clicking on it # opens a submenu where the user can select how to export messages. @@ -242,19 +262,6 @@ webconsole.menu.exportSubmenu.exportCliboard.label=Clipboard # the output of the console. webconsole.menu.exportSubmenu.exportFile.label=Tập tin -# LOCALIZATION NOTE (webconsole.menu.timeWarp.label) -# Label used for a context-menu item displayed for any log. Clicking on it will -# jump to the execution point where the log item was generated. -webconsole.menu.timeWarp.label=Nhảy tới đây - -# LOCALIZATION NOTE (webconsole.jumpButton.tooltip) -# Label used for the tooltip on the "jump" button in the console. It's displayed when -# the user recorded execution with WebReplay, is now paused in the debugger, and hover a -# message in the console output. Clicking on it will jump to the execution point where the -# log item was generated. -# Parameters: %S is the level of the message. -webconsole.jumpButton.tooltip=%S - Nhảy tới đây - # LOCALIZATION NOTE (webconsole.clearButton.tooltip) # Label used for the tooltip on the clear logs button in the console top toolbar bar. # Clicking on it will clear the content of the console. @@ -355,31 +362,40 @@ webconsole.filteredMessagesByText.tooltip=#1 đã ẩn bởi bộ lọc văn b # LOCALIZATION NOTE (webconsole.console.settings.menu.menuButton.tooltip) # Tooltip for the filter bar preferences menu. This menu will display multiple perefences for the # filter bar, such as enabling the compact toolbar mode, enable the timestamps, persist logs, etc +webconsole.console.settings.menu.button.tooltip=Cài đặt bảng điều khiển # LOCALIZATION NOTE (webconsole.console.settings.menu.item.compactToolbar.label) # Label for the `Compact Toolbar` preference option. This will turn the message filters buttons # into a Menu Button, making the filter bar more compact. +webconsole.console.settings.menu.item.compactToolbar.label=Thanh công cụ thu gọn # LOCALIZATION NOTE (webconsole.console.settings.menu.item.timestamps.label) # Label for enabling the timestamps in the Web Console. +webconsole.console.settings.menu.item.timestamps.label=Hiển thị dấu thời gian # LOCALIZATION NOTE (webconsole.console.settings.menu.item.timestamps.tooltip) +webconsole.console.settings.menu.item.timestamps.tooltip=Nếu bạn bật lệnh tùy chọn này và đầu ra trong bảng điều khiển Web sẽ hiển thị dấu thời gian # LOCALIZATION NOTE (webconsole.console.settings.menu.item.warningGroups.label) # Label for grouping the similar messages in the Web Console +webconsole.console.settings.menu.item.warningGroups.label=Gộp thông báo tương tự # LOCALIZATION NOTE (webconsole.console.settings.menu.item.warningGroups.tooltip) +webconsole.console.settings.menu.item.warningGroups.tooltip=Khi được bật, các thông báo tương tự được đặt thành các nhóm # LOCALIZATION NOTE (webconsole.console.settings.menu.item.autocomplete.label) # Label for enabling autocomplete for input in the Web Console +webconsole.console.settings.menu.item.autocomplete.label=Kích hoạt tự động hoàn thành # LOCALIZATION NOTE (webconsole.console.settings.menu.item.autocomplete.tooltip) +webconsole.console.settings.menu.item.autocomplete.tooltip=Nếu bạn bật tùy chọn này, đầu vào sẽ hiển thị các đề xuất khi bạn nhập vào nó # LOCALIZATION NOTE (webconsole.console.settings.menu.item.enablePersistentLogs.label) +webconsole.console.settings.menu.item.enablePersistentLogs.label=Nhật ký liên tục # LOCALIZATION NOTE (webconsole.console.settings.menu.item.enablePersistentLogs.tooltip) - -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.label) -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.tooltip) +webconsole.console.settings.menu.item.enablePersistentLogs.tooltip=Nếu bạn bật tùy chọn này, danh sách thông tin ra sẽ không bị xóa mỗi lần bạn điều hướng đến một trang mới # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.label) +webconsole.console.settings.menu.item.instantEvaluation.label=Đánh giá tức thì # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.tooltip) +webconsole.console.settings.menu.item.instantEvaluation.tooltip=Nếu bạn bật tùy chọn này, đầu vào sẽ được đánh giá ngay lập tức khi bạn nhập vào nó # LOCALIZATION NOTE (browserconsole.contentMessagesCheckbox.label) # Label used in the browser console filter bar. This label is used for a checkbox that @@ -553,58 +569,26 @@ webconsole.enterKey=Enter # LOCALIZATION NOTE (webconsole.input.openJavaScriptFile): This is a label # used for opening a file in the console input (Ctrl+O or Cmd+O on OSX while # being focused on the input). +webconsole.input.openJavaScriptFile=Mở tập tin JavaScript # LOCALIZATION NOTE (webconsole.input.openJavaScriptFileFilter): # This string is displayed as a filter when opening a file in the console input. +webconsole.input.openJavaScriptFileFilter=Tập tin JavaScript # LOCALIZATION NOTE (webconsole.input.selector.top): This is the term used # to describe the primary thread of execution in the page +webconsole.input.selector.top=Trên cùng # LOCALIZATION NOTE (webconsole.input.selector.tooltip): This is the tooltip # shown when users select a thread that they want to evaluate an # expression for. +webconsole.input.selector.tooltip=Chọn bối cảnh đánh giá + +# LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultEnabled): do not translate 'sameSite'. +webconsole.group.cookieSameSiteLaxByDefaultEnabled=Một số cookie đang sử dụng sai thuộc tính “sameSite“, do đó có thể không hoạt động như mong đợi +# LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultDisabled): do not translate 'sameSite'. +webconsole.group.cookieSameSiteLaxByDefaultDisabled=Một số cookie đang sử dụng sai thuộc tính được đề xuất “sameSite“ -# LOCALIZATION NOTE (multiProcessBrowserConsole.title): Title of the Browser -# Console window when the pref `devtools.browsertoolbox.fission` is true. This -# Browser Console will log messages from all processes, not just the the parent -# process. -multiProcessBrowserConsole.title=Multiprocess Browser Console -# LOCALIZATION NOTE (webconsole.menu.openNodeInInspector.label) -# Label used for a context-menu item displayed for DOM Node logs. Clicking on it will -# reveal that specific DOM Node in the Inspector. -webconsole.menu.openNodeInInspector.label=Reveal in Inspector -webconsole.menu.openNodeInInspector.accesskey=Q -# LOCALIZATION NOTE (webconsole.console.settings.menu.menuButton.tooltip) -# Tooltip for the filter bar preferences menu. This menu will display multiple perefences for the -# filter bar, such as enabling the compact toolbar mode, enable the timestamps, persist logs, etc -webconsole.console.settings.menu.button.tooltip=Console Settings -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.compactToolbar.label) -# Label for the `Compact Toolbar` preference option. This will turn the message filters buttons -# into a Menu Button, making the filter bar more compact. -webconsole.console.settings.menu.item.compactToolbar.label=Compact Toolbar -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.timestamps.label) -# Label for enabling the timestamps in the Web Console. -webconsole.console.settings.menu.item.timestamps.label=Show Timestamps -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.timestamps.tooltip) -webconsole.console.settings.menu.item.timestamps.tooltip=If you enable this option commands and output in the Web Console will display a timestamp -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.warningGroups.label) -# Label for grouping the similar messages in the Web Console -webconsole.console.settings.menu.item.warningGroups.label=Group Similar Messages -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.warningGroups.tooltip) -webconsole.console.settings.menu.item.warningGroups.tooltip=When enabled, similar messages are placed into groups -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.autocomplete.label) -# Label for enabling autocomplete for input in the Web Console -webconsole.console.settings.menu.item.autocomplete.label=Enable Autocompletion -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.autocomplete.tooltip) -webconsole.console.settings.menu.item.autocomplete.tooltip=If you enable this option the input will display suggestions as you type in it -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.enablePersistentLogs.label) -webconsole.console.settings.menu.item.enablePersistentLogs.label=Persist Logs -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.enablePersistentLogs.tooltip) -webconsole.console.settings.menu.item.enablePersistentLogs.tooltip=If you enable this option the output will not be cleared each time you navigate to a new page -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.label) -webconsole.console.settings.menu.item.instantEvaluation.label=Instant Evaluation -# LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.tooltip) -webconsole.console.settings.menu.item.instantEvaluation.tooltip=If you enable this option the input will be instantly evaluated as you type in it # LOCALIZATION NOTE (webconsole.editor.toolbar.reverseSearchButton.openReverseSearch.tooltip) # Label used for the tooltip on the reverse search button for opening the Reverse Search UI. # The Reverse Search is a feature that mimics the bash-like reverse search of @@ -627,21 +611,3 @@ webconsole.editor.toolbar.closeButton.tooltip2=Switch back to inline mode (%S) # displayed when the console is in regular mode. # Parameters: %S is the keyboard shortcut. webconsole.input.openEditorButton.tooltip2=Switch to multi-line editor mode (%S) -# LOCALIZATION NOTE (webconsole.input.openJavaScriptFile): This is a label -# used for opening a file in the console input (Ctrl+O or Cmd+O on OSX while -# being focused on the input). -webconsole.input.openJavaScriptFile=Open JavaScript File -# LOCALIZATION NOTE (webconsole.input.openJavaScriptFileFilter): -# This string is displayed as a filter when opening a file in the console input. -webconsole.input.openJavaScriptFileFilter=JavaScript Files -# LOCALIZATION NOTE (webconsole.input.selector.top): This is the term used -# to describe the primary thread of execution in the page -webconsole.input.selector.top=Top -# LOCALIZATION NOTE (webconsole.input.selector.tooltip): This is the tooltip -# shown when users select a thread that they want to evaluate an -# expression for. -webconsole.input.selector.tooltip=Select evaluation context -# LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultEnabled): do not translate 'sameSite'. -webconsole.group.cookieSameSiteLaxByDefaultEnabled=Some cookies are misusing the “sameSite“ attribute, so it won’t work as expected -# LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultDisabled): do not translate 'sameSite'. -webconsole.group.cookieSameSiteLaxByDefaultDisabled=Some cookies are misusing the recommended “sameSite“ attribute diff --git a/thunderbird-l10n/vi/chrome/vi/locale/vi/global-platform/mac/accessible.properties b/thunderbird-l10n/vi/chrome/vi/locale/vi/global-platform/mac/accessible.properties index 999b70a046ef98c6471f1de0a39fdc84ad8b6b92..9879da35c4c2ca23781d0e75fbe0375c8fc2622c 100644 --- a/thunderbird-l10n/vi/chrome/vi/locale/vi/global-platform/mac/accessible.properties +++ b/thunderbird-l10n/vi/chrome/vi/locale/vi/global-platform/mac/accessible.properties @@ -58,8 +58,7 @@ separator = dấu ngăn cách tabPanel = bảng thẻ # The roleDescription for the html:mark element highlight = tô sáng - # The roleDescription for the details element -details = details +details = chi tiết # The roleDescription for the summary element -summary = summary +summary = tóm tắt diff --git a/thunderbird-l10n/vi/chrome/vi/locale/vi/global/dom/dom.properties b/thunderbird-l10n/vi/chrome/vi/locale/vi/global/dom/dom.properties index 9f1a4f16ac1590343b8279852d654e5f6350828b..63ee2aaba2571d52d4ff3c5f9e78e489de66febb 100644 --- a/thunderbird-l10n/vi/chrome/vi/locale/vi/global/dom/dom.properties +++ b/thunderbird-l10n/vi/chrome/vi/locale/vi/global/dom/dom.properties @@ -55,6 +55,7 @@ FormValidationDateTimeRangeUnderflow=Vui lòng chọn một ngày không sớm h FormValidationStepMismatch=Vui lòng chọn một giá trị hợp lệ. Hai giá trị hợp lệ gần nhất là %S và %S. # LOCALIZATION NOTE (FormValidationStepMismatchOneValue): %S can be a number, a date or a time. This is called instead of FormValidationStepMismatch when the second value is the same as the first. FormValidationStepMismatchOneValue=Vui lòng chọn một giá trị hợp lệ. Giá trị hợp lệ gần nhất là %S. +# LOCALIZATION NOTE (FormValidationTimeReversedRangeUnderflowAndOverflow): %1$S,%2$S are time. FormValidationBadInputNumber=Vui lòng nhập số. EnablePrivilegeWarning=Việc sử dụng enablePrivilege không được khuyến khích. Vui lòng sử dụng đoạn mã chạy với thành phần cơ bản của hệ thống (vd. một phần mở rộng). FullscreenDeniedDisabled=Yêu cầu toàn màn hình đã bị từ chối vì API toàn màn hình bị tắt theo ưu tiên của người dùng. @@ -197,6 +198,9 @@ ManifestInvalidCSSColor=%1$S: %2$S không phải là màu CSS hợp lệ. # LOCALIZATION NOTE: %1$S is the name of the property whose value is invalid. %2$S is the (invalid) value of the property. E.g. "lang: 42 is not a valid language code." ManifestLangIsInvalid=%1$S: %2$S không phải là mã ngôn ngữ hợp lệ. # LOCALIZATION NOTE: %1$S is the name of the parent property whose value is invalid (e.g., "icons"). %2$S is the index of the image object that is invalid (from 0). %3$S is the name of actual member that is invalid. %4$S is the invalid value. E.g. "icons item at index 2 is invalid. The src member is an invalid URL http://:Invalid" +# LOCALIZATION NOTE: %1$S is the name of the parent property that that contains the unusable image object (e.g., "icons"). %2$S is the index of the image object that is unusable (from 0). E.g. "icons item at index 2 lacks a usable purpose. It will be ignored." +# LOCALIZATION NOTE: %1$S is the name of the parent property that contains the unsupported value (e.g., "icons"). %2$S is the index of the image object that has the unsupported value (from 0). %3$S are the unknown purposes. E.g. "icons item at index 2 includes unsupported purpose(s): a b." +# LOCALIZATION NOTE: %1$S is the name of the parent property that has a repeated purpose (e.g., "icons"). %2$S is the index of the image object that has the repeated purpose (from 0). %3$S is the repeated purposes. E.g. "icons item at index 2 includes repeated purpose(s): a b." # LOCALIZATION NOTE: Do not translate "postMessage" or DOMWindow. %S values are origins, like https://domain.com:port # LOCALIZATION NOTE: Do not translate 'YouTube'. %S values are origins, like https://domain.com:port # LOCALIZATION NOTE: Do not translate 'YouTube'. %S values are origins, like https://domain.com:port @@ -260,7 +264,10 @@ NotificationsInsecureRequestIsForbidden=Quyền thông báo chỉ có thể đư # LOCALIZATION NOTE: Do not translate "<script>". # LOCALIZATION NOTE: Do not translate "<script>". # LOCALIZATION NOTE: Do not translate "<script>". +ModuleSourceMalformed=URI nguồn module không đúng định dạng: “%S”. # LOCALIZATION NOTE: Do not translate "<script>". +ScriptSourceNotAllowed=URI nguồn <script> không được phép trong tài liệu này: “%S”. +ModuleSourceNotAllowed=URI nguồn module không được phép trong tài liệu này: “%S”. # LOCALIZATION NOTE: %1$S is the invalid property value and %2$S is the property name. # LOCALIZATION NOTE: Do not translate "ReadableStream". ReadableStreamReadingFailed=Không thể đọc dữ liệu từ ReadableStream: “%S”. @@ -273,7 +280,12 @@ OrientationEventWarning=Các cảm biến định hướng không còn được ProximityEventWarning=Các cảm biến tiệm cận không còn được sử dụng nữa. AmbientLightEventWarning=Các cảm biến ánh sáng xung quanh không còn được sử dụng nữa. # LOCALIZATION NOTE: Do not translate "storage", "indexedDB.open" and "navigator.storage.persist()". +IDBOpenDBOptions_StorageTypeWarning=Thuộc tính ‘storage’ trong tùy chọn được truyền cho indexedDB.open không còn được dùng nữa và sẽ sớm bị xóa. Để có được dung lượng lưu trữ liên tục, vui lòng thay thế thành navigator.storage.persist(). +DOMQuadBoundsAttrWarning=DOMQuad.bounds không còn được dùng nữa, sử dụng DOMQuad.getBounds() để thay thế UnsupportedEntryTypesIgnored=Bỏ qua entryTypes không được hỗ trợ: %S. +AllEntryTypesIgnored=Không có entryTypes hợp lệ; hủy bỏ đăng ký. + +# LOCALIZATION NOTE: do not localize key=“%S” modifiers=“%S” id=“%S” #LOCALIZATION NOTE(DeprecatedTestingInterfaceWarning): Do not translate this message. It's just testing only. DeprecatedTestingInterfaceWarning=TestingDeprecatedInterface là một giao diện chỉ dành cho thử nghiệm và đây là thông báo không dùng thử. @@ -292,6 +304,18 @@ MozfullscreenerrorDeprecatedPrefixWarning=onmozfullscreenerror không còn đư # LOCALIZATION NOTE(External_AddSearchProviderWarning): Do not translate AddSearchProvider. External_AddSearchProviderWarning=AddSearchProvider không còn được dùng nữa. # LOCALIZATION NOTE: Do not translate "MouseEvent.mozPressure" and "PointerEvent.pressure". +# LOCALIZATION NOTE: Do not translate MathML, align, numalign and denomalign. +# LOCALIZATION NOTE: Do not translate MathML and bevelled. +# LOCALIZATION NOTE: Do not translate thin, medium, thick and linethickness. +# LOCALIZATION NOTE: Do not translate small, normal, big and mathsize. +# LOCALIZATION NOTE: Do not translate veryverythinmathspace, verythinmathspace, +# thinmathspace, mediummathspace, thickmathspace, verythickmathspace, veryverythickmathspace and MathML. +# LOCALIZATION NOTE: Do not translate radical, notation and menclose. +# LOCALIZATION NOTE: Do not translate MathML or mfenced. +# LOCALIZATION NOTE: Do not translate MathML, subscriptshift and superscriptshift. +# LOCALIZATION NOTE: Do not translate MathML, background, color, fontfamily, fontsize, fontstyle and fontweight. +# LOCALIZATION NOTE: Do not translate MathML and XLink. +# LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL. # LOCALIZATION NOTE (EditorFileDropFailed): Do not translate contenteditable, %S is the error message explaining why the drop failed. EditorFileDropFailed=Dropping a file into a contenteditable element failed: %S. @@ -461,16 +485,9 @@ ScriptSourceLoadFailed=Loading failed for the <script> with source “%S”. ModuleSourceLoadFailed=Loading failed for the module with source “%S”. # LOCALIZATION NOTE: Do not translate "<script>". ScriptSourceMalformed=<script> source URI is malformed: “%S”. -ModuleSourceMalformed=Module source URI is malformed: “%S”. -# LOCALIZATION NOTE: Do not translate "<script>". -ScriptSourceNotAllowed=<script> source URI is not allowed in this document: “%S”. -ModuleSourceNotAllowed=Module source URI is not allowed in this document: “%S”. # LOCALIZATION NOTE: %1$S is the invalid property value and %2$S is the property name. InvalidKeyframePropertyValue=Keyframe property value “%1$S” is invalid according to the syntax for “%2$S”. MixedDisplayObjectSubrequestWarning=Loading insecure content within a plugin embedded in a secure connection is going to be removed. -# LOCALIZATION NOTE: Do not translate "storage", "indexedDB.open" and "navigator.storage.persist()". -IDBOpenDBOptions_StorageTypeWarning=The ‘storage’ attribute in options passed to indexedDB.open is deprecated and will soon be removed. To get persistent storage, please use navigator.storage.persist() instead. -AllEntryTypesIgnored=No valid entryTypes; aborting registration. # LOCALIZATION NOTE: do not localize key=“%S” modifiers=“%S” id=“%S” GTK2Conflict2=Key event not available on GTK2: key=“%S” modifiers=“%S” id=“%S” WinConflict2=Key event not available on some keyboard layouts: key=“%S” modifiers=“%S” id=“%S” diff --git a/thunderbird-l10n/vi/localization/vi/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/vi/localization/vi/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..728cd482c6171b589b9448dfcafdc024f8944f2c --- /dev/null +++ b/thunderbird-l10n/vi/localization/vi/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Chuyển hướng URI lịch +calendar-uri-redirect-description = + Máy chủ đang chuyển hướng URI cho lịch "{ $calendarName }". + Chấp nhận chuyển hướng và bắt đầu sử dụng URI mới cho lịch này? +calendar-uri-redirect-original-uri-label = URI hiện tại: +calendar-uri-redirect-target-uri-label = Chuyển hướng đến URI mới: diff --git a/thunderbird-l10n/vi/localization/vi/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/vi/localization/vi/devtools/client/aboutdebugging.ftl index 622d29da8ade5383ad63daba59fe35fda0d28400..5aa334926c4652c72c196dfce9a2379e0a2f4d97 100644 --- a/thunderbird-l10n/vi/localization/vi/devtools/client/aboutdebugging.ftl +++ b/thunderbird-l10n/vi/localization/vi/devtools/client/aboutdebugging.ftl @@ -186,6 +186,9 @@ about-debugging-browser-version-too-old = Trình duyệt được kết nối c # backward compatible changes broke the debugger in those scenarios (Bug 1528219). # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1") about-debugging-browser-version-too-old-67-debugger = Bảng trình gỡ lỗi có thể không hoạt động với trình duyệt được kết nối. Vui lòng sử dụng Firefox { $runtimeVersion } nếu bạn cần sử dụng trình gỡ lỗi với trình duyệt này. +# Dedicated message for a backward compatibility issue that occurs when connecting: +# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68. +about-debugging-browser-version-too-old-fennec = Phiên bản Firefox này không thể gỡ lỗi Firefox dành cho Android (68). Chúng tôi khuyên bạn nên cài đặt Firefox Nightly dành cho Android trên điện thoại để thử nghiệm. <a>Chi tiết khác</a> # This string is displayed in the runtime page if the remote browser version is too recent. # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd) diff --git a/thunderbird-l10n/vi/localization/vi/messenger/preferences/preferences.ftl b/thunderbird-l10n/vi/localization/vi/messenger/preferences/preferences.ftl index 10b945539784714f65d7dd9b788788c206bb3810..4def49fa989f2a96b6d4f3ef51cc7189847fb501 100644 --- a/thunderbird-l10n/vi/localization/vi/messenger/preferences/preferences.ftl +++ b/thunderbird-l10n/vi/localization/vi/messenger/preferences/preferences.ftl @@ -25,7 +25,7 @@ privacy-data-collection-header = Thu thập và sử dụng dữ liệu privacy-security-header = Bảo mật privacy-scam-detection-title = Phát hiện lừa đảo privacy-anti-virus-title = Trình chống vi-rút -privacy-certificates-title = Chứng chỉ +privacy-certificates-title = Chứng nhận chat-pane-header = Trò chuyện chat-status-title = Trạng thái chat-notifications-title = Thông báo diff --git a/thunderbird-l10n/vi/localization/vi/security/certificates/certManager.ftl b/thunderbird-l10n/vi/localization/vi/security/certificates/certManager.ftl index 7fbc7f8f41e010bee9dfebfd46d64e0d547fd397..193402abcc93fb1c395d855fd7ac63f10928850a 100644 --- a/thunderbird-l10n/vi/localization/vi/security/certificates/certManager.ftl +++ b/thunderbird-l10n/vi/localization/vi/security/certificates/certManager.ftl @@ -24,14 +24,6 @@ certmgr-detail-pretty-print-tab-title = .accesskey = C certmgr-pending-label = .value = Hiện đang xác minh chứng chỉ… -certmgr-subject-info-label = - .value = Cấp cho -certmgr-issuer-info-label = - .value = Cấp bởi -certmgr-period-of-validity-label = - .value = Thời gian hiệu lực -certmgr-fingerprints-label = - .value = Vân tay certmgr-subject-label = Cấp cho certmgr-issuer-label = Cấp bởi certmgr-period-of-validity = Thời gian hiệu lực @@ -40,18 +32,6 @@ certmgr-cert-detail = .title = Chi tiết chứng chỉ .buttonlabelaccept = Đóng .buttonaccesskeyaccept = C -certmgr-cert-detail-cn = - .value = Tên thông thường (CN) -certmgr-cert-detail-o = - .value = Tổ chức (O) -certmgr-cert-detail-ou = - .value = Đơn vị tổ chức (OU) -certmgr-cert-detail-serialnumber = - .value = Số sê-ri -certmgr-cert-detail-sha256-fingerprint = - .value = Vân tay SHA-256 -certmgr-cert-detail-sha1-fingerprint = - .value = Vân tay SHA1 certmgr-cert-detail-commonname = Tên thông thường (CN) certmgr-cert-detail-org = Tổ chức (O) certmgr-cert-detail-orgunit = Đơn vị tổ chức (OU) @@ -67,10 +47,10 @@ certmgr-edit-cert-trust-ssl = certmgr-edit-cert-trust-email = .label = Chứng chỉ này có thể nhận diện người dùng email. certmgr-delete-cert = - .title = Xóa chứng chỉ + .title = Xóa chứng nhận .style = width: 48em; height: 24em; certmgr-cert-name = - .label = Tên chứng chỉ + .label = Tên chứng nhận certmgr-cert-server = .label = Máy chủ certmgr-override-lifetime = @@ -80,13 +60,9 @@ certmgr-token-name = certmgr-begins-on = Bắt đầu certmgr-begins-label = .label = Bắt đầu -certmgr-begins-value = - .value = { certmgr-begins-label.label } certmgr-expires-on = Hết hạn vào certmgr-expires-label = .label = Hết hạn vào -certmgr-expires-value = - .value = { certmgr-expires-label.label } certmgr-email = .label = Địa chỉ email certmgr-serial = @@ -116,7 +92,7 @@ certmgr-restore = .label = Nhập… .accesskey = N certmgr-details = - .value = Trường chứng chỉ + .value = Trường chứng nhận .accesskey = F certmgr-fields = .value = Giá trị trường @@ -136,7 +112,7 @@ exception-mgr-supplemental-warning = Ngân hàng, cửa hiệu và trang công c exception-mgr-cert-location-url = .value = Địa chỉ: exception-mgr-cert-location-download = - .label = Nhận chứng chỉ + .label = Nhận chứng nhận .accesskey = G exception-mgr-cert-status-view-cert = .label = Xem… diff --git a/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutAddons.ftl index 9300147fd98b903053c952dde8de12b9fe57172a..cb8d66c74368ecab031ce3d769705f5bd0836694 100644 --- a/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = Cài đặt tiện ích từ tập tin… .accesskey = I help-button = Hỗ trợ tiện ích +sidebar-help-button-title = + .title = Hỗ trợ tiện ích preferences = { PLATFORM() -> [windows] Tùy chọn { -brand-short-name } @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = Công cụ cho tất cả tiện ích +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] Tùy chọn { -brand-short-name } + *[other] Tùy chỉnh { -brand-short-name } + } show-unsigned-extensions-button = .label = Không thể xác thực một số tiện ích show-all-extensions-button = @@ -168,13 +176,29 @@ extensions-view-available-updates = .name = Cập nhật có sẵn .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = Đề xuất +addon-category-discover-title = + .title = Đề xuất addon-category-extension = Tiện ích mở rộng +addon-category-extension-title = + .title = Tiện ích mở rộng addon-category-theme = Chủ đề +addon-category-theme-title = + .title = Chủ đề addon-category-plugin = Phần bổ trợ +addon-category-plugin-title = + .title = Phần bổ trợ addon-category-dictionary = Từ điển +addon-category-dictionary-title = + .title = Từ điển addon-category-locale = Ngôn ngữ +addon-category-locale-title = + .title = Ngôn ngữ addon-category-available-updates = Cập nhật có sẵn +addon-category-available-updates-title = + .title = Cập nhật có sẵn addon-category-recent-updates = Cập nhật gần đây +addon-category-recent-updates-title = + .title = Cập nhật gần đây ## These are global warnings @@ -287,6 +311,7 @@ shortcuts-no-commands = Các tiện ích mở rộng sau không có phím tắt: shortcuts-input = .placeholder = Nhập một phím tắt shortcuts-browserAction = Kích hoạt tiện ích mở rộng +shortcuts-browserAction2 = Kích hoạt nút thanh công cụ shortcuts-pageAction = Kích hoạt hành động trang shortcuts-sidebarAction = Chuyển đến thanh lề shortcuts-modifier-mac = Bao gồmCtrl, Alt, hoặc ⌘ @@ -311,6 +336,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Hiện ít hơn go-back-button = .tooltiptext = Quay lại +header-back-button = + .title = Quay lại ## Recommended add-ons page diff --git a/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutSupport.ftl index 15593bfcd09e767c83a1b2caaa1c317e7cff13a7..03dc6330b50bc64064b49ab3ae3f657cf6e48d65 100644 --- a/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutSupport.ftl @@ -160,7 +160,7 @@ intl-regional-prefs = Cài đặt khu vực ## See also https://firefox-source-docs.mozilla.org/remote/ remote-debugging-title = Gỡ lỗi từ xa (Giao thức Chromium) -remote-debugging-accepting-connections = Đang cho phép kết nối +remote-debugging-accepting-connections = Cho phép kết nối remote-debugging-url = URL ## @@ -267,6 +267,11 @@ sandbox-proc-type-content = nội dung sandbox-proc-type-file = nội dung tập tin sandbox-proc-type-media-plugin = phần bổ trợ phương tiện sandbox-proc-type-data-decoder = bộ giải mã dữ liệu +startup-cache-title = Bộ nhớ đệm khởi động +startup-cache-disk-cache-path = Đường dẫn bộ nhớ đệm trên đĩa +startup-cache-ignore-disk-cache = Bỏ qua bộ nhớ đệm trên đĩa +startup-cache-found-disk-cache-on-init = Tìm thấy bộ nhớ đệm trên đĩa khi khởi tạo +startup-cache-wrote-to-disk-cache = Ghi vào bộ nhớ đệm trên đĩa launcher-process-status-0 = Đã bật launcher-process-status-1 = Vô hiệu hóa do thất bại launcher-process-status-2 = Bắt buộc vô hiệu hóa @@ -290,6 +295,7 @@ touch-enabled = cảm ứng đã bật drag-enabled = thanh cuộn kéo đã bật keyboard-enabled = bàn phím đã bật autoscroll-enabled = tự động cuộn đã bật +zooming-enabled = pinch-zoom mượt được kích hoạt ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/vi/localization/vi/toolkit/about/certviewer.ftl b/thunderbird-l10n/vi/localization/vi/toolkit/about/certviewer.ftl index c4810d967f7c6883ea13fb919e0264c097e42693..3aa87a226a697f9a9b4918f6f3b3e85409104757 100644 --- a/thunderbird-l10n/vi/localization/vi/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/vi/localization/vi/toolkit/about/certviewer.ftl @@ -28,6 +28,8 @@ certificate-viewer-id = ID certificate-viewer-key-exchange-group = Nhóm trao đổi khóa certificate-viewer-key-id = ID khóa certificate-viewer-key-size = Kích thước khóa +# Inc. means Incorporated, e.g GitHub is incorporated in Delaware +certificate-viewer-inc-locality = Địa phương hợp nhất certificate-viewer-locality = Thành phố certificate-viewer-location = Địa chỉ certificate-viewer-logid = ID bản ghi @@ -94,3 +96,16 @@ certificate-viewer-download-pem = PEM (chứng chỉ) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM (chain) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = Tiện ích mở rộng này đã được đánh dấu là nghiêm trọng, có nghĩa là khách hàng phải từ chối chứng chỉ nếu họ không hiểu nó. +certificate-viewer-export = Xuất + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = Chứng nhận của bạn +certificate-viewer-tab-people = Mọi người +certificate-viewer-tab-servers = Máy chủ +certificate-viewer-tab-ca = Nhà thẩm định +certificate-viewer-tab-unkonwn = Không rõ diff --git a/thunderbird-l10n/vi/localization/vi/toolkit/global/processTypes.ftl b/thunderbird-l10n/vi/localization/vi/toolkit/global/processTypes.ftl index cd4d46d93f4a4bf2cea37ac761c91ada450e619c..ad505d678047751577f3f9a53823e017a431b418 100644 --- a/thunderbird-l10n/vi/localization/vi/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/vi/localization/vi/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = Nội dung web bị cô lập # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/vi/localization/vi/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/vi/localization/vi/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..518983ec988dcd630d8873addac858cb96bef57b --- /dev/null +++ b/thunderbird-l10n/vi/localization/vi/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = Bạn vừa chạy phiên bản cũ của { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = Tạo hồ sơ mới +profiledowngrade-sync = Sử dụng phiên bản { -brand-product-name } cũ hơn có thể làm hỏng dấu trang và lịch sử duyệt web đã được lưu vào cấu hình { -brand-product-name } hiện có. Để bảo vệ thông tin của bạn, hãy tạo một hồ sơ mới cho bản cài đặt này của { -brand-short-name }. Bạn luôn có thể đăng nhập bằng { -fxaccount-brand-name } để đồng bộ hóa dấu trang và lịch sử duyệt giữa các hồ sơ. +profiledowngrade-nosync = Sử dụng phiên bản { -brand-product-name } cũ hơn có thể làm hỏng dấu trang và lịch sử duyệt web đã được lưu vào cấu hình { -brand-product-name } hiện có. Để bảo vệ thông tin của bạn, hãy tạo một hồ sơ mới cho bản cài đặt này của { -brand-short-name }. +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] Thoát + *[other] Thoát + } diff --git a/thunderbird-l10n/vi/manifest.json b/thunderbird-l10n/vi/manifest.json index 5af068973850960941bfba6e4c26e51673f47fc1..60e3aafed0b87a3ccd2ade50d814811d04f9d2e8 100644 --- a/thunderbird-l10n/vi/manifest.json +++ b/thunderbird-l10n/vi/manifest.json @@ -1,11 +1,5 @@ { "manifest_version": 2, - "name": "Tiếng Việt Language Pack", - "sources": { - "browser": { - "base_path": "browser/" - } - }, "applications": { "gecko": { "strict_max_version": "76.*", @@ -14,44 +8,50 @@ } }, "langpack_id": "vi", - "author": "mozilla.org (contributors: Nguyễn Xuân Minh, Quế Tùng, Nguyễn Mạnh Hùng, Huỳnh Hải Đăng, Bùi Việt Khoa, Trần Nguyễn Sơn, Pierre Neter)", "languages": { "vi": { + "version": "20200419151411", "chrome_resources": { - "branding": "chrome/vi/locale/vi/branding/", - "pippki": "chrome/vi/locale/vi/pippki/", - "global-platform": { - "android": "chrome/vi/locale/vi/global-platform/unix/", - "macosx": "chrome/vi/locale/vi/global-platform/mac/", - "linux": "chrome/vi/locale/vi/global-platform/unix/", - "win": "chrome/vi/locale/vi/global-platform/win/" - }, + "necko": "chrome/vi/locale/vi/necko/", + "pluginproblem": "chrome/vi/locale/vi/pluginproblem/", "messenger-smime": "chrome/vi/locale/vi/messenger-smime/", - "devtools-startup": "chrome/vi/locale/vi/devtools/startup/", - "mozldap": "chrome/vi/locale/vi/mozldap/", + "devtools-shared": "chrome/vi/locale/vi/devtools/shared/", "messenger-region": "chrome/vi/locale/vi/messenger-region/", - "autoconfig": "chrome/vi/locale/vi/autoconfig/", - "messenger": "chrome/vi/locale/vi/messenger/", - "calendar": "chrome/vi/locale/vi/calendar/", + "mozldap": "chrome/vi/locale/vi/mozldap/", "lightning": "chrome/vi/locale/vi/lightning/", - "alerts": "chrome/vi/locale/vi/alerts/", - "necko": "chrome/vi/locale/vi/necko/", - "pipnss": "chrome/vi/locale/vi/pipnss/", - "messenger-mapi": "chrome/vi/locale/vi/messenger-mapi/", - "devtools-shared": "chrome/vi/locale/vi/devtools/shared/", - "communicator": "chrome/vi/locale/vi/communicator/", - "messenger-newsblog": "chrome/vi/locale/vi/messenger-newsblog/", - "pluginproblem": "chrome/vi/locale/vi/pluginproblem/", + "messenger": "chrome/vi/locale/vi/messenger/", "chat": "chrome/vi/locale/vi/chat/", + "messenger-mapi": "chrome/vi/locale/vi/messenger-mapi/", + "autoconfig": "chrome/vi/locale/vi/autoconfig/", + "global-platform": { + "linux": "chrome/vi/locale/vi/global-platform/unix/", + "macosx": "chrome/vi/locale/vi/global-platform/mac/", + "win": "chrome/vi/locale/vi/global-platform/win/", + "android": "chrome/vi/locale/vi/global-platform/unix/" + }, "global": "chrome/vi/locale/vi/global/", + "branding": "chrome/vi/locale/vi/branding/", + "communicator": "chrome/vi/locale/vi/communicator/", + "passwordmgr": "chrome/vi/locale/vi/passwordmgr/", + "pipnss": "chrome/vi/locale/vi/pipnss/", "places": "chrome/vi/locale/vi/places/", + "calendar": "chrome/vi/locale/vi/calendar/", + "pippki": "chrome/vi/locale/vi/pippki/", + "alerts": "chrome/vi/locale/vi/alerts/", + "messenger-newsblog": "chrome/vi/locale/vi/messenger-newsblog/", "mozapps": "chrome/vi/locale/vi/mozapps/", - "passwordmgr": "chrome/vi/locale/vi/passwordmgr/", + "devtools-startup": "chrome/vi/locale/vi/devtools/startup/", "devtools": "chrome/vi/locale/vi/devtools/client/" - }, - "version": "20200406030724" + } } }, - "version": "76.0buildid20200407173003", + "author": "mozilla.org (contributors: Nguyễn Xuân Minh, Quế Tùng, Nguyễn Mạnh Hùng, Huỳnh Hải Đăng, Bùi Việt Khoa, Trần Nguyễn Sơn, Pierre Neter)", + "version": "76.0buildid20200420212409", + "sources": { + "browser": { + "base_path": "browser/" + } + }, + "name": "Tiếng Việt Language Pack", "description": "Language pack for Thunderbird for vi" } diff --git a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/devtools/client/inspector.properties b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/devtools/client/inspector.properties index 1050a9524ac3e41c061fa1b7d93581758c685520..828b7b7948af0ef9cff9c595fb3c6a920a1e17a9 100644 --- a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/devtools/client/inspector.properties +++ b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=此元素有可滚动的溢出内容。 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=无相关规则 +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=按住 Shift 键点击,即可跳至规则 + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/css.properties b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/css.properties index 26266e5394f96dfd6728547d8b2da984f4494a3d..702fa6c37ffcd264dccccd2410ae036574f59307 100644 --- a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/css.properties +++ b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/css.properties @@ -7,6 +7,7 @@ MimeNotCssWarn=样式表单 %1$S 已作为 CSS 载入,虽然它的 MIME 类型 PEUnexpEOF2=搜索 %1$S 时遇到不期望的文件结束符。 PEParseRuleWSOnly=空白字符串不能作为规则解析。 + PEDeclDropped=声明被丢弃。 PEDeclSkipped=跳过至下一个声明。 PEUnknownProperty=未知属性 '%1$S'。 @@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=只允许一个 repeat(auto-fill, …) PEMoreThanOneGridRepeatAutoFillFitInTrackList=只允许一个 repeat(auto-fill, …) 或 repeat(auto-fit, …) 出现在跟踪列表中。 PEMoreThanOneGridRepeatTrackSize=只允许一个跟踪大小出现在 repeat(auto-fit/auto-fill, …) 中。 +PEDisallowedImportRule=@import 规则在构造的样式表中尚未生效。 + TooLargeDashedRadius=‘dashed’ 样式的边框半径太大(限制为 100000px)。渲染为 solid。 TooLargeDottedRadius=‘dotted’ 样式的边框半径太大(限制为 100000px)。渲染为 solid。 diff --git a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/security/security.properties b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/security/security.properties index 80310b847ed7178b2c669d6084eaf711fe03ccc2..7032b5f7a88a164fc5f7e6baf770d72af0f599d5 100644 --- a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/security/security.properties +++ b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = 网站 “%2$S”的 X-Frame-Options 设为“%1$S”,不允许载 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = 网站“%2$S”的 X-Frame-Options 设为“%1$S”,不允许载入来自“%3$S”的跨源框架。 +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = 载入“%2$S”时发现无效的 X-Frame-Options 头:“%1$S”指令无效。 +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=由于“X-Frame-Options“指令设为“%1$S“,已拒绝在框架中载入“%2$S”。 + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = 已将不安全的请求“%1$S”升级为“%2$S”。 diff --git a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/messenger/messenger.dtd b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/messenger/messenger.dtd index 6571da392cc7acac3387dd1357dfc71f8377a28e..93738e7966173d9fb6682949515b87b523d431be 100644 --- a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/messenger/messenger.dtd +++ b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "搜索消息…"> <!ENTITY searchMailCmd.accesskey "M"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "全局搜索…"> +<!ENTITY glodaSearchCmd.accesskey "G"> <!ENTITY searchAddressesCmd.label "搜索地址…"> <!ENTITY searchAddressesCmd.accesskey "S"> diff --git a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/messenger/pgpmime.properties b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/messenger/pgpmime.properties index 21c87985859349a03f90d2f8aafb141c935b31de..b9f32b1c00ec6a1279ec7c2a14304f03291deefc 100644 --- a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/messenger/pgpmime.properties +++ b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/messenger/pgpmime.properties @@ -10,3 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=这是一封 OpenPGP 加密的邮件。<br>要解密这封邮件,您需要安装 <a href="%S">OpenPGP 附加组件</a>。 +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=此消息由 OpenPGP 加密,但客户端尚不支持 OpenPGP 解密。 diff --git a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/necko/necko.properties b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/necko/necko.properties index f8abb0a357ed27b3bb26a887b1d9bdad9be3ec44..cd41b51dfc65af48e085cf6c1ccd4dff05318c55 100644 --- a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/necko/necko.properties +++ b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=已自动允许位于“%1$S”的跟 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=已自动允许位于“%1$S”的跟踪器“%2$S”访问存储空间。 +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=已自动允许位于“%1$S”上第一方隔离的“%2$S”访问存储空间。 + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=因为设置了“sameSite=none”属性,但缺少“secure”属性,已拒绝 Cookie “%1$S”。 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/zh-CN/localization/zh-CN/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/zh-CN/localization/zh-CN/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..9209fa3f9fe32c77dd17173a6b23ea0571e51118 --- /dev/null +++ b/thunderbird-l10n/zh-CN/localization/zh-CN/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = 日历 URI 重定向 +calendar-uri-redirect-description = + 服务器正在重定向日历“{ $calendarName }”的 URI。 + 接受重定向并开始为此日历使用新的 URI? +calendar-uri-redirect-original-uri-label = 当前 URI: +calendar-uri-redirect-target-uri-label = 重定向到新的 URI: diff --git a/thunderbird-l10n/zh-CN/localization/zh-CN/messenger/accountCentral.ftl b/thunderbird-l10n/zh-CN/localization/zh-CN/messenger/accountCentral.ftl index 256c2cf86581c1ac621931c4382d0bf66e68eb35..a7472eb78f9f0d7713365b09d8ed9de2be96b376 100644 --- a/thunderbird-l10n/zh-CN/localization/zh-CN/messenger/accountCentral.ftl +++ b/thunderbird-l10n/zh-CN/localization/zh-CN/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = 欢迎使用 { -brand-full-name } +account-settings = 账户设置 +# $accounts (Number) - the number of configured accounts setup-title = 选择要设置的账户 about-title = 关于 { -brand-full-name } resources-title = 资源 @@ -40,3 +42,10 @@ explore-link = 探索功能 support-link = 用户支持 involved-link = 参与进来 developer-link = 开发者文档 +read = 阅读消息 +compose = 编写新消息 +search = 搜索消息 +filter = 管理消息过滤器 +nntp-subscription = 管理新闻组订阅 +rss-subscription = 管理收取点订阅 +e2e = 端到端加密 diff --git a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutAddons.ftl index 2735de5b1f0ddcbade054f1639fe7caba332716f..225c598348288c10c3977cf87b9b113d5a6f063c 100644 --- a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = 从文件安装附加组件… .accesskey = I help-button = 附加组件帮助 +sidebar-help-button-title = + .title = 附加组件帮助 preferences = { PLATFORM() -> [windows] { -brand-short-name } 选项 @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = 用于所有附加组件的工具 +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } 选项 + *[other] { -brand-short-name } 首选项 + } show-unsigned-extensions-button = .label = 一些扩展未通过验证 show-all-extensions-button = @@ -165,13 +173,29 @@ extensions-view-available-updates = .name = 可用更新 .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = 推荐 +addon-category-discover-title = + .title = 推荐 addon-category-extension = 扩展 +addon-category-extension-title = + .title = 扩展 addon-category-theme = 主题 +addon-category-theme-title = + .title = 主题 addon-category-plugin = 插件 +addon-category-plugin-title = + .title = 插件 addon-category-dictionary = 字典 +addon-category-dictionary-title = + .title = 字典 addon-category-locale = 语言 +addon-category-locale-title = + .title = 语言 addon-category-available-updates = 可用更新 +addon-category-available-updates-title = + .title = 可用更新 addon-category-recent-updates = 最近更新 +addon-category-recent-updates-title = + .title = 最近更新 ## These are global warnings @@ -284,6 +308,7 @@ shortcuts-no-commands = 下列扩展没有快捷键: shortcuts-input = .placeholder = 输入一个快捷键 shortcuts-browserAction = 激活扩展 +shortcuts-browserAction2 = 激活工具栏按钮 shortcuts-pageAction = 激活页面动作 shortcuts-sidebarAction = 切换侧栏 shortcuts-modifier-mac = 包括 Ctrl、Alt 或 ⌘ @@ -308,6 +333,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = 显示更少 go-back-button = .tooltiptext = 返回 +header-back-button = + .title = 返回 ## Recommended add-ons page diff --git a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutSupport.ftl index 3815f24262f01c64e353ae6b3cbf3984f6a17ea9..523dbb84b0b59411814e9937c4959747d918d4d9 100644 --- a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutSupport.ftl @@ -270,6 +270,11 @@ sandbox-proc-type-content = 内容 sandbox-proc-type-file = 文件内容 sandbox-proc-type-media-plugin = 媒体插件 sandbox-proc-type-data-decoder = 数据解码器 +startup-cache-title = 启动缓存 +startup-cache-disk-cache-path = 磁盘缓存路径 +startup-cache-ignore-disk-cache = 忽略磁盘缓存 +startup-cache-found-disk-cache-on-init = 在初始化时发现磁盘缓存 +startup-cache-wrote-to-disk-cache = 已写入磁盘缓存 launcher-process-status-0 = 启用 launcher-process-status-1 = 因故障而禁用 launcher-process-status-2 = 强制禁用 @@ -293,6 +298,7 @@ touch-enabled = 触摸输入已启用 drag-enabled = 滚动条拖动已启用 keyboard-enabled = 键盘已启用 autoscroll-enabled = 自动滚动已启用 +zooming-enabled = 已启用平滑捏合缩放 ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/certviewer.ftl b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/certviewer.ftl index 81a019ad9196695f0f71f7483b344f0483868a1d..cb1519509b2d51e53edae93591058507845053bb 100644 --- a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM(证书) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM(证书链) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = 此扩展字段标记为“关键”,即代表若客户端不理解此字段内容,则必须拒绝该证书。 +certificate-viewer-export = 导出 + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = 您的证书 +certificate-viewer-tab-people = 个人 +certificate-viewer-tab-servers = 服务器 +certificate-viewer-tab-ca = 证书机构 +certificate-viewer-tab-unkonwn = 未知 diff --git a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/processTypes.ftl b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/processTypes.ftl index 057edc5afae3433e8a1975b68396e6f5c1bcdc01..e32243c58e98b4328747552fd7240e57c3f1644f 100644 --- a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = 已隔离网络内容 # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = 套接字 diff --git a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..604f0e6e9d004aa1fdbfcb2bf7280cd2e8bd4a6f --- /dev/null +++ b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = 您启动了旧版的 { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = 创建新配置文件 +profiledowngrade-sync = 使用旧版的 { -brand-product-name } 可能造成现有 { -brand-product-name } 配置文件中保存的书签和历史记录损坏。为了保护您的信息,请为此版 { -brand-short-name } 创建新的配置文件。您可以随时登录 { -fxaccount-brand-name },在不同的配置之间同步书签与历史记录。 +profiledowngrade-nosync = 使用旧版的 { -brand-product-name } 可能造成现有 { -brand-product-name } 配置文件中保存的书签和历史记录损坏。为了保护您的信息,请为此版 { -brand-short-name } 创建新的配置文件。 +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] 退出 + *[other] 退出 + } diff --git a/thunderbird-l10n/zh-CN/manifest.json b/thunderbird-l10n/zh-CN/manifest.json index e7b94fb946eab1c9f0590d4fff6dfd31548615b2..c05b6c3ab4daaeaced809036ea1e817aae4c0865 100644 --- a/thunderbird-l10n/zh-CN/manifest.json +++ b/thunderbird-l10n/zh-CN/manifest.json @@ -1,57 +1,57 @@ { + "name": "Chinese Simplified (zh-CN) Language Pack", + "description": "Language pack for Thunderbird for zh-CN", + "sources": { + "browser": { + "base_path": "browser/" + } + }, "languages": { "zh-CN": { "chrome_resources": { + "lightning": "chrome/zh-CN/locale/zh-CN/lightning/", + "messenger": "chrome/zh-CN/locale/zh-CN/messenger/", + "passwordmgr": "chrome/zh-CN/locale/zh-CN/passwordmgr/", "autoconfig": "chrome/zh-CN/locale/zh-CN/autoconfig/", - "chat": "chrome/zh-CN/locale/zh-CN/chat/", - "global": "chrome/zh-CN/locale/zh-CN/global/", - "messenger-region": "chrome/zh-CN/locale/zh-CN/messenger-region/", - "devtools-shared": "chrome/zh-CN/locale/zh-CN/devtools/shared/", - "messenger-newsblog": "chrome/zh-CN/locale/zh-CN/messenger-newsblog/", - "mozapps": "chrome/zh-CN/locale/zh-CN/mozapps/", "places": "chrome/zh-CN/locale/zh-CN/places/", - "necko": "chrome/zh-CN/locale/zh-CN/necko/", - "pippki": "chrome/zh-CN/locale/zh-CN/pippki/", - "lightning": "chrome/zh-CN/locale/zh-CN/lightning/", "messenger-smime": "chrome/zh-CN/locale/zh-CN/messenger-smime/", - "devtools-startup": "chrome/zh-CN/locale/zh-CN/devtools/startup/", - "pipnss": "chrome/zh-CN/locale/zh-CN/pipnss/", - "messenger": "chrome/zh-CN/locale/zh-CN/messenger/", "branding": "chrome/zh-CN/locale/zh-CN/branding/", + "pippki": "chrome/zh-CN/locale/zh-CN/pippki/", + "necko": "chrome/zh-CN/locale/zh-CN/necko/", "calendar": "chrome/zh-CN/locale/zh-CN/calendar/", - "mozldap": "chrome/zh-CN/locale/zh-CN/mozldap/", + "devtools": "chrome/zh-CN/locale/zh-CN/devtools/client/", + "alerts": "chrome/zh-CN/locale/zh-CN/alerts/", + "chat": "chrome/zh-CN/locale/zh-CN/chat/", + "mozapps": "chrome/zh-CN/locale/zh-CN/mozapps/", "pluginproblem": "chrome/zh-CN/locale/zh-CN/pluginproblem/", + "global": "chrome/zh-CN/locale/zh-CN/global/", + "mozldap": "chrome/zh-CN/locale/zh-CN/mozldap/", + "devtools-shared": "chrome/zh-CN/locale/zh-CN/devtools/shared/", + "messenger-newsblog": "chrome/zh-CN/locale/zh-CN/messenger-newsblog/", "messenger-mapi": "chrome/zh-CN/locale/zh-CN/messenger-mapi/", - "alerts": "chrome/zh-CN/locale/zh-CN/alerts/", + "pipnss": "chrome/zh-CN/locale/zh-CN/pipnss/", "global-platform": { + "linux": "chrome/zh-CN/locale/zh-CN/global-platform/unix/", "android": "chrome/zh-CN/locale/zh-CN/global-platform/unix/", "macosx": "chrome/zh-CN/locale/zh-CN/global-platform/mac/", - "win": "chrome/zh-CN/locale/zh-CN/global-platform/win/", - "linux": "chrome/zh-CN/locale/zh-CN/global-platform/unix/" + "win": "chrome/zh-CN/locale/zh-CN/global-platform/win/" }, - "communicator": "chrome/zh-CN/locale/zh-CN/communicator/", - "passwordmgr": "chrome/zh-CN/locale/zh-CN/passwordmgr/", - "devtools": "chrome/zh-CN/locale/zh-CN/devtools/client/" + "devtools-startup": "chrome/zh-CN/locale/zh-CN/devtools/startup/", + "messenger-region": "chrome/zh-CN/locale/zh-CN/messenger-region/", + "communicator": "chrome/zh-CN/locale/zh-CN/communicator/" }, - "version": "20200403111304" + "version": "20200418022603" } }, - "name": "Chinese Simplified (zh-CN) Language Pack", - "sources": { - "browser": { - "base_path": "browser/" - } - }, - "manifest_version": 2, - "description": "Language pack for Thunderbird for zh-CN", "langpack_id": "zh-CN", "author": "mozilla.org (contributors: Wen Shaohua)", + "manifest_version": 2, + "version": "76.0buildid20200420212409", "applications": { "gecko": { - "strict_min_version": "76.0", + "strict_max_version": "76.*", "id": "langpack-zh-CN@thunderbird.mozilla.org", - "strict_max_version": "76.*" + "strict_min_version": "76.0" } - }, - "version": "76.0buildid20200407173003" + } } diff --git a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/devtools/client/inspector.properties b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/devtools/client/inspector.properties index 261cd23e725536ae576e95413584ff511e4f1858..a21b38348819ee8fe3974debd817c3bc6a489957 100644 --- a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/devtools/client/inspector.properties +++ b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/devtools/client/inspector.properties @@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=此元素有可滾動的溢出內容。 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration. rulePreviewTooltip.noAssociatedRule=沒有相關規則 +# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside +# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule. +rulePreviewTooltip.jumpToRuleShortcut=按住 Shift 然後點擊,即可跳到規則 + # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the # contrast ratio value description that labels the background the color contrast ratio is calculated # against, used together with the actual background color. %S in the content will be replaced by a diff --git a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/global/css.properties b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/global/css.properties index 38b8e3d6815d84c6fd23ba55ffd26858bac70b72..c2df0241a2507d933afb9ddb7ae76acaf191ab77 100644 --- a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/global/css.properties +++ b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/global/css.properties @@ -180,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=subgrid 的名稱清單中僅允許一 PEMoreThanOneGridRepeatAutoFillFitInTrackList=track 清單中僅允許一個 repeat(auto-fill, …) 或 repeat(auto-fit, …)。 PEMoreThanOneGridRepeatTrackSize=repeat(auto-fit/auto-fill, …) 中僅允許一個 track 大小。 +PEDisallowedImportRule=@import 規則在建構的樣式表中尚未生效。 + TooLargeDashedRadius=「dashed」樣式的邊框半徑太大(限制為 100000px),以 solid 描繪。 TooLargeDottedRadius=「dotted」樣式的邊框半徑太大(限制為 100000px),以 solid 描繪。 diff --git a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/global/security/security.properties b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/global/security/security.properties index e5ecb45d988ad9b145ab5e5f6f4a26b1c8c6bb71..2c0681d910f913c905fffd75f54f34be69f0a3db 100644 --- a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/global/security/security.properties +++ b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/global/security/security.properties @@ -147,6 +147,12 @@ XFODeny = 因「%2$S」網站的 X-Frame-Options 設定為「%1$S」,不允許 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. XFOSameOrigin = 因「%2$S」網站的 X-Frame-Options 設定為「%1$S」,不允許跨來源載入於「%3$S」。 +# X-Frame-Options +# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options". +XFrameOptionsInvalid = 載入「%2$S」時發現無效的 X-Frame-Options 檔頭:「%1$S」指示無效。 +# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options". +XFrameOptionsDeny=由於「X-Frame-Options」指示設定為「%1$S」,已拒絕在畫框中載入「%2$S」。 + # HTTPS-Only Mode # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. HTTPSOnlyUpgradeRequest = 已將不安全的請求「%1$S」升級為「%2$S」。 diff --git a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/messenger/messenger.dtd b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/messenger/messenger.dtd index 97c5dda783196df2804215f6faf5a794f943b57c..9b99ea111f55f51446721826377ea58569608d5f 100644 --- a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/messenger/messenger.dtd +++ b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/messenger/messenger.dtd @@ -289,6 +289,8 @@ <!ENTITY searchMailCmd.label "搜尋訊息…"> <!ENTITY searchMailCmd.accesskey "M"> <!ENTITY searchMailCmd.key "f"> +<!ENTITY glodaSearchCmd.label "全域搜尋…"> +<!ENTITY glodaSearchCmd.accesskey "G"> <!ENTITY searchAddressesCmd.label "搜尋地址…"> <!ENTITY searchAddressesCmd.accesskey "S"> diff --git a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/messenger/pgpmime.properties b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/messenger/pgpmime.properties index 3b8d70d443b73d2c120228b57230eba8f94552ec..51cddceabd8a519f0915f7d3bf1c4f29d00deaf7 100644 --- a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/messenger/pgpmime.properties +++ b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/messenger/pgpmime.properties @@ -10,4 +10,5 @@ # %S is the url to Enigmail on AMO supplied from preferences. pgpMimeNeedsAddon=這是加密過的 OpenPGP 訊息。<br>您必須安裝 <a href="%S">OpenPGP 附加元件</a> 才能解密此郵件。 - +# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags. +pgpNotAvailable=這是一封加密過的 OpenPGP 訊息,但目前不支援 OpenPGP 解密。 diff --git a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/necko/necko.properties b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/necko/necko.properties index d2c0201633380f561d62716b3c32438d3933854c..629fa879e3ab9d7aceff2d692892cfed5c79b2f9 100644 --- a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/necko/necko.properties +++ b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/necko/necko.properties @@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=已自動允許位於「%1$S」的追 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs. CookieAllowedForTrackerByHeuristic=已自動允許位於「%1$S」的追蹤器「%2$S」存取儲存空間。 +# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs. +CookieAllowedForFpiByHeuristic=已自動針對位於「%1$S」上第一方隔離的「%2$S」允許存取儲存空間。 + # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure". CookieRejectedNonRequiresSecure=因為設定了「sameSite=none」屬性,但缺少「secure」屬性,已拒絕 Cookie「%1$S」 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure". diff --git a/thunderbird-l10n/zh-TW/localization/zh-TW/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/zh-TW/localization/zh-TW/calendar/calendar-uri-redirect-dialog.ftl new file mode 100644 index 0000000000000000000000000000000000000000..72ec69e2c0389e98840caecfec054a50fb7d6e59 --- /dev/null +++ b/thunderbird-l10n/zh-TW/localization/zh-TW/calendar/calendar-uri-redirect-dialog.ftl @@ -0,0 +1,11 @@ +# 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/. + +calendar-uri-redirect-window = + .title = Calendar URI 重新導向 +calendar-uri-redirect-description = + 此伺服器重新導向了行事曆「{ $calendarName }」的 URI。 + 要接受更改為使用新的 URI 嗎? +calendar-uri-redirect-original-uri-label = 目前 URI: +calendar-uri-redirect-target-uri-label = 重新導向到新的 URI: diff --git a/thunderbird-l10n/zh-TW/localization/zh-TW/messenger/accountCentral.ftl b/thunderbird-l10n/zh-TW/localization/zh-TW/messenger/accountCentral.ftl index f8e94796adb6d81ed4e187b1df375964fc429319..030e24b69c78b2248e240a7b3492fe211413510f 100644 --- a/thunderbird-l10n/zh-TW/localization/zh-TW/messenger/accountCentral.ftl +++ b/thunderbird-l10n/zh-TW/localization/zh-TW/messenger/accountCentral.ftl @@ -3,6 +3,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. account-central-title = 歡迎使用 { -brand-full-name } +account-settings = 帳號設定 +# $accounts (Number) - the number of configured accounts setup-title = 選擇要設定哪些帳號 about-title = 關於 { -brand-full-name } resources-title = 資源 @@ -40,3 +42,10 @@ explore-link = 探索功能 support-link = 技術支援 involved-link = 參與我們 developer-link = 技術文件 +read = 讀取郵件 +compose = 發新郵件 +search = 搜尋訊息 +filter = 管理篩選條件 +nntp-subscription = 管理新聞群組訂閱狀況 +rss-subscription = 管理資訊來源訂閱項目 +e2e = 端到端加密 diff --git a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutAddons.ftl index e9ad019cea65e23461b9356d824e6c5bf0cab05b..88d6fed53f23fd2caba9437e3c794024d6d7ed77 100644 --- a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutAddons.ftl +++ b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutAddons.ftl @@ -26,6 +26,8 @@ install-addon-from-file = .label = 從檔案安裝附加元件… .accesskey = I help-button = 附加元件支援 +sidebar-help-button-title = + .title = 附加元件支援 preferences = { PLATFORM() -> [windows] { -brand-short-name } 選項 @@ -33,6 +35,12 @@ preferences = } tools-menu = .tooltiptext = 所有附加元件的工具 +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } 選項 + *[other] { -brand-short-name } 偏好設定 + } show-unsigned-extensions-button = .label = 無法驗證某些擴充套件 show-all-extensions-button = @@ -167,13 +175,29 @@ extensions-view-available-updates = .name = 可用的更新 .tooltiptext = { extensions-view-available-updates.name } addon-category-discover = 推薦項目 +addon-category-discover-title = + .title = 推薦項目 addon-category-extension = 擴充套件 +addon-category-extension-title = + .title = 擴充套件 addon-category-theme = 佈景主題 +addon-category-theme-title = + .title = 佈景主題 addon-category-plugin = 外掛程式 +addon-category-plugin-title = + .title = 外掛程式 addon-category-dictionary = 字典 +addon-category-dictionary-title = + .title = 字典 addon-category-locale = 語言套件 +addon-category-locale-title = + .title = 語言套件 addon-category-available-updates = 可用的更新 +addon-category-available-updates-title = + .title = 可用的更新 addon-category-recent-updates = 最近的更新 +addon-category-recent-updates-title = + .title = 最近的更新 ## These are global warnings @@ -286,6 +310,7 @@ shortcuts-no-commands = 下列擴充套件沒有快速鍵: shortcuts-input = .placeholder = 輸入快速鍵 shortcuts-browserAction = 啟用快速鍵 +shortcuts-browserAction2 = 開啟工具列按鈕 shortcuts-pageAction = 啟用頁面操作 shortcuts-sidebarAction = 切換側邊欄 shortcuts-modifier-mac = 包含 Ctrl、Alt 或 ⌘ @@ -310,6 +335,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = 顯示更少 go-back-button = .tooltiptext = 回上一頁 +header-back-button = + .title = 回上一頁 ## Recommended add-ons page diff --git a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutSupport.ftl index b2acb0513ab8315964a1e6b38838935863122678..7bb4945bb302a48a49a04175bd6c67c264754152 100644 --- a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutSupport.ftl +++ b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutSupport.ftl @@ -270,6 +270,11 @@ sandbox-proc-type-content = 內容 sandbox-proc-type-file = 檔案內容 sandbox-proc-type-media-plugin = 媒體外掛程式 sandbox-proc-type-data-decoder = 資料解碼器 +startup-cache-title = 啟動快取 +startup-cache-disk-cache-path = 磁碟快取路徑 +startup-cache-ignore-disk-cache = 忽略磁碟快取 +startup-cache-found-disk-cache-on-init = 在初始化時找到磁碟快取 +startup-cache-wrote-to-disk-cache = 已寫入磁碟快取 launcher-process-status-0 = 啟用 launcher-process-status-1 = 由於失敗而停用 launcher-process-status-2 = 強制停用 @@ -293,6 +298,7 @@ touch-enabled = 已啟用觸控輸入 drag-enabled = 已開啟捲動列拖曳 keyboard-enabled = 已啟用鍵盤 autoscroll-enabled = 已開啟自動捲動 +zooming-enabled = 已開啟平滑手指縮放 ## Variables ## $preferenceKey (string) - String ID of preference diff --git a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutTelemetry.ftl b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutTelemetry.ftl index 21e33aded4ace90fb107ccd78ff2158f48a9e20c..236ac2ea351b9c99a01e330d94a16dce89ab0859 100644 --- a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutTelemetry.ftl +++ b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutTelemetry.ftl @@ -30,7 +30,7 @@ about-telemetry-session-info-section = 使用階段資訊 about-telemetry-scalar-section = Scalars about-telemetry-keyed-scalar-section = Keyed Scalars about-telemetry-histograms-section = 柱狀圖 -about-telemetry-keyed-histogram-section = Keyed Histograms +about-telemetry-keyed-histogram-section = 分類柱狀圖 about-telemetry-events-section = 事件 about-telemetry-simple-measurements-section = 簡易測量 about-telemetry-slow-sql-section = 慢速的 SQL 陳述句 @@ -39,7 +39,7 @@ about-telemetry-captured-stacks-section = 捕捉到的堆疊 about-telemetry-late-writes-section = 慢速寫入 about-telemetry-raw-payload-section = 原始酬載 about-telemetry-raw = 原始 JSON -about-telemetry-full-sql-warning = 注意: 已啟用慢速 SQL 除錯。完整的 SQL 字串將會在下面顯示,但將不會被送出給 Telemetry。 +about-telemetry-full-sql-warning = 註: 已開啟慢速 SQL 除錯。將在下面顯示完整 SQL 字串,但不會送出到 Telemetry。 about-telemetry-fetch-stack-symbols = 取得堆疊的函數名稱 about-telemetry-hide-stack-symbols = 顯示原始堆疊資料 # Selects the correct release version diff --git a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/certviewer.ftl b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/certviewer.ftl index 69a76ed3de973153b1547681c2cbc6a560a30b67..ba272231f7106b99e481bc20da60b01615aec99b 100644 --- a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/certviewer.ftl +++ b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/certviewer.ftl @@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM(憑證) .download = { $fileName }.pem certificate-viewer-download-pem-chain = PEM(金鑰鏈) .download = { $fileName }-chain.pem +# The title attribute for Critical Extension icon +certificate-viewer-critical-extension = + .title = 此擴充欄位標示為重要,代表客戶端若無法理解此欄位內容就必須拒絕接受憑證。 +certificate-viewer-export = 匯出 + .download = { $fileName }.pem + +## Labels for tabs displayed in stand-alone about:certificate page + +certificate-viewer-tab-mine = 您的憑證 +certificate-viewer-tab-people = 人員 +certificate-viewer-tab-servers = 伺服器 +certificate-viewer-tab-ca = 憑證機構 +certificate-viewer-tab-unkonwn = 未知 diff --git a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/global/processTypes.ftl b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/global/processTypes.ftl index 340e6b390d5b3da9408fa282418ed2dba56cbd35..623b416cb492e486e41997dd2e6df81bc43fe530 100644 --- a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/global/processTypes.ftl +++ b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/global/processTypes.ftl @@ -24,3 +24,5 @@ process-type-webisolated = 隔離的網頁內容 # process used to communicate with the GPU for # graphics acceleration process-type-gpu = GPU +# process used to perform network operations +process-type-socket = Socket diff --git a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/global/profileDowngrade.ftl new file mode 100644 index 0000000000000000000000000000000000000000..6384a68ebe45ce72eacef311f8c60a03526ae152 --- /dev/null +++ b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/global/profileDowngrade.ftl @@ -0,0 +1,17 @@ +# 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/. + +profiledowngrade-window = + .title = 您啟動了舊版的 { -brand-product-name } + .style = width: 490px; +profiledowngrade-window-create = + .label = 建立新設定檔 +profiledowngrade-sync = 使用舊版的 { -brand-product-name } 可能會造成現有 { -brand-product-name } 設定檔當中的書籤、上網紀錄毀損。為了保護您的資訊,請為這份 { -brand-short-name } 建立新的設定檔。您可隨時登入 { -fxaccount-brand-name },在不同的設定檔之間同步書籤與上網紀錄。 +profiledowngrade-nosync = 使用舊版的 { -brand-product-name } 可能會造成現有 { -brand-product-name } 設定檔當中的書籤、上網紀錄毀損。為了保護您的資訊,請為這份 { -brand-short-name } 建立新的設定檔。 +profiledowngrade-quit = + .label = + { PLATFORM() -> + [windows] 結束 + *[other] 離開 + } diff --git a/thunderbird-l10n/zh-TW/manifest.json b/thunderbird-l10n/zh-TW/manifest.json index c7d131d69f6e2f857beaede201524ec802835795..3bb6b2b8fa2ed822335646a6b11bec2e2f7bedb9 100644 --- a/thunderbird-l10n/zh-TW/manifest.json +++ b/thunderbird-l10n/zh-TW/manifest.json @@ -1,4 +1,12 @@ { + "author": "Mozilla Taiwan Community (MozTW) (contributors: Hung-Te Lin(piaip), Wei-Lun Sun(josesun), Wei-Chen Lai(abev66), Tim Guan-Tin Chien(timdream), Peter Pin-Guang Chen(petercpg))", + "applications": { + "gecko": { + "strict_max_version": "76.*", + "id": "langpack-zh-TW@thunderbird.mozilla.org", + "strict_min_version": "76.0" + } + }, "sources": { "browser": { "base_path": "browser/" @@ -8,50 +16,42 @@ "zh-TW": { "chrome_resources": { "messenger-smime": "chrome/zh-TW/locale/zh-TW/messenger-smime/", - "pluginproblem": "chrome/zh-TW/locale/zh-TW/pluginproblem/", - "passwordmgr": "chrome/zh-TW/locale/zh-TW/passwordmgr/", - "mozldap": "chrome/zh-TW/locale/zh-TW/mozldap/", + "messenger-mapi": "chrome/zh-TW/locale/zh-TW/messenger-mapi/", + "pippki": "chrome/zh-TW/locale/zh-TW/pippki/", "places": "chrome/zh-TW/locale/zh-TW/places/", - "chat": "chrome/zh-TW/locale/zh-TW/chat/", - "devtools-startup": "chrome/zh-TW/locale/zh-TW/devtools/startup/", + "messenger": "chrome/zh-TW/locale/zh-TW/messenger/", + "branding": "chrome/zh-TW/locale/zh-TW/branding/", "alerts": "chrome/zh-TW/locale/zh-TW/alerts/", - "global": "chrome/zh-TW/locale/zh-TW/global/", - "pipnss": "chrome/zh-TW/locale/zh-TW/pipnss/", - "lightning": "chrome/zh-TW/locale/zh-TW/lightning/", + "passwordmgr": "chrome/zh-TW/locale/zh-TW/passwordmgr/", + "chat": "chrome/zh-TW/locale/zh-TW/chat/", + "autoconfig": "chrome/zh-TW/locale/zh-TW/autoconfig/", "messenger-newsblog": "chrome/zh-TW/locale/zh-TW/messenger-newsblog/", - "communicator": "chrome/zh-TW/locale/zh-TW/communicator/", - "calendar": "chrome/zh-TW/locale/zh-TW/calendar/", - "devtools": "chrome/zh-TW/locale/zh-TW/devtools/client/", - "messenger-mapi": "chrome/zh-TW/locale/zh-TW/messenger-mapi/", - "messenger": "chrome/zh-TW/locale/zh-TW/messenger/", + "pluginproblem": "chrome/zh-TW/locale/zh-TW/pluginproblem/", "mozapps": "chrome/zh-TW/locale/zh-TW/mozapps/", + "devtools": "chrome/zh-TW/locale/zh-TW/devtools/client/", + "pipnss": "chrome/zh-TW/locale/zh-TW/pipnss/", + "necko": "chrome/zh-TW/locale/zh-TW/necko/", + "communicator": "chrome/zh-TW/locale/zh-TW/communicator/", + "devtools-shared": "chrome/zh-TW/locale/zh-TW/devtools/shared/", + "global": "chrome/zh-TW/locale/zh-TW/global/", + "lightning": "chrome/zh-TW/locale/zh-TW/lightning/", + "mozldap": "chrome/zh-TW/locale/zh-TW/mozldap/", "global-platform": { + "macosx": "chrome/zh-TW/locale/zh-TW/global-platform/mac/", "linux": "chrome/zh-TW/locale/zh-TW/global-platform/unix/", "android": "chrome/zh-TW/locale/zh-TW/global-platform/unix/", - "macosx": "chrome/zh-TW/locale/zh-TW/global-platform/mac/", "win": "chrome/zh-TW/locale/zh-TW/global-platform/win/" }, - "devtools-shared": "chrome/zh-TW/locale/zh-TW/devtools/shared/", - "autoconfig": "chrome/zh-TW/locale/zh-TW/autoconfig/", - "necko": "chrome/zh-TW/locale/zh-TW/necko/", - "pippki": "chrome/zh-TW/locale/zh-TW/pippki/", - "branding": "chrome/zh-TW/locale/zh-TW/branding/", + "devtools-startup": "chrome/zh-TW/locale/zh-TW/devtools/startup/", + "calendar": "chrome/zh-TW/locale/zh-TW/calendar/", "messenger-region": "chrome/zh-TW/locale/zh-TW/messenger-region/" }, - "version": "20200403125542" + "version": "20200415073517" } }, - "version": "76.0buildid20200407173003", - "name": "Traditional Chinese (zh-TW) Language Pack", "description": "Language pack for Thunderbird for zh-TW", - "applications": { - "gecko": { - "strict_min_version": "76.0", - "id": "langpack-zh-TW@thunderbird.mozilla.org", - "strict_max_version": "76.*" - } - }, "langpack_id": "zh-TW", - "author": "Mozilla Taiwan Community (MozTW) (contributors: Hung-Te Lin(piaip), Wei-Lun Sun(josesun), Wei-Chen Lai(abev66), Tim Guan-Tin Chien(timdream), Peter Pin-Guang Chen(petercpg))", - "manifest_version": 2 + "name": "Traditional Chinese (zh-TW) Language Pack", + "manifest_version": 2, + "version": "76.0buildid20200420212409" } diff --git a/toolkit/components/extensions/ExtensionChild.jsm b/toolkit/components/extensions/ExtensionChild.jsm index 7c5e2224e2c00559e0874a94e4caa16b4bf281b5..6513069ef86e4b08c011b4f76d630ad68dc1789c 100644 --- a/toolkit/components/extensions/ExtensionChild.jsm +++ b/toolkit/components/extensions/ExtensionChild.jsm @@ -286,9 +286,11 @@ class NativeMessenger { recvPortConnect({ portId, name, sender }) { let ex = sender.id === this.context.extension.id; - let port = new Port(this.context, portId, name, false, sender); let event = ex ? this.onConnect : this.onConnectEx; - return event.emit(port.api).length; + if (this.context.active && event.fires.size) { + let port = new Port(this.context, portId, name, false, sender); + return event.emit(port.api).length; + } } } diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_runtime_ports.js b/toolkit/components/extensions/test/xpcshell/test_ext_runtime_ports.js new file mode 100644 index 0000000000000000000000000000000000000000..7365a13f93ce16cf9f471978a2e7aad2d15f4bef --- /dev/null +++ b/toolkit/components/extensions/test/xpcshell/test_ext_runtime_ports.js @@ -0,0 +1,69 @@ +"use strict"; + +add_task(async function test_port_disconnected_from_wrong_window() { + let extensionData = { + background() { + let num = 0; + let ports = {}; + let done = false; + + browser.runtime.onConnect.addListener(port => { + num++; + ports[num] = port; + + port.onMessage.addListener(msg => { + browser.test.assertEq(msg, "port-2-response", "Got port 2 response"); + browser.test.sendMessage(msg + "-received"); + done = true; + }); + + port.onDisconnect.addListener(err => { + if (port === ports[1]) { + browser.test.log("Port 1 disconnected, sending message via port 2"); + ports[2].postMessage("port-2-msg"); + } else { + browser.test.assertTrue( + done, + "Port 2 disconnected only after a full roundtrip received" + ); + } + }); + + browser.test.sendMessage("port-connect-" + num); + }); + }, + files: { + "page.html": ` + <!DOCTYPE html><meta charset="utf8"> + <script src="script.js"></script> + `, + "script.js"() { + let port = browser.runtime.connect(); + port.onMessage.addListener(msg => { + browser.test.assertEq(msg, "port-2-msg", "Got message via port 2"); + port.postMessage("port-2-response"); + }); + }, + }, + }; + + let extension = ExtensionTestUtils.loadExtension(extensionData); + let url = `moz-extension://${extension.uuid}/page.html`; + await extension.startup(); + + let page1 = await ExtensionTestUtils.loadContentPage(url, { extension }); + await extension.awaitMessage("port-connect-1"); + info("First page opened port 1"); + + let page2 = await ExtensionTestUtils.loadContentPage(url, { extension }); + await extension.awaitMessage("port-connect-2"); + info("Second page opened port 2"); + + info("Closing the first page should not close port 2"); + await page1.close(); + await extension.awaitMessage("port-2-response-received"); + info("Roundtrip message through port 2 received"); + + await page2.close(); + await extension.unload(); +}); diff --git a/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini b/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini index a9cfc1df9cee014b86e3bd1566b69354ef71aee2..43ed44a21b9f089d9c40a90704529fa0aebc8acf 100644 --- a/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini +++ b/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini @@ -120,6 +120,7 @@ skip-if = os == "android" && debug [test_ext_runtime_id.js] skip-if = ccov && os == 'linux' # bug 1607581 [test_ext_runtime_onInstalled_and_onStartup.js] +[test_ext_runtime_ports.js] [test_ext_runtime_sendMessage.js] [test_ext_runtime_sendMessage_errors.js] [test_ext_runtime_sendMessage_no_receiver.js] diff --git a/toolkit/components/passwordmgr/LoginHelper.jsm b/toolkit/components/passwordmgr/LoginHelper.jsm index 4897dc742db8cfa65d28054e797e72daff8735d1..75abce8aeaa591921b1e96548b44baca5f87012a 100644 --- a/toolkit/components/passwordmgr/LoginHelper.jsm +++ b/toolkit/components/passwordmgr/LoginHelper.jsm @@ -38,6 +38,8 @@ this.LoginHelper = { privateBrowsingCaptureEnabled: null, schemeUpgrades: null, showAutoCompleteFooter: null, + testOnlyUserHasInteractedWithDocument: null, + userInputRequiredToCapture: null, init() { // Watch for pref changes to update cached pref values. @@ -80,6 +82,9 @@ this.LoginHelper = { "signon.management.overrideURI", null ); + this.passwordEditCaptureEnabled = Services.prefs.getBoolPref( + "signon.passwordEditCapture.enabled" + ); this.privateBrowsingCaptureEnabled = Services.prefs.getBoolPref( "signon.privateBrowsingCapture.enabled" ); @@ -90,12 +95,28 @@ this.LoginHelper = { this.storeWhenAutocompleteOff = Services.prefs.getBoolPref( "signon.storeWhenAutocompleteOff" ); + + if ( + Services.prefs.getBoolPref( + "signon.testOnlyUserHasInteractedByPrefValue", + false + ) + ) { + this.testOnlyUserHasInteractedWithDocument = Services.prefs.getBoolPref( + "signon.testOnlyUserHasInteractedWithDocument", + false + ); + log.debug( + "updateSignonPrefs, using pref value for testOnlyUserHasInteractedWithDocument", + this.testOnlyUserHasInteractedWithDocument + ); + } else { + this.testOnlyUserHasInteractedWithDocument = null; + } + this.userInputRequiredToCapture = Services.prefs.getBoolPref( "signon.userInputRequiredToCapture.enabled" ); - this.passwordEditCaptureEnabled = Services.prefs.getBoolPref( - "signon.passwordEditCapture.enabled" - ); }, createLogger(aLogPrefix) { @@ -1183,8 +1204,6 @@ this.LoginHelper = { }, }; -LoginHelper.init(); - XPCOMUtils.defineLazyPreferenceGetter( LoginHelper, "showInsecureFieldWarning", @@ -1192,5 +1211,11 @@ XPCOMUtils.defineLazyPreferenceGetter( ); XPCOMUtils.defineLazyGetter(this, "log", () => { - return LoginHelper.createLogger("LoginHelper"); + let processName = + Services.appinfo.processType === Services.appinfo.PROCESS_TYPE_DEFAULT + ? "Main" + : "Content"; + return LoginHelper.createLogger(`LoginHelper(${processName})`); }); + +LoginHelper.init(); diff --git a/toolkit/components/passwordmgr/LoginManagerChild.jsm b/toolkit/components/passwordmgr/LoginManagerChild.jsm index 34eb134fec2a9154bd38778438cb7097c241b110..864bf07a77c20a9bafef2ef17d7fa520be2bf3d0 100644 --- a/toolkit/components/passwordmgr/LoginManagerChild.jsm +++ b/toolkit/components/passwordmgr/LoginManagerChild.jsm @@ -1564,6 +1564,19 @@ this.LoginManagerChild = class LoginManagerChild extends JSWindowActorChild { dismissedPrompt = true; } + let docState = this.stateForDocument(doc); + let fieldsModified = this._formHasModifiedFields(form); + if (!fieldsModified && LoginHelper.userInputRequiredToCapture) { + if (targetField) { + throw new Error("No user input on targetField"); + } + // we know no fields in this form had user modifications, so don't prompt + log( + `(${logMessagePrefix} ignored -- submitting values that are not changed by the user)` + ); + return; + } + if ( this._compareAndUpdatePreviouslySentValues( form.rootElement, @@ -1578,19 +1591,6 @@ this.LoginManagerChild = class LoginManagerChild extends JSWindowActorChild { return; } - let docState = this.stateForDocument(doc); - let fieldsModified = this._formHasModifiedFields(form); - if (!fieldsModified && LoginHelper.userInputRequiredToCapture) { - if (targetField) { - throw new Error("No user input on targetField"); - } - // we know no fields in this form had user modifications, so don't prompt - log( - `(${logMessagePrefix} ignored -- submitting values that are not changed by the user)` - ); - return; - } - let { login: autoFilledLogin } = docState.fillsByRootElement.get(form.rootElement) || {}; let browsingContextId = win.windowGlobalChild.browsingContext.id; @@ -2181,7 +2181,23 @@ this.LoginManagerChild = class LoginManagerChild extends JSWindowActorChild { } _formHasModifiedFields(form) { - let state = this.stateForDocument(form.rootElement.ownerDocument); + let doc = form.rootElement.ownerDocument; + let userHasInteracted; + let testOnlyUserHasInteracted = + LoginHelper.testOnlyUserHasInteractedWithDocument; + if (Cu.isInAutomation && testOnlyUserHasInteracted !== null) { + userHasInteracted = testOnlyUserHasInteracted; + } else { + userHasInteracted = doc.userHasInteracted; + } + + log("_formHasModifiedFields, userHasInteracted:", userHasInteracted); + + // If the user hasn't interacted at all with the page, we don't need to check futher + if (!userHasInteracted) { + return false; + } + let state = this.stateForDocument(doc); // check for user inputs to the form fields let fieldsModified = state.fieldModificationsByRootElement.get( form.rootElement diff --git a/toolkit/components/passwordmgr/LoginManagerPrompter.jsm b/toolkit/components/passwordmgr/LoginManagerPrompter.jsm index 8c25ebabf1dd426ea187d2ddb82dd43121b87cf1..a641b0281f9e895edb3a1a2b39f1f15412a8efe4 100644 --- a/toolkit/components/passwordmgr/LoginManagerPrompter.jsm +++ b/toolkit/components/passwordmgr/LoginManagerPrompter.jsm @@ -383,6 +383,10 @@ class LoginManagerPrompter { histogram.add(PROMPT_ADD_OR_UPDATE); if (histogramName == "PWMGR_PROMPT_REMEMBER_ACTION") { Services.obs.notifyObservers(browser, "LoginStats:NewSavedPassword"); + } else if (histogramName == "PWMGR_PROMPT_UPDATE_ACTION") { + Services.obs.notifyObservers(browser, "LoginStats:LoginUpdateSaved"); + } else { + throw new Error("Unknown histogram"); } readDataFromUI(); persistData(); diff --git a/toolkit/components/passwordmgr/NewPasswordModel.jsm b/toolkit/components/passwordmgr/NewPasswordModel.jsm index 0d71e0152e67d042a85346dfbe70c0c9bb4fdf70..26a3bb8674a063553eaf4f1f7e1d187c1a3b888f 100644 --- a/toolkit/components/passwordmgr/NewPasswordModel.jsm +++ b/toolkit/components/passwordmgr/NewPasswordModel.jsm @@ -23,7 +23,7 @@ const { ruleset, score, type, - utils: { identity, isVisible, min }, + utils: { identity, isVisible, min, setDefault }, clusters: { euclidean }, } = fathom; @@ -31,7 +31,7 @@ const { * ----- Start of model ----- * * Everything below this comment up to the "End of model" comment is copied from: - * https://github.com/mozilla-services/fathom-login-forms/blob/4a2349963df5d3c428847565f44d3d4ec65ae38b/new-password/rulesets.js#L6-L271 + * https://github.com/mozilla-services/fathom-login-forms/blob/96d83b26e06587e28baecf404c1058132d5e5ec7/new-password/rulesets.js#L14-L498 * Deviations from that file: * - Remove import statements, instead using ``ChromeUtils.defineModuleGetter`` and destructuring assignments above. * - Set ``DEVELOPMENT`` constant to ``false``. @@ -109,8 +109,21 @@ const registerFormAttrRegex = /signup|join|register|regform|registration|new_use const rememberMeAttrRegex = /remember|auto_login|auto-login|save_mail|save-mail|ricordami|manter|mantenha|savelogin|auto login/i; const rememberMeStringRegex = /remember me|keep me logged in|keep me signed in|save email address|save id|stay signed in|ricordami|次回からログオンIDの入力を省略する|メールアドレスを保存する|を保存|아이디저장|아이디 저장|로그인 상태 유지|lembrar|manter conectado|mantenha-me conectado|Запомни меня|запомнить меня|Запомните меня|Не спрашивать в следующий раз|下次自动登录|记住我/i; const newsletterStringRegex = /newsletter|ニュースレター/i; +const passwordStringAndAttrRegex = new RegExp( + passwordStringRegex.source + "|" + passwordAttrRegex.source, + "i" +); function makeRuleset(coeffs, biases) { + // HTMLElement => (selector => Array<HTMLElement>) nested map to cache querySelectorAll calls. + let elementToSelectors; + // We want to clear the cache each time the model is executed to get the latest DOM snapshot + // for each classification. + function clearCache() { + // WeakMaps do not have a clear method + elementToSelectors = new WeakMap(); + } + function hasLabelMatchingRegex(element, regex) { // Check element.labels const labels = element.labels; @@ -248,16 +261,33 @@ function makeRuleset(coeffs, biases) { return fnode.element.autocomplete === "current-password"; } + // Check cache before calling querySelectorAll on element + function getElementDescendants(element, selector) { + // Use the element to look up the selector map: + const selectorToDescendants = setDefault( + elementToSelectors, + element, + () => new Map() + ); + + // Use the selector to grab the descendants: + return setDefault( + selectorToDescendants, // eslint-disable-line prettier/prettier + selector, + () => Array.from(element.querySelectorAll(selector)) + ); + } + function hasSomeMatchingPredicateForSelectorWithinElement( element, selector, matchingPredicate ) { - if (element !== null) { - const selectorArray = Array.from(element.querySelectorAll(selector)); - return selectorArray.some(matchingPredicate); + if (element === null) { + return false; } - return false; + const elements = getElementDescendants(element, selector); + return elements.some(matchingPredicate); } function textContentMatchesRegexes(element, ...regexes) { @@ -302,6 +332,17 @@ function makeRuleset(coeffs, biases) { return false; } + /** + * Let us compactly represent a collection of rules that all take a single + * type with no .when() clause and have only a score() call on the right-hand + * side. + */ + function* simpleScoringRulesTakingType(inType, ruleMap) { + for (const [name, scoringCallback] of Object.entries(ruleMap)) { + yield rule(type(inType), score(scoringCallback), { name }); + } + } + return ruleset( [ rule( @@ -310,152 +351,67 @@ function makeRuleset(coeffs, biases) { "input[type=password]:not([disabled]):not([aria-hidden=true]" ).when(isVisible) : element("input"), - type("new") - ), - rule( - type("new"), - score(fnode => hasLabelMatchingRegex(fnode.element, newStringRegex)), - { name: "hasNewLabel" } - ), - rule( - type("new"), - score(fnode => - hasLabelMatchingRegex(fnode.element, confirmStringRegex) - ), - { name: "hasConfirmLabel" } - ), - rule( - type("new"), - score(fnode => - hasLabelMatchingRegex(fnode.element, currentAttrAndStringRegex) - ), - { name: "hasCurrentLabel" } - ), - rule( - type("new"), - score(fnode => closestLabelMatchesRegex(fnode.element, newStringRegex)), - { name: "closestLabelMatchesNew" } - ), - rule( - type("new"), - score(fnode => - closestLabelMatchesRegex(fnode.element, confirmStringRegex) - ), - { name: "closestLabelMatchesConfirm" } - ), - rule( - type("new"), - score(fnode => - closestLabelMatchesRegex(fnode.element, currentAttrAndStringRegex) - ), - { name: "closestLabelMatchesCurrent" } - ), - rule( - type("new"), - score(fnode => - hasAriaLabelMatchingRegex(fnode.element, newStringRegex) - ), - { name: "hasNewAriaLabel" } - ), - rule( - type("new"), - score(fnode => - hasAriaLabelMatchingRegex(fnode.element, confirmStringRegex) - ), - { name: "hasConfirmAriaLabel" } - ), - rule( - type("new"), - score(fnode => - hasAriaLabelMatchingRegex(fnode.element, currentAttrAndStringRegex) - ), - { name: "hasCurrentAriaLabel" } - ), - rule( - type("new"), - score(fnode => - hasPlaceholderMatchingRegex(fnode.element, newStringRegex) - ), - { name: "hasNewPlaceholder" } - ), - rule( - type("new"), - score(fnode => - hasPlaceholderMatchingRegex(fnode.element, confirmStringRegex) - ), - { name: "hasConfirmPlaceholder" } - ), - rule( - type("new"), - score(fnode => - hasPlaceholderMatchingRegex(fnode.element, currentAttrAndStringRegex) - ), - { name: "hasCurrentPlaceholder" } - ), - rule( - type("new"), - score(fnode => + type("new").note(clearCache) + ), + ...simpleScoringRulesTakingType("new", { + hasNewLabel: fnode => + hasLabelMatchingRegex(fnode.element, newStringRegex), + hasConfirmLabel: fnode => + hasLabelMatchingRegex(fnode.element, confirmStringRegex), + hasCurrentLabel: fnode => + hasLabelMatchingRegex(fnode.element, currentAttrAndStringRegex), + closestLabelMatchesNew: fnode => + closestLabelMatchesRegex(fnode.element, newStringRegex), + closestLabelMatchesConfirm: fnode => + closestLabelMatchesRegex(fnode.element, confirmStringRegex), + closestLabelMatchesCurrent: fnode => + closestLabelMatchesRegex(fnode.element, currentAttrAndStringRegex), + hasNewAriaLabel: fnode => + hasAriaLabelMatchingRegex(fnode.element, newStringRegex), + hasConfirmAriaLabel: fnode => + hasAriaLabelMatchingRegex(fnode.element, confirmStringRegex), + hasCurrentAriaLabel: fnode => + hasAriaLabelMatchingRegex(fnode.element, currentAttrAndStringRegex), + hasNewPlaceholder: fnode => + hasPlaceholderMatchingRegex(fnode.element, newStringRegex), + hasConfirmPlaceholder: fnode => + hasPlaceholderMatchingRegex(fnode.element, confirmStringRegex), + hasCurrentPlaceholder: fnode => + hasPlaceholderMatchingRegex(fnode.element, currentAttrAndStringRegex), + forgotPasswordInFormLinkTextContent: fnode => testRegexesAgainstAnchorPropertyWithinElement( "textContent", fnode.element.form, passwordStringRegex, forgotStringRegex - ) - ), - { name: "forgotPasswordInFormLinkTextContent" } - ), - rule( - type("new"), - score(fnode => + ), + forgotPasswordInFormLinkHref: fnode => testRegexesAgainstAnchorPropertyWithinElement( "href", fnode.element.form, - new RegExp( - passwordStringRegex.source + "|" + passwordAttrRegex.source, - "i" - ), + passwordStringAndAttrRegex, forgotHrefRegex - ) - ), - { name: "forgotPasswordInFormLinkHref" } - ), - rule( - type("new"), - score(fnode => + ), + forgotPasswordInFormLinkTitle: fnode => testRegexesAgainstAnchorPropertyWithinElement( "title", fnode.element.form, passwordStringRegex, forgotStringRegex - ) - ), - { name: "forgotPasswordInFormLinkTitle" } - ), - rule( - type("new"), - score(fnode => + ), + forgotInFormLinkTextContent: fnode => testRegexesAgainstAnchorPropertyWithinElement( "textContent", fnode.element.form, forgotStringRegex - ) - ), - { name: "forgotInFormLinkTextContent" } - ), - rule( - type("new"), - score(fnode => + ), + forgotInFormLinkHref: fnode => testRegexesAgainstAnchorPropertyWithinElement( "href", fnode.element.form, forgotHrefRegex - ) - ), - { name: "forgotInFormLinkHref" } - ), - rule( - type("new"), - score(fnode => + ), + forgotPasswordInFormButtonTextContent: fnode => hasSomeMatchingPredicateForSelectorWithinElement( fnode.element.form, "button", @@ -465,52 +421,29 @@ function makeRuleset(coeffs, biases) { passwordStringRegex, forgotStringRegex ) - ) - ), - { name: "forgotPasswordInFormButtonTextContent" } - ), - rule( - type("new"), - score(fnode => + ), + forgotPasswordOnPageLinkTextContent: fnode => testRegexesAgainstAnchorPropertyWithinElement( "textContent", fnode.element.ownerDocument, passwordStringRegex, forgotStringRegex - ) - ), - { name: "forgotPasswordOnPageLinkTextContent" } - ), - rule( - type("new"), - score(fnode => + ), + forgotPasswordOnPageLinkHref: fnode => testRegexesAgainstAnchorPropertyWithinElement( "href", fnode.element.ownerDocument, - new RegExp( - passwordStringRegex.source + "|" + passwordAttrRegex.source, - "i" - ), + passwordStringAndAttrRegex, forgotHrefRegex - ) - ), - { name: "forgotPasswordOnPageLinkHref" } - ), - rule( - type("new"), - score(fnode => + ), + forgotPasswordOnPageLinkTitle: fnode => testRegexesAgainstAnchorPropertyWithinElement( "title", fnode.element.ownerDocument, passwordStringRegex, forgotStringRegex - ) - ), - { name: "forgotPasswordOnPageLinkTitle" } - ), - rule( - type("new"), - score(fnode => + ), + forgotPasswordOnPageButtonTextContent: fnode => hasSomeMatchingPredicateForSelectorWithinElement( fnode.element.ownerDocument, "button", @@ -520,151 +453,69 @@ function makeRuleset(coeffs, biases) { passwordStringRegex, forgotStringRegex ) - ) - ), - { name: "forgotPasswordOnPageButtonTextContent" } - ), - rule( - type("new"), - score(fnode => elementAttrsMatchRegex(fnode.element, newAttrRegex)), - { name: "elementAttrsMatchNew" } - ), - rule( - type("new"), - score(fnode => elementAttrsMatchRegex(fnode.element, confirmAttrRegex)), - { name: "elementAttrsMatchConfirm" } - ), - rule( - type("new"), - score(fnode => - elementAttrsMatchRegex(fnode.element, currentAttrAndStringRegex) - ), - { name: "elementAttrsMatchCurrent" } - ), - rule( - type("new"), - score(fnode => elementAttrsMatchRegex(fnode.element, password1Regex)), - { name: "elementAttrsMatchPassword1" } - ), - rule( - type("new"), - score(fnode => elementAttrsMatchRegex(fnode.element, password2Regex)), - { name: "elementAttrsMatchPassword2" } - ), - rule( - type("new"), - score(fnode => elementAttrsMatchRegex(fnode.element, loginRegex)), - { name: "elementAttrsMatchLogin" } - ), - rule( - type("new"), - score(fnode => - elementAttrsMatchRegex(fnode.element.form, registerFormAttrRegex) - ), - { name: "formAttrsMatchRegister" } - ), - rule( - type("new"), - score(fnode => + ), + elementAttrsMatchNew: fnode => + elementAttrsMatchRegex(fnode.element, newAttrRegex), + elementAttrsMatchConfirm: fnode => + elementAttrsMatchRegex(fnode.element, confirmAttrRegex), + elementAttrsMatchCurrent: fnode => + elementAttrsMatchRegex(fnode.element, currentAttrAndStringRegex), + elementAttrsMatchPassword1: fnode => + elementAttrsMatchRegex(fnode.element, password1Regex), + elementAttrsMatchPassword2: fnode => + elementAttrsMatchRegex(fnode.element, password2Regex), + elementAttrsMatchLogin: fnode => + elementAttrsMatchRegex(fnode.element, loginRegex), + formAttrsMatchRegister: fnode => + elementAttrsMatchRegex(fnode.element.form, registerFormAttrRegex), + formHasRegisterAction: fnode => containsRegex( registerActionRegex, fnode.element.form, form => form.action - ) - ), - { name: "formHasRegisterAction" } - ), - rule( - type("new"), - score(fnode => - testFormButtonsAgainst(fnode.element, registerStringRegex) - ), - { name: "formButtonIsRegister" } - ), - rule( - type("new"), - score(fnode => - elementAttrsMatchRegex(fnode.element.form, loginFormAttrRegex) - ), - { name: "formAttrsMatchLogin" } - ), - rule( - type("new"), - score(fnode => - containsRegex(loginRegex, fnode.element.form, form => form.action) - ), - { name: "formHasLoginAction" } - ), - rule( - type("new"), - score(fnode => testFormButtonsAgainst(fnode.element, loginRegex)), - { name: "formButtonIsLogin" } - ), - rule(type("new"), score(hasAutocompleteCurrentPassword), { - name: "hasAutocompleteCurrentPassword", - }), - rule( - type("new"), - score(fnode => + ), + formButtonIsRegister: fnode => + testFormButtonsAgainst(fnode.element, registerStringRegex), + formAttrsMatchLogin: fnode => + elementAttrsMatchRegex(fnode.element.form, loginFormAttrRegex), + formHasLoginAction: fnode => + containsRegex(loginRegex, fnode.element.form, form => form.action), + formButtonIsLogin: fnode => + testFormButtonsAgainst(fnode.element, loginRegex), + hasAutocompleteCurrentPassword, + formHasRememberMeCheckbox: fnode => hasSomeMatchingPredicateForSelectorWithinElement( fnode.element.form, "input[type=checkbox]", checkbox => rememberMeAttrRegex.test(checkbox.id) || rememberMeAttrRegex.test(checkbox.name) - ) - ), - { name: "formHasRememberMeCheckbox" } - ), - rule( - type("new"), - score(fnode => + ), + formHasRememberMeLabel: fnode => hasSomeMatchingPredicateForSelectorWithinElement( fnode.element.form, "label", label => rememberMeStringRegex.test(label.textContent) - ) - ), - { name: "formHasRememberMeLabel" } - ), - rule( - type("new"), - score(fnode => + ), + formHasNewsletterCheckbox: fnode => hasSomeMatchingPredicateForSelectorWithinElement( fnode.element.form, "input[type=checkbox]", checkbox => checkbox.id.includes("newsletter") || checkbox.name.includes("newsletter") - ) - ), - { name: "formHasNewsletterCheckbox" } - ), - rule( - type("new"), - score(fnode => + ), + formHasNewsletterLabel: fnode => hasSomeMatchingPredicateForSelectorWithinElement( fnode.element.form, "label", label => newsletterStringRegex.test(label.textContent) - ) - ), - { name: "formHasNewsletterLabel" } - ), - rule( - type("new"), - score(fnode => - closestHeaderAboveMatchesRegex(fnode.element, loginRegex) - ), - { name: "closestHeaderAboveIsLoginy" } - ), - rule( - type("new"), - score(fnode => - closestHeaderAboveMatchesRegex(fnode.element, registerStringRegex) - ), - { name: "closestHeaderAboveIsRegistery" } - ), + ), + closestHeaderAboveIsLoginy: fnode => + closestHeaderAboveMatchesRegex(fnode.element, loginRegex), + closestHeaderAboveIsRegistery: fnode => + closestHeaderAboveMatchesRegex(fnode.element, registerStringRegex), + }), rule(type("new"), out("new")), ], coeffs, diff --git a/toolkit/components/passwordmgr/test/browser/browser_doorhanger_remembering.js b/toolkit/components/passwordmgr/test/browser/browser_doorhanger_remembering.js index 765c7666e70cc75b83a2bf75669c7dcc61833163..78015faa78a9e12558aa6f1c087c6e4d96aa569b 100644 --- a/toolkit/components/passwordmgr/test/browser/browser_doorhanger_remembering.js +++ b/toolkit/components/passwordmgr/test/browser/browser_doorhanger_remembering.js @@ -508,7 +508,12 @@ add_task(async function test_changeUPLoginOnUPForm_change() { is(notif.message, "Would you like to update this login?", "Check message"); await checkDoorhangerUsernamePassword("notifyu1", "pass2"); + let promiseLoginUpdateSaved = TestUtils.topicObserved( + "LoginStats:LoginUpdateSaved", + (subject, data) => subject == gBrowser.selectedBrowser + ); clickDoorhangerButton(notif, CHANGE_BUTTON); + await promiseLoginUpdateSaved; ok(!getCaptureDoorhanger("password-change"), "popup should be gone"); }); diff --git a/toolkit/components/passwordmgr/test/browser/head.js b/toolkit/components/passwordmgr/test/browser/head.js index e65e0a397392c22692955cc4573788f069cb152b..ea49469b84e38f10d071f315d2343aa11a756e70 100644 --- a/toolkit/components/passwordmgr/test/browser/head.js +++ b/toolkit/components/passwordmgr/test/browser/head.js @@ -12,6 +12,8 @@ add_task(async function common_initialize() { await SpecialPowers.pushPrefEnv({ set: [ ["signon.rememberSignons", true], + ["signon.testOnlyUserHasInteractedByPrefValue", true], + ["signon.testOnlyUserHasInteractedWithDocument", true], ["toolkit.telemetry.ipcBatchTimeout", 0], ], }); diff --git a/toolkit/components/passwordmgr/test/mochitest/mochitest.ini b/toolkit/components/passwordmgr/test/mochitest/mochitest.ini index 04dd5cfa01f94826cc5387fe2e69e25d49738d3f..873d75eed4fd6b6dfc90fdbdf7ff6e23ead0f2fb 100644 --- a/toolkit/components/passwordmgr/test/mochitest/mochitest.ini +++ b/toolkit/components/passwordmgr/test/mochitest/mochitest.ini @@ -3,6 +3,8 @@ prefs = signon.rememberSignons=true signon.autofillForms.http=true signon.showAutoCompleteFooter=true + signon.testOnlyUserHasInteractedByPrefValue=true + signon.testOnlyUserHasInteractedWithDocument=true security.insecure_field_warning.contextual.enabled=false network.auth.non-web-content-triggered-resources-http-auth-allow=true @@ -27,7 +29,7 @@ skip-if = toolkit == 'android' && !is_fennec # Don't run on GeckoView # Note: new tests should use scheme = https unless they have a specific reason not to [test_autocomplete_basic_form.html] -skip-if = toolkit == 'android' # android:autocomplete +skip-if = toolkit == 'android' || debug && (os == 'linux' || os == 'win') # android:autocomplete. Bug 1541945 scheme = https [test_autocomplete_basic_form_insecure.html] skip-if = toolkit == 'android' || os == 'linux' # android:autocomplete., linux: bug 1325778 diff --git a/toolkit/components/passwordmgr/test/mochitest/test_submit_without_field_modifications.html b/toolkit/components/passwordmgr/test/mochitest/test_submit_without_field_modifications.html index c187c4bbc0873fe7bc0b9d793bee08f5e2a8cc91..92cee77b626b82b255b75c291b15da3293c00c02 100644 --- a/toolkit/components/passwordmgr/test/mochitest/test_submit_without_field_modifications.html +++ b/toolkit/components/passwordmgr/test/mochitest/test_submit_without_field_modifications.html @@ -37,6 +37,31 @@ function waitForLoad() { }); } +async function setupWithOneLogin(pageUrl) { + let chromeScript = runInParent(function testSetup() { + const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm"); + let login = Cc["@mozilla.org/login-manager/loginInfo;1"] + .createInstance(Ci.nsILoginInfo); + login.init("https://example.com", "https://example.com", null, + "user1", "pass1"); + + Services.logins.addLogin(login); + for (let l of Services.logins.getAllLogins()) { + info("Got login: " + l.username + ", " + l.password); + } + }); + await setup(pageUrl); + return chromeScript; +} + +function resetSavedLogins() { + let chromeScript = runInParent(function testTeardown() { + const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm"); + Services.logins.removeAllLogins(); + }); + chromeScript.destroy(); +} + async function setup(pageUrl) { let loadPromise = waitForLoad(); let processedFormPromise = promiseFormsProcessed(); @@ -53,25 +78,63 @@ async function setup(pageUrl) { }); } -async function clickLink() { +async function navigateWithoutUserInteraction() { let loadPromise = waitForLoad(); await SpecialPowers.spawn(getIframeBrowsingContext(window), [], function() { let doc = this.content.document; - doc.querySelector("a[href]").click(); + let hadInteracted = doc.userHasInteracted; + let target = doc.querySelector("a[href]"); + if (target) { + target.click(); + } else { + target = doc.querySelector("form"); + target.submit(); + } + is(doc.userHasInteracted, hadInteracted, "document.userHasInteracted shouldn't have changed"); }); await loadPromise; } async function userInput(selector, value) { - await SpecialPowers.spawn(getIframeBrowsingContext(window), [selector, value], function(sel, val) { - this.content.document.querySelector(sel).setUserInput(val); + await SpecialPowers.spawn(getIframeBrowsingContext(window), [selector, value], async function(sel, val) { + // use "real" synthesized events rather than setUserInput to ensure + // document.userHasInteracted is flipped true + let EventUtils = ContentTaskUtils.getEventUtils(content); + let target = this.content.document.querySelector(sel); + target.focus(); + target.select(); + await EventUtils.synthesizeKey("KEY_Backspace", {}, this.content); + await EventUtils.sendString(val, this.content); + info( + `userInput: new target.value: ${target.value}` + ); + target.blur(); + return Promise.resolve(); + }); +} + +function checkDocumentUserHasInteracted() { + return SpecialPowers.spawn(getIframeBrowsingContext(window), [], function() { + return this.content.document.userHasInteracted; }); } add_task(async function test_init() { + // For this test, we'll be testing with & without user document interaction. + // So we'll reset the pref which dictates the behavior of LMC._formHasModifiedFields in automation + // and ensure all interactions are properly emulated + ok(SpecialPowers.getBoolPref("signon.testOnlyUserHasInteractedByPrefValue"), "signon.testOnlyUserHasInteractedByPrefValue should default to true"); + info("test_init, flipping the signon.testOnlyUserHasInteractedByPrefValue pref"); await SpecialPowers.pushPrefEnv({"set": [ - ["signon.userInputRequiredToCapture.enabled", true], + ["signon.testOnlyUserHasInteractedByPrefValue", false], ]}); + SimpleTest.registerCleanupFunction(async function cleanup_pref() { + await SpecialPowers.popPrefEnv(); + }); + + await SimpleTest.promiseWaitForCondition(() => LoginHelper.testOnlyUserHasInteractedWithDocument === null); + is(LoginHelper.testOnlyUserHasInteractedWithDocument, null, + "LoginHelper.testOnlyUserHasInteractedWithDocument should be null for this set of tests"); }); add_task(async function test_no_message_on_navigation() { @@ -83,7 +146,7 @@ add_task(async function test_no_message_on_navigation() { getSubmitMessage().then(value => { submitMessageSent = true; }); - await clickLink(); + await navigateWithoutUserInteraction(); // allow time to pass before concluding no onFormSubmit message was sent await new Promise(res => setTimeout(res, 1000)); @@ -98,7 +161,7 @@ add_task(async function test_prefd_off_message_on_navigation() { await setup(PREFILLED_FORM_URL); let promiseSubmitMessage = getSubmitMessage(); - await clickLink(); + await navigateWithoutUserInteraction(); await promiseSubmitMessage; info("onFormSubmit message was sent as expected after navigation"); @@ -110,7 +173,7 @@ add_task(async function test_message_with_user_interaction_on_navigation() { await userInput("#form-basic-username", "foo"); let promiseSubmitMessage = getSubmitMessage(); - await clickLink(); + await navigateWithoutUserInteraction(); await promiseSubmitMessage; info("onFormSubmit message was sent as expected after user interaction"); }); @@ -121,47 +184,77 @@ add_task(async function test_empty_form_with_input_handler() { await userInput("#form-basic-password", "pass"); let promiseSubmitMessage = getSubmitMessage(); - await clickLink(); + await navigateWithoutUserInteraction(); await promiseSubmitMessage; info("onFormSubmit message was sent as expected after user interaction"); }); -add_task(async function test_message_on_autofill_without_user_interaction() { - runInParent(function addLogin() { - const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm"); - let login = Cc["@mozilla.org/login-manager/loginInfo;1"] - .createInstance(Ci.nsILoginInfo); - login.init("https://example.com", "https://example.com", null, - "user1", "pass1", "", ""); +add_task(async function test_no_message_on_autofill_without_user_interaction() { + let chromeScript = await setupWithOneLogin(EXAMPLE_COM + "form_basic.html"); + // Check for autofilled values. + await checkLoginFormInChildFrame(getIframeBrowsingContext(window, 0), + "form-basic-username", "user1", + "form-basic-password", "pass1"); - Services.logins.addLogin(login); + info("LoginHelper.testOnlyUserHasInteractedWithDocument:" + + LoginHelper.testOnlyUserHasInteractedWithDocument + ); + ok(!(await checkDocumentUserHasInteracted()), "document.userHasInteracted should be initially false"); + let submitMessageSent = false; + getSubmitMessage().then(value => { + submitMessageSent = true; }); + info("Navigating the page") + await navigateWithoutUserInteraction(); + + // allow time to pass before concluding no onFormSubmit message was sent + await new Promise(res => setTimeout(res, 1000)); + + chromeScript.destroy(); + resetSavedLogins(); + + ok(!submitMessageSent, "onFormSubmit message is not sent on navigation since the document had no user interaction"); +}); - await setup(EXAMPLE_COM + "form_basic.html"); +add_task(async function test_message_on_autofill_with_document_interaction() { + // We expect that as long as the form values !== their defaultValues, + // any document interaction allows the submit message to be sent + + let chromeScript = await setupWithOneLogin(EXAMPLE_COM + "form_basic.html"); // Check for autofilled values. await checkLoginFormInChildFrame(getIframeBrowsingContext(window, 0), "form-basic-username", "user1", "form-basic-password", "pass1"); + let userInteracted = await checkDocumentUserHasInteracted(); + ok(!userInteracted, "document.userHasInteracted should be initially false"); + + await SpecialPowers.spawn(getIframeBrowsingContext(window), ["#form-basic-username"], async function(sel) { + // Click somewhere in the document to ensure document.userHasInteracted is flipped to true + let EventUtils = ContentTaskUtils.getEventUtils(content); + let target = this.content.document.querySelector(sel); + + await EventUtils.synthesizeMouseAtCenter(target, {}, this.content); + }); + + userInteracted = await checkDocumentUserHasInteracted(); + ok(userInteracted, "After synthesizeMouseAtCenter, document.userHasInteracted should be true"); + let promiseSubmitMessage = getSubmitMessage(); - await clickLink(); + await navigateWithoutUserInteraction(); let messageData = await promiseSubmitMessage; ok(messageData.autoFilledLoginGuid, "Message was sent with autoFilledLoginGuid"); + info("Message was sent as expected after document user interaction"); + + chromeScript.destroy(); + resetSavedLogins(); }); add_task(async function test_message_on_autofill_with_user_interaction() { - runInParent(function addLogin() { - const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm"); - let login = Cc["@mozilla.org/login-manager/loginInfo;1"] - .createInstance(Ci.nsILoginInfo); - login.init("https://example.com", "https://example.com", null, - "user1", "pass1", "", ""); - - Services.logins.addLogin(login); - }); - - await setup(EXAMPLE_COM + "form_basic.html"); + // Editing a field value causes the submit message to be sent as + // there is both document interaction and field modification + let chromeScript = await setupWithOneLogin(EXAMPLE_COM + "form_basic.html"); // Check for autofilled values. await checkLoginFormInChildFrame(getIframeBrowsingContext(window, 0), "form-basic-username", "user1", @@ -169,12 +262,15 @@ add_task(async function test_message_on_autofill_with_user_interaction() { userInput("#form-basic-username", "newuser"); let promiseSubmitMessage = getSubmitMessage(); - await clickLink(); + await navigateWithoutUserInteraction(); let messageData = await promiseSubmitMessage; ok(messageData.autoFilledLoginGuid, "Message was sent with autoFilledLoginGuid"); is(messageData.usernameField.value, "newuser", "Message was sent with correct usernameField.value"); - info("Message was sent as expected after user interaction"); + info("Message was sent as expected after user form interaction"); + + chromeScript.destroy(); + resetSavedLogins(); }); add_task(async function test_no_message_on_user_input_from_other_form() { @@ -207,7 +303,7 @@ add_task(async function test_no_message_on_user_input_from_other_form() { }); info("submitting the form"); - await clickLink(); + await navigateWithoutUserInteraction(); // allow time to pass before concluding no onFormSubmit message was sent await new Promise(res => setTimeout(res, 1000)); diff --git a/toolkit/components/pictureinpicture/content/player.js b/toolkit/components/pictureinpicture/content/player.js index 5c6c9b1ca0e3c351d57f8d208e8660255f837a16..888bef64bf716c71336b93e110d065f425218d7c 100644 --- a/toolkit/components/pictureinpicture/content/player.js +++ b/toolkit/components/pictureinpicture/content/player.js @@ -68,6 +68,8 @@ let Player = { "dblclick", "keydown", "mouseout", + "MozDOMFullscreen:Entered", + "MozDOMFullscreen:Exited", "resize", "unload", ], @@ -208,6 +210,28 @@ let Player = { break; } + // Normally, the DOMFullscreenParent / DOMFullscreenChild actors + // would take care of firing the `fullscreen-painted` notification, + // however, those actors are only ever instantiated when a <browser> + // is fullscreened, and not a <body> element in a parent-process + // chrome privileged DOM window. + // + // Rather than trying to re-engineer JSWindowActors to be re-usable for + // this edge-case, we do the work of firing fullscreen-painted when + // transitioning in and out of fullscreen ourselves here. + case "MozDOMFullscreen:Entered": + // Intentional fall-through + case "MozDOMFullscreen:Exited": { + let { lastTransactionId } = window.windowUtils; + window.addEventListener("MozAfterPaint", function onPainted(event) { + if (event.transactionId > lastTransactionId) { + window.removeEventListener("MozAfterPaint", onPainted); + Services.obs.notifyObservers(window, "fullscreen-painted"); + } + }); + break; + } + case "oop-browser-crashed": { PictureInPicture.closePipWindow({ reason: "browser-crash" }); break; diff --git a/toolkit/components/places/PageIconProtocolHandler.cpp b/toolkit/components/places/PageIconProtocolHandler.cpp index 9e30fda1d32ac28b76326fd5505a98cbecfa95b0..d3300d0c2c6c8ac30613a94ed9a58d270b2a2e56 100644 --- a/toolkit/components/places/PageIconProtocolHandler.cpp +++ b/toolkit/components/places/PageIconProtocolHandler.cpp @@ -4,6 +4,7 @@ #include "PageIconProtocolHandler.h" +#include "mozilla/NullPrincipal.h" #include "mozilla/ScopeExit.h" #include "mozilla/Services.h" #include "nsFaviconService.h" @@ -196,12 +197,17 @@ nsresult PageIconProtocolHandler::NewChannelInternal(nsIURI* aURI, // Create our channel. nsCOMPtr<nsIChannel> channel; - rv = NS_NewInputStreamChannel( - getter_AddRefs(channel), aURI, pipeIn.forget(), - aLoadInfo->LoadingPrincipal(), - nsILoadInfo::SEC_REQUIRE_SAME_ORIGIN_DATA_IS_BLOCKED, - nsIContentPolicy::TYPE_INTERNAL_IMAGE); - NS_ENSURE_SUCCESS(rv, rv); + { + // We override the channel's loadinfo below anyway, so using a null + // principal here is alright. + nsCOMPtr<nsIPrincipal> loadingPrincipal = + NullPrincipal::CreateWithoutOriginAttributes(); + rv = NS_NewInputStreamChannel( + getter_AddRefs(channel), aURI, pipeIn.forget(), + loadingPrincipal, nsILoadInfo::SEC_REQUIRE_SAME_ORIGIN_DATA_IS_BLOCKED, + nsIContentPolicy::TYPE_INTERNAL_IMAGE); + NS_ENSURE_SUCCESS(rv, rv); + } rv = channel->SetLoadInfo(aLoadInfo); NS_ENSURE_SUCCESS(rv, rv); diff --git a/toolkit/components/printing/content/printUtils.js b/toolkit/components/printing/content/printUtils.js index f8729f6575cc083316c4295fdf6b3120e244855c..1405d0e67f34f62582c830e1c8404859af0ed47e 100644 --- a/toolkit/components/printing/content/printUtils.js +++ b/toolkit/components/printing/content/printUtils.js @@ -279,16 +279,7 @@ var PrintUtils = { _originalURL: "", _shouldSimplify: false, - _displayPrintingError(nsresult, isPrinting) { - // The nsresults from a printing error are mapped to strings that have - // similar names to the errors themselves. For example, for error - // NS_ERROR_GFX_PRINTER_NO_PRINTER_AVAILABLE, the name of the string - // for the error message is: PERR_GFX_PRINTER_NO_PRINTER_AVAILABLE. What's - // more, if we're in the process of doing a print preview, it's possible - // that there are strings specific for print preview for these errors - - // if so, the names of those strings have _PP as a suffix. It's possible - // that no print preview specific strings exist, in which case it is fine - // to fall back to the original string name. + _getErrorCodeForNSResult(nsresult) { const MSG_CODES = [ "GFX_PRINTER_NO_PRINTER_AVAILABLE", "GFX_PRINTER_NAME_NOT_FOUND", @@ -304,20 +295,30 @@ var PrintUtils = { "UNEXPECTED", ]; - // PERR_FAILURE is the catch-all error message if we've gotten one that - // we don't recognize. - let msgName = "PERR_FAILURE"; - for (let code of MSG_CODES) { let nsErrorResult = "NS_ERROR_" + code; if (Cr[nsErrorResult] == nsresult) { - msgName = "PERR_" + code; - break; + return code; } } - let msg, title; + // PERR_FAILURE is the catch-all error message if we've gotten one that + // we don't recognize. + return "FAILURE"; + }, + _displayPrintingError(nsresult, isPrinting) { + // The nsresults from a printing error are mapped to strings that have + // similar names to the errors themselves. For example, for error + // NS_ERROR_GFX_PRINTER_NO_PRINTER_AVAILABLE, the name of the string + // for the error message is: PERR_GFX_PRINTER_NO_PRINTER_AVAILABLE. What's + // more, if we're in the process of doing a print preview, it's possible + // that there are strings specific for print preview for these errors - + // if so, the names of those strings have _PP as a suffix. It's possible + // that no print preview specific strings exist, in which case it is fine + // to fall back to the original string name. + let msgName = "PERR_" + this._getErrorCodeForNSResult(nsresult); + let msg, title; if (!isPrinting) { // Try first with _PP suffix. let ppMsgName = msgName + "_PP"; @@ -348,6 +349,11 @@ var PrintUtils = { aMessage.data.nsresult, aMessage.data.isPrinting ); + Services.telemetry.keyedScalarAdd( + "printing.error", + this._getErrorCodeForNSResult(aMessage.data.nsresult), + 1 + ); return undefined; } diff --git a/toolkit/components/telemetry/Events.yaml b/toolkit/components/telemetry/Events.yaml index 3f721fc693b75c3481f6db8d8d861379a42f2afc..03c36d2e1b6dcb9f7f823fddc9312e2a5c02a1d5 100644 --- a/toolkit/components/telemetry/Events.yaml +++ b/toolkit/components/telemetry/Events.yaml @@ -628,16 +628,37 @@ pwmgr: record_in_processes: [main, content] release_channel_collection: opt-out expiry_version: never + reauthenticate: + description: > + Measure how often users are asked to authenticate with their Operating System or Master Password to gain access to stored passwords. + Possible values are as follows, + "success_no_prompt" should be used when the feature is enabled but no prompt is given to the user because they have recently authenticated. + "success_disabled" is used when the feature is disabled. + "success_unsupported_platform" should be set when the user attempts to authenticate on an unsupported platform. + "success_no_password" should be used when the user doesn't have an OS password set. + objects: [ + "master_password", + "os_auth", + ] + methods: ["reauthenticate"] + bug_numbers: + - 1628029 + - 1623745 + expiry_version: never + notification_emails: ["loines@mozilla.com", "passwords-dev@mozilla.org", "jaws@mozilla.com"] + release_channel_collection: opt-out + products: + - "firefox" + record_in_processes: [content] mgmt_interaction: description: > - These events record interactions on the about:logins page. Sort methods have an accompanying - value that specifies what order the list of logins is sorted with: {last_changed, last_used, title}. + These events record interactions on the about:logins page. extra_keys: breached: > Whether the login is marked as breached or not. If a login is both breached and vulnerable, it will only be reported as breached. vulnerable: > Whether the login is marked as vulnerable or not. If a login is both breached and vulnerable, it will only be reported as breached. - sort_key: The key that is used for sorting the login-list + sort_key: The key that is used for sorting the login-list. Should only be set with the "sort" method. objects: [ "existing_login", "list", @@ -654,6 +675,7 @@ pwmgr: "filter", "hide", "learn_more_breach", + "learn_more_vuln", "new", "open_site", "save", @@ -664,13 +686,13 @@ pwmgr: bug_numbers: - 1548463 - 1600958 + - 1549115 + - 1628165 expiry_version: never notification_emails: ["loines@mozilla.com", "passwords-dev@mozilla.org", "jaws@mozilla.com"] release_channel_collection: opt-out products: - "firefox" - - "fennec" - - "geckoview" record_in_processes: [content] autocomplete_field: objects: ["generatedpassword"] diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json index e7d4a523a0f38e3a175fc7127cfa2cc2f610271a..3bef140effaf86ab7804c5d859bc8aa115b90e86 100644 --- a/toolkit/components/telemetry/Histograms.json +++ b/toolkit/components/telemetry/Histograms.json @@ -5368,9 +5368,10 @@ "record_in_processes": ["main"], "products": ["firefox", "geckoview"], "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"], - "bug_numbers": [1622335], + "bug_numbers": [1622335, 1630899], "expires_in_version": "82", "kind": "categorical", + "releaseChannelCollection": "opt-out", "labels": ["ftp", "other"], "description": "Whether the scheme of the PAC URL was FTP" }, @@ -7543,13 +7544,6 @@ "keyed": true, "description": "Number of toplevel location changes in tablet and desktop mode (only used on win10 where tablet mode is available)" }, - "FX_TOUCH_USED": { - "record_in_processes": ["main", "content"], - "products": ["firefox", "fennec", "geckoview"], - "expires_in_version": "46", - "kind": "count", - "description": "Windows only. Counts occurrences of touch events" - }, "FX_URLBAR_SELECTED_RESULT_INDEX": { "record_in_processes": ["main", "content"], "products": ["firefox", "fennec", "geckoview"], diff --git a/toolkit/components/telemetry/Scalars.yaml b/toolkit/components/telemetry/Scalars.yaml index cb5b1f16d35d1aac55bad81be33465b777af4306..df8dc14535dee6aa796d5f29115b944e051d8cb8 100644 --- a/toolkit/components/telemetry/Scalars.yaml +++ b/toolkit/components/telemetry/Scalars.yaml @@ -575,6 +575,26 @@ browser.usage: - 'main' - 'content' +browser.input: + touch_event_count: + bug_numbers: + - 1626099 + description: >- + Windows only. + Counts occurrences of touch events, + measured when user starts a touch event. + expires: "90" + kind: uint + notification_emails: + - gfx-telemetry-alerts@mozilla.com + - ktaeleman@mozilla.com + release_channel_collection: opt-out + products: + - 'firefox' + record_in_processes: + - 'main' + - 'content' + gecko: version: bug_numbers: @@ -3302,6 +3322,41 @@ pdf.viewer: - 'main' - 'content' +# The following section contains scalars for printing. +printing: + error: + bug_numbers: + - 1630105 + description: > + A counter incremented every time the user encounters an error printing. + The result is split into keys which represent the values of + error codes related to printing. Possible values are listed in 'keys'. + "FAILURE" is a catch-all code for an error we don't recognize. + keyed: true + keys: + - 'GFX_PRINTER_NO_PRINTER_AVAILABLE' + - 'GFX_PRINTER_NAME_NOT_FOUND' + - 'GFX_PRINTER_COULD_NOT_OPEN_FILE' + - 'GFX_PRINTER_STARTDOC' + - 'GFX_PRINTER_ENDDOC' + - 'GFX_PRINTER_STARTPAGE' + - 'GFX_PRINTER_DOC_IS_BUSY' + - 'ABORT' + - 'NOT_AVAILABLE' + - 'NOT_IMPLEMENTED' + - 'OUT_OF_MEMORY' + - 'UNEXPECTED' + - 'FAILURE' + expires: never + kind: uint + notification_emails: + - jaws@mozilla.com + release_channel_collection: opt-out + products: + - 'firefox' + record_in_processes: + - 'main' + # The following section contains probes that record timestamps. timestamps: first_paint: diff --git a/toolkit/components/telemetry/histogram-allowlists.json b/toolkit/components/telemetry/histogram-allowlists.json index 7c320b67a42aaa9b4a9aa69800ec446cdba580c2..3f4e7f30dbfd7c0d6a9cd6484871b1f9d6c11fc5 100644 --- a/toolkit/components/telemetry/histogram-allowlists.json +++ b/toolkit/components/telemetry/histogram-allowlists.json @@ -127,7 +127,6 @@ "FX_THUMBNAILS_HIT_OR_MISS", "FX_THUMBNAILS_STORE_TIME_MS", "FX_TOTAL_TOP_VISITS", - "FX_TOUCH_USED", "GDI_INITFONTLIST_TOTAL", "GEOLOCATION_ERROR", "GEOLOCATION_OSX_SOURCE_IS_MLS", @@ -558,7 +557,6 @@ "FX_THUMBNAILS_HIT_OR_MISS", "FX_THUMBNAILS_STORE_TIME_MS", "FX_TOTAL_TOP_VISITS", - "FX_TOUCH_USED", "GC_BUDGET_MS", "GC_COMPACT_MS", "GC_INCREMENTAL_DISABLED", @@ -1212,7 +1210,6 @@ "FX_CONTENT_CRASH_NOT_SUBMITTED", "FX_CONTENT_CRASH_PRESENTED", "FX_SESSION_RESTORE_SEND_UPDATE_CAUSED_OOM", - "FX_TOUCH_USED", "GEOLOCATION_ERROR", "MASTER_PASSWORD_ENABLED", "MEDIA_CODEC_USED", diff --git a/toolkit/locales/en-US/toolkit/about/aboutAddons.ftl b/toolkit/locales/en-US/toolkit/about/aboutAddons.ftl index 0611bf1322ed4877d491872f713148804e76ddfe..8e4613f96afa793ef1df207cb00a845d2c64b503 100644 --- a/toolkit/locales/en-US/toolkit/about/aboutAddons.ftl +++ b/toolkit/locales/en-US/toolkit/about/aboutAddons.ftl @@ -29,12 +29,20 @@ list-empty-button = .label = Learn more about add-ons help-button = Add-ons Support +sidebar-help-button-title = + .title = Add-ons Support preferences = { PLATFORM() -> [windows] { -brand-short-name } Options *[other] { -brand-short-name } Preferences } +sidebar-preferences-button-title = + .title = + { PLATFORM() -> + [windows] { -brand-short-name } Options + *[other] { -brand-short-name } Preferences + } show-unsigned-extensions-button = .label = Some extensions could not be verified @@ -198,13 +206,29 @@ private-browsing-description2 = <label data-l10n-name="private-browsing-learn-more">Learn how to manage extension settings</label> addon-category-discover = Recommendations +addon-category-discover-title = + .title = Recommendations addon-category-extension = Extensions +addon-category-extension-title = + .title = Extensions addon-category-theme = Themes +addon-category-theme-title = + .title = Themes addon-category-plugin = Plugins +addon-category-plugin-title = + .title = Plugins addon-category-dictionary = Dictionaries +addon-category-dictionary-title = + .title = Dictionaries addon-category-locale = Languages +addon-category-locale-title = + .title = Languages addon-category-available-updates = Available Updates +addon-category-available-updates-title = + .title = Available Updates addon-category-recent-updates = Recent Updates +addon-category-recent-updates-title = + .title = Recent Updates ## These are global warnings @@ -298,8 +322,8 @@ shortcuts-card-expand-button = shortcuts-card-collapse-button = Show Less -go-back-button = - .tooltiptext = Go back +header-back-button = + .title = Go back ## Recommended add-ons page diff --git a/toolkit/modules/OSKeyStore.jsm b/toolkit/modules/OSKeyStore.jsm index 2d30bce1f7f0a46c80885b1029abb1b912ddb5a5..efb5de8616606fecbe42b07253c276beff63761d 100644 --- a/toolkit/modules/OSKeyStore.jsm +++ b/toolkit/modules/OSKeyStore.jsm @@ -93,7 +93,7 @@ var OSKeyStore = { "oskeystore-testonly-reauth", "pass" ); - break; + return { authenticated: true, auth_details: "success" }; case "cancel": Services.obs.notifyObservers( null, @@ -145,9 +145,9 @@ var OSKeyStore = { * the key storage. If we start creating keys on macOS by running * this code we'll potentially have to do extra work to cleanup * the mess later. - * @returns {Promise<boolean>} True if it's logged in or no password is set - * and false if it's still not logged in (prompt - * canceled or other error). + * @returns {Promise<Object>} Object with the following properties: + * authenticated: {boolean} Set to true if the user successfully authenticated. + * auth_details: {String?} Details of the authentication result. */ async ensureLoggedIn( reauth = false, @@ -195,23 +195,34 @@ var OSKeyStore = { unlockPromise = osReauthenticator .asyncReauthenticateUser(reauth, dialogCaption, parentWindow) .then(reauthResult => { - if (typeof reauthResult == "boolean" && !reauthResult) { + if (typeof reauthResult[0] == "boolean" && !reauthResult[0]) { throw new Components.Exception( "User canceled OS reauth entry", Cr.NS_ERROR_FAILURE ); } + let result = { + authenticated: true, + auth_details: "success", + }; + if (reauthResult.length == 2 && reauthResult[1]) { + result.auth_details += "_no_password"; + } + return result; }); } else { log.debug("ensureLoggedIn: Skipping reauth on unsupported platforms"); - unlockPromise = Promise.resolve(); + unlockPromise = Promise.resolve({ + authenticated: true, + auth_details: "success_unsupported_platform", + }); } } else { - unlockPromise = Promise.resolve(); + unlockPromise = Promise.resolve({ authenticated: true }); } if (generateKeyIfNotAvailable) { - unlockPromise = unlockPromise.then(async () => { + unlockPromise = unlockPromise.then(async reauthResult => { if (!(await nativeOSKeyStore.asyncSecretAvailable(this.STORE_LABEL))) { log.debug( "ensureLoggedIn: Secret unavailable, attempt to generate new secret." @@ -227,23 +238,24 @@ var OSKeyStore = { recoveryPhrase.length ); } + return reauthResult; }); } unlockPromise = unlockPromise.then( - () => { + reauthResult => { log.debug("ensureLoggedIn: Logged in"); this._pendingUnlockPromise = null; this._isLocked = false; - return true; + return reauthResult; }, err => { log.debug("ensureLoggedIn: Not logged in", err); this._pendingUnlockPromise = null; this._isLocked = true; - return false; + return { authenticated: false, auth_details: "fail" }; } ); @@ -267,7 +279,7 @@ var OSKeyStore = { * @returns {Promise<string>} resolves to the decrypted string, or rejects otherwise. */ async decrypt(cipherText, reauth = false) { - if (!(await this.ensureLoggedIn(reauth))) { + if (!(await this.ensureLoggedIn(reauth)).authenticated) { throw Components.Exception( "User canceled OS unlock entry", Cr.NS_ERROR_ABORT @@ -287,7 +299,7 @@ var OSKeyStore = { * @returns {Promise<string>} resolves to the encrypted string (with algorithm), otherwise rejects. */ async encrypt(plainText) { - if (!(await this.ensureLoggedIn())) { + if (!(await this.ensureLoggedIn()).authenticated) { throw Components.Exception( "User canceled OS unlock entry", Cr.NS_ERROR_ABORT diff --git a/toolkit/modules/tests/xpcshell/test_osKeyStore.js b/toolkit/modules/tests/xpcshell/test_osKeyStore.js index 8c237395237fd57b89e71c1db94115cb8fca3b84..82d567f5d7ebf596e167d444c379a99122697290 100644 --- a/toolkit/modules/tests/xpcshell/test_osKeyStore.js +++ b/toolkit/modules/tests/xpcshell/test_osKeyStore.js @@ -34,7 +34,11 @@ const testText = "test string"; let cipherText; add_task(async function test_encrypt_decrypt() { - Assert.equal(await OSKeyStore.ensureLoggedIn(), true, "Started logged in."); + Assert.equal( + (await OSKeyStore.ensureLoggedIn()).authenticated, + true, + "Started logged in." + ); cipherText = await OSKeyStore.encrypt(testText); Assert.notEqual(testText, cipherText); @@ -67,7 +71,7 @@ add_task(async function test_reauth() { reauthObserved = OSKeyStoreTestUtils.waitForOSKeyStoreLogin(false); await new Promise(resolve => TestUtils.executeSoon(resolve)); Assert.equal( - await OSKeyStore.ensureLoggedIn("test message"), + (await OSKeyStore.ensureLoggedIn("test message")).authenticated, false, "Reauth cancelled." ); @@ -82,7 +86,7 @@ add_task(async function test_reauth() { reauthObserved = OSKeyStoreTestUtils.waitForOSKeyStoreLogin(true); await new Promise(resolve => TestUtils.executeSoon(resolve)); Assert.equal( - await OSKeyStore.ensureLoggedIn("test message"), + (await OSKeyStore.ensureLoggedIn("test message")).authenticated, true, "Reauth logged in." ); diff --git a/toolkit/mozapps/defaultagent/Telemetry.cpp b/toolkit/mozapps/defaultagent/Telemetry.cpp index 6313801a6ce952b84175469c6ce3ad65ebc531f2..1aacf1c5c54976d998b734fc21f83548349d931b 100644 --- a/toolkit/mozapps/defaultagent/Telemetry.cpp +++ b/toolkit/mozapps/defaultagent/Telemetry.cpp @@ -31,8 +31,8 @@ // This is almost the complete URL, just needs a UUID appended. #define TELEMETRY_PING_URL \ - TELEMETRY_BASE_URL "/" TELEMETRY_NAMESPACE "/" TELEMETRY_PING_VERSION \ - "/" TELEMETRY_PING_DOCTYPE "/" + TELEMETRY_BASE_URL "/" TELEMETRY_NAMESPACE "/" TELEMETRY_PING_DOCTYPE \ + "/" TELEMETRY_PING_VERSION "/" #if !defined(RRF_SUBKEY_WOW6464KEY) # define RRF_SUBKEY_WOW6464KEY 0x00010000 @@ -309,7 +309,7 @@ static mozilla::WindowsError SendPing(std::string defaultBrowser, // Fill in the ping JSON object. Json::Value ping; ping["build_channel"] = MOZ_STRINGIFY(MOZ_UPDATE_CHANNEL); - ping["version"] = MOZILLA_VERSION; + ping["build_version"] = MOZILLA_VERSION; ping["default_browser"] = defaultBrowser; ping["previous_default_browser"] = previousDefaultBrowser; ping["os_version"] = osVersion; diff --git a/toolkit/mozapps/extensions/content/aboutaddons.html b/toolkit/mozapps/extensions/content/aboutaddons.html index 2c9c8880eb6a283a1382df05cc7d65a65c4e5cd4..97f68e68044b311e9e04ac44a9921fe2629f6b30 100644 --- a/toolkit/mozapps/extensions/content/aboutaddons.html +++ b/toolkit/mozapps/extensions/content/aboutaddons.html @@ -69,7 +69,7 @@ <search-addons data-l10n-id="search-header-shortcut" data-l10n-attrs="key"></search-addons> </div> <div class="main-heading"> - <button class="back-button" action="go-back" data-l10n-id="go-back-button" hidden></button> + <button class="back-button" action="go-back" data-l10n-id="header-back-button" hidden></button> <h1 class="header-name"></h1> <div class="spacer"></div> <addon-updates-message id="updates-message" hidden></addon-updates-message> diff --git a/toolkit/mozapps/extensions/content/aboutaddons.js b/toolkit/mozapps/extensions/content/aboutaddons.js index 927173b2a746dcd9e2faccd888aaa922e22153cc..b3e3490fec65992c71f05b2e4daf20133c3d1e25 100644 --- a/toolkit/mozapps/extensions/content/aboutaddons.js +++ b/toolkit/mozapps/extensions/content/aboutaddons.js @@ -1642,6 +1642,8 @@ class CategoryButton extends HTMLButtonElement { // Make sure the aria-selected attribute is set correctly. this.selected = this.hasAttribute("selected"); + document.l10n.setAttributes(this, `addon-category-${this.name}-title`); + let text = document.createElement("span"); text.classList.add("category-name"); document.l10n.setAttributes(text, `addon-category-${this.name}`); @@ -1920,6 +1922,7 @@ class SidebarFooter extends HTMLElement { prefsLink.classList.add("sidebar-footer-link", "preferences-icon"); prefsLink.id = "preferencesButton"; prefsLink.href = "about:preferences"; + document.l10n.setAttributes(prefsLink, "sidebar-preferences-button-title"); let systemPrincipal = Services.scriptSecurityManager.getSystemPrincipal(); prefsLink.addEventListener("click", e => { e.preventDefault(); @@ -1944,6 +1947,7 @@ class SidebarFooter extends HTMLElement { let supportItem = document.createElement("li"); supportItem.classList.add("sidebar-footer-item"); let supportLink = document.createElement("a", { is: "support-link" }); + document.l10n.setAttributes(supportLink, "sidebar-help-button-title"); supportLink.classList.add("sidebar-footer-link", "help-icon"); supportLink.id = "help-button"; supportLink.setAttribute("support-page", "addons-help"); diff --git a/widget/cocoa/nsCocoaUtils.mm b/widget/cocoa/nsCocoaUtils.mm index a54d50c7f31d42ca6dcf9aa9cfac625d83b551a7..689ff5a46d676dc40b9f64259c83659d127273c9 100644 --- a/widget/cocoa/nsCocoaUtils.mm +++ b/widget/cocoa/nsCocoaUtils.mm @@ -1254,7 +1254,7 @@ nsresult nsCocoaUtils::GetScreenCapturePermissionState(uint16_t& aPermissionStat // screen. We use the window name, window level, and owning PID as // heuristics to determine if we have screen recording permission. AutoCFRelease<CFArrayRef> windowArray = - CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID); + CGWindowListCopyWindowInfo(kCGWindowListOptionAll, kCGNullWindowID); if (!windowArray) { LOG("GetScreenCapturePermissionState() ERROR: got NULL window info list"); return NS_ERROR_UNEXPECTED; @@ -1449,6 +1449,7 @@ void nsCocoaUtils::ResolveAudioCapturePromises(bool aGranted) { // in which case macOS does not display the dialog again. // nsresult nsCocoaUtils::MaybeRequestScreenCapturePermission() { + LOG("MaybeRequestScreenCapturePermission()"); AutoCFRelease<CGImageRef> image = CGDisplayCreateImageForRect(kCGDirectMainDisplay, CGRectMake(0, 0, 1, 1)); return NS_OK; diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm index 522c51b98e211871318b013e3dff5ce20848125d..aaa88a316277f8f1535f5a17f8eba57973a9b4b4 100644 --- a/widget/cocoa/nsCocoaWindow.mm +++ b/widget/cocoa/nsCocoaWindow.mm @@ -496,6 +496,9 @@ nsresult nsCocoaWindow::CreateNativeWindow(const NSRect& aRect, nsBorderStyle aB if (mAlwaysOnTop) { [mWindow setLevel:NSFloatingWindowLevel]; + NSWindowCollectionBehavior newBehavior = [mWindow collectionBehavior]; + newBehavior |= NSWindowCollectionBehaviorCanJoinAllSpaces; + [mWindow setCollectionBehavior:newBehavior]; } [mWindow setContentMinSize:NSMakeSize(60, 60)]; diff --git a/widget/gtk/WindowSurfaceWayland.cpp b/widget/gtk/WindowSurfaceWayland.cpp index 22fbd0718d314101f49dbc4700407debc99aaf68..372158c9f0f334692d6b321e594de3709da05e9f 100644 --- a/widget/gtk/WindowSurfaceWayland.cpp +++ b/widget/gtk/WindowSurfaceWayland.cpp @@ -649,13 +649,14 @@ WindowBackBuffer* WindowSurfaceWayland::SetNewWaylandBuffer( LOGWAYLAND( ("WindowSurfaceWayland::NewWaylandBuffer [%p] Requested buffer [%d " "x %d] DMABuf %d\n", - (void*)this, mWidgetRect.width, mWidgetRect.height, aUseDMABufBackend)); + (void*)this, mWLBufferRect.width, mWLBufferRect.height, + aUseDMABufBackend)); mWaylandBuffer = WaylandBufferFindAvailable( - mWidgetRect.width, mWidgetRect.height, aUseDMABufBackend); + mWLBufferRect.width, mWLBufferRect.height, aUseDMABufBackend); if (!mWaylandBuffer) { - mWaylandBuffer = CreateWaylandBuffer(mWidgetRect.width, mWidgetRect.height, - aUseDMABufBackend); + mWaylandBuffer = CreateWaylandBuffer( + mWLBufferRect.width, mWLBufferRect.height, aUseDMABufBackend); } return mWaylandBuffer; @@ -665,7 +666,7 @@ WindowBackBuffer* WindowSurfaceWayland::GetWaylandBufferRecent() { LOGWAYLAND( ("WindowSurfaceWayland::GetWaylandBufferRecent [%p] Requested buffer [%d " "x %d]\n", - (void*)this, mWidgetRect.width, mWidgetRect.height)); + (void*)this, mWLBufferRect.width, mWLBufferRect.height)); // There's no buffer created yet, create a new one for partial screen updates. if (!mWaylandBuffer) { @@ -677,9 +678,10 @@ WindowBackBuffer* WindowSurfaceWayland::GetWaylandBufferRecent() { return nullptr; } - if (mWaylandBuffer->IsMatchingSize(mWidgetRect.width, mWidgetRect.height)) { - LOGWAYLAND((" Size is ok, use the buffer [%d x %d]\n", mWidgetRect.width, - mWidgetRect.height)); + if (mWaylandBuffer->IsMatchingSize(mWLBufferRect.width, + mWLBufferRect.height)) { + LOGWAYLAND((" Size is ok, use the buffer [%d x %d]\n", + mWLBufferRect.width, mWLBufferRect.height)); return mWaylandBuffer; } @@ -694,7 +696,7 @@ WindowBackBuffer* WindowSurfaceWayland::GetWaylandBufferWithSwitch() { LOGWAYLAND( ("WindowSurfaceWayland::GetWaylandBufferWithSwitch [%p] Requested buffer " "[%d x %d]\n", - (void*)this, mWidgetRect.width, mWidgetRect.height)); + (void*)this, mWLBufferRect.width, mWLBufferRect.height)); // There's no buffer created yet or actual buffer is attached, get a new one. // Use DMABuf for fullscreen updates only. @@ -703,20 +705,21 @@ WindowBackBuffer* WindowSurfaceWayland::GetWaylandBufferWithSwitch() { } // Reuse existing buffer - LOGWAYLAND((" Reuse buffer with resize [%d x %d]\n", mWidgetRect.width, - mWidgetRect.height)); + LOGWAYLAND((" Reuse buffer with resize [%d x %d]\n", mWLBufferRect.width, + mWLBufferRect.height)); // OOM here, just return null to skip this frame. - if (!mWaylandBuffer->Resize(mWidgetRect.width, mWidgetRect.height)) { + if (!mWaylandBuffer->Resize(mWLBufferRect.width, mWLBufferRect.height)) { return nullptr; } return mWaylandBuffer; } already_AddRefed<gfx::DrawTarget> WindowSurfaceWayland::LockWaylandBuffer() { - // Allocated wayland buffer must match widget size, otherwise wayland - // compositor is confused and may produce various rendering artifacts. - mWidgetRect = mWindow->GetMozContainerSize(); + // Allocated wayland buffer can't be bigger than mozilla widget size. + LayoutDeviceIntRegion region; + region.And(mLockedScreenRect, mWindow->GetMozContainerSize()); + mWLBufferRect = LayoutDeviceIntRect(region.GetBounds()); // mCanSwitchWaylandBuffer set means we're getting buffer for fullscreen // update. We can use DMABuf and we can get a new buffer for drawing. @@ -883,8 +886,8 @@ already_AddRefed<gfx::DrawTarget> WindowSurfaceWayland::Lock( // We can draw directly only when widget has the same size as wl_buffer LayoutDeviceIntRect size = mWindow->GetMozContainerSize(); - mDrawToWaylandBufferDirectly = (size.width == mLockedScreenRect.width && - size.height == mLockedScreenRect.height); + mDrawToWaylandBufferDirectly = (size.width >= mLockedScreenRect.width && + size.height >= mLockedScreenRect.height); // We can draw directly only when we redraw significant part of the window // to avoid flickering or do only fullscreen updates in smooth mode. diff --git a/widget/gtk/WindowSurfaceWayland.h b/widget/gtk/WindowSurfaceWayland.h index d9f06db24a37784409e9861e0e8fa2cf1c242d4b..299f22b835280b2202d219c833a0c294b393c597 100644 --- a/widget/gtk/WindowSurfaceWayland.h +++ b/widget/gtk/WindowSurfaceWayland.h @@ -264,11 +264,11 @@ class WindowSurfaceWayland : public WindowSurface { // mLockedScreenRect is window size when our wayland buffer was allocated. LayoutDeviceIntRect mLockedScreenRect; - // WidgetRect is an actual size of mozcontainer widget. It can be - // different than mLockedScreenRect during resize when mBounds are updated - // immediately but actual GtkWidget size is updated asynchronously - // (see Bug 1489463). - LayoutDeviceIntRect mWidgetRect; + // mWLBufferRect is an intersection of mozcontainer widgetsize and + // mLockedScreenRect size. It can be different than mLockedScreenRect + // during resize when mBounds are updated immediately but actual + // GtkWidget size is updated asynchronously (see Bug 1489463). + LayoutDeviceIntRect mWLBufferRect; nsWaylandDisplay* mWaylandDisplay; // Actual buffer (backed by wl_buffer) where all drawings go into. diff --git a/widget/windows/GfxInfo.cpp b/widget/windows/GfxInfo.cpp index f6748dbe69ca52d432201cad0c1636744c072839..bc668257c83785ec7027a109f6f0833e1918df40 100644 --- a/widget/windows/GfxInfo.cpp +++ b/widget/windows/GfxInfo.cpp @@ -1254,12 +1254,6 @@ const nsTArray<GfxDriverInfo>& GfxInfo::GetGfxDriverInfo() { DRIVER_BETWEEN_INCLUSIVE_START, V(8, 17, 10, 0000), V(8, 17, 11, 8745), "FEATURE_FAILURE_NV_W7_17", "nVidia driver > 187.45"); - // Bug 1625857 - Rendering is very distorted with this particular driver. - APPEND_TO_DRIVER_BLOCKLIST2( - OperatingSystem::Windows, DeviceFamily::NvidiaAll, - GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, - DRIVER_EQUAL, V(26, 21, 14, 4575), "NVIDIA driver != 26.21.14.4575"); - /* * AMD/ATI entries. 8.56.1.15 is the driver that shipped with Windows 7 RTM */ diff --git a/widget/windows/nsWindow.cpp b/widget/windows/nsWindow.cpp index 4964cb82edfff988e48eec87e783c97f6f018e27..74e02f82f7ba0c4acabb8c3c58fc699e5de78710 100644 --- a/widget/windows/nsWindow.cpp +++ b/widget/windows/nsWindow.cpp @@ -4215,7 +4215,8 @@ bool nsWindow::DispatchMouseEvent(EventMessage aEventMessage, WPARAM wParam, if (WinUtils::GetIsMouseFromTouch(aEventMessage)) { if (aEventMessage == eMouseDown) { - Telemetry::Accumulate(Telemetry::FX_TOUCH_USED, 1); + Telemetry::ScalarAdd(Telemetry::ScalarID::BROWSER_INPUT_TOUCH_EVENT_COUNT, + 1); } // Fire an observer when the user initially touches a touch screen. Front diff --git a/xpcom/io/SlicedInputStream.cpp b/xpcom/io/SlicedInputStream.cpp index d24edcba43e3a29ebcadf5e98e4a2e169bc85e8c..be23c95c8644a441681ef796479792028321df58 100644 --- a/xpcom/io/SlicedInputStream.cpp +++ b/xpcom/io/SlicedInputStream.cpp @@ -70,6 +70,8 @@ SlicedInputStream::SlicedInputStream() mWeakSeekableInputStream(nullptr), mWeakTellableInputStream(nullptr), mWeakAsyncInputStream(nullptr), + mWeakInputStreamLength(nullptr), + mWeakAsyncInputStreamLength(nullptr), mStart(0), mLength(0), mCurPos(0),